From 01e36532c2bfd90663a0cd98470c2bb32453fc46 Mon Sep 17 00:00:00 2001 From: Jonas Olsson Date: Sun, 16 Aug 2015 16:30:04 +0100 Subject: [PATCH 1/8] Add support for the CC13xx CPU This commit: * Moves all cpu files from cpu/cc26xx to cpu/cc26xx-cc13xx * Bumps the CC26xxware submodule to the latest TI release * Adds CC13xxware as a submodule * Adds support for sub-ghz mode / IEEE 802.15.4g * Splits the driver into multiple files for clarity. We now have the following structure: * A common module that handles access to the RF core, interrupts etc * A module that takes care of BLE functionality * A netstack radio driver for IEEE mode (2.4GHz) * A netstack radio driver for PROP mode (sub-ghz - multiple bands) This commit also adds tick suppression functionality, applicable to all chips of the CC26xx and CC13xx families. Instead waking up on every clock tick simply to increment our software counter, we now only wake up just in time to service the next scheduled etimer. ContikiMAC-triggered wakeups are unaffected. Laslty, this commit also applies a number of minor changes: * Addition of missing includes * Removal of stub functions * Removal of a woraround for a CC26xxware bug that has now been fixed --- .gitmodules | 7 +- cpu/cc26xx-cc13xx/Makefile.cc13xx | 7 + cpu/cc26xx-cc13xx/Makefile.cc26xx | 3 + .../Makefile.cc26xx-cc13xx} | 30 +- cpu/{cc26xx => cc26xx-cc13xx}/cc26xx.ld | 12 +- cpu/{cc26xx => cc26xx-cc13xx}/clock.c | 66 +- cpu/{cc26xx => cc26xx-cc13xx}/dbg.h | 6 +- cpu/{cc26xx => cc26xx-cc13xx}/debug-uart.h | 0 .../dev/batmon-sensor.c | 2 +- .../dev/batmon-sensor.h | 4 +- .../dev/cc26xx-uart.c | 12 + .../dev/cc26xx-uart.h | 6 +- .../dev/contiki-watchdog.c | 16 +- .../dev/gpio-interrupt.c | 10 +- .../dev/gpio-interrupt.h | 8 +- .../dev/oscillators.c | 5 +- .../dev/oscillators.h | 6 +- .../dev/soc-rtc.c} | 102 +- .../dev/soc-rtc.h} | 44 +- cpu/{cc26xx => cc26xx-cc13xx}/dev/uart1.h | 0 .../fault-handlers.c | 0 cpu/{cc26xx => cc26xx-cc13xx}/ieee-addr.c | 2 +- cpu/{cc26xx => cc26xx-cc13xx}/ieee-addr.h | 2 +- cpu/cc26xx-cc13xx/lib/cc13xxware | 1 + cpu/cc26xx-cc13xx/lib/cc26xxware | 1 + cpu/{cc26xx => cc26xx-cc13xx}/lpm.c | 46 +- cpu/{cc26xx => cc26xx-cc13xx}/lpm.h | 6 +- cpu/{cc26xx => cc26xx-cc13xx}/mtarch.h | 0 cpu/{cc26xx => cc26xx-cc13xx}/putchar.c | 0 .../rf-core/api}/ble_cmd.h | 2163 ++++++++-------- .../rf-core/api}/ble_mailbox.h | 188 +- .../rf-core/api}/common_cmd.h | 2074 ++++++++-------- cpu/cc26xx-cc13xx/rf-core/api/data_entry.h | 213 ++ .../rf-core/api}/ieee_cmd.h | 1225 +++++---- .../rf-core/api}/ieee_mailbox.h | 182 +- .../rf-core/api}/mailbox.h | 908 +++---- cpu/cc26xx-cc13xx/rf-core/api/prop_cmd.h | 596 +++++ cpu/cc26xx-cc13xx/rf-core/api/prop_mailbox.h | 71 + cpu/cc26xx-cc13xx/rf-core/dot-15-4g.h | 124 + cpu/cc26xx-cc13xx/rf-core/ieee-mode.c | 1376 +++++++++++ cpu/cc26xx-cc13xx/rf-core/prop-mode.c | 1143 +++++++++ cpu/cc26xx-cc13xx/rf-core/rf-ble.c | 400 +++ .../rf-core/rf-ble.h} | 80 +- cpu/cc26xx-cc13xx/rf-core/rf-core.c | 518 ++++ cpu/cc26xx-cc13xx/rf-core/rf-core.h | 418 ++++ cpu/cc26xx-cc13xx/rf-core/smartrf-settings.c | 205 ++ .../rf-core/smartrf-settings.h} | 50 +- cpu/{cc26xx => cc26xx-cc13xx}/rtimer-arch.c | 7 +- cpu/{cc26xx => cc26xx-cc13xx}/rtimer-arch.h | 12 +- cpu/{cc26xx => cc26xx-cc13xx}/slip-arch.c | 2 +- cpu/{cc26xx => cc26xx-cc13xx}/ti-lib.h | 40 +- cpu/cc26xx/dev/cc26xx-rf.c | 2192 ----------------- cpu/cc26xx/dev/rfc-api/ble_cmd_field.h | 623 ----- cpu/cc26xx/dev/rfc-api/common_cmd_field.h | 448 ---- cpu/cc26xx/dev/rfc-api/data_entry.h | 91 - cpu/cc26xx/dev/rfc-api/ieee_cmd_field.h | 403 --- cpu/cc26xx/lib/cc26xxware | 1 - doc/Doxyfile | 3 +- 58 files changed, 8595 insertions(+), 7565 deletions(-) create mode 100644 cpu/cc26xx-cc13xx/Makefile.cc13xx create mode 100644 cpu/cc26xx-cc13xx/Makefile.cc26xx rename cpu/{cc26xx/Makefile.cc26xx => cc26xx-cc13xx/Makefile.cc26xx-cc13xx} (80%) rename cpu/{cc26xx => cc26xx-cc13xx}/cc26xx.ld (93%) rename cpu/{cc26xx => cc26xx-cc13xx}/clock.c (81%) rename cpu/{cc26xx => cc26xx-cc13xx}/dbg.h (93%) rename cpu/{cc26xx => cc26xx-cc13xx}/debug-uart.h (100%) rename cpu/{cc26xx => cc26xx-cc13xx}/dev/batmon-sensor.c (98%) rename cpu/{cc26xx => cc26xx-cc13xx}/dev/batmon-sensor.h (95%) rename cpu/{cc26xx => cc26xx-cc13xx}/dev/cc26xx-uart.c (97%) rename cpu/{cc26xx => cc26xx-cc13xx}/dev/cc26xx-uart.h (96%) rename cpu/{cc26xx => cc26xx-cc13xx}/dev/contiki-watchdog.c (89%) rename cpu/{cc26xx => cc26xx-cc13xx}/dev/gpio-interrupt.c (94%) rename cpu/{cc26xx => cc26xx-cc13xx}/dev/gpio-interrupt.h (90%) rename cpu/{cc26xx => cc26xx-cc13xx}/dev/oscillators.c (99%) rename cpu/{cc26xx => cc26xx-cc13xx}/dev/oscillators.h (94%) rename cpu/{cc26xx/dev/cc26xx-rtc.c => cc26xx-cc13xx/dev/soc-rtc.c} (57%) rename cpu/{cc26xx/dev/cc26xx-rtc.h => cc26xx-cc13xx/dev/soc-rtc.h} (72%) rename cpu/{cc26xx => cc26xx-cc13xx}/dev/uart1.h (100%) rename cpu/{cc26xx => cc26xx-cc13xx}/fault-handlers.c (100%) rename cpu/{cc26xx => cc26xx-cc13xx}/ieee-addr.c (98%) rename cpu/{cc26xx => cc26xx-cc13xx}/ieee-addr.h (98%) create mode 160000 cpu/cc26xx-cc13xx/lib/cc13xxware create mode 160000 cpu/cc26xx-cc13xx/lib/cc26xxware rename cpu/{cc26xx => cc26xx-cc13xx}/lpm.c (91%) rename cpu/{cc26xx => cc26xx-cc13xx}/lpm.h (97%) rename cpu/{cc26xx => cc26xx-cc13xx}/mtarch.h (100%) rename cpu/{cc26xx => cc26xx-cc13xx}/putchar.c (100%) rename cpu/{cc26xx/dev/rfc-api => cc26xx-cc13xx/rf-core/api}/ble_cmd.h (98%) rename cpu/{cc26xx/dev/rfc-api => cc26xx-cc13xx/rf-core/api}/ble_mailbox.h (57%) rename cpu/{cc26xx/dev/rfc-api => cc26xx-cc13xx/rf-core/api}/common_cmd.h (89%) create mode 100644 cpu/cc26xx-cc13xx/rf-core/api/data_entry.h rename cpu/{cc26xx/dev/rfc-api => cc26xx-cc13xx/rf-core/api}/ieee_cmd.h (97%) rename cpu/{cc26xx/dev/rfc-api => cc26xx-cc13xx/rf-core/api}/ieee_mailbox.h (66%) rename cpu/{cc26xx/dev/rfc-api => cc26xx-cc13xx/rf-core/api}/mailbox.h (55%) create mode 100644 cpu/cc26xx-cc13xx/rf-core/api/prop_cmd.h create mode 100644 cpu/cc26xx-cc13xx/rf-core/api/prop_mailbox.h create mode 100644 cpu/cc26xx-cc13xx/rf-core/dot-15-4g.h create mode 100644 cpu/cc26xx-cc13xx/rf-core/ieee-mode.c create mode 100644 cpu/cc26xx-cc13xx/rf-core/prop-mode.c create mode 100644 cpu/cc26xx-cc13xx/rf-core/rf-ble.c rename cpu/{cc26xx/dev/cc26xx-rf.h => cc26xx-cc13xx/rf-core/rf-ble.h} (62%) create mode 100644 cpu/cc26xx-cc13xx/rf-core/rf-core.c create mode 100644 cpu/cc26xx-cc13xx/rf-core/rf-core.h create mode 100644 cpu/cc26xx-cc13xx/rf-core/smartrf-settings.c rename cpu/{cc26xx/cc26xx-model.h => cc26xx-cc13xx/rf-core/smartrf-settings.h} (65%) rename cpu/{cc26xx => cc26xx-cc13xx}/rtimer-arch.c (97%) rename cpu/{cc26xx => cc26xx-cc13xx}/rtimer-arch.h (85%) rename cpu/{cc26xx => cc26xx-cc13xx}/slip-arch.c (97%) rename cpu/{cc26xx => cc26xx-cc13xx}/ti-lib.h (94%) delete mode 100644 cpu/cc26xx/dev/cc26xx-rf.c delete mode 100755 cpu/cc26xx/dev/rfc-api/ble_cmd_field.h delete mode 100755 cpu/cc26xx/dev/rfc-api/common_cmd_field.h delete mode 100644 cpu/cc26xx/dev/rfc-api/data_entry.h delete mode 100755 cpu/cc26xx/dev/rfc-api/ieee_cmd_field.h delete mode 160000 cpu/cc26xx/lib/cc26xxware diff --git a/.gitmodules b/.gitmodules index 48be5ceaa..150a701e8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,6 +4,9 @@ [submodule "tools/cc2538-bsl"] path = tools/cc2538-bsl url = https://github.com/JelmerT/cc2538-bsl.git -[submodule "cpu/cc26xx/lib/cc26xxware"] - path = cpu/cc26xx/lib/cc26xxware +[submodule "cpu/cc26xx-cc13xx/lib/cc26xxware"] + path = cpu/cc26xx-cc13xx/lib/cc26xxware url = https://github.com/g-oikonomou/cc26xxware.git +[submodule "cpu/cc26xx-cc13xx/lib/cc13xxware"] + path = cpu/cc26xx-cc13xx/lib/cc13xxware + url = https://github.com/g-oikonomou/cc13xxware.git diff --git a/cpu/cc26xx-cc13xx/Makefile.cc13xx b/cpu/cc26xx-cc13xx/Makefile.cc13xx new file mode 100644 index 000000000..56593ee9f --- /dev/null +++ b/cpu/cc26xx-cc13xx/Makefile.cc13xx @@ -0,0 +1,7 @@ +TI_XXWARE_PATH = lib/cc13xxware + +CONTIKI_CPU_SOURCEFILES += smartrf-settings.c prop-mode.c + +CFLAGS += -DCPU_FAMILY_CC13XX=1 + +include $(CONTIKI_CPU)/Makefile.cc26xx-cc13xx diff --git a/cpu/cc26xx-cc13xx/Makefile.cc26xx b/cpu/cc26xx-cc13xx/Makefile.cc26xx new file mode 100644 index 000000000..4bc2cdcad --- /dev/null +++ b/cpu/cc26xx-cc13xx/Makefile.cc26xx @@ -0,0 +1,3 @@ +TI_XXWARE_PATH = lib/cc26xxware + +include $(CONTIKI_CPU)/Makefile.cc26xx-cc13xx diff --git a/cpu/cc26xx/Makefile.cc26xx b/cpu/cc26xx-cc13xx/Makefile.cc26xx-cc13xx similarity index 80% rename from cpu/cc26xx/Makefile.cc26xx rename to cpu/cc26xx-cc13xx/Makefile.cc26xx-cc13xx index 7c09c75ee..781f79b3f 100644 --- a/cpu/cc26xx/Makefile.cc26xx +++ b/cpu/cc26xx-cc13xx/Makefile.cc26xx-cc13xx @@ -8,25 +8,24 @@ NM = arm-none-eabi-nm SIZE = arm-none-eabi-size SREC_CAT = srec_cat -CPU_ABS_PATH = cpu/cc26xx -TI_CC26XXWARE_PATH = lib/cc26xxware -TI_CC26XXWARE = $(CONTIKI_CPU)/$(TI_CC26XXWARE_PATH) +CPU_ABS_PATH = cpu/cc26xx-cc13xx +TI_XXWARE = $(CONTIKI_CPU)/$(TI_XXWARE_PATH) ### cc26xxware sources under driverlib will be added to the MODULES list -TI_CC26XXWARE_SRC = $(CPU_ABS_PATH)/$(TI_CC26XXWARE_PATH)/driverlib +TI_XXWARE_SRC = $(CPU_ABS_PATH)/$(TI_XXWARE_PATH)/driverlib ### The directory with startup sources will be added to the CONTIKI_CPU_DIRS ### and the sources therein are added to the sources list explicitly. They are ### also listed explicitly in the linker command (through TARGET_STARTFILES), ### to make sure they always get linked in the image -TI_CC26XXWARE_STARTUP_DIR = $(TI_CC26XXWARE_PATH)/startup_files -TI_CC26XXWARE_STARTUP_SRCS = ccfg.c startup_gcc.c +TI_XXWARE_STARTUP_DIR = $(TI_XXWARE_PATH)/startup_files +TI_XXWARE_STARTUP_SRCS = ccfg.c startup_gcc.c ### MODULES will add some of these to the include path, but we need to add ### them earlier to prevent filename clashes with Contiki core files -CFLAGS += -I$(TI_CC26XXWARE) -I$(CONTIKI)/$(TI_CC26XXWARE_SRC) -CFLAGS += -I$(TI_CC26XXWARE)/inc -MODULES += $(TI_CC26XXWARE_SRC) +CFLAGS += -I$(TI_XXWARE) -I$(CONTIKI)/$(TI_XXWARE_SRC) +CFLAGS += -I$(TI_XXWARE)/inc +MODULES += $(TI_XXWARE_SRC) LDSCRIPT = $(CONTIKI_CPU)/cc26xx.ld @@ -35,10 +34,6 @@ CFLAGS += -ffunction-sections -fdata-sections CFLAGS += -fshort-enums -fomit-frame-pointer -fno-strict-aliasing CFLAGS += -Wall -std=c99 -### Workaround for driverlib's cpu.h which tests if defined(gcc) -### Delete if it gets fixed or if we stop using the driverlib -CFLAGS += -Dgcc=__GNUC__ - LDFLAGS += -mcpu=cortex-m3 -mthumb -mlittle-endian -nostartfiles LDFLAGS += -T $(LDSCRIPT) LDFLAGS += -Wl,--gc-sections,--sort-section=alignment @@ -62,23 +57,24 @@ endif CLEAN += symbols.c symbols.h *.d *.elf *.hex ### CPU-dependent directories -CONTIKI_CPU_DIRS = . dev dev/rfc-api $(TI_CC26XXWARE_STARTUP_DIR) +CONTIKI_CPU_DIRS = . dev rf-core rf-core/api $(TI_XXWARE_STARTUP_DIR) ### Use the existing debug I/O in cpu/arm/common CONTIKI_CPU_DIRS += ../arm/common/dbg-io ### CPU-dependent source files -CONTIKI_CPU_SOURCEFILES += clock.c rtimer-arch.c cc26xx-rtc.c uart.c -CONTIKI_CPU_SOURCEFILES += cc26xx-rf.c contiki-watchdog.c +CONTIKI_CPU_SOURCEFILES += clock.c rtimer-arch.c soc-rtc.c uart.c +CONTIKI_CPU_SOURCEFILES += contiki-watchdog.c CONTIKI_CPU_SOURCEFILES += putchar.c ieee-addr.c batmon-sensor.c CONTIKI_CPU_SOURCEFILES += slip-arch.c slip.c cc26xx-uart.c lpm.c CONTIKI_CPU_SOURCEFILES += gpio-interrupt.c oscillators.c +CONTIKI_CPU_SOURCEFILES += rf-core.c rf-ble.c ieee-mode.c DEBUG_IO_SOURCEFILES += dbg-printf.c dbg-snprintf.c dbg-sprintf.c strformat.c CONTIKI_SOURCEFILES += $(CONTIKI_CPU_SOURCEFILES) $(DEBUG_IO_SOURCEFILES) -TARGET_START_SOURCEFILES += fault-handlers.c $(TI_CC26XXWARE_STARTUP_SRCS) +TARGET_START_SOURCEFILES += fault-handlers.c $(TI_XXWARE_STARTUP_SRCS) TARGET_STARTFILES = $(addprefix $(OBJECTDIR)/,$(call oname, $(TARGET_START_SOURCEFILES))) ### Don't treat the .elf as intermediate diff --git a/cpu/cc26xx/cc26xx.ld b/cpu/cc26xx-cc13xx/cc26xx.ld similarity index 93% rename from cpu/cc26xx/cc26xx.ld rename to cpu/cc26xx-cc13xx/cc26xx.ld index 5902161c3..84601ced6 100644 --- a/cpu/cc26xx/cc26xx.ld +++ b/cpu/cc26xx-cc13xx/cc26xx.ld @@ -44,8 +44,11 @@ MEMORY */ FLASH_CCFG (RX) : ORIGIN = 0x0001FFA8, LENGTH = 88 - /* RAM Size 20KB (PG2.1) */ + /* RAM Size 20KB */ SRAM (RWX) : ORIGIN = 0x20000000, LENGTH = 0x00005000 + + /* Application can use GPRAM region as RAM if cache is disabled in CCFG */ + GPRAM (RWX) : ORIGIN = 0x11000000, LENGTH = 0x00002000 } /*. Highest address of the stack. Used in startup file .*/ @@ -99,5 +102,10 @@ SECTIONS . = . + _Min_Heap_Size; . = . + _Min_Stack_Size; . = ALIGN(4); - } >SRAM + } > SRAM + + .gpram : + { + } > GPRAM + } diff --git a/cpu/cc26xx/clock.c b/cpu/cc26xx-cc13xx/clock.c similarity index 81% rename from cpu/cc26xx/clock.c rename to cpu/cc26xx-cc13xx/clock.c index 701971e16..fd8165d0d 100644 --- a/cpu/cc26xx/clock.c +++ b/cpu/cc26xx-cc13xx/clock.c @@ -35,30 +35,35 @@ * \defgroup cc26xx-platforms TI CC26xx-powered Platforms * @{ * - * \defgroup cc26xx The TI CC26xx CPU + * \defgroup cc26xx The TI CC26xx and CC13xx CPUs + * + * This group documents the TI CC26xx and CC13xx CPUs. The two CPU families are + * very similar, with the main difference being related to radio capability. + * + * Documentation in this group should be considered to be applicable to both + * families, unless explicitly stated otherwise. + * * @{ * * \addtogroup cc26xx-clocks * @{ * - * \defgroup cc26xx-software-clock CC26xx Software Clock + * \defgroup cc26xx-software-clock Software Clock * - * Implementation of the clock module for the cc26xx. + * Implementation of the clock module for the CC26xx and CC13xx. * * The software clock uses the facilities provided by the AON RTC driver * @{ * * \file - * Software clock implementation for the TI CC26xx + * Software clock implementation for the TI CC13xx/CC26xx */ /*---------------------------------------------------------------------------*/ #include "contiki.h" #include "ti-lib.h" /*---------------------------------------------------------------------------*/ -static volatile clock_time_t count; -static volatile clock_time_t second_countdown; -static volatile unsigned long secs; +static volatile uint64_t count; /*---------------------------------------------------------------------------*/ static void power_domain_on(void) @@ -72,8 +77,6 @@ void clock_init(void) { count = 0; - secs = 0; - second_countdown = CLOCK_SECOND; /* * Here, we configure GPT0 Timer A, which we subsequently use in @@ -120,33 +123,50 @@ clock_init(void) CCIF clock_time_t clock_time(void) { - return count; + return (clock_time_t)(count & 0xFFFFFFFF); } /*---------------------------------------------------------------------------*/ void clock_update(void) { - count++; + bool interrupts_disabled; + uint32_t aon_rtc_secs_now; + uint16_t aon_rtc_ticks_now; + + interrupts_disabled = ti_lib_int_master_disable(); + + aon_rtc_secs_now = HWREG(AON_RTC_BASE + AON_RTC_O_SEC); + aon_rtc_ticks_now = HWREG(AON_RTC_BASE + AON_RTC_O_SUBSEC) >> 16; + + /* Convert AON RTC ticks to clock tick counter */ + count = (aon_rtc_secs_now * CLOCK_SECOND) + (aon_rtc_ticks_now >> 9); + + /* Re-enable interrupts */ + if(!interrupts_disabled) { + ti_lib_int_master_enable(); + } + if(etimer_pending()) { etimer_request_poll(); } - - if(--second_countdown == 0) { - secs++; - second_countdown = CLOCK_SECOND; - } -} -/*---------------------------------------------------------------------------*/ -void -clock_set_seconds(unsigned long sec) -{ - secs = sec; } /*---------------------------------------------------------------------------*/ CCIF unsigned long clock_seconds(void) { - return secs; + bool interrupts_disabled; + uint32_t secs_now; + + interrupts_disabled = ti_lib_int_master_disable(); + + secs_now = ti_lib_aon_rtc_sec_get(); + + /* Re-enable interrupts */ + if(!interrupts_disabled) { + ti_lib_int_master_enable(); + } + + return (unsigned long)secs_now; } /*---------------------------------------------------------------------------*/ void diff --git a/cpu/cc26xx/dbg.h b/cpu/cc26xx-cc13xx/dbg.h similarity index 93% rename from cpu/cc26xx/dbg.h rename to cpu/cc26xx-cc13xx/dbg.h index a5bff7513..9b28477f4 100644 --- a/cpu/cc26xx/dbg.h +++ b/cpu/cc26xx-cc13xx/dbg.h @@ -32,13 +32,13 @@ * \addtogroup cc26xx * @{ * - * \defgroup cc26xx-char-io CC26xx Character I/O + * \defgroup cc26xx-char-io CC13xx/CC26xx Character I/O * - * CC26xx CPU-specific functions for debugging and SLIP I/O + * CC13xx/CC26xx CPU-specific functions for debugging and SLIP I/O * @{ * * \file - * Header file for the CC26xx Debug I/O module + * Header file for the CC13xx/CC26xx Debug I/O module */ #ifndef DBG_H_ #define DBG_H_ diff --git a/cpu/cc26xx/debug-uart.h b/cpu/cc26xx-cc13xx/debug-uart.h similarity index 100% rename from cpu/cc26xx/debug-uart.h rename to cpu/cc26xx-cc13xx/debug-uart.h diff --git a/cpu/cc26xx/dev/batmon-sensor.c b/cpu/cc26xx-cc13xx/dev/batmon-sensor.c similarity index 98% rename from cpu/cc26xx/dev/batmon-sensor.c rename to cpu/cc26xx-cc13xx/dev/batmon-sensor.c index 3af7a578a..795b55dec 100644 --- a/cpu/cc26xx/dev/batmon-sensor.c +++ b/cpu/cc26xx-cc13xx/dev/batmon-sensor.c @@ -33,7 +33,7 @@ * @{ * * \file - * Driver for the CC26xx AON battery monitor + * Driver for the CC13xx/CC26xx AON battery monitor */ /*---------------------------------------------------------------------------*/ #include "contiki-conf.h" diff --git a/cpu/cc26xx/dev/batmon-sensor.h b/cpu/cc26xx-cc13xx/dev/batmon-sensor.h similarity index 95% rename from cpu/cc26xx/dev/batmon-sensor.h rename to cpu/cc26xx-cc13xx/dev/batmon-sensor.h index 12b0c6bbd..014e9a17d 100644 --- a/cpu/cc26xx/dev/batmon-sensor.h +++ b/cpu/cc26xx-cc13xx/dev/batmon-sensor.h @@ -32,13 +32,13 @@ * \addtogroup cc26xx * @{ * - * \defgroup cc26xx-batmon CC26xx BatMon sensor driver + * \defgroup cc26xx-batmon CC13xx/CC26xx BatMon sensor driver * * Driver for the on-chip battery voltage and chip temperature sensor. * @{ * * \file - * Header file for the CC26xx battery monitor + * Header file for the CC13xx/CC26xx battery monitor */ /*---------------------------------------------------------------------------*/ #ifndef BATMON_SENSOR_H_ diff --git a/cpu/cc26xx/dev/cc26xx-uart.c b/cpu/cc26xx-cc13xx/dev/cc26xx-uart.c similarity index 97% rename from cpu/cc26xx/dev/cc26xx-uart.c rename to cpu/cc26xx-cc13xx/dev/cc26xx-uart.c index 5d6c5403d..d7753066f 100644 --- a/cpu/cc26xx/dev/cc26xx-uart.c +++ b/cpu/cc26xx-cc13xx/dev/cc26xx-uart.c @@ -27,6 +27,15 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup cc26xx-uart + * @{ + * + * \file + * Implementation of the CC13xx/CC26xx UART driver. + */ +/*---------------------------------------------------------------------------*/ #include "contiki-conf.h" #include "cc26xx-uart.h" #include "hw_types.h" @@ -41,6 +50,7 @@ #include #include +#include /*---------------------------------------------------------------------------*/ /* Which events to trigger a UART interrupt */ #define CC26XX_UART_RX_INTERRUPT_TRIGGERS (UART_INT_RX | UART_INT_RT) @@ -382,3 +392,5 @@ cc26xx_uart_isr(void) ENERGEST_OFF(ENERGEST_TYPE_IRQ); } +/*---------------------------------------------------------------------------*/ +/** @} */ diff --git a/cpu/cc26xx/dev/cc26xx-uart.h b/cpu/cc26xx-cc13xx/dev/cc26xx-uart.h similarity index 96% rename from cpu/cc26xx/dev/cc26xx-uart.h rename to cpu/cc26xx-cc13xx/dev/cc26xx-uart.h index 8ff04502f..0e5a905c2 100644 --- a/cpu/cc26xx/dev/cc26xx-uart.h +++ b/cpu/cc26xx-cc13xx/dev/cc26xx-uart.h @@ -31,13 +31,13 @@ * \addtogroup cc26xx * @{ * - * \defgroup cc26xx-uart CC26xx UARTs + * \defgroup cc26xx-uart CC13xx/CC26xx UARTs * - * Driver for the CC26xx UART controller + * Driver for the CC13xx/CC26xx UART controller * @{ * * \file - * Header file for the CC26xx UART driver + * Header file for the CC13xx/CC26xx UART driver */ #ifndef CC26XX_UART_H_ #define CC26XX_UART_H_ diff --git a/cpu/cc26xx/dev/contiki-watchdog.c b/cpu/cc26xx-cc13xx/dev/contiki-watchdog.c similarity index 89% rename from cpu/cc26xx/dev/contiki-watchdog.c rename to cpu/cc26xx-cc13xx/dev/contiki-watchdog.c index 2c833c9d4..471c6f3cb 100644 --- a/cpu/cc26xx/dev/contiki-watchdog.c +++ b/cpu/cc26xx-cc13xx/dev/contiki-watchdog.c @@ -31,16 +31,16 @@ * \addtogroup cc26xx-clocks * @{ * - * \defgroup cc26xx-wdt CC26xx watchdog timer driver + * \defgroup cc26xx-wdt CC13xx/CC26xx watchdog timer driver * - * Driver for the CC26xx Watchdog Timer + * Driver for the CC13xx/CC26xx Watchdog Timer * * This file is not called watchdog.c because the filename is in use by - * TI CC26xxware + * TI CC26xxware/CC13xxware * @{ * * \file - * Implementation of the cc26xx watchdog driver. + * Implementation of the CC13xx/CC26xx watchdog driver. */ #include "watchdog.h" #include "ti-lib.h" @@ -75,14 +75,6 @@ watchdog_periodic(void) ti_lib_watchdog_int_clear(); } /*---------------------------------------------------------------------------*/ -/** - * \brief Stub function to satisfy API requirements - */ -void -watchdog_stop(void) -{ -} -/*---------------------------------------------------------------------------*/ /** * \brief Manually trigger a WDT reboot */ diff --git a/cpu/cc26xx/dev/gpio-interrupt.c b/cpu/cc26xx-cc13xx/dev/gpio-interrupt.c similarity index 94% rename from cpu/cc26xx/dev/gpio-interrupt.c rename to cpu/cc26xx-cc13xx/dev/gpio-interrupt.c index a2c6dd42b..b080a5d3f 100644 --- a/cpu/cc26xx/dev/gpio-interrupt.c +++ b/cpu/cc26xx-cc13xx/dev/gpio-interrupt.c @@ -28,6 +28,14 @@ * OF THE POSSIBILITY OF SUCH DAMAGE. */ /*---------------------------------------------------------------------------*/ +/** + * \addtogroup cc26xx-gpio-interrupts + * @{ + * + * \file + * Implementation of CC13xx/CC26xx GPIO interrupt handling. + */ +/*---------------------------------------------------------------------------*/ #include "ioc.h" #include "gpio-interrupt.h" #include "sys/energest.h" @@ -94,4 +102,4 @@ gpio_interrupt_isr(void) ENERGEST_OFF(ENERGEST_TYPE_IRQ); } /*---------------------------------------------------------------------------*/ - +/** @} */ diff --git a/cpu/cc26xx/dev/gpio-interrupt.h b/cpu/cc26xx-cc13xx/dev/gpio-interrupt.h similarity index 90% rename from cpu/cc26xx/dev/gpio-interrupt.h rename to cpu/cc26xx-cc13xx/dev/gpio-interrupt.h index 6a64f26f6..1a993d3be 100644 --- a/cpu/cc26xx/dev/gpio-interrupt.h +++ b/cpu/cc26xx-cc13xx/dev/gpio-interrupt.h @@ -32,15 +32,15 @@ * \addtogroup cc26xx * @{ * - * \defgroup cc26xx-gpio-interrupts CC26xx GPIO interrupt handling + * \defgroup cc26xx-gpio-interrupts CC13xx/CC26xx GPIO interrupt handling * - * The CC26xx GPIO interrupt handler and an API which can be used by other - * parts of the code when they wish to be notified of a GPIO interrupt + * The CC13xx/CC26xx GPIO interrupt handler and an API which can be used by + * other parts of the code when they wish to be notified of a GPIO interrupt * * @{ * * \file - * Header file for the CC26xx GPIO interrupt management + * Header file for the CC13xx/CC26xx GPIO interrupt management */ /*---------------------------------------------------------------------------*/ #ifndef GPIO_INTERRUPT_H_ diff --git a/cpu/cc26xx/dev/oscillators.c b/cpu/cc26xx-cc13xx/dev/oscillators.c similarity index 99% rename from cpu/cc26xx/dev/oscillators.c rename to cpu/cc26xx-cc13xx/dev/oscillators.c index 06f97a92a..99ba8f841 100644 --- a/cpu/cc26xx/dev/oscillators.c +++ b/cpu/cc26xx-cc13xx/dev/oscillators.c @@ -166,7 +166,4 @@ oscillators_switch_to_hf_rc(void) osc_interface_dis(smph_clk_state); } /*---------------------------------------------------------------------------*/ -/** - * @} - * @} - */ +/** @} */ diff --git a/cpu/cc26xx/dev/oscillators.h b/cpu/cc26xx-cc13xx/dev/oscillators.h similarity index 94% rename from cpu/cc26xx/dev/oscillators.h rename to cpu/cc26xx-cc13xx/dev/oscillators.h index 2de1b5bb7..47e95a311 100644 --- a/cpu/cc26xx/dev/oscillators.h +++ b/cpu/cc26xx-cc13xx/dev/oscillators.h @@ -32,9 +32,9 @@ * \addtogroup cc26xx * @{ * - * \defgroup cc26xx-oscillators CC26XX oscillator control + * \defgroup cc26xx-oscillators CC13xx/CC26xx oscillator control * - * Wrapper around those CC26xxware OSC functions that we need in Contiki. + * Wrapper around CC26xxware/CC13xxware OSC functions that we need in Contiki. * * All CC26xxware OSC control requires access to the semaphore module within * AUX. Thus, in addition to enabling the oscillator interface, we need to @@ -43,7 +43,7 @@ * @{ * * \file - * Header file for the CC26XX oscillator control + * Header file for the CC13xx/CC26xx oscillator control */ /*---------------------------------------------------------------------------*/ #ifndef OSCILLATORS_H_ diff --git a/cpu/cc26xx/dev/cc26xx-rtc.c b/cpu/cc26xx-cc13xx/dev/soc-rtc.c similarity index 57% rename from cpu/cc26xx/dev/cc26xx-rtc.c rename to cpu/cc26xx-cc13xx/dev/soc-rtc.c index e9c01a7b5..16a967b9d 100644 --- a/cpu/cc26xx/dev/cc26xx-rtc.c +++ b/cpu/cc26xx-cc13xx/dev/soc-rtc.c @@ -27,15 +27,15 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ +/*---------------------------------------------------------------------------*/ /** - * \addtogroup cc26xx-rtc + * \addtogroup cc13xx-cc26xx-rtc * @{ * - */ -/** * \file - * Implementation of the CC26xx AON RTC driver + * Implementation of the CC13xx/CC26xx AON RTC driver */ +/*---------------------------------------------------------------------------*/ #include "contiki.h" #include "sys/energest.h" #include "rtimer.h" @@ -46,16 +46,31 @@ #include #include /*---------------------------------------------------------------------------*/ -#define cc26xx_rtc_isr(...) AONRTCIntHandler(__VA_ARGS__) +#define soc_rtc_isr(...) AONRTCIntHandler(__VA_ARGS__) /*---------------------------------------------------------------------------*/ /* Prototype of a function in clock.c. Called every time the handler fires */ void clock_update(void); /*---------------------------------------------------------------------------*/ +#define COMPARE_INCREMENT (RTIMER_SECOND / CLOCK_SECOND) +#define MULTIPLE_512_MASK 0xFFFFFE00 +/*---------------------------------------------------------------------------*/ +/* + * Used to test timer wraparounds. + * + * Set to 0xFFFFFFFA to test AON RTC second counter wraparound + * Set to 0xFFFA to test AON RTC 16.16 format wraparound + */ +#ifdef SOC_RTC_CONF_START_TICK_COUNT +#define SOC_RTC_START_TICK_COUNT SOC_RTC_CONF_START_TICK_COUNT +#else +#define SOC_RTC_START_TICK_COUNT 0 +#endif +/*---------------------------------------------------------------------------*/ void -cc26xx_rtc_init(void) +soc_rtc_init(void) { - uint32_t compare_value; bool interrupts_disabled; + uint32_t next; /* Disable and clear interrupts */ interrupts_disabled = ti_lib_int_master_disable(); @@ -63,22 +78,22 @@ cc26xx_rtc_init(void) ti_lib_aon_rtc_disable(); ti_lib_aon_rtc_event_clear(AON_RTC_CH0); - ti_lib_aon_rtc_event_clear(AON_RTC_CH2); + ti_lib_aon_rtc_event_clear(AON_RTC_CH1); /* Setup the wakeup event */ - ti_lib_aon_event_mcu_wake_up_set(AON_EVENT_MCU_WU0, AON_EVENT_RTC0); - ti_lib_aon_event_mcu_wake_up_set(AON_EVENT_MCU_WU1, AON_EVENT_RTC2); - ti_lib_aon_rtc_combined_event_config(AON_RTC_CH0 | AON_RTC_CH2); + ti_lib_aon_event_mcu_wake_up_set(AON_EVENT_MCU_WU0, AON_EVENT_RTC_CH0); + ti_lib_aon_event_mcu_wake_up_set(AON_EVENT_MCU_WU1, AON_EVENT_RTC_CH1); + ti_lib_aon_rtc_combined_event_config(AON_RTC_CH0 | AON_RTC_CH1); - /* Configure channel 2 in continuous compare, 128 ticks / sec */ - ti_lib_aon_rtc_inc_value_ch2_set(RTIMER_SECOND / CLOCK_SECOND); - ti_lib_aon_rtc_mode_ch2_set(AON_RTC_MODE_CH2_CONTINUOUS); - compare_value = (RTIMER_SECOND / CLOCK_SECOND) + - ti_lib_aon_rtc_current_compare_value_get(); - ti_lib_aon_rtc_compare_value_set(AON_RTC_CH2, compare_value); + HWREG(AON_RTC_BASE + AON_RTC_O_SEC) = SOC_RTC_START_TICK_COUNT; - /* Enable channel 2 and the RTC */ - ti_lib_aon_rtc_channel_enable(AON_RTC_CH2); + next = ti_lib_aon_rtc_current_compare_value_get() + COMPARE_INCREMENT; + + /* Configure channel 1 to start generating clock ticks. First tick at 512 */ + ti_lib_aon_rtc_compare_value_set(AON_RTC_CH1, next); + + /* Enable channel 1 and the RTC */ + ti_lib_aon_rtc_channel_enable(AON_RTC_CH1); ti_lib_aon_rtc_enable(); ti_lib_int_enable(INT_AON_RTC); @@ -90,41 +105,60 @@ cc26xx_rtc_init(void) } /*---------------------------------------------------------------------------*/ rtimer_clock_t -cc26xx_rtc_get_next_trigger() +soc_rtc_get_next_trigger() { - rtimer_clock_t ch2 = ti_lib_aon_rtc_compare_value_get(AON_RTC_CH2); + rtimer_clock_t ch1 = ti_lib_aon_rtc_compare_value_get(AON_RTC_CH1); if(HWREG(AON_RTC_BASE + AON_RTC_O_CHCTL) & AON_RTC_CHCTL_CH0_EN) { - rtimer_clock_t ch0 = ti_lib_aon_rtc_compare_value_get(AON_RTC_CH2); + rtimer_clock_t ch0 = ti_lib_aon_rtc_compare_value_get(AON_RTC_CH0); - return RTIMER_CLOCK_LT(ch0, ch2) ? ch0 : ch2; + return RTIMER_CLOCK_LT(ch0, ch1) ? ch0 : ch1; } - return ch2; + return ch1; } /*---------------------------------------------------------------------------*/ void -cc26xx_rtc_schedule_one_shot(uint32_t ticks) +soc_rtc_schedule_one_shot(uint32_t channel, uint32_t ticks) { + if((channel != AON_RTC_CH0) && (channel != AON_RTC_CH1)) { + return; + } + /* Set the channel to fire a one-shot compare event at time==ticks */ - ti_lib_aon_rtc_compare_value_set(AON_RTC_CH0, ticks); - ti_lib_aon_rtc_channel_enable(AON_RTC_CH0); + ti_lib_aon_rtc_compare_value_set(channel, ticks); + ti_lib_aon_rtc_channel_enable(channel); } /*---------------------------------------------------------------------------*/ /* The AON RTC interrupt handler */ void -cc26xx_rtc_isr(void) +soc_rtc_isr(void) { + uint32_t now, next; + ENERGEST_ON(ENERGEST_TYPE_IRQ); - if(ti_lib_aon_rtc_event_get(AON_RTC_CH0)) { - ti_lib_aon_rtc_event_clear(AON_RTC_CH0); - rtimer_run_next(); + now = ti_lib_aon_rtc_current_compare_value_get(); + + /* Adjust the s/w tick counter irrespective of which event trigger this */ + clock_update(); + + if(ti_lib_aon_rtc_event_get(AON_RTC_CH1)) { + HWREG(AON_RTC_BASE + AON_RTC_O_EVFLAGS) = AON_RTC_EVFLAGS_CH1; + + /* + * We need to keep ticking while we are awake, so we schedule the next + * event on the next 512 tick boundary. If we drop to deep sleep before it + * happens, lpm_drop() will reschedule us in the 'distant' future + */ + next = (now + COMPARE_INCREMENT) & MULTIPLE_512_MASK; + ti_lib_aon_rtc_compare_value_set(AON_RTC_CH1, next); } - if(ti_lib_aon_rtc_event_get(AON_RTC_CH2)) { - ti_lib_aon_rtc_event_clear(AON_RTC_CH2); - clock_update(); + if(ti_lib_aon_rtc_event_get(AON_RTC_CH0)) { + ti_lib_aon_rtc_channel_disable(AON_RTC_CH0); + HWREG(AON_RTC_BASE + AON_RTC_O_EVFLAGS) = AON_RTC_EVFLAGS_CH0; + rtimer_run_next(); } ENERGEST_OFF(ENERGEST_TYPE_IRQ); diff --git a/cpu/cc26xx/dev/cc26xx-rtc.h b/cpu/cc26xx-cc13xx/dev/soc-rtc.h similarity index 72% rename from cpu/cc26xx/dev/cc26xx-rtc.h rename to cpu/cc26xx-cc13xx/dev/soc-rtc.h index 4fbaa1795..ff6a266ff 100644 --- a/cpu/cc26xx/dev/cc26xx-rtc.h +++ b/cpu/cc26xx-cc13xx/dev/soc-rtc.h @@ -31,34 +31,28 @@ * \addtogroup cc26xx * @{ * - * \defgroup cc26xx-clocks CC26xx clock and timer subsystem + * \defgroup cc26xx-clocks CC13xx/CC26xx clock and timer subsystem * - * For the CC26xx cpu we use the AON RTC as the basis for all clocks and timers + * For the CC13xx/CC26xx cpu we use the AON RTC as the basis for all clocks and + * timers * - * We configure the AON RTC's channel 2 to run in continuous mode, generating - * 128 interrupts / second. In continuous mode, the next compare event is - * scheduled by the hardware automatically; the events are equidistant and - * this also means we don't need the overhead of re-scheduling within the - * interrupt handler - * - * For rtimers, we use the RTC's channel 0 in one-shot compare mode. When the - * compare event fires, we call rtimer_run_next + * We use two of the aviable AON RTC channels. Channel 0 is used by the rtimer + * sub-system. Channel 1 is used by the system clock and the LPM module. * * The RTC runs in all power modes except 'shutdown' * - * \sa cpu/cc26xx/clock.c cpu/cc26xx/rtimer-arch.c * @{ * - * \defgroup cc26xx-rtc CC26xx AON RTC driver + * \defgroup cc13xx-cc26xx-rtc CC13xx/CC26xx AON RTC driver * * Underpins the platform's software clocks and timers * * @{ * \file - * Header file for the CC26XX AON RTC driver + * Header file for the CC13xx/CC26xx AON RTC driver */ -#ifndef CC26XX_RTC_H_ -#define CC26XX_RTC_H_ +#ifndef SOC_RTC_H_ +#define SOC_RTC_H_ /*---------------------------------------------------------------------------*/ #include "contiki.h" @@ -67,12 +61,13 @@ #include /*---------------------------------------------------------------------------*/ /** - * \brief Initialise the CC26XX AON RTC module + * \brief Initialise the CC13XX/CC26XX AON RTC module + * + * This timer configures AON RTC channels. * - * This timer configures the AON RTC's channel 2 to run in continuous mode * This function must be called before clock_init() and rtimer_init() */ -void cc26xx_rtc_init(void); +void soc_rtc_init(void); /** * \brief Return the time of the next scheduled rtimer event @@ -81,17 +76,24 @@ void cc26xx_rtc_init(void); * This function will check both AON RTC channels and will only take CH0's * compare into account if the channel is actually enabled */ -rtimer_clock_t cc26xx_rtc_get_next_trigger(void); +rtimer_clock_t soc_rtc_get_next_trigger(void); /** * \brief Schedule an AON RTC channel 0 one-shot compare event + * \param channel AON_RTC_CH0 or AON_RTC_CH1 * \param t The time when the event will be fired. This is an absolute * time, in other words the event will fire AT time \e t, * not IN \e t ticks + * + * Channel AON_RTC_CH0 is reserved for the rtimer. AON_RTC_CH1 is reserved + * for the system clock. + * + * User applications should not use this function. User applications should + * instead use Contiki's timer-related libraries */ -void cc26xx_rtc_schedule_one_shot(uint32_t t); +void soc_rtc_schedule_one_shot(uint32_t channel, uint32_t t); /*---------------------------------------------------------------------------*/ -#endif /* CC26XX_RTC_H_ */ +#endif /* SOC_RTC_H_ */ /*---------------------------------------------------------------------------*/ /** * @} diff --git a/cpu/cc26xx/dev/uart1.h b/cpu/cc26xx-cc13xx/dev/uart1.h similarity index 100% rename from cpu/cc26xx/dev/uart1.h rename to cpu/cc26xx-cc13xx/dev/uart1.h diff --git a/cpu/cc26xx/fault-handlers.c b/cpu/cc26xx-cc13xx/fault-handlers.c similarity index 100% rename from cpu/cc26xx/fault-handlers.c rename to cpu/cc26xx-cc13xx/fault-handlers.c diff --git a/cpu/cc26xx/ieee-addr.c b/cpu/cc26xx-cc13xx/ieee-addr.c similarity index 98% rename from cpu/cc26xx/ieee-addr.c rename to cpu/cc26xx-cc13xx/ieee-addr.c index 1d70aff18..6f7e9a296 100644 --- a/cpu/cc26xx/ieee-addr.c +++ b/cpu/cc26xx-cc13xx/ieee-addr.c @@ -34,7 +34,7 @@ * @{ * * \file - * Driver for the CC26xx IEEE addresses + * Driver for the CC13xx/CC26xx IEEE addresses */ /*---------------------------------------------------------------------------*/ #include "contiki-conf.h" diff --git a/cpu/cc26xx/ieee-addr.h b/cpu/cc26xx-cc13xx/ieee-addr.h similarity index 98% rename from cpu/cc26xx/ieee-addr.h rename to cpu/cc26xx-cc13xx/ieee-addr.h index 3cd97d72a..582854d49 100644 --- a/cpu/cc26xx/ieee-addr.h +++ b/cpu/cc26xx-cc13xx/ieee-addr.h @@ -33,7 +33,7 @@ * \addtogroup cc26xx * @{ * - * \defgroup cc26xx-ieee-addr CC26xx IEEE Address Control + * \defgroup cc26xx-ieee-addr CC13xx/CC26xx IEEE Address Control * * Driver for the retrieval of an IEEE address from flash * diff --git a/cpu/cc26xx-cc13xx/lib/cc13xxware b/cpu/cc26xx-cc13xx/lib/cc13xxware new file mode 160000 index 000000000..63ed52888 --- /dev/null +++ b/cpu/cc26xx-cc13xx/lib/cc13xxware @@ -0,0 +1 @@ +Subproject commit 63ed52888467ea7d403b0c743852162395232c9e diff --git a/cpu/cc26xx-cc13xx/lib/cc26xxware b/cpu/cc26xx-cc13xx/lib/cc26xxware new file mode 160000 index 000000000..0e82b18bf --- /dev/null +++ b/cpu/cc26xx-cc13xx/lib/cc26xxware @@ -0,0 +1 @@ +Subproject commit 0e82b18bf2c69fb0a40af4d2496db2a3dc721cec diff --git a/cpu/cc26xx/lpm.c b/cpu/cc26xx-cc13xx/lpm.c similarity index 91% rename from cpu/cc26xx/lpm.c rename to cpu/cc26xx-cc13xx/lpm.c index a0d633472..2f7b964f8 100644 --- a/cpu/cc26xx/lpm.c +++ b/cpu/cc26xx-cc13xx/lpm.c @@ -32,12 +32,12 @@ * \addtogroup cc26xx-lpm * @{ * - * Implementation of CC26xx low-power operation functionality + * Implementation of CC13xx/CC26xx low-power operation functionality * * @{ * * \file - * Driver for CC26xx's low-power operation + * Driver for CC13xx/CC26xx low-power operation */ /*---------------------------------------------------------------------------*/ #include "prcm.h" @@ -48,8 +48,11 @@ #include "lib/list.h" #include "dev/leds.h" #include "dev/watchdog.h" -#include "dev/cc26xx-rtc.h" +#include "dev/soc-rtc.h" #include "dev/oscillators.h" + +#include +#include /*---------------------------------------------------------------------------*/ #if ENERGEST_CONF_ON static unsigned long irq_energest = 0; @@ -72,7 +75,10 @@ LIST(modules_list); * Don't consider standby mode if the next AON RTC event is scheduled to fire * in less than STANDBY_MIN_DURATION rtimer ticks */ -#define STANDBY_MIN_DURATION (RTIMER_SECOND >> 8) +#define STANDBY_MIN_DURATION (RTIMER_SECOND >> 11) +/*---------------------------------------------------------------------------*/ +/* Prototype of a function in clock.c. Called every time we come out of DS */ +void clock_update(void); /*---------------------------------------------------------------------------*/ void lpm_shutdown(uint32_t wakeup_pin, uint32_t io_pull, uint32_t wake_on) @@ -93,10 +99,10 @@ lpm_shutdown(uint32_t wakeup_pin, uint32_t io_pull, uint32_t wake_on) /* Reset AON even fabric to default wakeup sources */ for(i = AON_EVENT_MCU_WU0; i <= AON_EVENT_MCU_WU3; i++) { - ti_lib_aon_event_mcu_wake_up_set(i, AON_EVENT_NULL); + ti_lib_aon_event_mcu_wake_up_set(i, AON_EVENT_NONE); } for(i = AON_EVENT_AUX_WU0; i <= AON_EVENT_AUX_WU2; i++) { - ti_lib_aon_event_aux_wake_up_set(i, AON_EVENT_NULL); + ti_lib_aon_event_aux_wake_up_set(i, AON_EVENT_NONE); } ti_lib_sys_ctrl_aon_sync(); @@ -222,6 +228,14 @@ wake_up(void) /* Check operating conditions, optimally choose DCDC versus GLDO */ ti_lib_sys_ctrl_dcdc_voltage_conditional_control(); + /* + * We may or may not have been woken up by an AON RTC tick. If not, we need + * to adjust our software tick counter + */ + clock_update(); + + watchdog_periodic(); + /* Notify all registered modules that we've just woken up */ for(module = list_head(modules_list); module != NULL; module = module->next) { @@ -237,10 +251,11 @@ lpm_drop() lpm_registered_module_t *module; uint8_t max_pm = LPM_MODE_MAX_SUPPORTED; uint8_t module_pm; + clock_time_t next_event; uint32_t domains = LOCKABLE_DOMAINS; - if(RTIMER_CLOCK_LT(cc26xx_rtc_get_next_trigger(), + if(RTIMER_CLOCK_LT(soc_rtc_get_next_trigger(), RTIMER_NOW() + STANDBY_MIN_DURATION)) { lpm_sleep(); return; @@ -269,6 +284,18 @@ lpm_drop() /* Critical. Don't get interrupted! */ ti_lib_int_master_disable(); + /* + * Reschedule AON RTC CH1 to fire an event N ticks before the next etimer + * event + */ + next_event = etimer_next_expiration_time(); + + if(next_event) { + next_event = next_event - clock_time(); + soc_rtc_schedule_one_shot(AON_RTC_CH1, RTIMER_NOW() + + (next_event * (RTIMER_SECOND / CLOCK_SECOND))); + } + /* * Notify all registered modules that we are dropping to mode X. We do not * need to do this for simple sleep. @@ -357,7 +384,7 @@ lpm_drop() while(ti_lib_aon_wuc_power_status_get() & AONWUC_AUX_POWER_ON); /* Configure the recharge controller */ - ti_lib_sys_ctrl_set_recharge_before_power_down(false); + ti_lib_sys_ctrl_set_recharge_before_power_down(XOSC_IN_HIGH_POWER_MODE); /* * If both PERIPH and SERIAL PDs are off, request the uLDO as the power @@ -436,6 +463,9 @@ void lpm_init() { list_init(modules_list); + + /* Always wake up on any DIO edge detection */ + ti_lib_aon_event_mcu_wake_up_set(AON_EVENT_MCU_WU2, AON_EVENT_IO); } /*---------------------------------------------------------------------------*/ void diff --git a/cpu/cc26xx/lpm.h b/cpu/cc26xx-cc13xx/lpm.h similarity index 97% rename from cpu/cc26xx/lpm.h rename to cpu/cc26xx-cc13xx/lpm.h index 8b701baff..cc144809b 100644 --- a/cpu/cc26xx/lpm.h +++ b/cpu/cc26xx-cc13xx/lpm.h @@ -32,14 +32,14 @@ * \addtogroup cc26xx * @{ * - * \defgroup cc26xx-lpm CC26xx Low-Power management + * \defgroup cc26xx-lpm CC13xx/CC26xx Low-Power management * - * CC26xx low-power operation + * CC13xx/CC26xx low-power operation * * @{ * * \file - * Header file for the management of CC26xx low-power operation + * Header file for the management of CC13xx/CC26xx low-power operation */ /*---------------------------------------------------------------------------*/ #ifndef LPM_H_ diff --git a/cpu/cc26xx/mtarch.h b/cpu/cc26xx-cc13xx/mtarch.h similarity index 100% rename from cpu/cc26xx/mtarch.h rename to cpu/cc26xx-cc13xx/mtarch.h diff --git a/cpu/cc26xx/putchar.c b/cpu/cc26xx-cc13xx/putchar.c similarity index 100% rename from cpu/cc26xx/putchar.c rename to cpu/cc26xx-cc13xx/putchar.c diff --git a/cpu/cc26xx/dev/rfc-api/ble_cmd.h b/cpu/cc26xx-cc13xx/rf-core/api/ble_cmd.h similarity index 98% rename from cpu/cc26xx/dev/rfc-api/ble_cmd.h rename to cpu/cc26xx-cc13xx/rf-core/api/ble_cmd.h index f7320fe4d..01324401f 100644 --- a/cpu/cc26xx/dev/rfc-api/ble_cmd.h +++ b/cpu/cc26xx-cc13xx/rf-core/api/ble_cmd.h @@ -1,1082 +1,1081 @@ -/****************************************************************************** -* Filename: ble_cmd.h -* Revised: $ $ -* Revision: $ $ -* -* Description: CC26xx/CC13xx API for Bluetooth Low Energy commands -* -* Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ -* -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* -* Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* -* Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* -* Neither the name of Texas Instruments Incorporated nor the names of -* its contributors may be used to endorse or promote products derived -* from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -******************************************************************************/ - -#ifndef __BLE_CMD_H -#define __BLE_CMD_H - -#ifndef __RFC_STRUCT -#ifdef __GNUC__ -#define __RFC_STRUCT __attribute__ ((aligned (4))) -#else -#define __RFC_STRUCT -#endif -#endif - -//! \addtogroup rfc -//! @{ - -//! \addtogroup ble_cmd -//! @{ - -#include -#include "mailbox.h" -#include "common_cmd.h" - -typedef struct __RFC_STRUCT rfc_bleMasterPar_s rfc_bleMasterPar_t; -typedef struct __RFC_STRUCT rfc_bleMasterSlavePar_s rfc_bleMasterSlavePar_t; -typedef struct __RFC_STRUCT rfc_CMD_BLE_INITIATOR_s rfc_CMD_BLE_INITIATOR_t; -typedef struct __RFC_STRUCT rfc_CMD_BLE_TX_TEST_s rfc_CMD_BLE_TX_TEST_t; -typedef struct __RFC_STRUCT rfc_CMD_BLE_MASTER_s rfc_CMD_BLE_MASTER_t; -typedef struct __RFC_STRUCT rfc_bleWhiteListEntry_s rfc_bleWhiteListEntry_t; -typedef struct __RFC_STRUCT rfc_bleGenericRxPar_s rfc_bleGenericRxPar_t; -typedef struct __RFC_STRUCT rfc_bleTxTestPar_s rfc_bleTxTestPar_t; -typedef struct __RFC_STRUCT rfc_bleInitiatorOutput_s rfc_bleInitiatorOutput_t; -typedef struct __RFC_STRUCT rfc_bleWhiteListEntryWords_s rfc_bleWhiteListEntryWords_t; -typedef struct __RFC_STRUCT rfc_bleMasterSlaveOutput_s rfc_bleMasterSlaveOutput_t; -typedef struct __RFC_STRUCT rfc_bleRxStatus_s rfc_bleRxStatus_t; -typedef struct __RFC_STRUCT rfc_bleRadioOp_s rfc_bleRadioOp_t; -typedef struct __RFC_STRUCT rfc_CMD_BLE_ADV_NC_s rfc_CMD_BLE_ADV_NC_t; -typedef struct __RFC_STRUCT rfc_bleTxTestOutput_s rfc_bleTxTestOutput_t; -typedef struct __RFC_STRUCT rfc_bleAdvPar_s rfc_bleAdvPar_t; -typedef struct __RFC_STRUCT rfc_CMD_BLE_ADV_SCAN_s rfc_CMD_BLE_ADV_SCAN_t; -typedef struct __RFC_STRUCT rfc_bleAdvOutput_s rfc_bleAdvOutput_t; -typedef struct __RFC_STRUCT rfc_bleScannerOutput_s rfc_bleScannerOutput_t; -typedef struct __RFC_STRUCT rfc_bleSlavePar_s rfc_bleSlavePar_t; -typedef struct __RFC_STRUCT rfc_CMD_BLE_ADV_DIR_s rfc_CMD_BLE_ADV_DIR_t; -typedef struct __RFC_STRUCT rfc_bleInitiatorPar_s rfc_bleInitiatorPar_t; -typedef struct __RFC_STRUCT rfc_bleScannerPar_s rfc_bleScannerPar_t; -typedef struct __RFC_STRUCT rfc_CMD_BLE_SLAVE_s rfc_CMD_BLE_SLAVE_t; -typedef struct __RFC_STRUCT rfc_CMD_BLE_ADV_s rfc_CMD_BLE_ADV_t; -typedef struct __RFC_STRUCT rfc_CMD_BLE_SCANNER_s rfc_CMD_BLE_SCANNER_t; -typedef struct __RFC_STRUCT rfc_bleGenericRxOutput_s rfc_bleGenericRxOutput_t; -typedef struct __RFC_STRUCT rfc_CMD_BLE_GENERIC_RX_s rfc_CMD_BLE_GENERIC_RX_t; -typedef struct __RFC_STRUCT rfc_CMD_BLE_ADV_PAYLOAD_s rfc_CMD_BLE_ADV_PAYLOAD_t; - -//! \addtogroup bleRadioOp -//! @{ -struct __RFC_STRUCT rfc_bleRadioOp_s { - uint16_t commandNo; //!< The command ID number - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - uint8_t channel; //!< \brief Channel to use
- //!< 0–39: BLE advertising/data channel number - //!< 60–207: Custom frequency; (2300 + channel) MHz - //!< 255: Use existing frequency - //!< Others: Reserved - struct { - uint8_t init:7; //!< \brief If bOverride = 1 or custom frequency is used:
- //!< 0: Do not use whitening
- //!< Other value: Initialization for 7-bit LFSR whitener - uint8_t bOverride:1; //!< \brief 0: Use default whitening for BLE advertising/data channels
- //!< 1: Override whitening initialization with value of init - } whitening; - uint8_t* pParams; //!< Pointer to command specific parameter structure - uint8_t* pOutput; //!< Pointer to command specific output structure -}; - -//! @} - -//! \addtogroup CMD_BLE_SLAVE -//! @{ -#define CMD_BLE_SLAVE 0x1801 -struct __RFC_STRUCT rfc_CMD_BLE_SLAVE_s { - uint16_t commandNo; //!< The command ID number 0x1801 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - uint8_t channel; //!< \brief Channel to use
- //!< 0–39: BLE advertising/data channel number - //!< 60–207: Custom frequency; (2300 + channel) MHz - //!< 255: Use existing frequency - //!< Others: Reserved - struct { - uint8_t init:7; //!< \brief If bOverride = 1 or custom frequency is used:
- //!< 0: Do not use whitening
- //!< Other value: Initialization for 7-bit LFSR whitener - uint8_t bOverride:1; //!< \brief 0: Use default whitening for BLE advertising/data channels
- //!< 1: Override whitening initialization with value of init - } whitening; - rfc_bleSlavePar_t *pParams; //!< Pointer to command specific parameter structure - rfc_bleMasterSlaveOutput_t *pOutput; //!< Pointer to command specific output structure -}; - -//! @} - -//! \addtogroup CMD_BLE_MASTER -//! @{ -#define CMD_BLE_MASTER 0x1802 -struct __RFC_STRUCT rfc_CMD_BLE_MASTER_s { - uint16_t commandNo; //!< The command ID number 0x1802 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - uint8_t channel; //!< \brief Channel to use
- //!< 0–39: BLE advertising/data channel number - //!< 60–207: Custom frequency; (2300 + channel) MHz - //!< 255: Use existing frequency - //!< Others: Reserved - struct { - uint8_t init:7; //!< \brief If bOverride = 1 or custom frequency is used:
- //!< 0: Do not use whitening
- //!< Other value: Initialization for 7-bit LFSR whitener - uint8_t bOverride:1; //!< \brief 0: Use default whitening for BLE advertising/data channels
- //!< 1: Override whitening initialization with value of init - } whitening; - rfc_bleMasterPar_t *pParams; //!< Pointer to command specific parameter structure - rfc_bleMasterSlaveOutput_t *pOutput; //!< Pointer to command specific output structure -}; - -//! @} - -//! \addtogroup CMD_BLE_ADV -//! @{ -#define CMD_BLE_ADV 0x1803 -struct __RFC_STRUCT rfc_CMD_BLE_ADV_s { - uint16_t commandNo; //!< The command ID number 0x1803 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - uint8_t channel; //!< \brief Channel to use
- //!< 0–39: BLE advertising/data channel number - //!< 60–207: Custom frequency; (2300 + channel) MHz - //!< 255: Use existing frequency - //!< Others: Reserved - struct { - uint8_t init:7; //!< \brief If bOverride = 1 or custom frequency is used:
- //!< 0: Do not use whitening
- //!< Other value: Initialization for 7-bit LFSR whitener - uint8_t bOverride:1; //!< \brief 0: Use default whitening for BLE advertising/data channels
- //!< 1: Override whitening initialization with value of init - } whitening; - rfc_bleAdvPar_t *pParams; //!< Pointer to command specific parameter structure - rfc_bleAdvOutput_t *pOutput; //!< Pointer to command specific output structure -}; - -//! @} - -//! \addtogroup CMD_BLE_ADV_DIR -//! @{ -#define CMD_BLE_ADV_DIR 0x1804 -struct __RFC_STRUCT rfc_CMD_BLE_ADV_DIR_s { - uint16_t commandNo; //!< The command ID number 0x1804 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - uint8_t channel; //!< \brief Channel to use
- //!< 0–39: BLE advertising/data channel number - //!< 60–207: Custom frequency; (2300 + channel) MHz - //!< 255: Use existing frequency - //!< Others: Reserved - struct { - uint8_t init:7; //!< \brief If bOverride = 1 or custom frequency is used:
- //!< 0: Do not use whitening
- //!< Other value: Initialization for 7-bit LFSR whitener - uint8_t bOverride:1; //!< \brief 0: Use default whitening for BLE advertising/data channels
- //!< 1: Override whitening initialization with value of init - } whitening; - rfc_bleAdvPar_t *pParams; //!< Pointer to command specific parameter structure - rfc_bleAdvOutput_t *pOutput; //!< Pointer to command specific output structure -}; - -//! @} - -//! \addtogroup CMD_BLE_ADV_NC -//! @{ -#define CMD_BLE_ADV_NC 0x1805 -struct __RFC_STRUCT rfc_CMD_BLE_ADV_NC_s { - uint16_t commandNo; //!< The command ID number 0x1805 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - uint8_t channel; //!< \brief Channel to use
- //!< 0–39: BLE advertising/data channel number - //!< 60–207: Custom frequency; (2300 + channel) MHz - //!< 255: Use existing frequency - //!< Others: Reserved - struct { - uint8_t init:7; //!< \brief If bOverride = 1 or custom frequency is used:
- //!< 0: Do not use whitening
- //!< Other value: Initialization for 7-bit LFSR whitener - uint8_t bOverride:1; //!< \brief 0: Use default whitening for BLE advertising/data channels
- //!< 1: Override whitening initialization with value of init - } whitening; - rfc_bleAdvPar_t *pParams; //!< Pointer to command specific parameter structure - rfc_bleAdvOutput_t *pOutput; //!< Pointer to command specific output structure -}; - -//! @} - -//! \addtogroup CMD_BLE_ADV_SCAN -//! @{ -#define CMD_BLE_ADV_SCAN 0x1806 -struct __RFC_STRUCT rfc_CMD_BLE_ADV_SCAN_s { - uint16_t commandNo; //!< The command ID number 0x1806 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - uint8_t channel; //!< \brief Channel to use
- //!< 0–39: BLE advertising/data channel number - //!< 60–207: Custom frequency; (2300 + channel) MHz - //!< 255: Use existing frequency - //!< Others: Reserved - struct { - uint8_t init:7; //!< \brief If bOverride = 1 or custom frequency is used:
- //!< 0: Do not use whitening
- //!< Other value: Initialization for 7-bit LFSR whitener - uint8_t bOverride:1; //!< \brief 0: Use default whitening for BLE advertising/data channels
- //!< 1: Override whitening initialization with value of init - } whitening; - rfc_bleAdvPar_t *pParams; //!< Pointer to command specific parameter structure - rfc_bleAdvOutput_t *pOutput; //!< Pointer to command specific output structure -}; - -//! @} - -//! \addtogroup CMD_BLE_SCANNER -//! @{ -#define CMD_BLE_SCANNER 0x1807 -struct __RFC_STRUCT rfc_CMD_BLE_SCANNER_s { - uint16_t commandNo; //!< The command ID number 0x1807 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - uint8_t channel; //!< \brief Channel to use
- //!< 0–39: BLE advertising/data channel number - //!< 60–207: Custom frequency; (2300 + channel) MHz - //!< 255: Use existing frequency - //!< Others: Reserved - struct { - uint8_t init:7; //!< \brief If bOverride = 1 or custom frequency is used:
- //!< 0: Do not use whitening
- //!< Other value: Initialization for 7-bit LFSR whitener - uint8_t bOverride:1; //!< \brief 0: Use default whitening for BLE advertising/data channels
- //!< 1: Override whitening initialization with value of init - } whitening; - rfc_bleScannerPar_t *pParams; //!< Pointer to command specific parameter structure - rfc_bleScannerOutput_t *pOutput; //!< Pointer to command specific output structure -}; - -//! @} - -//! \addtogroup CMD_BLE_INITIATOR -//! @{ -#define CMD_BLE_INITIATOR 0x1808 -struct __RFC_STRUCT rfc_CMD_BLE_INITIATOR_s { - uint16_t commandNo; //!< The command ID number 0x1808 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - uint8_t channel; //!< \brief Channel to use
- //!< 0–39: BLE advertising/data channel number - //!< 60–207: Custom frequency; (2300 + channel) MHz - //!< 255: Use existing frequency - //!< Others: Reserved - struct { - uint8_t init:7; //!< \brief If bOverride = 1 or custom frequency is used:
- //!< 0: Do not use whitening
- //!< Other value: Initialization for 7-bit LFSR whitener - uint8_t bOverride:1; //!< \brief 0: Use default whitening for BLE advertising/data channels
- //!< 1: Override whitening initialization with value of init - } whitening; - rfc_bleInitiatorPar_t *pParams; //!< Pointer to command specific parameter structure - rfc_bleInitiatorOutput_t *pOutput; //!< Pointer to command specific output structure -}; - -//! @} - -//! \addtogroup CMD_BLE_GENERIC_RX -//! @{ -#define CMD_BLE_GENERIC_RX 0x1809 -struct __RFC_STRUCT rfc_CMD_BLE_GENERIC_RX_s { - uint16_t commandNo; //!< The command ID number 0x1809 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - uint8_t channel; //!< \brief Channel to use
- //!< 0–39: BLE advertising/data channel number - //!< 60–207: Custom frequency; (2300 + channel) MHz - //!< 255: Use existing frequency - //!< Others: Reserved - struct { - uint8_t init:7; //!< \brief If bOverride = 1 or custom frequency is used:
- //!< 0: Do not use whitening
- //!< Other value: Initialization for 7-bit LFSR whitener - uint8_t bOverride:1; //!< \brief 0: Use default whitening for BLE advertising/data channels
- //!< 1: Override whitening initialization with value of init - } whitening; - rfc_bleGenericRxPar_t *pParams; //!< Pointer to command specific parameter structure - rfc_bleGenericRxOutput_t *pOutput; //!< Pointer to command specific output structure -}; - -//! @} - -//! \addtogroup CMD_BLE_TX_TEST -//! @{ -#define CMD_BLE_TX_TEST 0x180A -struct __RFC_STRUCT rfc_CMD_BLE_TX_TEST_s { - uint16_t commandNo; //!< The command ID number 0x180A - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - uint8_t channel; //!< \brief Channel to use
- //!< 0–39: BLE advertising/data channel number - //!< 60–207: Custom frequency; (2300 + channel) MHz - //!< 255: Use existing frequency - //!< Others: Reserved - struct { - uint8_t init:7; //!< \brief If bOverride = 1 or custom frequency is used:
- //!< 0: Do not use whitening
- //!< Other value: Initialization for 7-bit LFSR whitener - uint8_t bOverride:1; //!< \brief 0: Use default whitening for BLE advertising/data channels
- //!< 1: Override whitening initialization with value of init - } whitening; - rfc_bleTxTestPar_t *pParams; //!< Pointer to command specific parameter structure - rfc_bleTxTestOutput_t *pOutput; //!< Pointer to command specific output structure -}; - -//! @} - -//! \addtogroup CMD_BLE_ADV_PAYLOAD -//! @{ -#define CMD_BLE_ADV_PAYLOAD 0x1001 -struct __RFC_STRUCT rfc_CMD_BLE_ADV_PAYLOAD_s { - uint16_t commandNo; //!< The command ID number 0x1001 - uint8_t payloadType; //!< \brief 0: Advertising data
- //!< 1: Scan response data - uint8_t newLen; //!< Length of the new payload - uint8_t* pNewData; //!< Pointer to the buffer containing the new data - rfc_bleAdvPar_t *pParams; //!< Pointer to the parameter structure to update -}; - -//! @} - -//! \addtogroup bleMasterSlavePar -//! @{ -struct __RFC_STRUCT rfc_bleMasterSlavePar_s { - dataQueue_t* pRxQ; //!< Pointer to receive queue - dataQueue_t* pTxQ; //!< Pointer to transmit queue - struct { - uint8_t bAutoFlushIgnored:1; //!< If 1, automatically remove ignored packets from Rx queue - uint8_t bAutoFlushCrcErr:1; //!< If 1, automatically remove packets with CRC error from Rx queue - uint8_t bAutoFlushEmpty:1; //!< If 1, automatically remove empty packets from Rx queue - uint8_t bIncludeLenByte:1; //!< If 1, include the received length byte in the stored packet; otherwise discard it - uint8_t bIncludeCrc:1; //!< If 1, include the received CRC field in the stored packet; otherwise discard it - uint8_t bAppendRssi:1; //!< If 1, append an RSSI byte to the packet in the Rx queue - uint8_t bAppendStatus:1; //!< If 1, append a status byte to the packet in the Rx queue - uint8_t bAppendTimestamp:1; //!< If 1, append a timestamp to the packet in the Rx queue - } rxConfig; //!< Configuration bits for the receive queue entries - struct { - uint8_t lastRxSn:1; //!< The SN bit of the header of the last packet received with CRC OK - uint8_t lastTxSn:1; //!< The SN bit of the header of the last transmitted packet - uint8_t nextTxSn:1; //!< The SN bit of the header of the next packet to transmit - uint8_t bFirstPkt:1; //!< For slave: 0 if a packet has been transmitted on the connection, 1 otherwise - uint8_t bAutoEmpty:1; //!< 1 if the last transmitted packet was an auto-empty packet - uint8_t bLlCtrlTx:1; //!< 1 if the last transmitted packet was an LL control packet (LLID = 11) - uint8_t bLlCtrlAckRx:1; //!< 1 if the last received packet was the ACK of an LL control packet - uint8_t bLlCtrlAckPending:1; //!< 1 if the last successfully received packet was an LL control packet which has not yet been ACK'ed - } seqStat; - uint8_t maxNack; //!< Maximum number of NACKs received before operation ends. 0: No limit - uint8_t maxPkt; //!< Maximum number of packets transmitted in the operation before it ends. 0: No limit - uint32_t accessAddress; //!< Access address used on the connection - uint8_t crcInit0; //!< CRC initialization value used on the connection – least significant byte - uint8_t crcInit1; //!< CRC initialization value used on the connection – middle byte - uint8_t crcInit2; //!< CRC initialization value used on the connection – most significant byte -}; - -//! @} - -//! \addtogroup bleMasterPar -//! @{ -//! Parameter structure for master (CMD_BLE_MASTER) - -struct __RFC_STRUCT rfc_bleMasterPar_s { - dataQueue_t* pRxQ; //!< Pointer to receive queue - dataQueue_t* pTxQ; //!< Pointer to transmit queue - struct { - uint8_t bAutoFlushIgnored:1; //!< If 1, automatically remove ignored packets from Rx queue - uint8_t bAutoFlushCrcErr:1; //!< If 1, automatically remove packets with CRC error from Rx queue - uint8_t bAutoFlushEmpty:1; //!< If 1, automatically remove empty packets from Rx queue - uint8_t bIncludeLenByte:1; //!< If 1, include the received length byte in the stored packet; otherwise discard it - uint8_t bIncludeCrc:1; //!< If 1, include the received CRC field in the stored packet; otherwise discard it - uint8_t bAppendRssi:1; //!< If 1, append an RSSI byte to the packet in the Rx queue - uint8_t bAppendStatus:1; //!< If 1, append a status byte to the packet in the Rx queue - uint8_t bAppendTimestamp:1; //!< If 1, append a timestamp to the packet in the Rx queue - } rxConfig; //!< Configuration bits for the receive queue entries - struct { - uint8_t lastRxSn:1; //!< The SN bit of the header of the last packet received with CRC OK - uint8_t lastTxSn:1; //!< The SN bit of the header of the last transmitted packet - uint8_t nextTxSn:1; //!< The SN bit of the header of the next packet to transmit - uint8_t bFirstPkt:1; //!< For slave: 0 if a packet has been transmitted on the connection, 1 otherwise - uint8_t bAutoEmpty:1; //!< 1 if the last transmitted packet was an auto-empty packet - uint8_t bLlCtrlTx:1; //!< 1 if the last transmitted packet was an LL control packet (LLID = 11) - uint8_t bLlCtrlAckRx:1; //!< 1 if the last received packet was the ACK of an LL control packet - uint8_t bLlCtrlAckPending:1; //!< 1 if the last successfully received packet was an LL control packet which has not yet been ACK'ed - } seqStat; - uint8_t maxNack; //!< Maximum number of NACKs received before operation ends. 0: No limit - uint8_t maxPkt; //!< Maximum number of packets transmitted in the operation before it ends. 0: No limit - uint32_t accessAddress; //!< Access address used on the connection - uint8_t crcInit0; //!< CRC initialization value used on the connection – least significant byte - uint8_t crcInit1; //!< CRC initialization value used on the connection – middle byte - uint8_t crcInit2; //!< CRC initialization value used on the connection – most significant byte - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } endTrigger; //!< Trigger that causes the device to end the connection event as soon as allowed - ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to end the - //!< connection event as soon as allowed -}; - -//! @} - -//! \addtogroup bleSlavePar -//! @{ -//! Parameter structure for slave (CMD_BLE_SLAVE) - -struct __RFC_STRUCT rfc_bleSlavePar_s { - dataQueue_t* pRxQ; //!< Pointer to receive queue - dataQueue_t* pTxQ; //!< Pointer to transmit queue - struct { - uint8_t bAutoFlushIgnored:1; //!< If 1, automatically remove ignored packets from Rx queue - uint8_t bAutoFlushCrcErr:1; //!< If 1, automatically remove packets with CRC error from Rx queue - uint8_t bAutoFlushEmpty:1; //!< If 1, automatically remove empty packets from Rx queue - uint8_t bIncludeLenByte:1; //!< If 1, include the received length byte in the stored packet; otherwise discard it - uint8_t bIncludeCrc:1; //!< If 1, include the received CRC field in the stored packet; otherwise discard it - uint8_t bAppendRssi:1; //!< If 1, append an RSSI byte to the packet in the Rx queue - uint8_t bAppendStatus:1; //!< If 1, append a status byte to the packet in the Rx queue - uint8_t bAppendTimestamp:1; //!< If 1, append a timestamp to the packet in the Rx queue - } rxConfig; //!< Configuration bits for the receive queue entries - struct { - uint8_t lastRxSn:1; //!< The SN bit of the header of the last packet received with CRC OK - uint8_t lastTxSn:1; //!< The SN bit of the header of the last transmitted packet - uint8_t nextTxSn:1; //!< The SN bit of the header of the next packet to transmit - uint8_t bFirstPkt:1; //!< For slave: 0 if a packet has been transmitted on the connection, 1 otherwise - uint8_t bAutoEmpty:1; //!< 1 if the last transmitted packet was an auto-empty packet - uint8_t bLlCtrlTx:1; //!< 1 if the last transmitted packet was an LL control packet (LLID = 11) - uint8_t bLlCtrlAckRx:1; //!< 1 if the last received packet was the ACK of an LL control packet - uint8_t bLlCtrlAckPending:1; //!< 1 if the last successfully received packet was an LL control packet which has not yet been ACK'ed - } seqStat; - uint8_t maxNack; //!< Maximum number of NACKs received before operation ends. 0: No limit - uint8_t maxPkt; //!< Maximum number of packets transmitted in the operation before it ends. 0: No limit - uint32_t accessAddress; //!< Access address used on the connection - uint8_t crcInit0; //!< CRC initialization value used on the connection – least significant byte - uint8_t crcInit1; //!< CRC initialization value used on the connection – middle byte - uint8_t crcInit2; //!< CRC initialization value used on the connection – most significant byte - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } timeoutTrigger; //!< Trigger that defines timeout of the first receive operation - ratmr_t timeoutTime; //!< \brief Time used together with timeoutTrigger that defines timeout of the first - //!< receive operation - uint16_t __dummy0; - uint8_t __dummy1; - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } endTrigger; //!< Trigger that causes the device to end the connection event as soon as allowed - ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to end the - //!< connection event as soon as allowed -}; - -//! @} - -//! \addtogroup bleAdvPar -//! @{ -//! Parameter structure for advertiser (CMD_BLE_ADV*) - -struct __RFC_STRUCT rfc_bleAdvPar_s { - dataQueue_t* pRxQ; //!< Pointer to receive queue - struct { - uint8_t bAutoFlushIgnored:1; //!< If 1, automatically remove ignored packets from Rx queue - uint8_t bAutoFlushCrcErr:1; //!< If 1, automatically remove packets with CRC error from Rx queue - uint8_t bAutoFlushEmpty:1; //!< If 1, automatically remove empty packets from Rx queue - uint8_t bIncludeLenByte:1; //!< If 1, include the received length byte in the stored packet; otherwise discard it - uint8_t bIncludeCrc:1; //!< If 1, include the received CRC field in the stored packet; otherwise discard it - uint8_t bAppendRssi:1; //!< If 1, append an RSSI byte to the packet in the Rx queue - uint8_t bAppendStatus:1; //!< If 1, append a status byte to the packet in the Rx queue - uint8_t bAppendTimestamp:1; //!< If 1, append a timestamp to the packet in the Rx queue - } rxConfig; //!< Configuration bits for the receive queue entries - struct { - uint8_t advFilterPolicy:2; //!< \brief The advertiser filter policy, as defined in Volume 2, Part E, Section 7.8.5 of - //!< the Bluetooth 4.0 spec - uint8_t deviceAddrType:1; //!< The type of the device address – public (0) or random (1) - uint8_t peerAddrType:1; //!< Directed advertiser: The type of the peer address – public (0) or random (1) - uint8_t bStrictLenFilter:1; //!< 1: Discard messages with illegal length - } advConfig; - uint8_t advLen; //!< Size of advertiser data - uint8_t scanRspLen; //!< Size of scan response data - uint8_t* pAdvData; //!< Pointer to buffer containing ADV*_IND data - uint8_t* pScanRspData; //!< Pointer to buffer containing SCAN_RSP data - uint16_t* pDeviceAddress; //!< Pointer to device address used for this device - rfc_bleWhiteListEntry_t *pWhiteList; //!< Pointer to white list or peer address (directed advertiser) - uint16_t __dummy0; - uint8_t __dummy1; - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } endTrigger; //!< Trigger that causes the device to end the advertiser event as soon as allowed - ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to end the - //!< advertiser event as soon as allowed -}; - -//! @} - -//! \addtogroup bleScannerPar -//! @{ -//! Parameter structure for scanner (CMD_BLE_SCANNER) - -struct __RFC_STRUCT rfc_bleScannerPar_s { - dataQueue_t* pRxQ; //!< Pointer to receive queue - struct { - uint8_t bAutoFlushIgnored:1; //!< If 1, automatically remove ignored packets from Rx queue - uint8_t bAutoFlushCrcErr:1; //!< If 1, automatically remove packets with CRC error from Rx queue - uint8_t bAutoFlushEmpty:1; //!< If 1, automatically remove empty packets from Rx queue - uint8_t bIncludeLenByte:1; //!< If 1, include the received length byte in the stored packet; otherwise discard it - uint8_t bIncludeCrc:1; //!< If 1, include the received CRC field in the stored packet; otherwise discard it - uint8_t bAppendRssi:1; //!< If 1, append an RSSI byte to the packet in the Rx queue - uint8_t bAppendStatus:1; //!< If 1, append a status byte to the packet in the Rx queue - uint8_t bAppendTimestamp:1; //!< If 1, append a timestamp to the packet in the Rx queue - } rxConfig; //!< Configuration bits for the receive queue entries - struct { - uint8_t scanFilterPolicy:1; //!< \brief The advertiser filter policy, as defined in Volume 2, Part E, Section 7.8.10 of - //!< the Bluetooth 4.0 spec - uint8_t bActiveScan:1; //!< \brief 0: Passive scan
- //!< 1: Active scan - uint8_t deviceAddrType:1; //!< The type of the device address – public (0) or random (1) - uint8_t :1; - uint8_t bStrictLenFilter:1; //!< 1: Discard messages with illegal length - uint8_t bAutoWlIgnore:1; //!< 1: Automatically set ignore bit in white list - uint8_t bEndOnRpt:1; //!< 1: End scanner operation after each reported ADV*_IND and potentially SCAN_RSP - } scanConfig; - uint16_t randomState; //!< State for pseudo-random number generation used in backoff procedure - uint16_t backoffCount; //!< Parameter backoffCount used in backoff procedure, cf. Bluetooth 4.0 spec - struct { - uint8_t logUpperLimit:4; //!< Binary logarithm of parameter upperLimit used in scanner backoff procedure - uint8_t bLastSucceeded:1; //!< \brief 1 if the last SCAN_RSP was successfully received and upperLimit - //!< not changed - uint8_t bLastFailed:1; //!< \brief 1 if reception of the last SCAN_RSP failed and upperLimit was not - //!< changed - } backoffPar; - uint8_t scanReqLen; //!< Size of scan request data - uint8_t* pScanReqData; //!< Pointer to buffer containing SCAN_REQ data - uint16_t* pDeviceAddress; //!< Pointer to device address used for this device - rfc_bleWhiteListEntry_t *pWhiteList; //!< Pointer to white list - uint16_t __dummy0; - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } timeoutTrigger; //!< Trigger that causes the device to stop receiving as soon as allowed - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } endTrigger; //!< Trigger that causes the device to stop receiving as soon as allowed - ratmr_t timeoutTime; //!< \brief Time used together with timeoutTrigger that causes the device to stop - //!< receiving as soon as allowed, ending with BLE_DONE_RXTIMEOUT - ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to stop - //!< receiving as soon as allowed, ending with BLE_DONE_ENDED -}; - -//! @} - -//! \addtogroup bleInitiatorPar -//! @{ -//! Parameter structure for initiator (CMD_BLE_INITIATOR) - -struct __RFC_STRUCT rfc_bleInitiatorPar_s { - dataQueue_t* pRxQ; //!< Pointer to receive queue - struct { - uint8_t bAutoFlushIgnored:1; //!< If 1, automatically remove ignored packets from Rx queue - uint8_t bAutoFlushCrcErr:1; //!< If 1, automatically remove packets with CRC error from Rx queue - uint8_t bAutoFlushEmpty:1; //!< If 1, automatically remove empty packets from Rx queue - uint8_t bIncludeLenByte:1; //!< If 1, include the received length byte in the stored packet; otherwise discard it - uint8_t bIncludeCrc:1; //!< If 1, include the received CRC field in the stored packet; otherwise discard it - uint8_t bAppendRssi:1; //!< If 1, append an RSSI byte to the packet in the Rx queue - uint8_t bAppendStatus:1; //!< If 1, append a status byte to the packet in the Rx queue - uint8_t bAppendTimestamp:1; //!< If 1, append a timestamp to the packet in the Rx queue - } rxConfig; //!< Configuration bits for the receive queue entries - struct { - uint8_t bUseWhiteList:1; //!< \brief Initiator filter policy, cf. Volume 2, Part E, Section 7.8.10 of the - //!< Bluetooth 4.0 spec:
- //!< 0: Use specific peer address
- //!< 1: Use white list - uint8_t bDynamicWinOffset:1; //!< 1: Use dynamic WinOffset insertion - uint8_t deviceAddrType:1; //!< The type of the device address – public (0) or random (1) - uint8_t peerAddrType:1; //!< The type of the peer address – public (0) or random (1) - uint8_t bStrictLenFilter:1; //!< 1: Discard messages with illegal length - } initConfig; - uint8_t __dummy0; - uint8_t connectReqLen; //!< Size of connect request data - uint8_t* pConnectReqData; //!< Pointer to buffer containing LLData to go in the CONNECT_REQ - uint16_t* pDeviceAddress; //!< Pointer to device address used for this device - rfc_bleWhiteListEntry_t *pWhiteList; //!< Pointer to white list or peer address - ratmr_t connectTime; //!< \brief Indication of timer value of the first possible start time of the first connection event. - //!< Set to the calculated value if a connection is made and to the next possible connection - //!< time if not. - uint16_t __dummy1; - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } timeoutTrigger; //!< Trigger that causes the device to stop receiving as soon as allowed - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } endTrigger; //!< Trigger that causes the device to stop receiving as soon as allowed - ratmr_t timeoutTime; //!< \brief Time used together with timeoutTrigger that causes the device to stop - //!< receiving as soon as allowed, ending with BLE_DONE_RXTIMEOUT - ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to stop - //!< receiving as soon as allowed, ending with BLE_DONE_ENDED -}; - -//! @} - -//! \addtogroup bleGenericRxPar -//! @{ -//! Parameter structure for generic Rx (CMD_BLE_GENERIC_RX) - -struct __RFC_STRUCT rfc_bleGenericRxPar_s { - dataQueue_t* pRxQ; //!< Pointer to receive queue. May be NULL; if so, received packets are not stored - struct { - uint8_t bAutoFlushIgnored:1; //!< If 1, automatically remove ignored packets from Rx queue - uint8_t bAutoFlushCrcErr:1; //!< If 1, automatically remove packets with CRC error from Rx queue - uint8_t bAutoFlushEmpty:1; //!< If 1, automatically remove empty packets from Rx queue - uint8_t bIncludeLenByte:1; //!< If 1, include the received length byte in the stored packet; otherwise discard it - uint8_t bIncludeCrc:1; //!< If 1, include the received CRC field in the stored packet; otherwise discard it - uint8_t bAppendRssi:1; //!< If 1, append an RSSI byte to the packet in the Rx queue - uint8_t bAppendStatus:1; //!< If 1, append a status byte to the packet in the Rx queue - uint8_t bAppendTimestamp:1; //!< If 1, append a timestamp to the packet in the Rx queue - } rxConfig; //!< Configuration bits for the receive queue entries - uint8_t bRepeat; //!< \brief 0: End operation after receiving a packet
- //!< 1: Restart receiver after receiving a packet - uint16_t __dummy0; - uint32_t accessAddress; //!< Access address used on the connection - uint8_t crcInit0; //!< CRC initialization value used on the connection – least significant byte - uint8_t crcInit1; //!< CRC initialization value used on the connection – middle byte - uint8_t crcInit2; //!< CRC initialization value used on the connection – most significant byte - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } endTrigger; //!< Trigger that causes the device to end the Rx operation - ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to end the - //!< Rx operation -}; - -//! @} - -//! \addtogroup bleTxTestPar -//! @{ -//! Parameter structure for Tx test (CMD_BLE_TX_TEST) - -struct __RFC_STRUCT rfc_bleTxTestPar_s { - uint16_t numPackets; //!< \brief Number of packets to transmit
- //!< 0: Transmit unlimited number of packets - uint8_t payloadLength; //!< The number of payload bytes in each packet. - uint8_t packetType; //!< \brief The packet type to be used, encoded according to the Bluetooth 4.0 spec, Volume 2, Part E, - //!< Section 7.8.29 - ratmr_t period; //!< Number of radio timer cycles between the start of each packet - struct { - uint8_t bOverrideDefault:1; //!< \brief 0: Use default packet encoding
- //!< 1: Override packet contents - uint8_t bUsePrbs9:1; //!< \brief If bOverride is 1:
- //!< 1: Use PRBS9 encoding of packet - uint8_t bUsePrbs15:1; //!< \brief If bOverride is 1:
- //!< 1: Use PRBS15 encoding of packet - } config; - uint8_t byteVal; //!< If config.bOverride is 1, value of each byte to be sent - uint8_t __dummy0; - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } endTrigger; //!< Trigger that causes the device to end the Test Tx operation - ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to end the - //!< Test Tx operation -}; - -//! @} - -//! \addtogroup bleMasterSlaveOutput -//! @{ -//! Output structure for master and slave (CMD_BLE_MASTER/CMD_BLE_SLAVE) - -struct __RFC_STRUCT rfc_bleMasterSlaveOutput_s { - uint8_t nTx; //!< \brief Total number of packets (including auto-empty and retransmissions) that have been - //!< transmitted - uint8_t nTxAck; //!< Total number of transmitted packets (including auto-empty) that have been ACK'ed - uint8_t nTxCtrl; //!< Number of unique LL control packets from the Tx queue that have been transmitted - uint8_t nTxCtrlAck; //!< Number of LL control packets from the Tx queue that have been finished (ACK'ed) - uint8_t nTxCtrlAckAck; //!< \brief Number of LL control packets that have been ACK'ed and where an ACK has been sent in - //!< response - uint8_t nTxRetrans; //!< Number of retransmissions that has been done - uint8_t nTxEntryDone; //!< Number of packets from the Tx queue that have been finished (ACK'ed) - uint8_t nRxOk; //!< Number of packets that have been received with payload, CRC OK and not ignored - uint8_t nRxCtrl; //!< Number of LL control packets that have been received with CRC OK and not ignored - uint8_t nRxCtrlAck; //!< \brief Number of LL control packets that have been received with CRC OK and not ignored, and - //!< then ACK'ed - uint8_t nRxNok; //!< Number of packets that have been received with CRC error - uint8_t nRxIgnored; //!< \brief Number of packets that have been received with CRC OK and ignored due to repeated - //!< sequence number - uint8_t nRxEmpty; //!< Number of packets that have been received with CRC OK and no payload - uint8_t nRxBufFull; //!< Number of packets that have been received and discarded due to lack of buffer space - int8_t lastRssi; //!< RSSI of last received packet - struct { - uint8_t bTimeStampValid:1; //!< 1 if a valid time stamp has been written to timeStamp; 0 otherwise - uint8_t bLastCrcErr:1; //!< 1 if the last received packet had CRC error; 0 otherwise - uint8_t bLastIgnored:1; //!< 1 if the last received packet with CRC OK was ignored; 0 otherwise - uint8_t bLastEmpty:1; //!< 1 if the last received packet with CRC OK was empty; 0 otherwise - uint8_t bLastCtrl:1; //!< 1 if the last received packet with CRC OK was empty; 0 otherwise - uint8_t bLastMd:1; //!< 1 if the last received packet with CRC OK had MD = 1; 0 otherwise - uint8_t bLastAck:1; //!< \brief 1 if the last received packet with CRC OK was an ACK of a transmitted packet; - //!< 0 otherwise - } pktStatus; - ratmr_t timeStamp; //!< Slave operation: Time stamp of first received packet -}; - -//! @} - -//! \addtogroup bleAdvOutput -//! @{ -//! Output structure for advertiser (CMD_BLE_ADV*) - -struct __RFC_STRUCT rfc_bleAdvOutput_s { - uint16_t nTxAdvInd; //!< Number of ADV*_IND packets completely transmitted - uint8_t nTxScanRsp; //!< Number of SCAN_RSP packets transmitted - uint8_t nRxScanReq; //!< Number of SCAN_REQ packets received OK and not ignored - uint8_t nRxConnectReq; //!< Number of CONNECT_REQ packets received OK and not ignored - uint8_t __dummy0; - uint16_t nRxNok; //!< Number of packets received with CRC error - uint16_t nRxIgnored; //!< Number of packets received with CRC OK, but ignored - uint8_t nRxBufFull; //!< Number of packets received that did not fit in Rx queue - int8_t lastRssi; //!< The RSSI of the last received packet - ratmr_t timeStamp; //!< Time stamp of the last received packet -}; - -//! @} - -//! \addtogroup bleScannerOutput -//! @{ -//! Output structure for scanner (CMD_BLE_SCANNER) - -struct __RFC_STRUCT rfc_bleScannerOutput_s { - uint16_t nTxScanReq; //!< Number of transmitted SCAN_REQ packets - uint16_t nBackedOffScanReq; //!< Number of SCAN_REQ packets not sent due to backoff procedure - uint16_t nRxAdvOk; //!< Number of ADV*_IND packets received with CRC OK and not ignored - uint16_t nRxAdvIgnored; //!< Number of ADV*_IND packets received with CRC OK, but ignored - uint16_t nRxAdvNok; //!< Number of ADV*_IND packets received with CRC error - uint16_t nRxScanRspOk; //!< Number of SCAN_RSP packets received with CRC OK and not ignored - uint16_t nRxScanRspIgnored; //!< Number of SCAN_RSP packets received with CRC OK, but ignored - uint16_t nRxScanRspNok; //!< Number of SCAN_RSP packets received with CRC error - uint8_t nRxAdvBufFull; //!< Number of ADV*_IND packets received that did not fit in Rx queue - uint8_t nRxScanRspBufFull; //!< Number of SCAN_RSP packets received that did not fit in Rx queue - int8_t lastRssi; //!< The RSSI of the last received packet - uint8_t __dummy0; - ratmr_t timeStamp; //!< Time stamp of the last successfully received ADV*_IND packet that was not ignored -}; - -//! @} - -//! \addtogroup bleInitiatorOutput -//! @{ -//! Output structure for initiator (CMD_BLE_INITIATOR) - -struct __RFC_STRUCT rfc_bleInitiatorOutput_s { - uint8_t nTxConnectReq; //!< Number of transmitted CONNECT_REQ packets - uint8_t nRxAdvOk; //!< Number of ADV*_IND packets received with CRC OK and not ignored - uint16_t nRxAdvIgnored; //!< Number of ADV*_IND packets received with CRC OK, but ignored - uint16_t nRxAdvNok; //!< Number of ADV*_IND packets received with CRC error - uint8_t nRxAdvBufFull; //!< Number of ADV*_IND packets received that did not fit in Rx queue - int8_t lastRssi; //!< The RSSI of the last received packet - ratmr_t timeStamp; //!< Time stamp of the received ADV*_IND packet that caused transmission of CONNECT_REQ -}; - -//! @} - -//! \addtogroup bleGenericRxOutput -//! @{ -//! Output structure for generic Rx (CMD_BLE_GENERIC_RX) - -struct __RFC_STRUCT rfc_bleGenericRxOutput_s { - uint16_t nRxOk; //!< Number of packets received with CRC OK - uint16_t nRxNok; //!< Number of packets received with CRC error - uint16_t nRxBufFull; //!< Number of packets that have been received and discarded due to lack of buffer space - int8_t lastRssi; //!< The RSSI of the last received packet - uint8_t __dummy0; - ratmr_t timeStamp; //!< Time stamp of the last received packet -}; - -//! @} - -//! \addtogroup bleTxTestOutput -//! @{ -//! Output structure for Tx test (CMD_BLE_TX_TEST) - -struct __RFC_STRUCT rfc_bleTxTestOutput_s { - uint16_t nTx; //!< Number of packets transmitted -}; - -//! @} - -//! \addtogroup bleWhiteListEntry -//! @{ -//! White list entry structure - -struct __RFC_STRUCT rfc_bleWhiteListEntry_s { - uint8_t size; //!< Number of while list entries. Used in the first entry of the list only - struct { - uint8_t bEnable:1; //!< 1 if the entry is in use, 0 if the entry is not in use - uint8_t addrType:1; //!< The type address in the entry – public (0) or random (1) - uint8_t bWlIgn:1; //!< \brief 1 if the entry is to be ignored by a scanner, 0 otherwise. Used to mask out - //!< entries that have already been scanned and reported. - } conf; - uint16_t address; //!< Least significant 16 bits of the address contained in the entry - uint32_t addressHi; //!< Most significant 32 bits of the address contained in the entry -}; - -//! @} - -//! \addtogroup bleRxStatus -//! @{ -//! Receive status byte that may be appended to message in receive buffer - -struct __RFC_STRUCT rfc_bleRxStatus_s { - struct { - uint8_t channel:6; //!< \brief The channel on which the packet was received, provided channel is in the range - //!< 0–39; otherwise 0x3F - uint8_t bIgnore:1; //!< 1 if the packet is marked as ignored, 0 otherwise - uint8_t bCrcErr:1; //!< 1 if the packet was received with CRC error, 0 otherwise - } status; -}; - -//! @} - -//! @} -//! @} -#endif +/****************************************************************************** +* Filename: ble_cmd.h +* Revised: $ $ +* Revision: $ $ +* +* Description: CC26xx/CC13xx API for Bluetooth Low Energy commands +* +* Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ +* +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* +* Neither the name of Texas Instruments Incorporated nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +******************************************************************************/ + +#ifndef BLE_CMD_H_ +#define BLE_CMD_H_ + +#ifndef __RFC_STRUCT +#ifdef __GNUC__ +#define __RFC_STRUCT __attribute__ ((aligned (4))) +#else +#define __RFC_STRUCT +#endif +#endif + +//! \addtogroup rfc +//! @{ + +//! \addtogroup ble_cmd +//! @{ + +#include +#include "mailbox.h" +#include "common_cmd.h" + +typedef struct __RFC_STRUCT rfc_bleRadioOp_s rfc_bleRadioOp_t; +typedef struct __RFC_STRUCT rfc_CMD_BLE_SLAVE_s rfc_CMD_BLE_SLAVE_t; +typedef struct __RFC_STRUCT rfc_CMD_BLE_MASTER_s rfc_CMD_BLE_MASTER_t; +typedef struct __RFC_STRUCT rfc_CMD_BLE_ADV_s rfc_CMD_BLE_ADV_t; +typedef struct __RFC_STRUCT rfc_CMD_BLE_ADV_DIR_s rfc_CMD_BLE_ADV_DIR_t; +typedef struct __RFC_STRUCT rfc_CMD_BLE_ADV_NC_s rfc_CMD_BLE_ADV_NC_t; +typedef struct __RFC_STRUCT rfc_CMD_BLE_ADV_SCAN_s rfc_CMD_BLE_ADV_SCAN_t; +typedef struct __RFC_STRUCT rfc_CMD_BLE_SCANNER_s rfc_CMD_BLE_SCANNER_t; +typedef struct __RFC_STRUCT rfc_CMD_BLE_INITIATOR_s rfc_CMD_BLE_INITIATOR_t; +typedef struct __RFC_STRUCT rfc_CMD_BLE_GENERIC_RX_s rfc_CMD_BLE_GENERIC_RX_t; +typedef struct __RFC_STRUCT rfc_CMD_BLE_TX_TEST_s rfc_CMD_BLE_TX_TEST_t; +typedef struct __RFC_STRUCT rfc_CMD_BLE_ADV_PAYLOAD_s rfc_CMD_BLE_ADV_PAYLOAD_t; +typedef struct __RFC_STRUCT rfc_bleMasterSlavePar_s rfc_bleMasterSlavePar_t; +typedef struct __RFC_STRUCT rfc_bleMasterPar_s rfc_bleMasterPar_t; +typedef struct __RFC_STRUCT rfc_bleSlavePar_s rfc_bleSlavePar_t; +typedef struct __RFC_STRUCT rfc_bleAdvPar_s rfc_bleAdvPar_t; +typedef struct __RFC_STRUCT rfc_bleScannerPar_s rfc_bleScannerPar_t; +typedef struct __RFC_STRUCT rfc_bleInitiatorPar_s rfc_bleInitiatorPar_t; +typedef struct __RFC_STRUCT rfc_bleGenericRxPar_s rfc_bleGenericRxPar_t; +typedef struct __RFC_STRUCT rfc_bleTxTestPar_s rfc_bleTxTestPar_t; +typedef struct __RFC_STRUCT rfc_bleMasterSlaveOutput_s rfc_bleMasterSlaveOutput_t; +typedef struct __RFC_STRUCT rfc_bleAdvOutput_s rfc_bleAdvOutput_t; +typedef struct __RFC_STRUCT rfc_bleScannerOutput_s rfc_bleScannerOutput_t; +typedef struct __RFC_STRUCT rfc_bleInitiatorOutput_s rfc_bleInitiatorOutput_t; +typedef struct __RFC_STRUCT rfc_bleGenericRxOutput_s rfc_bleGenericRxOutput_t; +typedef struct __RFC_STRUCT rfc_bleTxTestOutput_s rfc_bleTxTestOutput_t; +typedef struct __RFC_STRUCT rfc_bleWhiteListEntry_s rfc_bleWhiteListEntry_t; +typedef struct __RFC_STRUCT rfc_bleRxStatus_s rfc_bleRxStatus_t; + +//! \addtogroup bleRadioOp +//! @{ +struct __RFC_STRUCT rfc_bleRadioOp_s { + uint16_t commandNo; //!< The command ID number + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint8_t channel; //!< \brief Channel to use
+ //!< 0–39: BLE advertising/data channel number + //!< 60–207: Custom frequency; (2300 + channel) MHz + //!< 255: Use existing frequency + //!< Others: Reserved + struct { + uint8_t init:7; //!< \brief If bOverride = 1 or custom frequency is used:
+ //!< 0: Do not use whitening
+ //!< Other value: Initialization for 7-bit LFSR whitener + uint8_t bOverride:1; //!< \brief 0: Use default whitening for BLE advertising/data channels
+ //!< 1: Override whitening initialization with value of init + } whitening; + uint8_t* pParams; //!< Pointer to command specific parameter structure + uint8_t* pOutput; //!< Pointer to command specific output structure +}; + +//! @} + +//! \addtogroup CMD_BLE_SLAVE +//! @{ +#define CMD_BLE_SLAVE 0x1801 +struct __RFC_STRUCT rfc_CMD_BLE_SLAVE_s { + uint16_t commandNo; //!< The command ID number 0x1801 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint8_t channel; //!< \brief Channel to use
+ //!< 0–39: BLE advertising/data channel number + //!< 60–207: Custom frequency; (2300 + channel) MHz + //!< 255: Use existing frequency + //!< Others: Reserved + struct { + uint8_t init:7; //!< \brief If bOverride = 1 or custom frequency is used:
+ //!< 0: Do not use whitening
+ //!< Other value: Initialization for 7-bit LFSR whitener + uint8_t bOverride:1; //!< \brief 0: Use default whitening for BLE advertising/data channels
+ //!< 1: Override whitening initialization with value of init + } whitening; + rfc_bleSlavePar_t *pParams; //!< Pointer to command specific parameter structure + rfc_bleMasterSlaveOutput_t *pOutput; //!< Pointer to command specific output structure +}; + +//! @} + +//! \addtogroup CMD_BLE_MASTER +//! @{ +#define CMD_BLE_MASTER 0x1802 +struct __RFC_STRUCT rfc_CMD_BLE_MASTER_s { + uint16_t commandNo; //!< The command ID number 0x1802 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint8_t channel; //!< \brief Channel to use
+ //!< 0–39: BLE advertising/data channel number + //!< 60–207: Custom frequency; (2300 + channel) MHz + //!< 255: Use existing frequency + //!< Others: Reserved + struct { + uint8_t init:7; //!< \brief If bOverride = 1 or custom frequency is used:
+ //!< 0: Do not use whitening
+ //!< Other value: Initialization for 7-bit LFSR whitener + uint8_t bOverride:1; //!< \brief 0: Use default whitening for BLE advertising/data channels
+ //!< 1: Override whitening initialization with value of init + } whitening; + rfc_bleMasterPar_t *pParams; //!< Pointer to command specific parameter structure + rfc_bleMasterSlaveOutput_t *pOutput; //!< Pointer to command specific output structure +}; + +//! @} + +//! \addtogroup CMD_BLE_ADV +//! @{ +#define CMD_BLE_ADV 0x1803 +struct __RFC_STRUCT rfc_CMD_BLE_ADV_s { + uint16_t commandNo; //!< The command ID number 0x1803 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint8_t channel; //!< \brief Channel to use
+ //!< 0–39: BLE advertising/data channel number + //!< 60–207: Custom frequency; (2300 + channel) MHz + //!< 255: Use existing frequency + //!< Others: Reserved + struct { + uint8_t init:7; //!< \brief If bOverride = 1 or custom frequency is used:
+ //!< 0: Do not use whitening
+ //!< Other value: Initialization for 7-bit LFSR whitener + uint8_t bOverride:1; //!< \brief 0: Use default whitening for BLE advertising/data channels
+ //!< 1: Override whitening initialization with value of init + } whitening; + rfc_bleAdvPar_t *pParams; //!< Pointer to command specific parameter structure + rfc_bleAdvOutput_t *pOutput; //!< Pointer to command specific output structure +}; + +//! @} + +//! \addtogroup CMD_BLE_ADV_DIR +//! @{ +#define CMD_BLE_ADV_DIR 0x1804 +struct __RFC_STRUCT rfc_CMD_BLE_ADV_DIR_s { + uint16_t commandNo; //!< The command ID number 0x1804 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint8_t channel; //!< \brief Channel to use
+ //!< 0–39: BLE advertising/data channel number + //!< 60–207: Custom frequency; (2300 + channel) MHz + //!< 255: Use existing frequency + //!< Others: Reserved + struct { + uint8_t init:7; //!< \brief If bOverride = 1 or custom frequency is used:
+ //!< 0: Do not use whitening
+ //!< Other value: Initialization for 7-bit LFSR whitener + uint8_t bOverride:1; //!< \brief 0: Use default whitening for BLE advertising/data channels
+ //!< 1: Override whitening initialization with value of init + } whitening; + rfc_bleAdvPar_t *pParams; //!< Pointer to command specific parameter structure + rfc_bleAdvOutput_t *pOutput; //!< Pointer to command specific output structure +}; + +//! @} + +//! \addtogroup CMD_BLE_ADV_NC +//! @{ +#define CMD_BLE_ADV_NC 0x1805 +struct __RFC_STRUCT rfc_CMD_BLE_ADV_NC_s { + uint16_t commandNo; //!< The command ID number 0x1805 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint8_t channel; //!< \brief Channel to use
+ //!< 0–39: BLE advertising/data channel number + //!< 60–207: Custom frequency; (2300 + channel) MHz + //!< 255: Use existing frequency + //!< Others: Reserved + struct { + uint8_t init:7; //!< \brief If bOverride = 1 or custom frequency is used:
+ //!< 0: Do not use whitening
+ //!< Other value: Initialization for 7-bit LFSR whitener + uint8_t bOverride:1; //!< \brief 0: Use default whitening for BLE advertising/data channels
+ //!< 1: Override whitening initialization with value of init + } whitening; + rfc_bleAdvPar_t *pParams; //!< Pointer to command specific parameter structure + rfc_bleAdvOutput_t *pOutput; //!< Pointer to command specific output structure +}; + +//! @} + +//! \addtogroup CMD_BLE_ADV_SCAN +//! @{ +#define CMD_BLE_ADV_SCAN 0x1806 +struct __RFC_STRUCT rfc_CMD_BLE_ADV_SCAN_s { + uint16_t commandNo; //!< The command ID number 0x1806 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint8_t channel; //!< \brief Channel to use
+ //!< 0–39: BLE advertising/data channel number + //!< 60–207: Custom frequency; (2300 + channel) MHz + //!< 255: Use existing frequency + //!< Others: Reserved + struct { + uint8_t init:7; //!< \brief If bOverride = 1 or custom frequency is used:
+ //!< 0: Do not use whitening
+ //!< Other value: Initialization for 7-bit LFSR whitener + uint8_t bOverride:1; //!< \brief 0: Use default whitening for BLE advertising/data channels
+ //!< 1: Override whitening initialization with value of init + } whitening; + rfc_bleAdvPar_t *pParams; //!< Pointer to command specific parameter structure + rfc_bleAdvOutput_t *pOutput; //!< Pointer to command specific output structure +}; + +//! @} + +//! \addtogroup CMD_BLE_SCANNER +//! @{ +#define CMD_BLE_SCANNER 0x1807 +struct __RFC_STRUCT rfc_CMD_BLE_SCANNER_s { + uint16_t commandNo; //!< The command ID number 0x1807 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint8_t channel; //!< \brief Channel to use
+ //!< 0–39: BLE advertising/data channel number + //!< 60–207: Custom frequency; (2300 + channel) MHz + //!< 255: Use existing frequency + //!< Others: Reserved + struct { + uint8_t init:7; //!< \brief If bOverride = 1 or custom frequency is used:
+ //!< 0: Do not use whitening
+ //!< Other value: Initialization for 7-bit LFSR whitener + uint8_t bOverride:1; //!< \brief 0: Use default whitening for BLE advertising/data channels
+ //!< 1: Override whitening initialization with value of init + } whitening; + rfc_bleScannerPar_t *pParams; //!< Pointer to command specific parameter structure + rfc_bleScannerOutput_t *pOutput; //!< Pointer to command specific output structure +}; + +//! @} + +//! \addtogroup CMD_BLE_INITIATOR +//! @{ +#define CMD_BLE_INITIATOR 0x1808 +struct __RFC_STRUCT rfc_CMD_BLE_INITIATOR_s { + uint16_t commandNo; //!< The command ID number 0x1808 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint8_t channel; //!< \brief Channel to use
+ //!< 0–39: BLE advertising/data channel number + //!< 60–207: Custom frequency; (2300 + channel) MHz + //!< 255: Use existing frequency + //!< Others: Reserved + struct { + uint8_t init:7; //!< \brief If bOverride = 1 or custom frequency is used:
+ //!< 0: Do not use whitening
+ //!< Other value: Initialization for 7-bit LFSR whitener + uint8_t bOverride:1; //!< \brief 0: Use default whitening for BLE advertising/data channels
+ //!< 1: Override whitening initialization with value of init + } whitening; + rfc_bleInitiatorPar_t *pParams; //!< Pointer to command specific parameter structure + rfc_bleInitiatorOutput_t *pOutput; //!< Pointer to command specific output structure +}; + +//! @} + +//! \addtogroup CMD_BLE_GENERIC_RX +//! @{ +#define CMD_BLE_GENERIC_RX 0x1809 +struct __RFC_STRUCT rfc_CMD_BLE_GENERIC_RX_s { + uint16_t commandNo; //!< The command ID number 0x1809 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint8_t channel; //!< \brief Channel to use
+ //!< 0–39: BLE advertising/data channel number + //!< 60–207: Custom frequency; (2300 + channel) MHz + //!< 255: Use existing frequency + //!< Others: Reserved + struct { + uint8_t init:7; //!< \brief If bOverride = 1 or custom frequency is used:
+ //!< 0: Do not use whitening
+ //!< Other value: Initialization for 7-bit LFSR whitener + uint8_t bOverride:1; //!< \brief 0: Use default whitening for BLE advertising/data channels
+ //!< 1: Override whitening initialization with value of init + } whitening; + rfc_bleGenericRxPar_t *pParams; //!< Pointer to command specific parameter structure + rfc_bleGenericRxOutput_t *pOutput; //!< Pointer to command specific output structure +}; + +//! @} + +//! \addtogroup CMD_BLE_TX_TEST +//! @{ +#define CMD_BLE_TX_TEST 0x180A +struct __RFC_STRUCT rfc_CMD_BLE_TX_TEST_s { + uint16_t commandNo; //!< The command ID number 0x180A + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint8_t channel; //!< \brief Channel to use
+ //!< 0–39: BLE advertising/data channel number + //!< 60–207: Custom frequency; (2300 + channel) MHz + //!< 255: Use existing frequency + //!< Others: Reserved + struct { + uint8_t init:7; //!< \brief If bOverride = 1 or custom frequency is used:
+ //!< 0: Do not use whitening
+ //!< Other value: Initialization for 7-bit LFSR whitener + uint8_t bOverride:1; //!< \brief 0: Use default whitening for BLE advertising/data channels
+ //!< 1: Override whitening initialization with value of init + } whitening; + rfc_bleTxTestPar_t *pParams; //!< Pointer to command specific parameter structure + rfc_bleTxTestOutput_t *pOutput; //!< Pointer to command specific output structure +}; + +//! @} + +//! \addtogroup CMD_BLE_ADV_PAYLOAD +//! @{ +#define CMD_BLE_ADV_PAYLOAD 0x1001 +struct __RFC_STRUCT rfc_CMD_BLE_ADV_PAYLOAD_s { + uint16_t commandNo; //!< The command ID number 0x1001 + uint8_t payloadType; //!< \brief 0: Advertising data
+ //!< 1: Scan response data + uint8_t newLen; //!< Length of the new payload + uint8_t* pNewData; //!< Pointer to the buffer containing the new data + rfc_bleAdvPar_t *pParams; //!< Pointer to the parameter structure to update +}; + +//! @} + +//! \addtogroup bleMasterSlavePar +//! @{ +struct __RFC_STRUCT rfc_bleMasterSlavePar_s { + dataQueue_t* pRxQ; //!< Pointer to receive queue + dataQueue_t* pTxQ; //!< Pointer to transmit queue + struct { + uint8_t bAutoFlushIgnored:1; //!< If 1, automatically remove ignored packets from Rx queue + uint8_t bAutoFlushCrcErr:1; //!< If 1, automatically remove packets with CRC error from Rx queue + uint8_t bAutoFlushEmpty:1; //!< If 1, automatically remove empty packets from Rx queue + uint8_t bIncludeLenByte:1; //!< If 1, include the received length byte in the stored packet; otherwise discard it + uint8_t bIncludeCrc:1; //!< If 1, include the received CRC field in the stored packet; otherwise discard it + uint8_t bAppendRssi:1; //!< If 1, append an RSSI byte to the packet in the Rx queue + uint8_t bAppendStatus:1; //!< If 1, append a status byte to the packet in the Rx queue + uint8_t bAppendTimestamp:1; //!< If 1, append a timestamp to the packet in the Rx queue + } rxConfig; //!< Configuration bits for the receive queue entries + struct { + uint8_t lastRxSn:1; //!< The SN bit of the header of the last packet received with CRC OK + uint8_t lastTxSn:1; //!< The SN bit of the header of the last transmitted packet + uint8_t nextTxSn:1; //!< The SN bit of the header of the next packet to transmit + uint8_t bFirstPkt:1; //!< For slave: 0 if a packet has been transmitted on the connection, 1 otherwise + uint8_t bAutoEmpty:1; //!< 1 if the last transmitted packet was an auto-empty packet + uint8_t bLlCtrlTx:1; //!< 1 if the last transmitted packet was an LL control packet (LLID = 11) + uint8_t bLlCtrlAckRx:1; //!< 1 if the last received packet was the ACK of an LL control packet + uint8_t bLlCtrlAckPending:1; //!< 1 if the last successfully received packet was an LL control packet which has not yet been ACK'ed + } seqStat; + uint8_t maxNack; //!< Maximum number of NACKs received before operation ends. 0: No limit + uint8_t maxPkt; //!< Maximum number of packets transmitted in the operation before it ends. 0: No limit + uint32_t accessAddress; //!< Access address used on the connection + uint8_t crcInit0; //!< CRC initialization value used on the connection – least significant byte + uint8_t crcInit1; //!< CRC initialization value used on the connection – middle byte + uint8_t crcInit2; //!< CRC initialization value used on the connection – most significant byte +}; + +//! @} + +//! \addtogroup bleMasterPar +//! @{ +//! Parameter structure for master (CMD_BLE_MASTER) + +struct __RFC_STRUCT rfc_bleMasterPar_s { + dataQueue_t* pRxQ; //!< Pointer to receive queue + dataQueue_t* pTxQ; //!< Pointer to transmit queue + struct { + uint8_t bAutoFlushIgnored:1; //!< If 1, automatically remove ignored packets from Rx queue + uint8_t bAutoFlushCrcErr:1; //!< If 1, automatically remove packets with CRC error from Rx queue + uint8_t bAutoFlushEmpty:1; //!< If 1, automatically remove empty packets from Rx queue + uint8_t bIncludeLenByte:1; //!< If 1, include the received length byte in the stored packet; otherwise discard it + uint8_t bIncludeCrc:1; //!< If 1, include the received CRC field in the stored packet; otherwise discard it + uint8_t bAppendRssi:1; //!< If 1, append an RSSI byte to the packet in the Rx queue + uint8_t bAppendStatus:1; //!< If 1, append a status byte to the packet in the Rx queue + uint8_t bAppendTimestamp:1; //!< If 1, append a timestamp to the packet in the Rx queue + } rxConfig; //!< Configuration bits for the receive queue entries + struct { + uint8_t lastRxSn:1; //!< The SN bit of the header of the last packet received with CRC OK + uint8_t lastTxSn:1; //!< The SN bit of the header of the last transmitted packet + uint8_t nextTxSn:1; //!< The SN bit of the header of the next packet to transmit + uint8_t bFirstPkt:1; //!< For slave: 0 if a packet has been transmitted on the connection, 1 otherwise + uint8_t bAutoEmpty:1; //!< 1 if the last transmitted packet was an auto-empty packet + uint8_t bLlCtrlTx:1; //!< 1 if the last transmitted packet was an LL control packet (LLID = 11) + uint8_t bLlCtrlAckRx:1; //!< 1 if the last received packet was the ACK of an LL control packet + uint8_t bLlCtrlAckPending:1; //!< 1 if the last successfully received packet was an LL control packet which has not yet been ACK'ed + } seqStat; + uint8_t maxNack; //!< Maximum number of NACKs received before operation ends. 0: No limit + uint8_t maxPkt; //!< Maximum number of packets transmitted in the operation before it ends. 0: No limit + uint32_t accessAddress; //!< Access address used on the connection + uint8_t crcInit0; //!< CRC initialization value used on the connection – least significant byte + uint8_t crcInit1; //!< CRC initialization value used on the connection – middle byte + uint8_t crcInit2; //!< CRC initialization value used on the connection – most significant byte + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } endTrigger; //!< Trigger that causes the device to end the connection event as soon as allowed + ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to end the + //!< connection event as soon as allowed +}; + +//! @} + +//! \addtogroup bleSlavePar +//! @{ +//! Parameter structure for slave (CMD_BLE_SLAVE) + +struct __RFC_STRUCT rfc_bleSlavePar_s { + dataQueue_t* pRxQ; //!< Pointer to receive queue + dataQueue_t* pTxQ; //!< Pointer to transmit queue + struct { + uint8_t bAutoFlushIgnored:1; //!< If 1, automatically remove ignored packets from Rx queue + uint8_t bAutoFlushCrcErr:1; //!< If 1, automatically remove packets with CRC error from Rx queue + uint8_t bAutoFlushEmpty:1; //!< If 1, automatically remove empty packets from Rx queue + uint8_t bIncludeLenByte:1; //!< If 1, include the received length byte in the stored packet; otherwise discard it + uint8_t bIncludeCrc:1; //!< If 1, include the received CRC field in the stored packet; otherwise discard it + uint8_t bAppendRssi:1; //!< If 1, append an RSSI byte to the packet in the Rx queue + uint8_t bAppendStatus:1; //!< If 1, append a status byte to the packet in the Rx queue + uint8_t bAppendTimestamp:1; //!< If 1, append a timestamp to the packet in the Rx queue + } rxConfig; //!< Configuration bits for the receive queue entries + struct { + uint8_t lastRxSn:1; //!< The SN bit of the header of the last packet received with CRC OK + uint8_t lastTxSn:1; //!< The SN bit of the header of the last transmitted packet + uint8_t nextTxSn:1; //!< The SN bit of the header of the next packet to transmit + uint8_t bFirstPkt:1; //!< For slave: 0 if a packet has been transmitted on the connection, 1 otherwise + uint8_t bAutoEmpty:1; //!< 1 if the last transmitted packet was an auto-empty packet + uint8_t bLlCtrlTx:1; //!< 1 if the last transmitted packet was an LL control packet (LLID = 11) + uint8_t bLlCtrlAckRx:1; //!< 1 if the last received packet was the ACK of an LL control packet + uint8_t bLlCtrlAckPending:1; //!< 1 if the last successfully received packet was an LL control packet which has not yet been ACK'ed + } seqStat; + uint8_t maxNack; //!< Maximum number of NACKs received before operation ends. 0: No limit + uint8_t maxPkt; //!< Maximum number of packets transmitted in the operation before it ends. 0: No limit + uint32_t accessAddress; //!< Access address used on the connection + uint8_t crcInit0; //!< CRC initialization value used on the connection – least significant byte + uint8_t crcInit1; //!< CRC initialization value used on the connection – middle byte + uint8_t crcInit2; //!< CRC initialization value used on the connection – most significant byte + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } timeoutTrigger; //!< Trigger that defines timeout of the first receive operation + ratmr_t timeoutTime; //!< \brief Time used together with timeoutTrigger that defines timeout of the first + //!< receive operation + uint16_t __dummy0; + uint8_t __dummy1; + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } endTrigger; //!< Trigger that causes the device to end the connection event as soon as allowed + ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to end the + //!< connection event as soon as allowed +}; + +//! @} + +//! \addtogroup bleAdvPar +//! @{ +//! Parameter structure for advertiser (CMD_BLE_ADV*) + +struct __RFC_STRUCT rfc_bleAdvPar_s { + dataQueue_t* pRxQ; //!< Pointer to receive queue + struct { + uint8_t bAutoFlushIgnored:1; //!< If 1, automatically remove ignored packets from Rx queue + uint8_t bAutoFlushCrcErr:1; //!< If 1, automatically remove packets with CRC error from Rx queue + uint8_t bAutoFlushEmpty:1; //!< If 1, automatically remove empty packets from Rx queue + uint8_t bIncludeLenByte:1; //!< If 1, include the received length byte in the stored packet; otherwise discard it + uint8_t bIncludeCrc:1; //!< If 1, include the received CRC field in the stored packet; otherwise discard it + uint8_t bAppendRssi:1; //!< If 1, append an RSSI byte to the packet in the Rx queue + uint8_t bAppendStatus:1; //!< If 1, append a status byte to the packet in the Rx queue + uint8_t bAppendTimestamp:1; //!< If 1, append a timestamp to the packet in the Rx queue + } rxConfig; //!< Configuration bits for the receive queue entries + struct { + uint8_t advFilterPolicy:2; //!< \brief The advertiser filter policy, as defined in Volume 2, Part E, Section 7.8.5 of + //!< the Bluetooth 4.0 spec + uint8_t deviceAddrType:1; //!< The type of the device address – public (0) or random (1) + uint8_t peerAddrType:1; //!< Directed advertiser: The type of the peer address – public (0) or random (1) + uint8_t bStrictLenFilter:1; //!< 1: Discard messages with illegal length + } advConfig; + uint8_t advLen; //!< Size of advertiser data + uint8_t scanRspLen; //!< Size of scan response data + uint8_t* pAdvData; //!< Pointer to buffer containing ADV*_IND data + uint8_t* pScanRspData; //!< Pointer to buffer containing SCAN_RSP data + uint16_t* pDeviceAddress; //!< Pointer to device address used for this device + rfc_bleWhiteListEntry_t *pWhiteList; //!< Pointer to white list or peer address (directed advertiser) + uint16_t __dummy0; + uint8_t __dummy1; + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } endTrigger; //!< Trigger that causes the device to end the advertiser event as soon as allowed + ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to end the + //!< advertiser event as soon as allowed +}; + +//! @} + +//! \addtogroup bleScannerPar +//! @{ +//! Parameter structure for scanner (CMD_BLE_SCANNER) + +struct __RFC_STRUCT rfc_bleScannerPar_s { + dataQueue_t* pRxQ; //!< Pointer to receive queue + struct { + uint8_t bAutoFlushIgnored:1; //!< If 1, automatically remove ignored packets from Rx queue + uint8_t bAutoFlushCrcErr:1; //!< If 1, automatically remove packets with CRC error from Rx queue + uint8_t bAutoFlushEmpty:1; //!< If 1, automatically remove empty packets from Rx queue + uint8_t bIncludeLenByte:1; //!< If 1, include the received length byte in the stored packet; otherwise discard it + uint8_t bIncludeCrc:1; //!< If 1, include the received CRC field in the stored packet; otherwise discard it + uint8_t bAppendRssi:1; //!< If 1, append an RSSI byte to the packet in the Rx queue + uint8_t bAppendStatus:1; //!< If 1, append a status byte to the packet in the Rx queue + uint8_t bAppendTimestamp:1; //!< If 1, append a timestamp to the packet in the Rx queue + } rxConfig; //!< Configuration bits for the receive queue entries + struct { + uint8_t scanFilterPolicy:1; //!< \brief The advertiser filter policy, as defined in Volume 2, Part E, Section 7.8.10 of + //!< the Bluetooth 4.0 spec + uint8_t bActiveScan:1; //!< \brief 0: Passive scan
+ //!< 1: Active scan + uint8_t deviceAddrType:1; //!< The type of the device address – public (0) or random (1) + uint8_t :1; + uint8_t bStrictLenFilter:1; //!< 1: Discard messages with illegal length + uint8_t bAutoWlIgnore:1; //!< 1: Automatically set ignore bit in white list + uint8_t bEndOnRpt:1; //!< 1: End scanner operation after each reported ADV*_IND and potentially SCAN_RSP + } scanConfig; + uint16_t randomState; //!< State for pseudo-random number generation used in backoff procedure + uint16_t backoffCount; //!< Parameter backoffCount used in backoff procedure, cf. Bluetooth 4.0 spec + struct { + uint8_t logUpperLimit:4; //!< Binary logarithm of parameter upperLimit used in scanner backoff procedure + uint8_t bLastSucceeded:1; //!< \brief 1 if the last SCAN_RSP was successfully received and upperLimit + //!< not changed + uint8_t bLastFailed:1; //!< \brief 1 if reception of the last SCAN_RSP failed and upperLimit was not + //!< changed + } backoffPar; + uint8_t scanReqLen; //!< Size of scan request data + uint8_t* pScanReqData; //!< Pointer to buffer containing SCAN_REQ data + uint16_t* pDeviceAddress; //!< Pointer to device address used for this device + rfc_bleWhiteListEntry_t *pWhiteList; //!< Pointer to white list + uint16_t __dummy0; + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } timeoutTrigger; //!< Trigger that causes the device to stop receiving as soon as allowed + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } endTrigger; //!< Trigger that causes the device to stop receiving as soon as allowed + ratmr_t timeoutTime; //!< \brief Time used together with timeoutTrigger that causes the device to stop + //!< receiving as soon as allowed, ending with BLE_DONE_RXTIMEOUT + ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to stop + //!< receiving as soon as allowed, ending with BLE_DONE_ENDED +}; + +//! @} + +//! \addtogroup bleInitiatorPar +//! @{ +//! Parameter structure for initiator (CMD_BLE_INITIATOR) + +struct __RFC_STRUCT rfc_bleInitiatorPar_s { + dataQueue_t* pRxQ; //!< Pointer to receive queue + struct { + uint8_t bAutoFlushIgnored:1; //!< If 1, automatically remove ignored packets from Rx queue + uint8_t bAutoFlushCrcErr:1; //!< If 1, automatically remove packets with CRC error from Rx queue + uint8_t bAutoFlushEmpty:1; //!< If 1, automatically remove empty packets from Rx queue + uint8_t bIncludeLenByte:1; //!< If 1, include the received length byte in the stored packet; otherwise discard it + uint8_t bIncludeCrc:1; //!< If 1, include the received CRC field in the stored packet; otherwise discard it + uint8_t bAppendRssi:1; //!< If 1, append an RSSI byte to the packet in the Rx queue + uint8_t bAppendStatus:1; //!< If 1, append a status byte to the packet in the Rx queue + uint8_t bAppendTimestamp:1; //!< If 1, append a timestamp to the packet in the Rx queue + } rxConfig; //!< Configuration bits for the receive queue entries + struct { + uint8_t bUseWhiteList:1; //!< \brief Initiator filter policy, cf. Volume 2, Part E, Section 7.8.10 of the + //!< Bluetooth 4.0 spec:
+ //!< 0: Use specific peer address
+ //!< 1: Use white list + uint8_t bDynamicWinOffset:1; //!< 1: Use dynamic WinOffset insertion + uint8_t deviceAddrType:1; //!< The type of the device address – public (0) or random (1) + uint8_t peerAddrType:1; //!< The type of the peer address – public (0) or random (1) + uint8_t bStrictLenFilter:1; //!< 1: Discard messages with illegal length + } initConfig; + uint8_t __dummy0; + uint8_t connectReqLen; //!< Size of connect request data + uint8_t* pConnectReqData; //!< Pointer to buffer containing LLData to go in the CONNECT_REQ + uint16_t* pDeviceAddress; //!< Pointer to device address used for this device + rfc_bleWhiteListEntry_t *pWhiteList; //!< Pointer to white list or peer address + ratmr_t connectTime; //!< \brief Indication of timer value of the first possible start time of the first connection event. + //!< Set to the calculated value if a connection is made and to the next possible connection + //!< time if not. + uint16_t __dummy1; + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } timeoutTrigger; //!< Trigger that causes the device to stop receiving as soon as allowed + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } endTrigger; //!< Trigger that causes the device to stop receiving as soon as allowed + ratmr_t timeoutTime; //!< \brief Time used together with timeoutTrigger that causes the device to stop + //!< receiving as soon as allowed, ending with BLE_DONE_RXTIMEOUT + ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to stop + //!< receiving as soon as allowed, ending with BLE_DONE_ENDED +}; + +//! @} + +//! \addtogroup bleGenericRxPar +//! @{ +//! Parameter structure for generic Rx (CMD_BLE_GENERIC_RX) + +struct __RFC_STRUCT rfc_bleGenericRxPar_s { + dataQueue_t* pRxQ; //!< Pointer to receive queue. May be NULL; if so, received packets are not stored + struct { + uint8_t bAutoFlushIgnored:1; //!< If 1, automatically remove ignored packets from Rx queue + uint8_t bAutoFlushCrcErr:1; //!< If 1, automatically remove packets with CRC error from Rx queue + uint8_t bAutoFlushEmpty:1; //!< If 1, automatically remove empty packets from Rx queue + uint8_t bIncludeLenByte:1; //!< If 1, include the received length byte in the stored packet; otherwise discard it + uint8_t bIncludeCrc:1; //!< If 1, include the received CRC field in the stored packet; otherwise discard it + uint8_t bAppendRssi:1; //!< If 1, append an RSSI byte to the packet in the Rx queue + uint8_t bAppendStatus:1; //!< If 1, append a status byte to the packet in the Rx queue + uint8_t bAppendTimestamp:1; //!< If 1, append a timestamp to the packet in the Rx queue + } rxConfig; //!< Configuration bits for the receive queue entries + uint8_t bRepeat; //!< \brief 0: End operation after receiving a packet
+ //!< 1: Restart receiver after receiving a packet + uint16_t __dummy0; + uint32_t accessAddress; //!< Access address used on the connection + uint8_t crcInit0; //!< CRC initialization value used on the connection – least significant byte + uint8_t crcInit1; //!< CRC initialization value used on the connection – middle byte + uint8_t crcInit2; //!< CRC initialization value used on the connection – most significant byte + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } endTrigger; //!< Trigger that causes the device to end the Rx operation + ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to end the + //!< Rx operation +}; + +//! @} + +//! \addtogroup bleTxTestPar +//! @{ +//! Parameter structure for Tx test (CMD_BLE_TX_TEST) + +struct __RFC_STRUCT rfc_bleTxTestPar_s { + uint16_t numPackets; //!< \brief Number of packets to transmit
+ //!< 0: Transmit unlimited number of packets + uint8_t payloadLength; //!< The number of payload bytes in each packet. + uint8_t packetType; //!< \brief The packet type to be used, encoded according to the Bluetooth 4.0 spec, Volume 2, Part E, + //!< Section 7.8.29 + ratmr_t period; //!< Number of radio timer cycles between the start of each packet + struct { + uint8_t bOverrideDefault:1; //!< \brief 0: Use default packet encoding
+ //!< 1: Override packet contents + uint8_t bUsePrbs9:1; //!< \brief If bOverride is 1:
+ //!< 1: Use PRBS9 encoding of packet + uint8_t bUsePrbs15:1; //!< \brief If bOverride is 1:
+ //!< 1: Use PRBS15 encoding of packet + } config; + uint8_t byteVal; //!< If config.bOverride is 1, value of each byte to be sent + uint8_t __dummy0; + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } endTrigger; //!< Trigger that causes the device to end the Test Tx operation + ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to end the + //!< Test Tx operation +}; + +//! @} + +//! \addtogroup bleMasterSlaveOutput +//! @{ +//! Output structure for master and slave (CMD_BLE_MASTER/CMD_BLE_SLAVE) + +struct __RFC_STRUCT rfc_bleMasterSlaveOutput_s { + uint8_t nTx; //!< \brief Total number of packets (including auto-empty and retransmissions) that have been + //!< transmitted + uint8_t nTxAck; //!< Total number of transmitted packets (including auto-empty) that have been ACK'ed + uint8_t nTxCtrl; //!< Number of unique LL control packets from the Tx queue that have been transmitted + uint8_t nTxCtrlAck; //!< Number of LL control packets from the Tx queue that have been finished (ACK'ed) + uint8_t nTxCtrlAckAck; //!< \brief Number of LL control packets that have been ACK'ed and where an ACK has been sent in + //!< response + uint8_t nTxRetrans; //!< Number of retransmissions that has been done + uint8_t nTxEntryDone; //!< Number of packets from the Tx queue that have been finished (ACK'ed) + uint8_t nRxOk; //!< Number of packets that have been received with payload, CRC OK and not ignored + uint8_t nRxCtrl; //!< Number of LL control packets that have been received with CRC OK and not ignored + uint8_t nRxCtrlAck; //!< \brief Number of LL control packets that have been received with CRC OK and not ignored, and + //!< then ACK'ed + uint8_t nRxNok; //!< Number of packets that have been received with CRC error + uint8_t nRxIgnored; //!< \brief Number of packets that have been received with CRC OK and ignored due to repeated + //!< sequence number + uint8_t nRxEmpty; //!< Number of packets that have been received with CRC OK and no payload + uint8_t nRxBufFull; //!< Number of packets that have been received and discarded due to lack of buffer space + int8_t lastRssi; //!< RSSI of last received packet + struct { + uint8_t bTimeStampValid:1; //!< 1 if a valid time stamp has been written to timeStamp; 0 otherwise + uint8_t bLastCrcErr:1; //!< 1 if the last received packet had CRC error; 0 otherwise + uint8_t bLastIgnored:1; //!< 1 if the last received packet with CRC OK was ignored; 0 otherwise + uint8_t bLastEmpty:1; //!< 1 if the last received packet with CRC OK was empty; 0 otherwise + uint8_t bLastCtrl:1; //!< 1 if the last received packet with CRC OK was empty; 0 otherwise + uint8_t bLastMd:1; //!< 1 if the last received packet with CRC OK had MD = 1; 0 otherwise + uint8_t bLastAck:1; //!< \brief 1 if the last received packet with CRC OK was an ACK of a transmitted packet; + //!< 0 otherwise + } pktStatus; + ratmr_t timeStamp; //!< Slave operation: Time stamp of first received packet +}; + +//! @} + +//! \addtogroup bleAdvOutput +//! @{ +//! Output structure for advertiser (CMD_BLE_ADV*) + +struct __RFC_STRUCT rfc_bleAdvOutput_s { + uint16_t nTxAdvInd; //!< Number of ADV*_IND packets completely transmitted + uint8_t nTxScanRsp; //!< Number of SCAN_RSP packets transmitted + uint8_t nRxScanReq; //!< Number of SCAN_REQ packets received OK and not ignored + uint8_t nRxConnectReq; //!< Number of CONNECT_REQ packets received OK and not ignored + uint8_t __dummy0; + uint16_t nRxNok; //!< Number of packets received with CRC error + uint16_t nRxIgnored; //!< Number of packets received with CRC OK, but ignored + uint8_t nRxBufFull; //!< Number of packets received that did not fit in Rx queue + int8_t lastRssi; //!< The RSSI of the last received packet + ratmr_t timeStamp; //!< Time stamp of the last received packet +}; + +//! @} + +//! \addtogroup bleScannerOutput +//! @{ +//! Output structure for scanner (CMD_BLE_SCANNER) + +struct __RFC_STRUCT rfc_bleScannerOutput_s { + uint16_t nTxScanReq; //!< Number of transmitted SCAN_REQ packets + uint16_t nBackedOffScanReq; //!< Number of SCAN_REQ packets not sent due to backoff procedure + uint16_t nRxAdvOk; //!< Number of ADV*_IND packets received with CRC OK and not ignored + uint16_t nRxAdvIgnored; //!< Number of ADV*_IND packets received with CRC OK, but ignored + uint16_t nRxAdvNok; //!< Number of ADV*_IND packets received with CRC error + uint16_t nRxScanRspOk; //!< Number of SCAN_RSP packets received with CRC OK and not ignored + uint16_t nRxScanRspIgnored; //!< Number of SCAN_RSP packets received with CRC OK, but ignored + uint16_t nRxScanRspNok; //!< Number of SCAN_RSP packets received with CRC error + uint8_t nRxAdvBufFull; //!< Number of ADV*_IND packets received that did not fit in Rx queue + uint8_t nRxScanRspBufFull; //!< Number of SCAN_RSP packets received that did not fit in Rx queue + int8_t lastRssi; //!< The RSSI of the last received packet + uint8_t __dummy0; + ratmr_t timeStamp; //!< Time stamp of the last successfully received ADV*_IND packet that was not ignored +}; + +//! @} + +//! \addtogroup bleInitiatorOutput +//! @{ +//! Output structure for initiator (CMD_BLE_INITIATOR) + +struct __RFC_STRUCT rfc_bleInitiatorOutput_s { + uint8_t nTxConnectReq; //!< Number of transmitted CONNECT_REQ packets + uint8_t nRxAdvOk; //!< Number of ADV*_IND packets received with CRC OK and not ignored + uint16_t nRxAdvIgnored; //!< Number of ADV*_IND packets received with CRC OK, but ignored + uint16_t nRxAdvNok; //!< Number of ADV*_IND packets received with CRC error + uint8_t nRxAdvBufFull; //!< Number of ADV*_IND packets received that did not fit in Rx queue + int8_t lastRssi; //!< The RSSI of the last received packet + ratmr_t timeStamp; //!< Time stamp of the received ADV*_IND packet that caused transmission of CONNECT_REQ +}; + +//! @} + +//! \addtogroup bleGenericRxOutput +//! @{ +//! Output structure for generic Rx (CMD_BLE_GENERIC_RX) + +struct __RFC_STRUCT rfc_bleGenericRxOutput_s { + uint16_t nRxOk; //!< Number of packets received with CRC OK + uint16_t nRxNok; //!< Number of packets received with CRC error + uint16_t nRxBufFull; //!< Number of packets that have been received and discarded due to lack of buffer space + int8_t lastRssi; //!< The RSSI of the last received packet + uint8_t __dummy0; + ratmr_t timeStamp; //!< Time stamp of the last received packet +}; + +//! @} + +//! \addtogroup bleTxTestOutput +//! @{ +//! Output structure for Tx test (CMD_BLE_TX_TEST) + +struct __RFC_STRUCT rfc_bleTxTestOutput_s { + uint16_t nTx; //!< Number of packets transmitted +}; + +//! @} + +//! \addtogroup bleWhiteListEntry +//! @{ +//! White list entry structure + +struct __RFC_STRUCT rfc_bleWhiteListEntry_s { + uint8_t size; //!< Number of while list entries. Used in the first entry of the list only + struct { + uint8_t bEnable:1; //!< 1 if the entry is in use, 0 if the entry is not in use + uint8_t addrType:1; //!< The type address in the entry – public (0) or random (1) + uint8_t bWlIgn:1; //!< \brief 1 if the entry is to be ignored by a scanner, 0 otherwise. Used to mask out + //!< entries that have already been scanned and reported. + } conf; + uint16_t address; //!< Least significant 16 bits of the address contained in the entry + uint32_t addressHi; //!< Most significant 32 bits of the address contained in the entry +}; + +//! @} + +//! \addtogroup bleRxStatus +//! @{ +//! Receive status byte that may be appended to message in receive buffer + +struct __RFC_STRUCT rfc_bleRxStatus_s { + struct { + uint8_t channel:6; //!< \brief The channel on which the packet was received, provided channel is in the range + //!< 0–39; otherwise 0x3F + uint8_t bIgnore:1; //!< 1 if the packet is marked as ignored, 0 otherwise + uint8_t bCrcErr:1; //!< 1 if the packet was received with CRC error, 0 otherwise + } status; +}; + +//! @} + +//! @} +//! @} +#endif /* BLE_CMD_H_ */ diff --git a/cpu/cc26xx/dev/rfc-api/ble_mailbox.h b/cpu/cc26xx-cc13xx/rf-core/api/ble_mailbox.h similarity index 57% rename from cpu/cc26xx/dev/rfc-api/ble_mailbox.h rename to cpu/cc26xx-cc13xx/rf-core/api/ble_mailbox.h index 607a92f5d..dcce1996c 100644 --- a/cpu/cc26xx/dev/rfc-api/ble_mailbox.h +++ b/cpu/cc26xx-cc13xx/rf-core/api/ble_mailbox.h @@ -1,119 +1,69 @@ -/****************************************************************************** -* Filename: ble_mailbox.h -* Revised: $ $ -* Revision: $ $ -* -* Description: Definitions for BLE interface -* -* Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* -* Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* -* Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* -* Neither the name of Texas Instruments Incorporated nor the names of -* its contributors may be used to endorse or promote products derived -* from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -******************************************************************************/ - -#ifndef _BLE_MAILBOX_H -#define _BLE_MAILBOX_H - -#include "mailbox.h" - -/// \name CPE interrupt definitions for BLE -/// Interrupt masks for the CPE interrupt in RDBELL. These are new names for interrupts in mailbox.h, -/// used for compartibility with previous versions with separate interrupt numbers. -///@{ -#define IRQN_BLE_TX_DONE IRQN_TX_DONE -#define IRQN_BLE_TX_ACK IRQN_TX_ACK -#define IRQN_BLE_TX_CTRL IRQN_TX_CTRL -#define IRQN_BLE_TX_CTRL_ACK IRQN_TX_CTRL_ACK -#define IRQN_BLE_TX_CTRL_ACK_ACK IRQN_TX_CTRL_ACK_ACK -#define IRQN_BLE_TX_RETRANS IRQN_TX_RETRANS -#define IRQN_BLE_TX_ENTRY_DONE IRQN_TX_ENTRY_DONE -#define IRQN_BLE_TX_BUFFER_CHANGED IRQN_TX_BUFFER_CHANGED -#define IRQN_BLE_RX_OK IRQN_RX_OK -#define IRQN_BLE_RX_NOK IRQN_RX_NOK -#define IRQN_BLE_RX_IGNORED IRQN_RX_IGNORED -#define IRQN_BLE_RX_EMPTY IRQN_RX_EMPTY -#define IRQN_BLE_RX_CTRL IRQN_RX_CTRL -#define IRQN_BLE_RX_CTRL_ACK IRQN_RX_CTRL_ACK -#define IRQN_BLE_RX_BUF_FULL IRQN_RX_BUF_FULL -#define IRQN_BLE_RX_ENTRY_DONE IRQN_RX_ENTRY_DONE - -#define IRQ_BLE_TX_DONE (1U << IRQN_BLE_TX_DONE) -#define IRQ_BLE_TX_ACK (1U << IRQN_BLE_TX_ACK) -#define IRQ_BLE_TX_CTRL (1U << IRQN_BLE_TX_CTRL) -#define IRQ_BLE_TX_CTRL_ACK (1U << IRQN_BLE_TX_CTRL_ACK) -#define IRQ_BLE_TX_CTRL_ACK_ACK (1U << IRQN_BLE_TX_CTRL_ACK_ACK) -#define IRQ_BLE_TX_RETRANS (1U << IRQN_BLE_TX_RETRANS) -#define IRQ_BLE_TX_ENTRY_DONE (1U << IRQN_BLE_TX_ENTRY_DONE) -#define IRQ_BLE_TX_BUFFER_CHANGED (1U << IRQN_BLE_TX_BUFFER_CHANGED) -#define IRQ_BLE_RX_OK (1U << IRQN_BLE_RX_OK) -#define IRQ_BLE_RX_NOK (1U << IRQN_BLE_RX_NOK) -#define IRQ_BLE_RX_IGNORED (1U << IRQN_BLE_RX_IGNORED) -#define IRQ_BLE_RX_EMPTY (1U << IRQN_BLE_RX_EMPTY) -#define IRQ_BLE_RX_CTRL (1U << IRQN_BLE_RX_CTRL) -#define IRQ_BLE_RX_CTRL_ACK (1U << IRQN_BLE_RX_CTRL_ACK) -#define IRQ_BLE_RX_BUF_FULL (1U << IRQN_BLE_RX_BUF_FULL) -#define IRQ_BLE_RX_ENTRY_DONE (1U << IRQN_BLE_RX_ENTRY_DONE) -///@} - - - -/// \name Radio operation status -/// Radio operation status format: -/// Bits 15:12: Protocol -/// 0001: BLE -/// Bits 11:10: Type -/// 00: Not finished -/// 01: Done successfully -/// 10: Done with error -/// Bits 9:0: Identifier - -/// \name Operation finished normally -///@{ -#define BLE_DONE_OK 0x1400 ///< Operation ended normally -#define BLE_DONE_RXTIMEOUT 0x1401 ///< Timeout of first Rx of slave operation or end of scan window -#define BLE_DONE_NOSYNC 0x1402 ///< Timeout of subsequent Rx -#define BLE_DONE_RXERR 0x1403 ///< Operation ended because of receive error (CRC or other) -#define BLE_DONE_CONNECT 0x1404 ///< CONNECT_REQ received or transmitted -#define BLE_DONE_MAXNACK 0x1405 ///< Maximum number of retransmissions exceeded -#define BLE_DONE_ENDED 0x1406 ///< Operation stopped after end trigger -#define BLE_DONE_ABORT 0x1407 ///< Operation aborted by command -#define BLE_DONE_STOPPED 0x1408 ///< Operation stopped after stop command -///@} -/// \name Operation finished with error -///@{ -#define BLE_ERROR_PAR 0x1800 ///< Illegal parameter -#define BLE_ERROR_RXBUF 0x1801 ///< No available Rx buffer (Advertiser, Scanner, Initiator) -#define BLE_ERROR_NO_SETUP 0x1802 ///< Operation using Rx or Tx attemted when not in BLE mode -#define BLE_ERROR_NO_FS 0x1803 ///< Operation using Rx or Tx attemted without frequency synth configured -#define BLE_ERROR_SYNTH_PROG 0x1804 ///< Synthesizer programming failed to complete on time -#define BLE_ERROR_RXOVF 0x1805 ///< Receiver overflowed during operation -#define BLE_ERROR_TXUNF 0x1806 ///< Transmitter underflowed during operation -///@} -///@} - -#endif +/****************************************************************************** +* Filename: ble_mailbox.h +* Revised: $ $ +* Revision: $ $ +* +* Description: Definitions for BLE interface +* +* Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ +* +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* +* Neither the name of Texas Instruments Incorporated nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +******************************************************************************/ + +#ifndef BLE_MAILBOX_H_ +#define BLE_MAILBOX_H_ + +/// \name Radio operation status +///@{ +/// \name Operation finished normally +///@{ +#define BLE_DONE_OK 0x1400 ///< Operation ended normally +#define BLE_DONE_RXTIMEOUT 0x1401 ///< Timeout of first Rx of slave operation or end of scan window +#define BLE_DONE_NOSYNC 0x1402 ///< Timeout of subsequent Rx +#define BLE_DONE_RXERR 0x1403 ///< Operation ended because of receive error (CRC or other) +#define BLE_DONE_CONNECT 0x1404 ///< CONNECT_REQ received or transmitted +#define BLE_DONE_MAXNACK 0x1405 ///< Maximum number of retransmissions exceeded +#define BLE_DONE_ENDED 0x1406 ///< Operation stopped after end trigger +#define BLE_DONE_ABORT 0x1407 ///< Operation aborted by command +#define BLE_DONE_STOPPED 0x1408 ///< Operation stopped after stop command +///@} +/// \name Operation finished with error +///@{ +#define BLE_ERROR_PAR 0x1800 ///< Illegal parameter +#define BLE_ERROR_RXBUF 0x1801 ///< No available Rx buffer (Advertiser, Scanner, Initiator) +#define BLE_ERROR_NO_SETUP 0x1802 ///< Operation using Rx or Tx attemted when not in BLE mode +#define BLE_ERROR_NO_FS 0x1803 ///< Operation using Rx or Tx attemted without frequency synth configured +#define BLE_ERROR_SYNTH_PROG 0x1804 ///< Synthesizer programming failed to complete on time +#define BLE_ERROR_RXOVF 0x1805 ///< Receiver overflowed during operation +#define BLE_ERROR_TXUNF 0x1806 ///< Transmitter underflowed during operation +///@} +///@} + +#endif /* BLE_MAILBOX_H_ */ diff --git a/cpu/cc26xx/dev/rfc-api/common_cmd.h b/cpu/cc26xx-cc13xx/rf-core/api/common_cmd.h similarity index 89% rename from cpu/cc26xx/dev/rfc-api/common_cmd.h rename to cpu/cc26xx-cc13xx/rf-core/api/common_cmd.h index bae0a0200..308f0c3ee 100644 --- a/cpu/cc26xx/dev/rfc-api/common_cmd.h +++ b/cpu/cc26xx-cc13xx/rf-core/api/common_cmd.h @@ -1,1043 +1,1031 @@ -/****************************************************************************** -* Filename: common_cmd.h -* Revised: $ $ -* Revision: $ $ -* -* Description: CC26xx API for common/generic commands -* -* Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ -* -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* -* Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* -* Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* -* Neither the name of Texas Instruments Incorporated nor the names of -* its contributors may be used to endorse or promote products derived -* from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -******************************************************************************/ - -#ifndef __COMMON_CMD_H -#define __COMMON_CMD_H - -#ifndef __RFC_STRUCT -#ifdef __GNUC__ -#define __RFC_STRUCT __attribute__ ((aligned (4))) -#else -#define __RFC_STRUCT -#endif -#endif - -//! \addtogroup rfc -//! @{ - -//! \addtogroup common_cmd -//! @{ - -#include -#include "mailbox.h" - -typedef struct __RFC_STRUCT rfc_CMD_FG_SCH_IMM_s rfc_CMD_FG_SCH_IMM_t; -typedef struct __RFC_STRUCT rfc_CMD_WRITE_FWPAR_s rfc_CMD_WRITE_FWPAR_t; -typedef struct __RFC_STRUCT rfc_CMD_TX_TEST_s rfc_CMD_TX_TEST_t; -typedef struct __RFC_STRUCT rfc_CMD_RX_TEST_s rfc_CMD_RX_TEST_t; -typedef struct __RFC_STRUCT rfc_CMD_FS_POWERDOWN_s rfc_CMD_FS_POWERDOWN_t; -typedef struct __RFC_STRUCT rfc_CMD_DISARM_RAT_CH_s rfc_CMD_DISARM_RAT_CH_t; -typedef struct __RFC_STRUCT rfc_CMD_SCH_IMM_s rfc_CMD_SCH_IMM_t; -typedef struct __RFC_STRUCT rfc_CMD_ANALOG_POWERDOWN_s rfc_CMD_ANALOG_POWERDOWN_t; -typedef struct __RFC_STRUCT rfc_CMD_SET_RAT_CMP_s rfc_CMD_SET_RAT_CMP_t; -typedef struct __RFC_STRUCT rfc_CMD_FS_OFF_s rfc_CMD_FS_OFF_t; -typedef struct __RFC_STRUCT rfc_CMD_ENABLE_DBG_s rfc_CMD_ENABLE_DBG_t; -typedef struct __RFC_STRUCT rfc_CMD_CLEAR_RX_s rfc_CMD_CLEAR_RX_t; -typedef struct __RFC_STRUCT rfc_CMD_FS_s rfc_CMD_FS_t; -typedef struct __RFC_STRUCT rfc_CMD_FG_COUNT_BRANCH_s rfc_CMD_FG_COUNT_BRANCH_t; -typedef struct __RFC_STRUCT rfc_CMD_GET_FW_INFO_s rfc_CMD_GET_FW_INFO_t; -typedef struct __RFC_STRUCT rfc_CMD_TOPSM_COPY_s rfc_CMD_TOPSM_COPY_t; -typedef struct __RFC_STRUCT rfc_CMD_USER_FUN_s rfc_CMD_USER_FUN_t; -typedef struct __RFC_STRUCT rfc_command_s rfc_command_t; -typedef struct __RFC_STRUCT rfc_CMD_WRITE_ADI0REG_s rfc_CMD_WRITE_ADI0REG_t; -typedef struct __RFC_STRUCT rfc_CMD_FS_POWERUP_s rfc_CMD_FS_POWERUP_t; -typedef struct __RFC_STRUCT rfc_CMD_SYNC_STOP_RAT_s rfc_CMD_SYNC_STOP_RAT_t; -typedef struct __RFC_STRUCT rfc_CMD_ADD_DATA_ENTRY_s rfc_CMD_ADD_DATA_ENTRY_t; -typedef struct __RFC_STRUCT rfc_CMD_FG_COUNT_s rfc_CMD_FG_COUNT_t; -typedef struct __RFC_STRUCT rfc_CMD_MEMCPY_s rfc_CMD_MEMCPY_t; -typedef struct __RFC_STRUCT rfc_CMD_SET_RAT_CPT_s rfc_CMD_SET_RAT_CPT_t; -typedef struct __RFC_STRUCT rfc_CMD_DISABLE_DBG_s rfc_CMD_DISABLE_DBG_t; -typedef struct __RFC_STRUCT rfc_CMD_SYNC_START_RAT_s rfc_CMD_SYNC_START_RAT_t; -typedef struct __RFC_STRUCT rfc_CMD_COUNT_s rfc_CMD_COUNT_t; -typedef struct __RFC_STRUCT rfc_CMD_PATTERN_CHECK_s rfc_CMD_PATTERN_CHECK_t; -typedef struct __RFC_STRUCT rfc_CMD_MODIFY_RFREG_s rfc_CMD_MODIFY_RFREG_t; -typedef struct __RFC_STRUCT rfc_CMD_REMOVE_PENDING_ENTRIES_s rfc_CMD_REMOVE_PENDING_ENTRIES_t; -typedef struct __RFC_STRUCT rfc_CMD_UPDATE_RADIO_SETUP_s rfc_CMD_UPDATE_RADIO_SETUP_t; -typedef struct __RFC_STRUCT rfc_CMD_NOP_s rfc_CMD_NOP_t; -typedef struct __RFC_STRUCT rfc_CMD_STOP_s rfc_CMD_STOP_t; -typedef struct __RFC_STRUCT rfc_CMD_TRIGGER_s rfc_CMD_TRIGGER_t; -typedef struct __RFC_STRUCT rfc_CMD_SET_TRIM_s rfc_CMD_SET_TRIM_t; -typedef struct __RFC_STRUCT rfc_CMD_UPDATE_BAW_FREQ_s rfc_CMD_UPDATE_BAW_FREQ_t; -typedef struct __RFC_STRUCT rfc_CMD_READ_FWPAR_s rfc_CMD_READ_FWPAR_t; -typedef struct __RFC_STRUCT rfc_CMD_REMOVE_DATA_ENTRY_s rfc_CMD_REMOVE_DATA_ENTRY_t; -typedef struct __RFC_STRUCT rfc_CMD_UPDATE_FS_s rfc_CMD_UPDATE_FS_t; -typedef struct __RFC_STRUCT rfc_CMD_ARM_RAT_CH_s rfc_CMD_ARM_RAT_CH_t; -typedef struct __RFC_STRUCT rfc_CMD_WRITE_RFREG_s rfc_CMD_WRITE_RFREG_t; -typedef struct __RFC_STRUCT rfc_CMD_SET_TX_SHAPE_s rfc_CMD_SET_TX_SHAPE_t; -typedef struct __RFC_STRUCT rfc_CMD_READ_ADI1REG_s rfc_CMD_READ_ADI1REG_t; -typedef struct __RFC_STRUCT rfc_CMD_WRITE_ADDR_s rfc_CMD_WRITE_ADDR_t; -typedef struct __RFC_STRUCT rfc_CMD_PING_s rfc_CMD_PING_t; -typedef struct __RFC_STRUCT rfc_CMD_SET_RAT_OUTPUT_s rfc_CMD_SET_RAT_OUTPUT_t; -typedef struct __RFC_STRUCT rfc_CMD_DISABLE_RAT_CH_s rfc_CMD_DISABLE_RAT_CH_t; -typedef struct __RFC_STRUCT rfc_CMD_GET_RSSI_s rfc_CMD_GET_RSSI_t; -typedef struct __RFC_STRUCT rfc_CMD_MEMSET_s rfc_CMD_MEMSET_t; -typedef struct __RFC_STRUCT rfc_CMD_COUNT_BRANCH_s rfc_CMD_COUNT_BRANCH_t; -typedef struct __RFC_STRUCT rfc_CMD_ABORT_s rfc_CMD_ABORT_t; -typedef struct __RFC_STRUCT rfc_CMD_TX_s rfc_CMD_TX_t; -typedef struct __RFC_STRUCT rfc_radioOp_s rfc_radioOp_t; -typedef struct __RFC_STRUCT rfc_CMD_FORCE_CLK_ENA_s rfc_CMD_FORCE_CLK_ENA_t; -typedef struct __RFC_STRUCT rfc_CMD_START_RAT_s rfc_CMD_START_RAT_t; -typedef struct __RFC_STRUCT rfc_CMD_READ_RFREG_s rfc_CMD_READ_RFREG_t; -typedef struct __RFC_STRUCT rfc_CMD_RX_s rfc_CMD_RX_t; -typedef struct __RFC_STRUCT rfc_CMD_FG_PATTERN_CHECK_s rfc_CMD_FG_PATTERN_CHECK_t; -typedef struct __RFC_STRUCT rfc_CMD_SET_TX_POWER_s rfc_CMD_SET_TX_POWER_t; -typedef struct __RFC_STRUCT rfc_CMD_BUS_REQUEST_s rfc_CMD_BUS_REQUEST_t; -typedef struct __RFC_STRUCT rfc_CMD_READ_TRIM_s rfc_CMD_READ_TRIM_t; -typedef struct __RFC_STRUCT rfc_CMD_READ_ADI0REG_s rfc_CMD_READ_ADI0REG_t; -typedef struct __RFC_STRUCT rfc_CMD_WRITE_ADI1REG_s rfc_CMD_WRITE_ADI1REG_t; -typedef struct __RFC_STRUCT rfc_CMD_RADIO_SETUP_s rfc_CMD_RADIO_SETUP_t; -typedef struct __RFC_STRUCT rfc_CMD_READ_FS_CAL_s rfc_CMD_READ_FS_CAL_t; -typedef struct __RFC_STRUCT rfc_CMD_FG_NOP_s rfc_CMD_FG_NOP_t; -typedef struct __RFC_STRUCT rfc_CMD_FLUSH_QUEUE_s rfc_CMD_FLUSH_QUEUE_t; - -//! \addtogroup command -//! @{ -struct __RFC_STRUCT rfc_command_s { - uint16_t commandNo; //!< The command ID number -}; - -//! @} - -//! \addtogroup radioOp -//! @{ -//! Common definition for radio operation commands - -struct __RFC_STRUCT rfc_radioOp_s { - uint16_t commandNo; //!< The command ID number - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; -}; - -//! @} - -//! \addtogroup CMD_NOP -//! @{ -#define CMD_NOP 0x0801 -struct __RFC_STRUCT rfc_CMD_NOP_s { - uint16_t commandNo; //!< The command ID number 0x0801 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; -}; - -//! @} - -//! \addtogroup CMD_RADIO_SETUP -//! @{ -#define CMD_RADIO_SETUP 0x0802 -struct __RFC_STRUCT rfc_CMD_RADIO_SETUP_s { - uint16_t commandNo; //!< The command ID number 0x0802 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - uint8_t mode; //!< \brief The main mode to use
- //!< 0x00: BLE
- //!< 0x01: IEEE 802.15.4
- //!< 0x02: 2 Mbps GFSK
- //!< 0x05: 5 Mbps coded 8-FSK
- //!< 0x06: ANT
- //!< 0xFF: Keep existing mode; update overrides only
- //!< Others: Reserved - uint8_t __dummy0; - struct { - uint16_t frontEndMode:3; //!< \brief 0x00: Differential mode
- //!< 0x01: Single-ended mode RFP
- //!< 0x02: Single-ended mode RFN
- //!< 0x03: Antenna diversity (start RFP)
- //!< 0x04: Antenna diversity (start RFN)
- //!< 0x05 Single-ended mode RFP with external frontend control on RF pins
- //!< 0x06 Single-ended mode RFN with external frontend control on RF pins
- //!< Others: Reserved - uint16_t biasMode:1; //!< \brief 0: Internal bias
- //!< 1: External bias - uint16_t bNoAdi0Setup:1; //!< \brief 0: Program ADI 0 with default values
- //!< 1: Do not program ADI 0 - uint16_t bNoAdi0Trim:1; //!< \brief 0: Apply trim values to ADI 0
- //!< 1: Use default values for ADI 0 - uint16_t bNoAdi0Ovr:1; //!< \brief 0: Apply ADI 0 overrides
- //!< 1: Ignore ADI 0 overrides - uint16_t bNoAdi1Setup:1; //!< \brief 0: Program ADI 1 with default values
- //!< 1: Do not program ADI 1 - uint16_t bNoAdi1Trim:1; //!< \brief 0: Apply trim values to ADI 1
- //!< 1: Use default values for ADI 1 - uint16_t bNoAdi1Ovr:1; //!< \brief 0: Apply ADI 1 overrides
- //!< 1: Ignore ADI 1 overrides - uint16_t bNoFsPowerUp:1; //!< \brief 0: Power up frequency synth
- //!< 1: Do not power up frequency synth - } config; //!< Configuration options - struct { - uint16_t IB:6; //!< Value to write to the PA power control field at 25 °C - uint16_t GC:2; //!< Value to write to the gain control of the 1st stage of the PA - uint16_t tempCoeff:8; //!< Temperature coefficient for IB. 0: No temperature compensation - } txPower; //!< Transmit power - uint32_t* pRegOverride; //!< \brief Pointer to a list of hardware and configuration registers to override. If NULL, no - //!< override is used. -}; - -//! @} - -//! \addtogroup CMD_FS -//! @{ -#define CMD_FS 0x0803 -struct __RFC_STRUCT rfc_CMD_FS_s { - uint16_t commandNo; //!< The command ID number 0x0803 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - uint16_t frequency; //!< The frequency in MHz to tune to - uint16_t fractFreq; //!< Fractional part of the frequency to tune to - struct { - uint8_t bTxMode:1; //!< \brief 0: Start synth in Rx mode
- //!< 1: Start synth in Tx mode - uint8_t refFreq:6; //!< Reserved - } synthConf; - struct { - uint8_t bOverrideCalib:1; //!< \brief 0: Use standard calibration settings (ignore calibration settings given in command)
- //!< 1: Override calibration settings - uint8_t bSkipTdcCalib:1; //!< \brief 0: Perform TDC calibration
- //!< 1: Skip TDC calibration - uint8_t bSkipCoarseCalib:1; //!< \brief 0: Perform coarse calibration
- //!< 1: Skip coarse calibration - uint8_t bSkipMidCalib:1; //!< \brief 0: Perform mid calibration
- //!< 1: Skip mid calibration - uint8_t coarsePrecal:4; //!< \brief Coarse pre-calibration value to use when bOverrideCalib and - //!< bSkipCoarseCalib are both 1 - } calibConf; - uint8_t midPrecal; //!< Mid pre-calibration value to use when bOverrideCalib and bSkipCoarseCalib are both 1 - uint8_t ktPrecal; //!< KT pre-calibration value to use when bOverrideCalib and bSkipCoarseCalib are both 1 - uint16_t tdcPrecal; //!< TDC pre-calibration value to use when bOverrideCalib and bSkipCoarseCalib are both 1 -}; - -//! @} - -//! \addtogroup CMD_FS_OFF -//! @{ -#define CMD_FS_OFF 0x0804 -struct __RFC_STRUCT rfc_CMD_FS_OFF_s { - uint16_t commandNo; //!< The command ID number 0x0804 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; -}; - -//! @} - -//! \addtogroup CMD_RX -//! @{ -#define CMD_RX 0x0805 -struct __RFC_STRUCT rfc_CMD_RX_s { - uint16_t commandNo; //!< The command ID number 0x0805 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - struct { - uint16_t endianness:1; //!< \brief 0: Least significant bit first
- //!< 1: Most significant bit first - uint16_t numHdrBits:6; //!< Number of bits in the header - uint16_t bFsOff:1; //!< \brief 0: Keep frequency synth on after command
- //!< 1: Turn frequency synth off after command - uint16_t bUseCrc:1; //!< \brief 0: No CRC
- //!< 1: The last bytes of the packet are a CRC - uint16_t bCrcIncSw:1; //!< \brief 0: Do not include sync word in CRC calculation
- //!< 1: Include sync word in CRC calculation - uint16_t bCrcIncHdr:1; //!< \brief 0: Do not include header in CRC calculation
- //!< 1: Include header in CRC calculation - uint16_t bReportCrc:1; //!< \brief 0: Do not write CRC to receive buffer
- //!< 1: Write received CRC to receive buffer - uint16_t endType:1; //!< \brief 0: Packet is received to the end if end trigger happens after sync is obtained
- //!< 1: Packet reception is stopped if end trigger happens - uint16_t bDualSw:1; //!< \brief 0: Single sync word
- //!< 1: Dual sync word. - } pktConfig; - uint32_t syncWord; //!< Sync word to receive - uint32_t syncWord2; //!< Secondary sync word to receive if pktConfig.bDualSw = 1 - struct { - uint16_t numLenBits:4; //!< Number of bits in the length field - uint16_t lenFieldPos:5; //!< Bit position of the first bit in the length field - uint16_t lenOffset:7; //!< Signed number to add to the received length field - } lenConfig; - uint16_t maxLen; //!< Maximum number of bytes in the received packet (including header, excluding CRC) - uint8_t* pRecPkt; //!< Pointer to buffer for received packet. NULL: Do not store the contents. - ratmr_t endTime; //!< Time to end the operation - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } endTrigger; //!< Trigger classifier for ending the operation - int8_t rssi; //!< RSSI of received packet - uint16_t recLen; //!< Number of bytes written to receive buffer - ratmr_t timeStamp; //!< Time stamp of received packet - uint16_t nRxOk; //!< Counter of number of received packets with CRC OK and first sync word - uint16_t nRxNok; //!< Counter of number of received packets with CRC error and first sync word - uint16_t nRx2Ok; //!< \brief Counter of number of received packets with CRC OK and second sync word; may safely be - //!< omitted if pktConfig.bDualSw is 0 - uint16_t nRx2Nok; //!< \brief Counter of number of received packets with CRC error and second sync word; may safely be - //!< omitted if pktConfig.bDualSw is 0 -}; - -//! @} - -//! \addtogroup CMD_TX -//! @{ -#define CMD_TX 0x0806 -struct __RFC_STRUCT rfc_CMD_TX_s { - uint16_t commandNo; //!< The command ID number 0x0806 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - struct { - uint16_t endianness:1; //!< \brief 0: Least significant bit first
- //!< 1: Most significant bit first - uint16_t numHdrBits:6; //!< Number of bits in the header - uint16_t bFsOff:1; //!< \brief 0: Keep frequency synth on after command
- //!< 1: Turn frequency synth off after command - uint16_t bUseCrc:1; //!< \brief 0: No CRC
- //!< 1: Append a CRC to the packet - uint16_t bCrcIncSw:1; //!< \brief 0: Do not include sync word in CRC calculation
- //!< 1: Include sync word in CRC calculation - uint16_t bCrcIncHdr:1; //!< \brief 0: Do not include header in CRC calculation
- //!< 1: Include header in CRC calculation - } pktConfig; - uint32_t syncWord; //!< Sync word to transmit - uint8_t* pTxPkt; //!< Pointer to buffer for transmitted packet. - uint16_t pktLen; //!< Number of bytes in the transmitted packet -}; - -//! @} - -//! \addtogroup CMD_RX_TEST -//! @{ -#define CMD_RX_TEST 0x0807 -struct __RFC_STRUCT rfc_CMD_RX_TEST_s { - uint16_t commandNo; //!< The command ID number 0x0807 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - struct { - uint8_t bEnaFifo:1; //!< \brief 0: Do not enable FIFO in modem, so that received data is not available
- //!< 1: Enable FIFO in modem – the data must be read out by the application - uint8_t bFsOff:1; //!< \brief 0: Keep frequency synth on after command
- //!< 1: Turn frequency synth off after command - uint8_t bNoSync:1; //!< \brief 0: Run sync search as normal for the configured mode
- //!< 1: Write correlation thresholds to the maximum value to avoid getting sync - } config; - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } endTrigger; //!< Trigger classifier for ending the operation - uint32_t syncWord; //!< Sync word to use for receiver - ratmr_t endTime; //!< Time to end the operation -}; - -//! @} - -//! \addtogroup CMD_TX_TEST -//! @{ -#define CMD_TX_TEST 0x0808 -struct __RFC_STRUCT rfc_CMD_TX_TEST_s { - uint16_t commandNo; //!< The command ID number 0x0808 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - struct { - uint8_t bUseCw:1; //!< \brief 0: Send modulated signal
- //!< 1: Send continuous wave - uint8_t bFsOff:1; //!< \brief 0: Keep frequency synth on after command
- //!< 1: Turn frequency synth off after command - uint8_t whitenMode:2; //!< \brief 0: No whitening
- //!< 1: Default whitening
- //!< 2: PRBS-15
- //!< 3: PRBS-32 - } config; - uint8_t __dummy0; - uint16_t txWord; //!< Value to send to the modem before whitening - uint8_t __dummy1; - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } endTrigger; //!< Trigger classifier for ending the operation - uint32_t syncWord; //!< Sync word to use for transmitter - ratmr_t endTime; //!< Time to end the operation -}; - -//! @} - -//! \addtogroup CMD_SYNC_STOP_RAT -//! @{ -#define CMD_SYNC_STOP_RAT 0x0809 -struct __RFC_STRUCT rfc_CMD_SYNC_STOP_RAT_s { - uint16_t commandNo; //!< The command ID number 0x0809 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - uint16_t __dummy0; - ratmr_t rat0; //!< \brief The returned RAT timer value corresponding to the value the RAT would have had when the - //!< RTC was zero -}; - -//! @} - -//! \addtogroup CMD_SYNC_START_RAT -//! @{ -#define CMD_SYNC_START_RAT 0x080A -struct __RFC_STRUCT rfc_CMD_SYNC_START_RAT_s { - uint16_t commandNo; //!< The command ID number 0x080A - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - uint16_t __dummy0; - ratmr_t rat0; //!< \brief The desired RAT timer value corresponding to the value the RAT would have had when the - //!< RTC was zero. This parameter is returned by CMD_SYNC_STOP_RAT -}; - -//! @} - -//! \addtogroup CMD_COUNT -//! @{ -#define CMD_COUNT 0x080B -struct __RFC_STRUCT rfc_CMD_COUNT_s { - uint16_t commandNo; //!< The command ID number 0x080B - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - uint16_t counter; //!< \brief Counter. On start, the radio CPU decrements the value, and the end status of the operation - //!< differs if the result is zero -}; - -//! @} - -//! \addtogroup CMD_FS_POWERUP -//! @{ -#define CMD_FS_POWERUP 0x080C -struct __RFC_STRUCT rfc_CMD_FS_POWERUP_s { - uint16_t commandNo; //!< The command ID number 0x080C - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - uint16_t __dummy0; - uint32_t* pRegOverride; //!< Pointer to a list of hardware and configuration registers to override. If NULL, no override is used. -}; - -//! @} - -//! \addtogroup CMD_FS_POWERDOWN -//! @{ -#define CMD_FS_POWERDOWN 0x080D -struct __RFC_STRUCT rfc_CMD_FS_POWERDOWN_s { - uint16_t commandNo; //!< The command ID number 0x080D - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; -}; - -//! @} - -//! \addtogroup CMD_SCH_IMM -//! @{ -#define CMD_SCH_IMM 0x0810 -struct __RFC_STRUCT rfc_CMD_SCH_IMM_s { - uint16_t commandNo; //!< The command ID number 0x0810 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - uint16_t __dummy0; - uint32_t cmdrVal; //!< Value as would be written to CMDR - uint32_t cmdstaVal; //!< Value as would be returned in CMDSTA -}; - -//! @} - -//! \addtogroup CMD_COUNT_BRANCH -//! @{ -#define CMD_COUNT_BRANCH 0x0812 -struct __RFC_STRUCT rfc_CMD_COUNT_BRANCH_s { - uint16_t commandNo; //!< The command ID number 0x0812 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - uint16_t counter; //!< \brief Counter. On start, the radio CPU decrements the value, and the end status of the operation - //!< differs if the result is zero - rfc_radioOp_t *pNextOpIfOk; //!< Pointer to next operation if counter did not expire -}; - -//! @} - -//! \addtogroup CMD_PATTERN_CHECK -//! @{ -#define CMD_PATTERN_CHECK 0x0813 -struct __RFC_STRUCT rfc_CMD_PATTERN_CHECK_s { - uint16_t commandNo; //!< The command ID number 0x0813 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - struct { - uint16_t operation:2; //!< \brief Operation to perform
- //!< 0: True if value == compareVal
- //!< 1: True if value < compareVal
- //!< 2: True if value > compareVal
- //!< 3: Reserved - uint16_t bByteRev:1; //!< \brief If 1, interchange the four bytes of the value, so that they are read - //!< most-significant-byte-first. - uint16_t bBitRev:1; //!< If 1, perform bit reversal of the value - uint16_t signExtend:5; //!< \brief 0: Treat value and compareVal as unsigned
- //!< 1–31: Treat value and compareVal as signed, where the value - //!< gives the number of the most significant bit in the signed number. - uint16_t bRxVal:1; //!< \brief 0: Use pValue as a pointer
- //!< 1: Use pValue as a signed offset to the start of the last - //!< committed Rx entry element - } patternOpt; //!< Options for comparison - rfc_radioOp_t *pNextOpIfOk; //!< Pointer to next operation if comparison result was true - uint8_t* pValue; //!< Pointer to read from, or offset from last Rx entry if patternOpt.bRxVal == 1 - uint32_t mask; //!< Bit mask to apply before comparison - uint32_t compareVal; //!< Value to compare to -}; - -//! @} - -//! \addtogroup CMD_ABORT -//! @{ -#define CMD_ABORT 0x0401 -struct __RFC_STRUCT rfc_CMD_ABORT_s { - uint16_t commandNo; //!< The command ID number 0x0401 -}; - -//! @} - -//! \addtogroup CMD_STOP -//! @{ -#define CMD_STOP 0x0402 -struct __RFC_STRUCT rfc_CMD_STOP_s { - uint16_t commandNo; //!< The command ID number 0x0402 -}; - -//! @} - -//! \addtogroup CMD_GET_RSSI -//! @{ -#define CMD_GET_RSSI 0x0403 -struct __RFC_STRUCT rfc_CMD_GET_RSSI_s { - uint16_t commandNo; //!< The command ID number 0x0403 -}; - -//! @} - -//! \addtogroup CMD_UPDATE_RADIO_SETUP -//! @{ -#define CMD_UPDATE_RADIO_SETUP 0x0001 -struct __RFC_STRUCT rfc_CMD_UPDATE_RADIO_SETUP_s { - uint16_t commandNo; //!< The command ID number 0x0001 - uint16_t __dummy0; - uint32_t* pRegOverride; //!< Pointer to a list of hardware and configuration registers to override -}; - -//! @} - -//! \addtogroup CMD_TRIGGER -//! @{ -#define CMD_TRIGGER 0x0404 -struct __RFC_STRUCT rfc_CMD_TRIGGER_s { - uint16_t commandNo; //!< The command ID number 0x0404 - uint8_t triggerNo; //!< Command trigger number -}; - -//! @} - -//! \addtogroup CMD_GET_FW_INFO -//! @{ -#define CMD_GET_FW_INFO 0x0002 -struct __RFC_STRUCT rfc_CMD_GET_FW_INFO_s { - uint16_t commandNo; //!< The command ID number 0x0002 - uint16_t versionNo; //!< Firmware version number - uint16_t startOffset; //!< The start of free RAM - uint16_t freeRamSz; //!< The size of free RAM - uint16_t availRatCh; //!< Bitmap of available RAT channels -}; - -//! @} - -//! \addtogroup CMD_START_RAT -//! @{ -#define CMD_START_RAT 0x0405 -struct __RFC_STRUCT rfc_CMD_START_RAT_s { - uint16_t commandNo; //!< The command ID number 0x0405 -}; - -//! @} - -//! \addtogroup CMD_PING -//! @{ -#define CMD_PING 0x0406 -struct __RFC_STRUCT rfc_CMD_PING_s { - uint16_t commandNo; //!< The command ID number 0x0406 -}; - -//! @} - -//! \addtogroup CMD_ADD_DATA_ENTRY -//! @{ -#define CMD_ADD_DATA_ENTRY 0x0005 -struct __RFC_STRUCT rfc_CMD_ADD_DATA_ENTRY_s { - uint16_t commandNo; //!< The command ID number 0x0005 - uint16_t __dummy0; - dataQueue_t* pQueue; //!< Pointer to the queue structure to which the entry will be added - uint8_t* pEntry; //!< Pointer to the entry -}; - -//! @} - -//! \addtogroup CMD_REMOVE_DATA_ENTRY -//! @{ -#define CMD_REMOVE_DATA_ENTRY 0x0006 -struct __RFC_STRUCT rfc_CMD_REMOVE_DATA_ENTRY_s { - uint16_t commandNo; //!< The command ID number 0x0006 - uint16_t __dummy0; - dataQueue_t* pQueue; //!< Pointer to the queue structure from which the entry will be removed - uint8_t* pEntry; //!< Pointer to the entry that was removed -}; - -//! @} - -//! \addtogroup CMD_FLUSH_QUEUE -//! @{ -#define CMD_FLUSH_QUEUE 0x0007 -struct __RFC_STRUCT rfc_CMD_FLUSH_QUEUE_s { - uint16_t commandNo; //!< The command ID number 0x0007 - uint16_t __dummy0; - dataQueue_t* pQueue; //!< Pointer to the queue structure to be flushed - uint8_t* pFirstEntry; //!< Pointer to the first entry that was removed -}; - -//! @} - -//! \addtogroup CMD_CLEAR_RX -//! @{ -#define CMD_CLEAR_RX 0x0008 -struct __RFC_STRUCT rfc_CMD_CLEAR_RX_s { - uint16_t commandNo; //!< The command ID number 0x0008 - uint16_t __dummy0; - dataQueue_t* pQueue; //!< Pointer to the queue structure to be cleared -}; - -//! @} - -//! \addtogroup CMD_REMOVE_PENDING_ENTRIES -//! @{ -#define CMD_REMOVE_PENDING_ENTRIES 0x0009 -struct __RFC_STRUCT rfc_CMD_REMOVE_PENDING_ENTRIES_s { - uint16_t commandNo; //!< The command ID number 0x0009 - uint16_t __dummy0; - dataQueue_t* pQueue; //!< Pointer to the queue structure to be flushed - uint8_t* pFirstEntry; //!< Pointer to the first entry that was removed -}; - -//! @} - -//! \addtogroup CMD_SET_RAT_CMP -//! @{ -#define CMD_SET_RAT_CMP 0x000A -struct __RFC_STRUCT rfc_CMD_SET_RAT_CMP_s { - uint16_t commandNo; //!< The command ID number 0x000A - uint8_t ratCh; //!< The radio timer channel number - uint8_t __dummy0; - ratmr_t compareTime; //!< The time at which the compare occurs -}; - -//! @} - -//! \addtogroup CMD_SET_RAT_CPT -//! @{ -#define CMD_SET_RAT_CPT 0x0603 -struct __RFC_STRUCT rfc_CMD_SET_RAT_CPT_s { - uint16_t commandNo; //!< The command ID number 0x0603 - struct { - uint16_t :3; - uint16_t inputSrc:5; //!< Input source indicator - uint16_t ratCh:4; //!< The radio timer channel number - uint16_t bRepeated:1; //!< \brief 0: Single capture mode
- //!< 1: Repeated capture mode - uint16_t inputMode:2; //!< \brief Input mode:
- //!< 0: Capture on rising edge
- //!< 1: Capture on falling edge
- //!< 2: Capture on both edges
- //!< 3: Reserved - } config; -}; - -//! @} - -//! \addtogroup CMD_DISABLE_RAT_CH -//! @{ -#define CMD_DISABLE_RAT_CH 0x0408 -struct __RFC_STRUCT rfc_CMD_DISABLE_RAT_CH_s { - uint16_t commandNo; //!< The command ID number 0x0408 - uint8_t ratCh; //!< The radio timer channel number -}; - -//! @} - -//! \addtogroup CMD_SET_RAT_OUTPUT -//! @{ -#define CMD_SET_RAT_OUTPUT 0x0604 -struct __RFC_STRUCT rfc_CMD_SET_RAT_OUTPUT_s { - uint16_t commandNo; //!< The command ID number 0x0604 - struct { - uint16_t :2; - uint16_t outputSel:3; //!< Output event indicator - uint16_t outputMode:3; //!< \brief 0: Set output line low as default; and pulse on event. Duration of pulse is one RF Core clock period (ca. 41.67 ns).
- //!< 1: Set output line high on event
- //!< 2: Set output line low on event
- //!< 3: Toggle (invert) output line state on event
- //!< 4: Immediately set output line to low (does not change upon event)
- //!< 5: Immediately set output line to high (does not change upon event)
- //!< Others: Reserved - uint16_t ratCh:4; //!< The radio timer channel number - } config; -}; - -//! @} - -//! \addtogroup CMD_ARM_RAT_CH -//! @{ -#define CMD_ARM_RAT_CH 0x0409 -struct __RFC_STRUCT rfc_CMD_ARM_RAT_CH_s { - uint16_t commandNo; //!< The command ID number 0x0409 - uint8_t ratCh; //!< The radio timer channel number -}; - -//! @} - -//! \addtogroup CMD_DISARM_RAT_CH -//! @{ -#define CMD_DISARM_RAT_CH 0x040A -struct __RFC_STRUCT rfc_CMD_DISARM_RAT_CH_s { - uint16_t commandNo; //!< The command ID number 0x040A - uint8_t ratCh; //!< The radio timer channel number -}; - -//! @} - -//! \addtogroup CMD_SET_TX_POWER -//! @{ -#define CMD_SET_TX_POWER 0x0010 -struct __RFC_STRUCT rfc_CMD_SET_TX_POWER_s { - uint16_t commandNo; //!< The command ID number 0x0010 - struct { - uint16_t IB:6; //!< Value to write to the PA power control field at 25 °C - uint16_t GC:2; //!< Value to write to the gain control of the 1st stage of the PA - uint16_t tempCoeff:8; //!< Temperature coefficient for IB. 0: No temperature compensation - } txPower; //!< New Tx power setting -}; - -//! @} - -//! \addtogroup CMD_UPDATE_FS -//! @{ -#define CMD_UPDATE_FS 0x0011 -struct __RFC_STRUCT rfc_CMD_UPDATE_FS_s { - uint16_t commandNo; //!< The command ID number 0x0011 - uint16_t frequency; //!< The frequency in MHz to tune to - uint16_t fractFreq; //!< Fractional part of the frequency to tune to -}; - -//! @} - -//! \addtogroup CMD_BUS_REQUEST -//! @{ -#define CMD_BUS_REQUEST 0x040E -struct __RFC_STRUCT rfc_CMD_BUS_REQUEST_s { - uint16_t commandNo; //!< The command ID number 0x040E - uint8_t bSysBusNeeded; //!< \brief 0: System bus may sleep
- //!< 1: System bus access needed -}; - -//! @} - -//! @} -//! @} -#endif +/****************************************************************************** +* Filename: common_cmd.h +* Revised: 2015-08-04 10:40:45 +0200 (Tue, 04 Aug 2015) +* Revision: 44326 +* +* Description: CC13xx API for common/generic commands +* +* Copyright (c) 2015, Texas Instruments Incorporated +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* 1) Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* +* 2) Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* 3) Neither the name of the ORGANIZATION nor the names of its contributors may +* be used to endorse or promote products derived from this software without +* specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +******************************************************************************/ + +#ifndef COMMON_CMD_H_ +#define COMMON_CMD_H_ + +#ifndef __RFC_STRUCT +#ifdef __GNUC__ +#define __RFC_STRUCT __attribute__ ((aligned (4))) +#else +#define __RFC_STRUCT +#endif +#endif + +//! \addtogroup rfc +//! @{ + +//! \addtogroup common_cmd +//! @{ + +#include +#include "mailbox.h" + +typedef struct __RFC_STRUCT rfc_command_s rfc_command_t; +typedef struct __RFC_STRUCT rfc_radioOp_s rfc_radioOp_t; +typedef struct __RFC_STRUCT rfc_CMD_NOP_s rfc_CMD_NOP_t; +typedef struct __RFC_STRUCT rfc_CMD_RADIO_SETUP_s rfc_CMD_RADIO_SETUP_t; +typedef struct __RFC_STRUCT rfc_CMD_FS_s rfc_CMD_FS_t; +typedef struct __RFC_STRUCT rfc_CMD_FS_OFF_s rfc_CMD_FS_OFF_t; +typedef struct __RFC_STRUCT rfc_CMD_RX_s rfc_CMD_RX_t; +typedef struct __RFC_STRUCT rfc_CMD_TX_s rfc_CMD_TX_t; +typedef struct __RFC_STRUCT rfc_CMD_RX_TEST_s rfc_CMD_RX_TEST_t; +typedef struct __RFC_STRUCT rfc_CMD_TX_TEST_s rfc_CMD_TX_TEST_t; +typedef struct __RFC_STRUCT rfc_CMD_SYNC_STOP_RAT_s rfc_CMD_SYNC_STOP_RAT_t; +typedef struct __RFC_STRUCT rfc_CMD_SYNC_START_RAT_s rfc_CMD_SYNC_START_RAT_t; +typedef struct __RFC_STRUCT rfc_CMD_COUNT_s rfc_CMD_COUNT_t; +typedef struct __RFC_STRUCT rfc_CMD_FS_POWERUP_s rfc_CMD_FS_POWERUP_t; +typedef struct __RFC_STRUCT rfc_CMD_FS_POWERDOWN_s rfc_CMD_FS_POWERDOWN_t; +typedef struct __RFC_STRUCT rfc_CMD_SCH_IMM_s rfc_CMD_SCH_IMM_t; +typedef struct __RFC_STRUCT rfc_CMD_COUNT_BRANCH_s rfc_CMD_COUNT_BRANCH_t; +typedef struct __RFC_STRUCT rfc_CMD_PATTERN_CHECK_s rfc_CMD_PATTERN_CHECK_t; +typedef struct __RFC_STRUCT rfc_CMD_TX_POWER_BOOST_s rfc_CMD_TX_POWER_BOOST_t; +typedef struct __RFC_STRUCT rfc_CMD_ABORT_s rfc_CMD_ABORT_t; +typedef struct __RFC_STRUCT rfc_CMD_STOP_s rfc_CMD_STOP_t; +typedef struct __RFC_STRUCT rfc_CMD_GET_RSSI_s rfc_CMD_GET_RSSI_t; +typedef struct __RFC_STRUCT rfc_CMD_UPDATE_RADIO_SETUP_s rfc_CMD_UPDATE_RADIO_SETUP_t; +typedef struct __RFC_STRUCT rfc_CMD_TRIGGER_s rfc_CMD_TRIGGER_t; +typedef struct __RFC_STRUCT rfc_CMD_GET_FW_INFO_s rfc_CMD_GET_FW_INFO_t; +typedef struct __RFC_STRUCT rfc_CMD_START_RAT_s rfc_CMD_START_RAT_t; +typedef struct __RFC_STRUCT rfc_CMD_PING_s rfc_CMD_PING_t; +typedef struct __RFC_STRUCT rfc_CMD_ADD_DATA_ENTRY_s rfc_CMD_ADD_DATA_ENTRY_t; +typedef struct __RFC_STRUCT rfc_CMD_REMOVE_DATA_ENTRY_s rfc_CMD_REMOVE_DATA_ENTRY_t; +typedef struct __RFC_STRUCT rfc_CMD_FLUSH_QUEUE_s rfc_CMD_FLUSH_QUEUE_t; +typedef struct __RFC_STRUCT rfc_CMD_CLEAR_RX_s rfc_CMD_CLEAR_RX_t; +typedef struct __RFC_STRUCT rfc_CMD_REMOVE_PENDING_ENTRIES_s rfc_CMD_REMOVE_PENDING_ENTRIES_t; +typedef struct __RFC_STRUCT rfc_CMD_SET_RAT_CMP_s rfc_CMD_SET_RAT_CMP_t; +typedef struct __RFC_STRUCT rfc_CMD_SET_RAT_CPT_s rfc_CMD_SET_RAT_CPT_t; +typedef struct __RFC_STRUCT rfc_CMD_DISABLE_RAT_CH_s rfc_CMD_DISABLE_RAT_CH_t; +typedef struct __RFC_STRUCT rfc_CMD_SET_RAT_OUTPUT_s rfc_CMD_SET_RAT_OUTPUT_t; +typedef struct __RFC_STRUCT rfc_CMD_ARM_RAT_CH_s rfc_CMD_ARM_RAT_CH_t; +typedef struct __RFC_STRUCT rfc_CMD_DISARM_RAT_CH_s rfc_CMD_DISARM_RAT_CH_t; +typedef struct __RFC_STRUCT rfc_CMD_SET_TX_POWER_s rfc_CMD_SET_TX_POWER_t; +typedef struct __RFC_STRUCT rfc_CMD_UPDATE_FS_s rfc_CMD_UPDATE_FS_t; +typedef struct __RFC_STRUCT rfc_CMD_BUS_REQUEST_s rfc_CMD_BUS_REQUEST_t; + +//! \addtogroup command +//! @{ +struct __RFC_STRUCT rfc_command_s { + uint16_t commandNo; //!< The command ID number +}; + +//! @} + +//! \addtogroup radioOp +//! @{ +//! Common definition for radio operation commands + +struct __RFC_STRUCT rfc_radioOp_s { + uint16_t commandNo; //!< The command ID number + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; +}; + +//! @} + +//! \addtogroup CMD_NOP +//! @{ +#define CMD_NOP 0x0801 +struct __RFC_STRUCT rfc_CMD_NOP_s { + uint16_t commandNo; //!< The command ID number 0x0801 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; +}; + +//! @} + +//! \addtogroup CMD_RADIO_SETUP +//! @{ +#define CMD_RADIO_SETUP 0x0802 +struct __RFC_STRUCT rfc_CMD_RADIO_SETUP_s { + uint16_t commandNo; //!< The command ID number 0x0802 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint8_t mode; //!< \brief The main mode to use
+ //!< 0x00: BLE
+ //!< 0x01: IEEE 802.15.4
+ //!< 0x02: 2 Mbps GFSK
+ //!< 0x05: 5 Mbps coded 8-FSK
+ //!< 0x06: ANT
+ //!< 0xFF: Keep existing mode; update overrides only
+ //!< Others: Reserved + uint8_t loDivider; //!< \brief LO divider setting to use. Supported values: 0 (equivalent to 2), 2, 5, 6, 10, 12, 15, + //!< and 30.
+ //!< Value of 0 or 2 only supported for devices that support 2.4 GHz operation + struct { + uint16_t frontEndMode:3; //!< \brief 0x00: Differential mode
+ //!< 0x01: Single-ended mode RFP
+ //!< 0x02: Single-ended mode RFN
+ //!< 0x05 Single-ended mode RFP with external frontend control on RF pins (RFN and RXTX)
+ //!< 0x06 Single-ended mode RFN with external frontend control on RF pins (RFP and RXTX)
+ //!< Others: Reserved + uint16_t biasMode:1; //!< \brief 0: Internal bias
+ //!< 1: External bias + uint16_t :6; + uint16_t bNoFsPowerUp:1; //!< \brief 0: Power up frequency synth
+ //!< 1: Do not power up frequency synth + } config; //!< Configuration options + struct { + uint16_t IB:6; //!< Value to write to the PA power control field at 25 °C + uint16_t GC:2; //!< Value to write to the gain control of the 1st stage of the PA + uint16_t boost:1; //!< Value of boost bit in synth + uint16_t tempCoeff:7; //!< Temperature coefficient for IB. 0: No temperature compensation + } txPower; //!< Transmit power + uint32_t* pRegOverride; //!< \brief Pointer to a list of hardware and configuration registers to override. If NULL, no + //!< override is used. +}; + +//! @} + +//! \addtogroup CMD_FS +//! @{ +#define CMD_FS 0x0803 +struct __RFC_STRUCT rfc_CMD_FS_s { + uint16_t commandNo; //!< The command ID number 0x0803 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint16_t frequency; //!< The frequency in MHz to tune to + uint16_t fractFreq; //!< Fractional part of the frequency to tune to + struct { + uint8_t bTxMode:1; //!< \brief 0: Start synth in Rx mode
+ //!< 1: Start synth in Tx mode + uint8_t refFreq:6; //!< \brief 0: Use default reference frequency
+ //!< Others: Use reference frequency 24 MHz/refFreq + } synthConf; + uint8_t __dummy0; + uint8_t midPrecal; //!< Mid pre-calibration value to use when bOverrideCalib and bSkipCoarseCalib are both 1 + uint8_t ktPrecal; //!< KT pre-calibration value to use when bOverrideCalib and bSkipCoarseCalib are both 1 + uint16_t tdcPrecal; //!< TDC pre-calibration value to use when bOverrideCalib and bSkipCoarseCalib are both 1 +}; + +//! @} + +//! \addtogroup CMD_FS_OFF +//! @{ +#define CMD_FS_OFF 0x0804 +struct __RFC_STRUCT rfc_CMD_FS_OFF_s { + uint16_t commandNo; //!< The command ID number 0x0804 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; +}; + +//! @} + +//! \addtogroup CMD_RX +//! @{ +#define CMD_RX 0x0805 +struct __RFC_STRUCT rfc_CMD_RX_s { + uint16_t commandNo; //!< The command ID number 0x0805 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + struct { + uint16_t endianness:1; //!< \brief 0: Least significant bit first
+ //!< 1: Most significant bit first + uint16_t numHdrBits:6; //!< Number of bits in the header + uint16_t bFsOff:1; //!< \brief 0: Keep frequency synth on after command
+ //!< 1: Turn frequency synth off after command + uint16_t bUseCrc:1; //!< \brief 0: No CRC
+ //!< 1: The last bytes of the packet are a CRC + uint16_t bCrcIncSw:1; //!< \brief 0: Do not include sync word in CRC calculation
+ //!< 1: Include sync word in CRC calculation + uint16_t bCrcIncHdr:1; //!< \brief 0: Do not include header in CRC calculation
+ //!< 1: Include header in CRC calculation + uint16_t bReportCrc:1; //!< \brief 0: Do not write CRC to receive buffer
+ //!< 1: Write received CRC to receive buffer + uint16_t endType:1; //!< \brief 0: Packet is received to the end if end trigger happens after sync is obtained
+ //!< 1: Packet reception is stopped if end trigger happens + uint16_t bDualSw:1; //!< \brief 0: Single sync word
+ //!< 1: Dual sync word. + } pktConfig; + uint32_t syncWord; //!< Sync word to receive + uint32_t syncWord2; //!< Secondary sync word to receive if pktConfig.bDualSw = 1 + struct { + uint16_t numLenBits:4; //!< Number of bits in the length field + uint16_t lenFieldPos:5; //!< Bit position of the first bit in the length field + uint16_t lenOffset:7; //!< Signed number to add to the received length field + } lenConfig; + uint16_t maxLen; //!< Maximum number of bytes in the received packet (including header, excluding CRC) + uint8_t* pRecPkt; //!< Pointer to buffer for received packet. NULL: Do not store the contents. + ratmr_t endTime; //!< Time to end the operation + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } endTrigger; //!< Trigger classifier for ending the operation + int8_t rssi; //!< RSSI of received packet + uint16_t recLen; //!< Number of bytes written to receive buffer + ratmr_t timeStamp; //!< Time stamp of received packet + uint16_t nRxOk; //!< Counter of number of received packets with CRC OK and first sync word + uint16_t nRxNok; //!< Counter of number of received packets with CRC error and first sync word + uint16_t nRx2Ok; //!< \brief Counter of number of received packets with CRC OK and second sync word; may safely be + //!< omitted if pktConfig.bDualSw is 0 + uint16_t nRx2Nok; //!< \brief Counter of number of received packets with CRC error and second sync word; may safely be + //!< omitted if pktConfig.bDualSw is 0 +}; + +//! @} + +//! \addtogroup CMD_TX +//! @{ +#define CMD_TX 0x0806 +struct __RFC_STRUCT rfc_CMD_TX_s { + uint16_t commandNo; //!< The command ID number 0x0806 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + struct { + uint16_t endianness:1; //!< \brief 0: Least significant bit first
+ //!< 1: Most significant bit first + uint16_t numHdrBits:6; //!< Number of bits in the header + uint16_t bFsOff:1; //!< \brief 0: Keep frequency synth on after command
+ //!< 1: Turn frequency synth off after command + uint16_t bUseCrc:1; //!< \brief 0: No CRC
+ //!< 1: Append a CRC to the packet + uint16_t bCrcIncSw:1; //!< \brief 0: Do not include sync word in CRC calculation
+ //!< 1: Include sync word in CRC calculation + uint16_t bCrcIncHdr:1; //!< \brief 0: Do not include header in CRC calculation
+ //!< 1: Include header in CRC calculation + } pktConfig; + uint32_t syncWord; //!< Sync word to transmit + uint8_t* pTxPkt; //!< Pointer to buffer for transmitted packet. + uint16_t pktLen; //!< Number of bytes in the transmitted packet +}; + +//! @} + +//! \addtogroup CMD_RX_TEST +//! @{ +#define CMD_RX_TEST 0x0807 +struct __RFC_STRUCT rfc_CMD_RX_TEST_s { + uint16_t commandNo; //!< The command ID number 0x0807 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + struct { + uint8_t bEnaFifo:1; //!< \brief 0: Do not enable FIFO in modem, so that received data is not available
+ //!< 1: Enable FIFO in modem – the data must be read out by the application + uint8_t bFsOff:1; //!< \brief 0: Keep frequency synth on after command
+ //!< 1: Turn frequency synth off after command + uint8_t bNoSync:1; //!< \brief 0: Run sync search as normal for the configured mode
+ //!< 1: Write correlation thresholds to the maximum value to avoid getting sync + } config; + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } endTrigger; //!< Trigger classifier for ending the operation + uint32_t syncWord; //!< Sync word to use for receiver + ratmr_t endTime; //!< Time to end the operation +}; + +//! @} + +//! \addtogroup CMD_TX_TEST +//! @{ +#define CMD_TX_TEST 0x0808 +struct __RFC_STRUCT rfc_CMD_TX_TEST_s { + uint16_t commandNo; //!< The command ID number 0x0808 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + struct { + uint8_t bUseCw:1; //!< \brief 0: Send modulated signal
+ //!< 1: Send continuous wave + uint8_t bFsOff:1; //!< \brief 0: Keep frequency synth on after command
+ //!< 1: Turn frequency synth off after command + uint8_t whitenMode:2; //!< \brief 0: No whitening
+ //!< 1: Default whitening
+ //!< 2: PRBS-15
+ //!< 3: PRBS-32 + } config; + uint8_t __dummy0; + uint16_t txWord; //!< Value to send to the modem before whitening + uint8_t __dummy1; + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } endTrigger; //!< Trigger classifier for ending the operation + uint32_t syncWord; //!< Sync word to use for transmitter + ratmr_t endTime; //!< Time to end the operation +}; + +//! @} + +//! \addtogroup CMD_SYNC_STOP_RAT +//! @{ +#define CMD_SYNC_STOP_RAT 0x0809 +struct __RFC_STRUCT rfc_CMD_SYNC_STOP_RAT_s { + uint16_t commandNo; //!< The command ID number 0x0809 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint16_t __dummy0; + ratmr_t rat0; //!< \brief The returned RAT timer value corresponding to the value the RAT would have had when the + //!< RTC was zero +}; + +//! @} + +//! \addtogroup CMD_SYNC_START_RAT +//! @{ +#define CMD_SYNC_START_RAT 0x080A +struct __RFC_STRUCT rfc_CMD_SYNC_START_RAT_s { + uint16_t commandNo; //!< The command ID number 0x080A + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint16_t __dummy0; + ratmr_t rat0; //!< \brief The desired RAT timer value corresponding to the value the RAT would have had when the + //!< RTC was zero. This parameter is returned by CMD_SYNC_STOP_RAT +}; + +//! @} + +//! \addtogroup CMD_COUNT +//! @{ +#define CMD_COUNT 0x080B +struct __RFC_STRUCT rfc_CMD_COUNT_s { + uint16_t commandNo; //!< The command ID number 0x080B + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint16_t counter; //!< \brief Counter. On start, the radio CPU decrements the value, and the end status of the operation + //!< differs if the result is zero +}; + +//! @} + +//! \addtogroup CMD_FS_POWERUP +//! @{ +#define CMD_FS_POWERUP 0x080C +struct __RFC_STRUCT rfc_CMD_FS_POWERUP_s { + uint16_t commandNo; //!< The command ID number 0x080C + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint16_t __dummy0; + uint32_t* pRegOverride; //!< Pointer to a list of hardware and configuration registers to override. If NULL, no override is used. +}; + +//! @} + +//! \addtogroup CMD_FS_POWERDOWN +//! @{ +#define CMD_FS_POWERDOWN 0x080D +struct __RFC_STRUCT rfc_CMD_FS_POWERDOWN_s { + uint16_t commandNo; //!< The command ID number 0x080D + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; +}; + +//! @} + +//! \addtogroup CMD_SCH_IMM +//! @{ +#define CMD_SCH_IMM 0x0810 +struct __RFC_STRUCT rfc_CMD_SCH_IMM_s { + uint16_t commandNo; //!< The command ID number 0x0810 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint16_t __dummy0; + uint32_t cmdrVal; //!< Value as would be written to CMDR + uint32_t cmdstaVal; //!< Value as would be returned in CMDSTA +}; + +//! @} + +//! \addtogroup CMD_COUNT_BRANCH +//! @{ +#define CMD_COUNT_BRANCH 0x0812 +struct __RFC_STRUCT rfc_CMD_COUNT_BRANCH_s { + uint16_t commandNo; //!< The command ID number 0x0812 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint16_t counter; //!< \brief Counter. On start, the radio CPU decrements the value, and the end status of the operation + //!< differs if the result is zero + rfc_radioOp_t *pNextOpIfOk; //!< Pointer to next operation if counter did not expire +}; + +//! @} + +//! \addtogroup CMD_PATTERN_CHECK +//! @{ +#define CMD_PATTERN_CHECK 0x0813 +struct __RFC_STRUCT rfc_CMD_PATTERN_CHECK_s { + uint16_t commandNo; //!< The command ID number 0x0813 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + struct { + uint16_t operation:2; //!< \brief Operation to perform
+ //!< 0: True if value == compareVal
+ //!< 1: True if value < compareVal
+ //!< 2: True if value > compareVal
+ //!< 3: Reserved + uint16_t bByteRev:1; //!< \brief If 1, interchange the four bytes of the value, so that they are read + //!< most-significant-byte-first. + uint16_t bBitRev:1; //!< If 1, perform bit reversal of the value + uint16_t signExtend:5; //!< \brief 0: Treat value and compareVal as unsigned
+ //!< 1–31: Treat value and compareVal as signed, where the value + //!< gives the number of the most significant bit in the signed number. + uint16_t bRxVal:1; //!< \brief 0: Use pValue as a pointer
+ //!< 1: Use pValue as a signed offset to the start of the last + //!< committed Rx entry element + } patternOpt; //!< Options for comparison + rfc_radioOp_t *pNextOpIfOk; //!< Pointer to next operation if comparison result was true + uint8_t* pValue; //!< Pointer to read from, or offset from last Rx entry if patternOpt.bRxVal == 1 + uint32_t mask; //!< Bit mask to apply before comparison + uint32_t compareVal; //!< Value to compare to +}; + +//! @} + +//! \addtogroup CMD_TX_POWER_BOOST +//! @{ +#define CMD_TX_POWER_BOOST 0x0816 +struct __RFC_STRUCT rfc_CMD_TX_POWER_BOOST_s { + uint16_t commandNo; //!< The command ID number 0x0816 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint8_t vddrLevel; //!< \brief VDDR level to set
+ //!< 0xFD: Trim VDDR voltage to normal level (VDDR_TRIM), nominally 1.68 V
+ //!< 0xFE: Trim VDDR voltage to high level (VDDR_TRIM_H), nominally 1.85 V
+ //!< 0xFF: Trim VDDR voltage to higher level (VDDR_TRIM_HH), nominally 1.95 V
+ //!< Other: reserved + uint8_t paTrimValue; //!< \brief Optional power amplifier trim setting manipulation
+ //!< 0x00-0x1F: Value to write in ADI_0_RF:PACTL0.TRIM register field
+ //!< 0xFE: Set PACTL0.TRIM to its default value from FCFG1
+ //!< 0xFF: Do not write PACTL0.TRIM, use the setting that is already applied
+}; + +//! @} + +//! \addtogroup CMD_ABORT +//! @{ +#define CMD_ABORT 0x0401 +struct __RFC_STRUCT rfc_CMD_ABORT_s { + uint16_t commandNo; //!< The command ID number 0x0401 +}; + +//! @} + +//! \addtogroup CMD_STOP +//! @{ +#define CMD_STOP 0x0402 +struct __RFC_STRUCT rfc_CMD_STOP_s { + uint16_t commandNo; //!< The command ID number 0x0402 +}; + +//! @} + +//! \addtogroup CMD_GET_RSSI +//! @{ +#define CMD_GET_RSSI 0x0403 +struct __RFC_STRUCT rfc_CMD_GET_RSSI_s { + uint16_t commandNo; //!< The command ID number 0x0403 +}; + +//! @} + +//! \addtogroup CMD_UPDATE_RADIO_SETUP +//! @{ +#define CMD_UPDATE_RADIO_SETUP 0x0001 +struct __RFC_STRUCT rfc_CMD_UPDATE_RADIO_SETUP_s { + uint16_t commandNo; //!< The command ID number 0x0001 + uint16_t __dummy0; + uint32_t* pRegOverride; //!< Pointer to a list of hardware and configuration registers to override +}; + +//! @} + +//! \addtogroup CMD_TRIGGER +//! @{ +#define CMD_TRIGGER 0x0404 +struct __RFC_STRUCT rfc_CMD_TRIGGER_s { + uint16_t commandNo; //!< The command ID number 0x0404 + uint8_t triggerNo; //!< Command trigger number +}; + +//! @} + +//! \addtogroup CMD_GET_FW_INFO +//! @{ +#define CMD_GET_FW_INFO 0x0002 +struct __RFC_STRUCT rfc_CMD_GET_FW_INFO_s { + uint16_t commandNo; //!< The command ID number 0x0002 + uint16_t versionNo; //!< Firmware version number + uint16_t startOffset; //!< The start of free RAM + uint16_t freeRamSz; //!< The size of free RAM + uint16_t availRatCh; //!< Bitmap of available RAT channels +}; + +//! @} + +//! \addtogroup CMD_START_RAT +//! @{ +#define CMD_START_RAT 0x0405 +struct __RFC_STRUCT rfc_CMD_START_RAT_s { + uint16_t commandNo; //!< The command ID number 0x0405 +}; + +//! @} + +//! \addtogroup CMD_PING +//! @{ +#define CMD_PING 0x0406 +struct __RFC_STRUCT rfc_CMD_PING_s { + uint16_t commandNo; //!< The command ID number 0x0406 +}; + +//! @} + +//! \addtogroup CMD_ADD_DATA_ENTRY +//! @{ +#define CMD_ADD_DATA_ENTRY 0x0005 +struct __RFC_STRUCT rfc_CMD_ADD_DATA_ENTRY_s { + uint16_t commandNo; //!< The command ID number 0x0005 + uint16_t __dummy0; + dataQueue_t* pQueue; //!< Pointer to the queue structure to which the entry will be added + uint8_t* pEntry; //!< Pointer to the entry +}; + +//! @} + +//! \addtogroup CMD_REMOVE_DATA_ENTRY +//! @{ +#define CMD_REMOVE_DATA_ENTRY 0x0006 +struct __RFC_STRUCT rfc_CMD_REMOVE_DATA_ENTRY_s { + uint16_t commandNo; //!< The command ID number 0x0006 + uint16_t __dummy0; + dataQueue_t* pQueue; //!< Pointer to the queue structure from which the entry will be removed + uint8_t* pEntry; //!< Pointer to the entry that was removed +}; + +//! @} + +//! \addtogroup CMD_FLUSH_QUEUE +//! @{ +#define CMD_FLUSH_QUEUE 0x0007 +struct __RFC_STRUCT rfc_CMD_FLUSH_QUEUE_s { + uint16_t commandNo; //!< The command ID number 0x0007 + uint16_t __dummy0; + dataQueue_t* pQueue; //!< Pointer to the queue structure to be flushed + uint8_t* pFirstEntry; //!< Pointer to the first entry that was removed +}; + +//! @} + +//! \addtogroup CMD_CLEAR_RX +//! @{ +#define CMD_CLEAR_RX 0x0008 +struct __RFC_STRUCT rfc_CMD_CLEAR_RX_s { + uint16_t commandNo; //!< The command ID number 0x0008 + uint16_t __dummy0; + dataQueue_t* pQueue; //!< Pointer to the queue structure to be cleared +}; + +//! @} + +//! \addtogroup CMD_REMOVE_PENDING_ENTRIES +//! @{ +#define CMD_REMOVE_PENDING_ENTRIES 0x0009 +struct __RFC_STRUCT rfc_CMD_REMOVE_PENDING_ENTRIES_s { + uint16_t commandNo; //!< The command ID number 0x0009 + uint16_t __dummy0; + dataQueue_t* pQueue; //!< Pointer to the queue structure to be flushed + uint8_t* pFirstEntry; //!< Pointer to the first entry that was removed +}; + +//! @} + +//! \addtogroup CMD_SET_RAT_CMP +//! @{ +#define CMD_SET_RAT_CMP 0x000A +struct __RFC_STRUCT rfc_CMD_SET_RAT_CMP_s { + uint16_t commandNo; //!< The command ID number 0x000A + uint8_t ratCh; //!< The radio timer channel number + uint8_t __dummy0; + ratmr_t compareTime; //!< The time at which the compare occurs +}; + +//! @} + +//! \addtogroup CMD_SET_RAT_CPT +//! @{ +#define CMD_SET_RAT_CPT 0x0603 +struct __RFC_STRUCT rfc_CMD_SET_RAT_CPT_s { + uint16_t commandNo; //!< The command ID number 0x0603 + struct { + uint16_t :3; + uint16_t inputSrc:5; //!< Input source indicator + uint16_t ratCh:4; //!< The radio timer channel number + uint16_t bRepeated:1; //!< \brief 0: Single capture mode
+ //!< 1: Repeated capture mode + uint16_t inputMode:2; //!< \brief Input mode:
+ //!< 0: Capture on rising edge
+ //!< 1: Capture on falling edge
+ //!< 2: Capture on both edges
+ //!< 3: Reserved + } config; +}; + +//! @} + +//! \addtogroup CMD_DISABLE_RAT_CH +//! @{ +#define CMD_DISABLE_RAT_CH 0x0408 +struct __RFC_STRUCT rfc_CMD_DISABLE_RAT_CH_s { + uint16_t commandNo; //!< The command ID number 0x0408 + uint8_t ratCh; //!< The radio timer channel number +}; + +//! @} + +//! \addtogroup CMD_SET_RAT_OUTPUT +//! @{ +#define CMD_SET_RAT_OUTPUT 0x0604 +struct __RFC_STRUCT rfc_CMD_SET_RAT_OUTPUT_s { + uint16_t commandNo; //!< The command ID number 0x0604 + struct { + uint16_t :2; + uint16_t outputSel:3; //!< Output event indicator + uint16_t outputMode:3; //!< \brief 0: Set output line low as default; and pulse on event. Duration of pulse is one RF Core clock period (ca. 41.67 ns).
+ //!< 1: Set output line high on event
+ //!< 2: Set output line low on event
+ //!< 3: Toggle (invert) output line state on event
+ //!< 4: Immediately set output line to low (does not change upon event)
+ //!< 5: Immediately set output line to high (does not change upon event)
+ //!< Others: Reserved + uint16_t ratCh:4; //!< The radio timer channel number + } config; +}; + +//! @} + +//! \addtogroup CMD_ARM_RAT_CH +//! @{ +#define CMD_ARM_RAT_CH 0x0409 +struct __RFC_STRUCT rfc_CMD_ARM_RAT_CH_s { + uint16_t commandNo; //!< The command ID number 0x0409 + uint8_t ratCh; //!< The radio timer channel number +}; + +//! @} + +//! \addtogroup CMD_DISARM_RAT_CH +//! @{ +#define CMD_DISARM_RAT_CH 0x040A +struct __RFC_STRUCT rfc_CMD_DISARM_RAT_CH_s { + uint16_t commandNo; //!< The command ID number 0x040A + uint8_t ratCh; //!< The radio timer channel number +}; + +//! @} + +//! \addtogroup CMD_SET_TX_POWER +//! @{ +#define CMD_SET_TX_POWER 0x0010 +struct __RFC_STRUCT rfc_CMD_SET_TX_POWER_s { + uint16_t commandNo; //!< The command ID number 0x0010 + struct { + uint16_t IB:6; //!< Value to write to the PA power control field at 25 °C + uint16_t GC:2; //!< Value to write to the gain control of the 1st stage of the PA + uint16_t boost:1; //!< Value of boost bit in synth + uint16_t tempCoeff:7; //!< Temperature coefficient for IB. 0: No temperature compensation + } txPower; //!< New Tx power setting +}; + +//! @} + +//! \addtogroup CMD_UPDATE_FS +//! @{ +#define CMD_UPDATE_FS 0x0011 +struct __RFC_STRUCT rfc_CMD_UPDATE_FS_s { + uint16_t commandNo; //!< The command ID number 0x0011 + uint16_t frequency; //!< The frequency in MHz to tune to + uint16_t fractFreq; //!< Fractional part of the frequency to tune to +}; + +//! @} + +//! \addtogroup CMD_BUS_REQUEST +//! @{ +#define CMD_BUS_REQUEST 0x040E +struct __RFC_STRUCT rfc_CMD_BUS_REQUEST_s { + uint16_t commandNo; //!< The command ID number 0x040E + uint8_t bSysBusNeeded; //!< \brief 0: System bus may sleep
+ //!< 1: System bus access needed +}; + +//! @} + +//! @} +//! @} +#endif /* COMMON_CMD_H_ */ diff --git a/cpu/cc26xx-cc13xx/rf-core/api/data_entry.h b/cpu/cc26xx-cc13xx/rf-core/api/data_entry.h new file mode 100644 index 000000000..c396a211f --- /dev/null +++ b/cpu/cc26xx-cc13xx/rf-core/api/data_entry.h @@ -0,0 +1,213 @@ +/****************************************************************************** +* Filename: data_entry.h +* Revised: 2015-08-04 11:44:20 +0200 (Tue, 04 Aug 2015) +* Revision: 44329 +* +* Description: Definition of API for data exchange +* +* Copyright (c) 2015, Texas Instruments Incorporated +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* 1) Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* +* 2) Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* 3) Neither the name of the ORGANIZATION nor the names of its contributors may +* be used to endorse or promote products derived from this software without +* specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +******************************************************************************/ + +#ifndef DATA_ENTRY_H_ +#define DATA_ENTRY_H_ + +#ifndef __RFC_STRUCT +#ifdef __GNUC__ +#define __RFC_STRUCT __attribute__ ((aligned (4))) +#else +#define __RFC_STRUCT +#endif +#endif + +//! \addtogroup rfc +//! @{ + +//! \addtogroup data_entry +//! @{ + +#include +#include "mailbox.h" + +typedef struct __RFC_STRUCT rfc_dataEntry_s rfc_dataEntry_t; +typedef struct __RFC_STRUCT rfc_dataEntryGeneral_s rfc_dataEntryGeneral_t; +typedef struct __RFC_STRUCT rfc_dataEntryMulti_s rfc_dataEntryMulti_t; +typedef struct __RFC_STRUCT rfc_dataEntryPointer_s rfc_dataEntryPointer_t; +typedef struct __RFC_STRUCT rfc_dataEntryPartial_s rfc_dataEntryPartial_t; + +//! \addtogroup dataEntry +//! @{ +struct __RFC_STRUCT rfc_dataEntry_s { + uint8_t* pNextEntry; //!< Pointer to next entry in the queue, NULL if this is the last entry + uint8_t status; //!< Indicates status of entry, including whether it is free for the system CPU to write to + struct { + uint8_t type:2; //!< \brief Type of data entry structure
+ //!< 0: General data entry
+ //!< 1: Multi-element Rx entry
+ //!< 2: Pointer entry
+ //!< 3: Partial read Rx entry + uint8_t lenSz:2; //!< \brief Size of length word in start of each Rx entry element
+ //!< 0: No length indicator
+ //!< 1: One byte length indicator
+ //!< 2: Two bytes length indicator
+ //!< 3: Reserved + uint8_t irqIntv:4; //!< \brief For partial read Rx entry only: The number of bytes between interrupt generated + //!< by the radio CPU (0: 16 bytes) + } config; + uint16_t length; //!< \brief For pointer entries: Number of bytes in the data buffer pointed to
+ //!< For other entries: Number of bytes following this length field +}; + +//! @} + +//! \addtogroup dataEntryGeneral +//! @{ +//! General data entry structure (type = 0) + +struct __RFC_STRUCT rfc_dataEntryGeneral_s { + uint8_t* pNextEntry; //!< Pointer to next entry in the queue, NULL if this is the last entry + uint8_t status; //!< Indicates status of entry, including whether it is free for the system CPU to write to + struct { + uint8_t type:2; //!< \brief Type of data entry structure
+ //!< 0: General data entry
+ //!< 1: Multi-element Rx entry
+ //!< 2: Pointer entry
+ //!< 3: Partial read Rx entry + uint8_t lenSz:2; //!< \brief Size of length word in start of each Rx entry element
+ //!< 0: No length indicator
+ //!< 1: One byte length indicator
+ //!< 2: Two bytes length indicator
+ //!< 3: Reserved + uint8_t irqIntv:4; //!< \brief For partial read Rx entry only: The number of bytes between interrupt generated + //!< by the radio CPU (0: 16 bytes) + } config; + uint16_t length; //!< \brief For pointer entries: Number of bytes in the data buffer pointed to
+ //!< For other entries: Number of bytes following this length field + uint8_t data; //!< First byte of the data array to be received or transmitted +}; + +//! @} + +//! \addtogroup dataEntryMulti +//! @{ +//! Multi-element data entry structure (type = 1) + +struct __RFC_STRUCT rfc_dataEntryMulti_s { + uint8_t* pNextEntry; //!< Pointer to next entry in the queue, NULL if this is the last entry + uint8_t status; //!< Indicates status of entry, including whether it is free for the system CPU to write to + struct { + uint8_t type:2; //!< \brief Type of data entry structure
+ //!< 0: General data entry
+ //!< 1: Multi-element Rx entry
+ //!< 2: Pointer entry
+ //!< 3: Partial read Rx entry + uint8_t lenSz:2; //!< \brief Size of length word in start of each Rx entry element
+ //!< 0: No length indicator
+ //!< 1: One byte length indicator
+ //!< 2: Two bytes length indicator
+ //!< 3: Reserved + uint8_t irqIntv:4; //!< \brief For partial read Rx entry only: The number of bytes between interrupt generated + //!< by the radio CPU (0: 16 bytes) + } config; + uint16_t length; //!< \brief For pointer entries: Number of bytes in the data buffer pointed to
+ //!< For other entries: Number of bytes following this length field + uint16_t numElements; //!< Number of entry elements committed in the entry + uint16_t nextIndex; //!< Index to the byte after the last byte of the last entry element committed by the radio CPU + uint8_t rxData; //!< First byte of the data array of received data entry elements +}; + +//! @} + +//! \addtogroup dataEntryPointer +//! @{ +//! Pointer data entry structure (type = 2) + +struct __RFC_STRUCT rfc_dataEntryPointer_s { + uint8_t* pNextEntry; //!< Pointer to next entry in the queue, NULL if this is the last entry + uint8_t status; //!< Indicates status of entry, including whether it is free for the system CPU to write to + struct { + uint8_t type:2; //!< \brief Type of data entry structure
+ //!< 0: General data entry
+ //!< 1: Multi-element Rx entry
+ //!< 2: Pointer entry
+ //!< 3: Partial read Rx entry + uint8_t lenSz:2; //!< \brief Size of length word in start of each Rx entry element
+ //!< 0: No length indicator
+ //!< 1: One byte length indicator
+ //!< 2: Two bytes length indicator
+ //!< 3: Reserved + uint8_t irqIntv:4; //!< \brief For partial read Rx entry only: The number of bytes between interrupt generated + //!< by the radio CPU (0: 16 bytes) + } config; + uint16_t length; //!< \brief For pointer entries: Number of bytes in the data buffer pointed to
+ //!< For other entries: Number of bytes following this length field + uint8_t* pData; //!< Pointer to data buffer of data to be received ro transmitted +}; + +//! @} + +//! \addtogroup dataEntryPartial +//! @{ +//! Partial read data entry structure (type = 3) + +struct __RFC_STRUCT rfc_dataEntryPartial_s { + uint8_t* pNextEntry; //!< Pointer to next entry in the queue, NULL if this is the last entry + uint8_t status; //!< Indicates status of entry, including whether it is free for the system CPU to write to + struct { + uint8_t type:2; //!< \brief Type of data entry structure
+ //!< 0: General data entry
+ //!< 1: Multi-element Rx entry
+ //!< 2: Pointer entry
+ //!< 3: Partial read Rx entry + uint8_t lenSz:2; //!< \brief Size of length word in start of each Rx entry element
+ //!< 0: No length indicator
+ //!< 1: One byte length indicator
+ //!< 2: Two bytes length indicator
+ //!< 3: Reserved + uint8_t irqIntv:4; //!< \brief For partial read Rx entry only: The number of bytes between interrupt generated + //!< by the radio CPU (0: 16 bytes) + } config; + uint16_t length; //!< \brief For pointer entries: Number of bytes in the data buffer pointed to
+ //!< For other entries: Number of bytes following this length field + struct { + uint16_t numElements:13; //!< Number of entry elements committed in the entry + uint16_t bEntryOpen:1; //!< 1 if the entry contains an element that is still open for appending data + uint16_t bFirstCont:1; //!< 1 if the first element is a continuation of the last packet from the previous entry + uint16_t bLastCont:1; //!< 1 if the packet in the last element continues in the next entry + } pktStatus; + uint16_t nextIndex; //!< Index to the byte after the last byte of the last entry element committed by the radio CPU + uint8_t rxData; //!< First byte of the data array of received data entry elements +}; + +//! @} + +//! @} +//! @} +#endif /* DATA_ENTRY_H_ */ diff --git a/cpu/cc26xx/dev/rfc-api/ieee_cmd.h b/cpu/cc26xx-cc13xx/rf-core/api/ieee_cmd.h similarity index 97% rename from cpu/cc26xx/dev/rfc-api/ieee_cmd.h rename to cpu/cc26xx-cc13xx/rf-core/api/ieee_cmd.h index e06207053..62f9abd32 100644 --- a/cpu/cc26xx/dev/rfc-api/ieee_cmd.h +++ b/cpu/cc26xx-cc13xx/rf-core/api/ieee_cmd.h @@ -1,614 +1,611 @@ -/****************************************************************************** -* Filename: ieee_cmd.h -* Revised: $ $ -* Revision: $ $ -* -* Description: CC26xx/CC13xx API for IEEE 802.15.4 commands -* -* Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ -* -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* -* Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* -* Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* -* Neither the name of Texas Instruments Incorporated nor the names of -* its contributors may be used to endorse or promote products derived -* from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -******************************************************************************/ - -#ifndef __IEEE_CMD_H -#define __IEEE_CMD_H - -#ifndef __RFC_STRUCT -#ifdef __GNUC__ -#define __RFC_STRUCT __attribute__ ((aligned (4))) -#else -#define __RFC_STRUCT -#endif -#endif - -//! \addtogroup rfc -//! @{ - -//! \addtogroup ieee_cmd -//! @{ - -#include -#include "mailbox.h" -#include "common_cmd.h" - -typedef struct __RFC_STRUCT rfc_CMD_IEEE_RX_s rfc_CMD_IEEE_RX_t; -typedef struct __RFC_STRUCT rfc_shortAddrEntry_s rfc_shortAddrEntry_t; -typedef struct __RFC_STRUCT rfc_CMD_IEEE_CSMA_s rfc_CMD_IEEE_CSMA_t; -typedef struct __RFC_STRUCT rfc_ieeeAuxSecCtrl_s rfc_ieeeAuxSecCtrl_t; -typedef struct __RFC_STRUCT rfc_ieeeRxCorrCrc_s rfc_ieeeRxCorrCrc_t; -typedef struct __RFC_STRUCT rfc_CMD_IEEE_RX_ACK_s rfc_CMD_IEEE_RX_ACK_t; -typedef struct __RFC_STRUCT rfc_CMD_IEEE_ABORT_BG_s rfc_CMD_IEEE_ABORT_BG_t; -typedef struct __RFC_STRUCT rfc_CMD_IEEE_ED_SCAN_s rfc_CMD_IEEE_ED_SCAN_t; -typedef struct __RFC_STRUCT rfc_ieeeMacHdr_s rfc_ieeeMacHdr_t; -typedef struct __RFC_STRUCT rfc_CMD_IEEE_ABORT_FG_s rfc_CMD_IEEE_ABORT_FG_t; -typedef struct __RFC_STRUCT rfc_CMD_IEEE_CCA_REQ_s rfc_CMD_IEEE_CCA_REQ_t; -typedef struct __RFC_STRUCT rfc_CMD_IEEE_SETUP_s rfc_CMD_IEEE_SETUP_t; -typedef struct __RFC_STRUCT rfc_ieeeRxOutput_s rfc_ieeeRxOutput_t; -typedef struct __RFC_STRUCT rfc_CMD_IEEE_MOD_SRC_MATCH_s rfc_CMD_IEEE_MOD_SRC_MATCH_t; -typedef struct __RFC_STRUCT rfc_CMD_IEEE_STOP_FG_s rfc_CMD_IEEE_STOP_FG_t; -typedef struct __RFC_STRUCT rfc_CMD_IEEE_TX_s rfc_CMD_IEEE_TX_t; -typedef struct __RFC_STRUCT rfc_CMD_IEEE_MOD_FILT_s rfc_CMD_IEEE_MOD_FILT_t; -typedef struct __RFC_STRUCT rfc_CMD_IEEE_MOD_CCA_s rfc_CMD_IEEE_MOD_CCA_t; - -//! \addtogroup CMD_IEEE_RX -//! @{ -#define CMD_IEEE_RX 0x2801 -struct __RFC_STRUCT rfc_CMD_IEEE_RX_s { - uint16_t commandNo; //!< The command ID number 0x2801 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - uint8_t channel; //!< \brief Channel to tune to in the start of the operation
- //!< 0: Use existing channel
- //!< 11–26: Use as IEEE 802.15.4 channel, i.e. frequency is (2405 + 5 × (channel - 11)) MHz
- //!< 60–207: Frequency is (2300 + channel) MHz
- //!< Others: Reserved - struct { - uint8_t bAutoFlushCrc:1; //!< If 1, automatically remove packets with CRC error from Rx queue - uint8_t bAutoFlushIgn:1; //!< If 1, automatically remove packets that can be ignored according to frame filtering from Rx queue - uint8_t bIncludePhyHdr:1; //!< If 1, include the received PHY header field in the stored packet; otherwise discard it - uint8_t bIncludeCrc:1; //!< If 1, include the received CRC field in the stored packet; otherwise discard it - uint8_t bAppendRssi:1; //!< If 1, append an RSSI byte to the packet in the Rx queue - uint8_t bAppendCorrCrc:1; //!< If 1, append a correlation value and CRC result byte to the packet in the Rx queue - uint8_t bAppendSrcInd:1; //!< If 1, append an index from the source matching algorithm - uint8_t bAppendTimestamp:1; //!< If 1, append a timestamp to the packet in the Rx queue - } rxConfig; - dataQueue_t* pRxQ; //!< Pointer to receive queue - rfc_ieeeRxOutput_t *pOutput; //!< Pointer to output structure (NULL: Do not store results) - struct { - uint16_t frameFiltEn:1; //!< \brief 0: Disable frame filtering
- //!< 1: Enable frame filtering - uint16_t frameFiltStop:1; //!< \brief 0: Receive all packets to the end
- //!< 1: Stop receiving frame once frame filtering has caused the frame to be rejected. - uint16_t autoAckEn:1; //!< \brief 0: Disable auto ACK
- //!< 1: Enable auto ACK. - uint16_t slottedAckEn:1; //!< \brief 0: Non-slotted ACK
- //!< 1: Slotted ACK. - uint16_t autoPendEn:1; //!< \brief 0: Auto-pend disabled
- //!< 1: Auto-pend enabled - uint16_t defaultPend:1; //!< The value of the pending data bit in auto ACK packets that are not subject to auto-pend - uint16_t bPendDataReqOnly:1; //!< \brief 0: Use auto-pend for any packet
- //!< 1: Use auto-pend for data request packets only - uint16_t bPanCoord:1; //!< \brief 0: Device is not PAN coordinator
- //!< 1: Device is PAN coordinator - uint16_t maxFrameVersion:2; //!< Reject frames where the frame version field in the FCF is greater than this value - uint16_t fcfReservedMask:3; //!< Value to be AND-ed with the reserved part of the FCF; frame rejected if result is non-zero - uint16_t modifyFtFilter:2; //!< \brief Treatment of MSB of frame type field before frame-type filtering:
- //!< 0: No modification
- //!< 1: Invert MSB
- //!< 2: Set MSB to 0
- //!< 3: Set MSB to 1 - uint16_t bStrictLenFilter:1; //!< \brief 0: Accept acknowledgement frames of any length >= 5
- //!< 1: Accept only acknowledgement frames of length 5 - } frameFiltOpt; //!< Frame filtering options - struct { - uint8_t bAcceptFt0Beacon:1; //!< \brief Treatment of frames with frame type 000 (beacon):
- //!< 0: Reject
- //!< 1: Accept - uint8_t bAcceptFt1Data:1; //!< \brief Treatment of frames with frame type 001 (data):
- //!< 0: Reject
- //!< 1: Accept - uint8_t bAcceptFt2Ack:1; //!< \brief Treatment of frames with frame type 010 (ACK):
- //!< 0: Reject, unless running ACK receive command
- //!< 1: Always accept - uint8_t bAcceptFt3MacCmd:1; //!< \brief Treatment of frames with frame type 011 (MAC command):
- //!< 0: Reject
- //!< 1: Accept - uint8_t bAcceptFt4Reserved:1; //!< \brief Treatment of frames with frame type 100 (reserved):
- //!< 0: Reject
- //!< 1: Accept - uint8_t bAcceptFt5Reserved:1; //!< \brief Treatment of frames with frame type 101 (reserved):
- //!< 0: Reject
- //!< 1: Accept - uint8_t bAcceptFt6Reserved:1; //!< \brief Treatment of frames with frame type 110 (reserved):
- //!< 0: Reject
- //!< 1: Accept - uint8_t bAcceptFt7Reserved:1; //!< \brief Treatment of frames with frame type 111 (reserved):
- //!< 0: Reject
- //!< 1: Accept - } frameTypes; //!< Frame types to receive in frame filtering - struct { - uint8_t ccaEnEnergy:1; //!< Enable energy scan as CCA source - uint8_t ccaEnCorr:1; //!< Enable correlator based carrier sense as CCA source - uint8_t ccaEnSync:1; //!< Enable sync found based carrier sense as CCA source - uint8_t ccaCorrOp:1; //!< \brief Operator to use between energy based and correlator based CCA
- //!< 0: Report busy channel if either ccaEnergy or ccaCorr are busy
- //!< 1: Report busy channel if both ccaEnergy and ccaCorr are busy - uint8_t ccaSyncOp:1; //!< \brief Operator to use between sync found based CCA and the others
- //!< 0: Always report busy channel if ccaSync is busy
- //!< 1: Always report idle channel if ccaSync is idle - uint8_t ccaCorrThr:2; //!< Threshold for number of correlation peaks in correlator based carrier sense - } ccaOpt; //!< CCA options - int8_t ccaRssiThr; //!< RSSI threshold for CCA - uint8_t __dummy0; - uint8_t numExtEntries; //!< Number of extended address entries - uint8_t numShortEntries; //!< Number of short address entries - uint32_t* pExtEntryList; //!< Pointer to list of extended address entries - rfc_shortAddrEntry_t *pShortEntryList;//!< Pointer to list of short address entries - uint64_t localExtAddr; //!< The extended address of the local device - uint16_t localShortAddr; //!< The short address of the local device - uint16_t localPanID; //!< The PAN ID of the local device - uint16_t __dummy1; - uint8_t __dummy2; - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } endTrigger; //!< Trigger that causes the device to end the Rx operation - ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to end the Rx - //!< operation -}; - -//! @} - -//! \addtogroup CMD_IEEE_ED_SCAN -//! @{ -#define CMD_IEEE_ED_SCAN 0x2802 -struct __RFC_STRUCT rfc_CMD_IEEE_ED_SCAN_s { - uint16_t commandNo; //!< The command ID number 0x2802 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - uint8_t channel; //!< \brief Channel to tune to in the start of the operation
- //!< 0: Use existing channel
- //!< 11–26: Use as IEEE 802.15.4 channel, i.e. frequency is (2405 + 5 × (channel - 11)) MHz
- //!< 60–207: Frequency is (2300 + channel) MHz
- //!< Others: Reserved - struct { - uint8_t ccaEnEnergy:1; //!< Enable energy scan as CCA source - uint8_t ccaEnCorr:1; //!< Enable correlator based carrier sense as CCA source - uint8_t ccaEnSync:1; //!< Enable sync found based carrier sense as CCA source - uint8_t ccaCorrOp:1; //!< \brief Operator to use between energy based and correlator based CCA
- //!< 0: Report busy channel if either ccaEnergy or ccaCorr are busy
- //!< 1: Report busy channel if both ccaEnergy and ccaCorr are busy - uint8_t ccaSyncOp:1; //!< \brief Operator to use between sync found based CCA and the others
- //!< 0: Always report busy channel if ccaSync is busy
- //!< 1: Always report idle channel if ccaSync is idle - uint8_t ccaCorrThr:2; //!< Threshold for number of correlation peaks in correlator based carrier sense - } ccaOpt; //!< CCA options - int8_t ccaRssiThr; //!< RSSI threshold for CCA - uint8_t __dummy0; - int8_t maxRssi; //!< The maximum RSSI recorded during the ED scan - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } endTrigger; //!< Trigger that causes the device to end the Rx operation - ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to end the Rx - //!< operation -}; - -//! @} - -//! \addtogroup CMD_IEEE_TX -//! @{ -#define CMD_IEEE_TX 0x2C01 -struct __RFC_STRUCT rfc_CMD_IEEE_TX_s { - uint16_t commandNo; //!< The command ID number 0x2C01 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - struct { - uint8_t bIncludePhyHdr:1; //!< \brief 0: Find PHY header automatically
- //!< 1: Insert PHY header from the buffer - uint8_t bIncludeCrc:1; //!< \brief 0: Append automatically calculated CRC
- //!< 1: Insert FCS (CRC) from the buffer - uint8_t :1; - uint8_t payloadLenMsb:5; //!< \brief Most significant bits of payload length. Should only be non-zero to create long - //!< non-standard packets for test purposes - } txOpt; - uint8_t payloadLen; //!< Number of bytes in the payload - uint8_t* pPayload; //!< Pointer to payload buffer of size payloadLen - ratmr_t timeStamp; //!< Time stamp of transmitted frame -}; - -//! @} - -//! \addtogroup CMD_IEEE_CSMA -//! @{ -#define CMD_IEEE_CSMA 0x2C02 -struct __RFC_STRUCT rfc_CMD_IEEE_CSMA_s { - uint16_t commandNo; //!< The command ID number 0x2C02 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - uint16_t randomState; //!< The state of the pseudo-random generator - uint8_t macMaxBE; //!< The IEEE 802.15.4 MAC parameter macMaxBE - uint8_t macMaxCSMABackoffs; //!< The IEEE 802.15.4 MAC parameter macMaxCSMABackoffs - struct { - uint8_t initCW:5; //!< The initialization value for the CW parameter - uint8_t bSlotted:1; //!< \brief 0: non-slotted CSMA
- //!< 1: slotted CSMA - uint8_t rxOffMode:2; //!< \brief 0: RX stays on during CSMA backoffs
- //!< 1: The CSMA-CA algorithm will suspend the receiver if no frame is being received
- //!< 2: The CSMA-CA algorithm will suspend the receiver if no frame is being received, - //!< or after finishing it (including auto ACK) otherwise
- //!< 3: The CSMA-CA algorithm will suspend the receiver immediately during back-offs - } csmaConfig; - uint8_t NB; //!< The NB parameter from the IEEE 802.15.4 CSMA-CA algorithm - uint8_t BE; //!< The BE parameter from the IEEE 802.15.4 CSMA-CA algorithm - uint8_t remainingPeriods; //!< The number of remaining periods from a paused backoff countdown - int8_t lastRssi; //!< RSSI measured at the last CCA operation - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } endTrigger; //!< Trigger that causes the device to end the CSMA-CA operation - ratmr_t lastTimeStamp; //!< Time of the last CCA operation - ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to end the - //!< CSMA-CA operation -}; - -//! @} - -//! \addtogroup CMD_IEEE_RX_ACK -//! @{ -#define CMD_IEEE_RX_ACK 0x2C03 -struct __RFC_STRUCT rfc_CMD_IEEE_RX_ACK_s { - uint16_t commandNo; //!< The command ID number 0x2C03 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; - uint8_t seqNo; //!< Sequence number to expect - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } endTrigger; //!< Trigger that causes the device to give up acknowledgement reception - ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to give up - //!< acknowledgement reception -}; - -//! @} - -//! \addtogroup CMD_IEEE_ABORT_BG -//! @{ -#define CMD_IEEE_ABORT_BG 0x2C04 -struct __RFC_STRUCT rfc_CMD_IEEE_ABORT_BG_s { - uint16_t commandNo; //!< The command ID number 0x2C04 - uint16_t status; //!< \brief An integer telling the status of the command. This value is - //!< updated by the radio CPU during operation and may be read by the - //!< system CPU at any time. - rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done - ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) - struct { - uint8_t triggerType:4; //!< The type of trigger - uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
- //!< 1: CMD_TRIGGER can be used as an alternative trigger - uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action - uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
- //!< 1: A trigger in the past is triggered as soon as possible - } startTrigger; //!< Identification of the trigger that starts the operation - struct { - uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed - uint8_t nSkip:4; //!< Number of skips if the rule involves skipping - } condition; -}; - -//! @} - -//! \addtogroup CMD_IEEE_MOD_CCA -//! @{ -#define CMD_IEEE_MOD_CCA 0x2001 -struct __RFC_STRUCT rfc_CMD_IEEE_MOD_CCA_s { - uint16_t commandNo; //!< The command ID number 0x2001 - struct { - uint8_t ccaEnEnergy:1; //!< Enable energy scan as CCA source - uint8_t ccaEnCorr:1; //!< Enable correlator based carrier sense as CCA source - uint8_t ccaEnSync:1; //!< Enable sync found based carrier sense as CCA source - uint8_t ccaCorrOp:1; //!< \brief Operator to use between energy based and correlator based CCA
- //!< 0: Report busy channel if either ccaEnergy or ccaCorr are busy
- //!< 1: Report busy channel if both ccaEnergy and ccaCorr are busy - uint8_t ccaSyncOp:1; //!< \brief Operator to use between sync found based CCA and the others
- //!< 0: Always report busy channel if ccaSync is busy
- //!< 1: Always report idle channel if ccaSync is idle - uint8_t ccaCorrThr:2; //!< Threshold for number of correlation peaks in correlator based carrier sense - } newCcaOpt; //!< New value of ccaOpt for the running background level operation - int8_t newCcaRssiThr; //!< New value of ccaRssiThr for the running background level operation -}; - -//! @} - -//! \addtogroup CMD_IEEE_MOD_FILT -//! @{ -#define CMD_IEEE_MOD_FILT 0x2002 -struct __RFC_STRUCT rfc_CMD_IEEE_MOD_FILT_s { - uint16_t commandNo; //!< The command ID number 0x2002 - struct { - uint16_t frameFiltEn:1; //!< \brief 0: Disable frame filtering
- //!< 1: Enable frame filtering - uint16_t frameFiltStop:1; //!< \brief 0: Receive all packets to the end
- //!< 1: Stop receiving frame once frame filtering has caused the frame to be rejected. - uint16_t autoAckEn:1; //!< \brief 0: Disable auto ACK
- //!< 1: Enable auto ACK. - uint16_t slottedAckEn:1; //!< \brief 0: Non-slotted ACK
- //!< 1: Slotted ACK. - uint16_t autoPendEn:1; //!< \brief 0: Auto-pend disabled
- //!< 1: Auto-pend enabled - uint16_t defaultPend:1; //!< The value of the pending data bit in auto ACK packets that are not subject to auto-pend - uint16_t bPendDataReqOnly:1; //!< \brief 0: Use auto-pend for any packet
- //!< 1: Use auto-pend for data request packets only - uint16_t bPanCoord:1; //!< \brief 0: Device is not PAN coordinator
- //!< 1: Device is PAN coordinator - uint16_t maxFrameVersion:2; //!< Reject frames where the frame version field in the FCF is greater than this value - uint16_t fcfReservedMask:3; //!< Value to be AND-ed with the reserved part of the FCF; frame rejected if result is non-zero - uint16_t modifyFtFilter:2; //!< \brief Treatment of MSB of frame type field before frame-type filtering:
- //!< 0: No modification
- //!< 1: Invert MSB
- //!< 2: Set MSB to 0
- //!< 3: Set MSB to 1 - uint16_t bStrictLenFilter:1; //!< \brief 0: Accept acknowledgement frames of any length >= 5
- //!< 1: Accept only acknowledgement frames of length 5 - } newFrameFiltOpt; //!< New value of frameFiltOpt for the running background level operation - struct { - uint8_t bAcceptFt0Beacon:1; //!< \brief Treatment of frames with frame type 000 (beacon):
- //!< 0: Reject
- //!< 1: Accept - uint8_t bAcceptFt1Data:1; //!< \brief Treatment of frames with frame type 001 (data):
- //!< 0: Reject
- //!< 1: Accept - uint8_t bAcceptFt2Ack:1; //!< \brief Treatment of frames with frame type 010 (ACK):
- //!< 0: Reject, unless running ACK receive command
- //!< 1: Always accept - uint8_t bAcceptFt3MacCmd:1; //!< \brief Treatment of frames with frame type 011 (MAC command):
- //!< 0: Reject
- //!< 1: Accept - uint8_t bAcceptFt4Reserved:1; //!< \brief Treatment of frames with frame type 100 (reserved):
- //!< 0: Reject
- //!< 1: Accept - uint8_t bAcceptFt5Reserved:1; //!< \brief Treatment of frames with frame type 101 (reserved):
- //!< 0: Reject
- //!< 1: Accept - uint8_t bAcceptFt6Reserved:1; //!< \brief Treatment of frames with frame type 110 (reserved):
- //!< 0: Reject
- //!< 1: Accept - uint8_t bAcceptFt7Reserved:1; //!< \brief Treatment of frames with frame type 111 (reserved):
- //!< 0: Reject
- //!< 1: Accept - } newFrameTypes; //!< New value of frameTypes for the running background level operation -}; - -//! @} - -//! \addtogroup CMD_IEEE_MOD_SRC_MATCH -//! @{ -#define CMD_IEEE_MOD_SRC_MATCH 0x2003 -struct __RFC_STRUCT rfc_CMD_IEEE_MOD_SRC_MATCH_s { - uint16_t commandNo; //!< The command ID number 0x2003 - struct { - uint8_t bEnable:1; //!< \brief 0: Disable entry
- //!< 1: Enable entry - uint8_t srcPend:1; //!< New value of the pending bit for the entry - uint8_t entryType:1; //!< \brief 0: Extended address
- //!< 1: Short address - } options; - uint8_t entryNo; //!< Index of entry to enable or disable -}; - -//! @} - -//! \addtogroup CMD_IEEE_ABORT_FG -//! @{ -#define CMD_IEEE_ABORT_FG 0x2401 -struct __RFC_STRUCT rfc_CMD_IEEE_ABORT_FG_s { - uint16_t commandNo; //!< The command ID number 0x2401 -}; - -//! @} - -//! \addtogroup CMD_IEEE_STOP_FG -//! @{ -#define CMD_IEEE_STOP_FG 0x2402 -struct __RFC_STRUCT rfc_CMD_IEEE_STOP_FG_s { - uint16_t commandNo; //!< The command ID number 0x2402 -}; - -//! @} - -//! \addtogroup CMD_IEEE_CCA_REQ -//! @{ -#define CMD_IEEE_CCA_REQ 0x2403 -struct __RFC_STRUCT rfc_CMD_IEEE_CCA_REQ_s { - uint16_t commandNo; //!< The command ID number 0x2403 - int8_t currentRssi; //!< The RSSI currently observed on the channel - int8_t maxRssi; //!< The maximum RSSI observed on the channel since Rx was started - struct { - uint8_t ccaState:2; //!< \brief Value of the current CCA state
- //!< 0: Idle
- //!< 1: Busy
- //!< 2: Invalid - uint8_t ccaEnergy:2; //!< \brief Value of the current energy detect CCA state
- //!< 0: Idle
- //!< 1: Busy
- //!< 2: Invalid - uint8_t ccaCorr:2; //!< \brief Value of the current correlator based carrier sense CCA state
- //!< 0: Idle
- //!< 1: Busy
- //!< 2: Invalid - uint8_t ccaSync:1; //!< \brief Value of the current sync found based carrier sense CCA state
- //!< 0: Idle
- //!< 1: Busy - } ccaInfo; -}; - -//! @} - -//! \addtogroup ieeeRxOutput -//! @{ -//! Output structure for CMD_IEEE_RX - -struct __RFC_STRUCT rfc_ieeeRxOutput_s { - uint8_t nTxAck; //!< Total number of transmitted ACK frames - uint8_t nRxBeacon; //!< Number of received beacon frames - uint8_t nRxData; //!< Number of received data frames - uint8_t nRxAck; //!< Number of received acknowledgement frames - uint8_t nRxMacCmd; //!< Number of received MAC command frames - uint8_t nRxReserved; //!< Number of received frames with reserved frame type - uint8_t nRxNok; //!< Number of received frames with CRC error - uint8_t nRxIgnored; //!< Number of frames received that are to be ignored - uint8_t nRxBufFull; //!< Number of received frames discarded because the Rx buffer was full - int8_t lastRssi; //!< RSSI of last received frame - int8_t maxRssi; //!< Highest RSSI observed in the operation - uint8_t __dummy0; - ratmr_t beaconTimeStamp; //!< Time stamp of last received beacon frame -}; - -//! @} - -//! \addtogroup shortAddrEntry -//! @{ -//! Structure for short address entries - -struct __RFC_STRUCT rfc_shortAddrEntry_s { - uint16_t shortAddr; //!< Short address - uint16_t panId; //!< PAN ID -}; - -//! @} - -//! \addtogroup ieeeRxCorrCrc -//! @{ -//! Receive status byte that may be appended to message in receive buffer - -struct __RFC_STRUCT rfc_ieeeRxCorrCrc_s { - struct { - uint8_t corr:6; //!< The correlation value - uint8_t bIgnore:1; //!< 1 if the packet should be rejected by frame filtering, 0 otherwise - uint8_t bCrcErr:1; //!< 1 if the packet was received with CRC error, 0 otherwise - } status; -}; - -//! @} - -//! @} -//! @} -#endif +/****************************************************************************** +* Filename: ieee_cmd.h +* Revised: $ $ +* Revision: $ $ +* +* Description: CC26xx/CC13xx API for IEEE 802.15.4 commands +* +* Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ +* +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* +* Neither the name of Texas Instruments Incorporated nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +******************************************************************************/ + +#ifndef IEEE_CMD_H_ +#define IEEE_CMD_H_ + +#ifndef __RFC_STRUCT +#ifdef __GNUC__ +#define __RFC_STRUCT __attribute__ ((aligned (4))) +#else +#define __RFC_STRUCT +#endif +#endif + +//! \addtogroup rfc +//! @{ + +//! \addtogroup ieee_cmd +//! @{ + +#include +#include "mailbox.h" +#include "common_cmd.h" + +typedef struct __RFC_STRUCT rfc_CMD_IEEE_RX_s rfc_CMD_IEEE_RX_t; +typedef struct __RFC_STRUCT rfc_CMD_IEEE_ED_SCAN_s rfc_CMD_IEEE_ED_SCAN_t; +typedef struct __RFC_STRUCT rfc_CMD_IEEE_TX_s rfc_CMD_IEEE_TX_t; +typedef struct __RFC_STRUCT rfc_CMD_IEEE_CSMA_s rfc_CMD_IEEE_CSMA_t; +typedef struct __RFC_STRUCT rfc_CMD_IEEE_RX_ACK_s rfc_CMD_IEEE_RX_ACK_t; +typedef struct __RFC_STRUCT rfc_CMD_IEEE_ABORT_BG_s rfc_CMD_IEEE_ABORT_BG_t; +typedef struct __RFC_STRUCT rfc_CMD_IEEE_MOD_CCA_s rfc_CMD_IEEE_MOD_CCA_t; +typedef struct __RFC_STRUCT rfc_CMD_IEEE_MOD_FILT_s rfc_CMD_IEEE_MOD_FILT_t; +typedef struct __RFC_STRUCT rfc_CMD_IEEE_MOD_SRC_MATCH_s rfc_CMD_IEEE_MOD_SRC_MATCH_t; +typedef struct __RFC_STRUCT rfc_CMD_IEEE_ABORT_FG_s rfc_CMD_IEEE_ABORT_FG_t; +typedef struct __RFC_STRUCT rfc_CMD_IEEE_STOP_FG_s rfc_CMD_IEEE_STOP_FG_t; +typedef struct __RFC_STRUCT rfc_CMD_IEEE_CCA_REQ_s rfc_CMD_IEEE_CCA_REQ_t; +typedef struct __RFC_STRUCT rfc_ieeeRxOutput_s rfc_ieeeRxOutput_t; +typedef struct __RFC_STRUCT rfc_shortAddrEntry_s rfc_shortAddrEntry_t; +typedef struct __RFC_STRUCT rfc_ieeeRxCorrCrc_s rfc_ieeeRxCorrCrc_t; + +//! \addtogroup CMD_IEEE_RX +//! @{ +#define CMD_IEEE_RX 0x2801 +struct __RFC_STRUCT rfc_CMD_IEEE_RX_s { + uint16_t commandNo; //!< The command ID number 0x2801 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint8_t channel; //!< \brief Channel to tune to in the start of the operation
+ //!< 0: Use existing channel
+ //!< 11–26: Use as IEEE 802.15.4 channel, i.e. frequency is (2405 + 5 × (channel - 11)) MHz
+ //!< 60–207: Frequency is (2300 + channel) MHz
+ //!< Others: Reserved + struct { + uint8_t bAutoFlushCrc:1; //!< If 1, automatically remove packets with CRC error from Rx queue + uint8_t bAutoFlushIgn:1; //!< If 1, automatically remove packets that can be ignored according to frame filtering from Rx queue + uint8_t bIncludePhyHdr:1; //!< If 1, include the received PHY header field in the stored packet; otherwise discard it + uint8_t bIncludeCrc:1; //!< If 1, include the received CRC field in the stored packet; otherwise discard it + uint8_t bAppendRssi:1; //!< If 1, append an RSSI byte to the packet in the Rx queue + uint8_t bAppendCorrCrc:1; //!< If 1, append a correlation value and CRC result byte to the packet in the Rx queue + uint8_t bAppendSrcInd:1; //!< If 1, append an index from the source matching algorithm + uint8_t bAppendTimestamp:1; //!< If 1, append a timestamp to the packet in the Rx queue + } rxConfig; + dataQueue_t* pRxQ; //!< Pointer to receive queue + rfc_ieeeRxOutput_t *pOutput; //!< Pointer to output structure (NULL: Do not store results) + struct { + uint16_t frameFiltEn:1; //!< \brief 0: Disable frame filtering
+ //!< 1: Enable frame filtering + uint16_t frameFiltStop:1; //!< \brief 0: Receive all packets to the end
+ //!< 1: Stop receiving frame once frame filtering has caused the frame to be rejected. + uint16_t autoAckEn:1; //!< \brief 0: Disable auto ACK
+ //!< 1: Enable auto ACK. + uint16_t slottedAckEn:1; //!< \brief 0: Non-slotted ACK
+ //!< 1: Slotted ACK. + uint16_t autoPendEn:1; //!< \brief 0: Auto-pend disabled
+ //!< 1: Auto-pend enabled + uint16_t defaultPend:1; //!< The value of the pending data bit in auto ACK packets that are not subject to auto-pend + uint16_t bPendDataReqOnly:1; //!< \brief 0: Use auto-pend for any packet
+ //!< 1: Use auto-pend for data request packets only + uint16_t bPanCoord:1; //!< \brief 0: Device is not PAN coordinator
+ //!< 1: Device is PAN coordinator + uint16_t maxFrameVersion:2; //!< Reject frames where the frame version field in the FCF is greater than this value + uint16_t fcfReservedMask:3; //!< Value to be AND-ed with the reserved part of the FCF; frame rejected if result is non-zero + uint16_t modifyFtFilter:2; //!< \brief Treatment of MSB of frame type field before frame-type filtering:
+ //!< 0: No modification
+ //!< 1: Invert MSB
+ //!< 2: Set MSB to 0
+ //!< 3: Set MSB to 1 + uint16_t bStrictLenFilter:1; //!< \brief 0: Accept acknowledgement frames of any length >= 5
+ //!< 1: Accept only acknowledgement frames of length 5 + } frameFiltOpt; //!< Frame filtering options + struct { + uint8_t bAcceptFt0Beacon:1; //!< \brief Treatment of frames with frame type 000 (beacon):
+ //!< 0: Reject
+ //!< 1: Accept + uint8_t bAcceptFt1Data:1; //!< \brief Treatment of frames with frame type 001 (data):
+ //!< 0: Reject
+ //!< 1: Accept + uint8_t bAcceptFt2Ack:1; //!< \brief Treatment of frames with frame type 010 (ACK):
+ //!< 0: Reject, unless running ACK receive command
+ //!< 1: Always accept + uint8_t bAcceptFt3MacCmd:1; //!< \brief Treatment of frames with frame type 011 (MAC command):
+ //!< 0: Reject
+ //!< 1: Accept + uint8_t bAcceptFt4Reserved:1; //!< \brief Treatment of frames with frame type 100 (reserved):
+ //!< 0: Reject
+ //!< 1: Accept + uint8_t bAcceptFt5Reserved:1; //!< \brief Treatment of frames with frame type 101 (reserved):
+ //!< 0: Reject
+ //!< 1: Accept + uint8_t bAcceptFt6Reserved:1; //!< \brief Treatment of frames with frame type 110 (reserved):
+ //!< 0: Reject
+ //!< 1: Accept + uint8_t bAcceptFt7Reserved:1; //!< \brief Treatment of frames with frame type 111 (reserved):
+ //!< 0: Reject
+ //!< 1: Accept + } frameTypes; //!< Frame types to receive in frame filtering + struct { + uint8_t ccaEnEnergy:1; //!< Enable energy scan as CCA source + uint8_t ccaEnCorr:1; //!< Enable correlator based carrier sense as CCA source + uint8_t ccaEnSync:1; //!< Enable sync found based carrier sense as CCA source + uint8_t ccaCorrOp:1; //!< \brief Operator to use between energy based and correlator based CCA
+ //!< 0: Report busy channel if either ccaEnergy or ccaCorr are busy
+ //!< 1: Report busy channel if both ccaEnergy and ccaCorr are busy + uint8_t ccaSyncOp:1; //!< \brief Operator to use between sync found based CCA and the others
+ //!< 0: Always report busy channel if ccaSync is busy
+ //!< 1: Always report idle channel if ccaSync is idle + uint8_t ccaCorrThr:2; //!< Threshold for number of correlation peaks in correlator based carrier sense + } ccaOpt; //!< CCA options + int8_t ccaRssiThr; //!< RSSI threshold for CCA + uint8_t __dummy0; + uint8_t numExtEntries; //!< Number of extended address entries + uint8_t numShortEntries; //!< Number of short address entries + uint32_t* pExtEntryList; //!< Pointer to list of extended address entries + rfc_shortAddrEntry_t *pShortEntryList;//!< Pointer to list of short address entries + uint64_t localExtAddr; //!< The extended address of the local device + uint16_t localShortAddr; //!< The short address of the local device + uint16_t localPanID; //!< The PAN ID of the local device + uint16_t __dummy1; + uint8_t __dummy2; + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } endTrigger; //!< Trigger that causes the device to end the Rx operation + ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to end the Rx + //!< operation +}; + +//! @} + +//! \addtogroup CMD_IEEE_ED_SCAN +//! @{ +#define CMD_IEEE_ED_SCAN 0x2802 +struct __RFC_STRUCT rfc_CMD_IEEE_ED_SCAN_s { + uint16_t commandNo; //!< The command ID number 0x2802 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint8_t channel; //!< \brief Channel to tune to in the start of the operation
+ //!< 0: Use existing channel
+ //!< 11–26: Use as IEEE 802.15.4 channel, i.e. frequency is (2405 + 5 × (channel - 11)) MHz
+ //!< 60–207: Frequency is (2300 + channel) MHz
+ //!< Others: Reserved + struct { + uint8_t ccaEnEnergy:1; //!< Enable energy scan as CCA source + uint8_t ccaEnCorr:1; //!< Enable correlator based carrier sense as CCA source + uint8_t ccaEnSync:1; //!< Enable sync found based carrier sense as CCA source + uint8_t ccaCorrOp:1; //!< \brief Operator to use between energy based and correlator based CCA
+ //!< 0: Report busy channel if either ccaEnergy or ccaCorr are busy
+ //!< 1: Report busy channel if both ccaEnergy and ccaCorr are busy + uint8_t ccaSyncOp:1; //!< \brief Operator to use between sync found based CCA and the others
+ //!< 0: Always report busy channel if ccaSync is busy
+ //!< 1: Always report idle channel if ccaSync is idle + uint8_t ccaCorrThr:2; //!< Threshold for number of correlation peaks in correlator based carrier sense + } ccaOpt; //!< CCA options + int8_t ccaRssiThr; //!< RSSI threshold for CCA + uint8_t __dummy0; + int8_t maxRssi; //!< The maximum RSSI recorded during the ED scan + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } endTrigger; //!< Trigger that causes the device to end the Rx operation + ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to end the Rx + //!< operation +}; + +//! @} + +//! \addtogroup CMD_IEEE_TX +//! @{ +#define CMD_IEEE_TX 0x2C01 +struct __RFC_STRUCT rfc_CMD_IEEE_TX_s { + uint16_t commandNo; //!< The command ID number 0x2C01 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + struct { + uint8_t bIncludePhyHdr:1; //!< \brief 0: Find PHY header automatically
+ //!< 1: Insert PHY header from the buffer + uint8_t bIncludeCrc:1; //!< \brief 0: Append automatically calculated CRC
+ //!< 1: Insert FCS (CRC) from the buffer + uint8_t :1; + uint8_t payloadLenMsb:5; //!< \brief Most significant bits of payload length. Should only be non-zero to create long + //!< non-standard packets for test purposes + } txOpt; + uint8_t payloadLen; //!< Number of bytes in the payload + uint8_t* pPayload; //!< Pointer to payload buffer of size payloadLen + ratmr_t timeStamp; //!< Time stamp of transmitted frame +}; + +//! @} + +//! \addtogroup CMD_IEEE_CSMA +//! @{ +#define CMD_IEEE_CSMA 0x2C02 +struct __RFC_STRUCT rfc_CMD_IEEE_CSMA_s { + uint16_t commandNo; //!< The command ID number 0x2C02 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint16_t randomState; //!< The state of the pseudo-random generator + uint8_t macMaxBE; //!< The IEEE 802.15.4 MAC parameter macMaxBE + uint8_t macMaxCSMABackoffs; //!< The IEEE 802.15.4 MAC parameter macMaxCSMABackoffs + struct { + uint8_t initCW:5; //!< The initialization value for the CW parameter + uint8_t bSlotted:1; //!< \brief 0: non-slotted CSMA
+ //!< 1: slotted CSMA + uint8_t rxOffMode:2; //!< \brief 0: RX stays on during CSMA backoffs
+ //!< 1: The CSMA-CA algorithm will suspend the receiver if no frame is being received
+ //!< 2: The CSMA-CA algorithm will suspend the receiver if no frame is being received, + //!< or after finishing it (including auto ACK) otherwise
+ //!< 3: The CSMA-CA algorithm will suspend the receiver immediately during back-offs + } csmaConfig; + uint8_t NB; //!< The NB parameter from the IEEE 802.15.4 CSMA-CA algorithm + uint8_t BE; //!< The BE parameter from the IEEE 802.15.4 CSMA-CA algorithm + uint8_t remainingPeriods; //!< The number of remaining periods from a paused backoff countdown + int8_t lastRssi; //!< RSSI measured at the last CCA operation + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } endTrigger; //!< Trigger that causes the device to end the CSMA-CA operation + ratmr_t lastTimeStamp; //!< Time of the last CCA operation + ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to end the + //!< CSMA-CA operation +}; + +//! @} + +//! \addtogroup CMD_IEEE_RX_ACK +//! @{ +#define CMD_IEEE_RX_ACK 0x2C03 +struct __RFC_STRUCT rfc_CMD_IEEE_RX_ACK_s { + uint16_t commandNo; //!< The command ID number 0x2C03 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + uint8_t seqNo; //!< Sequence number to expect + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } endTrigger; //!< Trigger that causes the device to give up acknowledgement reception + ratmr_t endTime; //!< \brief Time used together with endTrigger that causes the device to give up + //!< acknowledgement reception +}; + +//! @} + +//! \addtogroup CMD_IEEE_ABORT_BG +//! @{ +#define CMD_IEEE_ABORT_BG 0x2C04 +struct __RFC_STRUCT rfc_CMD_IEEE_ABORT_BG_s { + uint16_t commandNo; //!< The command ID number 0x2C04 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; +}; + +//! @} + +//! \addtogroup CMD_IEEE_MOD_CCA +//! @{ +#define CMD_IEEE_MOD_CCA 0x2001 +struct __RFC_STRUCT rfc_CMD_IEEE_MOD_CCA_s { + uint16_t commandNo; //!< The command ID number 0x2001 + struct { + uint8_t ccaEnEnergy:1; //!< Enable energy scan as CCA source + uint8_t ccaEnCorr:1; //!< Enable correlator based carrier sense as CCA source + uint8_t ccaEnSync:1; //!< Enable sync found based carrier sense as CCA source + uint8_t ccaCorrOp:1; //!< \brief Operator to use between energy based and correlator based CCA
+ //!< 0: Report busy channel if either ccaEnergy or ccaCorr are busy
+ //!< 1: Report busy channel if both ccaEnergy and ccaCorr are busy + uint8_t ccaSyncOp:1; //!< \brief Operator to use between sync found based CCA and the others
+ //!< 0: Always report busy channel if ccaSync is busy
+ //!< 1: Always report idle channel if ccaSync is idle + uint8_t ccaCorrThr:2; //!< Threshold for number of correlation peaks in correlator based carrier sense + } newCcaOpt; //!< New value of ccaOpt for the running background level operation + int8_t newCcaRssiThr; //!< New value of ccaRssiThr for the running background level operation +}; + +//! @} + +//! \addtogroup CMD_IEEE_MOD_FILT +//! @{ +#define CMD_IEEE_MOD_FILT 0x2002 +struct __RFC_STRUCT rfc_CMD_IEEE_MOD_FILT_s { + uint16_t commandNo; //!< The command ID number 0x2002 + struct { + uint16_t frameFiltEn:1; //!< \brief 0: Disable frame filtering
+ //!< 1: Enable frame filtering + uint16_t frameFiltStop:1; //!< \brief 0: Receive all packets to the end
+ //!< 1: Stop receiving frame once frame filtering has caused the frame to be rejected. + uint16_t autoAckEn:1; //!< \brief 0: Disable auto ACK
+ //!< 1: Enable auto ACK. + uint16_t slottedAckEn:1; //!< \brief 0: Non-slotted ACK
+ //!< 1: Slotted ACK. + uint16_t autoPendEn:1; //!< \brief 0: Auto-pend disabled
+ //!< 1: Auto-pend enabled + uint16_t defaultPend:1; //!< The value of the pending data bit in auto ACK packets that are not subject to auto-pend + uint16_t bPendDataReqOnly:1; //!< \brief 0: Use auto-pend for any packet
+ //!< 1: Use auto-pend for data request packets only + uint16_t bPanCoord:1; //!< \brief 0: Device is not PAN coordinator
+ //!< 1: Device is PAN coordinator + uint16_t maxFrameVersion:2; //!< Reject frames where the frame version field in the FCF is greater than this value + uint16_t fcfReservedMask:3; //!< Value to be AND-ed with the reserved part of the FCF; frame rejected if result is non-zero + uint16_t modifyFtFilter:2; //!< \brief Treatment of MSB of frame type field before frame-type filtering:
+ //!< 0: No modification
+ //!< 1: Invert MSB
+ //!< 2: Set MSB to 0
+ //!< 3: Set MSB to 1 + uint16_t bStrictLenFilter:1; //!< \brief 0: Accept acknowledgement frames of any length >= 5
+ //!< 1: Accept only acknowledgement frames of length 5 + } newFrameFiltOpt; //!< New value of frameFiltOpt for the running background level operation + struct { + uint8_t bAcceptFt0Beacon:1; //!< \brief Treatment of frames with frame type 000 (beacon):
+ //!< 0: Reject
+ //!< 1: Accept + uint8_t bAcceptFt1Data:1; //!< \brief Treatment of frames with frame type 001 (data):
+ //!< 0: Reject
+ //!< 1: Accept + uint8_t bAcceptFt2Ack:1; //!< \brief Treatment of frames with frame type 010 (ACK):
+ //!< 0: Reject, unless running ACK receive command
+ //!< 1: Always accept + uint8_t bAcceptFt3MacCmd:1; //!< \brief Treatment of frames with frame type 011 (MAC command):
+ //!< 0: Reject
+ //!< 1: Accept + uint8_t bAcceptFt4Reserved:1; //!< \brief Treatment of frames with frame type 100 (reserved):
+ //!< 0: Reject
+ //!< 1: Accept + uint8_t bAcceptFt5Reserved:1; //!< \brief Treatment of frames with frame type 101 (reserved):
+ //!< 0: Reject
+ //!< 1: Accept + uint8_t bAcceptFt6Reserved:1; //!< \brief Treatment of frames with frame type 110 (reserved):
+ //!< 0: Reject
+ //!< 1: Accept + uint8_t bAcceptFt7Reserved:1; //!< \brief Treatment of frames with frame type 111 (reserved):
+ //!< 0: Reject
+ //!< 1: Accept + } newFrameTypes; //!< New value of frameTypes for the running background level operation +}; + +//! @} + +//! \addtogroup CMD_IEEE_MOD_SRC_MATCH +//! @{ +#define CMD_IEEE_MOD_SRC_MATCH 0x2003 +struct __RFC_STRUCT rfc_CMD_IEEE_MOD_SRC_MATCH_s { + uint16_t commandNo; //!< The command ID number 0x2003 + struct { + uint8_t bEnable:1; //!< \brief 0: Disable entry
+ //!< 1: Enable entry + uint8_t srcPend:1; //!< New value of the pending bit for the entry + uint8_t entryType:1; //!< \brief 0: Extended address
+ //!< 1: Short address + } options; + uint8_t entryNo; //!< Index of entry to enable or disable +}; + +//! @} + +//! \addtogroup CMD_IEEE_ABORT_FG +//! @{ +#define CMD_IEEE_ABORT_FG 0x2401 +struct __RFC_STRUCT rfc_CMD_IEEE_ABORT_FG_s { + uint16_t commandNo; //!< The command ID number 0x2401 +}; + +//! @} + +//! \addtogroup CMD_IEEE_STOP_FG +//! @{ +#define CMD_IEEE_STOP_FG 0x2402 +struct __RFC_STRUCT rfc_CMD_IEEE_STOP_FG_s { + uint16_t commandNo; //!< The command ID number 0x2402 +}; + +//! @} + +//! \addtogroup CMD_IEEE_CCA_REQ +//! @{ +#define CMD_IEEE_CCA_REQ 0x2403 +struct __RFC_STRUCT rfc_CMD_IEEE_CCA_REQ_s { + uint16_t commandNo; //!< The command ID number 0x2403 + int8_t currentRssi; //!< The RSSI currently observed on the channel + int8_t maxRssi; //!< The maximum RSSI observed on the channel since Rx was started + struct { + uint8_t ccaState:2; //!< \brief Value of the current CCA state
+ //!< 0: Idle
+ //!< 1: Busy
+ //!< 2: Invalid + uint8_t ccaEnergy:2; //!< \brief Value of the current energy detect CCA state
+ //!< 0: Idle
+ //!< 1: Busy
+ //!< 2: Invalid + uint8_t ccaCorr:2; //!< \brief Value of the current correlator based carrier sense CCA state
+ //!< 0: Idle
+ //!< 1: Busy
+ //!< 2: Invalid + uint8_t ccaSync:1; //!< \brief Value of the current sync found based carrier sense CCA state
+ //!< 0: Idle
+ //!< 1: Busy + } ccaInfo; +}; + +//! @} + +//! \addtogroup ieeeRxOutput +//! @{ +//! Output structure for CMD_IEEE_RX + +struct __RFC_STRUCT rfc_ieeeRxOutput_s { + uint8_t nTxAck; //!< Total number of transmitted ACK frames + uint8_t nRxBeacon; //!< Number of received beacon frames + uint8_t nRxData; //!< Number of received data frames + uint8_t nRxAck; //!< Number of received acknowledgement frames + uint8_t nRxMacCmd; //!< Number of received MAC command frames + uint8_t nRxReserved; //!< Number of received frames with reserved frame type + uint8_t nRxNok; //!< Number of received frames with CRC error + uint8_t nRxIgnored; //!< Number of frames received that are to be ignored + uint8_t nRxBufFull; //!< Number of received frames discarded because the Rx buffer was full + int8_t lastRssi; //!< RSSI of last received frame + int8_t maxRssi; //!< Highest RSSI observed in the operation + uint8_t __dummy0; + ratmr_t beaconTimeStamp; //!< Time stamp of last received beacon frame +}; + +//! @} + +//! \addtogroup shortAddrEntry +//! @{ +//! Structure for short address entries + +struct __RFC_STRUCT rfc_shortAddrEntry_s { + uint16_t shortAddr; //!< Short address + uint16_t panId; //!< PAN ID +}; + +//! @} + +//! \addtogroup ieeeRxCorrCrc +//! @{ +//! Receive status byte that may be appended to message in receive buffer + +struct __RFC_STRUCT rfc_ieeeRxCorrCrc_s { + struct { + uint8_t corr:6; //!< The correlation value + uint8_t bIgnore:1; //!< 1 if the packet should be rejected by frame filtering, 0 otherwise + uint8_t bCrcErr:1; //!< 1 if the packet was received with CRC error, 0 otherwise + } status; +}; + +//! @} + +//! @} +//! @} +#endif /* IEEE_CMD_H_ */ diff --git a/cpu/cc26xx/dev/rfc-api/ieee_mailbox.h b/cpu/cc26xx-cc13xx/rf-core/api/ieee_mailbox.h similarity index 66% rename from cpu/cc26xx/dev/rfc-api/ieee_mailbox.h rename to cpu/cc26xx-cc13xx/rf-core/api/ieee_mailbox.h index 772c4c219..c6784da09 100644 --- a/cpu/cc26xx/dev/rfc-api/ieee_mailbox.h +++ b/cpu/cc26xx-cc13xx/rf-core/api/ieee_mailbox.h @@ -1,107 +1,75 @@ -/****************************************************************************** -* Filename: ieee_mailbox.h -* Revised: $ $ -* Revision: $ $ -* -* Description: Definitions for IEEE 802.15.4 interface -* -* Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* -* Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* -* Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* -* Neither the name of Texas Instruments Incorporated nor the names of -* its contributors may be used to endorse or promote products derived -* from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -******************************************************************************/ - -#ifndef _IEEE_MAILBOX_H -#define _IEEE_MAILBOX_H - -#include "mailbox.h" - -/// \name CPE interrupt definitions for IEEE 802.15.4 -/// Interrupt masks for the CPE interrupt in RDBELL. These are new names for interrupts in mailbox.h, -/// used for compartibility with previous versions with separate interrupt numbers. -///@{ -#define IRQN_IEEE_BG_COMMAND_SUSPENDED IRQN_BG_COMMAND_SUSPENDED -#define IRQN_IEEE_TX_FRAME IRQN_TX_DONE -#define IRQN_IEEE_TX_ACK IRQN_TX_ACK - -#define IRQN_IEEE_RX_FRAME IRQN_RX_OK -#define IRQN_IEEE_RX_NOK IRQN_RX_NOK -#define IRQN_IEEE_RX_IGNORED IRQN_RX_IGNORED -#define IRQN_IEEE_RX_BUF_FULL IRQN_RX_BUF_FULL -#define IRQN_IEEE_RX_ENTRY_DONE IRQN_RX_ENTRY_DONE - -#define IRQ_IEEE_BG_COMMAND_SUSPENDED (1U << IRQN_IEEE_BG_COMMAND_SUSPENDED) -#define IRQ_IEEE_TX_FRAME (1U << IRQN_IEEE_TX_FRAME) -#define IRQ_IEEE_TX_ACK (1U << IRQN_IEEE_TX_ACK) -#define IRQ_IEEE_RX_FRAME (1U << IRQN_IEEE_RX_FRAME) -#define IRQ_IEEE_RX_NOK (1U << IRQN_IEEE_RX_NOK) -#define IRQ_IEEE_RX_IGNORED (1U << IRQN_IEEE_RX_IGNORED) -#define IRQ_IEEE_RX_BUF_FULL (1U << IRQN_IEEE_RX_BUF_FULL) -#define IRQ_IEEE_RX_ENTRY_DONE (1U << IRQN_IEEE_RX_ENTRY_DONE) -///@} - - - -/// \name Radio operation status -/// Radio operation status format: -/// Bits 15:12: Protocol -/// 0010: IEEE 802.15.4 -/// Bits 11:10: Type -/// 00: Not finished -/// 01: Done successfully -/// 10: Done with error -/// Bits 9:0: Identifier - -/// \name Operation not finished -///@{ -#define IEEE_SUSPENDED 0x2001 ///< Operation suspended -///@} -/// \name Operation finished normally -///@{ -#define IEEE_DONE_OK 0x2400 ///< Operation ended normally -#define IEEE_DONE_BUSY 0x2401 ///< CSMA-CA operation ended with failure -#define IEEE_DONE_STOPPED 0x2402 ///< Operation stopped after stop command -#define IEEE_DONE_ACK 0x2403 ///< ACK packet received with pending data bit cleared -#define IEEE_DONE_ACKPEND 0x2404 ///< ACK packet received with pending data bit set -#define IEEE_DONE_TIMEOUT 0x2405 ///< Operation ended due to timeout -#define IEEE_DONE_BGEND 0x2406 ///< FG operation ended because necessary background level - ///< operation ended -#define IEEE_DONE_ABORT 0x2407 ///< Operation aborted by command -///@} -/// \name Operation finished with error -///@{ -#define IEEE_ERROR_PAR 0x2800 ///< Illegal parameter -#define IEEE_ERROR_NO_SETUP 0x2801 ///< Operation using Rx or Tx attemted when not in 15.4 mode -#define IEEE_ERROR_NO_FS 0x2802 ///< Operation using Rx or Tx attemted without frequency synth configured -#define IEEE_ERROR_SYNTH_PROG 0x2803 ///< Synthesizer programming failed to complete on time -#define IEEE_ERROR_RXOVF 0x2804 ///< Receiver overflowed during operation -#define IEEE_ERROR_TXUNF 0x2805 ///< Transmitter underflowed during operation -///@} -///@} - -#endif +/****************************************************************************** +* Filename: ieee_mailbox.h +* Revised: $ $ +* Revision: $ $ +* +* Description: Definitions for IEEE 802.15.4 interface +* +* Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ +* +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* +* Neither the name of Texas Instruments Incorporated nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +******************************************************************************/ + +#ifndef IEEE_MAILBOX_H_ +#define IEEE_MAILBOX_H_ + +#include "mailbox.h" + + +/// \name Radio operation status +///@{ +/// \name Operation not finished +///@{ +#define IEEE_SUSPENDED 0x2001 ///< Operation suspended +///@} +/// \name Operation finished normally +///@{ +#define IEEE_DONE_OK 0x2400 ///< Operation ended normally +#define IEEE_DONE_BUSY 0x2401 ///< CSMA-CA operation ended with failure +#define IEEE_DONE_STOPPED 0x2402 ///< Operation stopped after stop command +#define IEEE_DONE_ACK 0x2403 ///< ACK packet received with pending data bit cleared +#define IEEE_DONE_ACKPEND 0x2404 ///< ACK packet received with pending data bit set +#define IEEE_DONE_TIMEOUT 0x2405 ///< Operation ended due to timeout +#define IEEE_DONE_BGEND 0x2406 ///< FG operation ended because necessary background level + ///< operation ended +#define IEEE_DONE_ABORT 0x2407 ///< Operation aborted by command +///@} +/// \name Operation finished with error +///@{ +#define IEEE_ERROR_PAR 0x2800 ///< Illegal parameter +#define IEEE_ERROR_NO_SETUP 0x2801 ///< Operation using Rx or Tx attemted when not in 15.4 mode +#define IEEE_ERROR_NO_FS 0x2802 ///< Operation using Rx or Tx attemted without frequency synth configured +#define IEEE_ERROR_SYNTH_PROG 0x2803 ///< Synthesizer programming failed to complete on time +#define IEEE_ERROR_RXOVF 0x2804 ///< Receiver overflowed during operation +#define IEEE_ERROR_TXUNF 0x2805 ///< Transmitter underflowed during operation +///@} +///@} + +#endif /* IEEE_MAILBOX_H_ */ diff --git a/cpu/cc26xx/dev/rfc-api/mailbox.h b/cpu/cc26xx-cc13xx/rf-core/api/mailbox.h similarity index 55% rename from cpu/cc26xx/dev/rfc-api/mailbox.h rename to cpu/cc26xx-cc13xx/rf-core/api/mailbox.h index b11d72f08..119565959 100644 --- a/cpu/cc26xx/dev/rfc-api/mailbox.h +++ b/cpu/cc26xx-cc13xx/rf-core/api/mailbox.h @@ -1,580 +1,328 @@ -/****************************************************************************** -* Filename: mailbox.h -* Revised: $ $ -* Revision: $ $ -* -* Description: Definitions for interface between system and radio CPU -* -* Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* -* Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* -* Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* -* Neither the name of Texas Instruments Incorporated nor the names of -* its contributors may be used to endorse or promote products derived -* from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -******************************************************************************/ - -#ifndef _MAILBOX_H -#define _MAILBOX_H - -#include -#include - -/// Type definition for RAT -typedef uint32_t ratmr_t; - - - -/// Type definition for a data queue -typedef struct { - uint8_t *pCurrEntry; ///< Pointer to the data queue entry to be used, NULL for an empty queue - uint8_t *pLastEntry; ///< Pointer to the last entry in the queue, NULL for a circular queue -} dataQueue_t; - - - -/// \name CPE interrupt definitions -/// Interrupt masks for the CPE interrupt in RDBELL. -///@{ -#define IRQN_COMMAND_DONE 0 ///< Radio operation command finished -#define IRQN_LAST_COMMAND_DONE 1 ///< Last radio operation command in a chain finished -#define IRQN_FG_COMMAND_DONE 2 ///< FG level Radio operation command finished -#define IRQN_LAST_FG_COMMAND_DONE 3 ///< Last FG level radio operation command in a chain finished -#define IRQN_TX_DONE 4 ///< Packet transmitted -#define IRQN_TX_ACK 5 ///< ACK packet transmitted -#define IRQN_TX_CTRL 6 ///< Control packet transmitted -#define IRQN_TX_CTRL_ACK 7 ///< Acknowledgement received on a transmitted control packet -#define IRQN_TX_CTRL_ACK_ACK 8 ///< Acknowledgement received on a transmitted control packet, and acknowledgement transmitted for that packet -#define IRQN_TX_RETRANS 9 ///< Packet retransmitted -#define IRQN_TX_ENTRY_DONE 10 ///< Tx queue data entry state changed to Finished -#define IRQN_TX_BUFFER_CHANGED 11 ///< A buffer change is complete -#define IRQN_BG_COMMAND_SUSPENDED 12 ///< A background level radio operation command has been suspended -#define IRQN_RX_OK 16 ///< Packet received with CRC OK, payload, and not to be ignored -#define IRQN_RX_NOK 17 ///< Packet received with CRC error -#define IRQN_RX_IGNORED 18 ///< Packet received with CRC OK, but to be ignored -#define IRQN_RX_EMPTY 19 ///< Packet received with CRC OK, not to be ignored, no payload -#define IRQN_RX_CTRL 20 ///< Control packet received with CRC OK, not to be ignored -#define IRQN_RX_CTRL_ACK 21 ///< Control packet received with CRC OK, not to be ignored, then ACK sent -#define IRQN_RX_BUF_FULL 22 ///< Packet received that did not fit in the Rx queue -#define IRQN_RX_ENTRY_DONE 23 ///< Rx queue data entry changing state to Finished -#define IRQN_RX_DATA_WRITTEN 24 ///< Data written to partial read Rx buffer -#define IRQN_RX_N_DATA_WRITTEN 25 ///< Specified number of bytes written to partial read Rx buffer -#define IRQN_RX_ABORTED 26 ///< Packet reception stopped before packet was done -#define IRQN_SYNTH_NO_LOCK 28 ///< The synth has gone out of lock after calibration -#define IRQN_MODULES_UNLOCKED 29 ///< As part of the boot process, the CM0 has opened access to RF core modules and memories -#define IRQN_BOOT_DONE 30 ///< The RF core CPU boot is finished - -#define IRQN_INTERNAL_ERROR 31 ///< Internal error observed - -#define IRQ_COMMAND_DONE (1U << IRQN_COMMAND_DONE) -#define IRQ_LAST_COMMAND_DONE (1U << IRQN_LAST_COMMAND_DONE) -#define IRQ_FG_COMMAND_DONE (1U << IRQN_FG_COMMAND_DONE) -#define IRQ_LAST_FG_COMMAND_DONE (1U << IRQN_LAST_FG_COMMAND_DONE) - -#define IRQ_TX_DONE (1U << IRQN_TX_DONE) -#define IRQ_TX_ACK (1U << IRQN_TX_ACK) -#define IRQ_TX_CTRL (1U << IRQN_TX_CTRL) -#define IRQ_TX_CTRL_ACK (1U << IRQN_TX_CTRL_ACK) -#define IRQ_TX_CTRL_ACK_ACK (1U << IRQN_TX_CTRL_ACK_ACK) -#define IRQ_TX_RETRANS (1U << IRQN_TX_RETRANS) - -#define IRQ_TX_ENTRY_DONE (1U << IRQN_TX_ENTRY_DONE) -#define IRQ_TX_BUFFER_CHANGED (1U << IRQN_TX_BUFFER_CHANGED) - -#define IRQ_BG_COMMAND_SUSPENDED (1U << IRQN_BG_COMMAND_SUSPENDED) - -#define IRQ_RX_OK (1U << IRQN_RX_OK) -#define IRQ_RX_NOK (1U << IRQN_RX_NOK) -#define IRQ_RX_IGNORED (1U << IRQN_RX_IGNORED) -#define IRQ_RX_EMPTY (1U << IRQN_RX_EMPTY) -#define IRQ_RX_CTRL (1U << IRQN_RX_CTRL) -#define IRQ_RX_CTRL_ACK (1U << IRQN_RX_CTRL_ACK) -#define IRQ_RX_BUF_FULL (1U << IRQN_RX_BUF_FULL) -#define IRQ_RX_ENTRY_DONE (1U << IRQN_RX_ENTRY_DONE) -#define IRQ_RX_DATA_WRITTEN (1U << IRQN_RX_DATA_WRITTEN) -#define IRQ_RX_N_DATA_WRITTEN (1U << IRQN_RX_N_DATA_WRITTEN) -#define IRQ_RX_ABORTED (1U << IRQN_RX_ABORTED) - -#define IRQ_SYNTH_NO_LOCK (1U << IRQN_SYNTH_NO_LOCK) -#define IRQ_MODULES_UNLOCKED (1U << IRQN_MODULES_UNLOCKED) -#define IRQ_BOOT_DONE (1U << IRQN_BOOT_DONE) -#define IRQ_INTERNAL_ERROR (1U << IRQN_INTERNAL_ERROR) -///@} - - - -/// \name CMDSTA values -/// Values returned in result byte of CMDSTA -///@{ -#define CMDSTA_Pending 0x00 ///< The command has not yet been parsed -#define CMDSTA_Done 0x01 ///< Command successfully parsed - -#define CMDSTA_IllegalPointer 0x81 ///< The pointer signaled in CMDR is not valid -#define CMDSTA_UnknownCommand 0x82 ///< The command number in the command structure is unknown -#define CMDSTA_UnknownDirCommand 0x83 ///< The command number for a direct command is unknown, or the - ///< command is not a direct command -#define CMDSTA_ContextError 0x85 ///< An immediate or direct command was issued in a context - ///< where it is not supported -#define CMDSTA_SchedulingError 0x86 ///< A radio operation command was attempted to be scheduled - ///< while another operation was already running in the RF core -#define CMDSTA_ParError 0x87 ///< There were errors in the command parameters that are parsed - ///< on submission. -#define CMDSTA_QueueError 0x88 ///< An operation on a data entry queue was attempted that was - ///< not supported by the queue in its current state -#define CMDSTA_QueueBusy 0x89 ///< An operation on a data entry was attempted while that entry - ///< was busy -///@} - -/// \name Macros for use with command definition files -/// The script create_command.pl generates header files from command and structure definitions in the -/// *_def.txt files. These are the macros to access the definitions -///@{ - -/// Get a field from a structure -// -/// Gets a field from a structure defined in a _def.txt file. This may be used both in assignments and -/// references (e.g. GET_FIELD(pCmd1, CMD_TEST, testParam) = GET_FIELD(pCmd2, CMD_DUMMY, dummyParam);) -/// \param[in] ptr -/// Pointer to the structure -/// \param[in] cmd -/// Name of the command or structure as defined in the _def.txt file -/// \param[in] field -/// Name of the accessed field as defined in the _def.txt file -/// -#define GET_FIELD(ptr, cmd, field) \ -(*((_TYPE_##cmd##_##field *) (((uint8_t *)(ptr)) + (_POSITION_##cmd##_##field)))) - -/// Get a field from a structure, reading as volatile -// -/// Gets a field from a structure defined in a _def.txt file, reading it as a volatile parameter, which -/// takes into account that it may be changed by the other side. This may be used both in assignments and -/// references (e.g. GET_FIELD(pCmd1, CMD_TEST, testParam) = GET_FIELD(pCmd2, CMD_DUMMY, dummyParam);) -/// \param[in] ptr -/// Pointer to the structure -/// \param[in] cmd -/// Name of the command or structure as defined in the _def.txt file -/// \param[in] field -/// Name of the accessed field as defined in the _def.txt file -/// -#define GET_FIELD_V(ptr, cmd, field) \ -(*((volatile _TYPE_##cmd##_##field *) (((uint8_t *)(ptr)) + (_POSITION_##cmd##_##field)))) - -/// Get the pointer to a field from a structure -// -/// Gets the pointer to a field from a structure defined in a _def.txt file. -/// \param[in] ptr -/// Pointer to the structure -/// \param[in] cmd -/// Name of the command or structure as defined in the _def.txt file -/// \param[in] field -/// Name of the accessed field as defined in the _def.txt file -/// -#define GET_FIELD_PTR(ptr, cmd, field) \ -((_TYPE_##cmd##_##field *) (((uint8_t *)(ptr)) + (_POSITION_##cmd##_##field))) - -/// Get the volatile pointer to a field from a structure -// -/// Gets the volatile pointer to a field from a structure defined in a _def.txt file. -/// \param[in] ptr -/// Pointer to the structure -/// \param[in] cmd -/// Name of the command or structure as defined in the _def.txt file -/// \param[in] field -/// Name of the accessed field as defined in the _def.txt file -/// -#define GET_FIELD_VPTR(ptr, cmd, field) \ -((volatile _TYPE_##cmd##_##field *) (((uint8_t *)(ptr)) + (_POSITION_##cmd##_##field))) - -/// Get bits from a bit field -// -/// Returns bits from a bit field defined in a _def.txt file. -/// \param[in] value -/// The value of the entire field that contains the bit field -/// \param[in] cmd -/// Name of the command or structure as defined in the _def.txt file -/// \param[in] field -/// Name of the field that contains the bit field definition as defined in the _def.txt file -/// \param[in] bitfield -/// Name of the bitfield as defined in the _def.txt file -/// -#define GET_BITS(value, cmd, field, bitfield) \ -(((value) >> (_BITPOS_##cmd##_##field##_##bitfield)) & \ - ((1U << (_NBITS_##cmd##_##field##_##bitfield)) - 1)) - -/// Get bits from a bit field as a signed value -// -/// Returns sign extended bits from a bit field defined in a _def.txt file. -/// \param[in] value -/// The value of the entire field that contains the bit field -/// \param[in] cmd -/// Name of the command or structure as defined in the _def.txt file -/// \param[in] field -/// Name of the field that contains the bit field definition as defined in the _def.txt file -/// \param[in] bitfield -/// Name of the bitfield as defined in the _def.txt file -/// -#define GET_BITS_S(value, cmd, field, bitfield) \ -(((int)(value) << (32 - ((_BITPOS_##cmd##_##field##_##bitfield) + (_NBITS_##cmd##_##field##_##bitfield)))) >> \ - (32 - (_NBITS_##cmd##_##field##_##bitfield))) - -/// Set bits in a bit field -// -/// Modifies a bit field defined in a _def.txt file. -/// \param[in,out] value -/// The value of the entire field that contains the bit field -/// \param[in] cmd -/// Name of the command or structure as defined in the _def.txt file -/// \param[in] field -/// Name of the field that contains the bit field definition as defined in the _def.txt file -/// \param[in] bitfield -/// Name of the bitfield as defined in the _def.txt file -/// \param[in] bvalue -/// The value to set in the bitfield -/// -#define SET_BITS(value, cmd, field, bitfield, bvalue) \ -(((value) = ((value) & \ - (~(((1U << (_NBITS_##cmd##_##field##_##bitfield)) - 1) << (_BITPOS_##cmd##_##field##_##bitfield))) | \ - ((bvalue) << (_BITPOS_##cmd##_##field##_##bitfield))))) - - -/// Get bits from a bit field in a structure -// -/// Returns bits from a bit field in a structure defined in a _def.txt file. -/// \param[in] ptr -/// Pointer to the structure -/// \param[in] cmd -/// Name of the command or structure as defined in the _def.txt file -/// \param[in] field -/// Name of the field that contains the bit field definition as defined in the _def.txt file -/// \param[in] bitfield -/// Name of the bitfield as defined in the _def.txt file -/// -#define GET_BITFIELD(ptr, cmd, field, bitfield) \ -((*((_TYPE_##cmd##_##field *) ((((uint8_t *)(ptr)) + (_POSITION_##cmd##_##field)))) >> \ - ((_BITPOS_##cmd##_##field##_##bitfield))) & \ - ((1U << (_NBITS_##cmd##_##field##_##bitfield)) - 1)) - -/// Get bits from a bit field in a structure, reading as volatile -// -/// Returns bits from a bit field in a structure defined in a _def.txt file, reading it as a -/// volatile parameter. -/// \param[in] ptr -/// Pointer to the structure -/// \param[in] cmd -/// Name of the command or structure as defined in the _def.txt file -/// \param[in] field -/// Name of the field that contains the bit field definition as defined in the _def.txt file -/// \param[in] bitfield -/// Name of the bitfield as defined in the _def.txt file -/// -#define GET_BITFIELD_V(ptr, cmd, field, bitfield) \ -((*((volatile _TYPE_##cmd##_##field *) ((((uint8_t *)(ptr)) + (_POSITION_##cmd##_##field)))) >> \ - ((_BITPOS_##cmd##_##field##_##bitfield))) & \ - ((1U << (_NBITS_##cmd##_##field##_##bitfield)) - 1)) - - -/// Set bits in a bit field in a structure -// -/// Modifies a bit field in a field in a structure defined in a _def.txt file. -/// \param[in] ptr -/// Pointer to the structure -/// \param[in] cmd -/// Name of the command or structure as defined in the _def.txt file -/// \param[in] field -/// Name of the field that contains the bit field definition as defined in the _def.txt file -/// \param[in] bitfield -/// Name of the bitfield as defined in the _def.txt file -/// \param[in] value -/// The value to set in the bitfield -/// -#define SET_BITFIELD(ptr, cmd, field, bitfield, value) \ -((*((_TYPE_##cmd##_##field *) (((uint8_t *)(ptr)) + (_POSITION_##cmd##_##field)))) = \ - ((*((_TYPE_##cmd##_##field *) (((uint8_t *)(ptr)) + (_POSITION_##cmd##_##field)))) & \ - (~(((1U << (_NBITS_##cmd##_##field##_##bitfield)) - 1) << (_BITPOS_##cmd##_##field##_##bitfield))) | \ - (((uint32_t)(value)) << (_BITPOS_##cmd##_##field##_##bitfield)))) - -/// Set bits in a bit field in a structure, reading and writing as volatile -// -/// Modifies a bit field in a field in a structure defined in a _def.txt file, accessing it as a volatile -/// parameter. -/// \param[in] ptr -/// Pointer to the structure -/// \param[in] cmd -/// Name of the command or structure as defined in the _def.txt file -/// \param[in] field -/// Name of the field that contains the bit field definition as defined in the _def.txt file -/// \param[in] bitfield -/// Name of the bitfield as defined in the _def.txt file -/// \param[in] value -/// The value to set in the bitfield -/// -#define SET_BITFIELD_V(ptr, cmd, field, bitfield, value) \ -((*((volatile _TYPE_##cmd##_##field *) (((uint8_t *)(ptr)) + (_POSITION_##cmd##_##field)))) = \ - ((*((volatile _TYPE_##cmd##_##field *) (((uint8_t *)(ptr)) + (_POSITION_##cmd##_##field)))) & \ - (~(((1U << (_NBITS_##cmd##_##field##_##bitfield)) - 1) << (_BITPOS_##cmd##_##field##_##bitfield))) | \ - (((uint32_t)(value)) << (_BITPOS_##cmd##_##field##_##bitfield)))) - -/// Get the value of specific bifield in a field with the remaining bits set to 0 -// -/// Returns a bitfield so that the value of the full field can be obtained by bitwise -/// OR between these -/// \param[in] cmd -/// Name of the command or structure as defined in the _def.txt file -/// \param[in] field -/// Name of the field that contains the bit field definition as defined in the _def.txt file -/// \param[in] bitfield -/// Name of the bitfield as defined in the _def.txt file -/// \param[in] value -/// The value to use in the bitfield -/// -#define BITVALUE(cmd, field, bitfield, value) \ -((((uint32_t)(value)) & ((1U << (_NBITS_##cmd##_##field##_##bitfield)) - 1)) << \ - (_BITPOS_##cmd##_##field##_##bitfield)) - -/// Get the size of a structure -// -/// Gets the size of a structure defined in a _def.txt file. -/// -/// \param[in] cmd -/// Name of the command or structure as defined in the _def.txt file -/// -#define SIZEOF_STRUCT(cmd) \ -(_SIZEOF_##cmd) - -/// Get the size of a radio operation command structure -// -/// Gets the size of a radio operation command structure defined in a _def.txt file. The difference from -/// SIZEOF_STRUCT is for legacy reasons only. -/// -/// \param[in] cmd -/// Name of the command or structure as defined in the _def.txt file -/// -#define SIZEOF_RADIO_OP(cmd) \ -(_SIZEOF_##cmd) - -/// Initializes a structure to an initialization set -// -/// Sets the value of a structure to its given initialization values -/// \param[in] ptr -/// Pointer to the structure, must be word aligned -/// \param[in] cmd -/// Name of the command or structure as defined in the _def.txt file -/// \param[in] set -/// Index of the set of initializations to use -/// -#define INIT_STRUCT(ptr, cmd, set) \ -(memcpy(((uint32_t *)(ptr)) + (_START_INIT_WIDX_##cmd), (__init_##cmd[(set)]), \ - (_N_INIT_WORDS_##cmd) * sizeof(uint32_t))) - -///@} - - -/// \name Macros for sending direct commands -///@{ -/// Direct command with no parameter -#define CMDR_DIR_CMD(cmdId) (((cmdId) << 16) | 1) - -/// Direct command with 1-byte parameter -#define CMDR_DIR_CMD_1BYTE(cmdId, par) (((cmdId) << 16) | ((par) << 8) | 1) - -/// Direct command with 2-byte parameter -#define CMDR_DIR_CMD_2BYTE(cmdId, par) (((cmdId) << 16) | ((par) & 0xFFFC) | 1) - -///@} - - - -/// \name Definitions for trigger types -///@{ -#define TRIG_NOW 0 ///< Triggers immediately -#define TRIG_NEVER 1 ///< Never trigs -#define TRIG_ABSTIME 2 ///< Trigs at an absolute time -#define TRIG_REL_SUBMIT 3 ///< Trigs at a time relative to the command was submitted -#define TRIG_REL_START 4 ///< Trigs at a time relative to the command started -#define TRIG_REL_PREVSTART 5 ///< Trigs at a time relative to the previous command in the chain started -#define TRIG_REL_FIRSTSTART 6 ///< Trigs at a time relative to the first command in the chain started -#define TRIG_REL_PREVEND 7 ///< Trigs at a time relative to the previous command in the chain ended -#define TRIG_REL_EVT1 8 ///< Trigs at a time relative to the context defined "Event 1" -#define TRIG_REL_EVT2 9 ///< Trigs at a time relative to the context defined "Event 2" -#define TRIG_EXTERNAL 10 ///< Trigs at an external event to the radio timer -#define TRIG_PAST_BM 0x80 ///< Bitmask for setting pastTrig bit in order to trig immediately if - ///< trigger happened in the past -///@} - - -/// \name Definitions for conditional execution -///@{ -#define COND_ALWAYS 0 ///< Always run next command (except in case of Abort) -#define COND_NEVER 1 ///< Never run next command -#define COND_STOP_ON_FALSE 2 ///< Run next command if this command returned True, stop if it returned - ///< False -#define COND_STOP_ON_TRUE 3 ///< Stop if this command returned True, run next command if it returned - ///< False -#define COND_SKIP_ON_FALSE 4 ///< Run next command if this command returned True, skip a number of - ///< commands if it returned False -#define COND_SKIP_ON_TRUE 5 ///< Skip a number of commands if this command returned True, run next - ///< command if it returned False -///@} - - - -/// \name Radio operation status -/// Radio operation status format: -///@{ -/// \name Operation not finished -///@{ -#define IDLE 0x0000 ///< Operation not started -#define PENDING 0x0001 ///< Start of command is pending -#define ACTIVE 0x0002 ///< Running -#define SKIPPED 0x0003 ///< Operation skipped due to condition in another command -///@} -/// \name Operation finished normally -///@{ -#define DONE_OK 0x0400 ///< Operation ended normally -#define DONE_COUNTDOWN 0x0401 ///< Counter reached zero -#define DONE_RXERR 0x0402 ///< Operation ended with CRC error -#define DONE_TIMEOUT 0x0403 ///< Operation ended with timeout -#define DONE_STOPPED 0x0404 ///< Operation stopped after CMD_STOP command -#define DONE_ABORT 0x0405 ///< Operation aborted by CMD_ABORT command -#define DONE_FAILED 0x0406 ///< Scheduled immediate command failed -///@} -/// \name Operation finished with error -///@{ -#define ERROR_PAST_START 0x0800 ///< The start trigger occurred in the past -#define ERROR_START_TRIG 0x0801 ///< Illegal start trigger parameter -#define ERROR_CONDITION 0x0802 ///< Illegal condition for next operation -#define ERROR_PAR 0x0803 ///< Error in a command specific parameter -#define ERROR_POINTER 0x0804 ///< Invalid pointer to next operation -#define ERROR_CMDID 0x0805 ///< Next operation has a command ID that is undefined or not a radio - ///< operation command -#define ERROR_WRONG_BG 0x0806 ///< FG level command not compatible with running BG level command -#define ERROR_NO_SETUP 0x0807 ///< Operation using Rx or Tx attemted without CMD_RADIO_SETUP -#define ERROR_NO_FS 0x0808 ///< Operation using Rx or Tx attemted without frequency synth configured -#define ERROR_SYNTH_PROG 0x0809 ///< Synthesizer calibration failed -#define ERROR_TXUNF 0x080A ///< Tx underflow observed -#define ERROR_RXOVF 0x080B ///< Rx overflow observed -#define ERROR_NO_RX 0x080C ///< Attempted to access data from Rx when no such data was yet received -#define ERROR_PENDING 0x080D ///< Command submitted in the future with another command at different level pending -///@} -///@} - - -/// \name Data entry types -///@{ -#define DATA_ENTRY_TYPE_GEN 0 ///< General type: Tx entry or single element Rx entry -#define DATA_ENTRY_TYPE_MULTI 1 ///< Multi-element Rx entry type -#define DATA_ENTRY_TYPE_PTR 2 ///< Pointer entry type -#define DATA_ENTRY_TYPE_PARTIAL 3 ///< Partial read entry type -///@ - - -/// \name Data entry statuses -///@{ -#define DATA_ENTRY_PENDING 0 ///< Entry not yet used -#define DATA_ENTRY_ACTIVE 1 ///< Entry in use by radio CPU -#define DATA_ENTRY_BUSY 2 ///< Entry being updated -#define DATA_ENTRY_FINISHED 3 ///< Radio CPU is finished accessing the entry -#define DATA_ENTRY_UNFINISHED 4 ///< Radio CPU is finished accessing the entry, but packet could not be finished -///@} - -/// Difference between length and size of rxData field in multi-element Rx entry -#define DATA_ENTRY_MULTI_LEN_OFFSET (_POSITION_dataEntry_rxData - _POSITION_dataEntry_data) - - -/// \name Macros for RF register override -///@{ -/// Macro for ADI half-size value-mask combination -#define ADI_VAL_MASK(addr, mask, value) \ -(((addr) & 1) ? (((mask) & 0x0F) | (((value) & 0x0F) << 4)) : \ - ((((mask) & 0x0F) << 4) | ((value) & 0x0F))) -/// 32-bit write of 16-bit value -#define HW_REG_OVERRIDE(addr, val) ((((uintptr_t) (addr)) & 0xFFFC) | ((uint32_t)(val) << 16)) -/// ADI register, full-size write -#define ADI_REG_OVERRIDE(adiNo, addr, val) (2 | ((uint32_t)(val) << 16) | \ -(((addr) & 0x3F) << 24) | (((adiNo) ? 1U : 0) << 31)) -/// 2 ADI registers, full-size write -#define ADI_2REG_OVERRIDE(adiNo, addr, val, addr2, val2) \ -(2 | ((uint32_t)(val2) << 2) | (((addr2) & 0x3F) << 10) | ((uint32_t)(val) << 16) | \ -(((addr) & 0x3F) << 24) | (((adiNo) ? 1U : 0) << 31)) -/// ADI register, half-size read-modify-write -#define ADI_HALFREG_OVERRIDE(adiNo, addr, mask, val) (2 | (ADI_VAL_MASK(addr, mask, val) << 16) | \ -(((addr) & 0x3F) << 24) | (1U << 30) | (((adiNo) ? 1U : 0) << 31)) -/// 2 ADI registers, half-size read-modify-write -#define ADI_2HALFREG_OVERRIDE(adiNo, addr, mask, val, addr2, mask2, val2) \ -(2 | (ADI_VAL_MASK(addr2, mask2, val2) << 2) | (((addr2) & 0x3F) << 10) | \ -(ADI_VAL_MASK(addr, mask, val) << 16) | (((addr) & 0x3F) << 24) | (1U << 30) | (((adiNo) ? 1U : 0) << 31)) - -/// 16-bit SW register as defined in radio_par_def.txt -#define SW_REG_OVERRIDE(cmd, field, val) (3 | ((_POSITION_##cmd##_##field) << 4) | ((uint32_t)(val) << 16)) -/// SW register as defined in radio_par_def.txt with added index (for use with registers > 16 bits). -#define SW_REG_IND_OVERRIDE(cmd, field, offset, val) (3 | \ -(((_POSITION_##cmd##_##field) + ((offset) << 1)) << 4) | ((uint32_t)(val) << 16)) -/// 8-bit SW register as defined in radio_par_def.txt -#define SW_REG_BYTE_OVERRIDE(cmd, field, val) (0x8003 | ((_POSITION_##cmd##_##field) << 4) | \ -((uint32_t)(val) << 16)) -/// Two 8-bit SW registers as defined in radio_par_def.txt; the one given by field and the next byte. -#define SW_REG_2BYTE_OVERRIDE(cmd, field, val0, val1) (3 | (((_POSITION_##cmd##_##field) & 0xFFFE) << 4) | \ - (((uint32_t)(val0) << 16) & 0x00FF0000) | ((uint32_t)(val1) << 24)) -#define HW16_ARRAY_OVERRIDE(addr, length) (1 | (((uintptr_t) (addr)) & 0xFFFC) | ((uint32_t)(length) << 16)) -#define HW32_ARRAY_OVERRIDE(addr, length) (1 | (((uintptr_t) (addr)) & 0xFFFC) | \ -((uint32_t)(length) << 16) | (1U << 30)) -#define ADI_ARRAY_OVERRIDE(adiNo, addr, bHalfSize, length) (1 | ((((addr) & 0x3F) << 2)) | \ -((!!(bHalfSize)) << 8) | ((!!(adiNo)) << 9) | ((uint32_t)(length) << 16) | (2U << 30)) -#define SW_ARRAY_OVERRIDE(cmd, firstfield, length) (1 | (((_POSITION_##cmd##_##firstfield)) << 2) | \ -((uint32_t)(length) << 16) | (3U << 30)) -#define MCE_RFE_OVERRIDE(bMceRam, mceRomBank, mceMode, bRfeRam, rfeRomBank, rfeMode) \ - (7 | ((!!(bMceRam)) << 8) | (((mceRomBank) & 0x07) << 9) | ((!!(bRfeRam)) << 12) | (((rfeRomBank) & 0x07) << 13) | \ - (((mceMode) & 0x00FF) << 16) | (((rfeMode) & 0x00FF) << 24)) -#define BAW_OVERRIDE(freqOffset) (0x000B | ((freqOffset) << 16)) -#define NEW_OVERRIDE_SEGMENT(address) (((((uintptr_t)(address)) & 0x03FFFFFC) << 6) | 0x000F | \ - (((((uintptr_t)(address) >> 24) == 0x20) ? 0x01 : \ - (((uintptr_t)(address) >> 24) == 0x21) ? 0x02 : \ - (((uintptr_t)(address) >> 24) == 0xA0) ? 0x03 : \ - (((uintptr_t)(address) >> 24) == 0x00) ? 0x04 : \ - (((uintptr_t)(address) >> 24) == 0x10) ? 0x05 : \ - (((uintptr_t)(address) >> 24) == 0x11) ? 0x06 : \ - (((uintptr_t)(address) >> 24) == 0x40) ? 0x07 : \ - (((uintptr_t)(address) >> 24) == 0x50) ? 0x08 : \ - 0x09) << 4)) // Use illegal value for illegal address range -/// End of string for override register -#define END_OVERRIDE 0xFFFFFFFF - - -#define FWPAR_8BIT_ADDR(cmd, field) (0x1800 | (_POSITION_##cmd##_##field)) -#define FWPAR_16BIT_ADDR(cmd, field) (0x1000 | (_POSITION_##cmd##_##field)) -#define FWPAR_32BIT_ADDR(cmd, field) (0x0000 | (_POSITION_##cmd##_##field)) - -/// ADI address-value pair -#define ADI_ADDR_VAL(addr, value) ((((addr) & 0x7F) << 8) | ((value) & 0xFF)) -#define ADI_ADDR_VAL_MASK(addr, mask, value) ((((addr) & 0x7F) << 8) | ADI_VAL_MASK(addr, mask, value)) - -/// Low half-word -#define LOWORD(value) ((value) & 0xFFFF) -/// High half-word -#define HIWORD(value) ((value) >> 16) -///@} - - -#endif +/****************************************************************************** +* Filename: mailbox.h +* Revised: 2015-06-29 12:59:58 +0200 (Mon, 29 Jun 2015) +* Revision: 44063 +* +* Description: Definitions for interface between system and radio CPU +* +* Copyright (c) 2015, Texas Instruments Incorporated +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* 1) Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* +* 2) Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* 3) Neither the name of the ORGANIZATION nor the names of its contributors may +* be used to endorse or promote products derived from this software without +* specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +******************************************************************************/ + +#ifndef MAILBOX_H_ +#define MAILBOX_H_ + +#include +#include + +/// Type definition for RAT +typedef uint32_t ratmr_t; + + + +/// Type definition for a data queue +typedef struct { + uint8_t *pCurrEntry; ///< Pointer to the data queue entry to be used, NULL for an empty queue + uint8_t *pLastEntry; ///< Pointer to the last entry in the queue, NULL for a circular queue +} dataQueue_t; + + + +/// \name CPE interrupt definitions +/// Interrupt masks for the CPE interrupt in RDBELL. +///@{ +#define IRQN_COMMAND_DONE 0 ///< Radio operation command finished +#define IRQN_LAST_COMMAND_DONE 1 ///< Last radio operation command in a chain finished +#define IRQN_FG_COMMAND_DONE 2 ///< FG level Radio operation command finished +#define IRQN_LAST_FG_COMMAND_DONE 3 ///< Last FG level radio operation command in a chain finished +#define IRQN_TX_DONE 4 ///< Packet transmitted +#define IRQN_TX_ACK 5 ///< ACK packet transmitted +#define IRQN_TX_CTRL 6 ///< Control packet transmitted +#define IRQN_TX_CTRL_ACK 7 ///< Acknowledgement received on a transmitted control packet +#define IRQN_TX_CTRL_ACK_ACK 8 ///< Acknowledgement received on a transmitted control packet, and acknowledgement transmitted for that packet +#define IRQN_TX_RETRANS 9 ///< Packet retransmitted +#define IRQN_TX_ENTRY_DONE 10 ///< Tx queue data entry state changed to Finished +#define IRQN_TX_BUFFER_CHANGED 11 ///< A buffer change is complete +#define IRQN_RX_OK 16 ///< Packet received with CRC OK, payload, and not to be ignored +#define IRQN_RX_NOK 17 ///< Packet received with CRC error +#define IRQN_RX_IGNORED 18 ///< Packet received with CRC OK, but to be ignored +#define IRQN_RX_EMPTY 19 ///< Packet received with CRC OK, not to be ignored, no payload +#define IRQN_RX_CTRL 20 ///< Control packet received with CRC OK, not to be ignored +#define IRQN_RX_CTRL_ACK 21 ///< Control packet received with CRC OK, not to be ignored, then ACK sent +#define IRQN_RX_BUF_FULL 22 ///< Packet received that did not fit in the Rx queue +#define IRQN_RX_ENTRY_DONE 23 ///< Rx queue data entry changing state to Finished +#define IRQN_RX_DATA_WRITTEN 24 ///< Data written to partial read Rx buffer +#define IRQN_RX_N_DATA_WRITTEN 25 ///< Specified number of bytes written to partial read Rx buffer +#define IRQN_RX_ABORTED 26 ///< Packet reception stopped before packet was done +#define IRQN_RX_COLLISION_DETECTED 27 ///< A collision was indicated during packet reception +#define IRQN_SYNTH_NO_LOCK 28 ///< The synth has gone out of lock after calibration +#define IRQN_MODULES_UNLOCKED 29 ///< As part of the boot process, the CM0 has opened access to RF core modules and memories +#define IRQN_BOOT_DONE 30 ///< The RF core CPU boot is finished + +#define IRQN_INTERNAL_ERROR 31 ///< Internal error observed + +#define IRQ_COMMAND_DONE (1U << IRQN_COMMAND_DONE) +#define IRQ_LAST_COMMAND_DONE (1U << IRQN_LAST_COMMAND_DONE) +#define IRQ_FG_COMMAND_DONE (1U << IRQN_FG_COMMAND_DONE) +#define IRQ_LAST_FG_COMMAND_DONE (1U << IRQN_LAST_FG_COMMAND_DONE) + +#define IRQ_TX_DONE (1U << IRQN_TX_DONE) +#define IRQ_TX_ACK (1U << IRQN_TX_ACK) +#define IRQ_TX_CTRL (1U << IRQN_TX_CTRL) +#define IRQ_TX_CTRL_ACK (1U << IRQN_TX_CTRL_ACK) +#define IRQ_TX_CTRL_ACK_ACK (1U << IRQN_TX_CTRL_ACK_ACK) +#define IRQ_TX_RETRANS (1U << IRQN_TX_RETRANS) + +#define IRQ_TX_ENTRY_DONE (1U << IRQN_TX_ENTRY_DONE) +#define IRQ_TX_BUFFER_CHANGED (1U << IRQN_TX_BUFFER_CHANGED) + +#define IRQ_RX_OK (1U << IRQN_RX_OK) +#define IRQ_RX_NOK (1U << IRQN_RX_NOK) +#define IRQ_RX_IGNORED (1U << IRQN_RX_IGNORED) +#define IRQ_RX_EMPTY (1U << IRQN_RX_EMPTY) +#define IRQ_RX_CTRL (1U << IRQN_RX_CTRL) +#define IRQ_RX_CTRL_ACK (1U << IRQN_RX_CTRL_ACK) +#define IRQ_RX_BUF_FULL (1U << IRQN_RX_BUF_FULL) +#define IRQ_RX_ENTRY_DONE (1U << IRQN_RX_ENTRY_DONE) +#define IRQ_RX_DATA_WRITTEN (1U << IRQN_RX_DATA_WRITTEN) +#define IRQ_RX_N_DATA_WRITTEN (1U << IRQN_RX_N_DATA_WRITTEN) +#define IRQ_RX_ABORTED (1U << IRQN_RX_ABORTED) +#define IRQ_RX_COLLISION_DETECTED (1U << IRQN_RX_COLLISION_DETECTED) +#define IRQ_SYNTH_NO_LOCK (1U << IRQN_SYNTH_NO_LOCK) +#define IRQ_MODULES_UNLOCKED (1U << IRQN_MODULES_UNLOCKED) +#define IRQ_BOOT_DONE (1U << IRQN_BOOT_DONE) +#define IRQ_INTERNAL_ERROR (1U << IRQN_INTERNAL_ERROR) +///@} + + + +/// \name CMDSTA values +/// Values returned in result byte of CMDSTA +///@{ +#define CMDSTA_Pending 0x00 ///< The command has not yet been parsed +#define CMDSTA_Done 0x01 ///< Command successfully parsed + +#define CMDSTA_IllegalPointer 0x81 ///< The pointer signalled in CMDR is not valid +#define CMDSTA_UnknownCommand 0x82 ///< The command number in the command structure is unknown +#define CMDSTA_UnknownDirCommand 0x83 ///< The command number for a direct command is unknown, or the + ///< command is not a direct command +#define CMDSTA_ContextError 0x85 ///< An immediate or direct command was issued in a context + ///< where it is not supported +#define CMDSTA_SchedulingError 0x86 ///< A radio operation command was attempted to be scheduled + ///< while another operation was already running in the RF core +#define CMDSTA_ParError 0x87 ///< There were errors in the command parameters that are parsed + ///< on submission. +#define CMDSTA_QueueError 0x88 ///< An operation on a data entry queue was attempted that was + ///< not supported by the queue in its current state +#define CMDSTA_QueueBusy 0x89 ///< An operation on a data entry was attempted while that entry + ///< was busy +///@} + + + +/// \name Macros for sending direct commands +///@{ +/// Direct command with no parameter +#define CMDR_DIR_CMD(cmdId) (((cmdId) << 16) | 1) + +/// Direct command with 1-byte parameter +#define CMDR_DIR_CMD_1BYTE(cmdId, par) (((cmdId) << 16) | ((par) << 8) | 1) + +/// Direct command with 2-byte parameter +#define CMDR_DIR_CMD_2BYTE(cmdId, par) (((cmdId) << 16) | ((par) & 0xFFFC) | 1) + +///@} + + + +/// \name Definitions for trigger types +///@{ +#define TRIG_NOW 0 ///< Triggers immediately +#define TRIG_NEVER 1 ///< Never trigs +#define TRIG_ABSTIME 2 ///< Trigs at an absolute time +#define TRIG_REL_SUBMIT 3 ///< Trigs at a time relative to the command was submitted +#define TRIG_REL_START 4 ///< Trigs at a time relative to the command started +#define TRIG_REL_PREVSTART 5 ///< Trigs at a time relative to the previous command in the chain started +#define TRIG_REL_FIRSTSTART 6 ///< Trigs at a time relative to the first command in the chain started +#define TRIG_REL_PREVEND 7 ///< Trigs at a time relative to the previous command in the chain ended +#define TRIG_REL_EVT1 8 ///< Trigs at a time relative to the context defined "Event 1" +#define TRIG_REL_EVT2 9 ///< Trigs at a time relative to the context defined "Event 2" +#define TRIG_EXTERNAL 10 ///< Trigs at an external event to the radio timer +#define TRIG_PAST_BM 0x80 ///< Bitmask for setting pastTrig bit in order to trig immediately if + ///< trigger happened in the past +///@} + + +/// \name Definitions for conditional execution +///@{ +#define COND_ALWAYS 0 ///< Always run next command (except in case of Abort) +#define COND_NEVER 1 ///< Never run next command +#define COND_STOP_ON_FALSE 2 ///< Run next command if this command returned True, stop if it returned + ///< False +#define COND_STOP_ON_TRUE 3 ///< Stop if this command returned True, run next command if it returned + ///< False +#define COND_SKIP_ON_FALSE 4 ///< Run next command if this command returned True, skip a number of + ///< commands if it returned False +#define COND_SKIP_ON_TRUE 5 ///< Skip a number of commands if this command returned True, run next + ///< command if it returned False +///@} + + + +/// \name Radio operation status +///@{ +/// \name Operation not finished +///@{ +#define IDLE 0x0000 ///< Operation not started +#define PENDING 0x0001 ///< Start of command is pending +#define ACTIVE 0x0002 ///< Running +#define SKIPPED 0x0003 ///< Operation skipped due to condition in another command +///@} +/// \name Operation finished normally +///@{ +#define DONE_OK 0x0400 ///< Operation ended normally +#define DONE_COUNTDOWN 0x0401 ///< Counter reached zero +#define DONE_RXERR 0x0402 ///< Operation ended with CRC error +#define DONE_TIMEOUT 0x0403 ///< Operation ended with timeout +#define DONE_STOPPED 0x0404 ///< Operation stopped after CMD_STOP command +#define DONE_ABORT 0x0405 ///< Operation aborted by CMD_ABORT command +#define DONE_FAILED 0x0406 ///< Scheduled immediate command failed +///@} +/// \name Operation finished with error +///@{ +#define ERROR_PAST_START 0x0800 ///< The start trigger occurred in the past +#define ERROR_START_TRIG 0x0801 ///< Illegal start trigger parameter +#define ERROR_CONDITION 0x0802 ///< Illegal condition for next operation +#define ERROR_PAR 0x0803 ///< Error in a command specific parameter +#define ERROR_POINTER 0x0804 ///< Invalid pointer to next operation +#define ERROR_CMDID 0x0805 ///< Next operation has a command ID that is undefined or not a radio + ///< operation command +#define ERROR_WRONG_BG 0x0806 ///< FG level command not compatible with running BG level command +#define ERROR_NO_SETUP 0x0807 ///< Operation using Rx or Tx attempted without CMD_RADIO_SETUP +#define ERROR_NO_FS 0x0808 ///< Operation using Rx or Tx attempted without frequency synth configured +#define ERROR_SYNTH_PROG 0x0809 ///< Synthesizer calibration failed +#define ERROR_TXUNF 0x080A ///< Tx underflow observed +#define ERROR_RXOVF 0x080B ///< Rx overflow observed +#define ERROR_NO_RX 0x080C ///< Attempted to access data from Rx when no such data was yet received +#define ERROR_PENDING 0x080D ///< Command submitted in the future with another command at different level pending +///@} +///@} + + +/// \name Data entry types +///@{ +#define DATA_ENTRY_TYPE_GEN 0 ///< General type: Tx entry or single element Rx entry +#define DATA_ENTRY_TYPE_MULTI 1 ///< Multi-element Rx entry type +#define DATA_ENTRY_TYPE_PTR 2 ///< Pointer entry type +#define DATA_ENTRY_TYPE_PARTIAL 3 ///< Partial read entry type +///@ + + +/// \name Data entry statuses +///@{ +#define DATA_ENTRY_PENDING 0 ///< Entry not yet used +#define DATA_ENTRY_ACTIVE 1 ///< Entry in use by radio CPU +#define DATA_ENTRY_BUSY 2 ///< Entry being updated +#define DATA_ENTRY_FINISHED 3 ///< Radio CPU is finished accessing the entry +#define DATA_ENTRY_UNFINISHED 4 ///< Radio CPU is finished accessing the entry, but packet could not be finished +///@} + + + +/// \name Macros for RF register override +///@{ +/// Macro for ADI half-size value-mask combination +#define ADI_VAL_MASK(addr, mask, value) \ +(((addr) & 1) ? (((mask) & 0x0F) | (((value) & 0x0F) << 4)) : \ + ((((mask) & 0x0F) << 4) | ((value) & 0x0F))) +/// 32-bit write of 16-bit value +#define HW_REG_OVERRIDE(addr, val) ((((uintptr_t) (addr)) & 0xFFFC) | ((uint32_t)(val) << 16)) +/// ADI register, full-size write +#define ADI_REG_OVERRIDE(adiNo, addr, val) (2 | ((uint32_t)(val) << 16) | \ +(((addr) & 0x3F) << 24) | (((adiNo) ? 1U : 0) << 31)) +/// 2 ADI registers, full-size write +#define ADI_2REG_OVERRIDE(adiNo, addr, val, addr2, val2) \ +(2 | ((uint32_t)(val2) << 2) | (((addr2) & 0x3F) << 10) | ((uint32_t)(val) << 16) | \ +(((addr) & 0x3F) << 24) | (((adiNo) ? 1U : 0) << 31)) +/// ADI register, half-size read-modify-write +#define ADI_HALFREG_OVERRIDE(adiNo, addr, mask, val) (2 | (ADI_VAL_MASK(addr, mask, val) << 16) | \ +(((addr) & 0x3F) << 24) | (1U << 30) | (((adiNo) ? 1U : 0) << 31)) +/// 2 ADI registers, half-size read-modify-write +#define ADI_2HALFREG_OVERRIDE(adiNo, addr, mask, val, addr2, mask2, val2) \ +(2 | (ADI_VAL_MASK(addr2, mask2, val2) << 2) | (((addr2) & 0x3F) << 10) | \ +(ADI_VAL_MASK(addr, mask, val) << 16) | (((addr) & 0x3F) << 24) | (1U << 30) | (((adiNo) ? 1U : 0) << 31)) + +/// 16-bit SW register as defined in radio_par_def.txt +#define SW_REG_OVERRIDE(cmd, field, val) (3 | ((_POSITION_##cmd##_##field) << 4) | ((uint32_t)(val) << 16)) +/// SW register as defined in radio_par_def.txt with added index (for use with registers > 16 bits). +#define SW_REG_IND_OVERRIDE(cmd, field, offset, val) (3 | \ +(((_POSITION_##cmd##_##field) + ((offset) << 1)) << 4) | ((uint32_t)(val) << 16)) +/// 8-bit SW register as defined in radio_par_def.txt +#define SW_REG_BYTE_OVERRIDE(cmd, field, val) (0x8003 | ((_POSITION_##cmd##_##field) << 4) | \ +((uint32_t)(val) << 16)) +/// Two 8-bit SW registers as defined in radio_par_def.txt; the one given by field and the next byte. +#define SW_REG_2BYTE_OVERRIDE(cmd, field, val0, val1) (3 | (((_POSITION_##cmd##_##field) & 0xFFFE) << 4) | \ + (((uint32_t)(val0) << 16) & 0x00FF0000) | ((uint32_t)(val1) << 24)) +#define HW16_ARRAY_OVERRIDE(addr, length) (1 | (((uintptr_t) (addr)) & 0xFFFC) | ((uint32_t)(length) << 16)) +#define HW32_ARRAY_OVERRIDE(addr, length) (1 | (((uintptr_t) (addr)) & 0xFFFC) | \ +((uint32_t)(length) << 16) | (1U << 30)) +#define ADI_ARRAY_OVERRIDE(adiNo, addr, bHalfSize, length) (1 | ((((addr) & 0x3F) << 2)) | \ +((!!(bHalfSize)) << 8) | ((!!(adiNo)) << 9) | ((uint32_t)(length) << 16) | (2U << 30)) +#define SW_ARRAY_OVERRIDE(cmd, firstfield, length) (1 | (((_POSITION_##cmd##_##firstfield)) << 2) | \ +((uint32_t)(length) << 16) | (3U << 30)) +#define MCE_RFE_OVERRIDE(bMceRam, mceRomBank, mceMode, bRfeRam, rfeRomBank, rfeMode) \ + (7 | ((!!(bMceRam)) << 8) | (((mceRomBank) & 0x07) << 9) | ((!!(bRfeRam)) << 12) | (((rfeRomBank) & 0x07) << 13) | \ + (((mceMode) & 0x00FF) << 16) | (((rfeMode) & 0x00FF) << 24)) +#define NEW_OVERRIDE_SEGMENT(address) (((((uintptr_t)(address)) & 0x03FFFFFC) << 6) | 0x000F | \ + (((((uintptr_t)(address) >> 24) == 0x20) ? 0x01 : \ + (((uintptr_t)(address) >> 24) == 0x21) ? 0x02 : \ + (((uintptr_t)(address) >> 24) == 0xA0) ? 0x03 : \ + (((uintptr_t)(address) >> 24) == 0x00) ? 0x04 : \ + (((uintptr_t)(address) >> 24) == 0x10) ? 0x05 : \ + (((uintptr_t)(address) >> 24) == 0x11) ? 0x06 : \ + (((uintptr_t)(address) >> 24) == 0x40) ? 0x07 : \ + (((uintptr_t)(address) >> 24) == 0x50) ? 0x08 : \ + 0x09) << 4)) // Use illegal value for illegal address range +/// End of string for override register +#define END_OVERRIDE 0xFFFFFFFF + + +/// ADI address-value pair +#define ADI_ADDR_VAL(addr, value) ((((addr) & 0x7F) << 8) | ((value) & 0xFF)) +#define ADI_ADDR_VAL_MASK(addr, mask, value) ((((addr) & 0x7F) << 8) | ADI_VAL_MASK(addr, mask, value)) + +/// Low half-word +#define LOWORD(value) ((value) & 0xFFFF) +/// High half-word +#define HIWORD(value) ((value) >> 16) +///@} + + +#endif /* MAILBOX_H_ */ diff --git a/cpu/cc26xx-cc13xx/rf-core/api/prop_cmd.h b/cpu/cc26xx-cc13xx/rf-core/api/prop_cmd.h new file mode 100644 index 000000000..e0d0a0c35 --- /dev/null +++ b/cpu/cc26xx-cc13xx/rf-core/api/prop_cmd.h @@ -0,0 +1,596 @@ +/****************************************************************************** +* Filename: prop_cmd.h +* Revised: 2015-08-04 10:40:45 +0200 (Tue, 04 Aug 2015) +* Revision: 44326 +* +* Description: CC13xx API for Proprietary mode commands +* +* Copyright (c) 2015, Texas Instruments Incorporated +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* 1) Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* +* 2) Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* 3) Neither the name of the ORGANIZATION nor the names of its contributors may +* be used to endorse or promote products derived from this software without +* specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +******************************************************************************/ + +#ifndef PROP_CMD_H_ +#define PROP_CMD_H_ + +#ifndef __RFC_STRUCT +#ifdef __GNUC__ +#define __RFC_STRUCT __attribute__ ((aligned (4))) +#else +#define __RFC_STRUCT +#endif +#endif + +//! \addtogroup rfc +//! @{ + +//! \addtogroup prop_cmd +//! @{ + +#include +#include "mailbox.h" +#include "common_cmd.h" + +typedef struct __RFC_STRUCT rfc_carrierSense_s rfc_carrierSense_t; +typedef struct __RFC_STRUCT rfc_CMD_PROP_TX_s rfc_CMD_PROP_TX_t; +typedef struct __RFC_STRUCT rfc_CMD_PROP_RX_s rfc_CMD_PROP_RX_t; +typedef struct __RFC_STRUCT rfc_CMD_PROP_TX_ADV_s rfc_CMD_PROP_TX_ADV_t; +typedef struct __RFC_STRUCT rfc_CMD_PROP_RX_ADV_s rfc_CMD_PROP_RX_ADV_t; +typedef struct __RFC_STRUCT rfc_CMD_PROP_RADIO_SETUP_s rfc_CMD_PROP_RADIO_SETUP_t; +typedef struct __RFC_STRUCT rfc_CMD_PROP_RADIO_DIV_SETUP_s rfc_CMD_PROP_RADIO_DIV_SETUP_t; +typedef struct __RFC_STRUCT rfc_CMD_PROP_SET_LEN_s rfc_CMD_PROP_SET_LEN_t; +typedef struct __RFC_STRUCT rfc_CMD_PROP_RESTART_RX_s rfc_CMD_PROP_RESTART_RX_t; +typedef struct __RFC_STRUCT rfc_propRxOutput_s rfc_propRxOutput_t; +typedef struct __RFC_STRUCT rfc_propRxStatus_s rfc_propRxStatus_t; + +//! \addtogroup carrierSense +//! @{ +struct __RFC_STRUCT rfc_carrierSense_s { + struct { + uint8_t bEnaRssi:1; //!< If 1, enable RSSI as a criterion + uint8_t bEnaCorr:1; //!< If 1, enable correlation as a criterion + uint8_t operation:1; //!< \brief 0: Busy if either RSSI or correlation indicates Busy
+ //!< 1: Busy if both RSSI and correlation indicates Busy + uint8_t busyOp:1; //!< \brief 0: Continue carrier sense on channel Busy
+ //!< 1: End carrier sense on channel Busy
+ //!< For an Rx command, the receiver will continue when carrier sense ends, but it will then not end if channel goes Idle + uint8_t idleOp:1; //!< \brief 0: Continue on channel Idle
+ //!< 1: End on channel Idle + uint8_t timeoutRes:1; //!< \brief 0: Timeout with channel state Invalid treated as Busy
+ //!< 1: Timeout with channel state Invalid treated as Idle + } csConf; + int8_t rssiThr; //!< RSSI threshold + uint8_t numRssiIdle; //!< \brief Number of consecutive RSSI measurements below the threshold needed before the channel is + //!< declared Idle + uint8_t numRssiBusy; //!< \brief Number of consecutive RSSI measurements above the threshold needed before the channel is + //!< declared Busy + uint16_t corrPeriod; //!< Number of RAT ticks for a correlation observation periods + struct { + uint8_t numCorrInv:4; //!< \brief Number of subsequent correlation tops with maximum corrPeriod RAT + //!< ticks between them needed to go from Idle to Invalid + uint8_t numCorrBusy:4; //!< \brief Number of subsequent correlation tops with maximum corrPeriod RAT + //!< ticks between them needed to go from Invalid to Busy + } corrConfig; + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } csEndTrigger; //!< Trigger classifier for ending the carrier sense + ratmr_t csEndTime; //!< Time used together with csEndTrigger for ending the operation +}; + +//! @} + +//! \addtogroup CMD_PROP_TX +//! @{ +#define CMD_PROP_TX 0x3801 +struct __RFC_STRUCT rfc_CMD_PROP_TX_s { + uint16_t commandNo; //!< The command ID number 0x3801 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + struct { + uint8_t bFsOff:1; //!< \brief 0: Keep frequency synth on after command
+ //!< 1: Turn frequency synth off after command + uint8_t :2; + uint8_t bUseCrc:1; //!< \brief 0: Do not append CRC
+ //!< 1: Append CRC + uint8_t bVarLen:1; //!< \brief 0: Fixed length
+ //!< 1: Transmit length as first byte + } pktConf; + uint8_t pktLen; //!< Packet length + uint32_t syncWord; //!< Sync word to transmit + uint8_t* pPkt; //!< Pointer to packet +}; + +//! @} + +//! \addtogroup CMD_PROP_RX +//! @{ +#define CMD_PROP_RX 0x3802 +struct __RFC_STRUCT rfc_CMD_PROP_RX_s { + uint16_t commandNo; //!< The command ID number 0x3802 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + struct { + uint8_t bFsOff:1; //!< \brief 0: Keep frequency synth on after command
+ //!< 1: Turn frequency synth off after command + uint8_t bRepeatOk:1; //!< \brief 0: End operation after receiving a packet correctly
+ //!< 1: Go back to sync search after receiving a packet correctly + uint8_t bRepeatNok:1; //!< \brief 0: End operation after receiving a packet with CRC error
+ //!< 1: Go back to sync search after receiving a packet with CRC error + uint8_t bUseCrc:1; //!< \brief 0: Do not check CRC
+ //!< 1: Check CRC + uint8_t bVarLen:1; //!< \brief 0: Fixed length
+ //!< 1: Receive length as first byte + uint8_t bChkAddress:1; //!< \brief 0: No address check
+ //!< 1: Check address + uint8_t endType:1; //!< \brief 0: Packet is received to the end if end trigger happens after sync is obtained
+ //!< 1: Packet reception is stopped if end trigger happens + uint8_t filterOp:1; //!< \brief 0: Stop receiver and restart sync search on address mismatch
+ //!< 1: Receive packet and mark it as ignored on address mismatch + } pktConf; + struct { + uint8_t bAutoFlushIgnored:1; //!< If 1, automatically discard ignored packets from Rx queue + uint8_t bAutoFlushCrcErr:1; //!< If 1, automatically discard packets with CRC error from Rx queue + uint8_t :1; + uint8_t bIncludeHdr:1; //!< If 1, include the received header or length byte in the stored packet; otherwise discard it + uint8_t bIncludeCrc:1; //!< If 1, include the received CRC field in the stored packet; otherwise discard it + uint8_t bAppendRssi:1; //!< If 1, append an RSSI byte to the packet in the Rx queue + uint8_t bAppendTimestamp:1; //!< If 1, append a timestamp to the packet in the Rx queue + uint8_t bAppendStatus:1; //!< If 1, append a status byte to the packet in the Rx queue + } rxConf; //!< Rx configuration + uint32_t syncWord; //!< Sync word to listen for + uint8_t maxPktLen; //!< \brief Packet length for fixed length, maximum packet length for variable length
+ //!< 0: Unlimited or unknown length + uint8_t address0; //!< Address + uint8_t address1; //!< \brief Address (set equal to address0 to accept only one address. If 0xFF, accept + //!< 0x00 as well) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } endTrigger; //!< Trigger classifier for ending the operation + ratmr_t endTime; //!< Time used together with endTrigger for ending the operation + dataQueue_t* pQueue; //!< Pointer to receive queue + uint8_t* pOutput; //!< Pointer to output structure +}; + +//! @} + +//! \addtogroup CMD_PROP_TX_ADV +//! @{ +#define CMD_PROP_TX_ADV 0x3803 +struct __RFC_STRUCT rfc_CMD_PROP_TX_ADV_s { + uint16_t commandNo; //!< The command ID number 0x3803 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + struct { + uint8_t bFsOff:1; //!< \brief 0: Keep frequency synth on after command
+ //!< 1: Turn frequency synth off after command + uint8_t :2; + uint8_t bUseCrc:1; //!< \brief 0: Do not append CRC
+ //!< 1: Append CRC + uint8_t bCrcIncSw:1; //!< \brief 0:Do not include sync word in CRC calculation
+ //!< 1: Include sync word in CRC calculation + uint8_t bCrcIncHdr:1; //!< \brief 0: Do not include header in CRC calculation
+ //!< 1: Include header in CRC calculation + } pktConf; + uint8_t numHdrBits; //!< Number of bits in header (0–32) + uint16_t pktLen; //!< Packet length. 0: Unlimited + struct { + uint8_t bExtTxTrig:1; //!< \brief 0: Start packet on a fixed time from the command start trigger
+ //!< 1: Start packet on an external trigger (input event to RAT) + uint8_t inputMode:2; //!< \brief Input mode if external trigger is used for Tx start
+ //!< 0: Rising edge
+ //!< 1: Falling edge
+ //!< 2: Both edges
+ //!< 3: Reserved + uint8_t source:5; //!< RAT input event number used for capture if external trigger is used for Tx start + } startConf; + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } preTrigger; //!< Trigger for transition from preamble to sync word + ratmr_t preTime; //!< \brief Time used together with preTrigger for transition from preamble to sync + //!< word. If preTrigger.triggerType is set to "now", one preamble as + //!< configured in the setup will be sent. Otherwise, the preamble will be repeated until + //!< this trigger is observed. + uint32_t syncWord; //!< Sync word to transmit + uint8_t* pPkt; //!< Pointer to packet, or Tx queue for unlimited length +}; + +//! @} + +//! \addtogroup CMD_PROP_RX_ADV +//! @{ +#define CMD_PROP_RX_ADV 0x3804 +struct __RFC_STRUCT rfc_CMD_PROP_RX_ADV_s { + uint16_t commandNo; //!< The command ID number 0x3804 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + struct { + uint8_t bFsOff:1; //!< \brief 0: Keep frequency synth on after command
+ //!< 1: Turn frequency synth off after command + uint8_t bRepeatOk:1; //!< \brief 0: End operation after receiving a packet correctly
+ //!< 1: Go back to sync search after receiving a packet correctly + uint8_t bRepeatNok:1; //!< \brief 0: End operation after receiving a packet with CRC error
+ //!< 1: Go back to sync search after receiving a packet with CRC error + uint8_t bUseCrc:1; //!< \brief 0: Do not check CRC
+ //!< 1: Check CRC + uint8_t bCrcIncSw:1; //!< \brief 0: Do not include sync word in CRC calculation
+ //!< 1: Include sync word in CRC calculation + uint8_t bCrcIncHdr:1; //!< \brief 0: Do not include header in CRC calculation
+ //!< 1: Include header in CRC calculation + uint8_t endType:1; //!< \brief 0: Packet is received to the end if end trigger happens after sync is obtained
+ //!< 1: Packet reception is stopped if end trigger happens + uint8_t filterOp:1; //!< \brief 0: Stop receiver and restart sync search on address mismatch
+ //!< 1: Receive packet and mark it as ignored on address mismatch + } pktConf; + struct { + uint8_t bAutoFlushIgnored:1; //!< If 1, automatically discard ignored packets from Rx queue + uint8_t bAutoFlushCrcErr:1; //!< If 1, automatically discard packets with CRC error from Rx queue + uint8_t :1; + uint8_t bIncludeHdr:1; //!< If 1, include the received header or length byte in the stored packet; otherwise discard it + uint8_t bIncludeCrc:1; //!< If 1, include the received CRC field in the stored packet; otherwise discard it + uint8_t bAppendRssi:1; //!< If 1, append an RSSI byte to the packet in the Rx queue + uint8_t bAppendTimestamp:1; //!< If 1, append a timestamp to the packet in the Rx queue + uint8_t bAppendStatus:1; //!< If 1, append a status byte to the packet in the Rx queue + } rxConf; //!< Rx configuration + uint32_t syncWord0; //!< Sync word to listen for + uint32_t syncWord1; //!< Alternative sync word if non-zero + uint16_t maxPktLen; //!< \brief Packet length for fixed length, maximum packet length for variable length
+ //!< 0: Unlimited or unknown length + struct { + uint16_t numHdrBits:6; //!< Number of bits in header (0–32) + uint16_t lenPos:5; //!< Position of length field in header (0–31) + uint16_t numLenBits:5; //!< Number of bits in length field (0–16) + } hdrConf; + struct { + uint16_t addrType:1; //!< \brief 0: Address after header
+ //!< 1: Address in header + uint16_t addrSize:5; //!< \brief If addrType = 0: Address size in bytes
+ //!< If addrType = 1: Address size in bits + uint16_t addrPos:5; //!< \brief If addrType = 1: Bit position of address in header
+ //!< If addrType = 0: Non-zero to extend address with sync word identifier + uint16_t numAddr:5; //!< Number of addresses in address list + } addrConf; + int8_t lenOffset; //!< Signed value to add to length field + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } endTrigger; //!< Trigger classifier for ending the operation + ratmr_t endTime; //!< Time used together with endTrigger for ending the operation + uint8_t* pAddr; //!< Pointer to address list + dataQueue_t* pQueue; //!< Pointer to receive queue + uint8_t* pOutput; //!< Pointer to output structure +}; + +//! @} + +//! \addtogroup CMD_PROP_RADIO_SETUP +//! @{ +#define CMD_PROP_RADIO_SETUP 0x3806 +struct __RFC_STRUCT rfc_CMD_PROP_RADIO_SETUP_s { + uint16_t commandNo; //!< The command ID number 0x3806 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + struct { + uint16_t modType:3; //!< \brief 0: FSK
+ //!< 1: GFSK
+ //!< Others: Reserved + uint16_t deviation:13; //!< Deviation (250 Hz steps) + } modulation; + struct { + uint32_t preScale:4; //!< Prescaler value + uint32_t :4; + uint32_t rateWord:21; //!< Rate word + } symbolRate; + uint8_t rxBw; //!< Receiver bandwidth + struct { + uint8_t nPreamBytes:6; //!< \brief 0–30: Number of preamble bytes
+ //!< 31: 4 preamble bits + uint8_t preamMode:2; //!< \brief 0: Send 0 as the first preamble bit
+ //!< 1: Send 1 as the first preamble bit
+ //!< 2: Send same first bit in preamble and sync word
+ //!< 3: Send different first bit in preamble and sync word + } preamConf; + struct { + uint16_t nSwBits:6; //!< Number of sync word bits (up to 32) + uint16_t bBitReversal:1; //!< \brief 0: Use positive deviation for 1
+ //!< 1: Use positive deviation for 0 + uint16_t bMsbFirst:1; //!< \brief 0: Least significant bit transmitted first
+ //!< 1: Most significant bit transmitted first + uint16_t fecMode:4; //!< \brief Select coding
+ //!< 0: Uncoded binary modulation
+ //!< 10: Manchester coded binary modulation
+ //!< Others: Reserved + uint16_t :1; + uint16_t whitenMode:3; //!< \brief 0: No whitening
+ //!< 1: CC1101/CC2500 compatible whitening
+ //!< 2: PN9 whitening without byte reversal
+ //!< 3: Reserved
+ //!< 4: No whitener, 32-bit IEEE 802.15.4g compatible CRC
+ //!< 5: IEEE 802.15.4g compatible whitener and 32-bit CRC
+ //!< 6: No whitener, dynamically IEEE 802.15.4g compatible 16-bit or 32-bit CRC
+ //!< 7: Dynamically IEEE 802.15.4g compatible whitener and 16-bit or 32-bit CRC + } formatConf; + struct { + uint16_t frontEndMode:3; //!< \brief 0x00: Differential mode
+ //!< 0x01: Single-ended mode RFP
+ //!< 0x02: Single-ended mode RFN
+ //!< 0x05 Single-ended mode RFP with external frontend control on RF pins (RFN and RXTX)
+ //!< 0x06 Single-ended mode RFN with external frontend control on RF pins (RFP and RXTX)
+ //!< Others: Reserved + uint16_t biasMode:1; //!< \brief 0: Internal bias
+ //!< 1: External bias + uint16_t :6; + uint16_t bNoFsPowerUp:1; //!< \brief 0: Power up frequency synth
+ //!< 1: Do not power up frequency synth + } config; //!< Configuration options + uint16_t txPower; //!< Transmit power + uint32_t* pRegOverride; //!< \brief Pointer to a list of hardware and configuration registers to override. If NULL, no + //!< override is used. +}; + +//! @} + +//! \addtogroup CMD_PROP_RADIO_DIV_SETUP +//! @{ +#define CMD_PROP_RADIO_DIV_SETUP 0x3807 +struct __RFC_STRUCT rfc_CMD_PROP_RADIO_DIV_SETUP_s { + uint16_t commandNo; //!< The command ID number 0x3807 + uint16_t status; //!< \brief An integer telling the status of the command. This value is + //!< updated by the radio CPU during operation and may be read by the + //!< system CPU at any time. + rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done + ratmr_t startTime; //!< Absolute or relative start time (depending on the value of startTrigger) + struct { + uint8_t triggerType:4; //!< The type of trigger + uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command
+ //!< 1: CMD_TRIGGER can be used as an alternative trigger + uint8_t triggerNo:2; //!< The trigger number of the CMD_TRIGGER command that triggers this action + uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error
+ //!< 1: A trigger in the past is triggered as soon as possible + } startTrigger; //!< Identification of the trigger that starts the operation + struct { + uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed + uint8_t nSkip:4; //!< Number of skips if the rule involves skipping + } condition; + struct { + uint16_t modType:3; //!< \brief 0: FSK
+ //!< 1: GFSK
+ //!< Others: Reserved + uint16_t deviation:13; //!< Deviation (250 Hz steps) + } modulation; + struct { + uint32_t preScale:4; //!< Prescaler value + uint32_t :4; + uint32_t rateWord:21; //!< Rate word + } symbolRate; + uint8_t rxBw; //!< Receiver bandwidth + struct { + uint8_t nPreamBytes:6; //!< \brief 0–30: Number of preamble bytes
+ //!< 31: 4 preamble bits + uint8_t preamMode:2; //!< \brief 0: Send 0 as the first preamble bit
+ //!< 1: Send 1 as the first preamble bit
+ //!< 2: Send same first bit in preamble and sync word
+ //!< 3: Send different first bit in preamble and sync word + } preamConf; + struct { + uint16_t nSwBits:6; //!< Number of sync word bits (up to 32) + uint16_t bBitReversal:1; //!< \brief 0: Use positive deviation for 1
+ //!< 1: Use positive deviation for 0 + uint16_t bMsbFirst:1; //!< \brief 0: Least significant bit transmitted first
+ //!< 1: Most significant bit transmitted first + uint16_t fecMode:4; //!< \brief Select coding
+ //!< 0: Uncoded binary modulation
+ //!< 10: Manchester coded binary modulation
+ //!< Others: Reserved + uint16_t :1; + uint16_t whitenMode:3; //!< \brief 0: No whitening
+ //!< 1: CC1101/CC2500 compatible whitening
+ //!< 2: PN9 whitening without byte reversal
+ //!< 3: Reserved
+ //!< 4: No whitener, 32-bit IEEE 802.15.4g compatible CRC
+ //!< 5: IEEE 802.15.4g compatible whitener and 32-bit CRC
+ //!< 6: No whitener, dynamically IEEE 802.15.4g compatible 16-bit or 32-bit CRC
+ //!< 7: Dynamically IEEE 802.15.4g compatible whitener and 16-bit or 32-bit CRC + } formatConf; + struct { + uint16_t frontEndMode:3; //!< \brief 0x00: Differential mode
+ //!< 0x01: Single-ended mode RFP
+ //!< 0x02: Single-ended mode RFN
+ //!< 0x05 Single-ended mode RFP with external frontend control on RF pins (RFN and RXTX)
+ //!< 0x06 Single-ended mode RFN with external frontend control on RF pins (RFP and RXTX)
+ //!< Others: Reserved + uint16_t biasMode:1; //!< \brief 0: Internal bias
+ //!< 1: External bias + uint16_t :6; + uint16_t bNoFsPowerUp:1; //!< \brief 0: Power up frequency synth
+ //!< 1: Do not power up frequency synth + } config; //!< Configuration options + uint16_t txPower; //!< Transmit power + uint32_t* pRegOverride; //!< \brief Pointer to a list of hardware and configuration registers to override. If NULL, no + //!< override is used. + uint16_t centerFreq; //!< \brief Center frequency of the frequency band used, in MHz; used for calculating some internal Tx and Rx parameters. + //!< For a single channel RF system, this should be set equal to the RF frequency used. + //!< For a multi channel RF system (e.g. frequency hopping spread spectrum), this should be set equal + //!< to the center frequency of the frequency band used. + int16_t intFreq; //!< \brief Intermediate frequency to use for Rx, in MHz on 4.12 signed format. Tx will use same + //!< intermediate frequency if supported, otherwise 0.
+ //!< 0x8000: Use default. + uint8_t loDivider; //!< LO frequency divider setting to use. Supported values: 2, 5, 6, 10, 12, 15, and 30 +}; + +//! @} + +//! \addtogroup CMD_PROP_SET_LEN +//! @{ +#define CMD_PROP_SET_LEN 0x3401 +struct __RFC_STRUCT rfc_CMD_PROP_SET_LEN_s { + uint16_t commandNo; //!< The command ID number 0x3401 + uint16_t rxLen; //!< Payload length to use +}; + +//! @} + +//! \addtogroup CMD_PROP_RESTART_RX +//! @{ +#define CMD_PROP_RESTART_RX 0x3402 +struct __RFC_STRUCT rfc_CMD_PROP_RESTART_RX_s { + uint16_t commandNo; //!< The command ID number 0x3402 +}; + +//! @} + +//! \addtogroup propRxOutput +//! @{ +//! Output structure for Rx operations + +struct __RFC_STRUCT rfc_propRxOutput_s { + uint16_t nRxOk; //!< Number of packets that have been received with payload, CRC OK and not ignored + uint16_t nRxNok; //!< Number of packets that have been received with CRC error + uint8_t nRxIgnored; //!< Number of packets that have been received with CRC OK and ignored due to address mismatch + uint8_t nRxStopped; //!< Number of packets not received due to illegal length or address mismatch with pktConf.filterOp = 1 + uint8_t nRxBufFull; //!< Number of packets that have been received and discarded due to lack of buffer space + int8_t lastRssi; //!< RSSI of last received packet + ratmr_t timeStamp; //!< Time stamp of last received packet +}; + +//! @} + +//! \addtogroup propRxStatus +//! @{ +//! Receive status byte that may be appended to message in receive buffer + +struct __RFC_STRUCT rfc_propRxStatus_s { + struct { + uint8_t addressInd:5; //!< Index of address found (0 if not applicable) + uint8_t syncWordId:1; //!< 0 for primary sync word, 1 for alternate sync word + uint8_t result:2; //!< \brief 0: Packet received correctly, not ignored
+ //!< 1: Packet received with CRC error
+ //!< 2: Packet received correctly, but can be ignored
+ //!< 3: Packet reception was aborted + } status; +}; + +//! @} + +//! @} +//! @} +#endif /* PROP_CMD_H_ */ diff --git a/cpu/cc26xx-cc13xx/rf-core/api/prop_mailbox.h b/cpu/cc26xx-cc13xx/rf-core/api/prop_mailbox.h new file mode 100644 index 000000000..ff7b6c25b --- /dev/null +++ b/cpu/cc26xx-cc13xx/rf-core/api/prop_mailbox.h @@ -0,0 +1,71 @@ +/****************************************************************************** +* Filename: prop_mailbox.h +* Revised: 2015-06-29 12:59:58 +0200 (Mon, 29 Jun 2015) +* Revision: 44063 +* +* Description: Definitions for proprietary mode radio interface +* +* Copyright (c) 2015, Texas Instruments Incorporated +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* 1) Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* +* 2) Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* 3) Neither the name of the ORGANIZATION nor the names of its contributors may +* be used to endorse or promote products derived from this software without +* specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +******************************************************************************/ + +#ifndef PROP_MAILBOX_H_ +#define PROP_MAILBOX_H_ + +/// \name Radio operation status +///@{ +/// \name Operation finished normally +///@{ +#define PROP_DONE_OK 0x3400 ///< Operation ended normally +#define PROP_DONE_RXTIMEOUT 0x3401 ///< Operation stopped after end trigger while waiting for sync +#define PROP_DONE_BREAK 0x3402 ///< Rx stopped due to time out in the middle of a packet +#define PROP_DONE_ENDED 0x3403 ///< Operation stopped after end trigger during reception +#define PROP_DONE_STOPPED 0x3404 ///< Operation stopped after stop command +#define PROP_DONE_ABORT 0x3405 ///< Operation aborted by abort command +#define PROP_DONE_RXERR 0x3406 ///< Operation ended after receiving packet with CRC error +#define PROP_DONE_IDLE 0x3407 ///< Carrier sense operation ended because of idle channel +#define PROP_DONE_BUSY 0x3408 ///< Carrier sense operation ended because of busy channel +#define PROP_DONE_IDLETIMEOUT 0x3409 ///< Carrier sense operation ended because of time out with csConf.timeoutRes = 1 +#define PROP_DONE_BUSYTIMEOUT 0x340A ///< Carrier sense operation ended because of time out with csConf.timeoutRes = 0 + +///@} +/// \name Operation finished with error +///@{ +#define PROP_ERROR_PAR 0x3800 ///< Illegal parameter +#define PROP_ERROR_RXBUF 0x3801 ///< No available Rx buffer at the start of a packet +#define PROP_ERROR_RXFULL 0x3802 ///< Out of Rx buffer during reception in a partial read buffer +#define PROP_ERROR_NO_SETUP 0x3803 ///< Radio was not set up in proprietary mode +#define PROP_ERROR_NO_FS 0x3804 ///< Synth was not programmed when running Rx or Tx +#define PROP_ERROR_RXOVF 0x3805 ///< Rx overflow observed during operation +#define PROP_ERROR_TXUNF 0x3806 ///< Tx underflow observed during operation +///@} +///@} + +#endif /* PROP_MAILBOX_H_ */ diff --git a/cpu/cc26xx-cc13xx/rf-core/dot-15-4g.h b/cpu/cc26xx-cc13xx/rf-core/dot-15-4g.h new file mode 100644 index 000000000..30dc63367 --- /dev/null +++ b/cpu/cc26xx-cc13xx/rf-core/dot-15-4g.h @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2015, Texas Instruments Incorporated - http://www.ti.com/ + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup rf-core + * @{ + * + * \defgroup rf-core-15-4g-modes IEEE 802.15.4g Frequency Bands and Modes + * + * @{ + * + * \file + * Header file with descriptors for the various modes of operation defined in + * IEEE 802.15.4g + */ +/*---------------------------------------------------------------------------*/ +#ifndef DOT_15_4G_H_ +#define DOT_15_4G_H_ +/*---------------------------------------------------------------------------*/ +#include "contiki-conf.h" +/*---------------------------------------------------------------------------*/ +/* IEEE 802.15.4g frequency band identifiers (Table 68f) */ +#define DOT_15_4G_FREQUENCY_BAND_169 0 /* 169.400–169.475 (Europe) - 169 MHz band */ +#define DOT_15_4G_FREQUENCY_BAND_450 1 /* 450–470 (US FCC Part 22/90) - 450 MHz band */ +#define DOT_15_4G_FREQUENCY_BAND_470 2 /* 470–510 (China) - 470 MHz band */ +#define DOT_15_4G_FREQUENCY_BAND_780 3 /* 779–787 (China) - 780 MHz band */ +#define DOT_15_4G_FREQUENCY_BAND_863 4 /* 863–870 (Europe) - 863 MHz band */ +#define DOT_15_4G_FREQUENCY_BAND_896 5 /* 896–901 (US FCC Part 90) - 896 MHz band */ +#define DOT_15_4G_FREQUENCY_BAND_901 6 /* 901–902 (US FCC Part 24) - 901 MHz band */ +#define DOT_15_4G_FREQUENCY_BAND_915 7 /* 902–928 (US) - 915 MHz band */ +#define DOT_15_4G_FREQUENCY_BAND_917 8 /* 917–923.5 (Korea) - 917 MHz band */ +#define DOT_15_4G_FREQUENCY_BAND_920 9 /* 920–928 (Japan) - 920 MHz band */ +#define DOT_15_4G_FREQUENCY_BAND_928 10 /* 928–960 (US, non-contiguous) - 928 MHz band */ +#define DOT_15_4G_FREQUENCY_BAND_950 11 /* 950–958 (Japan) - 950 MHz band */ +#define DOT_15_4G_FREQUENCY_BAND_1427 12 /* 1427–1518 (US and Canada, non-contiguous) - 1427 MHz band */ +#define DOT_15_4G_FREQUENCY_BAND_2450 13 /* 2400–2483.5 2450 MHz band */ +/*---------------------------------------------------------------------------*/ +/* Default band selection to band 4 - 863MHz */ +#ifdef DOT_15_4G_CONF_FREQUENCY_BAND_ID +#define DOT_15_4G_FREQUENCY_BAND_ID DOT_15_4G_CONF_FREQUENCY_BAND_ID +#else +#define DOT_15_4G_FREQUENCY_BAND_ID DOT_15_4G_FREQUENCY_BAND_863 +#endif +/*---------------------------------------------------------------------------*/ +/* + * Channel count, spacing and other params relating to the selected band. We + * currently only support some of the bands defined in .15.4g and for those + * bands we only support operating mode #1 (Table 134). + * + * DOT_15_4G_CHAN0_FREQUENCY is specified here in KHz + */ +#if DOT_15_4G_FREQUENCY_BAND_ID==DOT_15_4G_FREQUENCY_BAND_470 +#define DOT_15_4G_CHANNEL_MAX 198 +#define DOT_15_4G_CHANNEL_SPACING 200 +#define DOT_15_4G_CHAN0_FREQUENCY 470200 +#define PROP_MODE_CONF_LO_DIVIDER 0x0A + +#elif DOT_15_4G_FREQUENCY_BAND_ID==DOT_15_4G_FREQUENCY_BAND_780 +#define DOT_15_4G_CHANNEL_MAX 38 +#define DOT_15_4G_CHANNEL_SPACING 200 +#define DOT_15_4G_CHAN0_FREQUENCY 779200 +#define PROP_MODE_CONF_LO_DIVIDER 0x06 + +#elif DOT_15_4G_FREQUENCY_BAND_ID==DOT_15_4G_FREQUENCY_BAND_863 +#define DOT_15_4G_CHANNEL_MAX 33 +#define DOT_15_4G_CHANNEL_SPACING 200 +#define DOT_15_4G_CHAN0_FREQUENCY 863125 +#define PROP_MODE_CONF_LO_DIVIDER 0x05 + +#elif DOT_15_4G_FREQUENCY_BAND_ID==DOT_15_4G_FREQUENCY_BAND_915 +#define DOT_15_4G_CHANNEL_MAX 128 +#define DOT_15_4G_CHANNEL_SPACING 200 +#define DOT_15_4G_CHAN0_FREQUENCY 902200 +#define PROP_MODE_CONF_LO_DIVIDER 0x05 + +#elif DOT_15_4G_FREQUENCY_BAND_ID==DOT_15_4G_FREQUENCY_BAND_920 +#define DOT_15_4G_CHANNEL_MAX 37 +#define DOT_15_4G_CHANNEL_SPACING 200 +#define DOT_15_4G_CHAN0_FREQUENCY 920600 +#define PROP_MODE_CONF_LO_DIVIDER 0x05 + +#elif DOT_15_4G_FREQUENCY_BAND_ID==DOT_15_4G_FREQUENCY_BAND_950 +#define DOT_15_4G_CHANNEL_MAX 32 +#define DOT_15_4G_CHANNEL_SPACING 200 +#define DOT_15_4G_CHAN0_FREQUENCY 951000 +#define PROP_MODE_CONF_LO_DIVIDER 0x05 + +#else +#error The selected frequency band is not supported +#endif +/*---------------------------------------------------------------------------*/ +#endif /* DOT_15_4G_H_ */ +/*---------------------------------------------------------------------------*/ +/** + * @} + * @} + */ diff --git a/cpu/cc26xx-cc13xx/rf-core/ieee-mode.c b/cpu/cc26xx-cc13xx/rf-core/ieee-mode.c new file mode 100644 index 000000000..b997043ab --- /dev/null +++ b/cpu/cc26xx-cc13xx/rf-core/ieee-mode.c @@ -0,0 +1,1376 @@ +/* + * Copyright (c) 2014, Texas Instruments Incorporated - http://www.ti.com/ + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup rf-core + * @{ + * + * \defgroup rf-core-ieee CC13xx/CC26xx IEEE mode driver + * + * @{ + * + * \file + * Implementation of the CC13xx/CC26xx IEEE mode NETSTACK_RADIO driver + */ +/*---------------------------------------------------------------------------*/ +#include "contiki.h" +#include "dev/radio.h" +#include "dev/cc26xx-uart.h" +#include "dev/oscillators.h" +#include "net/packetbuf.h" +#include "net/rime/rimestats.h" +#include "net/linkaddr.h" +#include "net/netstack.h" +#include "sys/energest.h" +#include "sys/clock.h" +#include "sys/rtimer.h" +#include "sys/cc.h" +#include "lpm.h" +#include "ti-lib.h" +#include "rf-core/rf-core.h" +#include "rf-core/rf-ble.h" +/*---------------------------------------------------------------------------*/ +/* RF core and RF HAL API */ +#include "hw_rfc_dbell.h" +#include "hw_rfc_pwr.h" +/*---------------------------------------------------------------------------*/ +/* RF Core Mailbox API */ +#include "rf-core/api/mailbox.h" +#include "rf-core/api/common_cmd.h" +#include "rf-core/api/ieee_cmd.h" +#include "rf-core/api/data_entry.h" +#include "rf-core/api/ieee_mailbox.h" +/*---------------------------------------------------------------------------*/ +#include "smartrf-settings.h" +/*---------------------------------------------------------------------------*/ +#include +#include +#include +#include +/*---------------------------------------------------------------------------*/ +#ifdef __GNUC__ +#define CC_ALIGN_ATTR(n) __attribute__ ((aligned(n))) +#else +#define CC_ALIGN_ATTR(n) +#endif +/*---------------------------------------------------------------------------*/ +#define DEBUG 0 +#if DEBUG +#define PRINTF(...) printf(__VA_ARGS__) +#else +#define PRINTF(...) +#endif + +/* Configuration to enable/disable auto ACKs in IEEE mode */ +#ifdef IEEE_MODE_CONF_AUTOACK +#define IEEE_MODE_AUTOACK IEEE_MODE_CONF_AUTOACK +#else +#define IEEE_MODE_AUTOACK 1 +#endif /* IEEE_MODE_CONF_AUTOACK */ + +/* Configuration to enable/disable frame filtering in IEEE mode */ +#ifdef IEEE_MODE_CONF_PROMISCOUS +#define IEEE_MODE_PROMISCOUS IEEE_MODE_CONF_PROMISCOUS +#else +#define IEEE_MODE_PROMISCOUS 0 +#endif /* IEEE_MODE_CONF_PROMISCOUS */ + +#ifdef IEEE_MODE_CONF_RSSI_THRESHOLD +#define IEEE_MODE_RSSI_THRESHOLD IEEE_MODE_CONF_RSSI_THRESHOLD +#else +#define IEEE_MODE_RSSI_THRESHOLD 0xA6 +#endif /* IEEE_MODE_CONF_RSSI_THRESHOLD */ +/*---------------------------------------------------------------------------*/ +/* Data entry status field constants */ +#define DATA_ENTRY_STATUS_PENDING 0x00 /* Not in use by the Radio CPU */ +#define DATA_ENTRY_STATUS_ACTIVE 0x01 /* Open for r/w by the radio CPU */ +#define DATA_ENTRY_STATUS_BUSY 0x02 /* Ongoing r/w */ +#define DATA_ENTRY_STATUS_FINISHED 0x03 /* Free to use and to free */ +#define DATA_ENTRY_STATUS_UNFINISHED 0x04 /* Partial RX entry */ +/*---------------------------------------------------------------------------*/ +/* RF stats data structure */ +static uint8_t rf_stats[16] = { 0 }; +/*---------------------------------------------------------------------------*/ +/* The size of the RF commands buffer */ +#define RF_CMD_BUFFER_SIZE 128 +/*---------------------------------------------------------------------------*/ +/** + * \brief Returns the current status of a running Radio Op command + * \param a A pointer with the buffer used to initiate the command + * \return The value of the Radio Op buffer's status field + * + * This macro can be used to e.g. return the status of a previously + * initiated background operation, or of an immediate command + */ +#define RF_RADIO_OP_GET_STATUS(a) (((rfc_radioOp_t *)a)->status) +/*---------------------------------------------------------------------------*/ +/* Special value returned by CMD_IEEE_CCA_REQ when an RSSI is not available */ +#define RF_CMD_CCA_REQ_RSSI_UNKNOWN -128 + +/* Used for the return value of channel_clear */ +#define RF_CCA_CLEAR 1 +#define RF_CCA_BUSY 0 + +/* Used as an error return value for get_cca_info */ +#define RF_GET_CCA_INFO_ERROR 0xFF + +/* + * Values of the individual bits of the ccaInfo field in CMD_IEEE_CCA_REQ's + * status struct + */ +#define RF_CMD_CCA_REQ_CCA_STATE_IDLE 0 /* 00 */ +#define RF_CMD_CCA_REQ_CCA_STATE_BUSY 1 /* 01 */ +#define RF_CMD_CCA_REQ_CCA_STATE_INVALID 2 /* 10 */ +/*---------------------------------------------------------------------------*/ +#define IEEE_MODE_CHANNEL_MIN 11 +#define IEEE_MODE_CHANNEL_MAX 26 +/*---------------------------------------------------------------------------*/ +/* How long to wait for an ongoing ACK TX to finish before starting frame TX */ +#define TX_WAIT_TIMEOUT (RTIMER_SECOND >> 11) + +/* How long to wait for the RF to enter RX in rf_cmd_ieee_rx */ +#define ENTER_RX_WAIT_TIMEOUT (RTIMER_SECOND >> 10) +/*---------------------------------------------------------------------------*/ +/* TX Power dBm lookup table - values from SmartRF Studio */ +typedef struct output_config { + radio_value_t dbm; + uint8_t register_ib; + uint8_t register_gc; + uint8_t temp_coeff; +} output_config_t; + +static const output_config_t output_power[] = { + { 5, 0x30, 0x00, 0x93 }, + { 4, 0x24, 0x00, 0x93 }, + { 3, 0x1c, 0x00, 0x5a }, + { 2, 0x18, 0x00, 0x4e }, + { 1, 0x14, 0x00, 0x42 }, + { 0, 0x21, 0x01, 0x31 }, + { -3, 0x18, 0x01, 0x25 }, + { -6, 0x11, 0x01, 0x1d }, + { -9, 0x0e, 0x01, 0x19 }, + {-12, 0x0b, 0x01, 0x14 }, + {-15, 0x0b, 0x03, 0x0c }, + {-18, 0x09, 0x03, 0x0c }, + {-21, 0x07, 0x03, 0x0c }, +}; + +#define OUTPUT_CONFIG_COUNT (sizeof(output_power) / sizeof(output_config_t)) + +/* Max and Min Output Power in dBm */ +#define OUTPUT_POWER_MIN (output_power[OUTPUT_CONFIG_COUNT - 1].dbm) +#define OUTPUT_POWER_MAX (output_power[0].dbm) +#define OUTPUT_POWER_UNKNOWN 0xFFFF + +/* Default TX Power - position in output_power[] */ +const output_config_t *tx_power_current = &output_power[0]; +/*---------------------------------------------------------------------------*/ +/* + * Buffers used to send commands to the RF core (generic and IEEE commands). + * Some of those buffers are re-usable, some are not. + * + * If you are uncertain, declare a new buffer. + */ +/* + * A buffer to send a CMD_IEEE_RX and to subsequently monitor its status + * Do not use this buffer for any commands other than CMD_IEEE_RX + */ +static uint8_t cmd_ieee_rx_buf[RF_CMD_BUFFER_SIZE] CC_ALIGN_ATTR(4); +/*---------------------------------------------------------------------------*/ +#define DATA_ENTRY_LENSZ_NONE 0 +#define DATA_ENTRY_LENSZ_BYTE 1 +#define DATA_ENTRY_LENSZ_WORD 2 /* 2 bytes */ + +#define RX_BUF_SIZE 140 +/* Four receive buffers entries with room for 1 IEEE802.15.4 frame in each */ +static uint8_t rx_buf_0[RX_BUF_SIZE] CC_ALIGN_ATTR(4); +static uint8_t rx_buf_1[RX_BUF_SIZE] CC_ALIGN_ATTR(4); +static uint8_t rx_buf_2[RX_BUF_SIZE] CC_ALIGN_ATTR(4); +static uint8_t rx_buf_3[RX_BUF_SIZE] CC_ALIGN_ATTR(4); + +/* The RX Data Queue */ +static dataQueue_t rx_data_queue = { 0 }; + +/* Receive entry pointer to keep track of read items */ +volatile static uint8_t *rx_read_entry; +/*---------------------------------------------------------------------------*/ +/* The outgoing frame buffer */ +#define TX_BUF_PAYLOAD_LEN 180 +#define TX_BUF_HDR_LEN 2 + +static uint8_t tx_buf[TX_BUF_HDR_LEN + TX_BUF_PAYLOAD_LEN] CC_ALIGN_ATTR(4); +/*---------------------------------------------------------------------------*/ +/* Overrides for IEEE 802.15.4, differential mode */ +static uint32_t ieee_overrides[] = { + 0x00354038, /* Synth: Set RTRIM (POTAILRESTRIM) to 5 */ + 0x4001402D, /* Synth: Correct CKVD latency setting (address) */ + 0x00608402, /* Synth: Correct CKVD latency setting (value) */ +// 0x4001405D, /* Synth: Set ANADIV DIV_BIAS_MODE to PG1 (address) */ +// 0x1801F800, /* Synth: Set ANADIV DIV_BIAS_MODE to PG1 (value) */ + 0x000784A3, /* Synth: Set FREF = 3.43 MHz (24 MHz / 7) */ + 0xA47E0583, /* Synth: Set loop bandwidth after lock to 80 kHz (K2) */ + 0xEAE00603, /* Synth: Set loop bandwidth after lock to 80 kHz (K3, LSB) */ + 0x00010623, /* Synth: Set loop bandwidth after lock to 80 kHz (K3, MSB) */ + 0x002B50DC, /* Adjust AGC DC filter */ + 0x05000243, /* Increase synth programming timeout */ + 0x002082C3, /* Increase synth programming timeout */ + 0xFFFFFFFF, /* End of override list */ +}; +/*---------------------------------------------------------------------------*/ +static int on(void); +static int off(void); +/*---------------------------------------------------------------------------*/ +/** + * \brief Checks whether the RFC domain is accessible and the RFC is in IEEE RX + * \return 1: RFC in RX mode (and therefore accessible too). 0 otherwise + */ +static uint8_t +rf_is_on(void) +{ + if(!rf_core_is_accessible()) { + return 0; + } + + return RF_RADIO_OP_GET_STATUS(cmd_ieee_rx_buf) == RF_CORE_RADIO_OP_STATUS_ACTIVE; +} +/*---------------------------------------------------------------------------*/ +/** + * \brief Check the RF's TX status + * \return 1 RF is transmitting + * \return 0 RF is not transmitting + * + * TX mode may be triggered either by a CMD_IEEE_TX or by the automatic + * transmission of an ACK frame. + */ +static uint8_t +transmitting(void) +{ + uint32_t cmd_status; + rfc_CMD_IEEE_CCA_REQ_t cmd; + + /* If we are off, we are not in TX */ + if(!rf_core_is_accessible()) { + return 0; + } + + memset(&cmd, 0x00, sizeof(cmd)); + + cmd.commandNo = CMD_IEEE_CCA_REQ; + + if(rf_core_send_cmd((uint32_t)&cmd, &cmd_status) == RF_CORE_CMD_ERROR) { + PRINTF("transmitting: CMDSTA=0x%08lx\n", cmd_status); + return 0; + } + + if((cmd.currentRssi == RF_CMD_CCA_REQ_RSSI_UNKNOWN) && + (cmd.ccaInfo.ccaEnergy == RF_CMD_CCA_REQ_CCA_STATE_BUSY)) { + return 1; + } + + return 0; +} +/*---------------------------------------------------------------------------*/ +/** + * \brief Returns CCA information + * \return RF_GET_CCA_INFO_ERROR if the RF was not on + * \return On success, the return value is formatted as per the ccaInfo field + * of CMD_IEEE_CCA_REQ + * + * It is the caller's responsibility to make sure the RF is on. This function + * will return RF_GET_CCA_INFO_ERROR if the RF is off + * + * This function will in fact wait for a valid RSSI signal + */ +static uint8_t +get_cca_info(void) +{ + uint32_t cmd_status; + int8_t rssi; + rfc_CMD_IEEE_CCA_REQ_t cmd; + + if(!rf_is_on()) { + PRINTF("get_cca_info: Not on\n"); + return RF_GET_CCA_INFO_ERROR; + } + + rssi = RF_CMD_CCA_REQ_RSSI_UNKNOWN; + + while(rssi == RF_CMD_CCA_REQ_RSSI_UNKNOWN || rssi == 0) { + memset(&cmd, 0x00, sizeof(cmd)); + cmd.commandNo = CMD_IEEE_CCA_REQ; + + if(rf_core_send_cmd((uint32_t)&cmd, &cmd_status) == RF_CORE_CMD_ERROR) { + PRINTF("get_cca_info: CMDSTA=0x%08lx\n", cmd_status); + + return RF_GET_CCA_INFO_ERROR; + } + + rssi = cmd.currentRssi; + } + + /* We have a valid RSSI signal. Return the CCA Info */ + return *((uint8_t *)&cmd.ccaInfo); +} +/*---------------------------------------------------------------------------*/ +/** + * \brief Reads the current signal strength (RSSI) + * \return The current RSSI in dBm or CMD_GET_RSSI_UNKNOWN + * + * This function reads the current RSSI on the currently configured + * channel. + */ +static radio_value_t +get_rssi(void) +{ + uint32_t cmd_status; + int8_t rssi; + uint8_t was_off = 0; + rfc_CMD_GET_RSSI_t cmd; + + /* If we are off, turn on first */ + if(!rf_is_on()) { + was_off = 1; + if(on() != RF_CORE_CMD_OK) { + PRINTF("get_rssi: on() failed\n"); + return RF_CMD_CCA_REQ_RSSI_UNKNOWN; + } + } + + memset(&cmd, 0x00, sizeof(cmd)); + cmd.commandNo = CMD_GET_RSSI; + + rssi = RF_CMD_CCA_REQ_RSSI_UNKNOWN; + + if(rf_core_send_cmd((uint32_t)&cmd, &cmd_status) == RF_CORE_CMD_OK) { + /* Current RSSI in bits 23:16 of cmd_status */ + rssi = (cmd_status >> 16) & 0xFF; + } + + /* If we were off, turn back off */ + if(was_off) { + off(); + } + + return rssi; +} +/*---------------------------------------------------------------------------*/ +/* Returns the current TX power in dBm */ +static radio_value_t +get_tx_power(void) +{ + return tx_power_current->dbm; +} +/*---------------------------------------------------------------------------*/ +/* + * Set TX power to 'at least' power dBm + * This works with a lookup table. If the value of 'power' does not exist in + * the lookup table, TXPOWER will be set to the immediately higher available + * value + */ +static void +set_tx_power(radio_value_t power) +{ + uint32_t cmd_status; + int i; + rfc_CMD_SET_TX_POWER_t cmd; + + /* Send a CMD_SET_TX_POWER command to the RF */ + memset(&cmd, 0x00, sizeof(cmd)); + + cmd.commandNo = CMD_SET_TX_POWER; + + for(i = OUTPUT_CONFIG_COUNT - 1; i >= 0; --i) { + if(power <= output_power[i].dbm) { + cmd.txPower.IB = output_power[i].register_ib; + cmd.txPower.GC = output_power[i].register_gc; + cmd.txPower.tempCoeff = output_power[i].temp_coeff; + + if(rf_core_send_cmd((uint32_t)&cmd, &cmd_status) == RF_CORE_CMD_OK) { + /* Success: Remember the new setting */ + tx_power_current = &output_power[i]; + } else { + PRINTF("set_tx_power: CMDSTA=0x%08lx\n", cmd_status); + } + return; + } + } +} +/*---------------------------------------------------------------------------*/ +static uint8_t +rf_radio_setup() +{ + uint32_t cmd_status; + rfc_CMD_RADIO_SETUP_t cmd; + + /* Create radio setup command */ + rf_core_init_radio_op((rfc_radioOp_t *)&cmd, sizeof(cmd), CMD_RADIO_SETUP); + + cmd.txPower.IB = tx_power_current->register_ib; + cmd.txPower.GC = tx_power_current->register_gc; + cmd.txPower.tempCoeff = tx_power_current->temp_coeff; + cmd.pRegOverride = ieee_overrides; + cmd.mode = 1; + + /* Send Radio setup to RF Core */ + if(rf_core_send_cmd((uint32_t)&cmd, &cmd_status) != RF_CORE_CMD_OK) { + PRINTF("rf_radio_setup: CMD_RADIO_SETUP, CMDSTA=0x%08lx, status=0x%04x\n", + cmd_status, cmd.status); + return RF_CORE_CMD_ERROR; + } + + /* Wait until radio setup is done */ + if(rf_core_wait_cmd_done(&cmd) != RF_CORE_CMD_OK) { + PRINTF("rf_radio_setup: CMD_RADIO_SETUP wait, CMDSTA=0x%08lx, status=0x%04x\n", + cmd_status, cmd.status); + return RF_CORE_CMD_ERROR; + } + + return RF_CORE_CMD_OK; +} +/*---------------------------------------------------------------------------*/ +/** + * \brief Set up radio in IEEE802.15.4 RX mode + * + * \return RF_CORE_CMD_OK Succeeded + * \return RF_CORE_CMD_ERROR Failed + * + * This function assumes that cmd_ieee_rx_buf has been previously populated + * with correct values. This can be done through init_rf_params (sets defaults) + * or through Contiki's extended RF API (set_value, set_object) + */ +static uint8_t +rf_cmd_ieee_rx() +{ + uint32_t cmd_status; + rtimer_clock_t t0; + int ret; + + ret = rf_core_send_cmd((uint32_t)cmd_ieee_rx_buf, &cmd_status); + + if(ret != RF_CORE_CMD_OK) { + PRINTF("rf_cmd_ieee_rx: ret=%d, CMDSTA=0x%08lx, status=0x%04x\n", + ret, cmd_status, RF_RADIO_OP_GET_STATUS(cmd_ieee_rx_buf)); + return RF_CORE_CMD_ERROR; + } + + t0 = RTIMER_NOW(); + + while(RF_RADIO_OP_GET_STATUS(cmd_ieee_rx_buf) != RF_CORE_RADIO_OP_STATUS_ACTIVE && + (RTIMER_CLOCK_LT(RTIMER_NOW(), t0 + ENTER_RX_WAIT_TIMEOUT))); + + /* Wait to enter RX */ + if(RF_RADIO_OP_GET_STATUS(cmd_ieee_rx_buf) != RF_CORE_RADIO_OP_STATUS_ACTIVE) { + PRINTF("rf_cmd_ieee_rx: CMDSTA=0x%08lx, status=0x%04x\n", + cmd_status, RF_RADIO_OP_GET_STATUS(cmd_ieee_rx_buf)); + return RF_CORE_CMD_ERROR; + } + + return ret; +} +/*---------------------------------------------------------------------------*/ +static void +init_rx_buffers(void) +{ + rfc_dataEntry_t *entry; + + entry = (rfc_dataEntry_t *)rx_buf_0; + entry->pNextEntry = rx_buf_1; + entry->config.lenSz = DATA_ENTRY_LENSZ_BYTE; + entry->length = sizeof(rx_buf_0) - 8; + + entry = (rfc_dataEntry_t *)rx_buf_1; + entry->pNextEntry = rx_buf_2; + entry->config.lenSz = DATA_ENTRY_LENSZ_BYTE; + entry->length = sizeof(rx_buf_0) - 8; + + entry = (rfc_dataEntry_t *)rx_buf_2; + entry->pNextEntry = rx_buf_3; + entry->config.lenSz = DATA_ENTRY_LENSZ_BYTE; + entry->length = sizeof(rx_buf_0) - 8; + + entry = (rfc_dataEntry_t *)rx_buf_3; + entry->pNextEntry = rx_buf_0; + entry->config.lenSz = DATA_ENTRY_LENSZ_BYTE; + entry->length = sizeof(rx_buf_0) - 8; +} +/*---------------------------------------------------------------------------*/ +static void +init_rf_params(void) +{ + rfc_CMD_IEEE_RX_t *cmd = (rfc_CMD_IEEE_RX_t *)cmd_ieee_rx_buf; + + memset(cmd_ieee_rx_buf, 0x00, RF_CMD_BUFFER_SIZE); + + cmd->commandNo = CMD_IEEE_RX; + cmd->status = RF_CORE_RADIO_OP_STATUS_IDLE; + cmd->pNextOp = NULL; + cmd->startTime = 0x00000000; + cmd->startTrigger.triggerType = TRIG_NOW; + cmd->condition.rule = COND_NEVER; + cmd->channel = RF_CORE_CHANNEL; + + cmd->rxConfig.bAutoFlushCrc = 1; + cmd->rxConfig.bAutoFlushIgn = 0; + cmd->rxConfig.bIncludePhyHdr = 0; + cmd->rxConfig.bIncludeCrc = 1; + cmd->rxConfig.bAppendRssi = 1; + cmd->rxConfig.bAppendCorrCrc = 1; + cmd->rxConfig.bAppendSrcInd = 0; + cmd->rxConfig.bAppendTimestamp = 0; + + cmd->pRxQ = &rx_data_queue; + cmd->pOutput = (rfc_ieeeRxOutput_t *)rf_stats; + +#if IEEE_MODE_PROMISCOUS + cmd->frameFiltOpt.frameFiltEn = 0; +#else + cmd->frameFiltOpt.frameFiltEn = 1; +#endif + + cmd->frameFiltOpt.frameFiltStop = 1; + +#if IEEE_MODE_AUTOACK + cmd->frameFiltOpt.autoAckEn = 1; +#else + cmd->frameFiltOpt.autoAckEn = 0; +#endif + + cmd->frameFiltOpt.slottedAckEn = 0; + cmd->frameFiltOpt.autoPendEn = 0; + cmd->frameFiltOpt.defaultPend = 0; + cmd->frameFiltOpt.bPendDataReqOnly = 0; + cmd->frameFiltOpt.bPanCoord = 0; + cmd->frameFiltOpt.maxFrameVersion = 1; + cmd->frameFiltOpt.bStrictLenFilter = 0; + + /* Receive all frame types */ + cmd->frameTypes.bAcceptFt0Beacon = 1; + cmd->frameTypes.bAcceptFt1Data = 1; + cmd->frameTypes.bAcceptFt2Ack = 1; + cmd->frameTypes.bAcceptFt3MacCmd = 1; + cmd->frameTypes.bAcceptFt4Reserved = 1; + cmd->frameTypes.bAcceptFt5Reserved = 1; + cmd->frameTypes.bAcceptFt6Reserved = 1; + cmd->frameTypes.bAcceptFt7Reserved = 1; + + /* Configure CCA settings */ + cmd->ccaOpt.ccaEnEnergy = 1; + cmd->ccaOpt.ccaEnCorr = 1; + cmd->ccaOpt.ccaEnSync = 0; + cmd->ccaOpt.ccaCorrOp = 1; + cmd->ccaOpt.ccaSyncOp = 1; + cmd->ccaOpt.ccaCorrThr = 3; + + cmd->ccaRssiThr = IEEE_MODE_RSSI_THRESHOLD; + + cmd->numExtEntries = 0x00; + cmd->numShortEntries = 0x00; + cmd->pExtEntryList = 0; + cmd->pShortEntryList = 0; + + cmd->endTrigger.triggerType = TRIG_NEVER; + cmd->endTime = 0x00000000; +} +/*---------------------------------------------------------------------------*/ +static int +rx_on(void) +{ + int ret; + + /* Get status of running IEEE_RX (if any) */ + if(rf_is_on()) { + PRINTF("rx_on: We were on. PD=%u, RX=0x%04x \n", rf_core_is_accessible(), + RF_RADIO_OP_GET_STATUS(cmd_ieee_rx_buf)); + return RF_CORE_CMD_OK; + } + + /* Put CPE in RX using the currently configured parameters */ + ret = rf_cmd_ieee_rx(); + + if(ret) { + ENERGEST_ON(ENERGEST_TYPE_LISTEN); + } + + return ret; +} +/*---------------------------------------------------------------------------*/ +static int +rx_off(void) +{ + uint32_t cmd_status; + int ret; + + /* If we are off, do nothing */ + if(!rf_is_on()) { + return RF_CORE_CMD_OK; + } + + /* Wait for ongoing ACK TX to finish */ + while(transmitting()); + + /* Send a CMD_ABORT command to RF Core */ + if(rf_core_send_cmd(CMDR_DIR_CMD(CMD_ABORT), &cmd_status) != RF_CORE_CMD_OK) { + PRINTF("RX off: CMD_ABORT status=0x%08lx\n", cmd_status); + /* Continue nonetheless */ + } + + while(rf_is_on()); + + if(RF_RADIO_OP_GET_STATUS(cmd_ieee_rx_buf) == IEEE_DONE_STOPPED || + RF_RADIO_OP_GET_STATUS(cmd_ieee_rx_buf) == IEEE_DONE_ABORT) { + /* Stopped gracefully */ + ENERGEST_OFF(ENERGEST_TYPE_LISTEN); + ret = RF_CORE_CMD_OK; + } else { + PRINTF("RX off: BG status=0x%04x\n", RF_RADIO_OP_GET_STATUS(cmd_ieee_rx_buf)); + ret = RF_CORE_CMD_ERROR; + } + + return ret; +} +/*---------------------------------------------------------------------------*/ +static uint8_t +request(void) +{ + /* + * We rely on the RDC layer to turn us on and off. Thus, if we are on we + * will only allow sleep, standby otherwise + */ + if(rf_is_on()) { + return LPM_MODE_SLEEP; + } + + return LPM_MODE_MAX_SUPPORTED; +} +/*---------------------------------------------------------------------------*/ +LPM_MODULE(cc26xx_rf_lpm_module, request, NULL, NULL, LPM_DOMAIN_NONE); +/*---------------------------------------------------------------------------*/ +static void +soft_off(void) +{ + uint32_t cmd_status; + volatile rfc_radioOp_t *cmd = rf_core_get_last_radio_op(); + + if(!rf_core_is_accessible()) { + return; + } + + PRINTF("soft_off: Aborting 0x%04x, Status=0x%04x\n", cmd->commandNo, + cmd->status); + + /* Send a CMD_ABORT command to RF Core */ + if(rf_core_send_cmd(CMDR_DIR_CMD(CMD_ABORT), &cmd_status) != RF_CORE_CMD_OK) { + PRINTF("soft_off: CMD_ABORT status=0x%08lx\n", cmd_status); + return; + } + + while((cmd->status & RF_CORE_RADIO_OP_MASKED_STATUS) == + RF_CORE_RADIO_OP_MASKED_STATUS_RUNNING); +} +/*---------------------------------------------------------------------------*/ +static uint8_t +soft_on(void) +{ + if(rf_radio_setup() != RF_CORE_CMD_OK) { + PRINTF("on: radio_setup() failed\n"); + return RF_CORE_CMD_ERROR; + } + + return rx_on(); +} +/*---------------------------------------------------------------------------*/ +static const rf_core_primary_mode_t mode_ieee = { + soft_off, + soft_on, +}; +/*---------------------------------------------------------------------------*/ +static int +init(void) +{ + lpm_register_module(&cc26xx_rf_lpm_module); + + rf_core_set_modesel(); + + /* Initialise RX buffers */ + memset(rx_buf_0, 0, RX_BUF_SIZE); + memset(rx_buf_1, 0, RX_BUF_SIZE); + memset(rx_buf_2, 0, RX_BUF_SIZE); + memset(rx_buf_3, 0, RX_BUF_SIZE); + + /* Set of RF Core data queue. Circular buffer, no last entry */ + rx_data_queue.pCurrEntry = rx_buf_0; + + rx_data_queue.pLastEntry = NULL; + + /* Initialize current read pointer to first element (used in ISR) */ + rx_read_entry = rx_buf_0; + + /* Populate the RF parameters data structure with default values */ + init_rf_params(); + + if(on() != RF_CORE_CMD_OK) { + PRINTF("init: on() failed\n"); + return RF_CORE_CMD_ERROR; + } + + ENERGEST_ON(ENERGEST_TYPE_LISTEN); + + rf_core_primary_mode_register(&mode_ieee); + + process_start(&rf_core_process, NULL); + return 1; +} +/*---------------------------------------------------------------------------*/ +static int +prepare(const void *payload, unsigned short payload_len) +{ + int len = MIN(payload_len, TX_BUF_PAYLOAD_LEN); + + memcpy(&tx_buf[TX_BUF_HDR_LEN], payload, len); + return RF_CORE_CMD_OK; +} +/*---------------------------------------------------------------------------*/ +static int +transmit(unsigned short transmit_len) +{ + int ret; + uint8_t was_off = 0; + uint32_t cmd_status; + uint16_t stat; + uint8_t tx_active = 0; + rtimer_clock_t t0; + rfc_CMD_IEEE_TX_t cmd; + + if(!rf_is_on()) { + was_off = 1; + if(on() != RF_CORE_CMD_OK) { + PRINTF("transmit: on() failed\n"); + return RADIO_TX_ERR; + } + } + + /* + * We are certainly not TXing a frame as a result of CMD_IEEE_TX, but we may + * be in the process of TXing an ACK. In that case, wait for the TX to finish + * or return after approx TX_WAIT_TIMEOUT + */ + t0 = RTIMER_NOW(); + + do { + tx_active = transmitting(); + } while(tx_active == 1 && + (RTIMER_CLOCK_LT(RTIMER_NOW(), t0 + TX_WAIT_TIMEOUT))); + + if(tx_active) { + PRINTF("transmit: Already TXing and wait timed out\n"); + + if(was_off) { + off(); + } + + return RADIO_TX_COLLISION; + } + + /* Send the CMD_IEEE_TX command */ + rf_core_init_radio_op((rfc_radioOp_t *)&cmd, sizeof(cmd), CMD_IEEE_TX); + + cmd.payloadLen = transmit_len; + cmd.pPayload = &tx_buf[TX_BUF_HDR_LEN]; + + /* Enable the LAST_FG_COMMAND_DONE interrupt, which will wake us up */ + rf_core_cmd_done_en(); + + ret = rf_core_send_cmd((uint32_t)&cmd, &cmd_status); + + if(ret) { + /* If we enter here, TX actually started */ + ENERGEST_OFF(ENERGEST_TYPE_LISTEN); + ENERGEST_ON(ENERGEST_TYPE_TRANSMIT); + + /* Idle away while the command is running */ + while((cmd.status & RF_CORE_RADIO_OP_MASKED_STATUS) + == RF_CORE_RADIO_OP_MASKED_STATUS_RUNNING) { + lpm_sleep(); + } + + stat = cmd.status; + + if(stat == RF_CORE_RADIO_OP_STATUS_IEEE_DONE_OK) { + /* Sent OK */ + RIMESTATS_ADD(lltx); + ret = RADIO_TX_OK; + } else { + /* Operation completed, but frame was not sent */ + PRINTF("transmit: ret=%d, CMDSTA=0x%08lx, status=0x%04x\n", ret, + cmd_status, stat); + ret = RADIO_TX_ERR; + } + } else { + /* Failure sending the CMD_IEEE_TX command */ + PRINTF("transmit: ret=%d, CMDSTA=0x%08lx, status=0x%04x\n", + ret, cmd_status, cmd.status); + + ret = RADIO_TX_ERR; + } + + /* + * Update ENERGEST state here, before a potential call to off(), which + * will correctly update it if required. + */ + ENERGEST_OFF(ENERGEST_TYPE_TRANSMIT); + ENERGEST_ON(ENERGEST_TYPE_LISTEN); + + /* + * Disable LAST_FG_COMMAND_DONE interrupt. We don't really care about it + * except when we are transmitting + */ + rf_core_cmd_done_dis(); + + return ret; +} +/*---------------------------------------------------------------------------*/ +static int +send(const void *payload, unsigned short payload_len) +{ + prepare(payload, payload_len); + return transmit(payload_len); +} +/*---------------------------------------------------------------------------*/ +static void +release_data_entry(void) +{ + rfc_dataEntryGeneral_t *entry = (rfc_dataEntryGeneral_t *)rx_read_entry; + + /* Clear the length byte */ + rx_read_entry[8] = 0; + + /* Set status to 0 "Pending" in element */ + entry->status = DATA_ENTRY_STATUS_PENDING; + rx_read_entry = entry->pNextEntry; +}/*---------------------------------------------------------------------------*/ +static int +read_frame(void *buf, unsigned short buf_len) +{ + int8_t rssi; + int len = 0; + rfc_dataEntryGeneral_t *entry = (rfc_dataEntryGeneral_t *)rx_read_entry; + + if(entry->status != DATA_ENTRY_STATUS_FINISHED) { + /* No available data */ + return 0; + } + + if(rx_read_entry[8] < 4) { + PRINTF("RF: too short\n"); + RIMESTATS_ADD(tooshort); + + release_data_entry(); + return 0; + } + + len = rx_read_entry[8] - 4; + + if(len > buf_len) { + PRINTF("RF: too long\n"); + RIMESTATS_ADD(toolong); + + release_data_entry(); + return 0; + } + + memcpy(buf, (char *)&rx_read_entry[9], len); + + rssi = (int8_t)rx_read_entry[9 + len + 2]; + + packetbuf_set_attr(PACKETBUF_ATTR_RSSI, rssi); + RIMESTATS_ADD(llrx); + + release_data_entry(); + + return len; +} +/*---------------------------------------------------------------------------*/ +static int +channel_clear(void) +{ + uint8_t was_off = 0; + uint8_t cca_info; + int ret = RF_CCA_CLEAR; + + /* + * If we are in the middle of a BLE operation, we got called by ContikiMAC + * from within an interrupt context. Indicate a clear channel + */ + if(rf_ble_is_active() == RF_BLE_ACTIVE) { + PRINTF("channel_clear: Interrupt context but BLE in progress\n"); + return RF_CCA_CLEAR; + } + + if(rf_is_on()) { + /* + * Wait for potential leftover ACK still being sent. + * Strictly speaking, if we are TXing an ACK then the channel is not clear. + * However, channel_clear is only ever called to determine whether there is + * someone else's packet in the air, not ours. + * + * We could probably even simply return that the channel is clear + */ + while(transmitting()); + } else { + was_off = 1; + if(on() != RF_CORE_CMD_OK) { + PRINTF("channel_clear: on() failed\n"); + if(was_off) { + off(); + } + return RF_CCA_CLEAR; + } + } + + cca_info = get_cca_info(); + + if(cca_info == RF_GET_CCA_INFO_ERROR) { + PRINTF("channel_clear: CCA error\n"); + ret = RF_CCA_CLEAR; + } else { + /* + * cca_info bits 1:0 - ccaStatus + * Return 1 (clear) if idle or invalid. + */ + ret = (cca_info & 0x03) != RF_CMD_CCA_REQ_CCA_STATE_BUSY; + } + + if(was_off) { + off(); + } + + return ret; +} +/*---------------------------------------------------------------------------*/ +static int +receiving_packet(void) +{ + int ret = 0; + uint8_t cca_info; + uint8_t was_off = 0; + + /* + * If we are in the middle of a BLE operation, we got called by ContikiMAC + * from within an interrupt context. We are not receiving + */ + if(rf_ble_is_active() == RF_BLE_ACTIVE) { + PRINTF("receiving_packet: Interrupt context but BLE in progress\n"); + return 0; + } + + /* If we are off, we are not receiving */ + if(!rf_is_on()) { + PRINTF("receiving_packet: We were off\n"); + return 0; + } + + /* If we are transmitting (can only be an ACK here), we are not receiving */ + if(transmitting()) { + PRINTF("receiving_packet: We were TXing\n"); + return 0; + } + + cca_info = get_cca_info(); + + if(cca_info == RF_GET_CCA_INFO_ERROR) { + /* If we can't read CCA info, return "not receiving" */ + ret = 0; + } else { + /* Return 1 (receiving) if ccaState is busy */ + ret = (cca_info & 0x03) == RF_CMD_CCA_REQ_CCA_STATE_BUSY; + } + + if(was_off) { + off(); + } + + return ret; +} +/*---------------------------------------------------------------------------*/ +static int +pending_packet(void) +{ + volatile rfc_dataEntry_t *entry = (rfc_dataEntry_t *)rx_data_queue.pCurrEntry; + int rv = 0; + + /* Go through all RX buffers and check their status */ + do { + if(entry->status == DATA_ENTRY_STATUS_FINISHED) { + rv = 1; + process_poll(&rf_core_process); + } + + entry = (rfc_dataEntry_t *)entry->pNextEntry; + } while(entry != (rfc_dataEntry_t *)rx_data_queue.pCurrEntry); + + /* If we didn't find an entry at status finished, no frames are pending */ + return rv; +} +/*---------------------------------------------------------------------------*/ +static int +on(void) +{ + /* + * Request the HF XOSC as the source for the HF clock. Needed before we can + * use the FS. This will only request, it will _not_ perform the switch. + */ + oscillators_request_hf_xosc(); + + /* + * If we are in the middle of a BLE operation, we got called by ContikiMAC + * from within an interrupt context. Abort, but pretend everything is OK. + */ + if(rf_ble_is_active() == RF_BLE_ACTIVE) { + PRINTF("on: Interrupt context but BLE in progress\n"); + return RF_CORE_CMD_OK; + } + + if(rf_is_on()) { + PRINTF("on: We were on. PD=%u, RX=0x%04x \n", rf_core_is_accessible(), + RF_RADIO_OP_GET_STATUS(cmd_ieee_rx_buf)); + return RF_CORE_CMD_OK; + } + + if(rf_core_boot() != RF_CORE_CMD_OK) { + PRINTF("on: rf_core_boot() failed\n"); + return RF_CORE_CMD_ERROR; + } + + init_rx_buffers(); + + rf_core_setup_interrupts(); + + /* + * Trigger a switch to the XOSC, so that we can subsequently use the RF FS + * This will block until the XOSC is actually ready, but give how we + * requested it early on, this won't be too long a wait/ + */ + oscillators_switch_to_hf_xosc(); + + if(rf_radio_setup() != RF_CORE_CMD_OK) { + PRINTF("on: radio_setup() failed\n"); + return RF_CORE_CMD_ERROR; + } + + return rx_on(); +} +/*---------------------------------------------------------------------------*/ +static int +off(void) +{ + /* + * If we are in the middle of a BLE operation, we got called by ContikiMAC + * from within an interrupt context. Abort, but pretend everything is OK. + */ + if(rf_ble_is_active() == RF_BLE_ACTIVE) { + PRINTF("off: Interrupt context but BLE in progress\n"); + return RF_CORE_CMD_OK; + } + + while(transmitting()); + + rf_core_power_down(); + + /* Switch HF clock source to the RCOSC to preserve power */ + oscillators_switch_to_hf_rc(); + + /* We pulled the plug, so we need to restore the status manually */ + ((rfc_CMD_IEEE_RX_t *)cmd_ieee_rx_buf)->status = RF_CORE_RADIO_OP_STATUS_IDLE; + + /* + * Just in case there was an ongoing RX (which started after we begun the + * shutdown sequence), we don't want to leave the buffer in state == ongoing + */ + ((rfc_dataEntry_t *)rx_buf_0)->status = DATA_ENTRY_STATUS_PENDING; + ((rfc_dataEntry_t *)rx_buf_1)->status = DATA_ENTRY_STATUS_PENDING; + ((rfc_dataEntry_t *)rx_buf_2)->status = DATA_ENTRY_STATUS_PENDING; + ((rfc_dataEntry_t *)rx_buf_3)->status = DATA_ENTRY_STATUS_PENDING; + + return RF_CORE_CMD_OK; +} +/*---------------------------------------------------------------------------*/ +static radio_result_t +get_value(radio_param_t param, radio_value_t *value) +{ + rfc_CMD_IEEE_RX_t *cmd = (rfc_CMD_IEEE_RX_t *)cmd_ieee_rx_buf; + + if(!value) { + return RADIO_RESULT_INVALID_VALUE; + } + + switch(param) { + case RADIO_PARAM_POWER_MODE: + /* On / off */ + *value = rf_is_on() ? RADIO_POWER_MODE_ON : RADIO_POWER_MODE_OFF; + return RADIO_RESULT_OK; + case RADIO_PARAM_CHANNEL: + *value = (radio_value_t)cmd->channel; + return RADIO_RESULT_OK; + case RADIO_PARAM_PAN_ID: + *value = (radio_value_t)cmd->localPanID; + return RADIO_RESULT_OK; + case RADIO_PARAM_16BIT_ADDR: + *value = (radio_value_t)cmd->localShortAddr; + return RADIO_RESULT_OK; + case RADIO_PARAM_RX_MODE: + *value = 0; + if(cmd->frameFiltOpt.frameFiltEn) { + *value |= RADIO_RX_MODE_ADDRESS_FILTER; + } + if(cmd->frameFiltOpt.autoAckEn) { + *value |= RADIO_RX_MODE_AUTOACK; + } + + return RADIO_RESULT_OK; + case RADIO_PARAM_TXPOWER: + *value = get_tx_power(); + return RADIO_RESULT_OK; + case RADIO_PARAM_CCA_THRESHOLD: + *value = cmd->ccaRssiThr; + return RADIO_RESULT_OK; + case RADIO_PARAM_RSSI: + *value = get_rssi(); + + if(*value == RF_CMD_CCA_REQ_RSSI_UNKNOWN) { + return RADIO_RESULT_ERROR; + } else { + return RADIO_RESULT_OK; + } + case RADIO_CONST_CHANNEL_MIN: + *value = IEEE_MODE_CHANNEL_MIN; + return RADIO_RESULT_OK; + case RADIO_CONST_CHANNEL_MAX: + *value = IEEE_MODE_CHANNEL_MAX; + return RADIO_RESULT_OK; + case RADIO_CONST_TXPOWER_MIN: + *value = OUTPUT_POWER_MIN; + return RADIO_RESULT_OK; + case RADIO_CONST_TXPOWER_MAX: + *value = OUTPUT_POWER_MAX; + return RADIO_RESULT_OK; + default: + return RADIO_RESULT_NOT_SUPPORTED; + } +} +/*---------------------------------------------------------------------------*/ +static radio_result_t +set_value(radio_param_t param, radio_value_t value) +{ + uint8_t was_off = 0; + radio_result_t rv = RADIO_RESULT_OK; + rfc_CMD_IEEE_RX_t *cmd = (rfc_CMD_IEEE_RX_t *)cmd_ieee_rx_buf; + + switch(param) { + case RADIO_PARAM_POWER_MODE: + if(value == RADIO_POWER_MODE_ON) { + if(on() != RF_CORE_CMD_OK) { + PRINTF("set_value: on() failed (1)\n"); + return RADIO_RESULT_ERROR; + } + return RADIO_RESULT_OK; + } + if(value == RADIO_POWER_MODE_OFF) { + off(); + return RADIO_RESULT_OK; + } + return RADIO_RESULT_INVALID_VALUE; + case RADIO_PARAM_CHANNEL: + if(value < IEEE_MODE_CHANNEL_MIN || + value > IEEE_MODE_CHANNEL_MAX) { + return RADIO_RESULT_INVALID_VALUE; + } + + cmd->channel = (uint8_t)value; + break; + case RADIO_PARAM_PAN_ID: + cmd->localPanID = (uint16_t)value; + break; + case RADIO_PARAM_16BIT_ADDR: + cmd->localShortAddr = (uint16_t)value; + break; + case RADIO_PARAM_RX_MODE: + { + if(value & ~(RADIO_RX_MODE_ADDRESS_FILTER | + RADIO_RX_MODE_AUTOACK)) { + return RADIO_RESULT_INVALID_VALUE; + } + + cmd->frameFiltOpt.frameFiltEn = (value & RADIO_RX_MODE_ADDRESS_FILTER) != 0; + cmd->frameFiltOpt.frameFiltStop = 1; + cmd->frameFiltOpt.autoAckEn = (value & RADIO_RX_MODE_AUTOACK) != 0; + cmd->frameFiltOpt.slottedAckEn = 0; + cmd->frameFiltOpt.autoPendEn = 0; + cmd->frameFiltOpt.defaultPend = 0; + cmd->frameFiltOpt.bPendDataReqOnly = 0; + cmd->frameFiltOpt.bPanCoord = 0; + cmd->frameFiltOpt.bStrictLenFilter = 0; + break; + } + case RADIO_PARAM_TXPOWER: + if(value < OUTPUT_POWER_MIN || value > OUTPUT_POWER_MAX) { + return RADIO_RESULT_INVALID_VALUE; + } + + set_tx_power(value); + + return RADIO_RESULT_OK; + case RADIO_PARAM_CCA_THRESHOLD: + cmd->ccaRssiThr = (int8_t)value; + break; + default: + return RADIO_RESULT_NOT_SUPPORTED; + } + + /* If we reach here we had no errors. Apply new settings */ + if(!rf_is_on()) { + was_off = 1; + if(on() != RF_CORE_CMD_OK) { + PRINTF("set_value: on() failed (2)\n"); + return RADIO_RESULT_ERROR; + } + } + + if(rx_off() != RF_CORE_CMD_OK) { + PRINTF("set_value: rx_off() failed\n"); + rv = RADIO_RESULT_ERROR; + } + + if(rx_on() != RF_CORE_CMD_OK) { + PRINTF("set_value: rx_on() failed\n"); + rv = RADIO_RESULT_ERROR; + } + + /* If we were off, turn back off */ + if(was_off) { + off(); + } + + return rv; +} +/*---------------------------------------------------------------------------*/ +static radio_result_t +get_object(radio_param_t param, void *dest, size_t size) +{ + uint8_t *target; + uint8_t *src; + int i; + rfc_CMD_IEEE_RX_t *cmd = (rfc_CMD_IEEE_RX_t *)cmd_ieee_rx_buf; + + if(param == RADIO_PARAM_64BIT_ADDR) { + if(size != 8 || !dest) { + return RADIO_RESULT_INVALID_VALUE; + } + + target = dest; + src = (uint8_t *)(&cmd->localExtAddr); + + for(i = 0; i < 8; i++) { + target[i] = src[7 - i]; + } + + return RADIO_RESULT_OK; + } + return RADIO_RESULT_NOT_SUPPORTED; +} +/*---------------------------------------------------------------------------*/ +static radio_result_t +set_object(radio_param_t param, const void *src, size_t size) +{ + uint8_t was_off = 0; + radio_result_t rv; + int i; + uint8_t *dst; + rfc_CMD_IEEE_RX_t *cmd = (rfc_CMD_IEEE_RX_t *)cmd_ieee_rx_buf; + + if(param == RADIO_PARAM_64BIT_ADDR) { + if(size != 8 || !src) { + return RADIO_RESULT_INVALID_VALUE; + } + + dst = (uint8_t *)(&cmd->localExtAddr); + + for(i = 0; i < 8; i++) { + dst[i] = ((uint8_t *)src)[7 - i]; + } + + if(!rf_is_on()) { + was_off = 1; + if(on() != RF_CORE_CMD_OK) { + PRINTF("set_object: on() failed\n"); + return RADIO_RESULT_ERROR; + } + } + + if(rx_off() != RF_CORE_CMD_OK) { + PRINTF("set_object: rx_off() failed\n"); + rv = RADIO_RESULT_ERROR; + } + + if(rx_on() != RF_CORE_CMD_OK) { + PRINTF("set_object: rx_on() failed\n"); + rv = RADIO_RESULT_ERROR; + } + + /* If we were off, turn back off */ + if(was_off) { + off(); + } + + return rv; + } + return RADIO_RESULT_NOT_SUPPORTED; +} +/*---------------------------------------------------------------------------*/ +const struct radio_driver ieee_mode_driver = { + init, + prepare, + transmit, + send, + read_frame, + channel_clear, + receiving_packet, + pending_packet, + on, + off, + get_value, + set_value, + get_object, + set_object, +}; +/*---------------------------------------------------------------------------*/ +/** + * @} + * @} + */ diff --git a/cpu/cc26xx-cc13xx/rf-core/prop-mode.c b/cpu/cc26xx-cc13xx/rf-core/prop-mode.c new file mode 100644 index 000000000..c4aa341d0 --- /dev/null +++ b/cpu/cc26xx-cc13xx/rf-core/prop-mode.c @@ -0,0 +1,1143 @@ +/* + * Copyright (c) 2015, Texas Instruments Incorporated - http://www.ti.com/ + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup rf-core + * @{ + * + * \defgroup rf-core-prop CC13xx Prop mode driver + * + * @{ + * + * \file + * Implementation of the CC13xx prop mode NETSTACK_RADIO driver + */ +/*---------------------------------------------------------------------------*/ +#include "contiki.h" +#include "dev/radio.h" +#include "dev/cc26xx-uart.h" +#include "dev/oscillators.h" +#include "dev/watchdog.h" +#include "net/packetbuf.h" +#include "net/rime/rimestats.h" +#include "net/linkaddr.h" +#include "net/netstack.h" +#include "sys/energest.h" +#include "sys/clock.h" +#include "sys/rtimer.h" +#include "sys/cc.h" +#include "lpm.h" +#include "ti-lib.h" +#include "rf-core/rf-core.h" +#include "rf-core/rf-ble.h" +#include "rf-core/dot-15-4g.h" +/*---------------------------------------------------------------------------*/ +/* RF core and RF HAL API */ +#include "hw_rfc_dbell.h" +#include "hw_rfc_pwr.h" +/*---------------------------------------------------------------------------*/ +/* RF Core Mailbox API */ +#include "rf-core/api/mailbox.h" +#include "rf-core/api/common_cmd.h" +#include "rf-core/api/data_entry.h" +#include "rf-core/api/prop_mailbox.h" +#include "rf-core/api/prop_cmd.h" +/*---------------------------------------------------------------------------*/ +/* CC13xxware patches */ +#include "rf_patches/rf_patch_cpe_genfsk.h" +/*---------------------------------------------------------------------------*/ +#include "rf-core/smartrf-settings.h" +/*---------------------------------------------------------------------------*/ +#include +#include +#include +#include +/*---------------------------------------------------------------------------*/ +#ifdef __GNUC__ +#define CC_ALIGN_ATTR(n) __attribute__ ((aligned(n))) +#else +#define CC_ALIGN_ATTR(n) +#endif +/*---------------------------------------------------------------------------*/ +#define DEBUG 0 +#if DEBUG +#define PRINTF(...) printf(__VA_ARGS__) +#else +#define PRINTF(...) +#endif +/*---------------------------------------------------------------------------*/ +/* Data entry status field constants */ +#define DATA_ENTRY_STATUS_PENDING 0x00 /* Not in use by the Radio CPU */ +#define DATA_ENTRY_STATUS_ACTIVE 0x01 /* Open for r/w by the radio CPU */ +#define DATA_ENTRY_STATUS_BUSY 0x02 /* Ongoing r/w */ +#define DATA_ENTRY_STATUS_FINISHED 0x03 /* Free to use and to free */ +#define DATA_ENTRY_STATUS_UNFINISHED 0x04 /* Partial RX entry */ +/*---------------------------------------------------------------------------*/ +/* Data whitener. 1: Whitener, 0: No whitener */ +#ifdef PROP_MODE_CONF_DW +#define PROP_MODE_DW PROP_MODE_CONF_DW +#else +#define PROP_MODE_DW 0 +#endif + +#ifdef PROP_MODE_CONF_USE_CRC16 +#define PROP_MODE_USE_CRC16 PROP_MODE_CONF_USE_CRC16 +#else +#define PROP_MODE_USE_CRC16 0 +#endif +/*---------------------------------------------------------------------------*/ +#ifdef PROP_MODE_CONF_SNIFFER +#define PROP_MODE_SNIFFER PROP_MODE_CONF_SNIFFER +#else +#define PROP_MODE_SNIFFER 0 +#endif + +#if PROP_MODE_SNIFFER +static const uint8_t magic[] = { 0x53, 0x6E, 0x69, 0x66 }; +#endif +/*---------------------------------------------------------------------------*/ +/** + * \brief Returns the current status of a running Radio Op command + * \param a A pointer with the buffer used to initiate the command + * \return The value of the Radio Op buffer's status field + * + * This macro can be used to e.g. return the status of a previously + * initiated background operation, or of an immediate command + */ +#define RF_RADIO_OP_GET_STATUS(a) GET_FIELD_V(a, radioOp, status) +/*---------------------------------------------------------------------------*/ +/* Special value returned by CMD_IEEE_CCA_REQ when an RSSI is not available */ +#define RF_CMD_CCA_REQ_RSSI_UNKNOWN -128 + +/* Used for the return value of channel_clear */ +#define RF_CCA_CLEAR 1 +#define RF_CCA_BUSY 0 + +/* Used as an error return value for get_cca_info */ +#define RF_GET_CCA_INFO_ERROR 0xFF + +/* + * Values of the individual bits of the ccaInfo field in CMD_IEEE_CCA_REQ's + * status struct + */ +#define RF_CMD_CCA_REQ_CCA_STATE_IDLE 0 /* 00 */ +#define RF_CMD_CCA_REQ_CCA_STATE_BUSY 1 /* 01 */ +#define RF_CMD_CCA_REQ_CCA_STATE_INVALID 2 /* 10 */ + +#ifdef PROP_MODE_CONF_RSSI_THRESHOLD +#define PROP_MODE_RSSI_THRESHOLD PROP_MODE_CONF_RSSI_THRESHOLD +#else +#define PROP_MODE_RSSI_THRESHOLD 0xA6 +#endif + +static int8_t rssi_threshold = PROP_MODE_RSSI_THRESHOLD; +/*---------------------------------------------------------------------------*/ +static int on(void); +static int off(void); + +static rfc_propRxOutput_t rx_stats; +/*---------------------------------------------------------------------------*/ +/* Defines and variables related to the .15.4g PHY HDR */ +#define DOT_4G_MAX_FRAME_LEN 2047 +#define DOT_4G_PHR_LEN 2 + +/* PHY HDR bits */ +#define DOT_4G_PHR_CRC16 0x10 +#define DOT_4G_PHR_DW 0x08 + +#if PROP_MODE_USE_CRC16 +/* CRC16 */ +#define DOT_4G_PHR_CRC_BIT DOT_4G_PHR_CRC16 +#define CRC_LEN 2 +#else +/* CRC32 */ +#define DOT_4G_PHR_CRC_BIT 0 +#define CRC_LEN 4 +#endif + +#if PROP_MODE_DW +#define DOT_4G_PHR_DW_BIT DOT_4G_PHR_DW +#else +#define DOT_4G_PHR_DW_BIT 0 +#endif +/*---------------------------------------------------------------------------*/ +/* How long to wait for an ongoing ACK TX to finish before starting frame TX */ +#define TX_WAIT_TIMEOUT (RTIMER_SECOND >> 11) + +/* How long to wait for the RF to enter RX in rf_cmd_ieee_rx */ +#define ENTER_RX_WAIT_TIMEOUT (RTIMER_SECOND >> 10) +/*---------------------------------------------------------------------------*/ +/* TX Power dBm lookup table - values from SmartRF Studio */ +typedef struct output_config { + radio_value_t dbm; + uint16_t tx_power; /* Value for the PROP_DIV_RADIO_SETUP.txPower field */ +} output_config_t; + +static const output_config_t output_power[] = { + { 14, 0xa73f }, + { 13, 0xa73f }, /* 12.5 */ + { 12, 0xb818 }, + { 11, 0x50da }, + { 10, 0x38d3 }, + { 9, 0x2ccd }, + { 8, 0x24cb }, + { 7, 0x20c9 }, + { 6, 0x1cc7 }, + { 5, 0x18c6 }, + { 4, 0x18c5 }, + { 3, 0x14c4 }, + { 2, 0x1042 }, + { 1, 0x10c3 }, + { 0, 0x0041 }, + {-10, 0x08c0 }, +}; + +#define OUTPUT_CONFIG_COUNT (sizeof(output_power) / sizeof(output_config_t)) + +/* Max and Min Output Power in dBm */ +#define OUTPUT_POWER_MIN (output_power[OUTPUT_CONFIG_COUNT - 1].dbm) +#define OUTPUT_POWER_MAX (output_power[0].dbm) +#define OUTPUT_POWER_UNKNOWN 0xFFFF + +/* Default TX Power - position in output_power[] */ +const output_config_t *tx_power_current = &output_power[1]; +/*---------------------------------------------------------------------------*/ +#ifdef PROP_MODE_CONF_LO_DIVIDER +#define PROP_MODE_LO_DIVIDER PROP_MODE_CONF_LO_DIVIDER +#else +#define PROP_MODE_LO_DIVIDER 0x05 +#endif +/*---------------------------------------------------------------------------*/ +#define DATA_ENTRY_LENSZ_NONE 0 +#define DATA_ENTRY_LENSZ_BYTE 1 +#define DATA_ENTRY_LENSZ_WORD 2 /* 2 bytes */ + +#define RX_BUF_SIZE 140 +/* Receive buffers: 1 frame in each */ +static uint8_t rx_buf_0[RX_BUF_SIZE] CC_ALIGN_ATTR(4); +static uint8_t rx_buf_1[RX_BUF_SIZE] CC_ALIGN_ATTR(4); + +/* The RX Data Queue */ +static dataQueue_t rx_data_queue = { 0 }; + +/* Receive entry pointer to keep track of read items */ +volatile static uint8_t *rx_read_entry; +/*---------------------------------------------------------------------------*/ +/* The outgoing frame buffer */ +#define TX_BUF_PAYLOAD_LEN 180 +#define TX_BUF_HDR_LEN 2 + +static uint8_t tx_buf[TX_BUF_HDR_LEN + TX_BUF_PAYLOAD_LEN] CC_ALIGN_ATTR(4); +/*---------------------------------------------------------------------------*/ +static uint8_t +rf_is_on(void) +{ + if(!rf_core_is_accessible()) { + return 0; + } + + return smartrf_settings_cmd_prop_rx_adv.status == RF_CORE_RADIO_OP_STATUS_ACTIVE; +} +/*---------------------------------------------------------------------------*/ +static uint8_t +transmitting(void) +{ + return smartrf_settings_cmd_prop_tx_adv.status == RF_CORE_RADIO_OP_STATUS_ACTIVE; +} +/*---------------------------------------------------------------------------*/ +static radio_value_t +get_rssi(void) +{ + uint32_t cmd_status; + int8_t rssi; + uint8_t was_off = 0; + rfc_CMD_GET_RSSI_t cmd; + + /* If we are off, turn on first */ + if(!rf_is_on()) { + was_off = 1; + if(on() != RF_CORE_CMD_OK) { + PRINTF("get_rssi: on() failed\n"); + return RF_CMD_CCA_REQ_RSSI_UNKNOWN; + } + } + + memset(&cmd, 0x00, sizeof(cmd)); + cmd.commandNo = CMD_GET_RSSI; + + rssi = RF_CMD_CCA_REQ_RSSI_UNKNOWN; + + if(rf_core_send_cmd((uint32_t)&cmd, &cmd_status) == RF_CORE_CMD_OK) { + /* Current RSSI in bits 23:16 of cmd_status */ + rssi = (cmd_status >> 16) & 0xFF; + } + + /* If we were off, turn back off */ + if(was_off) { + off(); + } + + return rssi; +} +/*---------------------------------------------------------------------------*/ +static uint8_t +get_channel(void) +{ + uint32_t freq_khz; + + freq_khz = smartrf_settings_cmd_fs.frequency * 1000; + + /* + * For some channels, fractFreq * 1000 / 65536 will return 324.99xx. + * Casting the result to uint32_t will truncate decimals resulting in the + * function returning channel - 1 instead of channel. Thus, we do a quick + * positive integer round up. + */ + freq_khz += (((smartrf_settings_cmd_fs.fractFreq * 1000) + 65535) / 65536); + + return (freq_khz - DOT_15_4G_CHAN0_FREQUENCY) / DOT_15_4G_CHANNEL_SPACING; +} +/*---------------------------------------------------------------------------*/ +static void +set_channel(uint8_t channel) +{ + uint32_t new_freq; + uint16_t freq, frac; + + new_freq = DOT_15_4G_CHAN0_FREQUENCY + (channel * DOT_15_4G_CHANNEL_SPACING); + + freq = (uint16_t)(new_freq / 1000); + frac = (new_freq - (freq * 1000)) * 65536 / 1000; + + PRINTF("set_channel: %u = 0x%04x.0x%04x (%lu)\n", channel, freq, frac, + new_freq); + + smartrf_settings_cmd_prop_radio_div_setup.centerFreq = freq; + smartrf_settings_cmd_fs.frequency = freq; + smartrf_settings_cmd_fs.fractFreq = frac; +} +/*---------------------------------------------------------------------------*/ +/* Returns the current TX power in dBm */ +static radio_value_t +get_tx_power(void) +{ + return tx_power_current->dbm; +} +/*---------------------------------------------------------------------------*/ +/* + * The caller must make sure to send a new CMD_PROP_RADIO_DIV_SETP to the + * radio after calling this function. + */ +static void +set_tx_power(radio_value_t power) +{ + int i; + + for(i = OUTPUT_CONFIG_COUNT - 1; i >= 0; --i) { + if(power <= output_power[i].dbm) { + /* + * Merely save the value. It will be used in all subsequent usages of + * CMD_PROP_RADIO_DIV_SETP, including one immediately after this function + * has returned + */ + tx_power_current = &output_power[i]; + + return; + } + } +} +/*---------------------------------------------------------------------------*/ +static int +prop_div_radio_setup(void) +{ + uint32_t cmd_status; + rfc_radioOp_t *cmd = (rfc_radioOp_t *)&smartrf_settings_cmd_prop_radio_div_setup; + + /* Adjust loDivider depending on the selected band */ + smartrf_settings_cmd_prop_radio_div_setup.loDivider = PROP_MODE_LO_DIVIDER; + + /* Update to the correct TX power setting */ + smartrf_settings_cmd_prop_radio_div_setup.txPower = tx_power_current->tx_power; + + /* Send Radio setup to RF Core */ + if(rf_core_send_cmd((uint32_t)cmd, &cmd_status) != RF_CORE_CMD_OK) { + PRINTF("prop_div_radio_setup: DIV_SETUP, CMDSTA=0x%08lx, status=0x%04x\n", + cmd_status, cmd->status); + return RF_CORE_CMD_ERROR; + } + + /* Wait until radio setup is done */ + if(rf_core_wait_cmd_done(cmd) != RF_CORE_CMD_OK) { + PRINTF("prop_div_radio_setup: DIV_SETUP wait, CMDSTA=0x%08lx," + "status=0x%04x\n", cmd_status, cmd->status); + return RF_CORE_CMD_ERROR; + } + + return RF_CORE_CMD_OK; +} +/*---------------------------------------------------------------------------*/ +static uint8_t +rf_cmd_prop_rx() +{ + uint32_t cmd_status; + rtimer_clock_t t0; + volatile rfc_CMD_PROP_RX_ADV_t *cmd_rx_adv; + int ret; + + cmd_rx_adv = (rfc_CMD_PROP_RX_ADV_t *)&smartrf_settings_cmd_prop_rx_adv; + cmd_rx_adv->status = RF_CORE_RADIO_OP_STATUS_IDLE; + + /* + * Set the max Packet length. This is for the payload only, therefore + * 2047 - length offset + */ + cmd_rx_adv->maxPktLen = DOT_4G_MAX_FRAME_LEN - cmd_rx_adv->lenOffset; + + ret = rf_core_send_cmd((uint32_t)cmd_rx_adv, &cmd_status); + + if(ret != RF_CORE_CMD_OK) { + PRINTF("rf_cmd_prop_rx: send_cmd ret=%d, CMDSTA=0x%08lx, status=0x%04x\n", + ret, cmd_status, cmd_rx_adv->status); + return RF_CORE_CMD_ERROR; + } + + t0 = RTIMER_NOW(); + + while(cmd_rx_adv->status != RF_CORE_RADIO_OP_STATUS_ACTIVE && + (RTIMER_CLOCK_LT(RTIMER_NOW(), t0 + ENTER_RX_WAIT_TIMEOUT))); + + /* Wait to enter RX */ + if(cmd_rx_adv->status != RF_CORE_RADIO_OP_STATUS_ACTIVE) { + PRINTF("rf_cmd_prop_rx: CMDSTA=0x%08lx, status=0x%04x\n", + cmd_status, cmd_rx_adv->status); + return RF_CORE_CMD_ERROR; + } + + return ret; +} +/*---------------------------------------------------------------------------*/ +static int +rx_on_prop(void) +{ + int ret; + + if(rf_is_on()) { + PRINTF("rx_on_prop: We were on. PD=%u, RX=0x%04x\n", + rf_core_is_accessible(), smartrf_settings_cmd_prop_rx_adv.status); + return RF_CORE_CMD_OK; + } + + /* Put CPE in RX using the currently configured parameters */ + ret = rf_cmd_prop_rx(); + + if(ret) { + ENERGEST_ON(ENERGEST_TYPE_LISTEN); + } + + return ret; +} +/*---------------------------------------------------------------------------*/ +static int +rx_off_prop(void) +{ + uint32_t cmd_status; + int ret; + + /* If we are off, do nothing */ + if(!rf_is_on()) { + return RF_CORE_CMD_OK; + } + + /* Send a CMD_ABORT command to RF Core */ + if(rf_core_send_cmd(CMDR_DIR_CMD(CMD_ABORT), &cmd_status) != RF_CORE_CMD_OK) { + PRINTF("rx_off_prop: CMD_ABORT status=0x%08lx\n", cmd_status); + /* Continue nonetheless */ + } + + while(rf_is_on()); + + if(smartrf_settings_cmd_prop_rx_adv.status == PROP_DONE_STOPPED || + smartrf_settings_cmd_prop_rx_adv.status == PROP_DONE_ABORT) { + /* Stopped gracefully */ + ENERGEST_OFF(ENERGEST_TYPE_LISTEN); + ret = RF_CORE_CMD_OK; + } else { + PRINTF("rx_off_prop: status=0x%04x\n", + smartrf_settings_cmd_prop_rx_adv.status); + ret = RF_CORE_CMD_ERROR; + } + + return ret; +} +/*---------------------------------------------------------------------------*/ +static uint8_t +request(void) +{ + /* + * We rely on the RDC layer to turn us on and off. Thus, if we are on we + * will only allow sleep, standby otherwise + */ + if(rf_is_on()) { + return LPM_MODE_SLEEP; + } + + return LPM_MODE_MAX_SUPPORTED; +} +/*---------------------------------------------------------------------------*/ +LPM_MODULE(prop_lpm_module, request, NULL, NULL, LPM_DOMAIN_NONE); +/*---------------------------------------------------------------------------*/ +static int +prop_fs(void) +{ + uint32_t cmd_status; + rfc_radioOp_t *cmd = (rfc_radioOp_t *)&smartrf_settings_cmd_fs; + + /* Send the command to the RF Core */ + if(rf_core_send_cmd((uint32_t)cmd, &cmd_status) != RF_CORE_CMD_OK) { + PRINTF("prop_fs: CMD_FS, CMDSTA=0x%08lx, status=0x%04x\n", + cmd_status, cmd->status); + return RF_CORE_CMD_ERROR; + } + + /* Wait until the command is done */ + if(rf_core_wait_cmd_done(cmd) != RF_CORE_CMD_OK) { + PRINTF("prop_fs: CMD_FS wait, CMDSTA=0x%08lx, status=0x%04x\n", + cmd_status, cmd->status); + return RF_CORE_CMD_ERROR; + } + + return RF_CORE_CMD_OK; +} +/*---------------------------------------------------------------------------*/ +static void +soft_off_prop(void) +{ + uint32_t cmd_status; + volatile rfc_radioOp_t *cmd = rf_core_get_last_radio_op(); + + if(!rf_core_is_accessible()) { + return; + } + + /* Send a CMD_ABORT command to RF Core */ + if(rf_core_send_cmd(CMDR_DIR_CMD(CMD_ABORT), &cmd_status) != RF_CORE_CMD_OK) { + PRINTF("soft_off_prop: CMD_ABORT status=0x%08lx\n", cmd_status); + return; + } + + while((cmd->status & RF_CORE_RADIO_OP_MASKED_STATUS) == + RF_CORE_RADIO_OP_MASKED_STATUS_RUNNING); +} +/*---------------------------------------------------------------------------*/ +static uint8_t +soft_on_prop(void) +{ + if(prop_div_radio_setup() != RF_CORE_CMD_OK) { + PRINTF("soft_on_prop: prop_div_radio_setup() failed\n"); + return RF_CORE_CMD_ERROR; + } + + if(prop_fs() != RF_CORE_CMD_OK) { + PRINTF("soft_on_prop: prop_fs() failed\n"); + return RF_CORE_CMD_ERROR; + } + + return rx_on_prop(); +} +/*---------------------------------------------------------------------------*/ +static const rf_core_primary_mode_t mode_prop = { + soft_off_prop, + soft_on_prop, +}; +/*---------------------------------------------------------------------------*/ +static int +init(void) +{ + rfc_dataEntry_t *entry; + + lpm_register_module(&prop_lpm_module); + + if(ti_lib_chipinfo_chip_family_is_cc13xx() == false) { + return RF_CORE_CMD_ERROR; + } + + rf_core_set_modesel(); + + /* Initialise RX buffers */ + memset(rx_buf_0, 0, RX_BUF_SIZE); + memset(rx_buf_1, 0, RX_BUF_SIZE); + + entry = (rfc_dataEntry_t *)rx_buf_0; + entry->status = DATA_ENTRY_STATUS_PENDING; + entry->config.type = DATA_ENTRY_TYPE_GEN; + entry->config.lenSz = DATA_ENTRY_LENSZ_WORD; + entry->length = RX_BUF_SIZE - 8; + entry->pNextEntry = rx_buf_1; + + entry = (rfc_dataEntry_t *)rx_buf_1; + entry->status = DATA_ENTRY_STATUS_PENDING; + entry->config.type = DATA_ENTRY_TYPE_GEN; + entry->config.lenSz = DATA_ENTRY_LENSZ_WORD; + entry->length = RX_BUF_SIZE - 8; + entry->pNextEntry = rx_buf_0; + + /* Set of RF Core data queue. Circular buffer, no last entry */ + rx_data_queue.pCurrEntry = rx_buf_0; + rx_data_queue.pLastEntry = NULL; + + /* Initialize current read pointer to first element (used in ISR) */ + rx_read_entry = rx_buf_0; + + smartrf_settings_cmd_prop_rx_adv.pQueue = &rx_data_queue; + smartrf_settings_cmd_prop_rx_adv.pOutput = (uint8_t *)&rx_stats; + + set_channel(RF_CORE_CHANNEL); + + if(on() != RF_CORE_CMD_OK) { + PRINTF("init: on() failed\n"); + return RF_CORE_CMD_ERROR; + } + + ENERGEST_ON(ENERGEST_TYPE_LISTEN); + + rf_core_primary_mode_register(&mode_prop); + + process_start(&rf_core_process, NULL); + + return 1; +} +/*---------------------------------------------------------------------------*/ +static int +prepare(const void *payload, unsigned short payload_len) +{ + int len = MIN(payload_len, TX_BUF_PAYLOAD_LEN); + + memcpy(&tx_buf[TX_BUF_HDR_LEN], payload, len); + return RF_CORE_CMD_OK; +} +/*---------------------------------------------------------------------------*/ +static int +transmit(unsigned short transmit_len) +{ + int ret; + uint32_t cmd_status; + volatile rfc_CMD_PROP_TX_ADV_t *cmd_tx_adv; + + /* Length in .15.4g PHY HDR. Includes the CRC but not the HDR itself */ + uint16_t total_length; + + if(!rf_is_on()) { + if(on() != RF_CORE_CMD_OK) { + PRINTF("transmit: on() failed\n"); + return RADIO_TX_ERR; + } + } + + /* + * Prepare the .15.4g PHY header + * MS=0, Length MSBits=0, DW and CRC configurable + * Total length = transmit_len (payload) + CRC length + * + * The Radio will flip the bits around, so tx_buf[0] must have the length + * LSBs (PHR[15:8] and tx_buf[1] will have PHR[7:0] + */ + total_length = transmit_len + CRC_LEN; + + tx_buf[0] = total_length & 0xFF; + tx_buf[1] = (total_length >> 8) + DOT_4G_PHR_DW_BIT + DOT_4G_PHR_CRC_BIT; + + /* Prepare the CMD_PROP_TX_ADV command */ + cmd_tx_adv = (rfc_CMD_PROP_TX_ADV_t *)&smartrf_settings_cmd_prop_tx_adv; + + /* + * pktLen: Total number of bytes in the TX buffer, including the header if + * one exists, but not including the CRC (which is not present in the buffer) + */ + cmd_tx_adv->pktLen = transmit_len + DOT_4G_PHR_LEN; + cmd_tx_adv->pPkt = tx_buf; + + /* Abort RX */ + rx_off_prop(); + + /* Enable the LAST_COMMAND_DONE interrupt to wake us up */ + rf_core_cmd_done_en(); + + ret = rf_core_send_cmd((uint32_t)cmd_tx_adv, &cmd_status); + + if(ret) { + /* If we enter here, TX actually started */ + ENERGEST_OFF(ENERGEST_TYPE_LISTEN); + ENERGEST_ON(ENERGEST_TYPE_TRANSMIT); + + watchdog_periodic(); + + /* Idle away while the command is running */ + while((cmd_tx_adv->status & RF_CORE_RADIO_OP_MASKED_STATUS) + == RF_CORE_RADIO_OP_MASKED_STATUS_RUNNING) { + lpm_sleep(); + } + + if(cmd_tx_adv->status == RF_CORE_RADIO_OP_STATUS_PROP_DONE_OK) { + /* Sent OK */ + RIMESTATS_ADD(lltx); + ret = RADIO_TX_OK; + } else { + /* Operation completed, but frame was not sent */ + PRINTF("transmit: Not Sent OK status=0x%04x\n", + cmd_tx_adv->status); + ret = RADIO_TX_ERR; + } + } else { + /* Failure sending the CMD_PROP_TX command */ + PRINTF("transmit: PROP_TX_ERR ret=%d, CMDSTA=0x%08lx, status=0x%04x\n", + ret, cmd_status, cmd_tx_adv->status); + ret = RADIO_TX_ERR; + } + + /* + * Update ENERGEST state here, before a potential call to off(), which + * will correctly update it if required. + */ + ENERGEST_OFF(ENERGEST_TYPE_TRANSMIT); + ENERGEST_ON(ENERGEST_TYPE_LISTEN); + + /* + * Disable LAST_FG_COMMAND_DONE interrupt. We don't really care about it + * except when we are transmitting + */ + rf_core_cmd_done_dis(); + + /* Workaround. Set status to IDLE */ + cmd_tx_adv->status = RF_CORE_RADIO_OP_STATUS_IDLE; + + rx_on_prop(); + + return ret; +} +/*---------------------------------------------------------------------------*/ +static int +send(const void *payload, unsigned short payload_len) +{ + prepare(payload, payload_len); + return transmit(payload_len); +} +/*---------------------------------------------------------------------------*/ +static int +read_frame(void *buf, unsigned short buf_len) +{ + rfc_dataEntryGeneral_t *entry = (rfc_dataEntryGeneral_t *)rx_read_entry; + uint8_t *data_ptr = &entry->data; + int len = 0; + + if(entry->status == DATA_ENTRY_STATUS_FINISHED) { + + /* + * First 2 bytes in the data entry are the length. + * Our data entry consists of: Payload + RSSI (1 byte) + Status (1 byte) + * This length includes all of those. + */ + len = (*(uint16_t *)data_ptr); + data_ptr += 2; + len -= 2; + + if(len > 0) { + if(len <= buf_len) { + memcpy(buf, data_ptr, len); + } + + packetbuf_set_attr(PACKETBUF_ATTR_RSSI, (int8_t)data_ptr[len]); + +#if PROP_MODE_SNIFFER + { + int i; + + cc26xx_uart_write_byte(magic[0]); + cc26xx_uart_write_byte(magic[1]); + cc26xx_uart_write_byte(magic[2]); + cc26xx_uart_write_byte(magic[3]); + + cc26xx_uart_write_byte(len + 2); + + for(i = 0; i < len; ++i) { + cc26xx_uart_write_byte(((uint8_t *)(buf))[i]); + } + + cc26xx_uart_write_byte((uint8_t)rx_stats.lastRssi); + cc26xx_uart_write_byte(0x80); + + while(cc26xx_uart_busy() == UART_BUSY); + } +#endif + } + + /* Move read entry pointer to next entry */ + rx_read_entry = entry->pNextEntry; + entry->status = DATA_ENTRY_STATUS_PENDING; + } + + return len; +} +/*---------------------------------------------------------------------------*/ +static int +channel_clear(void) +{ + uint8_t was_off = 0; + uint32_t cmd_status; + int8_t rssi = RF_CMD_CCA_REQ_RSSI_UNKNOWN; + + /* + * If we are in the middle of a BLE operation, we got called by ContikiMAC + * from within an interrupt context. Indicate a clear channel + */ + if(rf_ble_is_active() == RF_BLE_ACTIVE) { + return RF_CCA_CLEAR; + } + + if(!rf_core_is_accessible()) { + was_off = 1; + if(on() != RF_CORE_CMD_OK) { + PRINTF("channel_clear: on() failed\n"); + if(was_off) { + off(); + } + return RF_CCA_CLEAR; + } + } else { + if(transmitting()) { + PRINTF("channel_clear: called while in TX\n"); + return RF_CCA_CLEAR; + } + } + + while(rssi == RF_CMD_CCA_REQ_RSSI_UNKNOWN || rssi == 0) { + if(rf_core_send_cmd(CMDR_DIR_CMD(CMD_GET_RSSI), &cmd_status) + != RF_CORE_CMD_OK) { + break; + } + /* Current RSSI in bits 23:16 of cmd_status */ + rssi = (cmd_status >> 16) & 0xFF; + } + + if(was_off) { + off(); + } + + if(rssi >= rssi_threshold) { + return RF_CCA_BUSY; + } + + return RF_CCA_CLEAR; +} +/*---------------------------------------------------------------------------*/ +static int +receiving_packet(void) +{ + if(!rf_is_on()) { + return 0; + } + + if(channel_clear() == RF_CCA_CLEAR) { + return 0; + } + + return 1; +} +/*---------------------------------------------------------------------------*/ +static int +pending_packet(void) +{ + int rv = 0; + volatile rfc_dataEntry_t *entry = (rfc_dataEntry_t *)rx_data_queue.pCurrEntry; + + /* Go through all RX buffers and check their status */ + do { + if(entry->status == DATA_ENTRY_STATUS_FINISHED) { + rv += 1; + process_poll(&rf_core_process); + } + + entry = (rfc_dataEntry_t *)entry->pNextEntry; + } while(entry != (rfc_dataEntry_t *)rx_data_queue.pCurrEntry); + + /* If we didn't find an entry at status finished, no frames are pending */ + return rv; +} +/*---------------------------------------------------------------------------*/ +static int +on(void) +{ + /* + * Request the HF XOSC as the source for the HF clock. Needed before we can + * use the FS. This will only request, it will _not_ perform the switch. + */ + oscillators_request_hf_xosc(); + + /* + * If we are in the middle of a BLE operation, we got called by ContikiMAC + * from within an interrupt context. Abort, but pretend everything is OK. + */ + if(rf_ble_is_active() == RF_BLE_ACTIVE) { + return RF_CORE_CMD_OK; + } + + if(rf_is_on()) { + PRINTF("on: We were on. PD=%u, RX=0x%04x \n", rf_core_is_accessible(), + smartrf_settings_cmd_prop_rx_adv.status); + return RF_CORE_CMD_OK; + } + + if(!rf_core_is_accessible()) { + if(rf_core_power_up() != RF_CORE_CMD_OK) { + PRINTF("on: rf_core_power_up() failed\n"); + + rf_core_power_down(); + + return RF_CORE_CMD_ERROR; + } + + rf_patch_cpe_genfsk(); + + if(rf_core_start_rat() != RF_CORE_CMD_OK) { + PRINTF("on: rf_core_start_rat() failed\n"); + + rf_core_power_down(); + + return RF_CORE_CMD_ERROR; + } + } + + rf_core_setup_interrupts(); + + /* + * Trigger a switch to the XOSC, so that we can subsequently use the RF FS + * This will block until the XOSC is actually ready, but give how we + * requested it early on, this won't be too long a wait/ + */ + oscillators_switch_to_hf_xosc(); + + if(prop_div_radio_setup() != RF_CORE_CMD_OK) { + PRINTF("on: prop_div_radio_setup() failed\n"); + return RF_CORE_CMD_ERROR; + } + + if(prop_fs() != RF_CORE_CMD_OK) { + PRINTF("on: prop_fs() failed\n"); + return RF_CORE_CMD_ERROR; + } + + return rx_on_prop(); +} +/*---------------------------------------------------------------------------*/ +static int +off(void) +{ + rfc_dataEntry_t *entry; + + /* + * If we are in the middle of a BLE operation, we got called by ContikiMAC + * from within an interrupt context. Abort, but pretend everything is OK. + */ + if(rf_ble_is_active() == RF_BLE_ACTIVE) { + return RF_CORE_CMD_OK; + } + + rf_core_power_down(); + + /* Switch HF clock source to the RCOSC to preserve power */ + oscillators_switch_to_hf_rc(); + + /* We pulled the plug, so we need to restore the status manually */ + smartrf_settings_cmd_prop_rx_adv.status = RF_CORE_RADIO_OP_STATUS_IDLE; + + entry = (rfc_dataEntry_t *)rx_buf_0; + entry->status = DATA_ENTRY_STATUS_PENDING; + + entry = (rfc_dataEntry_t *)rx_buf_1; + entry->status = DATA_ENTRY_STATUS_PENDING; + + return RF_CORE_CMD_OK; +} +/*---------------------------------------------------------------------------*/ +static radio_result_t +get_value(radio_param_t param, radio_value_t *value) +{ + if(!value) { + return RADIO_RESULT_INVALID_VALUE; + } + + switch(param) { + case RADIO_PARAM_POWER_MODE: + /* On / off */ + *value = rf_is_on() ? RADIO_POWER_MODE_ON : RADIO_POWER_MODE_OFF; + return RADIO_RESULT_OK; + case RADIO_PARAM_CHANNEL: + *value = (radio_value_t)get_channel(); + return RADIO_RESULT_OK; + case RADIO_PARAM_TXPOWER: + *value = get_tx_power(); + return RADIO_RESULT_OK; + case RADIO_PARAM_CCA_THRESHOLD: + *value = rssi_threshold; + return RADIO_RESULT_OK; + case RADIO_PARAM_RSSI: + *value = get_rssi(); + + if(*value == RF_CMD_CCA_REQ_RSSI_UNKNOWN) { + return RADIO_RESULT_ERROR; + } else { + return RADIO_RESULT_OK; + } + case RADIO_CONST_CHANNEL_MIN: + *value = 0; + return RADIO_RESULT_OK; + case RADIO_CONST_CHANNEL_MAX: + *value = DOT_15_4G_CHANNEL_MAX; + return RADIO_RESULT_OK; + case RADIO_CONST_TXPOWER_MIN: + *value = OUTPUT_POWER_MIN; + return RADIO_RESULT_OK; + case RADIO_CONST_TXPOWER_MAX: + *value = OUTPUT_POWER_MAX; + return RADIO_RESULT_OK; + default: + return RADIO_RESULT_NOT_SUPPORTED; + } +} +/*---------------------------------------------------------------------------*/ +static radio_result_t +set_value(radio_param_t param, radio_value_t value) +{ + uint8_t was_off = 0; + radio_result_t rv = RADIO_RESULT_OK; + + switch(param) { + case RADIO_PARAM_POWER_MODE: + if(value == RADIO_POWER_MODE_ON) { + if(on() != RF_CORE_CMD_OK) { + PRINTF("set_value: on() failed (1)\n"); + return RADIO_RESULT_ERROR; + } + return RADIO_RESULT_OK; + } + if(value == RADIO_POWER_MODE_OFF) { + off(); + return RADIO_RESULT_OK; + } + return RADIO_RESULT_INVALID_VALUE; + case RADIO_PARAM_CHANNEL: + if(value < 0 || + value > DOT_15_4G_CHANNEL_MAX) { + return RADIO_RESULT_INVALID_VALUE; + } + + set_channel((uint8_t)value); + break; + case RADIO_PARAM_TXPOWER: + if(value < OUTPUT_POWER_MIN || value > OUTPUT_POWER_MAX) { + return RADIO_RESULT_INVALID_VALUE; + } + + soft_off_prop(); + + set_tx_power(value); + + if(soft_on_prop() != RF_CORE_CMD_OK) { + PRINTF("set_value: soft_on_prop() failed\n"); + rv = RADIO_RESULT_ERROR; + } + + return RADIO_RESULT_OK; + case RADIO_PARAM_CCA_THRESHOLD: + rssi_threshold = (int8_t)value; + break; + default: + return RADIO_RESULT_NOT_SUPPORTED; + } + + /* If we reach here we had no errors. Apply new settings */ + if(!rf_is_on()) { + was_off = 1; + if(on() != RF_CORE_CMD_OK) { + PRINTF("set_value: on() failed (2)\n"); + return RADIO_RESULT_ERROR; + } + } + + if(rx_off_prop() != RF_CORE_CMD_OK) { + PRINTF("set_value: rx_off_prop() failed\n"); + rv = RADIO_RESULT_ERROR; + } + + if(rx_on_prop() != RF_CORE_CMD_OK) { + PRINTF("set_value: rx_on_prop() failed\n"); + rv = RADIO_RESULT_ERROR; + } + + /* If we were off, turn back off */ + if(was_off) { + off(); + } + + return rv; +} +/*---------------------------------------------------------------------------*/ +static radio_result_t +get_object(radio_param_t param, void *dest, size_t size) +{ + return RADIO_RESULT_NOT_SUPPORTED; +} +/*---------------------------------------------------------------------------*/ +static radio_result_t +set_object(radio_param_t param, const void *src, size_t size) +{ + return RADIO_RESULT_NOT_SUPPORTED; +} +/*---------------------------------------------------------------------------*/ +const struct radio_driver prop_mode_driver = { + init, + prepare, + transmit, + send, + read_frame, + channel_clear, + receiving_packet, + pending_packet, + on, + off, + get_value, + set_value, + get_object, + set_object, +}; +/*---------------------------------------------------------------------------*/ +/** + * @} + * @} + */ diff --git a/cpu/cc26xx-cc13xx/rf-core/rf-ble.c b/cpu/cc26xx-cc13xx/rf-core/rf-ble.c new file mode 100644 index 000000000..1db80569f --- /dev/null +++ b/cpu/cc26xx-cc13xx/rf-core/rf-ble.c @@ -0,0 +1,400 @@ +/* + * Copyright (c) 2015, Texas Instruments Incorporated - http://www.ti.com/ + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup rf-core-ble + * @{ + * + * \file + * Implementation of the CC13xx/CC26xx RF BLE driver + */ +/*---------------------------------------------------------------------------*/ +#include "contiki-conf.h" +#include "sys/process.h" +#include "sys/clock.h" +#include "sys/etimer.h" +#include "net/netstack.h" +#include "net/linkaddr.h" +#include "dev/oscillators.h" +#include "rf-core/rf-core.h" +#include "rf-core/rf-ble.h" +#include "rf-core/api/ble_cmd.h" +#include "rf-core/api/common_cmd.h" +#include "ti-lib.h" +/*---------------------------------------------------------------------------*/ +#include +#include +#include +/*---------------------------------------------------------------------------*/ +#ifdef __GNUC__ +#define CC_ALIGN_ATTR(n) __attribute__ ((aligned(n))) +#else +#define CC_ALIGN_ATTR(n) +#endif +/*---------------------------------------------------------------------------*/ +#define DEBUG 0 +#if DEBUG +#define PRINTF(...) printf(__VA_ARGS__) +#else +#define PRINTF(...) +#endif +/*---------------------------------------------------------------------------*/ +/* BLE Intervals: Send a burst of advertisements every BLE_ADV_INTERVAL secs */ +#define BLE_ADV_INTERVAL (CLOCK_SECOND * 5) +#define BLE_ADV_DUTY_CYCLE (CLOCK_SECOND / 10) +#define BLE_ADV_MESSAGES 10 + +/* BLE Advertisement-related macros */ +#define BLE_ADV_TYPE_DEVINFO 0x01 +#define BLE_ADV_TYPE_NAME 0x09 +#define BLE_ADV_TYPE_MANUFACTURER 0xFF +#define BLE_ADV_NAME_BUF_LEN 32 +#define BLE_ADV_PAYLOAD_BUF_LEN 64 +#define BLE_UUID_SIZE 16 +/*---------------------------------------------------------------------------*/ +static unsigned char ble_params_buf[32] CC_ALIGN_ATTR(4); +static uint8_t ble_mode_on = RF_BLE_IDLE; +static struct etimer ble_adv_et; +static uint8_t payload[BLE_ADV_PAYLOAD_BUF_LEN]; +static int p = 0; +static int i; +/*---------------------------------------------------------------------------*/ +typedef struct default_ble_tx_power_s { + uint16_t ib:6; + uint16_t gc:2; + uint16_t boost:1; + uint16_t temp_coeff:7; +} default_ble_tx_power_t; + +static default_ble_tx_power_t tx_power = { 0x29, 0x00, 0x00, 0x00 }; +/*---------------------------------------------------------------------------*/ +/* BLE beacond config */ +static struct ble_beacond_config { + clock_time_t interval; + char adv_name[BLE_ADV_NAME_BUF_LEN]; +} beacond_config = { .interval = BLE_ADV_INTERVAL }; +/*---------------------------------------------------------------------------*/ +/* BLE overrides */ +static uint32_t ble_overrides[] = { + 0x00364038, /* Synth: Set RTRIM (POTAILRESTRIM) to 6 */ + 0x000784A3, /* Synth: Set FREF = 3.43 MHz (24 MHz / 7) */ + 0xA47E0583, /* Synth: Set loop bandwidth after lock to 80 kHz (K2) */ + 0xEAE00603, /* Synth: Set loop bandwidth after lock to 80 kHz (K3, LSB) */ + 0x00010623, /* Synth: Set loop bandwidth after lock to 80 kHz (K3, MSB) */ + 0x00456088, /* Adjust AGC reference level */ + 0xFFFFFFFF, /* End of override list */ +}; +/*---------------------------------------------------------------------------*/ +PROCESS(rf_ble_beacon_process, "CC13xx / CC26xx RF BLE Beacon Process"); +/*---------------------------------------------------------------------------*/ +static int +send_ble_adv_nc(int channel, uint8_t *adv_payload, int adv_payload_len) +{ + uint32_t cmd_status; + rfc_CMD_BLE_ADV_NC_t cmd; + rfc_bleAdvPar_t *params; + + params = (rfc_bleAdvPar_t *)ble_params_buf; + + /* Clear both buffers */ + memset(&cmd, 0x00, sizeof(cmd)); + memset(ble_params_buf, 0x00, sizeof(ble_params_buf)); + + /* Adv NC */ + cmd.commandNo = CMD_BLE_ADV_NC; + cmd.condition.rule = COND_NEVER; + cmd.whitening.bOverride = 0; + cmd.whitening.init = 0; + cmd.pParams = params; + cmd.channel = channel; + + /* Set up BLE Advertisement parameters */ + params->pDeviceAddress = (uint16_t *)&linkaddr_node_addr.u8[LINKADDR_SIZE - 2]; + params->endTrigger.triggerType = TRIG_NEVER; + params->endTime = TRIG_NEVER; + + /* Set up BLE Advertisement parameters */ + params = (rfc_bleAdvPar_t *)ble_params_buf; + params->advLen = adv_payload_len; + params->pAdvData = adv_payload; + + if(rf_core_send_cmd((uint32_t)&cmd, &cmd_status) == RF_CORE_CMD_ERROR) { + PRINTF("send_ble_adv_nc: Chan=%d CMDSTA=0x%08lx, status=0x%04x\n", + channel, cmd_status, cmd.status); + return RF_CORE_CMD_ERROR; + } + + /* Wait until the command is done */ + if(rf_core_wait_cmd_done(&cmd) != RF_CORE_CMD_OK) { + PRINTF("send_ble_adv_nc: Chan=%d CMDSTA=0x%08lx, status=0x%04x\n", + channel, cmd_status, cmd.status); + return RF_CORE_CMD_ERROR; + } + + return RF_CORE_CMD_OK; +} +/*---------------------------------------------------------------------------*/ +void +rf_ble_beacond_config(clock_time_t interval, const char *name) +{ + if(RF_BLE_ENABLED == 0) { + return; + } + + if(name != NULL) { + if(strlen(name) == 0 || strlen(name) >= BLE_ADV_NAME_BUF_LEN) { + return; + } + + memset(beacond_config.adv_name, 0, BLE_ADV_NAME_BUF_LEN); + memcpy(beacond_config.adv_name, name, strlen(name)); + } + + if(interval != 0) { + beacond_config.interval = interval; + } +} +/*---------------------------------------------------------------------------*/ +uint8_t +rf_ble_beacond_start() +{ + if(RF_BLE_ENABLED == 0) { + return RF_CORE_CMD_ERROR; + } + + if(ti_lib_chipinfo_supports_ble() == false) { + return RF_CORE_CMD_ERROR; + } + + if(beacond_config.adv_name[0] == 0) { + return RF_CORE_CMD_ERROR; + } + + ble_mode_on = RF_BLE_IDLE; + + process_start(&rf_ble_beacon_process, NULL); + + return RF_CORE_CMD_OK; +} +/*---------------------------------------------------------------------------*/ +uint8_t +rf_ble_is_active() +{ + return ble_mode_on; +} +/*---------------------------------------------------------------------------*/ +void +rf_ble_beacond_stop() +{ + process_exit(&rf_ble_beacon_process); +} +/*---------------------------------------------------------------------------*/ +static uint8_t +rf_radio_setup() +{ + uint32_t cmd_status; + rfc_CMD_RADIO_SETUP_t cmd; + + /* Create radio setup command */ + rf_core_init_radio_op((rfc_radioOp_t *)&cmd, sizeof(cmd), CMD_RADIO_SETUP); + + cmd.txPower.IB = tx_power.ib; + cmd.txPower.GC = tx_power.gc; + cmd.txPower.tempCoeff = tx_power.temp_coeff; + cmd.txPower.boost = tx_power.boost; + cmd.pRegOverride = ble_overrides; + cmd.mode = 0; + + /* Send Radio setup to RF Core */ + if(rf_core_send_cmd((uint32_t)&cmd, &cmd_status) != RF_CORE_CMD_OK) { + PRINTF("rf_radio_setup: CMDSTA=0x%08lx, status=0x%04x\n", + cmd_status, cmd.status); + return RF_CORE_CMD_ERROR; + } + + /* Wait until radio setup is done */ + if(rf_core_wait_cmd_done(&cmd) != RF_CORE_CMD_OK) { + PRINTF("rf_radio_setup: wait, CMDSTA=0x%08lx, status=0x%04x\n", + cmd_status, cmd.status); + return RF_CORE_CMD_ERROR; + } + + return RF_CORE_CMD_OK; +} +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(rf_ble_beacon_process, ev, data) +{ + uint8_t was_on; + int j; + uint32_t cmd_status; + bool interrupts_disabled; + + PROCESS_BEGIN(); + + while(1) { + etimer_set(&ble_adv_et, beacond_config.interval); + + PROCESS_WAIT_EVENT(); + + if(ev == PROCESS_EVENT_EXIT) { + PROCESS_EXIT(); + } + + /* Set the adv payload each pass: The device name may have changed */ + p = 0; + + /* device info */ + memset(payload, 0, BLE_ADV_PAYLOAD_BUF_LEN); + payload[p++] = 0x02; /* 2 bytes */ + payload[p++] = BLE_ADV_TYPE_DEVINFO; + payload[p++] = 0x1a; /* LE general discoverable + BR/EDR */ + payload[p++] = 1 + strlen(beacond_config.adv_name); + payload[p++] = BLE_ADV_TYPE_NAME; + memcpy(&payload[p], beacond_config.adv_name, + strlen(beacond_config.adv_name)); + p += strlen(beacond_config.adv_name); + + for(i = 0; i < BLE_ADV_MESSAGES; i++) { + /* + * Under ContikiMAC, some IEEE-related operations will be called from an + * interrupt context. We need those to see that we are in BLE mode. + */ + interrupts_disabled = ti_lib_int_master_disable(); + ble_mode_on = RF_BLE_ACTIVE; + if(!interrupts_disabled) { + ti_lib_int_master_enable(); + } + + /* + * Send BLE_ADV_MESSAGES beacon bursts. Each burst on all three + * channels, with a BLE_ADV_DUTY_CYCLE interval between bursts + * + * First, determine our state: + * + * If we are running NullRDC, we are likely in IEEE RX mode. We need to + * abort the IEEE BG Op before entering BLE mode. + * If we are ContikiMAC, we are likely off, in which case we need to + * boot the CPE before entering BLE mode + */ + was_on = rf_core_is_accessible(); + + if(was_on) { + /* + * We were on: If we are in the process of receiving a frame, abort the + * BLE beacon burst. Otherwise, terminate the primary radio Op so we + * can switch to BLE mode + */ + if(NETSTACK_RADIO.receiving_packet()) { + PRINTF("rf_ble_beacon_process: We were receiving\n"); + + /* Abort this pass */ + break; + } + + rf_core_primary_mode_abort(); + } else { + /* Request the HF XOSC to source the HF clock. */ + oscillators_request_hf_xosc(); + + /* We were off: Boot the CPE */ + if(rf_core_boot() != RF_CORE_CMD_OK) { + PRINTF("rf_ble_beacon_process: rf_core_boot() failed\n"); + + /* Abort this pass */ + break; + } + + /* Trigger a switch to the XOSC, so that we can use the FS */ + oscillators_switch_to_hf_xosc(); + } + + /* Enter BLE mode */ + if(rf_radio_setup() != RF_CORE_CMD_OK) { + PRINTF("cc26xx_rf_ble_beacon_process: Error entering BLE mode\n"); + /* Continue so we can at least try to restore our previous state */ + } else { + /* Send advertising packets on all 3 advertising channels */ + for(j = 37; j <= 39; j++) { + if(send_ble_adv_nc(j, payload, p) != RF_CORE_CMD_OK) { + PRINTF("cc26xx_rf_ble_beacon_process: Channel=%d, " + "Error advertising\n", j); + /* Break the loop, but don't return just yet */ + break; + } + } + } + + /* Send a CMD_STOP command to RF Core */ + if(rf_core_send_cmd(CMDR_DIR_CMD(CMD_STOP), &cmd_status) != RF_CORE_CMD_OK) { + PRINTF("cc26xx_rf_ble_beacon_process: status=0x%08lx\n", cmd_status); + /* Continue... */ + } + + if(was_on) { + /* We were on, go back to previous primary mode */ + rf_core_primary_mode_restore(); + } else { + /* We were off. Shut back off */ + rf_core_power_down(); + + /* Switch HF clock source to the RCOSC to preserve power */ + oscillators_switch_to_hf_rc(); + } + etimer_set(&ble_adv_et, BLE_ADV_DUTY_CYCLE); + + interrupts_disabled = ti_lib_int_master_disable(); + + ble_mode_on = RF_BLE_IDLE; + + if(!interrupts_disabled) { + ti_lib_int_master_enable(); + } + + /* Wait unless this is the last burst */ + if(i < BLE_ADV_MESSAGES - 1) { + PROCESS_WAIT_EVENT(); + } + } + + interrupts_disabled = ti_lib_int_master_disable(); + + ble_mode_on = RF_BLE_IDLE; + + if(!interrupts_disabled) { + ti_lib_int_master_enable(); + } + } + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ +/** + * @} + * @} + */ diff --git a/cpu/cc26xx/dev/cc26xx-rf.h b/cpu/cc26xx-cc13xx/rf-core/rf-ble.h similarity index 62% rename from cpu/cc26xx/dev/cc26xx-rf.h rename to cpu/cc26xx-cc13xx/rf-core/rf-ble.h index a278e085d..f26bd383e 100644 --- a/cpu/cc26xx/dev/cc26xx-rf.h +++ b/cpu/cc26xx-cc13xx/rf-core/rf-ble.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Texas Instruments Incorporated - http://www.ti.com/ + * Copyright (c) 2015, Texas Instruments Incorporated - http://www.ti.com/ * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -10,7 +10,6 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * * 3. Neither the name of the copyright holder nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. @@ -28,59 +27,35 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ +/*---------------------------------------------------------------------------*/ /** - * \addtogroup cc26xx + * \addtogroup rf-core * @{ * - * \defgroup cc26xx-rf CC26xx RF driver - * - * The CC26xx RF has dual capability: It can operate in IEEE 802.15.4 mode at - * 2.4GHz, but it can also operate in BLE mode. This driver provides a fully - * contiki-compliant .15.4 functionality, but it also provides some very basic - * BLE capability. + * \defgroup rf-core-ble CC13xx/CC26xx BLE driver * * @{ - */ -/** + * * \file - * Header file for the CC26xx RF driver + * Header file for the CC13xx/CC26xx BLE driver */ -#ifndef CC26XX_RF_H_ -#define CC26XX_RF_H_ /*---------------------------------------------------------------------------*/ -#include "contiki.h" -#include "cc26xx-model.h" -#include "dev/radio.h" +#ifndef RF_BLE_H_ +#define RF_BLE_H_ /*---------------------------------------------------------------------------*/ +#include "contiki-conf.h" +#include "rf-core/rf-core.h" + #include /*---------------------------------------------------------------------------*/ -#ifdef CC26XX_RF_CONF_CHANNEL -#define CC26XX_RF_CHANNEL CC26XX_RF_CONF_CHANNEL +#ifdef RF_BLE_CONF_ENABLED +#define RF_BLE_ENABLED RF_BLE_CONF_ENABLED #else -#define CC26XX_RF_CHANNEL 18 -#endif /* CC26XX_RF_CONF_CHANNEL */ - -#ifdef CC26XX_RF_CONF_AUTOACK -#define CC26XX_RF_AUTOACK CC26XX_RF_CONF_AUTOACK -#else -#define CC26XX_RF_AUTOACK 1 -#endif /* CC26XX_RF_CONF_AUTOACK */ - -#if (CC26XX_RF_CONF_BLE_SUPPORT) && (CC26XX_MODEL_CPU_VARIANT == 2650) -#define CC26XX_RF_BLE_SUPPORT CC26XX_RF_CONF_BLE_SUPPORT -#else -#define CC26XX_RF_BLE_SUPPORT 0 +#define RF_BLE_ENABLED 1 #endif -/*--------------------------------------------------------------------------- - * RF Config - *---------------------------------------------------------------------------*/ -/* Constants */ -#define CC26XX_RF_CHANNEL_MIN 11 -#define CC26XX_RF_CHANNEL_MAX 26 -#define CC26XX_RF_CHANNEL_SPACING 5 -#define CC26XX_RF_CHANNEL_SET_ERROR -1 -#define CC26XX_RF_MAX_PACKET_LEN 127 -#define CC26XX_RF_MIN_PACKET_LEN 4 +/*---------------------------------------------------------------------------*/ +#define RF_BLE_IDLE 0 +#define RF_BLE_ACTIVE 1 /*---------------------------------------------------------------------------*/ /** * \brief Set the device name to use with the BLE advertisement/beacon daemon @@ -91,24 +66,31 @@ * this function can be used to configure a single parameter at a time if so * desired. */ -void cc26xx_rf_ble_beacond_config(clock_time_t interval, const char *name); +void rf_ble_beacond_config(clock_time_t interval, const char *name); /** * \brief Start the BLE advertisement/beacon daemon - * \return 1: Success, 0: Failure + * \return RF_CORE_CMD_OK: Success, RF_CORE_CMD_ERROR: Failure * * Before calling this function, the name to advertise must first be set by - * calling cc26xx_rf_ble_beacond_set_adv_name(). Otherwise, this function will - * return an error. + * calling rf_ble_beacond_config(). Otherwise, this function will return an + * error. */ -uint8_t cc26xx_rf_ble_beacond_start(void); +uint8_t rf_ble_beacond_start(void); /** * \brief Stop the BLE advertisement/beacon daemon */ -void cc26xx_rf_ble_beacond_stop(void); +void rf_ble_beacond_stop(void); + +/** + * \brief Check whether the BLE beacond is currently active + * \retval 1 The radio is in BLE mode + * \retval 0 The BLE daemon is not active, or disabled + */ +uint8_t rf_ble_is_active(void); /*---------------------------------------------------------------------------*/ -#endif /* CC26XX_RF_H_ */ +#endif /* RF_BLE_H_ */ /*---------------------------------------------------------------------------*/ /** * @} diff --git a/cpu/cc26xx-cc13xx/rf-core/rf-core.c b/cpu/cc26xx-cc13xx/rf-core/rf-core.c new file mode 100644 index 000000000..7528a6f77 --- /dev/null +++ b/cpu/cc26xx-cc13xx/rf-core/rf-core.c @@ -0,0 +1,518 @@ +/* + * Copyright (c) 2015, Texas Instruments Incorporated - http://www.ti.com/ + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup rf-core + * @{ + * + * \file + * Implementation of the CC13xx/CC26xx RF core driver + */ +/*---------------------------------------------------------------------------*/ +#include "contiki-conf.h" +#include "dev/watchdog.h" +#include "sys/process.h" +#include "sys/energest.h" +#include "net/netstack.h" +#include "net/packetbuf.h" +#include "net/rime/rimestats.h" +#include "rf-core/rf-core.h" +#include "ti-lib.h" +/*---------------------------------------------------------------------------*/ +/* RF core and RF HAL API */ +#include "hw_rfc_dbell.h" +#include "hw_rfc_pwr.h" +/*---------------------------------------------------------------------------*/ +/* RF Core Mailbox API */ +#include "rf-core/api/mailbox.h" +#include "rf-core/api/common_cmd.h" +#include "rf-core/api/ble_cmd.h" +#include "rf-core/api/ieee_cmd.h" +#include "rf-core/api/data_entry.h" +#include "rf-core/api/ble_mailbox.h" +#include "rf-core/api/ieee_mailbox.h" +#include "rf-core/api/prop_mailbox.h" +#include "rf-core/api/prop_cmd.h" +/*---------------------------------------------------------------------------*/ +#include +#include +#include +#include +/*---------------------------------------------------------------------------*/ +#define DEBUG 0 +#if DEBUG +#define PRINTF(...) printf(__VA_ARGS__) +#else +#define PRINTF(...) +#endif +/*---------------------------------------------------------------------------*/ +#ifdef __GNUC__ +#define CC_ALIGN_ATTR(n) __attribute__ ((aligned(n))) +#else +#define CC_ALIGN_ATTR(n) +#endif +/*---------------------------------------------------------------------------*/ +#ifdef RF_CORE_CONF_DEBUG_CRC +#define RF_CORE_DEBUG_CRC RF_CORE_CONF_DEBUG_CRC +#else +#define RF_CORE_DEBUG_CRC DEBUG +#endif +/*---------------------------------------------------------------------------*/ +/* RF interrupts */ +#define RX_FRAME_IRQ IRQ_RX_ENTRY_DONE +#define ERROR_IRQ IRQ_INTERNAL_ERROR +#define RX_NOK_IRQ IRQ_RX_NOK + +/* Those IRQs are enabled all the time */ +#if RF_CORE_DEBUG_CRC +#define ENABLED_IRQS (RX_FRAME_IRQ | ERROR_IRQ | RX_NOK_IRQ) +#else +#define ENABLED_IRQS (RX_FRAME_IRQ | ERROR_IRQ) +#endif + +#define cc26xx_rf_cpe0_isr RFCCPE0IntHandler +#define cc26xx_rf_cpe1_isr RFCCPE1IntHandler +/*---------------------------------------------------------------------------*/ +/* Remember the last Radio Op issued to the radio */ +static rfc_radioOp_t *last_radio_op = NULL; +/*---------------------------------------------------------------------------*/ +/* A struct holding pointers to the primary mode's abort() and restore() */ +static const rf_core_primary_mode_t *primary_mode = NULL; +/*---------------------------------------------------------------------------*/ +PROCESS(rf_core_process, "CC13xx / CC26xx RF driver"); +/*---------------------------------------------------------------------------*/ +#define RF_CORE_CLOCKS_MASK (RFC_PWR_PWMCLKEN_RFC_M | RFC_PWR_PWMCLKEN_CPE_M \ + | RFC_PWR_PWMCLKEN_CPERAM_M) +/*---------------------------------------------------------------------------*/ +uint8_t +rf_core_is_accessible() +{ + if(ti_lib_prcm_rf_ready() && + ti_lib_prcm_power_domain_status(PRCM_DOMAIN_RFCORE) == + PRCM_DOMAIN_POWER_ON) { + return RF_CORE_ACCESSIBLE; + } + return RF_CORE_NOT_ACCESSIBLE; +} +/*---------------------------------------------------------------------------*/ +uint_fast8_t +rf_core_send_cmd(uint32_t cmd, uint32_t *status) +{ + uint32_t timeout_count = 0; + bool interrupts_disabled; + bool is_radio_op = false; + + /* If cmd is 4-byte aligned, then it's a radio OP. Clear the status field */ + if((cmd & 0x03) == 0) { + is_radio_op = true; + ((rfc_radioOp_t *)cmd)->status = RF_CORE_RADIO_OP_STATUS_IDLE; + } + + /* + * Make sure ContikiMAC doesn't turn us off from within an interrupt while + * we are accessing RF Core registers + */ + interrupts_disabled = ti_lib_int_master_disable(); + + if(!rf_core_is_accessible()) { + PRINTF("rf_core_send_cmd: RF was off\n"); + if(!interrupts_disabled) { + ti_lib_int_master_enable(); + } + return RF_CORE_CMD_ERROR; + } + + if(is_radio_op) { + uint16_t command_no = ((rfc_radioOp_t *)cmd)->commandNo; + if((command_no & RF_CORE_COMMAND_PROTOCOL_MASK) != RF_CORE_COMMAND_PROTOCOL_COMMON && + (command_no & RF_CORE_COMMAND_TYPE_MASK) == RF_CORE_COMMAND_TYPE_RADIO_OP) { + last_radio_op = (rfc_radioOp_t *)cmd; + } + } + + HWREG(RFC_DBELL_BASE + RFC_DBELL_O_CMDR) = cmd; + do { + *status = HWREG(RFC_DBELL_BASE + RFC_DBELL_O_CMDSTA); + if(++timeout_count > 50000) { + PRINTF("rf_core_send_cmd: 0x%08lx Timeout\n", cmd); + if(!interrupts_disabled) { + ti_lib_int_master_enable(); + } + return RF_CORE_CMD_ERROR; + } + } while(*status == RF_CORE_CMDSTA_PENDING); + + if(!interrupts_disabled) { + ti_lib_int_master_enable(); + } + + /* + * If we reach here the command is no longer pending. It is either completed + * successfully or with error + */ + return (*status & RF_CORE_CMDSTA_RESULT_MASK) == RF_CORE_CMDSTA_DONE; +} +/*---------------------------------------------------------------------------*/ +uint_fast8_t +rf_core_wait_cmd_done(void *cmd) +{ + volatile rfc_radioOp_t *command = (rfc_radioOp_t *)cmd; + uint32_t timeout_cnt = 0; + + /* + * 0xn4nn=DONE, 0x0400=DONE_OK while all other "DONE" values means done + * but with some kind of error (ref. "Common radio operation status codes") + */ + do { + if(++timeout_cnt > 500000) { + return RF_CORE_CMD_ERROR; + } + } while((command->status & RF_CORE_RADIO_OP_MASKED_STATUS) + != RF_CORE_RADIO_OP_MASKED_STATUS_DONE); + + return (command->status & RF_CORE_RADIO_OP_MASKED_STATUS) + == RF_CORE_RADIO_OP_STATUS_DONE_OK; +} +/*---------------------------------------------------------------------------*/ +int +rf_core_power_up() +{ + uint32_t cmd_status; + bool interrupts_disabled = ti_lib_int_master_disable(); + + ti_lib_int_pend_clear(INT_RF_CPE0); + ti_lib_int_pend_clear(INT_RF_CPE1); + ti_lib_int_disable(INT_RF_CPE0); + ti_lib_int_disable(INT_RF_CPE1); + + /* Enable RF Core power domain */ + ti_lib_prcm_power_domain_on(PRCM_DOMAIN_RFCORE); + while(ti_lib_prcm_power_domain_status(PRCM_DOMAIN_RFCORE) + != PRCM_DOMAIN_POWER_ON); + + ti_lib_prcm_domain_enable(PRCM_DOMAIN_RFCORE); + ti_lib_prcm_load_set(); + while(!ti_lib_prcm_load_get()); + + while(!rf_core_is_accessible()) { + PRINTF("rf_core_power_up: Not ready\n"); + } + + HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIFG) = 0x0; + HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIEN) = 0x0; + ti_lib_int_enable(INT_RF_CPE0); + ti_lib_int_enable(INT_RF_CPE1); + + if(!interrupts_disabled) { + ti_lib_int_master_enable(); + } + + /* Let CPE boot */ + HWREG(RFC_PWR_NONBUF_BASE + RFC_PWR_O_PWMCLKEN) = RF_CORE_CLOCKS_MASK; + + /* Send ping (to verify RFCore is ready and alive) */ + if(rf_core_send_cmd(CMDR_DIR_CMD(CMD_PING), &cmd_status) != RF_CORE_CMD_OK) { + PRINTF("rf_core_power_up: CMD_PING fail, CMDSTA=0x%08lx\n", cmd_status); + return RF_CORE_CMD_ERROR; + } + + return RF_CORE_CMD_OK; +} +/*---------------------------------------------------------------------------*/ +void +rf_core_power_down() +{ + bool interrupts_disabled = ti_lib_int_master_disable(); + ti_lib_int_disable(INT_RF_CPE0); + ti_lib_int_disable(INT_RF_CPE1); + + if(rf_core_is_accessible()) { + HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIFG) = 0x0; + HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIEN) = 0x0; + } + + /* Shut down the RFCORE clock domain in the MCU VD */ + ti_lib_prcm_domain_disable(PRCM_DOMAIN_RFCORE); + ti_lib_prcm_load_set(); + while(!ti_lib_prcm_load_get()); + + /* Turn off RFCORE PD */ + ti_lib_prcm_power_domain_off(PRCM_DOMAIN_RFCORE); + while(ti_lib_prcm_power_domain_status(PRCM_DOMAIN_RFCORE) + != PRCM_DOMAIN_POWER_OFF); + + ti_lib_int_pend_clear(INT_RF_CPE0); + ti_lib_int_pend_clear(INT_RF_CPE1); + ti_lib_int_enable(INT_RF_CPE0); + ti_lib_int_enable(INT_RF_CPE1); + if(!interrupts_disabled) { + ti_lib_int_master_enable(); + } +} +/*---------------------------------------------------------------------------*/ +uint8_t +rf_core_set_modesel() +{ + uint8_t rv = RF_CORE_CMD_ERROR; + + if(ti_lib_chipinfo_chip_family_is_cc26xx()) { + if(ti_lib_chipinfo_supports_ble() == true && + ti_lib_chipinfo_supports_ieee_802_15_4() == true) { + /* CC2650 */ + HWREG(PRCM_BASE + PRCM_O_RFCMODESEL) = PRCM_RFCMODESEL_CURR_MODE5; + rv = RF_CORE_CMD_OK; + } else if(ti_lib_chipinfo_supports_ble() == false && + ti_lib_chipinfo_supports_ieee_802_15_4() == true) { + /* CC2630 */ + HWREG(PRCM_BASE + PRCM_O_RFCMODESEL) = PRCM_RFCMODESEL_CURR_MODE2; + rv = RF_CORE_CMD_OK; + } + } else if(ti_lib_chipinfo_chip_family_is_cc13xx()) { + if(ti_lib_chipinfo_supports_ble() == false && + ti_lib_chipinfo_supports_ieee_802_15_4() == false) { + /* CC1310 */ + HWREG(PRCM_BASE + PRCM_O_RFCMODESEL) = PRCM_RFCMODESEL_CURR_MODE3; + rv = RF_CORE_CMD_OK; + } + } + + return rv; +} +/*---------------------------------------------------------------------------*/ +uint8_t +rf_core_start_rat() +{ + uint32_t cmd_status; + + /* Start radio timer (RAT) */ + if(rf_core_send_cmd(CMDR_DIR_CMD(CMD_START_RAT), &cmd_status) + != RF_CORE_CMD_OK) { + PRINTF("rf_core_apply_patches: START_RAT fail, CMDSTA=0x%08lx\n", + cmd_status); + return RF_CORE_CMD_ERROR; + } + + return RF_CORE_CMD_OK; +} +/*---------------------------------------------------------------------------*/ +uint8_t +rf_core_boot() +{ + if(rf_core_power_up() != RF_CORE_CMD_OK) { + PRINTF("rf_core_boot: rf_core_power_up() failed\n"); + + rf_core_power_down(); + + return RF_CORE_CMD_ERROR; + } + + if(rf_core_start_rat() != RF_CORE_CMD_OK) { + PRINTF("rf_core_boot: rf_core_start_rat() failed\n"); + + rf_core_power_down(); + + return RF_CORE_CMD_ERROR; + } + + return RF_CORE_CMD_OK; +} +/*---------------------------------------------------------------------------*/ +void +rf_core_setup_interrupts() +{ + bool interrupts_disabled; + + /* We are already turned on by the caller, so this should not happen */ + if(!rf_core_is_accessible()) { + PRINTF("setup_interrupts: No access\n"); + return; + } + + /* Disable interrupts */ + interrupts_disabled = ti_lib_int_master_disable(); + + /* Set all interrupt channels to CPE0 channel, error to CPE1 */ + HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEISL) = ERROR_IRQ; + + /* Acknowledge configured interrupts */ + HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIEN) = ENABLED_IRQS; + + /* Clear interrupt flags, active low clear(?) */ + HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIFG) = 0x0; + + ti_lib_int_pend_clear(INT_RF_CPE0); + ti_lib_int_pend_clear(INT_RF_CPE1); + ti_lib_int_enable(INT_RF_CPE0); + ti_lib_int_enable(INT_RF_CPE1); + + if(!interrupts_disabled) { + ti_lib_int_master_enable(); + } +} +/*---------------------------------------------------------------------------*/ +void +rf_core_cmd_done_en() +{ + HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIFG) = ENABLED_IRQS; + HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIEN) = ENABLED_IRQS + + IRQ_LAST_COMMAND_DONE; +} +/*---------------------------------------------------------------------------*/ +void +rf_core_cmd_done_dis() +{ + HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIEN) = ENABLED_IRQS; +} +/*---------------------------------------------------------------------------*/ +rfc_radioOp_t * +rf_core_get_last_radio_op() +{ + return last_radio_op; +} +/*---------------------------------------------------------------------------*/ +void +rf_core_init_radio_op(rfc_radioOp_t *op, uint16_t len, uint16_t command) +{ + memset(op, 0, len); + + op->commandNo = command; + op->condition.rule = COND_NEVER; +} +/*---------------------------------------------------------------------------*/ +void +rf_core_primary_mode_register(const rf_core_primary_mode_t *mode) +{ + primary_mode = mode; +} +/*---------------------------------------------------------------------------*/ +void +rf_core_primary_mode_abort() +{ + if(primary_mode) { + if(primary_mode->abort) { + primary_mode->abort(); + } + } +} +/*---------------------------------------------------------------------------*/ +uint8_t +rf_core_primary_mode_restore() +{ + if(primary_mode) { + if(primary_mode->restore) { + return primary_mode->restore(); + } + } + + return RF_CORE_CMD_ERROR; +} +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(rf_core_process, ev, data) +{ + int len; + + PROCESS_BEGIN(); + + while(1) { + PROCESS_YIELD_UNTIL(ev == PROCESS_EVENT_POLL); + do { + watchdog_periodic(); + packetbuf_clear(); + len = NETSTACK_RADIO.read(packetbuf_dataptr(), PACKETBUF_SIZE); + + if(len > 0) { + packetbuf_set_datalen(len); + + NETSTACK_RDC.input(); + } + } while(len > 0); + } + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ +static void +rx_nok_isr(void) +{ + RIMESTATS_ADD(badcrc); + PRINTF("RF: Bad CRC\n"); +} +/*---------------------------------------------------------------------------*/ +void +cc26xx_rf_cpe1_isr(void) +{ + ENERGEST_ON(ENERGEST_TYPE_IRQ); + + PRINTF("RF Error\n"); + + if(!rf_core_is_accessible()) { + if(rf_core_power_up() != RF_CORE_CMD_OK) { + return; + } + } + + /* Clear interrupt flags */ + HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIFG) = 0x0; + + ENERGEST_OFF(ENERGEST_TYPE_IRQ); +} +/*---------------------------------------------------------------------------*/ +void +cc26xx_rf_cpe0_isr(void) +{ + ENERGEST_ON(ENERGEST_TYPE_IRQ); + + if(!rf_core_is_accessible()) { + printf("RF ISR called but RF not ready... PANIC!!\n"); + if(rf_core_power_up() != RF_CORE_CMD_OK) { + PRINTF("rf_core_power_up() failed\n"); + return; + } + } + + ti_lib_int_master_disable(); + + if(HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIFG) & RX_FRAME_IRQ) { + process_poll(&rf_core_process); + } + + if(RF_CORE_DEBUG_CRC) { + if(HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIFG) & RX_NOK_IRQ) { + rx_nok_isr(); + } + } + + /* Clear interrupt flags */ + HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIFG) = 0x0; + ti_lib_int_master_enable(); + + ENERGEST_OFF(ENERGEST_TYPE_IRQ); +} +/*---------------------------------------------------------------------------*/ +/** @} */ diff --git a/cpu/cc26xx-cc13xx/rf-core/rf-core.h b/cpu/cc26xx-cc13xx/rf-core/rf-core.h new file mode 100644 index 000000000..bc389257c --- /dev/null +++ b/cpu/cc26xx-cc13xx/rf-core/rf-core.h @@ -0,0 +1,418 @@ +/* + * Copyright (c) 2015, Texas Instruments Incorporated - http://www.ti.com/ + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup cc26xx + * @{ + * + * \defgroup rf-core CC13xx/CC26xx RF core + * + * Different flavours of chips of the CC13xx/CC26xx family have different + * radio capability. For example, the CC2650 can operate in IEEE 802.15.4 mode + * at 2.4GHz, but it can also operate in BLE mode. The CC1310 only supports + * sub-ghz mode. + * + * However, there are many radio functionalities that are identical across + * all chips. The rf-core driver provides support for this common functionality + * + * @{ + * + * \file + * Header file for the CC13xx/CC26xx RF core driver + */ +/*---------------------------------------------------------------------------*/ +#ifndef RF_CORE_H_ +#define RF_CORE_H_ +/*---------------------------------------------------------------------------*/ +#include "contiki-conf.h" +#include "rf-core/api/common_cmd.h" + +#include +#include +/*---------------------------------------------------------------------------*/ +/* The channel to use in IEEE or prop mode. */ +#ifdef RF_CORE_CONF_CHANNEL +#define RF_CORE_CHANNEL RF_CORE_CONF_CHANNEL +#else +#define RF_CORE_CHANNEL 25 +#endif /* RF_CORE_CONF_IEEE_MODE_CHANNEL */ +/*---------------------------------------------------------------------------*/ +#define RF_CORE_CMD_ERROR 0 +#define RF_CORE_CMD_OK 1 +/*---------------------------------------------------------------------------*/ +/** + * \brief A data strcuture representing the radio's primary mode of operation + * + * The CC13xx / CC26xx radio supports up to potentially 3 modes: IEEE, Prop and + * BLE. Within Contiki, we assume that the radio is by default in one of IEEE + * or Prop in order to support standard 6LoWPAN / .15.4 operation. The BLE + * mode interrupts this so called "primary" mode in order to send BLE adv + * messages. Once BLE is done advertising, we need to be able to restore the + * previous .15.4 mode. Unfortunately, the only way this can be done with + * NETSTACK_RADIO API is by fully power-cycling the radio, which is something + * we do not want to do. + * + * Thus, we declare a secondary data structure for primary mode drivers (IEEE + * or Prop). We use this data structure to issue "soft off" and "back on" + * commands. Soft off in this context means stopping RX (e.g. the respective + * IEEE RX operation), but without shutting down the RF core (which is what + * NETSTACK_RADIO.off() would have done). We then remember what mode we were + * using in order to be able to re-enter RX mode for this mode. + * + * A NETSTACK_RADIO driver will declare those two functions somewhere within + * its module of implementation. During its init() routine, it will notify + * the RF core module so that the latter can abort and restore operations. + */ +typedef struct rf_core_primary_mode_s { + /** + * \brief A pointer to a function used to abort the current radio op + */ + void (*abort)(void); + + /** + * \brief A pointer to a function that will restore the previous radio op + * \return RF_CORE_CMD_OK or RF_CORE_CMD_ERROR + */ + uint8_t (*restore)(void); +} rf_core_primary_mode_t; +/*---------------------------------------------------------------------------*/ +/* RF Command status constants - Correspond to values in the CMDSTA register */ +#define RF_CORE_CMDSTA_PENDING 0x00 +#define RF_CORE_CMDSTA_DONE 0x01 +#define RF_CORE_CMDSTA_ILLEGAL_PTR 0x81 +#define RF_CORE_CMDSTA_UNKNOWN_CMD 0x82 +#define RF_CORE_CMDSTA_UNKNOWN_DIR_CMD 0x83 +#define RF_CORE_CMDSTA_CONTEXT_ERR 0x85 +#define RF_CORE_CMDSTA_SCHEDULING_ERR 0x86 +#define RF_CORE_CMDSTA_PAR_ERR 0x87 +#define RF_CORE_CMDSTA_QUEUE_ERR 0x88 +#define RF_CORE_CMDSTA_QUEUE_BUSY 0x89 + +/* Status values starting with 0x8 correspond to errors */ +#define RF_CORE_CMDSTA_ERR_MASK 0x80 + +/* CMDSTA is 32-bits. Return value in bits 7:0 */ +#define RF_CORE_CMDSTA_RESULT_MASK 0xFF + +#define RF_CORE_RADIO_OP_STATUS_IDLE 0x0000 +/*---------------------------------------------------------------------------*/ +#define RF_CORE_NOT_ACCESSIBLE 0x00 +#define RF_CORE_ACCESSIBLE 0x01 +/*---------------------------------------------------------------------------*/ +/* RF Radio Op status constants. Field 'status' in Radio Op command struct */ +#define RF_CORE_RADIO_OP_STATUS_IDLE 0x0000 +#define RF_CORE_RADIO_OP_STATUS_PENDING 0x0001 +#define RF_CORE_RADIO_OP_STATUS_ACTIVE 0x0002 +#define RF_CORE_RADIO_OP_STATUS_SKIPPED 0x0003 +#define RF_CORE_RADIO_OP_STATUS_DONE_OK 0x0400 +#define RF_CORE_RADIO_OP_STATUS_DONE_COUNTDOWN 0x0401 +#define RF_CORE_RADIO_OP_STATUS_DONE_RXERR 0x0402 +#define RF_CORE_RADIO_OP_STATUS_DONE_TIMEOUT 0x0403 +#define RF_CORE_RADIO_OP_STATUS_DONE_STOPPED 0x0404 +#define RF_CORE_RADIO_OP_STATUS_DONE_ABORT 0x0405 +#define RF_CORE_RADIO_OP_STATUS_ERROR_PAST_START 0x0800 +#define RF_CORE_RADIO_OP_STATUS_ERROR_START_TRIG 0x0801 +#define RF_CORE_RADIO_OP_STATUS_ERROR_CONDITION 0x0802 +#define RF_CORE_RADIO_OP_STATUS_ERROR_PAR 0x0803 +#define RF_CORE_RADIO_OP_STATUS_ERROR_POINTER 0x0804 +#define RF_CORE_RADIO_OP_STATUS_ERROR_CMDID 0x0805 +#define RF_CORE_RADIO_OP_STATUS_ERROR_NO_SETUP 0x0807 +#define RF_CORE_RADIO_OP_STATUS_ERROR_NO_FS 0x0808 +#define RF_CORE_RADIO_OP_STATUS_ERROR_SYNTH_PROG 0x0809 + +/* Additional Op status values for IEEE mode */ +#define RF_CORE_RADIO_OP_STATUS_IEEE_SUSPENDED 0x2001 +#define RF_CORE_RADIO_OP_STATUS_IEEE_DONE_OK 0x2400 +#define RF_CORE_RADIO_OP_STATUS_IEEE_DONE_BUSY 0x2401 +#define RF_CORE_RADIO_OP_STATUS_IEEE_DONE_STOPPED 0x2402 +#define RF_CORE_RADIO_OP_STATUS_IEEE_DONE_ACK 0x2403 +#define RF_CORE_RADIO_OP_STATUS_IEEE_DONE_ACKPEND 0x2404 +#define RF_CORE_RADIO_OP_STATUS_IEEE_DONE_TIMEOUT 0x2405 +#define RF_CORE_RADIO_OP_STATUS_IEEE_DONE_BGEND 0x2406 +#define RF_CORE_RADIO_OP_STATUS_IEEE_DONE_ABORT 0x2407 +#define RF_CORE_RADIO_OP_STATUS_ERROR_WRONG_BG 0x0806 +#define RF_CORE_RADIO_OP_STATUS_IEEE_ERROR_PAR 0x2800 +#define RF_CORE_RADIO_OP_STATUS_IEEE_ERROR_NO_SETUP 0x2801 +#define RF_CORE_RADIO_OP_STATUS_IEEE_ERROR_NO_FS 0x2802 +#define RF_CORE_RADIO_OP_STATUS_IEEE_ERROR_SYNTH_PROG 0x2803 +#define RF_CORE_RADIO_OP_STATUS_IEEE_ERROR_RXOVF 0x2804 +#define RF_CORE_RADIO_OP_STATUS_IEEE_ERROR_TXUNF 0x2805 + +/* Op status values for BLE mode */ +#define RF_CORE_RADIO_OP_STATUS_BLE_DONE_OK 0x1400 +#define RF_CORE_RADIO_OP_STATUS_BLE_DONE_RXTIMEOUT 0x1401 +#define RF_CORE_RADIO_OP_STATUS_BLE_DONE_NOSYNC 0x1402 +#define RF_CORE_RADIO_OP_STATUS_BLE_DONE_RXERR 0x1403 +#define RF_CORE_RADIO_OP_STATUS_BLE_DONE_CONNECT 0x1404 +#define RF_CORE_RADIO_OP_STATUS_BLE_DONE_MAXNACK 0x1405 +#define RF_CORE_RADIO_OP_STATUS_BLE_DONE_ENDED 0x1406 +#define RF_CORE_RADIO_OP_STATUS_BLE_DONE_ABORT 0x1407 +#define RF_CORE_RADIO_OP_STATUS_BLE_DONE_STOPPED 0x1408 +#define RF_CORE_RADIO_OP_STATUS_BLE_ERROR_PAR 0x1800 +#define RF_CORE_RADIO_OP_STATUS_BLE_ERROR_RXBUF 0x1801 +#define RF_CORE_RADIO_OP_STATUS_BLE_ERROR_NO_SETUP 0x1802 +#define RF_CORE_RADIO_OP_STATUS_BLE_ERROR_NO_FS 0x1803 +#define RF_CORE_RADIO_OP_STATUS_BLE_ERROR_SYNTH_PROG 0x1804 +#define RF_CORE_RADIO_OP_STATUS_BLE_ERROR_RXOVF 0x1805 +#define RF_CORE_RADIO_OP_STATUS_BLE_ERROR_TXUNF 0x1806 + +/* Op status values for proprietary mode */ +#define RF_CORE_RADIO_OP_STATUS_PROP_DONE_OK 0x3400 +#define RF_CORE_RADIO_OP_STATUS_PROP_DONE_RXTIMEOUT 0x3401 +#define RF_CORE_RADIO_OP_STATUS_PROP_DONE_BREAK 0x3402 +#define RF_CORE_RADIO_OP_STATUS_PROP_DONE_ENDED 0x3403 +#define RF_CORE_RADIO_OP_STATUS_PROP_DONE_STOPPED 0x3404 +#define RF_CORE_RADIO_OP_STATUS_PROP_DONE_ABORT 0x3405 +#define RF_CORE_RADIO_OP_STATUS_PROP_DONE_RXERR 0x3406 +#define RF_CORE_RADIO_OP_STATUS_PROP_DONE_IDLE 0x3407 +#define RF_CORE_RADIO_OP_STATUS_PROP_DONE_BUSY 0x3408 +#define RF_CORE_RADIO_OP_STATUS_PROP_DONE_IDLETIMEOUT 0x3409 +#define RF_CORE_RADIO_OP_STATUS_PROP_DONE_BUSYTIMEOUT 0x340A +#define RF_CORE_RADIO_OP_STATUS_PROP_ERROR_PAR 0x3800 +#define RF_CORE_RADIO_OP_STATUS_PROP_ERROR_RXBUF 0x3801 +#define RF_CORE_RADIO_OP_STATUS_PROP_ERROR_RXFULL 0x3802 +#define RF_CORE_RADIO_OP_STATUS_PROP_ERROR_NO_SETUP 0x3803 +#define RF_CORE_RADIO_OP_STATUS_PROP_ERROR_NO_FS 0x3804 +#define RF_CORE_RADIO_OP_STATUS_PROP_ERROR_RXOVF 0x3805 +#define RF_CORE_RADIO_OP_STATUS_PROP_ERROR_TXUNF 0x3806 + +/* Bits 15:12 signify the protocol */ +#define RF_CORE_RADIO_OP_STATUS_PROTO_MASK 0xF000 +#define RF_CORE_RADIO_OP_STATUS_PROTO_GENERIC 0x0000 +#define RF_CORE_RADIO_OP_STATUS_PROTO_BLE 0x1000 +#define RF_CORE_RADIO_OP_STATUS_PROTO_IEEE 0x2000 +#define RF_CORE_RADIO_OP_STATUS_PROTO_PROP 0x3000 + +/* Bits 11:10 signify Running / Done OK / Done with error */ +#define RF_CORE_RADIO_OP_MASKED_STATUS 0x0C00 +#define RF_CORE_RADIO_OP_MASKED_STATUS_RUNNING 0x0000 +#define RF_CORE_RADIO_OP_MASKED_STATUS_DONE 0x0400 +#define RF_CORE_RADIO_OP_MASKED_STATUS_ERROR 0x0800 +/*---------------------------------------------------------------------------*/ +/* Command Types */ +#define RF_CORE_COMMAND_TYPE_MASK 0x0C00 +#define RF_CORE_COMMAND_TYPE_IMMEDIATE 0x0000 +#define RF_CORE_COMMAND_TYPE_RADIO_OP 0x0800 +#define RF_CORE_COMMAND_TYPE_IEEE_BG_RADIO_OP 0x0800 +#define RF_CORE_COMMAND_TYPE_IEEE_FG_RADIO_OP 0x0C00 + +#define RF_CORE_COMMAND_PROTOCOL_MASK 0x3000 +#define RF_CORE_COMMAND_PROTOCOL_COMMON 0x0000 +#define RF_CORE_COMMAND_PROTOCOL_BLE 0x1000 +#define RF_CORE_COMMAND_PROTOCOL_IEEE 0x2000 +#define RF_CORE_COMMAND_PROTOCOL_PROP 0x3000 +/*---------------------------------------------------------------------------*/ +/* Make the main driver process visible to mode drivers */ +PROCESS_NAME(rf_core_process); +/*---------------------------------------------------------------------------*/ +/** + * \brief Check whether the RF core is accessible + * \retval RF_CORE_ACCESSIBLE The core is powered and ready for access + * \retval RF_CORE_NOT_ACCESSIBLE The core is not ready + * + * If this function returns RF_CORE_NOT_ACCESSIBLE, rf_core_power_up() must be + * called before any attempt to access the core. + */ +uint8_t rf_core_is_accessible(void); + +/** + * \brief Sends a command to the RF core. + * + * \param cmd The command value or a pointer to a command buffer + * \param status A pointer to a variable which will hold the status + * \return RF_CORE_CMD_OK or RF_CORE_CMD_ERROR + * + * This function supports all three types of command (Radio OP, immediate and + * direct) + * + * For immediate and Radio OPs, cmd is a pointer to the data structure + * containing the command and its parameters. This data structure must be + * 4-byte aligned. + * + * For direct commands, cmd contains the value of the command alongside its + * parameters. This value will be written to CMDSTA verbatim, so the command + * ID must be in the 16 high bits, and the 2 LS bits must be set to 01 by the + * caller. + * + * The caller is responsible of allocating and populating cmd for Radio OP and + * immediate commands + * + * The caller is responsible for allocating status + * + * For immediate commands and radio Ops, this function will set the command's + * status field to RF_CORE_RADIO_OP_STATUS_IDLE before sending it to the RF + */ +uint_fast8_t rf_core_send_cmd(uint32_t cmd, uint32_t *status); + +/** + * \brief Block and wait for a Radio op to complete + * \param cmd A pointer to any command's structure + * \retval RF_CORE_CMD_OK the command completed with status _DONE_OK + * \retval RF_CORE_CMD_ERROR Timeout exceeded or the command completed with + * status _DONE_xxx (e.g. RF_CORE_RADIO_OP_STATUS_DONE_TIMEOUT) + */ +uint_fast8_t rf_core_wait_cmd_done(void *cmd); + +/** + * \brief Turn on power to the RFC and boot it. + * \return RF_CORE_CMD_OK or RF_CORE_CMD_ERROR + */ +int rf_core_power_up(void); + +/** + * \brief Disable RFCORE clock domain in the MCU VD and turn off the RFCORE PD + */ +void rf_core_power_down(void); + +/** + * \brief Initialise RF APIs in the RF core + * \return RF_CORE_CMD_OK or RF_CORE_CMD_ERROR + * + * Depending on chip family and capability, this function will set the correct + * value to PRCM.RFCMODESEL + */ +uint8_t rf_core_set_modesel(void); + +/** + * \brief Start the CM0 RAT + * \return RF_CORE_CMD_OK or RF_CORE_CMD_ERROR + * + * This function must be called each time the CM0 boots. The boot sequence + * can be performed automatically by calling rf_core_boot() if patches are not + * required. If patches are required then the patches must be applied after + * power up and before calling this function. + */ +uint8_t rf_core_start_rat(void); + +/** + * \brief Boot the RF Core + * \return RF_CORE_CMD_OK or RF_CORE_CMD_ERROR + * + * This function will perform the CM0 boot sequence. It will first power it up + * and then start the RAT. If a patch is required, then the mode driver must + * not call this function and perform the sequence manually, applying patches + * after boot and before calling rf_core_start_rat(). + * + * The function will return RF_CORE_CMD_ERROR if any of those steps fails. If + * the boot sequence fails to complete, the RF Core will be powered down. + */ +uint8_t rf_core_boot(void); + +/** + * \brief Setup RF core interrupts + */ +void rf_core_setup_interrupts(void); + +/** + * \brief Enable the LAST_CMD_DONE interrupt. + * + * This is used within TX routines in order to be able to sleep the CM3 and + * wake up after TX has finished + * + * \sa rf_core_cmd_done_dis() + */ +void rf_core_cmd_done_en(void); + +/** + * \brief Disable the LAST_CMD_DONE interrupt. + * + * This is used within TX routines after TX has completed + * + * \sa rf_core_cmd_done_en() + */ +void rf_core_cmd_done_dis(void); + +/** + * \brief Returns a pointer to the most recent proto-dependent Radio Op + * \return The pointer + * + * The RF Core driver will remember the most recent proto-dependent Radio OP + * issued, so that other modules can inspect its type and state at a subsequent + * stage. The assumption is that those commands will be issued by a function + * that will then return. The following commands will be "remembered" + * + * - All BLE Radio Ops (0x18nn) + * - All Prop Radio Ops (0x38nn) + * - IEEE BG Radio Ops (0x28nn) + * + * The following commands are assumed to be executed synchronously and will + * thus not be remembered by the core and not returned by this function: + * + * - Direct commands + * - Proto-independent commands (including Radio Ops and Immediate ones) + * - IEEE FG Radio Ops (0x2Cxx) + * + * This assumes that all commands will be sent to the radio using + * rf_core_send_cmd() + */ +rfc_radioOp_t *rf_core_get_last_radio_op(void); + +/** + * \brief Prepare a buffer to host a Radio Op + * \param buf A pointer to the buffer that will host the Radio Op + * \param len The buffer's length + * \param command The command ID + * + * The caller is responsible to allocate the buffer + * + * This function will not check whether the buffer is large enough to hold the + * command. This is the caller's responsibility + * + * This function will wipe out the buffer's contents. + */ +void rf_core_init_radio_op(rfc_radioOp_t *buf, uint16_t len, uint16_t command); + +/** + * \brief Register a primary mode for radio operation + * \param mode A pointer to the struct representing the mode + * + * A normal NESTACK_RADIO driver will normally register itself by calling + * this function during its own init(). + * + * \sa rf_core_primary_mode_t + */ +void rf_core_primary_mode_register(const rf_core_primary_mode_t *mode); + +/** + * \brief Abort the currently running primary radio op + */ +void rf_core_primary_mode_abort(void); + +/** + * \brief Abort the currently running primary radio op + */ +uint8_t rf_core_primary_mode_restore(void); +/*---------------------------------------------------------------------------*/ +#endif /* RF_CORE_H_ */ +/*---------------------------------------------------------------------------*/ +/** + * @} + * @} + */ diff --git a/cpu/cc26xx-cc13xx/rf-core/smartrf-settings.c b/cpu/cc26xx-cc13xx/rf-core/smartrf-settings.c new file mode 100644 index 000000000..8eedf23cb --- /dev/null +++ b/cpu/cc26xx-cc13xx/rf-core/smartrf-settings.c @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2015, Texas Instruments Incorporated - http://www.ti.com/ + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#include "rf-core/api/mailbox.h" +#include "rf-core/api/common_cmd.h" +#include "rf-core/api/prop_cmd.h" +/*---------------------------------------------------------------------------*/ +/* Overrides for CMD_PROP_RADIO_DIV_SETUP */ +uint32_t overrides[] = +{ + /* override_synth.xml */ + HW32_ARRAY_OVERRIDE(0x6088, 1), + (uint32_t)0x0000001A, + ADI_HALFREG_OVERRIDE(0, 61, 0xF, 0xD), + HW32_ARRAY_OVERRIDE(0x4038, 1), + (uint32_t)0x0000003A, + HW_REG_OVERRIDE(0x4020, 0x7F00), + HW_REG_OVERRIDE(0x4064, 0x0040), + (uint32_t)0x684A3, + (uint32_t)0xC0040141, + (uint32_t)0x0533B107, + (uint32_t)0xA480583, + (uint32_t)0x7AB80603, + ADI_REG_OVERRIDE(1, 4, 0x1F), + ADI_HALFREG_OVERRIDE(1, 7, 0x4, 0x4), + HW_REG_OVERRIDE(0x6084, 0x35F1), + (uint32_t)0x00038883, + (uint32_t)0x00FB88A3, + /* TX power override */ + ADI_REG_OVERRIDE(0, 12, 0xF9), + + /* Overrides for CRC16 functionality */ + (uint32_t)0x943, + (uint32_t)0x963, + + (uint32_t)0xFFFFFFFF, +}; +/*---------------------------------------------------------------------------*/ +/* CMD_PROP_RADIO_DIV_SETUP */ +rfc_CMD_PROP_RADIO_DIV_SETUP_t smartrf_settings_cmd_prop_radio_div_setup = +{ + .commandNo = 0x3807, + .status = 0x0000, + .pNextOp = 0, + .startTime = 0x00000000, + .startTrigger.triggerType = 0x0, + .startTrigger.bEnaCmd = 0x0, + .startTrigger.triggerNo = 0x0, + .startTrigger.pastTrig = 0x0, + .condition.rule = 0x1, + .condition.nSkip = 0x0, + .modulation.modType = 0x1, + .modulation.deviation = 0x64, + .symbolRate.preScale = 0xf, + .symbolRate.rateWord = 0x8000, + .rxBw = 0x24, + .preamConf.nPreamBytes = 0x3, + .preamConf.preamMode = 0x0, + .formatConf.nSwBits = 0x18, + .formatConf.bBitReversal = 0x0, + .formatConf.bMsbFirst = 0x1, + .formatConf.fecMode = 0x0, + + /* 7: .4g mode with dynamic whitening and CRC choice */ + .formatConf.whitenMode = 0x7, + .config.frontEndMode = 0x0, /* Differential mode */ + .config.biasMode = 0x1, /* External bias*/ + .config.bNoFsPowerUp = 0x0, + .txPower = 0x00, /* Driver sets correct value */ + .pRegOverride = overrides, + .intFreq = 0x8000, + .centerFreq = 868, + .loDivider = 0x05, +}; +/*---------------------------------------------------------------------------*/ +/* CMD_FS */ +rfc_CMD_FS_t smartrf_settings_cmd_fs = +{ + .commandNo = 0x0803, + .status = 0x0000, + .pNextOp = 0, + .startTime = 0x00000000, + .startTrigger.triggerType = 0x0, + .startTrigger.bEnaCmd = 0x0, + .startTrigger.triggerNo = 0x0, + .startTrigger.pastTrig = 0x0, + .condition.rule = 0x1, + .condition.nSkip = 0x0, + .frequency = 868, + .fractFreq = 0x0000, + .synthConf.bTxMode = 0x0, + .synthConf.refFreq = 0x0, + .__dummy0 = 0x00, + .midPrecal = 0x00, + .ktPrecal = 0x00, + .tdcPrecal = 0x0000, +}; +/*---------------------------------------------------------------------------*/ +/* CMD_PROP_TX_ADV */ +rfc_CMD_PROP_TX_ADV_t smartrf_settings_cmd_prop_tx_adv = +{ + .commandNo = 0x3803, + .status = 0x0000, + .pNextOp = 0, + .startTime = 0x00000000, + .startTrigger.triggerType = 0x0, + .startTrigger.bEnaCmd = 0x0, + .startTrigger.triggerNo = 0x0, + .startTrigger.pastTrig = 0x0, + .condition.rule = 0x1, + .condition.nSkip = 0x0, + .pktConf.bFsOff = 0x0, + .pktConf.bUseCrc = 0x1, + .pktConf.bCrcIncSw = 0x0, /* .4g mode */ + .pktConf.bCrcIncHdr = 0x0, /* .4g mode */ + .numHdrBits = 0x10 /* 16: .4g mode */, + .pktLen = 0x0000, + .startConf.bExtTxTrig = 0x0, + .startConf.inputMode = 0x0, + .startConf.source = 0x0, + .preTrigger.triggerType = TRIG_REL_START, + .preTrigger.bEnaCmd = 0x0, + .preTrigger.triggerNo = 0x0, + .preTrigger.pastTrig = 0x1, + .preTime = 0x00000000, + .syncWord = 0x0055904e, + .pPkt = 0, +}; +/*---------------------------------------------------------------------------*/ +/* CMD_PROP_RX_ADV */ +rfc_CMD_PROP_RX_ADV_t smartrf_settings_cmd_prop_rx_adv = +{ + .commandNo = 0x3804, + .status = 0x0000, + .pNextOp = 0, + .startTime = 0x00000000, + .startTrigger.triggerType = 0x0, + .startTrigger.bEnaCmd = 0x0, + .startTrigger.triggerNo = 0x0, + .startTrigger.pastTrig = 0x0, + .condition.rule = 0x1, + .condition.nSkip = 0x0, + .pktConf.bFsOff = 0x0, + .pktConf.bRepeatOk = 0x1, + .pktConf.bRepeatNok = 0x1, + .pktConf.bUseCrc = 0x1, + .pktConf.bCrcIncSw = 0x0, /* .4g mode */ + .pktConf.bCrcIncHdr = 0x0, /* .4g mode */ + .pktConf.endType = 0x0, + .pktConf.filterOp = 0x1, + .rxConf.bAutoFlushIgnored = 0x1, + .rxConf.bAutoFlushCrcErr = 0x1, + .rxConf.bIncludeHdr = 0x0, + .rxConf.bIncludeCrc = 0x0, + .rxConf.bAppendRssi = 0x1, + .rxConf.bAppendTimestamp = 0x0, + .rxConf.bAppendStatus = 0x1, + .syncWord0 = 0x0055904e, + .syncWord1 = 0x00000000, + .maxPktLen = 0x0000, /* To be populated by the driver. */ + .hdrConf.numHdrBits = 0x10, /* 16: .4g mode */ + .hdrConf.lenPos = 0x0, /* .4g mode */ + .hdrConf.numLenBits = 0x0B, /* 11 = 0x0B .4g mode */ + .addrConf.addrType = 0x0, + .addrConf.addrSize = 0x0, + .addrConf.addrPos = 0x0, + .addrConf.numAddr = 0x0, + .lenOffset = -4, /* .4g mode */ + .endTrigger.triggerType = TRIG_NEVER, + .endTrigger.bEnaCmd = 0x0, + .endTrigger.triggerNo = 0x0, + .endTrigger.pastTrig = 0x0, + .endTime = 0x00000000, + .pAddr = 0, + .pQueue = 0, + .pOutput = 0, +}; +/*---------------------------------------------------------------------------*/ diff --git a/cpu/cc26xx/cc26xx-model.h b/cpu/cc26xx-cc13xx/rf-core/smartrf-settings.h similarity index 65% rename from cpu/cc26xx/cc26xx-model.h rename to cpu/cc26xx-cc13xx/rf-core/smartrf-settings.h index 44ee1cfe3..bd36ed6d0 100644 --- a/cpu/cc26xx/cc26xx-model.h +++ b/cpu/cc26xx-cc13xx/rf-core/smartrf-settings.h @@ -10,7 +10,6 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * * 3. Neither the name of the copyright holder nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. @@ -29,46 +28,17 @@ * OF THE POSSIBILITY OF SUCH DAMAGE. */ /*---------------------------------------------------------------------------*/ -/** - * \addtogroup cc26xx - * @{ - * - * \defgroup cc26xx-models CC26xx models - * - * The CC26xx comes out in various flavours. Most notable within the context - * of this Contiki port: The CC2630 with IEEE (but no BLE) support and the - * CC2650 with IEEE and BLE support. - * - * This port supports both models and will automatically turn off the BLE code - * if the CC2630 is selected. - * - * @{ - */ -/** - * \file - * Header file with definitions relating to various CC26xx variants - */ +#ifndef SMARTRF_SETTINGS_H_ +#define SMARTRF_SETTINGS_H_ /*---------------------------------------------------------------------------*/ -#ifndef CC26XX_MODEL_H_ -#define CC26XX_MODEL_H_ +#include "rf-core/api/mailbox.h" +#include "rf-core/api/common_cmd.h" +#include "rf-core/api/prop_cmd.h" /*---------------------------------------------------------------------------*/ -#include "contiki-conf.h" +extern rfc_CMD_PROP_RADIO_DIV_SETUP_t smartrf_settings_cmd_prop_radio_div_setup; +extern rfc_CMD_FS_t smartrf_settings_cmd_fs; +extern rfc_CMD_PROP_TX_ADV_t smartrf_settings_cmd_prop_tx_adv; +extern rfc_CMD_PROP_RX_ADV_t smartrf_settings_cmd_prop_rx_adv; /*---------------------------------------------------------------------------*/ -#ifdef CC26XX_MODEL_CONF_CPU_VARIANT -#define CC26XX_MODEL_CPU_VARIANT CC26XX_MODEL_CONF_CPU_VARIANT -#else -#define CC26XX_MODEL_CPU_VARIANT 2650 -#endif - -#if (CC26XX_MODEL_CPU_VARIANT != 2630) && (CC26XX_MODEL_CPU_VARIANT != 2650) -#error Incorrect CC26xx variant selected. -#error Check the value of CC26XX_MODEL_CONF_CPU_VARIANT -#error Supported values: 2630 and 2650 -#endif +#endif // SMARTRF_SETTINGS_H_ /*---------------------------------------------------------------------------*/ -#endif /* CC26XX_MODEL_H_ */ -/*---------------------------------------------------------------------------*/ -/** - * @} - * @} - */ diff --git a/cpu/cc26xx/rtimer-arch.c b/cpu/cc26xx-cc13xx/rtimer-arch.c similarity index 97% rename from cpu/cc26xx/rtimer-arch.c rename to cpu/cc26xx-cc13xx/rtimer-arch.c index 37077f1b3..6d0505f47 100644 --- a/cpu/cc26xx/rtimer-arch.c +++ b/cpu/cc26xx-cc13xx/rtimer-arch.c @@ -33,15 +33,14 @@ * @{ * * \file - * Implementation of the arch-specific rtimer functions for the cc26xx - * + * Implementation of the arch-specific rtimer functions for the CC13xx/CC26xx */ /*---------------------------------------------------------------------------*/ #include "contiki.h" #include "sys/energest.h" #include "sys/rtimer.h" #include "cpu.h" -#include "dev/cc26xx-rtc.h" +#include "dev/soc-rtc.h" #include "ti-lib.h" @@ -72,7 +71,7 @@ void rtimer_arch_schedule(rtimer_clock_t t) { /* Convert the rtimer tick value to a value suitable for the AON RTC */ - cc26xx_rtc_schedule_one_shot(t); + soc_rtc_schedule_one_shot(AON_RTC_CH0, t); } /*---------------------------------------------------------------------------*/ /** diff --git a/cpu/cc26xx/rtimer-arch.h b/cpu/cc26xx-cc13xx/rtimer-arch.h similarity index 85% rename from cpu/cc26xx/rtimer-arch.h rename to cpu/cc26xx-cc13xx/rtimer-arch.h index 1a4a50c09..0d54d227c 100644 --- a/cpu/cc26xx/rtimer-arch.h +++ b/cpu/cc26xx-cc13xx/rtimer-arch.h @@ -32,20 +32,14 @@ * \addtogroup cc26xx-clocks * @{ * - * \defgroup cc26xx-rtimer CC26xx rtimer + * \defgroup cc26xx-rtimer CC13xx/CC26xx rtimer * - * Implementation of the rtimer module for the CC26xx - * - * The rtimer runs on the AON RTC. We set the RTC's channel 2 to continuous - * compare mode, instead of scheduling the next tick interrupt by software. - * This gives us completely equidistant events. - * - * The RTC runs in all power modes (except shutdown) + * Implementation of the rtimer module for the CC13xx/CC26xx * @{ */ /** * \file - * Header file for the CC26xx rtimer driver + * Header file for the CC13xx/CC26xx rtimer driver */ /*---------------------------------------------------------------------------*/ #ifndef RTIMER_ARCH_H_ diff --git a/cpu/cc26xx/slip-arch.c b/cpu/cc26xx-cc13xx/slip-arch.c similarity index 97% rename from cpu/cc26xx/slip-arch.c rename to cpu/cc26xx-cc13xx/slip-arch.c index ebd6f91c8..c1be6849f 100644 --- a/cpu/cc26xx/slip-arch.c +++ b/cpu/cc26xx-cc13xx/slip-arch.c @@ -34,7 +34,7 @@ * @{ * * \file - * Arch-specific SLIP functions for the cc26xx + * Arch-specific SLIP functions for the CC13xx/CC26xx */ /*---------------------------------------------------------------------------*/ #include "contiki-conf.h" diff --git a/cpu/cc26xx/ti-lib.h b/cpu/cc26xx-cc13xx/ti-lib.h similarity index 94% rename from cpu/cc26xx/ti-lib.h rename to cpu/cc26xx-cc13xx/ti-lib.h index ff707cfae..cbf9a8e61 100644 --- a/cpu/cc26xx/ti-lib.h +++ b/cpu/cc26xx-cc13xx/ti-lib.h @@ -31,7 +31,7 @@ * \addtogroup cc26xx * @{ * - * \defgroup cc26xx-ti-lib TI CC26xxware Glue + * \defgroup cc26xx-ti-lib TI CC26xxware/CC13xxware Glue * * Glue file which renames TI CC26xxware functions. Thus, for example, * PowerCtrlIOFreezeDisable() becomes power_ctrl_io_freeze_disable() @@ -89,7 +89,8 @@ #define ti_lib_aon_rtc_enable(...) AONRTCEnable(__VA_ARGS__) #define ti_lib_aon_rtc_disable(...) AONRTCDisable(__VA_ARGS__) -#define ti_lib_aon_rtc_status(...) AONRTCStatus(__VA_ARGS__) +#define ti_lib_aon_rtc_active(...) AONRTCActive(__VA_ARGS__) +#define ti_lib_aon_rtc_channel_active(...) AONRTCChannelActive(__VA_ARGS__) #define ti_lib_aon_rtc_reset(...) AONRTCReset(__VA_ARGS__) #define ti_lib_aon_rtc_delay_config(...) AONRTCDelayConfig(__VA_ARGS__) #define ti_lib_aon_rtc_combined_event_config(...) AONRTCCombinedEventConfig(__VA_ARGS__) @@ -107,6 +108,7 @@ #define ti_lib_aon_rtc_compare_value_set(...) AONRTCCompareValueSet(__VA_ARGS__) #define ti_lib_aon_rtc_compare_value_get(...) AONRTCCompareValueGet(__VA_ARGS__) #define ti_lib_aon_rtc_current_compare_value_get(...) AONRTCCurrentCompareValueGet(__VA_ARGS__) +#define ti_lib_aon_rtc_current_64_bit_value_get(...) AONRTCCurrent64BitValueGet(__VA_ARGS__) #define ti_lib_aon_rtc_inc_value_ch2_set(...) AONRTCIncValueCh2Set(__VA_ARGS__) #define ti_lib_aon_rtc_inc_value_ch2_get(...) AONRTCIncValueCh2Get(__VA_ARGS__) #define ti_lib_aon_rtc_capture_value_ch1_get(...) AONRTCCaptureValueCh1Get(__VA_ARGS__) @@ -161,6 +163,29 @@ #define ti_lib_cpu_base_pri_set(...) CPUbasepriSet(__VA_ARGS__) #define ti_lib_cpu_delay(...) CPUdelay(__VA_ARGS__) /*---------------------------------------------------------------------------*/ +/* chipinfo.h */ +#include "driverlib/chipinfo.h" + +#define ti_lib_chipinfo_get_supported_protocol_bv(...) ChipInfo_GetSupportedProtocol_BV(__VA_ARGS__) +#define ti_lib_chipinfo_supports_ble(...) ChipInfo_SupportsBLE(__VA_ARGS__) +#define ti_lib_chipinfo_supports_ieee_802_15_4(...) ChipInfo_SupportsIEEE_802_15_4(__VA_ARGS__) +#define ti_lib_chipinfo_supports_proprietary(...) ChipInfo_SupportsPROPRIETARY(__VA_ARGS__) +#define ti_lib_chipinfo_get_package_type(...) ChipInfo_GetPackageType(__VA_ARGS__) +#define ti_lib_chipinfo_package_type_is_4x4(...) ChipInfo_PackageTypeIs4x4(__VA_ARGS__) +#define ti_lib_chipinfo_package_type_is_5x5(...) ChipInfo_PackageTypeIs5x5(__VA_ARGS__) +#define ti_lib_chipinfo_package_type_is_7x7(...) ChipInfo_PackageTypeIs7x7(__VA_ARGS__) +#define ti_lib_chipinfo_get_device_id_hw_rev_code(...) ChipInfo_GetDeviceIdHwRevCode(__VA_ARGS__) +#define ti_lib_chipinfo_get_chip_family(...) ChipInfo_GetChipFamily(__VA_ARGS__) +#define ti_lib_chipinfo_chip_family_is_cc26xx(...) ChipInfo_ChipFamilyIsCC26xx(__VA_ARGS__) +#define ti_lib_chipinfo_chip_family_is_cc13xx(...) ChipInfo_ChipFamilyIsCC13xx(__VA_ARGS__) +#define ti_lib_chipinfo_get_hw_revision(...) ChipInfo_GetHwRevision(__VA_ARGS__) +#define ti_lib_chipinfo_hw_revision_is_1_0(...) ChipInfo_HwRevisionIs_1_0(__VA_ARGS__) +#define ti_lib_chipinfo_hw_revision_is_gteq_2_0(...) ChipInfo_HwRevisionIs_GTEQ_2_0(__VA_ARGS__) +#define ti_lib_chipinfo_hw_revision_is_2_0(...) ChipInfo_HwRevisionIs_2_0(__VA_ARGS__) +#define ti_lib_chipinfo_hw_revision_is_2_1(...) ChipInfo_HwRevisionIs_2_1(__VA_ARGS__) +#define ti_lib_chipinfo_hw_revision_is_2_2(...) ChipInfo_HwRevisionIs_2_2(__VA_ARGS__) +#define ti_lib_chipinfo_hw_revision_is_gteq_2_2(...) ChipInfo_HwRevisionIs_GTEQ_2_2( __VA_ARGS__ ) +/*---------------------------------------------------------------------------*/ /* ddi.h */ #include "driverlib/ddi.h" @@ -309,7 +334,6 @@ #define ti_lib_prcm_peripheral_deep_sleep_disable(...) PRCMPeripheralDeepSleepDisable(__VA_ARGS__) #define ti_lib_prcm_power_domain_status(...) PRCMPowerDomainStatus(__VA_ARGS__) #define ti_lib_prcm_rf_ready(...) PRCMRfReady(__VA_ARGS__) -#define ti_lib_prcm_wdt_reset_status(...) PRCMWdtResetStatus(__VA_ARGS__) #define ti_lib_prcm_sleep(...) PRCMSleep(__VA_ARGS__) #define ti_lib_prcm_deep_sleep(...) PRCMDeepSleep(__VA_ARGS__) #define ti_lib_prcm_cache_retention_enable(...) PRCMCacheRetentionEnable(__VA_ARGS__) @@ -384,10 +408,6 @@ #define ti_lib_rom_flash_protection_set ROM_FlashProtectionSet #define ti_lib_rom_flash_protection_get ROM_FlashProtectionGet #define ti_lib_rom_flash_protection_save ROM_FlashProtectionSave -#define ti_lib_rom_flash_sector_erase ROM_FlashSectorErase -#define ti_lib_rom_flash_program ROM_FlashProgram -#define ti_lib_rom_flash_program_nowait ROM_FlashProgramNowait - #define ti_lib_rom_flash_efuse_read_row ROM_FlashEfuseReadRow #define ti_lib_rom_flash_disable_sectors_for_write ROM_FlashDisableSectorsForWrite @@ -507,8 +527,6 @@ #define ti_lib_hapi_max_value(a, b) HapiMaxValue(a,b) #define ti_lib_hapi_mean_value(a, b) HapiMeanValue(a,b) #define ti_lib_hapi_stand_deviation_value(a, b) HapiStandDeviationValue(a,b) -#define ti_lib_hapi_reset_peripheral(a) HapiResetPeripheral(a) -#define ti_lib_hapi_reset_domain(a) HapiResetDomain(a) #define ti_lib_hapi_hf_source_safe_switch() HapiHFSourceSafeSwitch() #define ti_lib_hapi_select_comp_a_input(a) HapiSelectCompAInput(a) #define ti_lib_hapi_select_comp_a_ref(a) HapiSelectCompARef(a) @@ -517,9 +535,6 @@ #define ti_lib_hapi_get_flash_size() HapiGetFlashSize() #define ti_lib_hapi_sector_erase(a) HapiSectorErase(a) #define ti_lib_hapi_program_flash(a, b, c) HapiProgramFlash(a, b, c) -#define ti_lib_hapi_get_flash_size() HapiGetFlashSize() -#define ti_lib_hapi_sector_erase(a) HapiSectorErase(a) -#define ti_lib_hapi_program_flash(a, b, c) HapiProgramFlash(a, b, c) /*---------------------------------------------------------------------------*/ /* sys_ctrl.h */ #include "driverlib/sys_ctrl.h" @@ -578,7 +593,6 @@ #define ti_lib_timer_disable(...) TimerDisable(__VA_ARGS__) #define ti_lib_timer_configure(...) TimerConfigure(__VA_ARGS__) #define ti_lib_timer_level_control(...) TimerLevelControl(__VA_ARGS__) -#define ti_lib_timer_trigger_control(...) TimerTriggerControl(__VA_ARGS__) #define ti_lib_timer_event_control(...) TimerEventControl(__VA_ARGS__) #define ti_lib_timer_stall_control(...) TimerStallControl(__VA_ARGS__) #define ti_lib_timer_wait_on_trigger_control(...) TimerWaitOnTriggerControl(__VA_ARGS__) diff --git a/cpu/cc26xx/dev/cc26xx-rf.c b/cpu/cc26xx/dev/cc26xx-rf.c deleted file mode 100644 index 8514b7e79..000000000 --- a/cpu/cc26xx/dev/cc26xx-rf.c +++ /dev/null @@ -1,2192 +0,0 @@ -/* - * Copyright (c) 2014, Texas Instruments Incorporated - http://www.ti.com/ - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/*---------------------------------------------------------------------------*/ -/** - * \addtogroup cc26xx-rf - * @{ - * - * \file - * Implementation of the CC26xx RF driver - */ -/*---------------------------------------------------------------------------*/ -#include "contiki.h" -#include "dev/radio.h" -#include "dev/cc26xx-rf.h" -#include "dev/oscillators.h" -#include "net/packetbuf.h" -#include "net/rime/rimestats.h" -#include "net/linkaddr.h" -#include "net/netstack.h" -#include "sys/energest.h" -#include "sys/clock.h" -#include "sys/rtimer.h" -#include "sys/cc.h" -#include "lpm.h" -#include "ti-lib.h" -/*---------------------------------------------------------------------------*/ -/* RF core and RF HAL API */ -#include "hw_rfc_dbell.h" -#include "hw_rfc_pwr.h" -/*---------------------------------------------------------------------------*/ -/* RF Core Mailbox API */ -#include "mailbox.h" -#include "common_cmd.h" -#include "common_cmd_field.h" -#include "ble_cmd.h" -#include "ble_cmd_field.h" -#include "ieee_cmd.h" -#include "ieee_cmd_field.h" -#include "data_entry.h" -#include "ble_mailbox.h" -#include "ieee_mailbox.h" -/*---------------------------------------------------------------------------*/ -#include -#include -#include -#include -/*---------------------------------------------------------------------------*/ -#define BUSYWAIT_UNTIL(cond, max_time) \ - do { \ - rtimer_clock_t t0; \ - t0 = RTIMER_NOW(); \ - while(!(cond) && RTIMER_CLOCK_LT(RTIMER_NOW(), t0 + (max_time))); \ - } while(0) -/*---------------------------------------------------------------------------*/ -#ifdef __GNUC__ -#define CC_ALIGN_ATTR(n) __attribute__ ((aligned(n))) -#else -#define CC_ALIGN_ATTR(n) -#endif -/*---------------------------------------------------------------------------*/ -#define DEBUG 0 -#if DEBUG -#define PRINTF(...) printf(__VA_ARGS__) -#else -#define PRINTF(...) -#endif -/*---------------------------------------------------------------------------*/ -#ifdef CC26XX_CONF_DEBUG_CRC -#define CC26XX_DEBUG_CRC CC26XX_CONF_DEBUG_CRC -#else /* CC26XX_CONF_DEBUG_CRC */ -#define CC26XX_DEBUG_CRC DEBUG -#endif /* CC26XX_CONF_DEBUG_CRC */ -/*---------------------------------------------------------------------------*/ -/* Data entry status field constants */ -#define DATA_ENTRY_STATUS_PENDING 0x00 /* Not in use by the Radio CPU */ -#define DATA_ENTRY_STATUS_ACTIVE 0x01 /* Open for r/w by the radio CPU */ -#define DATA_ENTRY_STATUS_BUSY 0x02 /* Ongoing r/w */ -#define DATA_ENTRY_STATUS_FINISHED 0x03 /* Free to use and to free */ -#define DATA_ENTRY_STATUS_UNFINISHED 0x04 /* Partial RX entry */ -/*---------------------------------------------------------------------------*/ -/* RF stats data structure */ -static uint8_t rf_stats[16] = { 0 }; -/*---------------------------------------------------------------------------*/ -/* RF Command status constants - Correspond to values in the CMDSTA register */ -#define RF_CMD_STATUS_PENDING 0x00 -#define RF_CMD_STATUS_DONE 0x01 -#define RF_CMD_STATUS_ILLEGAL_PTR 0x81 -#define RF_CMD_STATUS_UNKNOWN_CMD 0x82 -#define RF_CMD_STATUS_UNKNOWN_DIR_CMD 0x83 -#define RF_CMD_STATUS_CONTEXT_ERR 0x85 -#define RF_CMD_STATUS_SCHEDULING_ERR 0x86 -#define RF_CMD_STATUS_PAR_ERR 0x87 -#define RF_CMD_STATUS_QUEUE_ERR 0x88 -#define RF_CMD_STATUS_QUEUE_BUSY 0x89 - -/* Status values starting with 0x8 correspond to errors */ -#define RF_CMD_STATUS_ERR_MASK 0x80 - -/* Return values for rf_send_cmd_ok */ -#define RF_CMD_ERROR 0 -#define RF_CMD_OK 1 - -/* The size of the RF commands buffer */ -#define RF_CMD_BUFFER_SIZE 128 -/*---------------------------------------------------------------------------*/ -/* RF Radio Op status constants. Field 'status' in Radio Op command struct */ -#define RF_RADIO_OP_STATUS_IDLE 0x0000 -#define RF_RADIO_OP_STATUS_PENDING 0x0001 -#define RF_RADIO_OP_STATUS_ACTIVE 0x0002 -#define RF_RADIO_OP_STATUS_SKIPPED 0x0003 -#define RF_RADIO_OP_STATUS_DONE_OK 0x0400 -#define RF_RADIO_OP_STATUS_DONE_COUNTDOWN 0x0401 -#define RF_RADIO_OP_STATUS_DONE_RXERR 0x0402 -#define RF_RADIO_OP_STATUS_DONE_TIMEOUT 0x0403 -#define RF_RADIO_OP_STATUS_DONE_STOPPED 0x0404 -#define RF_RADIO_OP_STATUS_DONE_ABORT 0x0405 -#define RF_RADIO_OP_STATUS_ERROR_PAST_START 0x0800 -#define RF_RADIO_OP_STATUS_ERROR_START_TRIG 0x0801 -#define RF_RADIO_OP_STATUS_ERROR_CONDITION 0x0802 -#define RF_RADIO_OP_STATUS_ERROR_PAR 0x0803 -#define RF_RADIO_OP_STATUS_ERROR_POINTER 0x0804 -#define RF_RADIO_OP_STATUS_ERROR_CMDID 0x0805 -#define RF_RADIO_OP_STATUS_ERROR_NO_SETUP 0x0807 -#define RF_RADIO_OP_STATUS_ERROR_NO_FS 0x0808 -#define RF_RADIO_OP_STATUS_ERROR_SYNTH_PROG 0x0809 - -/* Additional Op status values for IEEE mode */ -#define RF_RADIO_OP_STATUS_IEEE_SUSPENDED 0x2001 -#define RF_RADIO_OP_STATUS_IEEE_DONE_OK 0x2400 -#define RF_RADIO_OP_STATUS_IEEE_DONE_BUSY 0x2401 -#define RF_RADIO_OP_STATUS_IEEE_DONE_STOPPED 0x2402 -#define RF_RADIO_OP_STATUS_IEEE_DONE_ACK 0x2403 -#define RF_RADIO_OP_STATUS_IEEE_DONE_ACKPEND 0x2404 -#define RF_RADIO_OP_STATUS_IEEE_DONE_TIMEOUT 0x2405 -#define RF_RADIO_OP_STATUS_IEEE_DONE_BGEND 0x2406 -#define RF_RADIO_OP_STATUS_IEEE_DONE_ABORT 0x2407 -#define RF_RADIO_OP_STATUS_ERROR_WRONG_BG 0x0806 -#define RF_RADIO_OP_STATUS_IEEE_ERROR_PAR 0x2800 -#define RF_RADIO_OP_STATUS_IEEE_ERROR_NO_SETUP 0x2801 -#define RF_RADIO_OP_STATUS_IEEE_ERROR_NO_FS 0x2802 -#define RF_RADIO_OP_STATUS_IEEE_ERROR_SYNTH_PROG 0x2803 -#define RF_RADIO_OP_STATUS_IEEE_ERROR_RXOVF 0x2804 -#define RF_RADIO_OP_STATUS_IEEE_ERROR_TXUNF 0x2805 - -/* Op status values for BLE mode */ -#define RF_RADIO_OP_STATUS_BLE_DONE_OK 0x1400 -#define RF_RADIO_OP_STATUS_BLE_DONE_RXTIMEOUT 0x1401 -#define RF_RADIO_OP_STATUS_BLE_DONE_NOSYNC 0x1402 -#define RF_RADIO_OP_STATUS_BLE_DONE_RXERR 0x1403 -#define RF_RADIO_OP_STATUS_BLE_DONE_CONNECT 0x1404 -#define RF_RADIO_OP_STATUS_BLE_DONE_MAXNACK 0x1405 -#define RF_RADIO_OP_STATUS_BLE_DONE_ENDED 0x1406 -#define RF_RADIO_OP_STATUS_BLE_DONE_ABORT 0x1407 -#define RF_RADIO_OP_STATUS_BLE_DONE_STOPPED 0x1408 -#define RF_RADIO_OP_STATUS_BLE_ERROR_PAR 0x1800 -#define RF_RADIO_OP_STATUS_BLE_ERROR_RXBUF 0x1801 -#define RF_RADIO_OP_STATUS_BLE_ERROR_NO_SETUP 0x1802 -#define RF_RADIO_OP_STATUS_BLE_ERROR_NO_FS 0x1803 -#define RF_RADIO_OP_STATUS_BLE_ERROR_SYNTH_PROG 0x1804 -#define RF_RADIO_OP_STATUS_BLE_ERROR_RXOVF 0x1805 -#define RF_RADIO_OP_STATUS_BLE_ERROR_TXUNF 0x1806 - -/* Bits 15:12 signify the protocol */ -#define RF_RADIO_OP_STATUS_PROTO_MASK 0xF000 -#define RF_RADIO_OP_STATUS_PROTO_GENERIC 0x0000 -#define RF_RADIO_OP_STATUS_PROTO_BLE 0x1000 -#define RF_RADIO_OP_STATUS_PROTO_IEEE 0x2000 -#define RF_RADIO_OP_STATUS_PROTO_PROP 0x3000 - -/* Bits 11:10 signify Running / Done OK / Done with error */ -#define RF_RADIO_OP_MASKED_STATUS 0x0C00 -#define RF_RADIO_OP_MASKED_STATUS_RUNNING 0x0000 -#define RF_RADIO_OP_MASKED_STATUS_DONE 0x0400 -#define RF_RADIO_OP_MASKED_STATUS_ERROR 0x0800 -/*---------------------------------------------------------------------------*/ -/** - * \brief Returns the current status of a running Radio Op command - * \param a A pointer with the buffer used to initiate the command - * \return The value of the Radio Op buffer's status field - * - * This macro can be used to e.g. return the status of a previously - * initiated background operation, or of an immediate command - */ -#define RF_RADIO_OP_GET_STATUS(a) GET_FIELD_V(a, radioOp, status) -/*---------------------------------------------------------------------------*/ -/* Special value returned by CMD_IEEE_CCA_REQ when an RSSI is not available */ -#define RF_CMD_CCA_REQ_RSSI_UNKNOWN -128 - -/* Used for the return value of channel_clear */ -#define RF_CCA_CLEAR 1 -#define RF_CCA_BUSY 0 - -/* Used as an error return value for get_cca_info */ -#define RF_GET_CCA_INFO_ERROR 0xFF - -/* - * Values of the individual bits of the ccaInfo field in CMD_IEEE_CCA_REQ's - * status struct - */ -#define RF_CMD_CCA_REQ_CCA_STATE_IDLE 0 /* 00 */ -#define RF_CMD_CCA_REQ_CCA_STATE_BUSY 1 /* 01 */ -#define RF_CMD_CCA_REQ_CCA_STATE_INVALID 2 /* 10 */ -/*---------------------------------------------------------------------------*/ -#define RF_MODE_BLE 0 -#define RF_MODE_IEEE 1 -/*---------------------------------------------------------------------------*/ -/* How long to wait for an ongoing ACK TX to finish before starting frame TX */ -#define TX_WAIT_TIMEOUT (RTIMER_SECOND >> 11) - -/* How long to wait for the RF to enter RX in rf_cmd_ieee_rx */ -#define ENTER_RX_WAIT_TIMEOUT (RTIMER_SECOND >> 10) -/*---------------------------------------------------------------------------*/ -/* TX Power dBm lookup table - values from SmartRF Studio */ -typedef struct output_config { - radio_value_t dbm; - uint8_t register_ib; - uint8_t register_gc; -} output_config_t; - -static const output_config_t output_power[] = { - { 5, 0x29, 0x00 }, - { 4, 0x20, 0x00 }, - { 3, 0x19, 0x00 }, - { 2, 0x25, 0x01 }, - { 1, 0x21, 0x01 }, - { 0, 0x1D, 0x01 }, - { -3, 0x19, 0x03 }, - { -6, 0x13, 0x03 }, - { -9, 0x0F, 0x03 }, -}; - -#define OUTPUT_CONFIG_COUNT (sizeof(output_power) / sizeof(output_config_t)) - -/* Max and Min Output Power in dBm */ -#define OUTPUT_POWER_MIN (output_power[OUTPUT_CONFIG_COUNT - 1].dbm) -#define OUTPUT_POWER_MAX (output_power[0].dbm) -#define OUTPUT_POWER_UNKNOWN 0xFFFF - -/* Default TX Power - position in output_power[] */ -#define CC26XX_RF_TX_POWER 0 -const output_config_t *tx_power_current = &output_power[0]; -/*---------------------------------------------------------------------------*/ -#define RF_CORE_CLOCKS_MASK (RFC_PWR_PWMCLKEN_RFC_M | RFC_PWR_PWMCLKEN_CPE_M \ - | RFC_PWR_PWMCLKEN_CPERAM_M) -/*---------------------------------------------------------------------------*/ -/* RF interrupts */ -#define RX_IRQ IRQ_IEEE_RX_ENTRY_DONE -#define RX_NOK_IRQ IRQ_IEEE_RX_NOK -#define TX_ACK_IRQ IRQ_IEEE_TX_ACK -#define ERROR_IRQ IRQ_INTERNAL_ERROR - -/* Those IRQs are enabled all the time */ -#if CC26XX_DEBUG_CRC -#define ENABLED_IRQS (RX_IRQ | ERROR_IRQ | RX_NOK_IRQ) -#else -#define ENABLED_IRQS (RX_IRQ | ERROR_IRQ) -#endif - -/* - * We only enable this right before starting frame TX, so we can sleep while - * the TX is ongoing - */ -#define LAST_FG_CMD_DONE IRQ_LAST_FG_COMMAND_DONE - -#define cc26xx_rf_cpe0_isr RFCCPE0IntHandler -#define cc26xx_rf_cpe1_isr RFCCPE1IntHandler -/*---------------------------------------------------------------------------*/ -/* - * Buffers used to send commands to the RF core (generic and IEEE commands). - * Some of those buffers are re-usable, some are not. - * - * If you are uncertain, declare a new buffer. - */ -/* - * A buffer to send a CMD_IEEE_RX and to subsequently monitor its status - * Do not use this buffer for any commands other than CMD_IEEE_RX - */ -static uint8_t cmd_ieee_rx_buf[RF_CMD_BUFFER_SIZE] CC_ALIGN_ATTR(4); - -/* - * A buffer used to send immediate and foreground Radio Op (e.g. CMD_IEEE_TX) - * commands. - * - * Do not re-use this buffer to send a command before the previous command - * has been completed. - * - * Do not intermingle preparation of this buffer to send a command with calls - * that might lead to a different command, since the latter will overwrite what - * you have written in preparation for the former. - */ -static uint8_t cmd_immediate_buf[RF_CMD_BUFFER_SIZE] CC_ALIGN_ATTR(4); -/*---------------------------------------------------------------------------*/ -/* BLE macros, variables and buffers */ - -/* BLE Intervals: Send a burst of advertisements every BLE_ADV_INTERVAL secs */ -#define BLE_ADV_INTERVAL (CLOCK_SECOND * 5) -#define BLE_ADV_DUTY_CYCLE (CLOCK_SECOND / 10) -#define BLE_ADV_MESSAGES 10 - -/* BLE Advertisement-related macros */ -#define BLE_ADV_TYPE_DEVINFO 0x01 -#define BLE_ADV_TYPE_NAME 0x09 -#define BLE_ADV_TYPE_MANUFACTURER 0xFF -#define BLE_ADV_NAME_BUF_LEN 32 -#define BLE_ADV_PAYLOAD_BUF_LEN 64 -#define BLE_UUID_SIZE 16 - -#if CC26XX_RF_BLE_SUPPORT -/* BLE buffers / variables */ -static unsigned char ble_cmd_buf[32] CC_ALIGN_ATTR(4) = { 0 }; -static unsigned char ble_tx_rx_buf[128] CC_ALIGN_ATTR(4); -static uint8_t ble_mode_on; - -/* BLE beacond config */ -static struct ble_beacond_config { - clock_time_t interval; - char adv_name[BLE_ADV_NAME_BUF_LEN]; -} beacond_config; - -/* BLE overrides */ -static uint32_t ble_overrides[] = { - 0x00364038, /* Synth: Set RTRIM (POTAILRESTRIM) to 6 */ - 0x000784A3, /* Synth: Set FREF = 3.43 MHz (24 MHz / 7) */ - 0xA47E0583, /* Synth: Set loop bandwidth after lock to 80 kHz (K2) */ - 0xEAE00603, /* Synth: Set loop bandwidth after lock to 80 kHz (K3, LSB) */ - 0x00010623, /* Synth: Set loop bandwidth after lock to 80 kHz (K3, MSB) */ - 0x00456088, /* Adjust AGC reference level */ - 0xFFFFFFFF, /* End of override list */ -}; - -PROCESS(cc26xx_rf_ble_beacon_process, "CC26xx RF BLE Beacon Process"); - -static void init_ble(void); -#else -#define init_ble(...) -#endif /* CC26XX_RF_BLE_SUPPORT */ -/*---------------------------------------------------------------------------*/ -#define RX_BUF_SIZE 140 -/* Four receive buffers entries with room for 1 IEEE802.15.4 frame in each */ -static uint8_t rx_buf_0[RX_BUF_SIZE] CC_ALIGN_ATTR(4); -static uint8_t rx_buf_1[RX_BUF_SIZE] CC_ALIGN_ATTR(4); -static uint8_t rx_buf_2[RX_BUF_SIZE] CC_ALIGN_ATTR(4); -static uint8_t rx_buf_3[RX_BUF_SIZE] CC_ALIGN_ATTR(4); - -/* The RX Data Queue */ -static dataQueue_t rx_data_queue = { 0 }; - -/* Receive entry pointer to keep track of read items */ -volatile static uint8_t *rx_read_entry; -/*---------------------------------------------------------------------------*/ -/* The outgoing frame buffer */ -#define TX_BUF_SIZE 180 - -static uint8_t tx_buf[TX_BUF_SIZE]; -/*---------------------------------------------------------------------------*/ -/* Overrides for IEEE 802.15.4, differential mode */ -static uint32_t ieee_overrides[] = { - 0x00354038, /* Synth: Set RTRIM (POTAILRESTRIM) to 5 */ - 0x4001402D, /* Synth: Correct CKVD latency setting (address) */ - 0x00608402, /* Synth: Correct CKVD latency setting (value) */ - 0x4001405D, /* Synth: Set ANADIV DIV_BIAS_MODE to PG1 (address) */ - 0x1801F800, /* Synth: Set ANADIV DIV_BIAS_MODE to PG1 (value) */ - 0x000784A3, /* Synth: Set FREF = 3.43 MHz (24 MHz / 7) */ - 0xA47E0583, /* Synth: Set loop bandwidth after lock to 80 kHz (K2) */ - 0xEAE00603, /* Synth: Set loop bandwidth after lock to 80 kHz (K3, LSB) */ - 0x00010623, /* Synth: Set loop bandwidth after lock to 80 kHz (K3, MSB) */ - 0x002B50DC, /* Adjust AGC DC filter */ - 0x05000243, /* Increase synth programming timeout */ - 0x002082C3, /* Increase synth programming timeout */ - 0xFFFFFFFF, /* End of override list */ -}; -/*---------------------------------------------------------------------------*/ -PROCESS(cc26xx_rf_process, "CC26xx RF driver"); -/*---------------------------------------------------------------------------*/ -static int on(void); -static int off(void); -static void setup_interrupts(void); -/*---------------------------------------------------------------------------*/ -static uint8_t -rf_is_accessible(void) -{ - if(ti_lib_prcm_rf_ready() && - ti_lib_prcm_power_domain_status(PRCM_DOMAIN_RFCORE) == - PRCM_DOMAIN_POWER_ON) { - return 1; - } - return 0; -} -/*---------------------------------------------------------------------------*/ -/** - * \brief Sends a command to the RF core. - * - * \param cmd The command value or a pointer to a command buffer - * \param status A pointer to a variable which will hold the status - * \return RF_CMD_OK or RF_CMD_ERROR - * - * This function supports all three types of command (Radio OP, immediate and - * direct) - * - * For immediate and Radio OPs, cmd is a pointer to the data structure - * containing the command and its parameters. This data structure must be - * 4-byte aligned. - * - * For direct commands, cmd contains the value of the command alongside its - * parameters - * - * The caller is responsible of allocating and populating cmd for Radio OP and - * immediate commands - * - * The caller is responsible for allocating status - */ -static uint_fast8_t -rf_send_cmd(uint32_t cmd, uint32_t *status) -{ - uint32_t timeout_count = 0; - bool interrupts_disabled; - - /* - * Make sure ContikiMAC doesn't turn us off from within an interrupt while - * we are accessing RF Core registers - */ - interrupts_disabled = ti_lib_int_master_disable(); - - if(!rf_is_accessible()) { - PRINTF("rf_send_cmd: RF was off\n"); - if(!interrupts_disabled) { - ti_lib_int_master_enable(); - } - return RF_CMD_ERROR; - } - - HWREG(RFC_DBELL_BASE + RFC_DBELL_O_CMDR) = cmd; - do { - *status = HWREG(RFC_DBELL_BASE + RFC_DBELL_O_CMDSTA); - if(++timeout_count > 50000) { - PRINTF("rf_send_cmd: Timeout\n"); - if(!interrupts_disabled) { - ti_lib_int_master_enable(); - } - return RF_CMD_ERROR; - } - } while(*status == RF_CMD_STATUS_PENDING); - - if(!interrupts_disabled) { - ti_lib_int_master_enable(); - } - - /* - * If we reach here the command is no longer pending. It is either completed - * successfully or with error - */ - return *status == RF_CMD_STATUS_DONE; -} -/*---------------------------------------------------------------------------*/ -/** - * \brief Checks whether the RFC domain is accessible and the RFC is in IEEE RX - * \return 1: RFC in RX mode (and therefore accessible too). 0 otherwise - */ -static uint8_t -rf_is_on(void) -{ - if(!rf_is_accessible()) { - return 0; - } - - return RF_RADIO_OP_GET_STATUS(cmd_ieee_rx_buf) == RF_RADIO_OP_STATUS_ACTIVE; -} -/*---------------------------------------------------------------------------*/ -/** - * \brief Check the RF's TX status - * \return 1 RF is transmitting - * \return 0 RF is not transmitting - * - * TX mode may be triggered either by a CMD_IEEE_TX or by the automatic - * transmission of an ACK frame. - */ -static uint8_t -transmitting(void) -{ - uint32_t cmd_status; - - /* If we are off, we are not in TX */ - if(!rf_is_accessible()) { - return 0; - } - - memset(cmd_immediate_buf, 0x00, SIZEOF_STRUCT(CMD_IEEE_CCA_REQ)); - GET_FIELD(cmd_immediate_buf, command, commandNo) = CMD_IEEE_CCA_REQ; - - if(rf_send_cmd((uint32_t)cmd_immediate_buf, &cmd_status) == RF_CMD_ERROR) { - PRINTF("transmitting: CMDSTA=0x%08lx, status=0x%04x\n", - cmd_status, RF_RADIO_OP_GET_STATUS(cmd_immediate_buf)); - return 0; - } - - if((GET_FIELD(cmd_immediate_buf, CMD_IEEE_CCA_REQ, currentRssi) - == RF_CMD_CCA_REQ_RSSI_UNKNOWN) && - (GET_BITFIELD(cmd_immediate_buf, CMD_IEEE_CCA_REQ, ccaInfo, ccaEnergy) - == RF_CMD_CCA_REQ_CCA_STATE_BUSY)) { - return 1; - } - - return 0; -} -/*---------------------------------------------------------------------------*/ -/** - * \brief Returns CCA information - * \return RF_GET_CCA_INFO_ERROR if the RF was not on - * \return On success, the return value is formatted as per the ccaInfo field - * of CMD_IEEE_CCA_REQ - * - * It is the caller's responsibility to make sure the RF is on. This function - * will return RF_GET_CCA_INFO_ERROR if the RF is off - * - * This function will in fact wait for a valid RSSI signal - */ -static uint8_t -get_cca_info(void) -{ - uint32_t cmd_status; - int8_t rssi; - - if(!rf_is_on()) { - PRINTF("get_cca_info: Not on\n"); - return RF_GET_CCA_INFO_ERROR; - } - - rssi = RF_CMD_CCA_REQ_RSSI_UNKNOWN; - - while(rssi == RF_CMD_CCA_REQ_RSSI_UNKNOWN || rssi == 0) { - memset(cmd_immediate_buf, 0x00, SIZEOF_STRUCT(CMD_IEEE_CCA_REQ)); - GET_FIELD(cmd_immediate_buf, command, commandNo) = CMD_IEEE_CCA_REQ; - - if(rf_send_cmd((uint32_t)cmd_immediate_buf, &cmd_status) == RF_CMD_ERROR) { - PRINTF("get_cca_info: CMDSTA=0x%08lx, status=0x%04x\n", - cmd_status, RF_RADIO_OP_GET_STATUS(cmd_immediate_buf)); - - return RF_GET_CCA_INFO_ERROR; - } - - rssi = GET_FIELD(cmd_immediate_buf, CMD_IEEE_CCA_REQ, currentRssi); - } - - /* We have a valid RSSI signal. Return the CCA Info */ - return GET_FIELD(cmd_immediate_buf, CMD_IEEE_CCA_REQ, ccaInfo); -} -/*---------------------------------------------------------------------------*/ -/** - * \brief Reads the current signal strength (RSSI) - * \return The current RSSI in dBm or CMD_GET_RSSI_UNKNOWN - * - * This function reads the current RSSI on the currently configured - * channel. - */ -static radio_value_t -get_rssi(void) -{ - uint32_t cmd_status; - int8_t rssi; - uint8_t was_off = 0; - - /* If we are off, turn on first */ - if(!rf_is_on()) { - was_off = 1; - if(on() != RF_CMD_OK) { - PRINTF("get_rssi: on() failed\n"); - return RF_CMD_CCA_REQ_RSSI_UNKNOWN; - } - } - - memset(cmd_immediate_buf, 0x00, SIZEOF_STRUCT(CMD_GET_RSSI)); - GET_FIELD(cmd_immediate_buf, command, commandNo) = CMD_GET_RSSI; - - if(rf_send_cmd((uint32_t)cmd_immediate_buf, &cmd_status) == RF_CMD_ERROR) { - rssi = RF_CMD_CCA_REQ_RSSI_UNKNOWN; - } - - /* Current RSSI in bits 23:16 of cmd_status */ - rssi = (cmd_status >> 16) & 0xFF; - - /* If we were off, turn back off */ - if(was_off) { - off(); - } - - return rssi; -} -/*---------------------------------------------------------------------------*/ -/* Returns the current TX power in dBm */ -static radio_value_t -get_tx_power(void) -{ - return tx_power_current->dbm; -} -/*---------------------------------------------------------------------------*/ -/* - * Set TX power to 'at least' power dBm - * This works with a lookup table. If the value of 'power' does not exist in - * the lookup table, TXPOWER will be set to the immediately higher available - * value - */ -static void -set_tx_power(radio_value_t power) -{ - uint32_t cmd_status; - int i; - - /* Send a CMD_SET_TX_POWER command to the RF */ - memset(cmd_immediate_buf, 0x00, SIZEOF_STRUCT(CMD_SET_TX_POWER)); - - GET_FIELD(cmd_immediate_buf, command, commandNo) = CMD_SET_TX_POWER; - - for(i = OUTPUT_CONFIG_COUNT - 1; i >= 0; --i) { - if(power <= output_power[i].dbm) { - GET_FIELD(cmd_immediate_buf, CMD_SET_TX_POWER, txPower) = - BITVALUE(CMD_SET_TX_POWER, txPower, IB, output_power[i].register_ib) | - BITVALUE(CMD_SET_TX_POWER, txPower, GC, output_power[i].register_gc) | - BITVALUE(CMD_SET_TX_POWER, txPower, tempCoeff, 0); - - if(rf_send_cmd((uint32_t)cmd_immediate_buf, &cmd_status) == RF_CMD_OK) { - /* Success: Remember the new setting */ - tx_power_current = &output_power[i]; - } else { - PRINTF("set_tx_power: CMDSTA=0x%08lx\n", cmd_status); - } - return; - } - } -} -/*---------------------------------------------------------------------------*/ -/** - * \brief Wait till running radio Op command completes - * - * \return RF_CMD_ERROR or RF_CMD_OK - * - * RF_CMD_OK will be returned if the Radio Op returned with - * RF_RADIO_OP_STATUS_DONE_OK - * - * RF_CMD_ERROR will be returned in the radio op returned with any other - * RF_RADIO_OP_STATUS_DONE_xyz - */ -static uint_fast8_t -rf_wait_cmd_completed_ok(uint8_t *cmd) -{ - _TYPE_radioOp_status tmp_status; - uint32_t timeoutCount = 0; - - /* - * 0x04XX=DONE, 0x0400=DONE_OK while all other "DONE" values means done - * but with some kind of error (ref. "Common radio operation status codes") - */ - do { - tmp_status = GET_FIELD_V(cmd, radioOp, status); - if(++timeoutCount > 500000) { - return RF_CMD_ERROR; - } - } while((tmp_status & RF_RADIO_OP_MASKED_STATUS) != RF_RADIO_OP_MASKED_STATUS_DONE); - - return tmp_status == RF_RADIO_OP_STATUS_DONE_OK; -} -/*---------------------------------------------------------------------------*/ -/** - * \brief Builds common radio parameters for radio operations - * - * \param *cmd Pointer to buffer to add parameters to - * \param command Radio command number (e.g. COMMAND_RADIO_SETUP) - * - * \note The buffer must be emptied with memset() before calling this function - * - * \return None - */ -static void -rf_build_radio_op_cmd(uint8_t *cmd, uint16_t command) -{ - GET_FIELD(cmd, radioOp, commandNo) = command; - GET_FIELD(cmd, radioOp, status) = IDLE; - GET_FIELD(cmd, radioOp, pNextOp) = NULL; - GET_FIELD(cmd, radioOp, startTime) = 0; - GET_FIELD(cmd, radioOp, startTrigger) = TRIG_NOW; - GET_FIELD(cmd, radioOp, condition) = COND_NEVER; -} -/*---------------------------------------------------------------------------*/ -/** - * \brief Sends a CMD_RADIO_SETUP for the selected mode (IEEE or BLE) - * \param mode RF_MODE_BLE or RF_MODE_IEEE - * \return RF_CMD_OK or RF_CMD_ERROR - * - * ToDo: Likely to need one more argument to set bNoAdi on first startup - * vs when coming back from sleep - */ -static uint8_t -rf_radio_setup(uint8_t mode) -{ - uint32_t cmd_status; - - /* Create radio setup command */ - memset(cmd_immediate_buf, 0x00, SIZEOF_RADIO_OP(CMD_RADIO_SETUP)); - rf_build_radio_op_cmd(cmd_immediate_buf, CMD_RADIO_SETUP); - - /* Set output power to the current (or default) value */ - GET_FIELD(cmd_immediate_buf, CMD_RADIO_SETUP, txPower) = - BITVALUE(CMD_RADIO_SETUP, txPower, IB, tx_power_current->register_ib) | - BITVALUE(CMD_RADIO_SETUP, txPower, GC, tx_power_current->register_gc) | - BITVALUE(CMD_RADIO_SETUP, txPower, tempCoeff, 0); - - /* Do mode-dependent things (e.g. apply overrides) */ - if(mode == RF_MODE_IEEE) { - /* Add override control pointer */ - GET_FIELD(cmd_immediate_buf, CMD_RADIO_SETUP, pRegOverride) = ieee_overrides; -#if CC26XX_RF_BLE_SUPPORT - } else if(mode == RF_MODE_BLE) { - /* Add override control pointer */ - GET_FIELD(cmd_immediate_buf, CMD_RADIO_SETUP, pRegOverride) = ble_overrides; -#endif - } else { - PRINTF("rf_radio_setup: Unknown mode %u\n", mode); - return RF_CMD_ERROR; - } - - /* Lastly, set the mode */ - GET_FIELD(cmd_immediate_buf, CMD_RADIO_SETUP, mode) = mode; - - /* Send Radio setup to RF Core */ - if(rf_send_cmd((uint32_t)cmd_immediate_buf, &cmd_status) != RF_CMD_OK) { - PRINTF("rf_radio_setup: CMD_RADIO_SETUP, CMDSTA=0x%08lx, status=0x%04x\n", - cmd_status, RF_RADIO_OP_GET_STATUS(cmd_immediate_buf)); - return RF_CMD_ERROR; - } - - /* Wait until radio setup is done */ - if(rf_wait_cmd_completed_ok(cmd_immediate_buf) != RF_CMD_OK) { - PRINTF("rf_radio_setup: CMD_RADIO_SETUP wait, CMDSTA=0x%08lx, status=0x%04x\n", - cmd_status, RF_RADIO_OP_GET_STATUS(cmd_immediate_buf)); - return RF_CMD_ERROR; - } - - return RF_CMD_OK; -} -/*---------------------------------------------------------------------------*/ -/** - * \brief Applies patches (if any) - * \return RF_CMD_OK or RF_CMD_ERROR - * - * Currently patches are not required. - */ -static uint8_t -apply_patches() -{ - uint32_t cmd_status; - - /* Patch of uninitialized pointer */ - *((uint32_t *)0x21000028) = 0x00000000; - - /* Start radio timer (RAT) */ - if(rf_send_cmd(CMDR_DIR_CMD(CMD_START_RAT), &cmd_status) != RF_CMD_OK) { - PRINTF("apply_patches: START_RAT fail, CMDSTA=0x%08lx\n", cmd_status); - return RF_CMD_ERROR; - } - - return RF_CMD_OK; -} -/*---------------------------------------------------------------------------*/ -/** - * \brief Set up radio in IEEE802.15.4 RX mode - * - * \return RF_CMD_OK Succeeded - * \return RF_CMD_ERROR Failed - * - * This function assumes that cmd_ieee_rx_buf has been previously populated - * with correct values. This can be done through init_rf_params (sets defaults) - * or through Contiki's extended RF API (set_value, set_object) - */ -static uint8_t -rf_cmd_ieee_rx() -{ - uint32_t cmd_status; - rtimer_clock_t t0; - int ret; - - ret = rf_send_cmd((uint32_t)cmd_ieee_rx_buf, &cmd_status); - - if(ret != RF_CMD_OK) { - PRINTF("rf_cmd_ieee_rx: ret=%d, CMDSTA=0x%08lx, status=0x%04x\n", - ret, cmd_status, RF_RADIO_OP_GET_STATUS(cmd_ieee_rx_buf)); - } - - t0 = RTIMER_NOW(); - - while(RF_RADIO_OP_GET_STATUS(cmd_ieee_rx_buf) != RF_RADIO_OP_STATUS_ACTIVE && - (RTIMER_CLOCK_LT(RTIMER_NOW(), t0 + ENTER_RX_WAIT_TIMEOUT))); - - /* Wait to enter RX */ - if(RF_RADIO_OP_GET_STATUS(cmd_ieee_rx_buf) != RF_RADIO_OP_STATUS_ACTIVE) { - PRINTF("rf_cmd_ieee_rx: CMDSTA=0x%08lx, status=0x%04x\n", - cmd_status, RF_RADIO_OP_GET_STATUS(cmd_ieee_rx_buf)); - return RF_CMD_ERROR; - } - - return ret; -} -/*---------------------------------------------------------------------------*/ -static void -init_rx_buffers(void) -{ - /* Two-element circular buffer, hardcoded for now.. */ - GET_FIELD(rx_buf_0, dataEntry, pNextEntry) = rx_buf_1; - GET_FIELD(rx_buf_0, dataEntry, config) = 0x04; - GET_FIELD(rx_buf_0, dataEntry, length) = sizeof(rx_buf_0) - 8; - - GET_FIELD(rx_buf_1, dataEntry, pNextEntry) = rx_buf_2; - GET_FIELD(rx_buf_1, dataEntry, config) = 0x04; - GET_FIELD(rx_buf_1, dataEntry, length) = sizeof(rx_buf_1) - 8; - - GET_FIELD(rx_buf_2, dataEntry, pNextEntry) = rx_buf_3; - GET_FIELD(rx_buf_2, dataEntry, config) = 0x04; - GET_FIELD(rx_buf_2, dataEntry, length) = sizeof(rx_buf_2) - 8; - - /* Point to first element again */ - GET_FIELD(rx_buf_3, dataEntry, pNextEntry) = rx_buf_0; - GET_FIELD(rx_buf_3, dataEntry, config) = 0x04; - GET_FIELD(rx_buf_3, dataEntry, length) = sizeof(rx_buf_3) - 8; -} -/*---------------------------------------------------------------------------*/ -static void -init_rf_params(void) -{ - memset(cmd_ieee_rx_buf, 0x00, SIZEOF_RADIO_OP(CMD_IEEE_RX)); - - GET_FIELD(cmd_ieee_rx_buf, radioOp, commandNo) = CMD_IEEE_RX; - GET_FIELD(cmd_ieee_rx_buf, radioOp, status) = IDLE; - GET_FIELD(cmd_ieee_rx_buf, radioOp, pNextOp) = NULL; - GET_FIELD(cmd_ieee_rx_buf, radioOp, startTime) = 0x00000000; - GET_FIELD(cmd_ieee_rx_buf, radioOp, startTrigger) = TRIG_NOW; - GET_FIELD(cmd_ieee_rx_buf, radioOp, condition) = COND_NEVER; - GET_FIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, channel) = CC26XX_RF_CHANNEL; - GET_FIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, rxConfig) = - BITVALUE(CMD_IEEE_RX, rxConfig, bAutoFlushCrc, 1) | - BITVALUE(CMD_IEEE_RX, rxConfig, bAutoFlushIgn, 0) | - BITVALUE(CMD_IEEE_RX, rxConfig, bIncludePhyHdr, 0) | - BITVALUE(CMD_IEEE_RX, rxConfig, bIncludeCrc, 1) | - BITVALUE(CMD_IEEE_RX, rxConfig, bAppendRssi, 1) | - BITVALUE(CMD_IEEE_RX, rxConfig, bAppendCorrCrc, 1) | - BITVALUE(CMD_IEEE_RX, rxConfig, bAppendSrcInd, 0) | - BITVALUE(CMD_IEEE_RX, rxConfig, bAppendTimestamp, 0); - GET_FIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, pRxQ) = &rx_data_queue; - GET_FIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, pOutput) = rf_stats; - GET_FIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, frameFiltOpt) = -#if CC26XX_RF_CONF_PROMISCOUS - BITVALUE(CMD_IEEE_RX, frameFiltOpt, frameFiltEn, 0) | -#else - BITVALUE(CMD_IEEE_RX, frameFiltOpt, frameFiltEn, 1) | -#endif - BITVALUE(CMD_IEEE_RX, frameFiltOpt, frameFiltStop, 1) | -#if CC26XX_RF_CONF_AUTOACK - BITVALUE(CMD_IEEE_RX, frameFiltOpt, autoAckEn, 1) | -#else - BITVALUE(CMD_IEEE_RX, frameFiltOpt, autoAckEn, 0) | -#endif - BITVALUE(CMD_IEEE_RX, frameFiltOpt, slottedAckEn, 0) | - BITVALUE(CMD_IEEE_RX, frameFiltOpt, autoPendEn, 0) | - BITVALUE(CMD_IEEE_RX, frameFiltOpt, defaultPend, 0) | - BITVALUE(CMD_IEEE_RX, frameFiltOpt, bPendDataReqOnly, 0) | - BITVALUE(CMD_IEEE_RX, frameFiltOpt, bPanCoord, 0) | - BITVALUE(CMD_IEEE_RX, frameFiltOpt, maxFrameVersion, 1) | - BITVALUE(CMD_IEEE_RX, frameFiltOpt, bStrictLenFilter, 0); - /* Receive all frame types */ - GET_FIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, frameTypes) = - BITVALUE(CMD_IEEE_RX, frameTypes, bAcceptFt0Beacon, 1) | - BITVALUE(CMD_IEEE_RX, frameTypes, bAcceptFt1Data, 1) | - BITVALUE(CMD_IEEE_RX, frameTypes, bAcceptFt2Ack, 1) | - BITVALUE(CMD_IEEE_RX, frameTypes, bAcceptFt3MacCmd, 1) | - BITVALUE(CMD_IEEE_RX, frameTypes, bAcceptFt4Reserved, 1) | - BITVALUE(CMD_IEEE_RX, frameTypes, bAcceptFt5Reserved, 1) | - BITVALUE(CMD_IEEE_RX, frameTypes, bAcceptFt6Reserved, 1) | - BITVALUE(CMD_IEEE_RX, frameTypes, bAcceptFt7Reserved, 1); - /* Configure CCA settings */ - GET_FIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, ccaOpt) = - BITVALUE(CMD_IEEE_RX, ccaOpt, ccaEnEnergy, 1) | - BITVALUE(CMD_IEEE_RX, ccaOpt, ccaEnCorr, 1) | - BITVALUE(CMD_IEEE_RX, ccaOpt, ccaEnSync, 0) | - BITVALUE(CMD_IEEE_RX, ccaOpt, ccaCorrOp, 1) | - BITVALUE(CMD_IEEE_RX, ccaOpt, ccaSyncOp, 1) | - BITVALUE(CMD_IEEE_RX, ccaOpt, ccaCorrThr, 3); - /* Set CCA RSSI Threshold, 0xA6 corresponds to -90dBm (two's comp.)*/ - GET_FIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, ccaRssiThr) = 0xA6; - GET_FIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, numExtEntries) = 0x00; - GET_FIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, numShortEntries) = 0x00; - GET_FIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, pExtEntryList) = 0; - GET_FIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, pShortEntryList) = 0; - - GET_FIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, endTrigger) = TRIG_NEVER; - GET_FIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, endTime) = 0x00000000; -} -/*---------------------------------------------------------------------------*/ -/** - * \brief Turn on power to the RFC and boot it. - * - * \return RF_CMD_OK or RF_CMD_ERROR - */ -static int -power_up(void) -{ - uint32_t cmd_status; - bool interrupts_disabled = ti_lib_int_master_disable(); - - ti_lib_int_pend_clear(INT_RF_CPE0); - ti_lib_int_pend_clear(INT_RF_CPE1); - ti_lib_int_disable(INT_RF_CPE0); - ti_lib_int_disable(INT_RF_CPE1); - - /* Enable RF Core power domain */ - ti_lib_prcm_power_domain_on(PRCM_DOMAIN_RFCORE); - while(ti_lib_prcm_power_domain_status(PRCM_DOMAIN_RFCORE) - != PRCM_DOMAIN_POWER_ON); - - ti_lib_prcm_domain_enable(PRCM_DOMAIN_RFCORE); - ti_lib_prcm_load_set(); - while(!ti_lib_prcm_load_get()); - - while(!rf_is_accessible()) { - PRINTF("power_up: Not ready\n"); - } - - HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIFG) = 0x0; - HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIEN) = 0x0; - ti_lib_int_enable(INT_RF_CPE0); - ti_lib_int_enable(INT_RF_CPE1); - - if(!interrupts_disabled) { - ti_lib_int_master_enable(); - } - - /* Let CPE boot */ - HWREG(RFC_PWR_NONBUF_BASE + RFC_PWR_O_PWMCLKEN) = RF_CORE_CLOCKS_MASK; - - /* Send ping (to verify RFCore is ready and alive) */ - if(rf_send_cmd(CMDR_DIR_CMD(CMD_PING), &cmd_status) != RF_CMD_OK) { - PRINTF("power_up: CMD_PING fail, CMDSTA=0x%08lx\n", cmd_status); - return RF_CMD_ERROR; - } - - return RF_CMD_OK; -} -/*---------------------------------------------------------------------------*/ -/** - * \brief Disable RFCORE clock domain in the MCU VD and turn off the RFCORE PD - */ -static void -power_down(void) -{ - bool interrupts_disabled = ti_lib_int_master_disable(); - ti_lib_int_disable(INT_RF_CPE0); - ti_lib_int_disable(INT_RF_CPE1); - - if(rf_is_accessible()) { - HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIFG) = 0x0; - HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIEN) = 0x0; - } - - /* Shut down the RFCORE clock domain in the MCU VD */ - ti_lib_prcm_domain_disable(PRCM_DOMAIN_RFCORE); - ti_lib_prcm_load_set(); - while(!ti_lib_prcm_load_get()); - - /* Turn off RFCORE PD */ - ti_lib_prcm_power_domain_off(PRCM_DOMAIN_RFCORE); - while(ti_lib_prcm_power_domain_status(PRCM_DOMAIN_RFCORE) - != PRCM_DOMAIN_POWER_OFF); - - ti_lib_int_pend_clear(INT_RF_CPE0); - ti_lib_int_pend_clear(INT_RF_CPE1); - ti_lib_int_enable(INT_RF_CPE0); - ti_lib_int_enable(INT_RF_CPE1); - if(!interrupts_disabled) { - ti_lib_int_master_enable(); - } -} -/*---------------------------------------------------------------------------*/ -static int -rx_on(void) -{ - int ret; - - /* Get status of running IEEE_RX (if any) */ - if(rf_is_on()) { - PRINTF("rx_on: We were on. PD=%u, RX=0x%04x \n", rf_is_accessible(), - RF_RADIO_OP_GET_STATUS(cmd_ieee_rx_buf)); - return RF_CMD_OK; - } - - /* Put CPE in RX using the currently configured parameters */ - ret = rf_cmd_ieee_rx(); - - if(ret) { - ENERGEST_ON(ENERGEST_TYPE_LISTEN); - } - - return ret; -} -/*---------------------------------------------------------------------------*/ -static int -rx_off(void) -{ - uint32_t cmd_status; - int ret; - - /* If we are off, do nothing */ - if(!rf_is_on()) { - return RF_CMD_OK; - } - - /* Wait for ongoing ACK TX to finish */ - while(transmitting()); - - /* Send a CMD_STOP command to RF Core */ - if(rf_send_cmd(CMDR_DIR_CMD(CMD_ABORT), &cmd_status) != RF_CMD_OK) { - PRINTF("RX off: CMD_ABORT status=0x%08lx\n", cmd_status); - /* Continue nonetheless */ - } - - while(rf_is_on()); - - if(RF_RADIO_OP_GET_STATUS(cmd_ieee_rx_buf) == IEEE_DONE_STOPPED || - RF_RADIO_OP_GET_STATUS(cmd_ieee_rx_buf) == IEEE_DONE_ABORT) { - /* Stopped gracefully */ - ENERGEST_OFF(ENERGEST_TYPE_LISTEN); - ret = RF_CMD_OK; - } else { - PRINTF("RX off: BG status=0x%04x\n", RF_RADIO_OP_GET_STATUS(cmd_ieee_rx_buf)); - ret = RF_CMD_ERROR; - } - - return ret; -} -/*---------------------------------------------------------------------------*/ -static void -rx_isr(void) -{ - process_poll(&cc26xx_rf_process); -} -/*---------------------------------------------------------------------------*/ -static void -rx_nok_isr(void) -{ - RIMESTATS_ADD(badcrc); - PRINTF("RF: Bad CRC\n"); -} -/*---------------------------------------------------------------------------*/ -void -cc26xx_rf_cpe1_isr(void) -{ - ENERGEST_ON(ENERGEST_TYPE_IRQ); - - ti_lib_int_master_disable(); - PRINTF("RF Error\n"); - - if(!rf_is_accessible()) { - if(power_up() != RF_CMD_OK) { - return; - } - } - - /* Clear interrupt flags */ - HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIFG) = 0x0; - ti_lib_int_master_enable(); - - ENERGEST_OFF(ENERGEST_TYPE_IRQ); -} -/*---------------------------------------------------------------------------*/ -void -cc26xx_rf_cpe0_isr(void) -{ - ENERGEST_ON(ENERGEST_TYPE_IRQ); - - if(!rf_is_accessible()) { - printf("RF ISR called but RF not ready... PANIC!!\n"); - if(power_up() != RF_CMD_OK) { - PRINTF("power_up() failed\n"); - return; - } - } - - ti_lib_int_master_disable(); - if(HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIFG) & RX_IRQ) { - rx_isr(); - } - if(CC26XX_DEBUG_CRC) { - if(HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIFG) & RX_NOK_IRQ) { - rx_nok_isr(); - } - } - /* Clear interrupt flags */ - HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIFG) = 0x0; - ti_lib_int_master_enable(); - - ENERGEST_OFF(ENERGEST_TYPE_IRQ); -} -/*---------------------------------------------------------------------------*/ -static void -setup_interrupts(void) -{ - bool interrupts_disabled; - - /* We are already turned on by the caller, so this should not happen */ - if(!rf_is_accessible()) { - PRINTF("setup_interrupts: No access\n"); - return; - } - - /* Disable interrupts */ - interrupts_disabled = ti_lib_int_master_disable(); - - /* Set all interrupt channels to CPE0 channel, error to CPE1 */ - HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEISL) = ERROR_IRQ; - - /* Acknowledge TX_Frame, Rx_Entry_Done and ERROR */ - HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIEN) = ENABLED_IRQS; - - /* Clear interrupt flags, active low clear(?) */ - HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIFG) = 0x0; - - ti_lib_int_pend_clear(INT_RF_CPE0); - ti_lib_int_pend_clear(INT_RF_CPE1); - ti_lib_int_enable(INT_RF_CPE0); - ti_lib_int_enable(INT_RF_CPE1); - - if(!interrupts_disabled) { - ti_lib_int_master_enable(); - } -} -/*---------------------------------------------------------------------------*/ -static uint8_t -request(void) -{ - /* - * We rely on the RDC layer to turn us on and off. Thus, if we are on we - * will only allow sleep, standby otherwise - */ - if(rf_is_on()) { - return LPM_MODE_SLEEP; - } - - return LPM_MODE_MAX_SUPPORTED; -} -/*---------------------------------------------------------------------------*/ -LPM_MODULE(cc26xx_rf_lpm_module, request, NULL, NULL, LPM_DOMAIN_NONE); -/*---------------------------------------------------------------------------*/ -static int -init(void) -{ - lpm_register_module(&cc26xx_rf_lpm_module); - - /* Enable IEEE, BLE and Common-CMD APIs */ - HWREG(PRCM_BASE + PRCM_O_RFCMODESEL) = PRCM_RFCMODESEL_CURR_MODE5; - - /* Wipe out the BLE adv buffer */ - init_ble(); - - /* Initialise RX buffers */ - memset(rx_buf_0, 0, RX_BUF_SIZE); - memset(rx_buf_1, 0, RX_BUF_SIZE); - memset(rx_buf_2, 0, RX_BUF_SIZE); - memset(rx_buf_3, 0, RX_BUF_SIZE); - - /* Set of RF Core data queue. Circular buffer, no last entry */ - rx_data_queue.pCurrEntry = rx_buf_0; - - rx_data_queue.pLastEntry = NULL; - - /* Initialize current read pointer to first element (used in ISR) */ - rx_read_entry = rx_buf_0; - - /* Populate the RF parameters data structure with default values */ - init_rf_params(); - - if(on() != RF_CMD_OK) { - PRINTF("init: on() failed\n"); - return RF_CMD_ERROR; - } - - ENERGEST_ON(ENERGEST_TYPE_LISTEN); - - process_start(&cc26xx_rf_process, NULL); - return 1; -} -/*---------------------------------------------------------------------------*/ -static int -prepare(const void *payload, unsigned short payload_len) -{ - int len = MIN(payload_len, sizeof(tx_buf)); - - memcpy(tx_buf, payload, len); - return RF_CMD_OK; -} -/*---------------------------------------------------------------------------*/ -static int -transmit(unsigned short transmit_len) -{ - int ret; - uint8_t was_off = 0; - uint32_t cmd_status; - uint16_t stat; - uint8_t tx_active = 0; - rtimer_clock_t t0; - - if(!rf_is_on()) { - was_off = 1; - if(on() != RF_CMD_OK) { - PRINTF("transmit: on() failed\n"); - return RF_CMD_ERROR; - } - } - - /* - * We are certainly not TXing a frame as a result of CMD_IEEE_TX, but we may - * be in the process of TXing an ACK. In that case, wait for the TX to finish - * or return after approx TX_WAIT_TIMEOUT - */ - t0 = RTIMER_NOW(); - - do { - tx_active = transmitting(); - } while(tx_active == 1 && - (RTIMER_CLOCK_LT(RTIMER_NOW(), t0 + TX_WAIT_TIMEOUT))); - - if(tx_active) { - PRINTF("transmit: Already TXing and wait timed out\n"); - - if(was_off) { - off(); - } - - return RADIO_TX_COLLISION; - } - - /* Send the CMD_IEEE_TX command */ - memset(cmd_immediate_buf, 0, SIZEOF_RADIO_OP(CMD_IEEE_TX)); - - rf_build_radio_op_cmd(cmd_immediate_buf, CMD_IEEE_TX); - - GET_FIELD(cmd_immediate_buf, CMD_IEEE_TX, payloadLen) = transmit_len; - GET_FIELD(cmd_immediate_buf, CMD_IEEE_TX, pPayload) = tx_buf; - - /* Enable the LAST_FG_COMMAND_DONE interrupt, which will wake us up */ - HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIEN) = ENABLED_IRQS + - LAST_FG_CMD_DONE; - - ret = rf_send_cmd((uint32_t)cmd_immediate_buf, &cmd_status); - - if(ret) { - /* If we enter here, TX actually started */ - ENERGEST_OFF(ENERGEST_TYPE_LISTEN); - ENERGEST_ON(ENERGEST_TYPE_TRANSMIT); - - /* Idle away while the command is running */ - while((RF_RADIO_OP_GET_STATUS(cmd_immediate_buf) & RF_RADIO_OP_MASKED_STATUS) - == RF_RADIO_OP_MASKED_STATUS_RUNNING) { - lpm_sleep(); - } - - stat = RF_RADIO_OP_GET_STATUS(cmd_immediate_buf); - - if(stat == RF_RADIO_OP_STATUS_IEEE_DONE_OK) { - /* Sent OK */ - RIMESTATS_ADD(lltx); - ret = RADIO_TX_OK; - } else { - /* Operation completed, but frame was not sent */ - PRINTF("transmit: ret=%d, CMDSTA=0x%08lx, status=0x%04x\n", ret, - cmd_status, stat); - ret = RADIO_TX_ERR; - } - } else { - /* Failure sending the CMD_IEEE_TX command */ - PRINTF("transmit: ret=%d, CMDSTA=0x%08lx, status=0x%04x\n", - ret, cmd_status, RF_RADIO_OP_GET_STATUS(cmd_immediate_buf)); - - ret = RADIO_TX_ERR; - } - - /* - * Update ENERGEST state here, before a potential call to off(), which - * will correctly update it if required. - */ - ENERGEST_OFF(ENERGEST_TYPE_TRANSMIT); - ENERGEST_ON(ENERGEST_TYPE_LISTEN); - - /* - * Disable LAST_FG_COMMAND_DONE interrupt. We don't really care about it - * except when we are transmitting - */ - HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIEN) = ENABLED_IRQS; - - return ret; -} -/*---------------------------------------------------------------------------*/ -static int -send(const void *payload, unsigned short payload_len) -{ - prepare(payload, payload_len); - return transmit(payload_len); -} -/*---------------------------------------------------------------------------*/ -static void -release_data_entry(void) -{ - /* Clear the length byte */ - rx_read_entry[8] = 0; - /* Set status to 0 "Pending" in element */ - GET_FIELD_V(rx_read_entry, dataEntry, status) = DATA_ENTRY_STATUS_PENDING; - rx_read_entry = GET_FIELD_V(rx_read_entry, dataEntry, pNextEntry); -} -/*---------------------------------------------------------------------------*/ -static int -read_frame(void *buf, unsigned short buf_len) -{ - int8_t rssi; - int len = 0; - uint8_t status = GET_FIELD_V(rx_read_entry, dataEntry, status); - - if(status != DATA_ENTRY_STATUS_FINISHED) { - /* No available data */ - return 0; - } - - - if(rx_read_entry[8] < 4) { - PRINTF("RF: too short\n"); - RIMESTATS_ADD(tooshort); - - release_data_entry(); - return 0; - } - - len = rx_read_entry[8] - 4; - - if(len > buf_len) { - PRINTF("RF: too long\n"); - RIMESTATS_ADD(toolong); - - release_data_entry(); - return 0; - } - - memcpy(buf, (char *)&rx_read_entry[9], len); - - rssi = (int8_t)rx_read_entry[9 + len + 2]; - - packetbuf_set_attr(PACKETBUF_ATTR_RSSI, rssi); - RIMESTATS_ADD(llrx); - - release_data_entry(); - - return len; -} -/*---------------------------------------------------------------------------*/ -static int -channel_clear(void) -{ - uint8_t was_off = 0; - uint8_t cca_info; - int ret = RF_CCA_CLEAR; - - /* - * If we are in the middle of a BLE operation, we got called by ContikiMAC - * from within an interrupt context. Indicate a clear channel - */ -#if CC26XX_RF_BLE_SUPPORT - if(ble_mode_on) { - PRINTF("channel_clear: Interrupt context but BLE in progress\n"); - return RF_CCA_CLEAR; - } -#endif - - if(rf_is_on()) { - /* - * Wait for potential leftover ACK still being sent. - * Strictly speaking, if we are TXing an ACK then the channel is not clear. - * However, channel_clear is only ever called to determine whether there is - * someone else's packet in the air, not ours. - * - * We could probably even simply return that the channel is clear - */ - while(transmitting()); - } else { - was_off = 1; - if(on() != RF_CMD_OK) { - PRINTF("channel_clear: on() failed\n"); - if(was_off) { - off(); - } - return RF_CCA_CLEAR; - } - } - - cca_info = get_cca_info(); - - if(cca_info == RF_GET_CCA_INFO_ERROR) { - PRINTF("channel_clear: CCA error\n"); - ret = RF_CCA_CLEAR; - } else { - /* - * cca_info bits 1:0 - ccaStatus - * Return 1 (clear) if idle or invalid. - */ - ret = (cca_info & 0x03) != RF_CMD_CCA_REQ_CCA_STATE_BUSY; - } - - if(was_off) { - off(); - } - - return ret; -} -/*---------------------------------------------------------------------------*/ -static int -receiving_packet(void) -{ - int ret = 0; - uint8_t cca_info; - uint8_t was_off = 0; - - if(!rf_is_on()) { - was_off = 1; - if(on() != RF_CMD_OK) { - PRINTF("receiving_packet: on() failed\n"); - return RF_CMD_ERROR; - } - } - - /* - * If we are in the middle of a BLE operation, we got called by ContikiMAC - * from within an interrupt context. We are not receiving - */ -#if CC26XX_RF_BLE_SUPPORT - if(ble_mode_on) { - PRINTF("receiving_packet: Interrupt context but BLE in progress\n"); - return 0; - } -#endif - - /* If we are off, we are not receiving */ - if(!rf_is_on()) { - PRINTF("receiving_packet: We were off\n"); - return 0; - } - - /* If we are transmitting (can only be an ACK here), we are not receiving */ - if(transmitting()) { - PRINTF("receiving_packet: We were TXing\n"); - return 0; - } - - cca_info = get_cca_info(); - - if(cca_info == RF_GET_CCA_INFO_ERROR) { - /* If we can't read CCA info, return "not receiving" */ - ret = 0; - } else { - /* Return 1 (receiving) if ccaState is busy */ - ret = (cca_info & 0x03) == RF_CMD_CCA_REQ_CCA_STATE_BUSY; - } - - if(was_off) { - off(); - } - - return ret; -} -/*---------------------------------------------------------------------------*/ -static int -pending_packet(void) -{ - volatile uint8_t *current = rx_data_queue.pCurrEntry; - int rv = 0; - - /* Go through all RX buffers and check their status */ - do { - if(GET_FIELD_V(current, dataEntry, status) == - DATA_ENTRY_STATUS_FINISHED) { - rv = 1; - process_poll(&cc26xx_rf_process); - } - - current = GET_FIELD_V(current, dataEntry, pNextEntry); - } while(current != rx_data_queue.pCurrEntry); - - /* If we didn't find an entry at status finished, no frames are pending */ - return rv; -} -/*---------------------------------------------------------------------------*/ -static int -on(void) -{ - /* - * Request the HF XOSC as the source for the HF clock. Needed before we can - * use the FS. This will only request, it will _not_ perform the switch. - */ - oscillators_request_hf_xosc(); - - /* - * If we are in the middle of a BLE operation, we got called by ContikiMAC - * from within an interrupt context. Abort, but pretend everything is OK. - */ -#if CC26XX_RF_BLE_SUPPORT - if(ble_mode_on) { - PRINTF("on: Interrupt context but BLE in progress\n"); - return RF_CMD_OK; - } -#endif - - if(rf_is_on()) { - PRINTF("on: We were on. PD=%u, RX=0x%04x \n", rf_is_accessible(), - RF_RADIO_OP_GET_STATUS(cmd_ieee_rx_buf)); - return RF_CMD_OK; - } - - if(power_up() != RF_CMD_OK) { - PRINTF("on: power_up() failed\n"); - return RF_CMD_ERROR; - } - - if(apply_patches() != RF_CMD_OK) { - PRINTF("on: apply_patches() failed\n"); - return RF_CMD_ERROR; - } - - init_rx_buffers(); - - setup_interrupts(); - - /* - * Trigger a switch to the XOSC, so that we can subsequently use the RF FS - * This will block until the XOSC is actually ready, but give how we - * requested it early on, this won't be too long a wait/ - */ - oscillators_switch_to_hf_xosc(); - - if(rf_radio_setup(RF_MODE_IEEE) != RF_CMD_OK) { - PRINTF("on: radio_setup() failed\n"); - return RF_CMD_ERROR; - } - - return rx_on(); -} -/*---------------------------------------------------------------------------*/ -static int -off(void) -{ - /* - * If we are in the middle of a BLE operation, we got called by ContikiMAC - * from within an interrupt context. Abort, but pretend everything is OK. - */ -#if CC26XX_RF_BLE_SUPPORT - if(ble_mode_on) { - PRINTF("off: Interrupt context but BLE in progress\n"); - return RF_CMD_OK; - } -#endif - - while(transmitting()); - - power_down(); - - /* Switch HF clock source to the RCOSC to preserve power */ - oscillators_switch_to_hf_rc(); - - /* We pulled the plug, so we need to restore the status manually */ - GET_FIELD(cmd_ieee_rx_buf, radioOp, status) = IDLE; - - /* - * Just in case there was an ongoing RX (which started after we begun the - * shutdown sequence), we don't want to leave the buffer in state == ongoing - */ - GET_FIELD_V(rx_buf_0, dataEntry, status) = DATA_ENTRY_STATUS_PENDING; - GET_FIELD_V(rx_buf_1, dataEntry, status) = DATA_ENTRY_STATUS_PENDING; - GET_FIELD_V(rx_buf_2, dataEntry, status) = DATA_ENTRY_STATUS_PENDING; - GET_FIELD_V(rx_buf_3, dataEntry, status) = DATA_ENTRY_STATUS_PENDING; - - return RF_CMD_OK; -} -/*---------------------------------------------------------------------------*/ -static radio_result_t -get_value(radio_param_t param, radio_value_t *value) -{ - if(!value) { - return RADIO_RESULT_INVALID_VALUE; - } - - switch(param) { - case RADIO_PARAM_POWER_MODE: - /* On / off */ - *value = rf_is_on() ? RADIO_POWER_MODE_ON : RADIO_POWER_MODE_OFF; - return RADIO_RESULT_OK; - case RADIO_PARAM_CHANNEL: - *value = (radio_value_t)GET_FIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, channel); - return RADIO_RESULT_OK; - case RADIO_PARAM_PAN_ID: - *value = (radio_value_t)GET_FIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, localPanID); - return RADIO_RESULT_OK; - case RADIO_PARAM_16BIT_ADDR: - *value = (radio_value_t)GET_FIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, localShortAddr); - return RADIO_RESULT_OK; - case RADIO_PARAM_RX_MODE: - *value = 0; - if(GET_BITFIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, frameFiltOpt, frameFiltEn)) { - *value |= RADIO_RX_MODE_ADDRESS_FILTER; - } - if(GET_BITFIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, frameFiltOpt, autoAckEn)) { - *value |= RADIO_RX_MODE_AUTOACK; - } - - return RADIO_RESULT_OK; - case RADIO_PARAM_TXPOWER: - *value = get_tx_power(); - return RADIO_RESULT_OK; - case RADIO_PARAM_CCA_THRESHOLD: - *value = GET_FIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, ccaRssiThr); - return RADIO_RESULT_OK; - case RADIO_PARAM_RSSI: - *value = get_rssi(); - - if(*value == RF_CMD_CCA_REQ_RSSI_UNKNOWN) { - return RADIO_RESULT_ERROR; - } else { - return RADIO_RESULT_OK; - } - case RADIO_CONST_CHANNEL_MIN: - *value = CC26XX_RF_CHANNEL_MIN; - return RADIO_RESULT_OK; - case RADIO_CONST_CHANNEL_MAX: - *value = CC26XX_RF_CHANNEL_MAX; - return RADIO_RESULT_OK; - case RADIO_CONST_TXPOWER_MIN: - *value = OUTPUT_POWER_MIN; - return RADIO_RESULT_OK; - case RADIO_CONST_TXPOWER_MAX: - *value = OUTPUT_POWER_MAX; - return RADIO_RESULT_OK; - default: - return RADIO_RESULT_NOT_SUPPORTED; - } -} -/*---------------------------------------------------------------------------*/ -static radio_result_t -set_value(radio_param_t param, radio_value_t value) -{ - uint8_t was_off = 0; - radio_result_t rv; - - switch(param) { - case RADIO_PARAM_POWER_MODE: - if(value == RADIO_POWER_MODE_ON) { - if(on() != RF_CMD_OK) { - PRINTF("set_value: on() failed (1)\n"); - return RADIO_RESULT_ERROR; - } - return RADIO_RESULT_OK; - } - if(value == RADIO_POWER_MODE_OFF) { - off(); - return RADIO_RESULT_OK; - } - return RADIO_RESULT_INVALID_VALUE; - case RADIO_PARAM_CHANNEL: - if(value < CC26XX_RF_CHANNEL_MIN || - value > CC26XX_RF_CHANNEL_MAX) { - return RADIO_RESULT_INVALID_VALUE; - } - - GET_FIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, channel) = (uint8_t)value; - break; - case RADIO_PARAM_PAN_ID: - GET_FIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, localPanID) = (uint16_t)value; - break; - case RADIO_PARAM_16BIT_ADDR: - GET_FIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, localShortAddr) = (uint16_t)value; - break; - case RADIO_PARAM_RX_MODE: - { - if(value & ~(RADIO_RX_MODE_ADDRESS_FILTER | - RADIO_RX_MODE_AUTOACK)) { - return RADIO_RESULT_INVALID_VALUE; - } - - GET_FIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, frameFiltOpt) = - BITVALUE(CMD_IEEE_RX, frameFiltOpt, frameFiltEn, - (value & RADIO_RX_MODE_ADDRESS_FILTER) != 0) | - BITVALUE(CMD_IEEE_RX, frameFiltOpt, frameFiltStop, 1) | - BITVALUE(CMD_IEEE_RX, frameFiltOpt, autoAckEn, - (value & RADIO_RX_MODE_AUTOACK) != 0) | - BITVALUE(CMD_IEEE_RX, frameFiltOpt, slottedAckEn, 0) | - BITVALUE(CMD_IEEE_RX, frameFiltOpt, autoPendEn, 0) | - BITVALUE(CMD_IEEE_RX, frameFiltOpt, defaultPend, 0) | - BITVALUE(CMD_IEEE_RX, frameFiltOpt, bPendDataReqOnly, 0) | - BITVALUE(CMD_IEEE_RX, frameFiltOpt, bPanCoord, 0) | - BITVALUE(CMD_IEEE_RX, frameFiltOpt, bStrictLenFilter, 0); - - break; - } - case RADIO_PARAM_TXPOWER: - if(value < OUTPUT_POWER_MIN || value > OUTPUT_POWER_MAX) { - return RADIO_RESULT_INVALID_VALUE; - } - - set_tx_power(value); - - return RADIO_RESULT_OK; - case RADIO_PARAM_CCA_THRESHOLD: - GET_FIELD(cmd_ieee_rx_buf, CMD_IEEE_RX, ccaRssiThr) = (int8_t)value; - break; - default: - return RADIO_RESULT_NOT_SUPPORTED; - } - - /* If we reach here we had no errors. Apply new settings */ - if(!rf_is_on()) { - was_off = 1; - if(on() != RF_CMD_OK) { - PRINTF("set_value: on() failed (2)\n"); - return RADIO_RESULT_ERROR; - } - } - - if(rx_off() != RF_CMD_OK) { - PRINTF("set_value: rx_off() failed\n"); - rv = RADIO_RESULT_ERROR; - } - - if(rx_on() != RF_CMD_OK) { - PRINTF("set_value: rx_on() failed\n"); - rv = RADIO_RESULT_ERROR; - } - - /* If we were off, turn back off */ - if(was_off) { - off(); - } - - return rv; -} -/*---------------------------------------------------------------------------*/ -static radio_result_t -get_object(radio_param_t param, void *dest, size_t size) -{ - uint8_t *target; - uint8_t *src; - int i; - - if(param == RADIO_PARAM_64BIT_ADDR) { - if(size != 8 || !dest) { - return RADIO_RESULT_INVALID_VALUE; - } - - target = dest; - src = (uint8_t *)(GET_FIELD_PTR(cmd_ieee_rx_buf, CMD_IEEE_RX, localExtAddr)); - - for(i = 0; i < 8; i++) { - target[i] = src[7 - i]; - } - - return RADIO_RESULT_OK; - } - return RADIO_RESULT_NOT_SUPPORTED; -} -/*---------------------------------------------------------------------------*/ -static radio_result_t -set_object(radio_param_t param, const void *src, size_t size) -{ - uint8_t was_off = 0; - radio_result_t rv; - int i; - uint8_t *dst; - - if(param == RADIO_PARAM_64BIT_ADDR) { - if(size != 8 || !src) { - return RADIO_RESULT_INVALID_VALUE; - } - - dst = (uint8_t *)(GET_FIELD_PTR(cmd_ieee_rx_buf, CMD_IEEE_RX, - localExtAddr)); - - for(i = 0; i < 8; i++) { - dst[i] = ((uint8_t *)src)[7 - i]; - } - - if(!rf_is_on()) { - was_off = 1; - if(on() != RF_CMD_OK) { - PRINTF("set_object: on() failed\n"); - return RADIO_RESULT_ERROR; - } - } - - if(rx_off() != RF_CMD_OK) { - PRINTF("set_object: rx_off() failed\n"); - rv = RADIO_RESULT_ERROR; - } - - if(rx_on() != RF_CMD_OK) { - PRINTF("set_object: rx_on() failed\n"); - rv = RADIO_RESULT_ERROR; - } - - /* If we were off, turn back off */ - if(was_off) { - off(); - } - - return rv; - } - return RADIO_RESULT_NOT_SUPPORTED; -} -/*---------------------------------------------------------------------------*/ -const struct radio_driver cc26xx_rf_driver = { - init, - prepare, - transmit, - send, - read_frame, - channel_clear, - receiving_packet, - pending_packet, - on, - off, - get_value, - set_value, - get_object, - set_object, -}; -/*---------------------------------------------------------------------------*/ -PROCESS_THREAD(cc26xx_rf_process, ev, data) -{ - int len; - - PROCESS_BEGIN(); - - while(1) { - PROCESS_WAIT_EVENT(); - do { - packetbuf_clear(); - len = read_frame(packetbuf_dataptr(), PACKETBUF_SIZE); - - if(len > 0) { - packetbuf_set_datalen(len); - - NETSTACK_RDC.input(); - } - } while(len > 0); - } - PROCESS_END(); -} -/*---------------------------------------------------------------------------*/ -#if CC26XX_RF_BLE_SUPPORT -/*---------------------------------------------------------------------------*/ -/** - * \brief Builds common radio parameters for radio operations - * - * \param *cmd Pointer to buffer to add parameters to - * \param command Radio command number (e.g. COMMAND_RADIO_SETUP) - * - * \note The buffer must be emptied with memset() before calling this function - * - * \return None - */ -static void -rf_build_ble_radio_op_cmd(uint8_t *cmd, uint16_t command) -{ - GET_FIELD(cmd, radioOp, commandNo) = command; - GET_FIELD(cmd, radioOp, status) = IDLE; - GET_FIELD(cmd, radioOp, pNextOp) = NULL; - GET_FIELD(cmd, radioOp, startTime) = 0; - GET_FIELD(cmd, radioOp, startTrigger) = TRIG_NOW; - GET_FIELD(cmd, radioOp, condition) = COND_NEVER; -} -/*---------------------------------------------------------------------------*/ -static void -init_ble() -{ - ble_mode_on = 0; - - memset(beacond_config.adv_name, 0, BLE_ADV_NAME_BUF_LEN); - beacond_config.interval = BLE_ADV_INTERVAL; -} -/*---------------------------------------------------------------------------*/ -static int -send_ble_adv_nc(int channel, uint8_t *output, uint8_t *adv_payload, - int adv_payload_len, uint16_t *dev_address) -{ - uint32_t cmd_status; - int ret; - - /* Erase ble_tx_rx_buf array */ - memset(ble_tx_rx_buf, 0x00, SIZEOF_RADIO_OP(CMD_BLE_ADV_NC)); - rf_build_ble_radio_op_cmd(ble_tx_rx_buf, CMD_BLE_ADV_NC); - - GET_FIELD(ble_tx_rx_buf, bleRadioOp, channel) = channel; - GET_FIELD(ble_tx_rx_buf, bleRadioOp, whitening) = 0; - - memset(ble_cmd_buf, 0x00, SIZEOF_STRUCT(bleAdvPar)); - GET_FIELD(ble_tx_rx_buf, bleRadioOp, pParams) = (uint8_t *)ble_cmd_buf; - GET_FIELD(ble_tx_rx_buf, bleRadioOp, pOutput) = output; - - /* Set up BLE Advertisement parameters */ - GET_FIELD(ble_cmd_buf, bleAdvPar, pRxQ) = NULL; - GET_FIELD(ble_cmd_buf, bleAdvPar, rxConfig) = 0; - GET_FIELD(ble_cmd_buf, bleAdvPar, advConfig) = 0; - GET_FIELD(ble_cmd_buf, bleAdvPar, advLen) = adv_payload_len; - GET_FIELD(ble_cmd_buf, bleAdvPar, scanRspLen) = 0; - GET_FIELD(ble_cmd_buf, bleAdvPar, pAdvData) = adv_payload; - GET_FIELD(ble_cmd_buf, bleAdvPar, pScanRspData) = NULL; - GET_FIELD(ble_cmd_buf, bleAdvPar, pDeviceAddress) = dev_address; - GET_FIELD(ble_cmd_buf, bleAdvPar, pWhiteList) = NULL; - GET_FIELD(ble_cmd_buf, bleAdvPar, endTrigger) = TRIG_NEVER; - GET_FIELD(ble_cmd_buf, bleAdvPar, endTime) = TRIG_NEVER; - - if(rf_send_cmd((uint32_t)ble_tx_rx_buf, &cmd_status) == RF_CMD_ERROR) { - PRINTF("send_ble_adv_nc: Chan=%d CMDSTA=0x%08lx, status=0x%04x\n", - channel, cmd_status, RF_RADIO_OP_GET_STATUS(ble_tx_rx_buf)); - return RF_CMD_ERROR; - } - - /* Wait for the ADV_NC to go out */ - while((RF_RADIO_OP_GET_STATUS(ble_tx_rx_buf) & RF_RADIO_OP_MASKED_STATUS) - == RF_RADIO_OP_MASKED_STATUS_RUNNING); - - if(RF_RADIO_OP_GET_STATUS(ble_tx_rx_buf) == RF_RADIO_OP_STATUS_BLE_DONE_OK) { - /* Sent OK */ - ret = RF_CMD_OK; - } else { - /* Radio Op completed, but ADV NC was not sent */ - PRINTF("send_ble_adv_nc: Chan=%d CMDSTA=0x%08lx, status=0x%04x\n", - channel, cmd_status, RF_RADIO_OP_GET_STATUS(ble_tx_rx_buf)); - ret = RF_CMD_ERROR; - } - - return ret; -} -/*---------------------------------------------------------------------------*/ -static int -send_ble_adv(int channel, uint8_t *adv_payload, int adv_payload_len) -{ - if(send_ble_adv_nc(channel, rf_stats, adv_payload, adv_payload_len, - (uint16_t *)&linkaddr_node_addr.u8[2]) != RF_CMD_OK) { - PRINTF("send_ble_adv: Channel=%d, Error advertising\n", channel); - /* Break the loop, but don't return just yet */ - return RF_CMD_ERROR; - } - - return RF_CMD_OK; -} -/*---------------------------------------------------------------------------*/ -PROCESS_THREAD(cc26xx_rf_ble_beacon_process, ev, data) -{ - static struct etimer ble_adv_et; - static uint8_t payload[BLE_ADV_PAYLOAD_BUF_LEN]; - static int p = 0; - static int i; - uint8_t was_on; - int j; - uint32_t cmd_status; - bool interrupts_disabled; - - PROCESS_BEGIN(); - - while(1) { - etimer_set(&ble_adv_et, beacond_config.interval); - - PROCESS_WAIT_EVENT(); - - if(ev == PROCESS_EVENT_EXIT) { - PROCESS_EXIT(); - } - - /* Set the adv payload each pass: The device name may have changed */ - p = 0; - - /* device info */ - payload[p++] = 0x02; /* 2 bytes */ - payload[p++] = BLE_ADV_TYPE_DEVINFO; - payload[p++] = 0x1a; /* LE general discoverable + BR/EDR */ - payload[p++] = 1 + strlen(beacond_config.adv_name); - payload[p++] = BLE_ADV_TYPE_NAME; - memcpy(&payload[p], beacond_config.adv_name, - strlen(beacond_config.adv_name)); - p += strlen(beacond_config.adv_name); - - for(i = 0; i < BLE_ADV_MESSAGES; i++) { - /* - * Under ContikiMAC, some IEEE-related operations will be called from an - * interrupt context. We need those to see that we are in BLE mode. - */ - interrupts_disabled = ti_lib_int_master_disable(); - ble_mode_on = 1; - if(!interrupts_disabled) { - ti_lib_int_master_enable(); - } - - /* - * Send BLE_ADV_MESSAGES beacon bursts. Each burst on all three - * channels, with a BLE_ADV_DUTY_CYCLE interval between bursts - * - * First, determine our state: - * - * If we are running NullRDC, we are likely in IEEE RX mode. We need to - * abort the IEEE BG Op before entering BLE mode. - * If we are ContikiMAC, we are likely off, in which case we need to - * boot the CPE before entering BLE mode - */ - was_on = rf_is_accessible(); - - if(was_on) { - /* - * We were on: If we are in the process of receiving an IEEE frame, - * abort the BLE beacon burst. Otherwise, terminate the IEEE BG Op - * so we can switch to BLE mode - */ - if(receiving_packet()) { - PRINTF("cc26xx_rf_ble_beacon_process: We were receiving\n"); - - /* Abort this pass */ - break; - } - - if(rx_off() != RF_CMD_OK) { - PRINTF("cc26xx_rf_ble_beacon_process: rx_off() failed\n"); - - /* Abort this pass */ - break; - } - } else { - /* Request the HF XOSC to source the HF clock. */ - oscillators_request_hf_xosc(); - - /* We were off: Boot the CPE */ - if(power_up() != RF_CMD_OK) { - PRINTF("cc26xx_rf_ble_beacon_process: power_up() failed\n"); - - /* Abort this pass */ - break; - } - - if(apply_patches() != RF_CMD_OK) { - PRINTF("cc26xx_rf_ble_beacon_process: apply_patches() failed\n"); - - /* Abort this pass */ - break; - } - - /* Trigger a switch to the XOSC, so that we can use the FS */ - oscillators_switch_to_hf_xosc(); - } - - /* Enter BLE mode */ - if(rf_radio_setup(RF_MODE_BLE) != RF_CMD_OK) { - PRINTF("cc26xx_rf_ble_beacon_process: Error entering BLE mode\n"); - /* Continue so we can at least try to restore our previous state */ - } else { - /* Send advertising packets on all 3 advertising channels */ - for(j = 37; j <= 39; j++) { - if(send_ble_adv(j, payload, p) != RF_CMD_OK) { - PRINTF("cc26xx_rf_ble_beacon_process: Channel=%d," - "Error advertising\n", j); - /* Break the loop, but don't return just yet */ - break; - } - } - } - - /* Send a CMD_STOP command to RF Core */ - if(rf_send_cmd(CMDR_DIR_CMD(CMD_STOP), &cmd_status) != RF_CMD_OK) { - PRINTF("cc26xx_rf_ble_beacon_process: status=0x%08lx\n", cmd_status); - /* Continue... */ - } - - if(was_on) { - /* We were on, go back to IEEE mode */ - if(rf_radio_setup(RF_MODE_IEEE) != RF_CMD_OK) { - PRINTF("cc26xx_rf_ble_beacon_process: radio_setup() failed\n"); - } - - /* Enter IEEE RX mode */ - if(rx_on() != RF_CMD_OK) { - PRINTF("cc26xx_rf_ble_beacon_process: rx_on() failed\n"); - } - } else { - power_down(); - - /* Switch HF clock source to the RCOSC to preserve power */ - oscillators_switch_to_hf_rc(); - } - etimer_set(&ble_adv_et, BLE_ADV_DUTY_CYCLE); - - interrupts_disabled = ti_lib_int_master_disable(); - - ble_mode_on = 0; - - if(!interrupts_disabled) { - ti_lib_int_master_enable(); - } - - /* Wait unless this is the last burst */ - if(i < BLE_ADV_MESSAGES - 1) { - PROCESS_WAIT_EVENT(); - } - } - - interrupts_disabled = ti_lib_int_master_disable(); - - ble_mode_on = 0; - - if(!interrupts_disabled) { - ti_lib_int_master_enable(); - } - } - PROCESS_END(); -} -/*---------------------------------------------------------------------------*/ -#endif /* CC26XX_RF_BLE_SUPPORT */ -/*---------------------------------------------------------------------------*/ -void -cc26xx_rf_ble_beacond_config(clock_time_t interval, const char *name) -{ -#if CC26XX_RF_BLE_SUPPORT - if(name != NULL) { - memset(beacond_config.adv_name, 0, BLE_ADV_NAME_BUF_LEN); - - if(strlen(name) == 0 || strlen(name) >= BLE_ADV_NAME_BUF_LEN) { - return; - } - - memcpy(beacond_config.adv_name, name, strlen(name)); - } - - if(interval != 0) { - beacond_config.interval = interval; - } -#endif -} -/*---------------------------------------------------------------------------*/ -uint8_t -cc26xx_rf_ble_beacond_start() -{ -#if CC26XX_RF_BLE_SUPPORT - if(beacond_config.adv_name[0] == 0) { - return RF_CMD_ERROR; - } - - process_start(&cc26xx_rf_ble_beacon_process, NULL); - - return RF_CMD_OK; -#else - return RF_CMD_ERROR; -#endif -} -/*---------------------------------------------------------------------------*/ -void -cc26xx_rf_ble_beacond_stop() -{ -#if CC26XX_RF_BLE_SUPPORT - process_exit(&cc26xx_rf_ble_beacon_process); -#endif -} -/*---------------------------------------------------------------------------*/ -/** @} */ diff --git a/cpu/cc26xx/dev/rfc-api/ble_cmd_field.h b/cpu/cc26xx/dev/rfc-api/ble_cmd_field.h deleted file mode 100755 index 307e67dc6..000000000 --- a/cpu/cc26xx/dev/rfc-api/ble_cmd_field.h +++ /dev/null @@ -1,623 +0,0 @@ -/****************************************************************************** -* Filename: ble_cmd_field.h -* Revised: $ $ -* Revision: $ $ -* -* Description: CC26xx/CC13xx API for Bluetooth Low Energy commands -* -* Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ -* -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* -* Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* -* Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* -* Neither the name of Texas Instruments Incorporated nor the names of -* its contributors may be used to endorse or promote products derived -* from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -******************************************************************************/ - -#ifndef __BLE_CMD_FIELD_H -#define __BLE_CMD_FIELD_H - -#include -#include "mailbox.h" -#include "common_cmd.h" - -#define _POSITION_bleRadioOp_channel 14 -#define _TYPE_bleRadioOp_channel uint8_t -#define _POSITION_bleRadioOp_whitening 15 -#define _TYPE_bleRadioOp_whitening uint8_t -#define _BITPOS_bleRadioOp_whitening_init 0 -#define _NBITS_bleRadioOp_whitening_init 7 -#define _BITPOS_bleRadioOp_whitening_bOverride 7 -#define _NBITS_bleRadioOp_whitening_bOverride 1 -#define _POSITION_bleRadioOp_pParams 16 -#define _TYPE_bleRadioOp_pParams uint8_t* -#define _POSITION_bleRadioOp_pOutput 20 -#define _TYPE_bleRadioOp_pOutput uint8_t* -#define _SIZEOF_bleRadioOp 24 - -#define _SIZEOF_CMD_BLE_SLAVE 24 - -#define _SIZEOF_CMD_BLE_MASTER 24 - -#define _SIZEOF_CMD_BLE_ADV 24 - -#define _SIZEOF_CMD_BLE_ADV_DIR 24 - -#define _SIZEOF_CMD_BLE_ADV_NC 24 - -#define _SIZEOF_CMD_BLE_ADV_SCAN 24 - -#define _SIZEOF_CMD_BLE_SCANNER 24 - -#define _SIZEOF_CMD_BLE_INITIATOR 24 - -#define _SIZEOF_CMD_BLE_GENERIC_RX 24 - -#define _SIZEOF_CMD_BLE_TX_TEST 24 - -#define _POSITION_CMD_BLE_ADV_PAYLOAD_payloadType 2 -#define _TYPE_CMD_BLE_ADV_PAYLOAD_payloadType uint8_t -#define _POSITION_CMD_BLE_ADV_PAYLOAD_newLen 3 -#define _TYPE_CMD_BLE_ADV_PAYLOAD_newLen uint8_t -#define _POSITION_CMD_BLE_ADV_PAYLOAD_pNewData 4 -#define _TYPE_CMD_BLE_ADV_PAYLOAD_pNewData uint8_t* -#define _POSITION_CMD_BLE_ADV_PAYLOAD_pParams 8 -#define _TYPE_CMD_BLE_ADV_PAYLOAD_pParams uint8_t* -#define _SIZEOF_CMD_BLE_ADV_PAYLOAD 12 - -#define _POSITION_bleMasterSlavePar_pRxQ 0 -#define _TYPE_bleMasterSlavePar_pRxQ dataQueue_t* -#define _POSITION_bleMasterSlavePar_pTxQ 4 -#define _TYPE_bleMasterSlavePar_pTxQ dataQueue_t* -#define _POSITION_bleMasterSlavePar_rxConfig 8 -#define _TYPE_bleMasterSlavePar_rxConfig uint8_t -#define _BITPOS_bleMasterSlavePar_rxConfig_bAutoFlushIgnored 0 -#define _NBITS_bleMasterSlavePar_rxConfig_bAutoFlushIgnored 1 -#define _BITPOS_bleMasterSlavePar_rxConfig_bAutoFlushCrcErr 1 -#define _NBITS_bleMasterSlavePar_rxConfig_bAutoFlushCrcErr 1 -#define _BITPOS_bleMasterSlavePar_rxConfig_bAutoFlushEmpty 2 -#define _NBITS_bleMasterSlavePar_rxConfig_bAutoFlushEmpty 1 -#define _BITPOS_bleMasterSlavePar_rxConfig_bIncludeLenByte 3 -#define _NBITS_bleMasterSlavePar_rxConfig_bIncludeLenByte 1 -#define _BITPOS_bleMasterSlavePar_rxConfig_bIncludeCrc 4 -#define _NBITS_bleMasterSlavePar_rxConfig_bIncludeCrc 1 -#define _BITPOS_bleMasterSlavePar_rxConfig_bAppendRssi 5 -#define _NBITS_bleMasterSlavePar_rxConfig_bAppendRssi 1 -#define _BITPOS_bleMasterSlavePar_rxConfig_bAppendStatus 6 -#define _NBITS_bleMasterSlavePar_rxConfig_bAppendStatus 1 -#define _BITPOS_bleMasterSlavePar_rxConfig_bAppendTimestamp 7 -#define _NBITS_bleMasterSlavePar_rxConfig_bAppendTimestamp 1 -#define _POSITION_bleMasterSlavePar_seqStat 9 -#define _TYPE_bleMasterSlavePar_seqStat uint8_t -#define _BITPOS_bleMasterSlavePar_seqStat_lastRxSn 0 -#define _NBITS_bleMasterSlavePar_seqStat_lastRxSn 1 -#define _BITPOS_bleMasterSlavePar_seqStat_lastTxSn 1 -#define _NBITS_bleMasterSlavePar_seqStat_lastTxSn 1 -#define _BITPOS_bleMasterSlavePar_seqStat_nextTxSn 2 -#define _NBITS_bleMasterSlavePar_seqStat_nextTxSn 1 -#define _BITPOS_bleMasterSlavePar_seqStat_bFirstPkt 3 -#define _NBITS_bleMasterSlavePar_seqStat_bFirstPkt 1 -#define _BITPOS_bleMasterSlavePar_seqStat_bAutoEmpty 4 -#define _NBITS_bleMasterSlavePar_seqStat_bAutoEmpty 1 -#define _BITPOS_bleMasterSlavePar_seqStat_bLlCtrlTx 5 -#define _NBITS_bleMasterSlavePar_seqStat_bLlCtrlTx 1 -#define _BITPOS_bleMasterSlavePar_seqStat_bLlCtrlAckRx 6 -#define _NBITS_bleMasterSlavePar_seqStat_bLlCtrlAckRx 1 -#define _BITPOS_bleMasterSlavePar_seqStat_bLlCtrlAckPending 7 -#define _NBITS_bleMasterSlavePar_seqStat_bLlCtrlAckPending 1 -#define _POSITION_bleMasterSlavePar_maxNack 10 -#define _TYPE_bleMasterSlavePar_maxNack uint8_t -#define _POSITION_bleMasterSlavePar_maxPkt 11 -#define _TYPE_bleMasterSlavePar_maxPkt uint8_t -#define _POSITION_bleMasterSlavePar_accessAddress 12 -#define _TYPE_bleMasterSlavePar_accessAddress uint32_t -#define _POSITION_bleMasterSlavePar_crcInit0 16 -#define _TYPE_bleMasterSlavePar_crcInit0 uint8_t -#define _POSITION_bleMasterSlavePar_crcInit1 17 -#define _TYPE_bleMasterSlavePar_crcInit1 uint8_t -#define _POSITION_bleMasterSlavePar_crcInit2 18 -#define _TYPE_bleMasterSlavePar_crcInit2 uint8_t -#define _POSITION_bleMasterSlavePar_crcInit 16 -#define _TYPE_bleMasterSlavePar_crcInit uint32_t -#define _SIZEOF_bleMasterSlavePar 20 - -#define _POSITION_bleMasterPar_endTrigger 19 -#define _TYPE_bleMasterPar_endTrigger uint8_t -#define _BITPOS_bleMasterPar_endTrigger_triggerType 0 -#define _NBITS_bleMasterPar_endTrigger_triggerType 4 -#define _BITPOS_bleMasterPar_endTrigger_bEnaCmd 4 -#define _NBITS_bleMasterPar_endTrigger_bEnaCmd 1 -#define _BITPOS_bleMasterPar_endTrigger_triggerNo 5 -#define _NBITS_bleMasterPar_endTrigger_triggerNo 2 -#define _BITPOS_bleMasterPar_endTrigger_pastTrig 7 -#define _NBITS_bleMasterPar_endTrigger_pastTrig 1 -#define _POSITION_bleMasterPar_endTime 20 -#define _TYPE_bleMasterPar_endTime ratmr_t -#define _SIZEOF_bleMasterPar 24 - -#define _POSITION_bleSlavePar_timeoutTrigger 19 -#define _TYPE_bleSlavePar_timeoutTrigger uint8_t -#define _BITPOS_bleSlavePar_timeoutTrigger_triggerType 0 -#define _NBITS_bleSlavePar_timeoutTrigger_triggerType 4 -#define _BITPOS_bleSlavePar_timeoutTrigger_bEnaCmd 4 -#define _NBITS_bleSlavePar_timeoutTrigger_bEnaCmd 1 -#define _BITPOS_bleSlavePar_timeoutTrigger_triggerNo 5 -#define _NBITS_bleSlavePar_timeoutTrigger_triggerNo 2 -#define _BITPOS_bleSlavePar_timeoutTrigger_pastTrig 7 -#define _NBITS_bleSlavePar_timeoutTrigger_pastTrig 1 -#define _POSITION_bleSlavePar_timeoutTime 20 -#define _TYPE_bleSlavePar_timeoutTime ratmr_t -#define _POSITION_bleSlavePar_endTrigger 27 -#define _TYPE_bleSlavePar_endTrigger uint8_t -#define _BITPOS_bleSlavePar_endTrigger_triggerType 0 -#define _NBITS_bleSlavePar_endTrigger_triggerType 4 -#define _BITPOS_bleSlavePar_endTrigger_bEnaCmd 4 -#define _NBITS_bleSlavePar_endTrigger_bEnaCmd 1 -#define _BITPOS_bleSlavePar_endTrigger_triggerNo 5 -#define _NBITS_bleSlavePar_endTrigger_triggerNo 2 -#define _BITPOS_bleSlavePar_endTrigger_pastTrig 7 -#define _NBITS_bleSlavePar_endTrigger_pastTrig 1 -#define _POSITION_bleSlavePar_endTime 28 -#define _TYPE_bleSlavePar_endTime ratmr_t -#define _SIZEOF_bleSlavePar 32 - -#define _POSITION_bleAdvPar_pRxQ 0 -#define _TYPE_bleAdvPar_pRxQ dataQueue_t* -#define _POSITION_bleAdvPar_rxConfig 4 -#define _TYPE_bleAdvPar_rxConfig uint8_t -#define _BITPOS_bleAdvPar_rxConfig_bAutoFlushIgnored 0 -#define _NBITS_bleAdvPar_rxConfig_bAutoFlushIgnored 1 -#define _BITPOS_bleAdvPar_rxConfig_bAutoFlushCrcErr 1 -#define _NBITS_bleAdvPar_rxConfig_bAutoFlushCrcErr 1 -#define _BITPOS_bleAdvPar_rxConfig_bAutoFlushEmpty 2 -#define _NBITS_bleAdvPar_rxConfig_bAutoFlushEmpty 1 -#define _BITPOS_bleAdvPar_rxConfig_bIncludeLenByte 3 -#define _NBITS_bleAdvPar_rxConfig_bIncludeLenByte 1 -#define _BITPOS_bleAdvPar_rxConfig_bIncludeCrc 4 -#define _NBITS_bleAdvPar_rxConfig_bIncludeCrc 1 -#define _BITPOS_bleAdvPar_rxConfig_bAppendRssi 5 -#define _NBITS_bleAdvPar_rxConfig_bAppendRssi 1 -#define _BITPOS_bleAdvPar_rxConfig_bAppendStatus 6 -#define _NBITS_bleAdvPar_rxConfig_bAppendStatus 1 -#define _BITPOS_bleAdvPar_rxConfig_bAppendTimestamp 7 -#define _NBITS_bleAdvPar_rxConfig_bAppendTimestamp 1 -#define _POSITION_bleAdvPar_advConfig 5 -#define _TYPE_bleAdvPar_advConfig uint8_t -#define _BITPOS_bleAdvPar_advConfig_advFilterPolicy 0 -#define _NBITS_bleAdvPar_advConfig_advFilterPolicy 2 -#define _BITPOS_bleAdvPar_advConfig_deviceAddrType 2 -#define _NBITS_bleAdvPar_advConfig_deviceAddrType 1 -#define _BITPOS_bleAdvPar_advConfig_peerAddrType 3 -#define _NBITS_bleAdvPar_advConfig_peerAddrType 1 -#define _BITPOS_bleAdvPar_advConfig_bStrictLenFilter 4 -#define _NBITS_bleAdvPar_advConfig_bStrictLenFilter 1 -#define _POSITION_bleAdvPar_advLen 6 -#define _TYPE_bleAdvPar_advLen uint8_t -#define _POSITION_bleAdvPar_scanRspLen 7 -#define _TYPE_bleAdvPar_scanRspLen uint8_t -#define _POSITION_bleAdvPar_pAdvData 8 -#define _TYPE_bleAdvPar_pAdvData uint8_t* -#define _POSITION_bleAdvPar_pScanRspData 12 -#define _TYPE_bleAdvPar_pScanRspData uint8_t* -#define _POSITION_bleAdvPar_pDeviceAddress 16 -#define _TYPE_bleAdvPar_pDeviceAddress uint16_t* -#define _POSITION_bleAdvPar_pWhiteList 20 -#define _TYPE_bleAdvPar_pWhiteList uint32_t* -#define _POSITION_bleAdvPar_endTrigger 27 -#define _TYPE_bleAdvPar_endTrigger uint8_t -#define _BITPOS_bleAdvPar_endTrigger_triggerType 0 -#define _NBITS_bleAdvPar_endTrigger_triggerType 4 -#define _BITPOS_bleAdvPar_endTrigger_bEnaCmd 4 -#define _NBITS_bleAdvPar_endTrigger_bEnaCmd 1 -#define _BITPOS_bleAdvPar_endTrigger_triggerNo 5 -#define _NBITS_bleAdvPar_endTrigger_triggerNo 2 -#define _BITPOS_bleAdvPar_endTrigger_pastTrig 7 -#define _NBITS_bleAdvPar_endTrigger_pastTrig 1 -#define _POSITION_bleAdvPar_endTime 28 -#define _TYPE_bleAdvPar_endTime ratmr_t -#define _SIZEOF_bleAdvPar 32 - -#define _POSITION_bleScannerPar_pRxQ 0 -#define _TYPE_bleScannerPar_pRxQ dataQueue_t* -#define _POSITION_bleScannerPar_rxConfig 4 -#define _TYPE_bleScannerPar_rxConfig uint8_t -#define _BITPOS_bleScannerPar_rxConfig_bAutoFlushIgnored 0 -#define _NBITS_bleScannerPar_rxConfig_bAutoFlushIgnored 1 -#define _BITPOS_bleScannerPar_rxConfig_bAutoFlushCrcErr 1 -#define _NBITS_bleScannerPar_rxConfig_bAutoFlushCrcErr 1 -#define _BITPOS_bleScannerPar_rxConfig_bAutoFlushEmpty 2 -#define _NBITS_bleScannerPar_rxConfig_bAutoFlushEmpty 1 -#define _BITPOS_bleScannerPar_rxConfig_bIncludeLenByte 3 -#define _NBITS_bleScannerPar_rxConfig_bIncludeLenByte 1 -#define _BITPOS_bleScannerPar_rxConfig_bIncludeCrc 4 -#define _NBITS_bleScannerPar_rxConfig_bIncludeCrc 1 -#define _BITPOS_bleScannerPar_rxConfig_bAppendRssi 5 -#define _NBITS_bleScannerPar_rxConfig_bAppendRssi 1 -#define _BITPOS_bleScannerPar_rxConfig_bAppendStatus 6 -#define _NBITS_bleScannerPar_rxConfig_bAppendStatus 1 -#define _BITPOS_bleScannerPar_rxConfig_bAppendTimestamp 7 -#define _NBITS_bleScannerPar_rxConfig_bAppendTimestamp 1 -#define _POSITION_bleScannerPar_scanConfig 5 -#define _TYPE_bleScannerPar_scanConfig uint8_t -#define _BITPOS_bleScannerPar_scanConfig_scanFilterPolicy 0 -#define _NBITS_bleScannerPar_scanConfig_scanFilterPolicy 1 -#define _BITPOS_bleScannerPar_scanConfig_bActiveScan 1 -#define _NBITS_bleScannerPar_scanConfig_bActiveScan 1 -#define _BITPOS_bleScannerPar_scanConfig_deviceAddrType 2 -#define _NBITS_bleScannerPar_scanConfig_deviceAddrType 1 -#define _BITPOS_bleScannerPar_scanConfig_bStrictLenFilter 4 -#define _NBITS_bleScannerPar_scanConfig_bStrictLenFilter 1 -#define _BITPOS_bleScannerPar_scanConfig_bAutoWlIgnore 5 -#define _NBITS_bleScannerPar_scanConfig_bAutoWlIgnore 1 -#define _BITPOS_bleScannerPar_scanConfig_bEndOnRpt 6 -#define _NBITS_bleScannerPar_scanConfig_bEndOnRpt 1 -#define _POSITION_bleScannerPar_randomState 6 -#define _TYPE_bleScannerPar_randomState uint16_t -#define _POSITION_bleScannerPar_backoffCount 8 -#define _TYPE_bleScannerPar_backoffCount uint16_t -#define _POSITION_bleScannerPar_backoffPar 10 -#define _TYPE_bleScannerPar_backoffPar uint8_t -#define _BITPOS_bleScannerPar_backoffPar_logUpperLimit 0 -#define _NBITS_bleScannerPar_backoffPar_logUpperLimit 4 -#define _BITPOS_bleScannerPar_backoffPar_bLastSucceeded 4 -#define _NBITS_bleScannerPar_backoffPar_bLastSucceeded 1 -#define _BITPOS_bleScannerPar_backoffPar_bLastFailed 5 -#define _NBITS_bleScannerPar_backoffPar_bLastFailed 1 -#define _POSITION_bleScannerPar_scanReqLen 11 -#define _TYPE_bleScannerPar_scanReqLen uint8_t -#define _POSITION_bleScannerPar_pScanReqData 12 -#define _TYPE_bleScannerPar_pScanReqData uint8_t* -#define _POSITION_bleScannerPar_pDeviceAddress 16 -#define _TYPE_bleScannerPar_pDeviceAddress uint16_t* -#define _POSITION_bleScannerPar_pWhiteList 20 -#define _TYPE_bleScannerPar_pWhiteList uint32_t* -#define _POSITION_bleScannerPar_timeoutTrigger 26 -#define _TYPE_bleScannerPar_timeoutTrigger uint8_t -#define _BITPOS_bleScannerPar_timeoutTrigger_triggerType 0 -#define _NBITS_bleScannerPar_timeoutTrigger_triggerType 4 -#define _BITPOS_bleScannerPar_timeoutTrigger_bEnaCmd 4 -#define _NBITS_bleScannerPar_timeoutTrigger_bEnaCmd 1 -#define _BITPOS_bleScannerPar_timeoutTrigger_triggerNo 5 -#define _NBITS_bleScannerPar_timeoutTrigger_triggerNo 2 -#define _BITPOS_bleScannerPar_timeoutTrigger_pastTrig 7 -#define _NBITS_bleScannerPar_timeoutTrigger_pastTrig 1 -#define _POSITION_bleScannerPar_endTrigger 27 -#define _TYPE_bleScannerPar_endTrigger uint8_t -#define _BITPOS_bleScannerPar_endTrigger_triggerType 0 -#define _NBITS_bleScannerPar_endTrigger_triggerType 4 -#define _BITPOS_bleScannerPar_endTrigger_bEnaCmd 4 -#define _NBITS_bleScannerPar_endTrigger_bEnaCmd 1 -#define _BITPOS_bleScannerPar_endTrigger_triggerNo 5 -#define _NBITS_bleScannerPar_endTrigger_triggerNo 2 -#define _BITPOS_bleScannerPar_endTrigger_pastTrig 7 -#define _NBITS_bleScannerPar_endTrigger_pastTrig 1 -#define _POSITION_bleScannerPar_timeoutTime 28 -#define _TYPE_bleScannerPar_timeoutTime ratmr_t -#define _POSITION_bleScannerPar_endTime 32 -#define _TYPE_bleScannerPar_endTime ratmr_t -#define _SIZEOF_bleScannerPar 36 - -#define _POSITION_bleInitiatorPar_pRxQ 0 -#define _TYPE_bleInitiatorPar_pRxQ dataQueue_t* -#define _POSITION_bleInitiatorPar_rxConfig 4 -#define _TYPE_bleInitiatorPar_rxConfig uint8_t -#define _BITPOS_bleInitiatorPar_rxConfig_bAutoFlushIgnored 0 -#define _NBITS_bleInitiatorPar_rxConfig_bAutoFlushIgnored 1 -#define _BITPOS_bleInitiatorPar_rxConfig_bAutoFlushCrcErr 1 -#define _NBITS_bleInitiatorPar_rxConfig_bAutoFlushCrcErr 1 -#define _BITPOS_bleInitiatorPar_rxConfig_bAutoFlushEmpty 2 -#define _NBITS_bleInitiatorPar_rxConfig_bAutoFlushEmpty 1 -#define _BITPOS_bleInitiatorPar_rxConfig_bIncludeLenByte 3 -#define _NBITS_bleInitiatorPar_rxConfig_bIncludeLenByte 1 -#define _BITPOS_bleInitiatorPar_rxConfig_bIncludeCrc 4 -#define _NBITS_bleInitiatorPar_rxConfig_bIncludeCrc 1 -#define _BITPOS_bleInitiatorPar_rxConfig_bAppendRssi 5 -#define _NBITS_bleInitiatorPar_rxConfig_bAppendRssi 1 -#define _BITPOS_bleInitiatorPar_rxConfig_bAppendStatus 6 -#define _NBITS_bleInitiatorPar_rxConfig_bAppendStatus 1 -#define _BITPOS_bleInitiatorPar_rxConfig_bAppendTimestamp 7 -#define _NBITS_bleInitiatorPar_rxConfig_bAppendTimestamp 1 -#define _POSITION_bleInitiatorPar_initConfig 5 -#define _TYPE_bleInitiatorPar_initConfig uint8_t -#define _BITPOS_bleInitiatorPar_initConfig_bUseWhiteList 0 -#define _NBITS_bleInitiatorPar_initConfig_bUseWhiteList 1 -#define _BITPOS_bleInitiatorPar_initConfig_bDynamicWinOffset 1 -#define _NBITS_bleInitiatorPar_initConfig_bDynamicWinOffset 1 -#define _BITPOS_bleInitiatorPar_initConfig_deviceAddrType 2 -#define _NBITS_bleInitiatorPar_initConfig_deviceAddrType 1 -#define _BITPOS_bleInitiatorPar_initConfig_peerAddrType 3 -#define _NBITS_bleInitiatorPar_initConfig_peerAddrType 1 -#define _BITPOS_bleInitiatorPar_initConfig_bStrictLenFilter 4 -#define _NBITS_bleInitiatorPar_initConfig_bStrictLenFilter 1 -#define _POSITION_bleInitiatorPar_connectReqLen 7 -#define _TYPE_bleInitiatorPar_connectReqLen uint8_t -#define _POSITION_bleInitiatorPar_pConnectReqData 8 -#define _TYPE_bleInitiatorPar_pConnectReqData uint8_t* -#define _POSITION_bleInitiatorPar_pDeviceAddress 12 -#define _TYPE_bleInitiatorPar_pDeviceAddress uint16_t* -#define _POSITION_bleInitiatorPar_pWhiteList 16 -#define _TYPE_bleInitiatorPar_pWhiteList uint32_t* -#define _POSITION_bleInitiatorPar_connectTime 20 -#define _TYPE_bleInitiatorPar_connectTime ratmr_t -#define _POSITION_bleInitiatorPar_timeoutTrigger 26 -#define _TYPE_bleInitiatorPar_timeoutTrigger uint8_t -#define _BITPOS_bleInitiatorPar_timeoutTrigger_triggerType 0 -#define _NBITS_bleInitiatorPar_timeoutTrigger_triggerType 4 -#define _BITPOS_bleInitiatorPar_timeoutTrigger_bEnaCmd 4 -#define _NBITS_bleInitiatorPar_timeoutTrigger_bEnaCmd 1 -#define _BITPOS_bleInitiatorPar_timeoutTrigger_triggerNo 5 -#define _NBITS_bleInitiatorPar_timeoutTrigger_triggerNo 2 -#define _BITPOS_bleInitiatorPar_timeoutTrigger_pastTrig 7 -#define _NBITS_bleInitiatorPar_timeoutTrigger_pastTrig 1 -#define _POSITION_bleInitiatorPar_endTrigger 27 -#define _TYPE_bleInitiatorPar_endTrigger uint8_t -#define _BITPOS_bleInitiatorPar_endTrigger_triggerType 0 -#define _NBITS_bleInitiatorPar_endTrigger_triggerType 4 -#define _BITPOS_bleInitiatorPar_endTrigger_bEnaCmd 4 -#define _NBITS_bleInitiatorPar_endTrigger_bEnaCmd 1 -#define _BITPOS_bleInitiatorPar_endTrigger_triggerNo 5 -#define _NBITS_bleInitiatorPar_endTrigger_triggerNo 2 -#define _BITPOS_bleInitiatorPar_endTrigger_pastTrig 7 -#define _NBITS_bleInitiatorPar_endTrigger_pastTrig 1 -#define _POSITION_bleInitiatorPar_timeoutTime 28 -#define _TYPE_bleInitiatorPar_timeoutTime ratmr_t -#define _POSITION_bleInitiatorPar_endTime 32 -#define _TYPE_bleInitiatorPar_endTime ratmr_t -#define _SIZEOF_bleInitiatorPar 36 - -#define _POSITION_bleGenericRxPar_pRxQ 0 -#define _TYPE_bleGenericRxPar_pRxQ dataQueue_t* -#define _POSITION_bleGenericRxPar_rxConfig 4 -#define _TYPE_bleGenericRxPar_rxConfig uint8_t -#define _BITPOS_bleGenericRxPar_rxConfig_bAutoFlushIgnored 0 -#define _NBITS_bleGenericRxPar_rxConfig_bAutoFlushIgnored 1 -#define _BITPOS_bleGenericRxPar_rxConfig_bAutoFlushCrcErr 1 -#define _NBITS_bleGenericRxPar_rxConfig_bAutoFlushCrcErr 1 -#define _BITPOS_bleGenericRxPar_rxConfig_bAutoFlushEmpty 2 -#define _NBITS_bleGenericRxPar_rxConfig_bAutoFlushEmpty 1 -#define _BITPOS_bleGenericRxPar_rxConfig_bIncludeLenByte 3 -#define _NBITS_bleGenericRxPar_rxConfig_bIncludeLenByte 1 -#define _BITPOS_bleGenericRxPar_rxConfig_bIncludeCrc 4 -#define _NBITS_bleGenericRxPar_rxConfig_bIncludeCrc 1 -#define _BITPOS_bleGenericRxPar_rxConfig_bAppendRssi 5 -#define _NBITS_bleGenericRxPar_rxConfig_bAppendRssi 1 -#define _BITPOS_bleGenericRxPar_rxConfig_bAppendStatus 6 -#define _NBITS_bleGenericRxPar_rxConfig_bAppendStatus 1 -#define _BITPOS_bleGenericRxPar_rxConfig_bAppendTimestamp 7 -#define _NBITS_bleGenericRxPar_rxConfig_bAppendTimestamp 1 -#define _POSITION_bleGenericRxPar_bRepeat 5 -#define _TYPE_bleGenericRxPar_bRepeat uint8_t -#define _POSITION_bleGenericRxPar_accessAddress 8 -#define _TYPE_bleGenericRxPar_accessAddress uint32_t -#define _POSITION_bleGenericRxPar_crcInit0 12 -#define _TYPE_bleGenericRxPar_crcInit0 uint8_t -#define _POSITION_bleGenericRxPar_crcInit1 13 -#define _TYPE_bleGenericRxPar_crcInit1 uint8_t -#define _POSITION_bleGenericRxPar_crcInit2 14 -#define _TYPE_bleGenericRxPar_crcInit2 uint8_t -#define _POSITION_bleGenericRxPar_crcInit 12 -#define _TYPE_bleGenericRxPar_crcInit uint32_t -#define _POSITION_bleGenericRxPar_endTrigger 15 -#define _TYPE_bleGenericRxPar_endTrigger uint8_t -#define _BITPOS_bleGenericRxPar_endTrigger_triggerType 0 -#define _NBITS_bleGenericRxPar_endTrigger_triggerType 4 -#define _BITPOS_bleGenericRxPar_endTrigger_bEnaCmd 4 -#define _NBITS_bleGenericRxPar_endTrigger_bEnaCmd 1 -#define _BITPOS_bleGenericRxPar_endTrigger_triggerNo 5 -#define _NBITS_bleGenericRxPar_endTrigger_triggerNo 2 -#define _BITPOS_bleGenericRxPar_endTrigger_pastTrig 7 -#define _NBITS_bleGenericRxPar_endTrigger_pastTrig 1 -#define _POSITION_bleGenericRxPar_endTime 16 -#define _TYPE_bleGenericRxPar_endTime ratmr_t -#define _SIZEOF_bleGenericRxPar 20 - -#define _POSITION_bleTxTestPar_numPackets 0 -#define _TYPE_bleTxTestPar_numPackets uint16_t -#define _POSITION_bleTxTestPar_payloadLength 2 -#define _TYPE_bleTxTestPar_payloadLength uint8_t -#define _POSITION_bleTxTestPar_packetType 3 -#define _TYPE_bleTxTestPar_packetType uint8_t -#define _POSITION_bleTxTestPar_period 4 -#define _TYPE_bleTxTestPar_period ratmr_t -#define _POSITION_bleTxTestPar_config 8 -#define _TYPE_bleTxTestPar_config uint8_t -#define _BITPOS_bleTxTestPar_config_bOverrideDefault 0 -#define _NBITS_bleTxTestPar_config_bOverrideDefault 1 -#define _BITPOS_bleTxTestPar_config_bUsePrbs9 1 -#define _NBITS_bleTxTestPar_config_bUsePrbs9 1 -#define _BITPOS_bleTxTestPar_config_bUsePrbs15 2 -#define _NBITS_bleTxTestPar_config_bUsePrbs15 1 -#define _POSITION_bleTxTestPar_byteVal 9 -#define _TYPE_bleTxTestPar_byteVal uint8_t -#define _POSITION_bleTxTestPar_endTrigger 11 -#define _TYPE_bleTxTestPar_endTrigger uint8_t -#define _BITPOS_bleTxTestPar_endTrigger_triggerType 0 -#define _NBITS_bleTxTestPar_endTrigger_triggerType 4 -#define _BITPOS_bleTxTestPar_endTrigger_bEnaCmd 4 -#define _NBITS_bleTxTestPar_endTrigger_bEnaCmd 1 -#define _BITPOS_bleTxTestPar_endTrigger_triggerNo 5 -#define _NBITS_bleTxTestPar_endTrigger_triggerNo 2 -#define _BITPOS_bleTxTestPar_endTrigger_pastTrig 7 -#define _NBITS_bleTxTestPar_endTrigger_pastTrig 1 -#define _POSITION_bleTxTestPar_endTime 12 -#define _TYPE_bleTxTestPar_endTime ratmr_t -#define _SIZEOF_bleTxTestPar 16 - -#define _POSITION_bleMasterSlaveOutput_nTx 0 -#define _TYPE_bleMasterSlaveOutput_nTx uint8_t -#define _POSITION_bleMasterSlaveOutput_nTxAck 1 -#define _TYPE_bleMasterSlaveOutput_nTxAck uint8_t -#define _POSITION_bleMasterSlaveOutput_nTxCtrl 2 -#define _TYPE_bleMasterSlaveOutput_nTxCtrl uint8_t -#define _POSITION_bleMasterSlaveOutput_nTxCtrlAck 3 -#define _TYPE_bleMasterSlaveOutput_nTxCtrlAck uint8_t -#define _POSITION_bleMasterSlaveOutput_nTxCtrlAckAck 4 -#define _TYPE_bleMasterSlaveOutput_nTxCtrlAckAck uint8_t -#define _POSITION_bleMasterSlaveOutput_nTxRetrans 5 -#define _TYPE_bleMasterSlaveOutput_nTxRetrans uint8_t -#define _POSITION_bleMasterSlaveOutput_nTxEntryDone 6 -#define _TYPE_bleMasterSlaveOutput_nTxEntryDone uint8_t -#define _POSITION_bleMasterSlaveOutput_nRxOk 7 -#define _TYPE_bleMasterSlaveOutput_nRxOk uint8_t -#define _POSITION_bleMasterSlaveOutput_nRxCtrl 8 -#define _TYPE_bleMasterSlaveOutput_nRxCtrl uint8_t -#define _POSITION_bleMasterSlaveOutput_nRxCtrlAck 9 -#define _TYPE_bleMasterSlaveOutput_nRxCtrlAck uint8_t -#define _POSITION_bleMasterSlaveOutput_nRxNok 10 -#define _TYPE_bleMasterSlaveOutput_nRxNok uint8_t -#define _POSITION_bleMasterSlaveOutput_nRxIgnored 11 -#define _TYPE_bleMasterSlaveOutput_nRxIgnored uint8_t -#define _POSITION_bleMasterSlaveOutput_nRxEmpty 12 -#define _TYPE_bleMasterSlaveOutput_nRxEmpty uint8_t -#define _POSITION_bleMasterSlaveOutput_nRxBufFull 13 -#define _TYPE_bleMasterSlaveOutput_nRxBufFull uint8_t -#define _POSITION_bleMasterSlaveOutput_lastRssi 14 -#define _TYPE_bleMasterSlaveOutput_lastRssi int8_t -#define _POSITION_bleMasterSlaveOutput_pktStatus 15 -#define _TYPE_bleMasterSlaveOutput_pktStatus uint8_t -#define _BITPOS_bleMasterSlaveOutput_pktStatus_bTimeStampValid 0 -#define _NBITS_bleMasterSlaveOutput_pktStatus_bTimeStampValid 1 -#define _BITPOS_bleMasterSlaveOutput_pktStatus_bLastCrcErr 1 -#define _NBITS_bleMasterSlaveOutput_pktStatus_bLastCrcErr 1 -#define _BITPOS_bleMasterSlaveOutput_pktStatus_bLastIgnored 2 -#define _NBITS_bleMasterSlaveOutput_pktStatus_bLastIgnored 1 -#define _BITPOS_bleMasterSlaveOutput_pktStatus_bLastEmpty 3 -#define _NBITS_bleMasterSlaveOutput_pktStatus_bLastEmpty 1 -#define _BITPOS_bleMasterSlaveOutput_pktStatus_bLastCtrl 4 -#define _NBITS_bleMasterSlaveOutput_pktStatus_bLastCtrl 1 -#define _BITPOS_bleMasterSlaveOutput_pktStatus_bLastMd 5 -#define _NBITS_bleMasterSlaveOutput_pktStatus_bLastMd 1 -#define _BITPOS_bleMasterSlaveOutput_pktStatus_bLastAck 6 -#define _NBITS_bleMasterSlaveOutput_pktStatus_bLastAck 1 -#define _POSITION_bleMasterSlaveOutput_timeStamp 16 -#define _TYPE_bleMasterSlaveOutput_timeStamp ratmr_t -#define _SIZEOF_bleMasterSlaveOutput 20 - -#define _POSITION_bleAdvOutput_nTxAdvInd 0 -#define _TYPE_bleAdvOutput_nTxAdvInd uint16_t -#define _POSITION_bleAdvOutput_nTxScanRsp 2 -#define _TYPE_bleAdvOutput_nTxScanRsp uint8_t -#define _POSITION_bleAdvOutput_nRxScanReq 3 -#define _TYPE_bleAdvOutput_nRxScanReq uint8_t -#define _POSITION_bleAdvOutput_nRxConnectReq 4 -#define _TYPE_bleAdvOutput_nRxConnectReq uint8_t -#define _POSITION_bleAdvOutput_nRxNok 6 -#define _TYPE_bleAdvOutput_nRxNok uint16_t -#define _POSITION_bleAdvOutput_nRxIgnored 8 -#define _TYPE_bleAdvOutput_nRxIgnored uint16_t -#define _POSITION_bleAdvOutput_nRxBufFull 10 -#define _TYPE_bleAdvOutput_nRxBufFull uint8_t -#define _POSITION_bleAdvOutput_lastRssi 11 -#define _TYPE_bleAdvOutput_lastRssi int8_t -#define _POSITION_bleAdvOutput_timeStamp 12 -#define _TYPE_bleAdvOutput_timeStamp ratmr_t -#define _SIZEOF_bleAdvOutput 16 - -#define _POSITION_bleScannerOutput_nTxScanReq 0 -#define _TYPE_bleScannerOutput_nTxScanReq uint16_t -#define _POSITION_bleScannerOutput_nBackedOffScanReq 2 -#define _TYPE_bleScannerOutput_nBackedOffScanReq uint16_t -#define _POSITION_bleScannerOutput_nRxAdvOk 4 -#define _TYPE_bleScannerOutput_nRxAdvOk uint16_t -#define _POSITION_bleScannerOutput_nRxAdvIgnored 6 -#define _TYPE_bleScannerOutput_nRxAdvIgnored uint16_t -#define _POSITION_bleScannerOutput_nRxAdvNok 8 -#define _TYPE_bleScannerOutput_nRxAdvNok uint16_t -#define _POSITION_bleScannerOutput_nRxScanRspOk 10 -#define _TYPE_bleScannerOutput_nRxScanRspOk uint16_t -#define _POSITION_bleScannerOutput_nRxScanRspIgnored 12 -#define _TYPE_bleScannerOutput_nRxScanRspIgnored uint16_t -#define _POSITION_bleScannerOutput_nRxScanRspNok 14 -#define _TYPE_bleScannerOutput_nRxScanRspNok uint16_t -#define _POSITION_bleScannerOutput_nRxAdvBufFull 16 -#define _TYPE_bleScannerOutput_nRxAdvBufFull uint8_t -#define _POSITION_bleScannerOutput_nRxScanRspBufFull 17 -#define _TYPE_bleScannerOutput_nRxScanRspBufFull uint8_t -#define _POSITION_bleScannerOutput_lastRssi 18 -#define _TYPE_bleScannerOutput_lastRssi int8_t -#define _POSITION_bleScannerOutput_timeStamp 20 -#define _TYPE_bleScannerOutput_timeStamp ratmr_t -#define _SIZEOF_bleScannerOutput 24 - -#define _POSITION_bleInitiatorOutput_nTxConnectReq 0 -#define _TYPE_bleInitiatorOutput_nTxConnectReq uint8_t -#define _POSITION_bleInitiatorOutput_nRxAdvOk 1 -#define _TYPE_bleInitiatorOutput_nRxAdvOk uint8_t -#define _POSITION_bleInitiatorOutput_nRxAdvIgnored 2 -#define _TYPE_bleInitiatorOutput_nRxAdvIgnored uint16_t -#define _POSITION_bleInitiatorOutput_nRxAdvNok 4 -#define _TYPE_bleInitiatorOutput_nRxAdvNok uint16_t -#define _POSITION_bleInitiatorOutput_nRxAdvBufFull 6 -#define _TYPE_bleInitiatorOutput_nRxAdvBufFull uint8_t -#define _POSITION_bleInitiatorOutput_lastRssi 7 -#define _TYPE_bleInitiatorOutput_lastRssi int8_t -#define _POSITION_bleInitiatorOutput_timeStamp 8 -#define _TYPE_bleInitiatorOutput_timeStamp ratmr_t -#define _SIZEOF_bleInitiatorOutput 12 - -#define _POSITION_bleGenericRxOutput_nRxOk 0 -#define _TYPE_bleGenericRxOutput_nRxOk uint16_t -#define _POSITION_bleGenericRxOutput_nRxNok 2 -#define _TYPE_bleGenericRxOutput_nRxNok uint16_t -#define _POSITION_bleGenericRxOutput_nRxBufFull 4 -#define _TYPE_bleGenericRxOutput_nRxBufFull uint16_t -#define _POSITION_bleGenericRxOutput_lastRssi 6 -#define _TYPE_bleGenericRxOutput_lastRssi int8_t -#define _POSITION_bleGenericRxOutput_timeStamp 8 -#define _TYPE_bleGenericRxOutput_timeStamp ratmr_t -#define _SIZEOF_bleGenericRxOutput 12 - -#define _POSITION_bleTxTestOutput_nTx 0 -#define _TYPE_bleTxTestOutput_nTx uint16_t -#define _SIZEOF_bleTxTestOutput 2 - -#define _POSITION_bleWhiteListEntry_size 0 -#define _TYPE_bleWhiteListEntry_size uint8_t -#define _POSITION_bleWhiteListEntry_conf 1 -#define _TYPE_bleWhiteListEntry_conf uint8_t -#define _BITPOS_bleWhiteListEntry_conf_bEnable 0 -#define _NBITS_bleWhiteListEntry_conf_bEnable 1 -#define _BITPOS_bleWhiteListEntry_conf_addrType 1 -#define _NBITS_bleWhiteListEntry_conf_addrType 1 -#define _BITPOS_bleWhiteListEntry_conf_bWlIgn 2 -#define _NBITS_bleWhiteListEntry_conf_bWlIgn 1 -#define _POSITION_bleWhiteListEntry_address 2 -#define _TYPE_bleWhiteListEntry_address uint16_t -#define _POSITION_bleWhiteListEntry_addressHi 4 -#define _TYPE_bleWhiteListEntry_addressHi uint32_t -#define _SIZEOF_bleWhiteListEntry 8 - -#define _POSITION_bleRxStatus_status 0 -#define _TYPE_bleRxStatus_status uint8_t -#define _BITPOS_bleRxStatus_status_channel 0 -#define _NBITS_bleRxStatus_status_channel 6 -#define _BITPOS_bleRxStatus_status_bIgnore 6 -#define _NBITS_bleRxStatus_status_bIgnore 1 -#define _BITPOS_bleRxStatus_status_bCrcErr 7 -#define _NBITS_bleRxStatus_status_bCrcErr 1 -#define _SIZEOF_bleRxStatus 1 - -#endif diff --git a/cpu/cc26xx/dev/rfc-api/common_cmd_field.h b/cpu/cc26xx/dev/rfc-api/common_cmd_field.h deleted file mode 100755 index d9e9431f6..000000000 --- a/cpu/cc26xx/dev/rfc-api/common_cmd_field.h +++ /dev/null @@ -1,448 +0,0 @@ -/****************************************************************************** -* Filename: common_cmd_field.h -* Revised: $ $ -* Revision: $ $ -* -* Description: CC26xx API for common/generic commands -* -* Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ -* -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* -* Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* -* Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* -* Neither the name of Texas Instruments Incorporated nor the names of -* its contributors may be used to endorse or promote products derived -* from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -******************************************************************************/ - -#ifndef __COMMON_CMD_FIELD_H -#define __COMMON_CMD_FIELD_H - -#include -#include "mailbox.h" - -#define _POSITION_command_commandNo 0 -#define _TYPE_command_commandNo uint16_t -#define _SIZEOF_command 2 - -#define _POSITION_radioOp_commandNo 0 -#define _TYPE_radioOp_commandNo uint16_t -#define _POSITION_radioOp_status 2 -#define _TYPE_radioOp_status uint16_t -#define _POSITION_radioOp_pNextOp 4 -#define _TYPE_radioOp_pNextOp uint8_t* -#define _POSITION_radioOp_startTime 8 -#define _TYPE_radioOp_startTime ratmr_t -#define _POSITION_radioOp_startTrigger 12 -#define _TYPE_radioOp_startTrigger uint8_t -#define _BITPOS_radioOp_startTrigger_triggerType 0 -#define _NBITS_radioOp_startTrigger_triggerType 4 -#define _BITPOS_radioOp_startTrigger_bEnaCmd 4 -#define _NBITS_radioOp_startTrigger_bEnaCmd 1 -#define _BITPOS_radioOp_startTrigger_triggerNo 5 -#define _NBITS_radioOp_startTrigger_triggerNo 2 -#define _BITPOS_radioOp_startTrigger_pastTrig 7 -#define _NBITS_radioOp_startTrigger_pastTrig 1 -#define _POSITION_radioOp_condition 13 -#define _TYPE_radioOp_condition uint8_t -#define _BITPOS_radioOp_condition_rule 0 -#define _NBITS_radioOp_condition_rule 4 -#define _BITPOS_radioOp_condition_nSkip 4 -#define _NBITS_radioOp_condition_nSkip 4 -#define _SIZEOF_radioOp 14 - -#define _SIZEOF_CMD_NOP 14 - -#define _POSITION_CMD_RADIO_SETUP_mode 14 -#define _TYPE_CMD_RADIO_SETUP_mode uint8_t -#define _POSITION_CMD_RADIO_SETUP_config 16 -#define _TYPE_CMD_RADIO_SETUP_config uint16_t -#define _BITPOS_CMD_RADIO_SETUP_config_frontEndMode 0 -#define _NBITS_CMD_RADIO_SETUP_config_frontEndMode 3 -#define _BITPOS_CMD_RADIO_SETUP_config_biasMode 3 -#define _NBITS_CMD_RADIO_SETUP_config_biasMode 1 -#define _BITPOS_CMD_RADIO_SETUP_config_bNoAdi0Setup 4 -#define _NBITS_CMD_RADIO_SETUP_config_bNoAdi0Setup 1 -#define _BITPOS_CMD_RADIO_SETUP_config_bNoAdi0Trim 5 -#define _NBITS_CMD_RADIO_SETUP_config_bNoAdi0Trim 1 -#define _BITPOS_CMD_RADIO_SETUP_config_bNoAdi0Ovr 6 -#define _NBITS_CMD_RADIO_SETUP_config_bNoAdi0Ovr 1 -#define _BITPOS_CMD_RADIO_SETUP_config_bNoAdi1Setup 7 -#define _NBITS_CMD_RADIO_SETUP_config_bNoAdi1Setup 1 -#define _BITPOS_CMD_RADIO_SETUP_config_bNoAdi1Trim 8 -#define _NBITS_CMD_RADIO_SETUP_config_bNoAdi1Trim 1 -#define _BITPOS_CMD_RADIO_SETUP_config_bNoAdi1Ovr 9 -#define _NBITS_CMD_RADIO_SETUP_config_bNoAdi1Ovr 1 -#define _BITPOS_CMD_RADIO_SETUP_config_bNoFsPowerUp 10 -#define _NBITS_CMD_RADIO_SETUP_config_bNoFsPowerUp 1 -#define _POSITION_CMD_RADIO_SETUP_txPower 18 -#define _TYPE_CMD_RADIO_SETUP_txPower uint16_t -#define _BITPOS_CMD_RADIO_SETUP_txPower_IB 0 -#define _NBITS_CMD_RADIO_SETUP_txPower_IB 6 -#define _BITPOS_CMD_RADIO_SETUP_txPower_GC 6 -#define _NBITS_CMD_RADIO_SETUP_txPower_GC 2 -#define _BITPOS_CMD_RADIO_SETUP_txPower_tempCoeff 8 -#define _NBITS_CMD_RADIO_SETUP_txPower_tempCoeff 8 -#define _POSITION_CMD_RADIO_SETUP_pRegOverride 20 -#define _TYPE_CMD_RADIO_SETUP_pRegOverride uint32_t* -#define _SIZEOF_CMD_RADIO_SETUP 24 - -#define _POSITION_CMD_FS_frequency 14 -#define _TYPE_CMD_FS_frequency uint16_t -#define _POSITION_CMD_FS_fractFreq 16 -#define _TYPE_CMD_FS_fractFreq uint16_t -#define _POSITION_CMD_FS_synthConf 18 -#define _TYPE_CMD_FS_synthConf uint8_t -#define _BITPOS_CMD_FS_synthConf_bTxMode 0 -#define _NBITS_CMD_FS_synthConf_bTxMode 1 -#define _BITPOS_CMD_FS_synthConf_refFreq 1 -#define _NBITS_CMD_FS_synthConf_refFreq 6 -#define _POSITION_CMD_FS_calibConf 19 -#define _TYPE_CMD_FS_calibConf uint8_t -#define _BITPOS_CMD_FS_calibConf_bOverrideCalib 0 -#define _NBITS_CMD_FS_calibConf_bOverrideCalib 1 -#define _BITPOS_CMD_FS_calibConf_bSkipTdcCalib 1 -#define _NBITS_CMD_FS_calibConf_bSkipTdcCalib 1 -#define _BITPOS_CMD_FS_calibConf_bSkipCoarseCalib 2 -#define _NBITS_CMD_FS_calibConf_bSkipCoarseCalib 1 -#define _BITPOS_CMD_FS_calibConf_bSkipMidCalib 3 -#define _NBITS_CMD_FS_calibConf_bSkipMidCalib 1 -#define _BITPOS_CMD_FS_calibConf_coarsePrecal 4 -#define _NBITS_CMD_FS_calibConf_coarsePrecal 4 -#define _POSITION_CMD_FS_midPrecal 20 -#define _TYPE_CMD_FS_midPrecal uint8_t -#define _POSITION_CMD_FS_ktPrecal 21 -#define _TYPE_CMD_FS_ktPrecal uint8_t -#define _POSITION_CMD_FS_tdcPrecal 22 -#define _TYPE_CMD_FS_tdcPrecal uint16_t -#define _SIZEOF_CMD_FS 24 - -#define _SIZEOF_CMD_FS_OFF 14 - -#define _POSITION_CMD_RX_pktConfig 14 -#define _TYPE_CMD_RX_pktConfig uint16_t -#define _BITPOS_CMD_RX_pktConfig_endianness 0 -#define _NBITS_CMD_RX_pktConfig_endianness 1 -#define _BITPOS_CMD_RX_pktConfig_numHdrBits 1 -#define _NBITS_CMD_RX_pktConfig_numHdrBits 6 -#define _BITPOS_CMD_RX_pktConfig_bFsOff 7 -#define _NBITS_CMD_RX_pktConfig_bFsOff 1 -#define _BITPOS_CMD_RX_pktConfig_bUseCrc 8 -#define _NBITS_CMD_RX_pktConfig_bUseCrc 1 -#define _BITPOS_CMD_RX_pktConfig_bCrcIncSw 9 -#define _NBITS_CMD_RX_pktConfig_bCrcIncSw 1 -#define _BITPOS_CMD_RX_pktConfig_bCrcIncHdr 10 -#define _NBITS_CMD_RX_pktConfig_bCrcIncHdr 1 -#define _BITPOS_CMD_RX_pktConfig_bReportCrc 11 -#define _NBITS_CMD_RX_pktConfig_bReportCrc 1 -#define _BITPOS_CMD_RX_pktConfig_endType 12 -#define _NBITS_CMD_RX_pktConfig_endType 1 -#define _BITPOS_CMD_RX_pktConfig_bDualSw 13 -#define _NBITS_CMD_RX_pktConfig_bDualSw 1 -#define _POSITION_CMD_RX_syncWord 16 -#define _TYPE_CMD_RX_syncWord uint32_t -#define _POSITION_CMD_RX_syncWord2 20 -#define _TYPE_CMD_RX_syncWord2 uint32_t -#define _POSITION_CMD_RX_lenConfig 24 -#define _TYPE_CMD_RX_lenConfig uint16_t -#define _BITPOS_CMD_RX_lenConfig_numLenBits 0 -#define _NBITS_CMD_RX_lenConfig_numLenBits 4 -#define _BITPOS_CMD_RX_lenConfig_lenFieldPos 4 -#define _NBITS_CMD_RX_lenConfig_lenFieldPos 5 -#define _BITPOS_CMD_RX_lenConfig_lenOffset 9 -#define _NBITS_CMD_RX_lenConfig_lenOffset 7 -#define _POSITION_CMD_RX_maxLen 26 -#define _TYPE_CMD_RX_maxLen uint16_t -#define _POSITION_CMD_RX_pRecPkt 28 -#define _TYPE_CMD_RX_pRecPkt uint8_t* -#define _POSITION_CMD_RX_endTime 32 -#define _TYPE_CMD_RX_endTime ratmr_t -#define _POSITION_CMD_RX_endTrigger 36 -#define _TYPE_CMD_RX_endTrigger uint8_t -#define _BITPOS_CMD_RX_endTrigger_triggerType 0 -#define _NBITS_CMD_RX_endTrigger_triggerType 4 -#define _BITPOS_CMD_RX_endTrigger_bEnaCmd 4 -#define _NBITS_CMD_RX_endTrigger_bEnaCmd 1 -#define _BITPOS_CMD_RX_endTrigger_triggerNo 5 -#define _NBITS_CMD_RX_endTrigger_triggerNo 2 -#define _BITPOS_CMD_RX_endTrigger_pastTrig 7 -#define _NBITS_CMD_RX_endTrigger_pastTrig 1 -#define _POSITION_CMD_RX_rssi 37 -#define _TYPE_CMD_RX_rssi int8_t -#define _POSITION_CMD_RX_recLen 38 -#define _TYPE_CMD_RX_recLen uint16_t -#define _POSITION_CMD_RX_timeStamp 40 -#define _TYPE_CMD_RX_timeStamp ratmr_t -#define _POSITION_CMD_RX_nRxOk 44 -#define _TYPE_CMD_RX_nRxOk uint16_t -#define _POSITION_CMD_RX_nRxNok 46 -#define _TYPE_CMD_RX_nRxNok uint16_t -#define _POSITION_CMD_RX_nRx2Ok 48 -#define _TYPE_CMD_RX_nRx2Ok uint16_t -#define _POSITION_CMD_RX_nRx2Nok 50 -#define _TYPE_CMD_RX_nRx2Nok uint16_t -#define _SIZEOF_CMD_RX 52 - -#define _POSITION_CMD_TX_pktConfig 14 -#define _TYPE_CMD_TX_pktConfig uint16_t -#define _BITPOS_CMD_TX_pktConfig_endianness 0 -#define _NBITS_CMD_TX_pktConfig_endianness 1 -#define _BITPOS_CMD_TX_pktConfig_numHdrBits 1 -#define _NBITS_CMD_TX_pktConfig_numHdrBits 6 -#define _BITPOS_CMD_TX_pktConfig_bFsOff 7 -#define _NBITS_CMD_TX_pktConfig_bFsOff 1 -#define _BITPOS_CMD_TX_pktConfig_bUseCrc 8 -#define _NBITS_CMD_TX_pktConfig_bUseCrc 1 -#define _BITPOS_CMD_TX_pktConfig_bCrcIncSw 9 -#define _NBITS_CMD_TX_pktConfig_bCrcIncSw 1 -#define _BITPOS_CMD_TX_pktConfig_bCrcIncHdr 10 -#define _NBITS_CMD_TX_pktConfig_bCrcIncHdr 1 -#define _POSITION_CMD_TX_syncWord 16 -#define _TYPE_CMD_TX_syncWord uint32_t -#define _POSITION_CMD_TX_pTxPkt 20 -#define _TYPE_CMD_TX_pTxPkt uint8_t* -#define _POSITION_CMD_TX_pktLen 24 -#define _TYPE_CMD_TX_pktLen uint16_t -#define _SIZEOF_CMD_TX 26 - -#define _POSITION_CMD_RX_TEST_config 14 -#define _TYPE_CMD_RX_TEST_config uint8_t -#define _BITPOS_CMD_RX_TEST_config_bEnaFifo 0 -#define _NBITS_CMD_RX_TEST_config_bEnaFifo 1 -#define _BITPOS_CMD_RX_TEST_config_bFsOff 1 -#define _NBITS_CMD_RX_TEST_config_bFsOff 1 -#define _BITPOS_CMD_RX_TEST_config_bNoSync 2 -#define _NBITS_CMD_RX_TEST_config_bNoSync 1 -#define _POSITION_CMD_RX_TEST_endTrigger 15 -#define _TYPE_CMD_RX_TEST_endTrigger uint8_t -#define _BITPOS_CMD_RX_TEST_endTrigger_triggerType 0 -#define _NBITS_CMD_RX_TEST_endTrigger_triggerType 4 -#define _BITPOS_CMD_RX_TEST_endTrigger_bEnaCmd 4 -#define _NBITS_CMD_RX_TEST_endTrigger_bEnaCmd 1 -#define _BITPOS_CMD_RX_TEST_endTrigger_triggerNo 5 -#define _NBITS_CMD_RX_TEST_endTrigger_triggerNo 2 -#define _BITPOS_CMD_RX_TEST_endTrigger_pastTrig 7 -#define _NBITS_CMD_RX_TEST_endTrigger_pastTrig 1 -#define _POSITION_CMD_RX_TEST_syncWord 16 -#define _TYPE_CMD_RX_TEST_syncWord uint32_t -#define _POSITION_CMD_RX_TEST_endTime 20 -#define _TYPE_CMD_RX_TEST_endTime ratmr_t -#define _SIZEOF_CMD_RX_TEST 24 - -#define _POSITION_CMD_TX_TEST_config 14 -#define _TYPE_CMD_TX_TEST_config uint8_t -#define _BITPOS_CMD_TX_TEST_config_bUseCw 0 -#define _NBITS_CMD_TX_TEST_config_bUseCw 1 -#define _BITPOS_CMD_TX_TEST_config_bFsOff 1 -#define _NBITS_CMD_TX_TEST_config_bFsOff 1 -#define _BITPOS_CMD_TX_TEST_config_whitenMode 2 -#define _NBITS_CMD_TX_TEST_config_whitenMode 2 -#define _POSITION_CMD_TX_TEST_txWord 16 -#define _TYPE_CMD_TX_TEST_txWord uint16_t -#define _POSITION_CMD_TX_TEST_endTrigger 19 -#define _TYPE_CMD_TX_TEST_endTrigger uint8_t -#define _BITPOS_CMD_TX_TEST_endTrigger_triggerType 0 -#define _NBITS_CMD_TX_TEST_endTrigger_triggerType 4 -#define _BITPOS_CMD_TX_TEST_endTrigger_bEnaCmd 4 -#define _NBITS_CMD_TX_TEST_endTrigger_bEnaCmd 1 -#define _BITPOS_CMD_TX_TEST_endTrigger_triggerNo 5 -#define _NBITS_CMD_TX_TEST_endTrigger_triggerNo 2 -#define _BITPOS_CMD_TX_TEST_endTrigger_pastTrig 7 -#define _NBITS_CMD_TX_TEST_endTrigger_pastTrig 1 -#define _POSITION_CMD_TX_TEST_syncWord 20 -#define _TYPE_CMD_TX_TEST_syncWord uint32_t -#define _POSITION_CMD_TX_TEST_endTime 24 -#define _TYPE_CMD_TX_TEST_endTime ratmr_t -#define _SIZEOF_CMD_TX_TEST 28 - -#define _POSITION_CMD_SYNC_STOP_RAT_rat0 16 -#define _TYPE_CMD_SYNC_STOP_RAT_rat0 ratmr_t -#define _SIZEOF_CMD_SYNC_STOP_RAT 20 - -#define _POSITION_CMD_SYNC_START_RAT_rat0 16 -#define _TYPE_CMD_SYNC_START_RAT_rat0 ratmr_t -#define _SIZEOF_CMD_SYNC_START_RAT 20 - -#define _POSITION_CMD_COUNT_counter 14 -#define _TYPE_CMD_COUNT_counter uint16_t -#define _SIZEOF_CMD_COUNT 16 - -#define _POSITION_CMD_FS_POWERUP_pRegOverride 16 -#define _TYPE_CMD_FS_POWERUP_pRegOverride uint32_t* -#define _SIZEOF_CMD_FS_POWERUP 20 - -#define _SIZEOF_CMD_FS_POWERDOWN 14 - -#define _POSITION_CMD_SCH_IMM_cmdrVal 16 -#define _TYPE_CMD_SCH_IMM_cmdrVal uint32_t -#define _POSITION_CMD_SCH_IMM_cmdstaVal 20 -#define _TYPE_CMD_SCH_IMM_cmdstaVal uint32_t -#define _SIZEOF_CMD_SCH_IMM 24 - -#define _POSITION_CMD_COUNT_BRANCH_counter 14 -#define _TYPE_CMD_COUNT_BRANCH_counter uint16_t -#define _POSITION_CMD_COUNT_BRANCH_pNextOpIfOk 16 -#define _TYPE_CMD_COUNT_BRANCH_pNextOpIfOk uint8_t* -#define _SIZEOF_CMD_COUNT_BRANCH 20 - -#define _POSITION_CMD_PATTERN_CHECK_patternOpt 14 -#define _TYPE_CMD_PATTERN_CHECK_patternOpt uint16_t -#define _BITPOS_CMD_PATTERN_CHECK_patternOpt_operation 0 -#define _NBITS_CMD_PATTERN_CHECK_patternOpt_operation 2 -#define _BITPOS_CMD_PATTERN_CHECK_patternOpt_bByteRev 2 -#define _NBITS_CMD_PATTERN_CHECK_patternOpt_bByteRev 1 -#define _BITPOS_CMD_PATTERN_CHECK_patternOpt_bBitRev 3 -#define _NBITS_CMD_PATTERN_CHECK_patternOpt_bBitRev 1 -#define _BITPOS_CMD_PATTERN_CHECK_patternOpt_signExtend 4 -#define _NBITS_CMD_PATTERN_CHECK_patternOpt_signExtend 5 -#define _BITPOS_CMD_PATTERN_CHECK_patternOpt_bRxVal 9 -#define _NBITS_CMD_PATTERN_CHECK_patternOpt_bRxVal 1 -#define _POSITION_CMD_PATTERN_CHECK_pNextOpIfOk 16 -#define _TYPE_CMD_PATTERN_CHECK_pNextOpIfOk uint8_t* -#define _POSITION_CMD_PATTERN_CHECK_pValue 20 -#define _TYPE_CMD_PATTERN_CHECK_pValue uint8_t* -#define _POSITION_CMD_PATTERN_CHECK_mask 24 -#define _TYPE_CMD_PATTERN_CHECK_mask uint32_t -#define _POSITION_CMD_PATTERN_CHECK_compareVal 28 -#define _TYPE_CMD_PATTERN_CHECK_compareVal uint32_t -#define _SIZEOF_CMD_PATTERN_CHECK 32 - -#define _SIZEOF_CMD_ABORT 2 - -#define _SIZEOF_CMD_STOP 2 - -#define _SIZEOF_CMD_GET_RSSI 2 - -#define _POSITION_CMD_UPDATE_RADIO_SETUP_pRegOverride 4 -#define _TYPE_CMD_UPDATE_RADIO_SETUP_pRegOverride uint32_t* -#define _SIZEOF_CMD_UPDATE_RADIO_SETUP 8 - -#define _POSITION_CMD_TRIGGER_triggerNo 2 -#define _TYPE_CMD_TRIGGER_triggerNo uint8_t -#define _SIZEOF_CMD_TRIGGER 3 - -#define _POSITION_CMD_GET_FW_INFO_versionNo 2 -#define _TYPE_CMD_GET_FW_INFO_versionNo uint16_t -#define _POSITION_CMD_GET_FW_INFO_startOffset 4 -#define _TYPE_CMD_GET_FW_INFO_startOffset uint16_t -#define _POSITION_CMD_GET_FW_INFO_freeRamSz 6 -#define _TYPE_CMD_GET_FW_INFO_freeRamSz uint16_t -#define _POSITION_CMD_GET_FW_INFO_availRatCh 8 -#define _TYPE_CMD_GET_FW_INFO_availRatCh uint16_t -#define _SIZEOF_CMD_GET_FW_INFO 10 - -#define _SIZEOF_CMD_START_RAT 2 - -#define _SIZEOF_CMD_PING 2 - -#define _POSITION_CMD_ADD_DATA_ENTRY_pQueue 4 -#define _TYPE_CMD_ADD_DATA_ENTRY_pQueue dataQueue_t* -#define _POSITION_CMD_ADD_DATA_ENTRY_pEntry 8 -#define _TYPE_CMD_ADD_DATA_ENTRY_pEntry uint8_t* -#define _SIZEOF_CMD_ADD_DATA_ENTRY 12 - -#define _POSITION_CMD_REMOVE_DATA_ENTRY_pQueue 4 -#define _TYPE_CMD_REMOVE_DATA_ENTRY_pQueue dataQueue_t* -#define _POSITION_CMD_REMOVE_DATA_ENTRY_pEntry 8 -#define _TYPE_CMD_REMOVE_DATA_ENTRY_pEntry uint8_t* -#define _SIZEOF_CMD_REMOVE_DATA_ENTRY 12 - -#define _POSITION_CMD_FLUSH_QUEUE_pQueue 4 -#define _TYPE_CMD_FLUSH_QUEUE_pQueue dataQueue_t* -#define _POSITION_CMD_FLUSH_QUEUE_pFirstEntry 8 -#define _TYPE_CMD_FLUSH_QUEUE_pFirstEntry uint8_t* -#define _SIZEOF_CMD_FLUSH_QUEUE 12 - -#define _POSITION_CMD_CLEAR_RX_pQueue 4 -#define _TYPE_CMD_CLEAR_RX_pQueue dataQueue_t* -#define _SIZEOF_CMD_CLEAR_RX 8 - -#define _POSITION_CMD_REMOVE_PENDING_ENTRIES_pQueue 4 -#define _TYPE_CMD_REMOVE_PENDING_ENTRIES_pQueue dataQueue_t* -#define _POSITION_CMD_REMOVE_PENDING_ENTRIES_pFirstEntry 8 -#define _TYPE_CMD_REMOVE_PENDING_ENTRIES_pFirstEntry uint8_t* -#define _SIZEOF_CMD_REMOVE_PENDING_ENTRIES 12 - -#define _POSITION_CMD_SET_RAT_CMP_ratCh 2 -#define _TYPE_CMD_SET_RAT_CMP_ratCh uint8_t -#define _POSITION_CMD_SET_RAT_CMP_compareTime 4 -#define _TYPE_CMD_SET_RAT_CMP_compareTime ratmr_t -#define _SIZEOF_CMD_SET_RAT_CMP 8 - -#define _POSITION_CMD_SET_RAT_CPT_config 2 -#define _TYPE_CMD_SET_RAT_CPT_config uint16_t -#define _BITPOS_CMD_SET_RAT_CPT_config_inputSrc 3 -#define _NBITS_CMD_SET_RAT_CPT_config_inputSrc 5 -#define _BITPOS_CMD_SET_RAT_CPT_config_ratCh 8 -#define _NBITS_CMD_SET_RAT_CPT_config_ratCh 4 -#define _BITPOS_CMD_SET_RAT_CPT_config_bRepeated 12 -#define _NBITS_CMD_SET_RAT_CPT_config_bRepeated 1 -#define _BITPOS_CMD_SET_RAT_CPT_config_inputMode 13 -#define _NBITS_CMD_SET_RAT_CPT_config_inputMode 2 -#define _SIZEOF_CMD_SET_RAT_CPT 4 - -#define _POSITION_CMD_DISABLE_RAT_CH_ratCh 2 -#define _TYPE_CMD_DISABLE_RAT_CH_ratCh uint8_t -#define _SIZEOF_CMD_DISABLE_RAT_CH 3 - -#define _POSITION_CMD_SET_RAT_OUTPUT_config 2 -#define _TYPE_CMD_SET_RAT_OUTPUT_config uint16_t -#define _BITPOS_CMD_SET_RAT_OUTPUT_config_outputSel 2 -#define _NBITS_CMD_SET_RAT_OUTPUT_config_outputSel 3 -#define _BITPOS_CMD_SET_RAT_OUTPUT_config_outputMode 5 -#define _NBITS_CMD_SET_RAT_OUTPUT_config_outputMode 3 -#define _BITPOS_CMD_SET_RAT_OUTPUT_config_ratCh 8 -#define _NBITS_CMD_SET_RAT_OUTPUT_config_ratCh 4 -#define _SIZEOF_CMD_SET_RAT_OUTPUT 4 - -#define _POSITION_CMD_ARM_RAT_CH_ratCh 2 -#define _TYPE_CMD_ARM_RAT_CH_ratCh uint8_t -#define _SIZEOF_CMD_ARM_RAT_CH 3 - -#define _POSITION_CMD_DISARM_RAT_CH_ratCh 2 -#define _TYPE_CMD_DISARM_RAT_CH_ratCh uint8_t -#define _SIZEOF_CMD_DISARM_RAT_CH 3 - -#define _POSITION_CMD_SET_TX_POWER_txPower 2 -#define _TYPE_CMD_SET_TX_POWER_txPower uint16_t -#define _BITPOS_CMD_SET_TX_POWER_txPower_IB 0 -#define _NBITS_CMD_SET_TX_POWER_txPower_IB 6 -#define _BITPOS_CMD_SET_TX_POWER_txPower_GC 6 -#define _NBITS_CMD_SET_TX_POWER_txPower_GC 2 -#define _BITPOS_CMD_SET_TX_POWER_txPower_tempCoeff 8 -#define _NBITS_CMD_SET_TX_POWER_txPower_tempCoeff 8 -#define _SIZEOF_CMD_SET_TX_POWER 4 - -#define _POSITION_CMD_UPDATE_FS_frequency 2 -#define _TYPE_CMD_UPDATE_FS_frequency uint16_t -#define _POSITION_CMD_UPDATE_FS_fractFreq 4 -#define _TYPE_CMD_UPDATE_FS_fractFreq uint16_t -#define _SIZEOF_CMD_UPDATE_FS 6 - -#define _POSITION_CMD_BUS_REQUEST_bSysBusNeeded 2 -#define _TYPE_CMD_BUS_REQUEST_bSysBusNeeded uint8_t -#define _SIZEOF_CMD_BUS_REQUEST 3 - -#endif diff --git a/cpu/cc26xx/dev/rfc-api/data_entry.h b/cpu/cc26xx/dev/rfc-api/data_entry.h deleted file mode 100644 index 91c1826de..000000000 --- a/cpu/cc26xx/dev/rfc-api/data_entry.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2014, Texas Instruments Incorporated - http://www.ti.com/ - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/*---------------------------------------------------------------------------*/ -#ifndef __DATA_ENTRY_H -#define __DATA_ENTRY_H - -#include -#include "mailbox.h" - -typedef struct rfc_dataEntry_s rfc_dataEntry_t; - -#define _POSITION_dataEntry_pNextEntry 0 -#define _TYPE_dataEntry_pNextEntry uint8_t* -#define _POSITION_dataEntry_status 4 -#define _TYPE_dataEntry_status uint8_t -#define _POSITION_dataEntry_config 5 -#define _TYPE_dataEntry_config uint8_t -#define _BITPOS_dataEntry_config_type 0 -#define _NBITS_dataEntry_config_type 2 -#define _BITPOS_dataEntry_config_lenSz 2 -#define _NBITS_dataEntry_config_lenSz 2 -#define _BITPOS_dataEntry_config_irqIntv 4 -#define _NBITS_dataEntry_config_irqIntv 4 -#define _POSITION_dataEntry_length 6 -#define _TYPE_dataEntry_length uint16_t -#define _POSITION_dataEntry_data 8 -#define _TYPE_dataEntry_data uint8_t -#define _POSITION_dataEntry_pData 8 -#define _TYPE_dataEntry_pData uint8_t* -#define _POSITION_dataEntry_numElements 8 -#define _TYPE_dataEntry_numElements uint16_t -#define _POSITION_dataEntry_pktStatus 8 -#define _TYPE_dataEntry_pktStatus uint16_t -#define _BITPOS_dataEntry_pktStatus_numElements 0 -#define _NBITS_dataEntry_pktStatus_numElements 13 -#define _BITPOS_dataEntry_pktStatus_bEntryOpen 13 -#define _NBITS_dataEntry_pktStatus_bEntryOpen 1 -#define _BITPOS_dataEntry_pktStatus_bFirstCont 14 -#define _NBITS_dataEntry_pktStatus_bFirstCont 1 -#define _BITPOS_dataEntry_pktStatus_bLastCont 15 -#define _NBITS_dataEntry_pktStatus_bLastCont 1 -#define _POSITION_dataEntry_nextIndex 10 -#define _TYPE_dataEntry_nextIndex uint16_t -#define _POSITION_dataEntry_rxData 12 -#define _TYPE_dataEntry_rxData uint8_t -#define _LAST_POSITION_dataEntry 12 -#define _LAST_TYPE_dataEntry uint8_t - -struct rfc_dataEntry_s { - uint8_t* pNextEntry; - uint8_t status; - struct { - uint8_t type:2; - uint8_t lenSz:2; - uint8_t irqIntv:4; - } config; - uint16_t length; - uint8_t data; - uint8_t __dummy0; - uint16_t nextIndex; - uint8_t rxData; -}; - -#endif diff --git a/cpu/cc26xx/dev/rfc-api/ieee_cmd_field.h b/cpu/cc26xx/dev/rfc-api/ieee_cmd_field.h deleted file mode 100755 index 149940f79..000000000 --- a/cpu/cc26xx/dev/rfc-api/ieee_cmd_field.h +++ /dev/null @@ -1,403 +0,0 @@ -/****************************************************************************** -* Filename: ieee_cmd_field.h -* Revised: $ $ -* Revision: $ $ -* -* Description: CC26xx/CC13xx API for IEEE 802.15.4 commands -* -* Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ -* -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* -* Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* -* Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* -* Neither the name of Texas Instruments Incorporated nor the names of -* its contributors may be used to endorse or promote products derived -* from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -******************************************************************************/ - -#ifndef __IEEE_CMD_FIELD_H -#define __IEEE_CMD_FIELD_H - -#include -#include "mailbox.h" -#include "common_cmd.h" - -#define _POSITION_CMD_IEEE_RX_channel 14 -#define _TYPE_CMD_IEEE_RX_channel uint8_t -#define _POSITION_CMD_IEEE_RX_rxConfig 15 -#define _TYPE_CMD_IEEE_RX_rxConfig uint8_t -#define _BITPOS_CMD_IEEE_RX_rxConfig_bAutoFlushCrc 0 -#define _NBITS_CMD_IEEE_RX_rxConfig_bAutoFlushCrc 1 -#define _BITPOS_CMD_IEEE_RX_rxConfig_bAutoFlushIgn 1 -#define _NBITS_CMD_IEEE_RX_rxConfig_bAutoFlushIgn 1 -#define _BITPOS_CMD_IEEE_RX_rxConfig_bIncludePhyHdr 2 -#define _NBITS_CMD_IEEE_RX_rxConfig_bIncludePhyHdr 1 -#define _BITPOS_CMD_IEEE_RX_rxConfig_bIncludeCrc 3 -#define _NBITS_CMD_IEEE_RX_rxConfig_bIncludeCrc 1 -#define _BITPOS_CMD_IEEE_RX_rxConfig_bAppendRssi 4 -#define _NBITS_CMD_IEEE_RX_rxConfig_bAppendRssi 1 -#define _BITPOS_CMD_IEEE_RX_rxConfig_bAppendCorrCrc 5 -#define _NBITS_CMD_IEEE_RX_rxConfig_bAppendCorrCrc 1 -#define _BITPOS_CMD_IEEE_RX_rxConfig_bAppendSrcInd 6 -#define _NBITS_CMD_IEEE_RX_rxConfig_bAppendSrcInd 1 -#define _BITPOS_CMD_IEEE_RX_rxConfig_bAppendTimestamp 7 -#define _NBITS_CMD_IEEE_RX_rxConfig_bAppendTimestamp 1 -#define _POSITION_CMD_IEEE_RX_pRxQ 16 -#define _TYPE_CMD_IEEE_RX_pRxQ dataQueue_t* -#define _POSITION_CMD_IEEE_RX_pOutput 20 -#define _TYPE_CMD_IEEE_RX_pOutput uint8_t* -#define _POSITION_CMD_IEEE_RX_frameFiltOpt 24 -#define _TYPE_CMD_IEEE_RX_frameFiltOpt uint16_t -#define _BITPOS_CMD_IEEE_RX_frameFiltOpt_frameFiltEn 0 -#define _NBITS_CMD_IEEE_RX_frameFiltOpt_frameFiltEn 1 -#define _BITPOS_CMD_IEEE_RX_frameFiltOpt_frameFiltStop 1 -#define _NBITS_CMD_IEEE_RX_frameFiltOpt_frameFiltStop 1 -#define _BITPOS_CMD_IEEE_RX_frameFiltOpt_autoAckEn 2 -#define _NBITS_CMD_IEEE_RX_frameFiltOpt_autoAckEn 1 -#define _BITPOS_CMD_IEEE_RX_frameFiltOpt_slottedAckEn 3 -#define _NBITS_CMD_IEEE_RX_frameFiltOpt_slottedAckEn 1 -#define _BITPOS_CMD_IEEE_RX_frameFiltOpt_autoPendEn 4 -#define _NBITS_CMD_IEEE_RX_frameFiltOpt_autoPendEn 1 -#define _BITPOS_CMD_IEEE_RX_frameFiltOpt_defaultPend 5 -#define _NBITS_CMD_IEEE_RX_frameFiltOpt_defaultPend 1 -#define _BITPOS_CMD_IEEE_RX_frameFiltOpt_bPendDataReqOnly 6 -#define _NBITS_CMD_IEEE_RX_frameFiltOpt_bPendDataReqOnly 1 -#define _BITPOS_CMD_IEEE_RX_frameFiltOpt_bPanCoord 7 -#define _NBITS_CMD_IEEE_RX_frameFiltOpt_bPanCoord 1 -#define _BITPOS_CMD_IEEE_RX_frameFiltOpt_maxFrameVersion 8 -#define _NBITS_CMD_IEEE_RX_frameFiltOpt_maxFrameVersion 2 -#define _BITPOS_CMD_IEEE_RX_frameFiltOpt_fcfReservedMask 10 -#define _NBITS_CMD_IEEE_RX_frameFiltOpt_fcfReservedMask 3 -#define _BITPOS_CMD_IEEE_RX_frameFiltOpt_modifyFtFilter 13 -#define _NBITS_CMD_IEEE_RX_frameFiltOpt_modifyFtFilter 2 -#define _BITPOS_CMD_IEEE_RX_frameFiltOpt_bStrictLenFilter 15 -#define _NBITS_CMD_IEEE_RX_frameFiltOpt_bStrictLenFilter 1 -#define _POSITION_CMD_IEEE_RX_frameTypes 26 -#define _TYPE_CMD_IEEE_RX_frameTypes uint8_t -#define _BITPOS_CMD_IEEE_RX_frameTypes_bAcceptFt0Beacon 0 -#define _NBITS_CMD_IEEE_RX_frameTypes_bAcceptFt0Beacon 1 -#define _BITPOS_CMD_IEEE_RX_frameTypes_bAcceptFt1Data 1 -#define _NBITS_CMD_IEEE_RX_frameTypes_bAcceptFt1Data 1 -#define _BITPOS_CMD_IEEE_RX_frameTypes_bAcceptFt2Ack 2 -#define _NBITS_CMD_IEEE_RX_frameTypes_bAcceptFt2Ack 1 -#define _BITPOS_CMD_IEEE_RX_frameTypes_bAcceptFt3MacCmd 3 -#define _NBITS_CMD_IEEE_RX_frameTypes_bAcceptFt3MacCmd 1 -#define _BITPOS_CMD_IEEE_RX_frameTypes_bAcceptFt4Reserved 4 -#define _NBITS_CMD_IEEE_RX_frameTypes_bAcceptFt4Reserved 1 -#define _BITPOS_CMD_IEEE_RX_frameTypes_bAcceptFt5Reserved 5 -#define _NBITS_CMD_IEEE_RX_frameTypes_bAcceptFt5Reserved 1 -#define _BITPOS_CMD_IEEE_RX_frameTypes_bAcceptFt6Reserved 6 -#define _NBITS_CMD_IEEE_RX_frameTypes_bAcceptFt6Reserved 1 -#define _BITPOS_CMD_IEEE_RX_frameTypes_bAcceptFt7Reserved 7 -#define _NBITS_CMD_IEEE_RX_frameTypes_bAcceptFt7Reserved 1 -#define _POSITION_CMD_IEEE_RX_ccaOpt 27 -#define _TYPE_CMD_IEEE_RX_ccaOpt uint8_t -#define _BITPOS_CMD_IEEE_RX_ccaOpt_ccaEnEnergy 0 -#define _NBITS_CMD_IEEE_RX_ccaOpt_ccaEnEnergy 1 -#define _BITPOS_CMD_IEEE_RX_ccaOpt_ccaEnCorr 1 -#define _NBITS_CMD_IEEE_RX_ccaOpt_ccaEnCorr 1 -#define _BITPOS_CMD_IEEE_RX_ccaOpt_ccaEnSync 2 -#define _NBITS_CMD_IEEE_RX_ccaOpt_ccaEnSync 1 -#define _BITPOS_CMD_IEEE_RX_ccaOpt_ccaCorrOp 3 -#define _NBITS_CMD_IEEE_RX_ccaOpt_ccaCorrOp 1 -#define _BITPOS_CMD_IEEE_RX_ccaOpt_ccaSyncOp 4 -#define _NBITS_CMD_IEEE_RX_ccaOpt_ccaSyncOp 1 -#define _BITPOS_CMD_IEEE_RX_ccaOpt_ccaCorrThr 5 -#define _NBITS_CMD_IEEE_RX_ccaOpt_ccaCorrThr 2 -#define _POSITION_CMD_IEEE_RX_ccaRssiThr 28 -#define _TYPE_CMD_IEEE_RX_ccaRssiThr int8_t -#define _POSITION_CMD_IEEE_RX_numExtEntries 30 -#define _TYPE_CMD_IEEE_RX_numExtEntries uint8_t -#define _POSITION_CMD_IEEE_RX_numShortEntries 31 -#define _TYPE_CMD_IEEE_RX_numShortEntries uint8_t -#define _POSITION_CMD_IEEE_RX_pExtEntryList 32 -#define _TYPE_CMD_IEEE_RX_pExtEntryList uint32_t* -#define _POSITION_CMD_IEEE_RX_pShortEntryList 36 -#define _TYPE_CMD_IEEE_RX_pShortEntryList uint32_t* -#define _POSITION_CMD_IEEE_RX_localExtAddr 40 -#define _TYPE_CMD_IEEE_RX_localExtAddr uint64_t -#define _POSITION_CMD_IEEE_RX_localShortAddr 48 -#define _TYPE_CMD_IEEE_RX_localShortAddr uint16_t -#define _POSITION_CMD_IEEE_RX_localPanID 50 -#define _TYPE_CMD_IEEE_RX_localPanID uint16_t -#define _POSITION_CMD_IEEE_RX_endTrigger 55 -#define _TYPE_CMD_IEEE_RX_endTrigger uint8_t -#define _BITPOS_CMD_IEEE_RX_endTrigger_triggerType 0 -#define _NBITS_CMD_IEEE_RX_endTrigger_triggerType 4 -#define _BITPOS_CMD_IEEE_RX_endTrigger_bEnaCmd 4 -#define _NBITS_CMD_IEEE_RX_endTrigger_bEnaCmd 1 -#define _BITPOS_CMD_IEEE_RX_endTrigger_triggerNo 5 -#define _NBITS_CMD_IEEE_RX_endTrigger_triggerNo 2 -#define _BITPOS_CMD_IEEE_RX_endTrigger_pastTrig 7 -#define _NBITS_CMD_IEEE_RX_endTrigger_pastTrig 1 -#define _POSITION_CMD_IEEE_RX_endTime 56 -#define _TYPE_CMD_IEEE_RX_endTime ratmr_t -#define _SIZEOF_CMD_IEEE_RX 60 - -#define _POSITION_CMD_IEEE_ED_SCAN_channel 14 -#define _TYPE_CMD_IEEE_ED_SCAN_channel uint8_t -#define _POSITION_CMD_IEEE_ED_SCAN_ccaOpt 15 -#define _TYPE_CMD_IEEE_ED_SCAN_ccaOpt uint8_t -#define _BITPOS_CMD_IEEE_ED_SCAN_ccaOpt_ccaEnEnergy 0 -#define _NBITS_CMD_IEEE_ED_SCAN_ccaOpt_ccaEnEnergy 1 -#define _BITPOS_CMD_IEEE_ED_SCAN_ccaOpt_ccaEnCorr 1 -#define _NBITS_CMD_IEEE_ED_SCAN_ccaOpt_ccaEnCorr 1 -#define _BITPOS_CMD_IEEE_ED_SCAN_ccaOpt_ccaEnSync 2 -#define _NBITS_CMD_IEEE_ED_SCAN_ccaOpt_ccaEnSync 1 -#define _BITPOS_CMD_IEEE_ED_SCAN_ccaOpt_ccaCorrOp 3 -#define _NBITS_CMD_IEEE_ED_SCAN_ccaOpt_ccaCorrOp 1 -#define _BITPOS_CMD_IEEE_ED_SCAN_ccaOpt_ccaSyncOp 4 -#define _NBITS_CMD_IEEE_ED_SCAN_ccaOpt_ccaSyncOp 1 -#define _BITPOS_CMD_IEEE_ED_SCAN_ccaOpt_ccaCorrThr 5 -#define _NBITS_CMD_IEEE_ED_SCAN_ccaOpt_ccaCorrThr 2 -#define _POSITION_CMD_IEEE_ED_SCAN_ccaRssiThr 16 -#define _TYPE_CMD_IEEE_ED_SCAN_ccaRssiThr int8_t -#define _POSITION_CMD_IEEE_ED_SCAN_maxRssi 18 -#define _TYPE_CMD_IEEE_ED_SCAN_maxRssi int8_t -#define _POSITION_CMD_IEEE_ED_SCAN_endTrigger 19 -#define _TYPE_CMD_IEEE_ED_SCAN_endTrigger uint8_t -#define _BITPOS_CMD_IEEE_ED_SCAN_endTrigger_triggerType 0 -#define _NBITS_CMD_IEEE_ED_SCAN_endTrigger_triggerType 4 -#define _BITPOS_CMD_IEEE_ED_SCAN_endTrigger_bEnaCmd 4 -#define _NBITS_CMD_IEEE_ED_SCAN_endTrigger_bEnaCmd 1 -#define _BITPOS_CMD_IEEE_ED_SCAN_endTrigger_triggerNo 5 -#define _NBITS_CMD_IEEE_ED_SCAN_endTrigger_triggerNo 2 -#define _BITPOS_CMD_IEEE_ED_SCAN_endTrigger_pastTrig 7 -#define _NBITS_CMD_IEEE_ED_SCAN_endTrigger_pastTrig 1 -#define _POSITION_CMD_IEEE_ED_SCAN_endTime 20 -#define _TYPE_CMD_IEEE_ED_SCAN_endTime ratmr_t -#define _SIZEOF_CMD_IEEE_ED_SCAN 24 - -#define _POSITION_CMD_IEEE_TX_txOpt 14 -#define _TYPE_CMD_IEEE_TX_txOpt uint8_t -#define _BITPOS_CMD_IEEE_TX_txOpt_bIncludePhyHdr 0 -#define _NBITS_CMD_IEEE_TX_txOpt_bIncludePhyHdr 1 -#define _BITPOS_CMD_IEEE_TX_txOpt_bIncludeCrc 1 -#define _NBITS_CMD_IEEE_TX_txOpt_bIncludeCrc 1 -#define _BITPOS_CMD_IEEE_TX_txOpt_payloadLenMsb 3 -#define _NBITS_CMD_IEEE_TX_txOpt_payloadLenMsb 5 -#define _POSITION_CMD_IEEE_TX_payloadLen 15 -#define _TYPE_CMD_IEEE_TX_payloadLen uint8_t -#define _POSITION_CMD_IEEE_TX_pPayload 16 -#define _TYPE_CMD_IEEE_TX_pPayload uint8_t* -#define _POSITION_CMD_IEEE_TX_timeStamp 20 -#define _TYPE_CMD_IEEE_TX_timeStamp ratmr_t -#define _SIZEOF_CMD_IEEE_TX 24 - -#define _POSITION_CMD_IEEE_CSMA_randomState 14 -#define _TYPE_CMD_IEEE_CSMA_randomState uint16_t -#define _POSITION_CMD_IEEE_CSMA_macMaxBE 16 -#define _TYPE_CMD_IEEE_CSMA_macMaxBE uint8_t -#define _POSITION_CMD_IEEE_CSMA_macMaxCSMABackoffs 17 -#define _TYPE_CMD_IEEE_CSMA_macMaxCSMABackoffs uint8_t -#define _POSITION_CMD_IEEE_CSMA_csmaConfig 18 -#define _TYPE_CMD_IEEE_CSMA_csmaConfig uint8_t -#define _BITPOS_CMD_IEEE_CSMA_csmaConfig_initCW 0 -#define _NBITS_CMD_IEEE_CSMA_csmaConfig_initCW 5 -#define _BITPOS_CMD_IEEE_CSMA_csmaConfig_bSlotted 5 -#define _NBITS_CMD_IEEE_CSMA_csmaConfig_bSlotted 1 -#define _BITPOS_CMD_IEEE_CSMA_csmaConfig_rxOffMode 6 -#define _NBITS_CMD_IEEE_CSMA_csmaConfig_rxOffMode 2 -#define _POSITION_CMD_IEEE_CSMA_NB 19 -#define _TYPE_CMD_IEEE_CSMA_NB uint8_t -#define _POSITION_CMD_IEEE_CSMA_BE 20 -#define _TYPE_CMD_IEEE_CSMA_BE uint8_t -#define _POSITION_CMD_IEEE_CSMA_remainingPeriods 21 -#define _TYPE_CMD_IEEE_CSMA_remainingPeriods uint8_t -#define _POSITION_CMD_IEEE_CSMA_lastRssi 22 -#define _TYPE_CMD_IEEE_CSMA_lastRssi int8_t -#define _POSITION_CMD_IEEE_CSMA_endTrigger 23 -#define _TYPE_CMD_IEEE_CSMA_endTrigger uint8_t -#define _BITPOS_CMD_IEEE_CSMA_endTrigger_triggerType 0 -#define _NBITS_CMD_IEEE_CSMA_endTrigger_triggerType 4 -#define _BITPOS_CMD_IEEE_CSMA_endTrigger_bEnaCmd 4 -#define _NBITS_CMD_IEEE_CSMA_endTrigger_bEnaCmd 1 -#define _BITPOS_CMD_IEEE_CSMA_endTrigger_triggerNo 5 -#define _NBITS_CMD_IEEE_CSMA_endTrigger_triggerNo 2 -#define _BITPOS_CMD_IEEE_CSMA_endTrigger_pastTrig 7 -#define _NBITS_CMD_IEEE_CSMA_endTrigger_pastTrig 1 -#define _POSITION_CMD_IEEE_CSMA_lastTimeStamp 24 -#define _TYPE_CMD_IEEE_CSMA_lastTimeStamp ratmr_t -#define _POSITION_CMD_IEEE_CSMA_endTime 28 -#define _TYPE_CMD_IEEE_CSMA_endTime ratmr_t -#define _SIZEOF_CMD_IEEE_CSMA 32 - -#define _POSITION_CMD_IEEE_RX_ACK_seqNo 14 -#define _TYPE_CMD_IEEE_RX_ACK_seqNo uint8_t -#define _POSITION_CMD_IEEE_RX_ACK_endTrigger 15 -#define _TYPE_CMD_IEEE_RX_ACK_endTrigger uint8_t -#define _BITPOS_CMD_IEEE_RX_ACK_endTrigger_triggerType 0 -#define _NBITS_CMD_IEEE_RX_ACK_endTrigger_triggerType 4 -#define _BITPOS_CMD_IEEE_RX_ACK_endTrigger_bEnaCmd 4 -#define _NBITS_CMD_IEEE_RX_ACK_endTrigger_bEnaCmd 1 -#define _BITPOS_CMD_IEEE_RX_ACK_endTrigger_triggerNo 5 -#define _NBITS_CMD_IEEE_RX_ACK_endTrigger_triggerNo 2 -#define _BITPOS_CMD_IEEE_RX_ACK_endTrigger_pastTrig 7 -#define _NBITS_CMD_IEEE_RX_ACK_endTrigger_pastTrig 1 -#define _POSITION_CMD_IEEE_RX_ACK_endTime 16 -#define _TYPE_CMD_IEEE_RX_ACK_endTime ratmr_t -#define _SIZEOF_CMD_IEEE_RX_ACK 20 - -#define _SIZEOF_CMD_IEEE_ABORT_BG 14 - -#define _POSITION_CMD_IEEE_MOD_CCA_newCcaOpt 2 -#define _TYPE_CMD_IEEE_MOD_CCA_newCcaOpt uint8_t -#define _BITPOS_CMD_IEEE_MOD_CCA_newCcaOpt_ccaEnEnergy 0 -#define _NBITS_CMD_IEEE_MOD_CCA_newCcaOpt_ccaEnEnergy 1 -#define _BITPOS_CMD_IEEE_MOD_CCA_newCcaOpt_ccaEnCorr 1 -#define _NBITS_CMD_IEEE_MOD_CCA_newCcaOpt_ccaEnCorr 1 -#define _BITPOS_CMD_IEEE_MOD_CCA_newCcaOpt_ccaEnSync 2 -#define _NBITS_CMD_IEEE_MOD_CCA_newCcaOpt_ccaEnSync 1 -#define _BITPOS_CMD_IEEE_MOD_CCA_newCcaOpt_ccaCorrOp 3 -#define _NBITS_CMD_IEEE_MOD_CCA_newCcaOpt_ccaCorrOp 1 -#define _BITPOS_CMD_IEEE_MOD_CCA_newCcaOpt_ccaSyncOp 4 -#define _NBITS_CMD_IEEE_MOD_CCA_newCcaOpt_ccaSyncOp 1 -#define _BITPOS_CMD_IEEE_MOD_CCA_newCcaOpt_ccaCorrThr 5 -#define _NBITS_CMD_IEEE_MOD_CCA_newCcaOpt_ccaCorrThr 2 -#define _POSITION_CMD_IEEE_MOD_CCA_newCcaRssiThr 3 -#define _TYPE_CMD_IEEE_MOD_CCA_newCcaRssiThr int8_t -#define _SIZEOF_CMD_IEEE_MOD_CCA 4 - -#define _POSITION_CMD_IEEE_MOD_FILT_newFrameFiltOpt 2 -#define _TYPE_CMD_IEEE_MOD_FILT_newFrameFiltOpt uint16_t -#define _BITPOS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_frameFiltEn 0 -#define _NBITS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_frameFiltEn 1 -#define _BITPOS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_frameFiltStop 1 -#define _NBITS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_frameFiltStop 1 -#define _BITPOS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_autoAckEn 2 -#define _NBITS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_autoAckEn 1 -#define _BITPOS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_slottedAckEn 3 -#define _NBITS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_slottedAckEn 1 -#define _BITPOS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_autoPendEn 4 -#define _NBITS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_autoPendEn 1 -#define _BITPOS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_defaultPend 5 -#define _NBITS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_defaultPend 1 -#define _BITPOS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_bPendDataReqOnly 6 -#define _NBITS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_bPendDataReqOnly 1 -#define _BITPOS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_bPanCoord 7 -#define _NBITS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_bPanCoord 1 -#define _BITPOS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_maxFrameVersion 8 -#define _NBITS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_maxFrameVersion 2 -#define _BITPOS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_fcfReservedMask 10 -#define _NBITS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_fcfReservedMask 3 -#define _BITPOS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_modifyFtFilter 13 -#define _NBITS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_modifyFtFilter 2 -#define _BITPOS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_bStrictLenFilter 15 -#define _NBITS_CMD_IEEE_MOD_FILT_newFrameFiltOpt_bStrictLenFilter 1 -#define _POSITION_CMD_IEEE_MOD_FILT_newFrameTypes 4 -#define _TYPE_CMD_IEEE_MOD_FILT_newFrameTypes uint8_t -#define _BITPOS_CMD_IEEE_MOD_FILT_newFrameTypes_bAcceptFt0Beacon 0 -#define _NBITS_CMD_IEEE_MOD_FILT_newFrameTypes_bAcceptFt0Beacon 1 -#define _BITPOS_CMD_IEEE_MOD_FILT_newFrameTypes_bAcceptFt1Data 1 -#define _NBITS_CMD_IEEE_MOD_FILT_newFrameTypes_bAcceptFt1Data 1 -#define _BITPOS_CMD_IEEE_MOD_FILT_newFrameTypes_bAcceptFt2Ack 2 -#define _NBITS_CMD_IEEE_MOD_FILT_newFrameTypes_bAcceptFt2Ack 1 -#define _BITPOS_CMD_IEEE_MOD_FILT_newFrameTypes_bAcceptFt3MacCmd 3 -#define _NBITS_CMD_IEEE_MOD_FILT_newFrameTypes_bAcceptFt3MacCmd 1 -#define _BITPOS_CMD_IEEE_MOD_FILT_newFrameTypes_bAcceptFt4Reserved 4 -#define _NBITS_CMD_IEEE_MOD_FILT_newFrameTypes_bAcceptFt4Reserved 1 -#define _BITPOS_CMD_IEEE_MOD_FILT_newFrameTypes_bAcceptFt5Reserved 5 -#define _NBITS_CMD_IEEE_MOD_FILT_newFrameTypes_bAcceptFt5Reserved 1 -#define _BITPOS_CMD_IEEE_MOD_FILT_newFrameTypes_bAcceptFt6Reserved 6 -#define _NBITS_CMD_IEEE_MOD_FILT_newFrameTypes_bAcceptFt6Reserved 1 -#define _BITPOS_CMD_IEEE_MOD_FILT_newFrameTypes_bAcceptFt7Reserved 7 -#define _NBITS_CMD_IEEE_MOD_FILT_newFrameTypes_bAcceptFt7Reserved 1 -#define _SIZEOF_CMD_IEEE_MOD_FILT 5 - -#define _POSITION_CMD_IEEE_MOD_SRC_MATCH_options 2 -#define _TYPE_CMD_IEEE_MOD_SRC_MATCH_options uint8_t -#define _BITPOS_CMD_IEEE_MOD_SRC_MATCH_options_bEnable 0 -#define _NBITS_CMD_IEEE_MOD_SRC_MATCH_options_bEnable 1 -#define _BITPOS_CMD_IEEE_MOD_SRC_MATCH_options_srcPend 1 -#define _NBITS_CMD_IEEE_MOD_SRC_MATCH_options_srcPend 1 -#define _BITPOS_CMD_IEEE_MOD_SRC_MATCH_options_entryType 2 -#define _NBITS_CMD_IEEE_MOD_SRC_MATCH_options_entryType 1 -#define _POSITION_CMD_IEEE_MOD_SRC_MATCH_entryNo 3 -#define _TYPE_CMD_IEEE_MOD_SRC_MATCH_entryNo uint8_t -#define _SIZEOF_CMD_IEEE_MOD_SRC_MATCH 4 - -#define _SIZEOF_CMD_IEEE_ABORT_FG 2 - -#define _SIZEOF_CMD_IEEE_STOP_FG 2 - -#define _POSITION_CMD_IEEE_CCA_REQ_currentRssi 2 -#define _TYPE_CMD_IEEE_CCA_REQ_currentRssi int8_t -#define _POSITION_CMD_IEEE_CCA_REQ_maxRssi 3 -#define _TYPE_CMD_IEEE_CCA_REQ_maxRssi int8_t -#define _POSITION_CMD_IEEE_CCA_REQ_ccaInfo 4 -#define _TYPE_CMD_IEEE_CCA_REQ_ccaInfo uint8_t -#define _BITPOS_CMD_IEEE_CCA_REQ_ccaInfo_ccaState 0 -#define _NBITS_CMD_IEEE_CCA_REQ_ccaInfo_ccaState 2 -#define _BITPOS_CMD_IEEE_CCA_REQ_ccaInfo_ccaEnergy 2 -#define _NBITS_CMD_IEEE_CCA_REQ_ccaInfo_ccaEnergy 2 -#define _BITPOS_CMD_IEEE_CCA_REQ_ccaInfo_ccaCorr 4 -#define _NBITS_CMD_IEEE_CCA_REQ_ccaInfo_ccaCorr 2 -#define _BITPOS_CMD_IEEE_CCA_REQ_ccaInfo_ccaSync 6 -#define _NBITS_CMD_IEEE_CCA_REQ_ccaInfo_ccaSync 1 -#define _SIZEOF_CMD_IEEE_CCA_REQ 5 - -#define _POSITION_ieeeRxOutput_nTxAck 0 -#define _TYPE_ieeeRxOutput_nTxAck uint8_t -#define _POSITION_ieeeRxOutput_nRxBeacon 1 -#define _TYPE_ieeeRxOutput_nRxBeacon uint8_t -#define _POSITION_ieeeRxOutput_nRxData 2 -#define _TYPE_ieeeRxOutput_nRxData uint8_t -#define _POSITION_ieeeRxOutput_nRxAck 3 -#define _TYPE_ieeeRxOutput_nRxAck uint8_t -#define _POSITION_ieeeRxOutput_nRxMacCmd 4 -#define _TYPE_ieeeRxOutput_nRxMacCmd uint8_t -#define _POSITION_ieeeRxOutput_nRxReserved 5 -#define _TYPE_ieeeRxOutput_nRxReserved uint8_t -#define _POSITION_ieeeRxOutput_nRxNok 6 -#define _TYPE_ieeeRxOutput_nRxNok uint8_t -#define _POSITION_ieeeRxOutput_nRxIgnored 7 -#define _TYPE_ieeeRxOutput_nRxIgnored uint8_t -#define _POSITION_ieeeRxOutput_nRxBufFull 8 -#define _TYPE_ieeeRxOutput_nRxBufFull uint8_t -#define _POSITION_ieeeRxOutput_lastRssi 9 -#define _TYPE_ieeeRxOutput_lastRssi int8_t -#define _POSITION_ieeeRxOutput_maxRssi 10 -#define _TYPE_ieeeRxOutput_maxRssi int8_t -#define _POSITION_ieeeRxOutput_beaconTimeStamp 12 -#define _TYPE_ieeeRxOutput_beaconTimeStamp ratmr_t -#define _SIZEOF_ieeeRxOutput 16 - -#define _POSITION_shortAddrEntry_shortAddr 0 -#define _TYPE_shortAddrEntry_shortAddr uint16_t -#define _POSITION_shortAddrEntry_panId 2 -#define _TYPE_shortAddrEntry_panId uint16_t -#define _SIZEOF_shortAddrEntry 4 - -#define _POSITION_ieeeRxCorrCrc_status 0 -#define _TYPE_ieeeRxCorrCrc_status uint8_t -#define _BITPOS_ieeeRxCorrCrc_status_corr 0 -#define _NBITS_ieeeRxCorrCrc_status_corr 6 -#define _BITPOS_ieeeRxCorrCrc_status_bIgnore 6 -#define _NBITS_ieeeRxCorrCrc_status_bIgnore 1 -#define _BITPOS_ieeeRxCorrCrc_status_bCrcErr 7 -#define _NBITS_ieeeRxCorrCrc_status_bCrcErr 1 -#define _SIZEOF_ieeeRxCorrCrc 1 - -#endif diff --git a/cpu/cc26xx/lib/cc26xxware b/cpu/cc26xx/lib/cc26xxware deleted file mode 160000 index 420ae3682..000000000 --- a/cpu/cc26xx/lib/cc26xxware +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 420ae3682c11619c1340697632b2dc49f7e53037 diff --git a/doc/Doxyfile b/doc/Doxyfile index cd0d1ac7c..e0b0d232e 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -807,7 +807,8 @@ EXCLUDE_SYMLINKS = NO # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* -EXCLUDE_PATTERNS = */cpu/cc26xx/lib/* +EXCLUDE_PATTERNS = */cpu/cc26xx-cc13xx/lib/* \ + */cpu/cc26xx-cc13xx/rf-core/api/* # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the From 3d19b0036ed1cdfe3c6448b3ebadd7ffb206f2e9 Mon Sep 17 00:00:00 2001 From: Jonas Olsson Date: Sun, 16 Aug 2015 16:55:44 +0100 Subject: [PATCH 2/8] Add support for SmarfRF06 + CC1310EM This commit updates the srf06-cc26xx platform by adding support for the CC1310EM. We generalise the way this platform selects CPU/board so that we can easily add more combinations in the future. These changes have implication on how to build for different devices, so make sure to have a look at the updated README --- platform/srf06-cc26xx/Makefile.srf06-cc26xx | 19 +- platform/srf06-cc26xx/README.md | 27 +- platform/srf06-cc26xx/contiki-conf.h | 81 +++--- platform/srf06-cc26xx/contiki-main.c | 25 +- .../srf06-cc26xx/sensortag/Makefile.sensortag | 4 +- platform/srf06-cc26xx/sensortag/board-i2c.c | 3 - .../srf06-cc26xx/sensortag/button-sensor.c | 2 +- .../sensortag/cc2650/Makefile.cc2650 | 11 + .../sensortag/{ => cc2650}/board.h | 16 +- .../sensortag/{ => cc2650}/leds-arch.c | 0 platform/srf06-cc26xx/srf06/Makefile.srf06 | 2 + .../srf06-cc26xx/srf06/board-peripherals.h | 14 +- platform/srf06-cc26xx/srf06/board.c | 4 +- platform/srf06-cc26xx/srf06/button-sensor.c | 6 +- platform/srf06-cc26xx/srf06/button-sensor.h | 4 +- .../srf06-cc26xx/srf06/cc13xx/Makefile.cc13xx | 7 + platform/srf06-cc26xx/srf06/cc13xx/board.h | 242 ++++++++++++++++++ .../srf06-cc26xx/srf06/cc26xx/Makefile.cc26xx | 7 + .../srf06-cc26xx/srf06/{ => cc26xx}/board.h | 11 +- platform/srf06-cc26xx/srf06/leds-arch.c | 4 +- platform/srf06-cc26xx/srf06/srf06-sensors.c | 2 +- 21 files changed, 387 insertions(+), 104 deletions(-) create mode 100644 platform/srf06-cc26xx/sensortag/cc2650/Makefile.cc2650 rename platform/srf06-cc26xx/sensortag/{ => cc2650}/board.h (97%) rename platform/srf06-cc26xx/sensortag/{ => cc2650}/leds-arch.c (100%) create mode 100644 platform/srf06-cc26xx/srf06/cc13xx/Makefile.cc13xx create mode 100644 platform/srf06-cc26xx/srf06/cc13xx/board.h create mode 100644 platform/srf06-cc26xx/srf06/cc26xx/Makefile.cc26xx rename platform/srf06-cc26xx/srf06/{ => cc26xx}/board.h (97%) diff --git a/platform/srf06-cc26xx/Makefile.srf06-cc26xx b/platform/srf06-cc26xx/Makefile.srf06-cc26xx index 7feefa126..a5f82493c 100644 --- a/platform/srf06-cc26xx/Makefile.srf06-cc26xx +++ b/platform/srf06-cc26xx/Makefile.srf06-cc26xx @@ -6,15 +6,14 @@ endif ### Board and BSP selection ifeq ($(BOARD),) - BOARD=srf06 + BOARD=srf06/cc26xx endif -### Configure the build for the board and pull in board-specific sources -CONTIKI_TARGET_DIRS += . $(BOARD) -PLATFORM_ROOT_DIR = $(CONTIKI)/platform/$(TARGET) +CONTIKI_TARGET_DIRS += . -### Include the board dir if one exists --include $(PLATFORM_ROOT_DIR)/$(BOARD)/Makefile.$(BOARD) +### Include the board-specific makefile +PLATFORM_ROOT_DIR = $(CONTIKI)/platform/$(TARGET) +-include $(PLATFORM_ROOT_DIR)/$(BOARD)/Makefile.$(notdir $(BOARD)) CONTIKI_TARGET_SOURCEFILES += contiki-main.c CONTIKI_TARGET_SOURCEFILES += sensors.c leds.c @@ -29,8 +28,10 @@ ifndef SMALL SMALL = 0 endif -### Define the CPU directory -CONTIKI_CPU=$(CONTIKI)/cpu/cc26xx -include $(CONTIKI_CPU)/Makefile.cc26xx +### Define the CPU directory and pull in the correct CPU makefile. This will +### be defined by one of the makefiles included above and it can be either +### Makefile.cc26xx or Makefile.cc13xx +CONTIKI_CPU=$(CONTIKI)/cpu/cc26xx-cc13xx +include $(CONTIKI_CPU)/Makefile.$(CPU_FAMILY) MODULES += core/net core/net/mac core/net/mac/contikimac core/net/llsec diff --git a/platform/srf06-cc26xx/README.md b/platform/srf06-cc26xx/README.md index 4188c59fb..962403d33 100644 --- a/platform/srf06-cc26xx/README.md +++ b/platform/srf06-cc26xx/README.md @@ -4,11 +4,11 @@ Getting Started with Contiki for TI CC26xx This guide's aim is to help you start using Contiki for TI's CC26xx. The platform supports two different boards: -* SmartRF 06 Evaluation Board with a CC26xx Evaluation Module (relevant files - and drivers are under `srf06/`) -* CC26xx SensorTag 2.0 (relevant drivers under `sensortag/`) +* SmartRF 06 Evaluation Board with a CC26xx or CC13xx Evaluation Module + (relevant files and drivers are under `srf06/`) +* CC2650 SensorTag 2.0 (relevant drivers under `sensortag/cc2650`) -The CPU code, common for both platforms, can be found under `$(CONTIKI)/cpu/cc26xx`. +The CPU code, common for both platforms, can be found under `$(CONTIKI)/cpu/cc26xx-cc13xx`. The port was developed and tested with CC2650s, but the intention is for it to work with the CC2630 as well. Thus, bug reports are welcome for both chips. Bear in mind that the CC2630 does not have BLE capability. @@ -25,6 +25,7 @@ The platform has the following key features: * Deep Sleep support with RAM retention for ultra-low energy consumption. * Support for CC26xx RF in IEEE as well as BLE mode (BLE support is very basic since Contiki does not provide a BLE stack). +* Support for CC13xx prop mode: IEEE 802.15.4g-compliant sub GHz operation In terms of hardware support, the following drivers have been implemented: @@ -61,6 +62,8 @@ To use the port you need: * TI's CC26xxware sources. The correct version will be installed automatically as a submodule when you clone Contiki. +* TI's CC13xxware sources. The correct version will be installed automatically + as a submodule when you clone Contiki. * Software to program the nodes. Use TI's SmartRF Flash Programmer * A toolchain to build firmware: The port has been developed and tested with GNU Tools for ARM Embedded Processors . @@ -85,12 +88,18 @@ From `cpu/cc26xx/lib/cc26xxware/driverlib/timer.c` to `driverlib-timer.c` Sensortag vs Srf06 ================== -To build for the sensortag, set `BOARD=sensortag`. You can do that by exporting -it as an environment variable, by adding it to your Makefile or by adding it to -your make command as an argument +To build for the sensortag, you will need to set the `BOARD` make variable as +follows: -If the `BOARD` variable is not equal to `sensortag`, an image for the Srf06 -CC26XXEM will be built instead. +* Srf06+CC26xxEM: Set `BOARD=srf06/cc26xx` +* Srf06+CC13xxEM: Set `BOARD=srf06/cc13xx` +* CC2650 tag: Set `BOARD=sensortag/cc2650` + +You can do that by exporting `BOARD` as an environment variable, by adding it +to your Makefile or by adding it to your make command as an argument. + +If the `BOARD` variable is unspecified, an image for the Srf06 CC26XXEM will be +built. If you want to switch between building for one platform to the other, make certain to `make clean` before building for the new one, or you will get linker diff --git a/platform/srf06-cc26xx/contiki-conf.h b/platform/srf06-cc26xx/contiki-conf.h index 359c922df..02f982854 100644 --- a/platform/srf06-cc26xx/contiki-conf.h +++ b/platform/srf06-cc26xx/contiki-conf.h @@ -44,16 +44,6 @@ #include PROJECT_CONF_H #endif /* PROJECT_CONF_H */ /*---------------------------------------------------------------------------*/ -/** - * \name CC26xx flavour selection - * @{ - */ -#ifndef CC26XX_MODEL_CONF_CPU_VARIANT -#define CC26XX_MODEL_CONF_CPU_VARIANT 2650 /**< 2650 => CC2650, 2630 => CC2630 */ - -#endif -/** @} */ -/*---------------------------------------------------------------------------*/ /** * \name Network Stack Configuration * @@ -76,8 +66,7 @@ #endif /* Configure NullRDC for when it's selected */ -#define NULLRDC_802154_AUTOACK 1 -#define NULLRDC_802154_AUTOACK_HW 1 +#define NULLRDC_CONF_802154_AUTOACK 1 /* Configure ContikiMAC for when it's selected */ #define CONTIKIMAC_CONF_WITH_CONTIKIMAC_HEADER 0 @@ -92,7 +81,35 @@ #define NETSTACK_CONF_FRAMER framer_802154 #endif -#define NETSTACK_CONF_RADIO cc26xx_rf_driver +#if CPU_FAMILY_CC13XX +#define NETSTACK_CONF_RADIO prop_mode_driver + +#ifndef RF_CORE_CONF_CHANNEL +#define RF_CORE_CONF_CHANNEL 0 +#endif + +#define NULLRDC_CONF_ACK_WAIT_TIME (RTIMER_SECOND / 400) +#define NULLRDC_CONF_AFTER_ACK_DETECTED_WAIT_TIME (RTIMER_SECOND / 1000) +#define NULLRDC_CONF_802154_AUTOACK_HW 0 +#define NULLRDC_CONF_SEND_802154_ACK 1 + +#define CONTIKIMAC_CONF_CCA_CHECK_TIME (RTIMER_ARCH_SECOND / 1600) +#define CONTIKIMAC_CONF_CCA_SLEEP_TIME (RTIMER_ARCH_SECOND / 210) +#define CONTIKIMAC_CONF_LISTEN_TIME_AFTER_PACKET_DETECTED (RTIMER_ARCH_SECOND / 20) +#define CONTIKIMAC_CONF_SEND_SW_ACK 1 +#define CONTIKIMAC_CONF_AFTER_ACK_DETECTECT_WAIT_TIME (RTIMER_SECOND / 1000) +#define CONTIKIMAC_CONF_INTER_PACKET_INTERVAL (RTIMER_SECOND / 280) +#else +#define NETSTACK_CONF_RADIO ieee_mode_driver + +#ifndef RF_CORE_CONF_CHANNEL +#define RF_CORE_CONF_CHANNEL 25 +#endif + +#define NULLRDC_CONF_802154_AUTOACK_HW 1 +#define NULLRDC_CONF_SEND_802154_ACK 0 +#endif + #define NETSTACK_RADIO_MAX_PAYLOAD_LEN 125 /* 6LoWPAN */ @@ -136,37 +153,20 @@ #define IEEE802154_CONF_PANID 0xABCD /**< Default PAN ID */ #endif -#ifndef CC26XX_RF_CONF_CHANNEL -#define CC26XX_RF_CONF_CHANNEL 25 /**< Default RF channel */ +#ifndef IEEE_MODE_CONF_AUTOACK +#define IEEE_MODE_CONF_AUTOACK 1 /**< RF H/W generates ACKs */ #endif -#ifndef CC26XX_RF_CONF_AUTOACK -#define CC26XX_RF_CONF_AUTOACK 1 /**< RF H/W generates ACKs */ +#ifndef IEEE_MODE_CONF_PROMISCOUS +#define IEEE_MODE_CONF_PROMISCOUS 0 /**< 1 to enable promiscous mode */ #endif -#ifndef CC26XX_RF_CONF_PROMISCOUS -#define CC26XX_RF_CONF_PROMISCOUS 0 /**< 1 to enable promiscous mode */ +#ifndef RF_BLE_CONF_ENABLED +#define RF_BLE_CONF_ENABLED 0 /**< 0 to disable BLE support */ #endif -#ifndef CC26XX_RF_CONF_BLE_SUPPORT -#define CC26XX_RF_CONF_BLE_SUPPORT 0 /**< 0 to disable BLE support */ -#endif - -/* - * Patch Management for the CPE itself and for BLE and IEEE modes - * - * Don't change these unless you know what you're doing - */ -#ifndef CC26XX_CONF_CPE_HAS_PATCHES -#define CC26XX_CONF_CPE_HAS_PATCHES 0 /**< 1 to enable patching the CPE */ -#endif - -#ifndef CC26XX_CONF_BLE_HAS_PATCHES -#define CC26XX_CONF_BLE_HAS_PATCHES 0 /**< 1 to enable patching BLE mode */ -#endif - -#ifndef CC26XX_CONF_IEEE_HAS_PATCHES -#define CC26XX_CONF_IEEE_HAS_PATCHES 0 /**< 1 to enable patching IEEE mode */ +#ifndef PROP_MODE_CONF_SNIFFER +#define PROP_MODE_CONF_SNIFFER 0 /**< 1 to enable sniffer mode */ #endif /** @} */ /*---------------------------------------------------------------------------*/ @@ -259,6 +259,11 @@ #define CC26XX_UART_CONF_BAUD_RATE 115200 /**< Default UART0 baud rate */ #endif +/* Enable I/O over the Debugger Devpack - Only relevant for the SensorTag */ +#ifndef BOARD_CONF_DEBUGGER_DEVPACK +#define BOARD_CONF_DEBUGGER_DEVPACK 1 +#endif + /* Turn off example-provided putchars */ #define SLIP_BRIDGE_CONF_NO_PUTCHAR 1 #define SLIP_RADIO_CONF_NO_PUTCHAR 1 diff --git a/platform/srf06-cc26xx/contiki-main.c b/platform/srf06-cc26xx/contiki-main.c index 5cc5d83fa..83b67118f 100644 --- a/platform/srf06-cc26xx/contiki-main.c +++ b/platform/srf06-cc26xx/contiki-main.c @@ -32,11 +32,12 @@ * \addtogroup cc26xx-platforms * @{ * - * \defgroup cc26xx-srf-tag SmartRF+CC26xx EM and the CC26xx SensorTag 2.0 + * \defgroup cc26xx-srf-tag SmartRF+CC13xx/CC26xx EM and the CC2650 SensorTag * - * This platform supports two different boards: - * 1) A standard TI SmartRF06EB with a CC26xx EM mounted on it and - * 2) The new TI SensorTag2.0 + * This platform supports a number of different boards: + * - A standard TI SmartRF06EB with a CC26xx EM mounted on it + * - A standard TI SmartRF06EB with a CC1310 EM mounted on it + * - The new TI SensorTag2.0 * @{ */ #include "ti-lib.h" @@ -49,10 +50,9 @@ #include "dev/oscillators.h" #include "ieee-addr.h" #include "vims.h" -#include "cc26xx-model.h" #include "dev/cc26xx-uart.h" -#include "dev/cc26xx-rtc.h" -#include "dev/cc26xx-rf.h" +#include "dev/soc-rtc.h" +#include "rf-core/rf-core.h" #include "sys_ctrl.h" #include "uart.h" #include "sys/clock.h" @@ -66,6 +66,9 @@ #include /*---------------------------------------------------------------------------*/ +/** \brief Board specific iniatialisation */ +void board_init(void); +/*---------------------------------------------------------------------------*/ static void fade(unsigned char l) { @@ -102,7 +105,7 @@ set_rf_params(void) NETSTACK_RADIO.set_value(RADIO_PARAM_PAN_ID, IEEE802154_PANID); NETSTACK_RADIO.set_value(RADIO_PARAM_16BIT_ADDR, short_addr); - NETSTACK_RADIO.set_value(RADIO_PARAM_CHANNEL, CC26XX_RF_CHANNEL); + NETSTACK_RADIO.set_value(RADIO_PARAM_CHANNEL, RF_CORE_CHANNEL); NETSTACK_RADIO.set_object(RADIO_PARAM_64BIT_ADDR, ext_addr, 8); NETSTACK_RADIO.get_value(RADIO_PARAM_CHANNEL, &val); @@ -123,7 +126,7 @@ set_rf_params(void) /** * \brief Main function for CC26xx-based platforms * - * The same main() is used for both Srf+CC26xxEM as well as for the SensorTag + * The same main() is used for all supported boards */ int main(void) @@ -157,7 +160,7 @@ main(void) ti_lib_int_master_enable(); - cc26xx_rtc_init(); + soc_rtc_init(); clock_init(); rtimer_init(); @@ -176,7 +179,7 @@ main(void) printf("Starting " CONTIKI_VERSION_STRING "\n"); printf("With DriverLib v%u.%u\n", DRIVERLIB_RELEASE_GROUP, DRIVERLIB_RELEASE_BUILD); - printf(BOARD_STRING " using CC%u\n", CC26XX_MODEL_CPU_VARIANT); + printf(BOARD_STRING "\n"); process_start(&etimer_process, NULL); ctimer_init(); diff --git a/platform/srf06-cc26xx/sensortag/Makefile.sensortag b/platform/srf06-cc26xx/sensortag/Makefile.sensortag index 94de7711f..a37f8dd05 100644 --- a/platform/srf06-cc26xx/sensortag/Makefile.sensortag +++ b/platform/srf06-cc26xx/sensortag/Makefile.sensortag @@ -1,7 +1,9 @@ CFLAGS += -DBOARD_SENSORTAG=1 CFLAGS += -DBACKDOOR_IOID=0x00000000 -BOARD_SOURCEFILES += leds-arch.c sensortag-sensors.c sensor-common.c +CONTIKI_TARGET_DIRS += sensortag + +BOARD_SOURCEFILES += sensortag-sensors.c sensor-common.c BOARD_SOURCEFILES += bmp-280-sensor.c tmp-007-sensor.c opt-3001-sensor.c BOARD_SOURCEFILES += hdc-1000-sensor.c mpu-9250-sensor.c button-sensor.c BOARD_SOURCEFILES += reed-relay.c ext-flash.c buzzer.c diff --git a/platform/srf06-cc26xx/sensortag/board-i2c.c b/platform/srf06-cc26xx/sensortag/board-i2c.c index a2b0ba5d2..7783cf2f0 100644 --- a/platform/srf06-cc26xx/sensortag/board-i2c.c +++ b/platform/srf06-cc26xx/sensortag/board-i2c.c @@ -79,9 +79,6 @@ board_i2c_wakeup() ti_lib_prcm_load_set(); while(!ti_lib_prcm_load_get()); - /* Reset the I2C controller */ - ti_lib_hapi_reset_peripheral(PRCM_PERIPH_I2C0); - /* Enable and initialize the I2C master module */ ti_lib_i2c_master_init_exp_clk(I2C0_BASE, ti_lib_sys_ctrl_clock_get(), true); diff --git a/platform/srf06-cc26xx/sensortag/button-sensor.c b/platform/srf06-cc26xx/sensortag/button-sensor.c index 06a2d2eaa..921d96b20 100644 --- a/platform/srf06-cc26xx/sensortag/button-sensor.c +++ b/platform/srf06-cc26xx/sensortag/button-sensor.c @@ -55,7 +55,7 @@ /*---------------------------------------------------------------------------*/ #define BUTTON_GPIO_CFG (IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | \ IOC_IOPULL_UP | IOC_SLEW_DISABLE | \ - IOC_HYST_ENABLE | IOC_BOTH_EDGES | \ + IOC_HYST_DISABLE | IOC_BOTH_EDGES | \ IOC_INT_ENABLE | IOC_IOMODE_NORMAL | \ IOC_NO_WAKE_UP | IOC_INPUT_ENABLE) /*---------------------------------------------------------------------------*/ diff --git a/platform/srf06-cc26xx/sensortag/cc2650/Makefile.cc2650 b/platform/srf06-cc26xx/sensortag/cc2650/Makefile.cc2650 new file mode 100644 index 000000000..5b7cdadd9 --- /dev/null +++ b/platform/srf06-cc26xx/sensortag/cc2650/Makefile.cc2650 @@ -0,0 +1,11 @@ +### Add to the source list +BOARD_SOURCEFILES += leds-arch.c + +### Will allow the inclusion of the correct CPU makefile +CPU_FAMILY = cc26xx + +### Add to the source dirs +CONTIKI_TARGET_DIRS += sensortag/cc2650 + +### Include the common sensortag makefile +include $(PLATFORM_ROOT_DIR)/sensortag/Makefile.sensortag diff --git a/platform/srf06-cc26xx/sensortag/board.h b/platform/srf06-cc26xx/sensortag/cc2650/board.h similarity index 97% rename from platform/srf06-cc26xx/sensortag/board.h rename to platform/srf06-cc26xx/sensortag/cc2650/board.h index fc293f5c0..9f0a7abd3 100644 --- a/platform/srf06-cc26xx/sensortag/board.h +++ b/platform/srf06-cc26xx/sensortag/cc2650/board.h @@ -33,13 +33,13 @@ * * \defgroup sensortag-cc26xx-peripherals Sensortag Peripherals * - * Defines related to the Sensortag-CC26XX + * Defines related to the CC2650 Sensortag * * This file provides connectivity information on LEDs, Buttons, UART and * other peripherals * * This file can be used as the basis to configure other boards using the - * CC26XX code as their basis. + * CC13xx/CC26xx code as their basis. * * This file is not meant to be modified by the user. * @{ @@ -103,8 +103,13 @@ #define BOARD_IOID_DP4_UARTRX IOID_28 #define BOARD_IOID_DP5_UARTTX IOID_29 +#if BOARD_CONF_DEBUGGER_DEVPACK #define BOARD_IOID_UART_RX BOARD_IOID_DP4_UARTRX +#define BOARD_IOID_UART_TX BOARD_IOID_DP5_UARTTX +#else +#define BOARD_IOID_UART_RX IOID_17 #define BOARD_IOID_UART_TX IOID_16 +#endif #define BOARD_IOID_UART_CTS IOID_UNUSED #define BOARD_IOID_UART_RTS IOID_UNUSED @@ -231,13 +236,6 @@ */ #define BOARD_STRING "TI CC2650 SensorTag" -/** @} */ -/*---------------------------------------------------------------------------*/ -/** - * \brief Board specific iniatialisation - * @{ - */ -void board_init(void); /** @} */ /*---------------------------------------------------------------------------*/ #endif /* BOARD_H_ */ diff --git a/platform/srf06-cc26xx/sensortag/leds-arch.c b/platform/srf06-cc26xx/sensortag/cc2650/leds-arch.c similarity index 100% rename from platform/srf06-cc26xx/sensortag/leds-arch.c rename to platform/srf06-cc26xx/sensortag/cc2650/leds-arch.c diff --git a/platform/srf06-cc26xx/srf06/Makefile.srf06 b/platform/srf06-cc26xx/srf06/Makefile.srf06 index ee64aa519..d94181927 100644 --- a/platform/srf06-cc26xx/srf06/Makefile.srf06 +++ b/platform/srf06-cc26xx/srf06/Makefile.srf06 @@ -1,3 +1,5 @@ CFLAGS += -DBOARD_SMARTRF06EB=1 +CONTIKI_TARGET_DIRS += srf06 + BOARD_SOURCEFILES += leds-arch.c srf06-sensors.c button-sensor.c board.c diff --git a/platform/srf06-cc26xx/srf06/board-peripherals.h b/platform/srf06-cc26xx/srf06/board-peripherals.h index def762b56..d76936c2d 100644 --- a/platform/srf06-cc26xx/srf06/board-peripherals.h +++ b/platform/srf06-cc26xx/srf06/board-peripherals.h @@ -28,13 +28,18 @@ * OF THE POSSIBILITY OF SUCH DAMAGE. */ /*---------------------------------------------------------------------------*/ -/** \addtogroup srf06-cc26xx-peripherals +/** \addtogroup cc26xx-srf-tag * @{ * - * \file - * Header file with definitions related to the Srf06EB peripherals + * \defgroup srf06-common-peripherals SmartRF06EB + CC13xx/CC26xx common * - * \note Do not include this file directly. + * Defines related to the SmartRF06 Evaluation Board irrespective of the EM + * mounted on it + * + * This file provides connectivity information on LEDs, Buttons, UART and + * other peripherals + * + * @{ */ /*---------------------------------------------------------------------------*/ #ifndef BOARD_PERIPHERALS_H_ @@ -45,5 +50,6 @@ #endif /* BOARD_PERIPHERALS_H_ */ /*---------------------------------------------------------------------------*/ /** + * @} * @} */ diff --git a/platform/srf06-cc26xx/srf06/board.c b/platform/srf06-cc26xx/srf06/board.c index 1d98d4e0d..9f53e8ae8 100644 --- a/platform/srf06-cc26xx/srf06/board.c +++ b/platform/srf06-cc26xx/srf06/board.c @@ -29,11 +29,11 @@ */ /*---------------------------------------------------------------------------*/ /** - * \addtogroup sensortag-cc26xx-peripherals + * \addtogroup sensortag-common-peripherals * @{ * * \file - * Board-initialisation for the Srf06EB with a CC26xx EM. + * Board-initialisation for the Srf06EB with a CC13xx/CC26xx EM. */ /*---------------------------------------------------------------------------*/ #include "contiki-conf.h" diff --git a/platform/srf06-cc26xx/srf06/button-sensor.c b/platform/srf06-cc26xx/srf06/button-sensor.c index 5cd541e6c..b397e86f5 100644 --- a/platform/srf06-cc26xx/srf06/button-sensor.c +++ b/platform/srf06-cc26xx/srf06/button-sensor.c @@ -29,11 +29,11 @@ */ /*---------------------------------------------------------------------------*/ /** - * \addtogroup srf06-cc26xx-peripherals + * \addtogroup srf06-common-peripherals * @{ * * \file - * Driver for the SmartRF06EB buttons when a CC26xxEM is mounted on the board + * Driver for the SmartRF06EB buttons when a CC13xx/CC26xxEM is mounted on it */ /*---------------------------------------------------------------------------*/ #include "contiki.h" @@ -55,7 +55,7 @@ /*---------------------------------------------------------------------------*/ #define BUTTON_GPIO_CFG (IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | \ IOC_IOPULL_UP | IOC_SLEW_DISABLE | \ - IOC_HYST_ENABLE | IOC_BOTH_EDGES | \ + IOC_HYST_DISABLE | IOC_BOTH_EDGES | \ IOC_INT_ENABLE | IOC_IOMODE_NORMAL | \ IOC_NO_WAKE_UP | IOC_INPUT_ENABLE) /*---------------------------------------------------------------------------*/ diff --git a/platform/srf06-cc26xx/srf06/button-sensor.h b/platform/srf06-cc26xx/srf06/button-sensor.h index 2c47f9118..1c810c96d 100644 --- a/platform/srf06-cc26xx/srf06/button-sensor.h +++ b/platform/srf06-cc26xx/srf06/button-sensor.h @@ -29,11 +29,11 @@ */ /*---------------------------------------------------------------------------*/ /** - * \addtogroup srf06-cc26xx-peripherals + * \addtogroup srf06-common-peripherals * @{ * * \file - * Header file for the SmartRF06EB + CC26xxEM Button Driver + * Header file for the SmartRF06EB + CC13xx/CC26xxEM Button Driver */ /*---------------------------------------------------------------------------*/ #ifndef BUTTON_SENSOR_H_ diff --git a/platform/srf06-cc26xx/srf06/cc13xx/Makefile.cc13xx b/platform/srf06-cc26xx/srf06/cc13xx/Makefile.cc13xx new file mode 100644 index 000000000..b83084651 --- /dev/null +++ b/platform/srf06-cc26xx/srf06/cc13xx/Makefile.cc13xx @@ -0,0 +1,7 @@ +### Will allow the inclusion of the correct CPU makefile +CPU_FAMILY = cc13xx + +### Include the common sensortag makefile +include $(PLATFORM_ROOT_DIR)/srf06/Makefile.srf06 + +CONTIKI_TARGET_DIRS += srf06/cc13xx diff --git a/platform/srf06-cc26xx/srf06/cc13xx/board.h b/platform/srf06-cc26xx/srf06/cc13xx/board.h new file mode 100644 index 000000000..eff486fc5 --- /dev/null +++ b/platform/srf06-cc26xx/srf06/cc13xx/board.h @@ -0,0 +1,242 @@ +/* + * Copyright (c) 2014, Texas Instruments Incorporated - http://www.ti.com/ + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +/** \addtogroup cc26xx-srf-tag + * @{ + * + * \defgroup srf06-cc13xx-peripherals Peripherals for the SmartRF06EB + CC1310EM + * + * Defines related to the SmartRF06 Evaluation Board with a CC1310EM + * + * This file provides connectivity information on LEDs, Buttons, UART and + * other peripherals + * + * This file can be used as the basis to configure other boards using the + * CC13xx/CC26xx code as their basis. + * + * This file is not meant to be modified by the user. + * @{ + * + * \file + * Header file with definitions related to the I/O connections on the TI + * SmartRF06 Evaluation Board with a CC1310EM + * + * \note Do not include this file directly. It gets included by contiki-conf + * after all relevant directives have been set. + */ +/*---------------------------------------------------------------------------*/ +#ifndef BOARD_H_ +#define BOARD_H_ +/*---------------------------------------------------------------------------*/ +#include "ioc.h" +/*---------------------------------------------------------------------------*/ +/** + * \name LED configurations + * + * Those values are not meant to be modified by the user + * @{ + */ +/* Some files include leds.h before us, so we need to get rid of defaults in + * leds.h before we provide correct definitions */ +#undef LEDS_GREEN +#undef LEDS_YELLOW +#undef LEDS_RED +#undef LEDS_CONF_ALL + +#define LEDS_RED 1 /**< LED1 (Red) */ +#define LEDS_YELLOW 2 /**< LED2 (Yellow) */ +#define LEDS_GREEN 4 /**< LED3 (Green) */ +#define LEDS_ORANGE 8 /**< LED4 (Orange) */ + +#define LEDS_CONF_ALL 15 + +/* Notify various examples that we have LEDs */ +#define PLATFORM_HAS_LEDS 1 +/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * \name LED IOID mappings + * + * Those values are not meant to be modified by the user + * @{ + */ +#define BOARD_IOID_LED_1 IOID_25 +#define BOARD_IOID_LED_2 IOID_27 +#define BOARD_IOID_LED_3 IOID_7 +#define BOARD_IOID_LED_4 IOID_6 +#define BOARD_LED_1 (1 << BOARD_IOID_LED_1) +#define BOARD_LED_2 (1 << BOARD_IOID_LED_2) +#define BOARD_LED_3 (1 << BOARD_IOID_LED_3) +#define BOARD_LED_4 (1 << BOARD_IOID_LED_4) +#define BOARD_LED_ALL (BOARD_LED_1 | BOARD_LED_2 | BOARD_LED_3 | \ + BOARD_LED_4) +/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * \name UART IOID mapping + * + * Those values are not meant to be modified by the user + * @{ + */ +#define BOARD_IOID_UART_RX IOID_2 +#define BOARD_IOID_UART_TX IOID_3 +#define BOARD_IOID_UART_CTS IOID_UNUSED +#define BOARD_IOID_UART_RTS IOID_UNUSED +#define BOARD_UART_RX (1 << BOARD_IOID_UART_RX) +#define BOARD_UART_TX (1 << BOARD_IOID_UART_TX) +#define BOARD_UART_CTS (1 << BOARD_IOID_UART_CTS) +#define BOARD_UART_RTS (1 << BOARD_IOID_UART_RTS) +/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * \name Button IOID mapping + * + * Those values are not meant to be modified by the user + * @{ + */ +#define BOARD_IOID_KEY_LEFT IOID_15 +#define BOARD_IOID_KEY_RIGHT IOID_18 +#define BOARD_IOID_KEY_UP IOID_19 +#define BOARD_IOID_KEY_DOWN IOID_12 +#define BOARD_IOID_KEY_SELECT IOID_11 +#define BOARD_KEY_LEFT (1 << BOARD_IOID_KEY_LEFT) +#define BOARD_KEY_RIGHT (1 << BOARD_IOID_KEY_RIGHT) +#define BOARD_KEY_UP (1 << BOARD_IOID_KEY_UP) +#define BOARD_KEY_DOWN (1 << BOARD_IOID_KEY_DOWN) +#define BOARD_KEY_SELECT (1 << BOARD_IOID_KEY_SELECT) +/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * \name 3.3V domain IOID mapping + * + * Those values are not meant to be modified by the user + * @{ + */ +#define BOARD_IOID_3V3_EN IOID_13 +#define BOARD_3V3_EN (1 << BOARD_IOID_3V3_EN) +/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * \name SPI IOID mapping + * + * Those values are not meant to be modified by the user + * @{ + */ +#define BOARD_IOID_SPI_SCK IOID_10 +#define BOARD_IOID_SPI_MOSI IOID_9 +#define BOARD_IOID_SPI_MISO IOID_8 +#define BOARD_SPI_SCK (1 << BOARD_IOID_SPI_SCK) +#define BOARD_SPI_MOSI (1 << BOARD_IOID_SPI_MOSI) +#define BOARD_SPI_MISO (1 << BOARD_IOID_SPI_MISO) +/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * \name LCD IOID mapping + * + * Those values are not meant to be modified by the user + * @{ + */ +#define BOARD_IOID_LCD_MODE IOID_4 +#define BOARD_IOID_LCD_RST IOID_5 +#define BOARD_IOID_LCD_CS IOID_14 +#define BOARD_IOID_LCD_SCK BOARD_IOID_SPI_SCK +#define BOARD_IOID_LCD_MOSI BOARD_IOID_SPI_MOSI +#define BOARD_LCD_MODE (1 << BOARD_IOID_LCD_MODE) +#define BOARD_LCD_RST (1 << BOARD_IOID_LCD_RST) +#define BOARD_LCD_CS (1 << BOARD_IOID_LCD_CS) +#define BOARD_LCD_SCK BOARD_SPI_SCK +#define BOARD_LCD_MOSI BOARD_SPI_MOSI +/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * \name SD Card IOID mapping + * + * Those values are not meant to be modified by the user + * @{ + */ +#define BOARD_IOID_SDCARD_CS IOID_30 +#define BOARD_SDCARD_CS (1 << BOARD_IOID_SDCARD_CS) +#define BOARD_IOID_SDCARD_SCK BOARD_IOID_SPI_SCK +#define BOARD_SDCARD_SCK BOARD_SPI_SCK +#define BOARD_IOID_SDCARD_MOSI BOARD_IOID_SPI_MOSI +#define BOARD_SDCARD_MOSI BOARD_SPI_MOSI +#define BOARD_IOID_SDCARD_MISO BOARD_IOID_SPI_MISO +#define BOARD_SDCARD_MISO BOARD_SPI_MISO +/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * \name ALS IOID mapping + * + * Those values are not meant to be modified by the user + * @{ + */ +#define BOARD_IOID_ALS_PWR IOID_26 +#define BOARD_IOID_ALS_OUT IOID_23 +#define BOARD_ALS_PWR (1 << BOARD_IOID_ALS_PWR) +#define BOARD_ALS_OUT (1 << BOARD_IOID_ALS_OUT) +/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * \name ACC IOID mapping + * + * Those values are not meant to be modified by the user + * @{ + */ +#define BOARD_IOID_ACC_PWR IOID_20 +#define BOARD_IOID_ACC_INT IOID_28 +#define BOARD_IOID_ACC_INT1 IOID_28 +#define BOARD_IOID_ACC_INT2 IOID_29 +#define BOARD_IOID_ACC_CS IOID_24 +#define BOARD_ACC_PWR (1 << BOARD_IOID_ACC_PWR) +#define BOARD_ACC_INT (1 << BOARD_IOID_ACC_INT) +#define BOARD_ACC_INT1 (1 << BOARD_IOID_ACC_INT1) +#define BOARD_ACC_INT2 (1 << BOARD_IOID_ACC_INT2) +#define BOARD_ACC_CS (1 << BOARD_IOID_ACC_CS) +#define BOARD_IOID_ACC_SCK BOARD_IOID_SPI_SCK +#define BOARD_ACC_SCK BOARD_SPI_SCK +#define BOARD_IOID_ACC_MOSI BOARD_IOID_SPI_MOSI +#define BOARD_ACC_MOSI BOARD_SPI_MOSI +#define BOARD_IOID_ACC_MISO BOARD_IOID_SPI_MISO +#define BOARD_ACC_MISO BOARD_SPI_MISO +/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * \name Device string used on startup + * @{ + */ +#define BOARD_STRING "TI SmartRF06EB + CC13xx EM" +/** @} */ +/*---------------------------------------------------------------------------*/ +#endif /* BOARD_H_ */ +/*---------------------------------------------------------------------------*/ +/** + * @} + * @} + */ diff --git a/platform/srf06-cc26xx/srf06/cc26xx/Makefile.cc26xx b/platform/srf06-cc26xx/srf06/cc26xx/Makefile.cc26xx new file mode 100644 index 000000000..841442a5c --- /dev/null +++ b/platform/srf06-cc26xx/srf06/cc26xx/Makefile.cc26xx @@ -0,0 +1,7 @@ +### Will allow the inclusion of the correct CPU makefile +CPU_FAMILY = cc26xx + +### Include the common makefile +include $(PLATFORM_ROOT_DIR)/srf06/Makefile.srf06 + +CONTIKI_TARGET_DIRS += srf06/cc26xx diff --git a/platform/srf06-cc26xx/srf06/board.h b/platform/srf06-cc26xx/srf06/cc26xx/board.h similarity index 97% rename from platform/srf06-cc26xx/srf06/board.h rename to platform/srf06-cc26xx/srf06/cc26xx/board.h index b222bb17c..3dd064bc3 100644 --- a/platform/srf06-cc26xx/srf06/board.h +++ b/platform/srf06-cc26xx/srf06/cc26xx/board.h @@ -39,7 +39,7 @@ * other peripherals * * This file can be used as the basis to configure other boards using the - * CC26xx code as their basis. + * CC13xx/CC26xx code as their basis. * * This file is not meant to be modified by the user. * @{ @@ -231,14 +231,7 @@ * \name Device string used on startup * @{ */ -#define BOARD_STRING "TI SmartRF06EB+CC26xx EM" -/** @} */ -/*---------------------------------------------------------------------------*/ -/** - * \brief Board specific iniatialisation - * @{ - */ -void board_init(void); +#define BOARD_STRING "TI SmartRF06EB + CC26xx EM" /** @} */ /*---------------------------------------------------------------------------*/ #endif /* BOARD_H_ */ diff --git a/platform/srf06-cc26xx/srf06/leds-arch.c b/platform/srf06-cc26xx/srf06/leds-arch.c index ce1c29c50..423789350 100644 --- a/platform/srf06-cc26xx/srf06/leds-arch.c +++ b/platform/srf06-cc26xx/srf06/leds-arch.c @@ -29,11 +29,11 @@ */ /*---------------------------------------------------------------------------*/ /** - * \addtogroup srf06-cc26xx-peripherals + * \addtogroup srf06-common-peripherals * @{ * * \file - * Driver for the SmartRF06EB LEDs when a CC26xx is mounted on the board + * Driver for the SmartRF06EB LEDs when a CC13xx/CC26xx EM is mounted on it */ /*---------------------------------------------------------------------------*/ #include "contiki.h" diff --git a/platform/srf06-cc26xx/srf06/srf06-sensors.c b/platform/srf06-cc26xx/srf06/srf06-sensors.c index c69b4c22f..9f05c1917 100644 --- a/platform/srf06-cc26xx/srf06/srf06-sensors.c +++ b/platform/srf06-cc26xx/srf06/srf06-sensors.c @@ -29,7 +29,7 @@ */ /*---------------------------------------------------------------------------*/ /** - * \addtogroup srf06-cc26xx-peripherals + * \addtogroup srf06-common-peripherals * @{ * * \file From 72b586cb7d226e2760820e4b616a767385a5f02d Mon Sep 17 00:00:00 2001 From: Jonas Olsson Date: Sun, 16 Aug 2015 16:33:44 +0100 Subject: [PATCH 3/8] Modify cc26xx examples to play nicely with the CC13xx addition --- examples/cc26xx/README.md | 11 +++--- examples/cc26xx/cc26xx-demo.c | 8 ++--- examples/cc26xx/cc26xx-web-demo/README.md | 9 +++-- .../cc26xx/cc26xx-web-demo/cc26xx-web-demo.h | 6 +++- examples/cc26xx/cc26xx-web-demo/coap-server.c | 6 ++-- .../cc26xx/cc26xx-web-demo/project-conf.h | 6 ++-- .../cc26xx-web-demo/resources/res-ble-advd.c | 10 +++--- .../cc26xx-web-demo/resources/res-device.c | 36 ++++++++++++++++--- examples/cc26xx/project-conf.h | 6 ++-- 9 files changed, 62 insertions(+), 36 deletions(-) diff --git a/examples/cc26xx/README.md b/examples/cc26xx/README.md index 411bc9407..af20f6e3f 100644 --- a/examples/cc26xx/README.md +++ b/examples/cc26xx/README.md @@ -6,8 +6,9 @@ boards. More specifically, the example demonstrates: * How to take sensor readings * How to use buttons and the reed relay (triggered by holding a magnet near S3 on the SensorTag). -* How to send out BLE advertisements. The device will periodically send out BLE - beacons with the platform name as payload. Those beacons/BLE ADV packets can - be captured with any BLE capable device. Two such applications for iOS are the - TI Multitool and the TI Sensortag app. They can be found in the Apple App - Store. If you have a BLE-capable Mac, you can also use LightBlue for OS X. +* How to send out BLE advertisements, if the chip has BLE capability. The + device will periodically send out BLE beacons with the platform name as + payload. Those beacons/BLE ADV packets can be captured with any BLE-capable + device. Two such applications for iOS are the TI Multitool and the TI + Sensortag app. They can be found in the Apple App Store. If you have a + BLE-capable Mac, you can also use LightBlue for OS X. diff --git a/examples/cc26xx/cc26xx-demo.c b/examples/cc26xx/cc26xx-demo.c index 1426bb983..544ae4dd8 100644 --- a/examples/cc26xx/cc26xx-demo.c +++ b/examples/cc26xx/cc26xx-demo.c @@ -88,13 +88,12 @@ #include "sys/etimer.h" #include "sys/ctimer.h" #include "dev/leds.h" -#include "dev/serial-line.h" #include "dev/watchdog.h" #include "random.h" #include "button-sensor.h" #include "batmon-sensor.h" #include "board-peripherals.h" -#include "cc26xx-rf.h" +#include "rf-core/rf-ble.h" #include "ti-lib.h" @@ -104,7 +103,6 @@ #define CC26XX_DEMO_LOOP_INTERVAL (CLOCK_SECOND * 20) #define CC26XX_DEMO_LEDS_PERIODIC LEDS_YELLOW #define CC26XX_DEMO_LEDS_BUTTON LEDS_RED -#define CC26XX_DEMO_LEDS_SERIAL_IN LEDS_ORANGE #define CC26XX_DEMO_LEDS_REBOOT LEDS_ALL /*---------------------------------------------------------------------------*/ #define CC26XX_DEMO_SENSOR_NONE (void *)0xFFFFFFFF @@ -370,8 +368,8 @@ PROCESS_THREAD(cc26xx_demo_process, ev, data) init_sensors(); /* Init the BLE advertisement daemon */ - cc26xx_rf_ble_beacond_config(0, BOARD_STRING); - cc26xx_rf_ble_beacond_start(); + rf_ble_beacond_config(0, BOARD_STRING); + rf_ble_beacond_start(); etimer_set(&et, CC26XX_DEMO_LOOP_INTERVAL); get_sync_sensor_readings(); diff --git a/examples/cc26xx/cc26xx-web-demo/README.md b/examples/cc26xx/cc26xx-web-demo/README.md index 194336a56..67b28ba93 100644 --- a/examples/cc26xx/cc26xx-web-demo/README.md +++ b/examples/cc26xx/cc26xx-web-demo/README.md @@ -10,12 +10,11 @@ demonstrate the CC26xx capability. The applications are: * A web server which can be used to display sensor readings but also to configure MQTT functionality -The example has been configured to run for both CC26xx-based boards: i) The -SensorTag 2.0 and ii) The Srf06EB with a CC26xx EM mounted on it. +The example has been configured to run for all CC26xx-based boards: i) The +SensorTag 2.0 and ii) The Srf06EB with a CC26xx or CC13xx EM mounted on it. -To build the example for the Srf, simply run `make`. To build for the tag, -run `make BOARD=sensortag`. Do not forget to `make clean` when switching -between the two platforms. +To change between target boards, follow the instructions in the platform's +REDME file. Do not forget to `make clean` when switching between the boards. You can disable some of those individual components by changing the respective defines in `project-conf.h`. For instance, to disable the CoAP functionality, diff --git a/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.h b/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.h index a501925e8..18c0289d4 100644 --- a/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.h +++ b/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.h @@ -91,7 +91,7 @@ /* Force an MQTT publish on sensor event */ #define CC26XX_WEB_DEMO_MQTT_PUBLISH_TRIGGER &reed_relay_sensor #else -#define CC26XX_WEB_DEMO_MQTT_PUBLISH_TRIGGER &button_right_sensor +#define CC26XX_WEB_DEMO_MQTT_PUBLISH_TRIGGER &button_down_sensor #endif #define CC26XX_WEB_DEMO_STATUS_LED LEDS_GREEN @@ -101,7 +101,11 @@ /*---------------------------------------------------------------------------*/ /* Default configuration values */ #define CC26XX_WEB_DEMO_DEFAULT_ORG_ID "quickstart" +#if CPU_FAMILY_CC13XX +#define CC26XX_WEB_DEMO_DEFAULT_TYPE_ID "cc13xx" +#else #define CC26XX_WEB_DEMO_DEFAULT_TYPE_ID "cc26xx" +#endif #define CC26XX_WEB_DEMO_DEFAULT_EVENT_TYPE_ID "status" #define CC26XX_WEB_DEMO_DEFAULT_SUBSCRIBE_CMD_TYPE "+" #define CC26XX_WEB_DEMO_DEFAULT_BROKER_PORT 1883 diff --git a/examples/cc26xx/cc26xx-web-demo/coap-server.c b/examples/cc26xx/cc26xx-web-demo/coap-server.c index 0b434d170..4dec9cce2 100644 --- a/examples/cc26xx/cc26xx-web-demo/coap-server.c +++ b/examples/cc26xx/cc26xx-web-demo/coap-server.c @@ -39,7 +39,7 @@ #include "contiki-net.h" #include "rest-engine.h" #include "board-peripherals.h" -#include "dev/cc26xx-rf.h" +#include "rf-core/rf-ble.h" #include #include @@ -56,7 +56,7 @@ extern resource_t res_device_hw; extern resource_t res_device_uptime; extern resource_t res_device_cfg_reset; -#if CC26XX_RF_BLE_SUPPORT +#if RF_BLE_ENABLED extern resource_t res_ble_advd; #endif @@ -138,7 +138,7 @@ PROCESS_THREAD(coap_server_process, ev, data) rest_activate_resource(&res_device_uptime, "dev/uptime"); rest_activate_resource(&res_device_cfg_reset, "dev/cfg_reset"); -#if CC26XX_RF_BLE_SUPPORT +#if RF_BLE_ENABLED rest_activate_resource(&res_ble_advd, "dev/ble_advd"); #endif diff --git a/examples/cc26xx/cc26xx-web-demo/project-conf.h b/examples/cc26xx/cc26xx-web-demo/project-conf.h index b7baac119..ee77b125f 100644 --- a/examples/cc26xx/cc26xx-web-demo/project-conf.h +++ b/examples/cc26xx/cc26xx-web-demo/project-conf.h @@ -32,11 +32,9 @@ #define PROJECT_CONF_H_ /*---------------------------------------------------------------------------*/ /* Change to match your configuration */ -#define NETSTACK_CONF_RDC contikimac_driver #define IEEE802154_CONF_PANID 0xABCD -#define CC26XX_RF_CONF_CHANNEL 25 -#define CC26XX_MODEL_CONF_CPU_VARIANT 2650 /* CC2650 */ -#define CC26XX_RF_CONF_BLE_SUPPORT 1 /* Only available with CC2650 */ +#define RF_CORE_CONF_CHANNEL 25 +#define RF_BLE_CONF_ENABLED 1 /*---------------------------------------------------------------------------*/ /* Enable/Disable Components of this Demo */ #define CC26XX_WEB_DEMO_CONF_MQTT_CLIENT 1 diff --git a/examples/cc26xx/cc26xx-web-demo/resources/res-ble-advd.c b/examples/cc26xx/cc26xx-web-demo/resources/res-ble-advd.c index 0604c7ac9..68693b737 100644 --- a/examples/cc26xx/cc26xx-web-demo/resources/res-ble-advd.c +++ b/examples/cc26xx/cc26xx-web-demo/resources/res-ble-advd.c @@ -38,7 +38,7 @@ #include "contiki.h" #include "rest-engine.h" #include "er-coap.h" -#include "dev/cc26xx-rf.h" +#include "rf-core/rf-ble.h" #include #include @@ -64,7 +64,7 @@ res_ble_post_put_handler(void *request, void *response, uint8_t *buffer, if(len > 0 && len < BLE_NAME_BUF_LEN) { memcpy(name, text, len); - cc26xx_rf_ble_beacond_config(0, name); + rf_ble_beacond_config(0, name); success = 1; } @@ -73,7 +73,7 @@ res_ble_post_put_handler(void *request, void *response, uint8_t *buffer, rv = atoi(text); if(rv > 0) { - cc26xx_rf_ble_beacond_config((clock_time_t)(rv * CLOCK_SECOND), NULL); + rf_ble_beacond_config((clock_time_t)(rv * CLOCK_SECOND), NULL); success = 1; } @@ -81,7 +81,7 @@ res_ble_post_put_handler(void *request, void *response, uint8_t *buffer, if(len) { if(strncmp(text, "on", len) == 0) { - if(cc26xx_rf_ble_beacond_start()) { + if(rf_ble_beacond_start()) { success = 1; } else { REST.set_response_status(response, REST.status.FORBIDDEN); @@ -90,7 +90,7 @@ res_ble_post_put_handler(void *request, void *response, uint8_t *buffer, return; } } else if(strncmp(text, "off", len) == 0) { - cc26xx_rf_ble_beacond_stop(); + rf_ble_beacond_stop(); success = 1; } else { success = 0; diff --git a/examples/cc26xx/cc26xx-web-demo/resources/res-device.c b/examples/cc26xx/cc26xx-web-demo/resources/res-device.c index 84cef8e24..62e8dc6dc 100644 --- a/examples/cc26xx/cc26xx-web-demo/resources/res-device.c +++ b/examples/cc26xx/cc26xx-web-demo/resources/res-device.c @@ -40,37 +40,65 @@ #include "rest-engine.h" #include "er-coap.h" #include "sys/clock.h" -#include "cc26xx-model.h" #include "coap-server.h" #include "cc26xx-web-demo.h" +#include "ti-lib.h" + #include /*---------------------------------------------------------------------------*/ +static uint16_t +detect_chip(void) +{ + if(ti_lib_chipinfo_chip_family_is_cc26xx()) { + if(ti_lib_chipinfo_supports_ieee_802_15_4() == true) { + if(ti_lib_chipinfo_supports_ble() == true) { + return 2650; + } else { + return 2630; + } + } else { + return 2640; + } + } else if(ti_lib_chipinfo_chip_family_is_cc13xx()) { + if(ti_lib_chipinfo_supports_ble() == false && + ti_lib_chipinfo_supports_ieee_802_15_4() == false) { + return 1310; + } else if(ti_lib_chipinfo_supports_ble() == true && + ti_lib_chipinfo_supports_ieee_802_15_4() == true) { + return 1350; + } + } + + return 0; +} +/*---------------------------------------------------------------------------*/ static void res_get_handler_hw(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { unsigned int accept = -1; + uint16_t chip = detect_chip(); REST.get_header_accept(request, &accept); if(accept == -1 || accept == REST.type.TEXT_PLAIN) { REST.set_header_content_type(response, REST.type.TEXT_PLAIN); snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%s on CC%u", BOARD_STRING, - CC26XX_MODEL_CPU_VARIANT); + chip); REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); } else if(accept == REST.type.APPLICATION_JSON) { REST.set_header_content_type(response, REST.type.APPLICATION_JSON); snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{\"HW Ver\":\"%s on CC%u\"}", - BOARD_STRING, CC26XX_MODEL_CPU_VARIANT); + BOARD_STRING, chip); REST.set_response_payload(response, buffer, strlen((char *)buffer)); } else if(accept == REST.type.APPLICATION_XML) { REST.set_header_content_type(response, REST.type.APPLICATION_XML); snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "", BOARD_STRING, - CC26XX_MODEL_CPU_VARIANT); + chip); REST.set_response_payload(response, buffer, strlen((char *)buffer)); } else { diff --git a/examples/cc26xx/project-conf.h b/examples/cc26xx/project-conf.h index 97bb52591..7c1363c16 100644 --- a/examples/cc26xx/project-conf.h +++ b/examples/cc26xx/project-conf.h @@ -35,11 +35,9 @@ #define BUTTON_SENSOR_CONF_ENABLE_SHUTDOWN 0 /*---------------------------------------------------------------------------*/ /* Change to match your configuration */ -#define NETSTACK_CONF_RDC contikimac_driver #define IEEE802154_CONF_PANID 0xABCD -#define CC26XX_RF_CONF_CHANNEL 25 -#define CC26XX_MODEL_CONF_CPU_VARIANT 2650 /* CC2650 */ -#define CC26XX_RF_CONF_BLE_SUPPORT 1 /* Only available with CC2650 */ +#define RF_CORE_CONF_CHANNEL 25 +#define RF_BLE_CONF_ENABLED 1 /*---------------------------------------------------------------------------*/ #endif /* PROJECT_CONF_H_ */ /*---------------------------------------------------------------------------*/ From bad7eb2bc89c142a5aac2ff9d7908205161ecac2 Mon Sep 17 00:00:00 2001 From: Jonas Olsson Date: Sun, 16 Aug 2015 16:35:45 +0100 Subject: [PATCH 4/8] Add a very sleepy CC26xx/CC13xx demo This demonstraties how to combine CC13xx tick suppression, RPL leaf mode and turning off ContikiMAC duty cycling to build an extremely low-consuming firmware. --- examples/cc26xx/very-sleepy-demo/Makefile | 12 + .../cc26xx/very-sleepy-demo/Makefile.target | 1 + examples/cc26xx/very-sleepy-demo/README.md | 91 ++++ .../cc26xx/very-sleepy-demo/project-conf.h | 51 +++ .../very-sleepy-demo/very-sleepy-demo.c | 423 ++++++++++++++++++ .../18-compile-arm-ports/Makefile | 1 + 6 files changed, 579 insertions(+) create mode 100644 examples/cc26xx/very-sleepy-demo/Makefile create mode 100644 examples/cc26xx/very-sleepy-demo/Makefile.target create mode 100644 examples/cc26xx/very-sleepy-demo/README.md create mode 100644 examples/cc26xx/very-sleepy-demo/project-conf.h create mode 100644 examples/cc26xx/very-sleepy-demo/very-sleepy-demo.c diff --git a/examples/cc26xx/very-sleepy-demo/Makefile b/examples/cc26xx/very-sleepy-demo/Makefile new file mode 100644 index 000000000..a1e794957 --- /dev/null +++ b/examples/cc26xx/very-sleepy-demo/Makefile @@ -0,0 +1,12 @@ +DEFINES+=PROJECT_CONF_H=\"project-conf.h\" +CONTIKI_PROJECT = very-sleepy-demo + +all: $(CONTIKI_PROJECT) + +CONTIKI_WITH_IPV6 = 1 + +APPS += er-coap +APPS += rest-engine + +CONTIKI = ../../.. +include $(CONTIKI)/Makefile.include diff --git a/examples/cc26xx/very-sleepy-demo/Makefile.target b/examples/cc26xx/very-sleepy-demo/Makefile.target new file mode 100644 index 000000000..15890aa6a --- /dev/null +++ b/examples/cc26xx/very-sleepy-demo/Makefile.target @@ -0,0 +1 @@ +TARGET = srf06-cc26xx diff --git a/examples/cc26xx/very-sleepy-demo/README.md b/examples/cc26xx/very-sleepy-demo/README.md new file mode 100644 index 000000000..fcdedf77f --- /dev/null +++ b/examples/cc26xx/very-sleepy-demo/README.md @@ -0,0 +1,91 @@ +# CC13xx/CC26xx Very Sleepy Demo + +This example demonstrates a way of deploying a very low-consuming, very sleepy +node. The node has two modes of operation: + +* Normal: ContikiMAC duty-cycles the radio as usual. The node is reachable. +* Very Sleepy: Radio cycling mostly off, except when we need to perform network + maintenance tasks. In this mode, the node is unreachable for most of the time. + +The node will operate in RPL leaf mode. This means that it will be reachable +downwards, but it will not advertise the DODAG and it will not participate in +routing. + +After booting, the node will enter "normal" mode. + +The node exposes an OBSERVEable CoAP resource. It will notify subscribers with +a new value for this resource every `interval` seconds. It will then stay in +normal mode for `duration` seconds. During this time window, it will be +reachable over the network in order to e.g. receive a new configuration. +When this time window expires, the node will switch back to very sleepy mode. +This will only happen if very sleepy mode has been enabled by setting `mode=1` +as per the instructions below. + +When the node is duty-cycling the radio, either because it is in normal mode or +because network maintenance is taking place, it will keep its green LED on thus +providing an indication that it is reachable. + +A normal mode stint can be manually triggered by pressing the left button. + +## Requirements + +To run this example you will need: + +* A border router operating with the same RDC, same channel, same radio mode + (e.g. IEEE or sub-ghz), same PAN ID. Alternatively, you can + use [6lbr](https://github.com/cetic/6lbr) with a suitable slip-radio. +* The [Copper (Cu)](https://addons.mozilla.org/en-US/firefox/addon/copper-270430/) + addon for Firefox + +## Configuration + +To configure the node, send a CoAP POST message to the `very_sleepy_config` +resource. The POST message's payload must specify _at least one_ of: + +* `mode=0|1`: Send `mode=1` to enable very sleepy mode, `mode=0` to disable it. +* `interval=n` where `n` is the number of seconds between two consecutive normal + mode periods. This interval also dictates the OBSERVEr notification period. +* `duration=n` where `n` is the number of seconds that the node will stay in + normal mode before dropping to very sleepy mode. This value is only relevant + if `mode==1`. + +A POST request must contain at least one of the above, but they are otherwise +all optional. So, for example, a POST may simply specify `interval=n`. To send +multiple values, delimit them with `&`. So you can send something like +`mode=1&interval=60&duration=20` + +The current running configuration can be retrieved by sending a GET request to +the same CoAP resource. + +## Running the example + +* Deploy your border router or 6lbr +* Turn on the very sleepy node. +* Fire up the Copper addon +* Select `.well-known/core` and hit `GET` +* Configure very sleepy operation: + * Select the `very_sleepy_config` resource + * In the `Outgoing` pane, type your POST payload as per the instructions + above. For example, you can type: `mode=1&interval=30&duration=10` + * Hit `POST` +* Select the `sen/readings` resource and hit `OBSERVE` + +## Caveats + +If you click on a resource in the Copper resources tree while you are observing +a different resource, the OBSERVEr for the latter will be stopped without +notifying the CoAP server. This will result in the server sending out OBSERVE +notifications that will be responded to with port unreachable ICMPv6 messages. +This will continue for quite a while, until the server detects that the +OBSERVEr has been lost (a test currently performed once every 20 notifications). +In order to prevent this from happening, hit the "Cancel" button for the +OBSERVE before switching views to a different resource. This will unregister +the observer. + +In very sleepy mode, the radio is not truly always off. The contiki core needs +to perform other periodic tasks in order to maintain network connectivity. For +that reason, this example will allow the radio to turn on periodically even +while in very sleepy mode. Thus, you may see that the node becomes briefly +reachable every now and then. However, do not count on those periods of +reachability to perform any tasks, as they will be brief and will be disrupted +without warning. diff --git a/examples/cc26xx/very-sleepy-demo/project-conf.h b/examples/cc26xx/very-sleepy-demo/project-conf.h new file mode 100644 index 000000000..477a535bf --- /dev/null +++ b/examples/cc26xx/very-sleepy-demo/project-conf.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2015, Texas Instruments Incorporated - http://www.ti.com/ + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#ifndef PROJECT_CONF_H_ +#define PROJECT_CONF_H_ +/*---------------------------------------------------------------------------*/ +/* Change to match your configuration */ +#define IEEE802154_CONF_PANID 0xABCD +#define RF_CORE_CONF_CHANNEL 25 +/*---------------------------------------------------------------------------*/ +/* For very sleepy operation */ +#define RF_BLE_CONF_ENABLED 0 +#define UIP_DS6_CONF_PERIOD CLOCK_SECOND +#define UIP_CONF_TCP 0 +#define RPL_CONF_LEAF_ONLY 1 + +/* + * We'll fail without RPL probing, so turn it on explicitly even though it's + * on by default + */ +#define RPL_CONF_WITH_PROBING 1 +/*---------------------------------------------------------------------------*/ +#endif /* PROJECT_CONF_H_ */ +/*---------------------------------------------------------------------------*/ diff --git a/examples/cc26xx/very-sleepy-demo/very-sleepy-demo.c b/examples/cc26xx/very-sleepy-demo/very-sleepy-demo.c new file mode 100644 index 000000000..5719e11ce --- /dev/null +++ b/examples/cc26xx/very-sleepy-demo/very-sleepy-demo.c @@ -0,0 +1,423 @@ +/* + * Copyright (c) 2014, Texas Instruments Incorporated - http://www.ti.com/ + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#include "contiki.h" +#include "sys/etimer.h" +#include "sys/stimer.h" +#include "sys/process.h" +#include "dev/leds.h" +#include "dev/watchdog.h" +#include "button-sensor.h" +#include "batmon-sensor.h" +#include "board-peripherals.h" +#include "net/netstack.h" +#include "net/ipv6/uip-ds6-nbr.h" +#include "net/ipv6/uip-ds6-route.h" +#include "net/rpl/rpl.h" +#include "net/rpl/rpl-private.h" +#include "rest-engine.h" +#include "er-coap.h" + +#include "ti-lib.h" + +#include +#include +#include +/*---------------------------------------------------------------------------*/ +/* Normal mode duration params in seconds */ +#define NORMAL_OP_DURATION_DEFAULT 10 +#define NORMAL_OP_DURATION_MIN 10 +#define NORMAL_OP_DURATION_MAX 60 +/*---------------------------------------------------------------------------*/ +/* Observer notification period params in seconds */ +#define PERIODIC_INTERVAL_DEFAULT 30 +#define PERIODIC_INTERVAL_MIN 30 +#define PERIODIC_INTERVAL_MAX 86400 /* 1 day */ +/*---------------------------------------------------------------------------*/ +#define VERY_SLEEPY_MODE_OFF 0 +#define VERY_SLEEPY_MODE_ON 1 +/*---------------------------------------------------------------------------*/ +#define MAC_CAN_BE_TURNED_OFF 0 +#define MAC_MUST_STAY_ON 1 + +#define KEEP_MAC_ON_MIN_PERIOD 10 /* secs */ +/*---------------------------------------------------------------------------*/ +#define PERIODIC_INTERVAL CLOCK_SECOND +/*---------------------------------------------------------------------------*/ +#define POST_STATUS_BAD 0x80 +#define POST_STATUS_HAS_MODE 0x40 +#define POST_STATUS_HAS_DURATION 0x20 +#define POST_STATUS_HAS_INTERVAL 0x10 +#define POST_STATUS_NONE 0x00 +/*---------------------------------------------------------------------------*/ +typedef struct sleepy_config_s { + unsigned long interval; + unsigned long duration; + uint8_t mode; +} sleepy_config_t; + +sleepy_config_t config; +/*---------------------------------------------------------------------------*/ +#define STATE_NORMAL 0 +#define STATE_NOTIFY_OBSERVERS 1 +#define STATE_VERY_SLEEPY 2 +/*---------------------------------------------------------------------------*/ +static struct stimer st_duration; +static struct stimer st_interval; +static struct stimer st_min_mac_on_duration; +static struct etimer et_periodic; +static process_event_t event_new_config; +static uint8_t state; +/*---------------------------------------------------------------------------*/ +const char *not_supported_msg = "Supported:text/plain,application/json"; +/*---------------------------------------------------------------------------*/ +PROCESS(very_sleepy_demo_process, "CC13xx/CC26xx very sleepy process"); +AUTOSTART_PROCESSES(&very_sleepy_demo_process); +/*---------------------------------------------------------------------------*/ +static void +readings_get_handler(void *request, void *response, uint8_t *buffer, + uint16_t preferred_size, int32_t *offset) +{ + unsigned int accept = -1; + int temp; + int voltage; + + if(request != NULL) { + REST.get_header_accept(request, &accept); + } + + temp = batmon_sensor.value(BATMON_SENSOR_TYPE_TEMP); + + voltage = batmon_sensor.value(BATMON_SENSOR_TYPE_VOLT); + + if(accept == -1 || accept == REST.type.APPLICATION_JSON) { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, + "{\"temp\":{\"v\":%d,\"u\":\"C\"}," + "\"voltage\":{\"v\":%d,\"u\":\"mV\"}}", + temp, (voltage * 125) >> 5); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } else if(accept == REST.type.TEXT_PLAIN) { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "Temp=%dC, Voltage=%dmV", + temp, (voltage * 125) >> 5); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } else { + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); + REST.set_response_payload(response, not_supported_msg, + strlen(not_supported_msg)); + } +} +/*---------------------------------------------------------------------------*/ +RESOURCE(readings_resource, "title=\"Sensor Readings\";obs", + readings_get_handler, NULL, NULL, NULL); +/*---------------------------------------------------------------------------*/ +static void +conf_get_handler(void *request, void *response, uint8_t *buffer, + uint16_t preferred_size, int32_t *offset) +{ + unsigned int accept = -1; + + if(request != NULL) { + REST.get_header_accept(request, &accept); + } + + if(accept == -1 || accept == REST.type.APPLICATION_JSON) { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, + "{\"config\":{\"mode\":%u,\"duration\":%lu,\"interval\":%lu}}", + config.mode, config.duration, config.interval); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } else if(accept == REST.type.TEXT_PLAIN) { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, + "Mode=%u, Duration=%lusecs, Interval=%lusecs", + config.mode, config.duration, config.interval); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } else { + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); + REST.set_response_payload(response, not_supported_msg, + strlen(not_supported_msg)); + } +} +/*---------------------------------------------------------------------------*/ +static void +conf_post_handler(void *request, void *response, uint8_t *buffer, + uint16_t preferred_size, int32_t *offset) +{ + const char *ptr = NULL; + char tmp_buf[16]; + unsigned long interval = 0; + unsigned long duration = 0; + uint8_t mode = VERY_SLEEPY_MODE_OFF; + uint8_t post_status = POST_STATUS_NONE; + int rv; + + rv = REST.get_post_variable(request, "mode", &ptr); + if(rv && rv < 16) { + memset(tmp_buf, 0, sizeof(tmp_buf)); + memcpy(tmp_buf, ptr, rv); + rv = atoi(tmp_buf); + + if(rv == 1) { + mode = VERY_SLEEPY_MODE_ON; + post_status |= POST_STATUS_HAS_MODE; + } else if(rv == 0) { + mode = VERY_SLEEPY_MODE_OFF; + post_status |= POST_STATUS_HAS_MODE; + } else { + post_status = POST_STATUS_BAD; + } + } + + rv = REST.get_post_variable(request, "duration", &ptr); + if(rv && rv < 16) { + memset(tmp_buf, 0, sizeof(tmp_buf)); + memcpy(tmp_buf, ptr, rv); + rv = atoi(tmp_buf); + + duration = (unsigned long)rv; + if(duration < NORMAL_OP_DURATION_MIN || duration > NORMAL_OP_DURATION_MAX) { + post_status = POST_STATUS_BAD; + } else { + post_status |= POST_STATUS_HAS_DURATION; + } + } + + rv = REST.get_post_variable(request, "interval", &ptr); + if(rv && rv < 16) { + memset(tmp_buf, 0, sizeof(tmp_buf)); + memcpy(tmp_buf, ptr, rv); + rv = atoi(tmp_buf); + interval = (unsigned long)rv; + if(interval < PERIODIC_INTERVAL_MIN || interval > PERIODIC_INTERVAL_MAX) { + post_status = POST_STATUS_BAD; + } else { + post_status |= POST_STATUS_HAS_INTERVAL; + } + } + + if((post_status & POST_STATUS_BAD) == POST_STATUS_BAD || + post_status == POST_STATUS_NONE) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, + "mode=0|1&duration=[%u,%u]&interval=[%u,%u]", + NORMAL_OP_DURATION_MIN, NORMAL_OP_DURATION_MAX, + PERIODIC_INTERVAL_MIN, PERIODIC_INTERVAL_MAX); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + return; + } + + /* Values are sane. Update the config and notify the process */ + if(post_status & POST_STATUS_HAS_MODE) { + config.mode = mode; + } + + if(post_status & POST_STATUS_HAS_INTERVAL) { + config.interval = interval; + } + + if(post_status & POST_STATUS_HAS_DURATION) { + config.duration = duration; + } + + process_post(&very_sleepy_demo_process, event_new_config, NULL); +} +/*---------------------------------------------------------------------------*/ +RESOURCE(very_sleepy_conf, + "title=\"Very sleepy conf: " + "GET|POST mode=0|1&interval=&duration=\";rt=\"Control\"", + conf_get_handler, conf_post_handler, NULL, NULL); +/*---------------------------------------------------------------------------*/ +/* + * If our preferred parent is not NBR_REACHABLE in the ND cache, NUD will send + * a unicast NS and wait for NA. If NA fails then the neighbour will be removed + * from the ND cache and the default route will be deleted. To prevent this, + * keep the MAC on until the parent becomes NBR_REACHABLE. We also keep the MAC + * on if we are about to do RPL probing. + * + * In all cases, the radio will be locked on for KEEP_MAC_ON_MIN_PERIOD secs + */ +static uint8_t +keep_mac_on(void) +{ + uip_ds6_nbr_t *nbr; + uint8_t rv = MAC_CAN_BE_TURNED_OFF; + + if(!stimer_expired(&st_min_mac_on_duration)) { + return MAC_MUST_STAY_ON; + } + +#if RPL_WITH_PROBING + /* Determine if we are about to send a RPL probe */ + if(CLOCK_LT(etimer_expiration_time( + &rpl_get_default_instance()->probing_timer.etimer), + (clock_time() + PERIODIC_INTERVAL))) { + rv = MAC_MUST_STAY_ON; + } +#endif + + /* It's OK to pass a NULL pointer, the callee checks and returns NULL */ + nbr = uip_ds6_nbr_lookup(uip_ds6_defrt_choose()); + + if(nbr == NULL) { + /* We don't have a default route, or it's not reachable (NUD likely). */ + rv = MAC_MUST_STAY_ON; + } else { + if(nbr->state != NBR_REACHABLE) { + rv = MAC_MUST_STAY_ON; + } + } + + if(rv == MAC_MUST_STAY_ON && stimer_expired(&st_min_mac_on_duration)) { + stimer_set(&st_min_mac_on_duration, KEEP_MAC_ON_MIN_PERIOD); + } + + return rv; +} +/*---------------------------------------------------------------------------*/ +static void +switch_to_normal(void) +{ + state = STATE_NOTIFY_OBSERVERS; + + /* + * Stay in normal mode for 'duration' secs. + * Transition back to normal in 'interval' secs, _including_ 'duration' + */ + stimer_set(&st_duration, config.duration); + stimer_set(&st_interval, config.interval); +} +/*---------------------------------------------------------------------------*/ +static void +switch_to_very_sleepy(void) +{ + state = STATE_VERY_SLEEPY; +} +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(very_sleepy_demo_process, ev, data) +{ + uint8_t mac_keep_on; + + PROCESS_BEGIN(); + + SENSORS_ACTIVATE(batmon_sensor); + + config.mode = VERY_SLEEPY_MODE_OFF; + config.interval = PERIODIC_INTERVAL_DEFAULT; + config.duration = NORMAL_OP_DURATION_DEFAULT; + + state = STATE_NORMAL; + + event_new_config = process_alloc_event(); + + rest_init_engine(); + + readings_resource.flags += IS_OBSERVABLE; + rest_activate_resource(&readings_resource, "sen/readings"); + rest_activate_resource(&very_sleepy_conf, "very_sleepy_config"); + + printf("Very Sleepy Demo Process\n"); + + switch_to_normal(); + + etimer_set(&et_periodic, PERIODIC_INTERVAL); + + while(1) { + + PROCESS_YIELD(); + + if(ev == sensors_event && data == &button_left_sensor) { + switch_to_normal(); + } + + if(ev == event_new_config) { + stimer_set(&st_interval, config.interval); + stimer_set(&st_duration, config.duration); + } + + if((ev == PROCESS_EVENT_TIMER && data == &et_periodic) || + (ev == sensors_event && data == &button_left_sensor) || + (ev == event_new_config)) { + + /* + * Determine if the stack is about to do essential network maintenance + * and, if so, keep the MAC layer on + */ + mac_keep_on = keep_mac_on(); + + if(mac_keep_on == MAC_MUST_STAY_ON || state != STATE_VERY_SLEEPY) { + leds_on(LEDS_GREEN); + NETSTACK_MAC.on(); + } + + /* + * Next, switch between normal and very sleepy mode depending on config, + * send notifications to observers as required. + */ + if(state == STATE_NOTIFY_OBSERVERS) { + REST.notify_subscribers(&readings_resource); + state = STATE_NORMAL; + } + + if(state == STATE_NORMAL) { + if(stimer_expired(&st_duration)) { + stimer_set(&st_duration, config.duration); + if(config.mode == VERY_SLEEPY_MODE_ON) { + switch_to_very_sleepy(); + } + } + } else if(state == STATE_VERY_SLEEPY) { + if(stimer_expired(&st_interval)) { + switch_to_normal(); + } + } + + if(mac_keep_on == MAC_CAN_BE_TURNED_OFF && state == STATE_VERY_SLEEPY) { + leds_off(LEDS_GREEN); + NETSTACK_MAC.off(0); + } else { + leds_on(LEDS_GREEN); + NETSTACK_MAC.on(); + } + + /* Schedule next pass */ + etimer_set(&et_periodic, PERIODIC_INTERVAL); + } + } + + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ diff --git a/regression-tests/18-compile-arm-ports/Makefile b/regression-tests/18-compile-arm-ports/Makefile index 217b5eef9..222474b13 100644 --- a/regression-tests/18-compile-arm-ports/Makefile +++ b/regression-tests/18-compile-arm-ports/Makefile @@ -8,6 +8,7 @@ webserver-ipv6/ev-aducrf101mkxz \ ipv6/multicast/ev-aducrf101mkxz \ cc2538dk/sniffer/ev-aducrf101mkxz \ cc26xx/cc26xx-web-demo/srf06-cc26xx \ +cc26xx/very-sleepy-demo/srf06-cc26xx \ hello-world/cc2538dk \ ipv6/rpl-border-router/cc2538dk \ er-rest-example/cc2538dk \ From f4576a635f01640d6fbb6850a6a539dab565634c Mon Sep 17 00:00:00 2001 From: Jonas Olsson Date: Sun, 16 Aug 2015 17:03:25 +0100 Subject: [PATCH 5/8] Document CC26xx/CC13xx border router and slip-radio --- platform/srf06-cc26xx/README.md | 38 +++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/platform/srf06-cc26xx/README.md b/platform/srf06-cc26xx/README.md index 962403d33..e06f2f293 100644 --- a/platform/srf06-cc26xx/README.md +++ b/platform/srf06-cc26xx/README.md @@ -56,6 +56,44 @@ can be used to configure the rest of the example. More details about those two examples can be found in their respective READMEs. +CC13xx/CC26xx Border Router over UART +===================================== +The platform code can be used as a border router (SLIP over UART) by using the +example under `examples/ipv6/rpl-border-router`. This example defines the +following: + + + #ifndef UIP_CONF_BUFFER_SIZE + #define UIP_CONF_BUFFER_SIZE 140 + #endif + + #ifndef UIP_CONF_RECEIVE_WINDOW + #define UIP_CONF_RECEIVE_WINDOW 60 + #endif + +The CC26xx port has much higher capability than some other platforms used as +border routers. Thus, before building the example, it is recommended to delete +these two configuration directives. This will allow platform defaults to take +effect and this will improve performance and stability. + +Do not forget to set the correct channel by defining `RF_CORE_CONF_CHANNEL` as +required. + +CC13xx/CC26xx slip-radio with 6lbr +================================== +The platform can also operate as a slip-radio over UART, to be used with +[6lbr](http://cetic.github.io/6lbr/). + +Similar to the border router configuration, you will need to remove the defines +that limit the size of the uIP buffer. Removing the two lines below from +`examples/ipv6/slip-radio/project-conf.h` should do it. + + #undef UIP_CONF_BUFFER_SIZE + #define UIP_CONF_BUFFER_SIZE 140 + +Do not forget to set the correct channel by defining `RF_CORE_CONF_CHANNEL` as +required. + Requirements ============ To use the port you need: From e96b15773a39ad5b6de9b3d86f2a9adb5059e07f Mon Sep 17 00:00:00 2001 From: Jonas Olsson Date: Sun, 16 Aug 2015 17:08:47 +0100 Subject: [PATCH 6/8] Document how to use the debugger devpack --- platform/srf06-cc26xx/README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/platform/srf06-cc26xx/README.md b/platform/srf06-cc26xx/README.md index e06f2f293..de86ef380 100644 --- a/platform/srf06-cc26xx/README.md +++ b/platform/srf06-cc26xx/README.md @@ -143,6 +143,21 @@ If you want to switch between building for one platform to the other, make certain to `make clean` before building for the new one, or you will get linker errors. +Sensortag UART usage (with or without the Debugger Devpack) +=========================================================== +There are two ways to get debugging (printf etc) output from the Sensortag. + +* Purchase a Debugger Devpack and set `BOARD_CONF_DEBUGGER_DEVPACK` to 1 in +`contiki-conf.h` or `project-conf.h`. This will work off the shelf for revision +1.2.0 of the debugger devpack. +* If you have an older (rev 1.0.0) devpack, you will need to do the above and +then to modify `board.h` in order to cross the RX and TX DIO mappings. (TX to +`IOID_28`, RX to `IOID_29`). +* If you don't have/want a debugger devpack, you can use a SmartRF and modify +the jumper configuration on P408 as discussed in +[this thread](https://e2e.ti.com/support/wireless_connectivity/f/158/p/411992/1483824#1483824) +on E2E. For this to work, you need to set `BOARD_CONF_DEBUGGER_DEVPACK` to 0. + Low Power Operation =================== The platform takes advantage of the CC26xx's power saving features. In a From 67045d401291f1daee1a7c4cb1f35e7c226a6719 Mon Sep 17 00:00:00 2001 From: Jonas Olsson Date: Sun, 16 Aug 2015 17:16:16 +0100 Subject: [PATCH 7/8] Export RSSI to default parent in the CC26xx web demo The current version of the CC26xx web demo publishes over MQTT the default parent's IPv6 address and the last observed RSSI of this link. This is collected by active probing (periodic ping). This commit brings the probing functionality to the example's main code module. The MQTT client keeps publishing as previously, but we now also export the same information through CoAP resources. Configuration is still possible through the example's web server. --- examples/cc26xx/cc26xx-web-demo/Makefile | 2 +- .../cc26xx/cc26xx-web-demo/cc26xx-web-demo.c | 95 ++++++++++++- .../cc26xx/cc26xx-web-demo/cc26xx-web-demo.h | 11 ++ examples/cc26xx/cc26xx-web-demo/coap-server.c | 6 + .../cc26xx/cc26xx-web-demo/httpd-simple.c | 64 ++++++--- .../cc26xx/cc26xx-web-demo/httpd-simple.h | 2 +- examples/cc26xx/cc26xx-web-demo/mqtt-client.c | 66 +-------- examples/cc26xx/cc26xx-web-demo/mqtt-client.h | 3 - .../cc26xx-web-demo/resources/res-net.c | 126 ++++++++++++++++++ 9 files changed, 280 insertions(+), 95 deletions(-) create mode 100644 examples/cc26xx/cc26xx-web-demo/resources/res-net.c diff --git a/examples/cc26xx/cc26xx-web-demo/Makefile b/examples/cc26xx/cc26xx-web-demo/Makefile index 622156a4d..1da0a7747 100644 --- a/examples/cc26xx/cc26xx-web-demo/Makefile +++ b/examples/cc26xx/cc26xx-web-demo/Makefile @@ -5,7 +5,7 @@ all: cc26xx-web-demo REST_RESOURCES_DIR = ./resources REST_RESOURCES_FILES += res-leds.c res-toggle-leds.c res-device.c -REST_RESOURCES_FILES += res-sensors.c res-ble-advd.c +REST_RESOURCES_FILES += res-sensors.c res-ble-advd.c res-net.c PROJECTDIRS += $(REST_RESOURCES_DIR) PROJECT_SOURCEFILES += $(REST_RESOURCES_FILES) diff --git a/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.c b/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.c index 4d8c9ca86..1eaf35648 100644 --- a/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.c +++ b/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.c @@ -44,6 +44,7 @@ #include "lib/sensors.h" #include "lib/list.h" #include "sys/process.h" +#include "net/ipv6/sicslowpan.h" #include "button-sensor.h" #include "batmon-sensor.h" #include "httpd-simple.h" @@ -77,13 +78,20 @@ struct ctimer bmp_timer, hdc_timer, tmp_timer, opt_timer, mpu_timer; static struct etimer et; static struct ctimer ct; /*---------------------------------------------------------------------------*/ +/* Parent RSSI functionality */ +#if CC26XX_WEB_DEMO_READ_PARENT_RSSI +static struct uip_icmp6_echo_reply_notification echo_reply_notification; +static struct etimer echo_request_timer; +int def_rt_rssi = 0; +#endif +/*---------------------------------------------------------------------------*/ process_event_t cc26xx_web_demo_publish_event; process_event_t cc26xx_web_demo_config_loaded_event; process_event_t cc26xx_web_demo_load_config_defaults; /*---------------------------------------------------------------------------*/ /* Saved settings on flash: store, offset, magic */ #define CONFIG_FLASH_OFFSET 0 -#define CONFIG_MAGIC 0xCC265001 +#define CONFIG_MAGIC 0xCC265002 cc26xx_web_demo_config_t cc26xx_web_demo_config; /*---------------------------------------------------------------------------*/ @@ -374,8 +382,57 @@ sensor_readings_handler(char *key, int key_len, char *val, int val_len) return HTTPD_SIMPLE_POST_HANDLER_UNKNOWN; } /*---------------------------------------------------------------------------*/ +#if CC26XX_WEB_DEMO_READ_PARENT_RSSI +static int +ping_interval_post_handler(char *key, int key_len, char *val, int val_len) +{ + int rv = 0; + + if(key_len != strlen("ping_interval") || + strncasecmp(key, "ping_interval", strlen("ping_interval")) != 0) { + /* Not ours */ + return HTTPD_SIMPLE_POST_HANDLER_UNKNOWN; + } + + rv = atoi(val); + + if(rv < CC26XX_WEB_DEMO_RSSI_MEASURE_INTERVAL_MIN || + rv > CC26XX_WEB_DEMO_RSSI_MEASURE_INTERVAL_MAX) { + return HTTPD_SIMPLE_POST_HANDLER_ERROR; + } + + cc26xx_web_demo_config.def_rt_ping_interval = rv * CLOCK_SECOND; + + return HTTPD_SIMPLE_POST_HANDLER_OK; +} +#endif +/*---------------------------------------------------------------------------*/ HTTPD_SIMPLE_POST_HANDLER(sensor, sensor_readings_handler); HTTPD_SIMPLE_POST_HANDLER(defaults, defaults_post_handler); + +#if CC26XX_WEB_DEMO_READ_PARENT_RSSI +HTTPD_SIMPLE_POST_HANDLER(ping_interval, ping_interval_post_handler); +/*---------------------------------------------------------------------------*/ +static void +echo_reply_handler(uip_ipaddr_t *source, uint8_t ttl, uint8_t *data, + uint16_t datalen) +{ + if(uip_ip6addr_cmp(source, uip_ds6_defrt_choose())) { + def_rt_rssi = sicslowpan_get_last_rssi(); + } +} +/*---------------------------------------------------------------------------*/ +static void +ping_parent(void) +{ + if(uip_ds6_get_global(ADDR_PREFERRED) == NULL) { + return; + } + + uip_icmp6_send(uip_ds6_defrt_choose(), ICMP6_ECHO_REQUEST, 0, + CC26XX_WEB_DEMO_ECHO_REQ_PAYLOAD_LEN); +} +#endif /*---------------------------------------------------------------------------*/ static void get_batmon_reading(void *data) @@ -828,6 +885,8 @@ PROCESS_THREAD(cc26xx_web_demo_process, ev, data) * own defaults and restore saved config from flash... */ cc26xx_web_demo_config.sensors_bitmap = 0xFFFFFFFF; /* all on by default */ + cc26xx_web_demo_config.def_rt_ping_interval = + CC26XX_WEB_DEMO_DEFAULT_RSSI_MEAS_INTERVAL; load_config(); /* @@ -841,6 +900,15 @@ PROCESS_THREAD(cc26xx_web_demo_process, ev, data) httpd_simple_register_post_handler(&sensor_handler); httpd_simple_register_post_handler(&defaults_handler); +#if CC26XX_WEB_DEMO_READ_PARENT_RSSI + httpd_simple_register_post_handler(&ping_interval_handler); + + def_rt_rssi = 0x8000000; + uip_icmp6_echo_reply_callback_add(&echo_reply_notification, + echo_reply_handler); + etimer_set(&echo_request_timer, CC26XX_WEB_DEMO_NET_CONNECT_PERIODIC); +#endif + etimer_set(&et, CC26XX_WEB_DEMO_NET_CONNECT_PERIODIC); /* @@ -848,6 +916,25 @@ PROCESS_THREAD(cc26xx_web_demo_process, ev, data) * (e.g a button press / or reed trigger) */ while(1) { + if(ev == PROCESS_EVENT_TIMER && etimer_expired(&et)) { + if(uip_ds6_get_global(ADDR_PREFERRED) == NULL) { + leds_on(CC26XX_WEB_DEMO_STATUS_LED); + ctimer_set(&ct, NO_NET_LED_DURATION, publish_led_off, NULL); + etimer_set(&et, CC26XX_WEB_DEMO_NET_CONNECT_PERIODIC); + } + } + +#if CC26XX_WEB_DEMO_READ_PARENT_RSSI + if(ev == PROCESS_EVENT_TIMER && etimer_expired(&echo_request_timer)) { + if(uip_ds6_get_global(ADDR_PREFERRED) == NULL) { + etimer_set(&echo_request_timer, CC26XX_WEB_DEMO_NET_CONNECT_PERIODIC); + } else { + ping_parent(); + etimer_set(&echo_request_timer, cc26xx_web_demo_config.def_rt_ping_interval); + } + } +#endif + if(ev == sensors_event && data == CC26XX_WEB_DEMO_SENSOR_READING_TRIGGER) { if((CC26XX_WEB_DEMO_SENSOR_READING_TRIGGER)->value( BUTTON_SENSOR_VALUE_DURATION) > CLOCK_SECOND * 5) { @@ -858,12 +945,6 @@ PROCESS_THREAD(cc26xx_web_demo_process, ev, data) process_post(PROCESS_BROADCAST, cc26xx_web_demo_publish_event, NULL); } - } else if(ev == PROCESS_EVENT_TIMER && etimer_expired(&et)) { - if(uip_ds6_get_global(ADDR_PREFERRED) == NULL) { - leds_on(CC26XX_WEB_DEMO_STATUS_LED); - ctimer_set(&ct, NO_NET_LED_DURATION, publish_led_off, NULL); - etimer_set(&et, CC26XX_WEB_DEMO_NET_CONNECT_PERIODIC); - } } else if(ev == httpd_simple_event_new_config) { save_config(); #if BOARD_SENSORTAG diff --git a/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.h b/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.h index 18c0289d4..026461f32 100644 --- a/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.h +++ b/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.h @@ -80,6 +80,16 @@ #define CC26XX_WEB_DEMO_NET_UART 1 #endif /*---------------------------------------------------------------------------*/ +/* Active probing of RSSI from our preferred parent */ +#if (CC26XX_WEB_DEMO_COAP_SERVER || CC26XX_WEB_DEMO_MQTT_CLIENT) +#define CC26XX_WEB_DEMO_READ_PARENT_RSSI 1 +#else +#define CC26XX_WEB_DEMO_READ_PARENT_RSSI 0 +#endif + +#define CC26XX_WEB_DEMO_RSSI_MEASURE_INTERVAL_MAX 86400 /* secs: 1 day */ +#define CC26XX_WEB_DEMO_RSSI_MEASURE_INTERVAL_MIN 5 /* secs */ +/*---------------------------------------------------------------------------*/ /* User configuration */ /* Take a sensor reading on button press */ #define CC26XX_WEB_DEMO_SENSOR_READING_TRIGGER &button_left_sensor @@ -169,6 +179,7 @@ typedef struct cc26xx_web_demo_config_s { uint32_t magic; int len; uint32_t sensors_bitmap; + int def_rt_ping_interval; mqtt_client_config_t mqtt_config; net_uart_config_t net_uart; } cc26xx_web_demo_config_t; diff --git a/examples/cc26xx/cc26xx-web-demo/coap-server.c b/examples/cc26xx/cc26xx-web-demo/coap-server.c index 4dec9cce2..9b4155d00 100644 --- a/examples/cc26xx/cc26xx-web-demo/coap-server.c +++ b/examples/cc26xx/cc26xx-web-demo/coap-server.c @@ -56,6 +56,9 @@ extern resource_t res_device_hw; extern resource_t res_device_uptime; extern resource_t res_device_cfg_reset; +extern resource_t res_parent_rssi; +extern resource_t res_parent_ip; + #if RF_BLE_ENABLED extern resource_t res_ble_advd; #endif @@ -138,6 +141,9 @@ PROCESS_THREAD(coap_server_process, ev, data) rest_activate_resource(&res_device_uptime, "dev/uptime"); rest_activate_resource(&res_device_cfg_reset, "dev/cfg_reset"); + rest_activate_resource(&res_parent_rssi, "net/parent/RSSI"); + rest_activate_resource(&res_parent_ip, "net/parent/IPv6"); + #if RF_BLE_ENABLED rest_activate_resource(&res_ble_advd, "dev/ble_advd"); #endif diff --git a/examples/cc26xx/cc26xx-web-demo/httpd-simple.c b/examples/cc26xx/cc26xx-web-demo/httpd-simple.c index 29c22d22b..9800bbc48 100644 --- a/examples/cc26xx/cc26xx-web-demo/httpd-simple.c +++ b/examples/cc26xx/cc26xx-web-demo/httpd-simple.c @@ -93,8 +93,8 @@ static int state; #define STRINGIFY(x) XSTR(x) #define XSTR(x) #x -#define RSSI_INT_MAX STRINGIFY(MQTT_CLIENT_RSSI_MEASURE_INTERVAL_MAX) -#define RSSI_INT_MIN STRINGIFY(MQTT_CLIENT_RSSI_MEASURE_INTERVAL_MIN) +#define RSSI_INT_MAX STRINGIFY(CC26XX_WEB_DEMO_RSSI_MEASURE_INTERVAL_MAX) +#define RSSI_INT_MIN STRINGIFY(CC26XX_WEB_DEMO_RSSI_MEASURE_INTERVAL_MIN) #define PUB_INT_MAX STRINGIFY(MQTT_CLIENT_PUBLISH_INTERVAL_MAX) #define PUB_INT_MIN STRINGIFY(MQTT_CLIENT_PUBLISH_INTERVAL_MIN) /*---------------------------------------------------------------------------*/ @@ -568,12 +568,54 @@ PT_THREAD(generate_config(struct httpd_state *s)) s->reading->publish ? "" : " Checked", config_div_close)); } + PT_WAIT_THREAD(&s->generate_pt, enqueue_chunk(s, 0, "")); PT_WAIT_THREAD(&s->generate_pt, enqueue_chunk(s, 0, "")); + /* RSSI measurements */ +#if CC26XX_WEB_DEMO_READ_PARENT_RSSI + PT_WAIT_THREAD(&s->generate_pt, + enqueue_chunk(s, 0, "

RSSI Probing

")); + + PT_WAIT_THREAD(&s->generate_pt, + enqueue_chunk(s, 0, + "
generate_pt, + enqueue_chunk(s, 0, "method=\"post\" enctype=\"")); + PT_WAIT_THREAD(&s->generate_pt, + enqueue_chunk(s, 0, "application/x-www-form-urlencoded\" ")); + PT_WAIT_THREAD(&s->generate_pt, + enqueue_chunk(s, 0, "accept-charset=\"UTF-8\">")); + + PT_WAIT_THREAD(&s->generate_pt, + enqueue_chunk(s, 0, "%sPeriod (secs):%s", + config_div_left, config_div_close)); + PT_WAIT_THREAD(&s->generate_pt, + enqueue_chunk(s, 0, "%sgenerate_pt, + enqueue_chunk(s, 0, "value=\"%lu\" ", + (clock_time_t) + (cc26xx_web_demo_config.def_rt_ping_interval + / CLOCK_SECOND))); + PT_WAIT_THREAD(&s->generate_pt, + enqueue_chunk(s, 0, + "min=\"" RSSI_INT_MIN "\" " + "max=\"" RSSI_INT_MAX "\" " + "name=\"ping_interval\">%s", + config_div_close)); + + PT_WAIT_THREAD(&s->generate_pt, + enqueue_chunk(s, 0, + "")); + PT_WAIT_THREAD(&s->generate_pt, + enqueue_chunk(s, 0, "
")); +#endif + /* Actions */ PT_WAIT_THREAD(&s->generate_pt, enqueue_chunk(s, 0, "

Actions

")); PT_WAIT_THREAD(&s->generate_pt, @@ -732,24 +774,6 @@ PT_THREAD(generate_mqtt_config(struct httpd_state *s)) "name=\"broker_port\">%s", config_div_close)); - PT_WAIT_THREAD(&s->generate_pt, - enqueue_chunk(s, 0, "%sRSSI Interval (secs):%s", - config_div_left, config_div_close)); - PT_WAIT_THREAD(&s->generate_pt, - enqueue_chunk(s, 0, "%sgenerate_pt, - enqueue_chunk(s, 0, "value=\"%lu\" ", - (clock_time_t) - (cc26xx_web_demo_config.mqtt_config.def_rt_ping_interval - / CLOCK_SECOND))); - PT_WAIT_THREAD(&s->generate_pt, - enqueue_chunk(s, 0, - "min=\"" RSSI_INT_MIN "\" " - "max=\"" RSSI_INT_MAX "\" " - "name=\"ping_interval\">%s", - config_div_close)); - PT_WAIT_THREAD(&s->generate_pt, enqueue_chunk(s, 0, "")); diff --git a/examples/cc26xx/cc26xx-web-demo/httpd-simple.h b/examples/cc26xx/cc26xx-web-demo/httpd-simple.h index c7631adb1..25b8db3e5 100644 --- a/examples/cc26xx/cc26xx-web-demo/httpd-simple.h +++ b/examples/cc26xx/cc26xx-web-demo/httpd-simple.h @@ -48,7 +48,7 @@ /*---------------------------------------------------------------------------*/ /* Ideally a multiple of TCP_MSS */ #ifdef HTTPD_SIMPLE_CONF_MAIN_BUF_SIZE -#define HTTPD_SIMPLE_MAIN_BUF_SIZE HTTPD_SIMPLE_CONF_BUF_SIZE +#define HTTPD_SIMPLE_MAIN_BUF_SIZE HTTPD_SIMPLE_CONF_MAIN_BUF_SIZE #else #define HTTPD_SIMPLE_MAIN_BUF_SIZE UIP_TCP_MSS #endif diff --git a/examples/cc26xx/cc26xx-web-demo/mqtt-client.c b/examples/cc26xx/cc26xx-web-demo/mqtt-client.c index 4fa0736ef..cf60d6c63 100644 --- a/examples/cc26xx/cc26xx-web-demo/mqtt-client.c +++ b/examples/cc26xx/cc26xx-web-demo/mqtt-client.c @@ -41,7 +41,6 @@ #include "net/rpl/rpl.h" #include "net/ip/uip.h" #include "net/ipv6/uip-icmp6.h" -#include "net/ipv6/sicslowpan.h" #include "sys/etimer.h" #include "sys/ctimer.h" #include "lib/sensors.h" @@ -86,7 +85,7 @@ static const char *broker_ip = "0064:ff9b:0000:0000:0000:0000:b8ac:7cbd"; * Number of times to try reconnecting to the broker. * Can be a limited number (e.g. 3, 10 etc) or can be set to RETRY_FOREVER */ -#define RECONNECT_ATTEMPTS RETRY_FOREVER +#define RECONNECT_ATTEMPTS 5 #define CONNECTION_STABLE_TIME (CLOCK_SECOND * 5) #define NEW_CONFIG_WAIT_INTERVAL (CLOCK_SECOND * 20) static struct timer connection_life; @@ -139,9 +138,7 @@ static uint16_t seq_nr_value = 0; static uip_ip6addr_t def_route; /*---------------------------------------------------------------------------*/ /* Parent RSSI functionality */ -static struct uip_icmp6_echo_reply_notification echo_reply_notification; -static struct etimer echo_request_timer; -int def_rt_rssi = 0; +extern int def_rt_rssi; /*---------------------------------------------------------------------------*/ const static cc26xx_web_demo_sensor_reading_t *reading; /*---------------------------------------------------------------------------*/ @@ -388,29 +385,6 @@ reconnect_post_handler(char *key, int key_len, char *val, int val_len) return HTTPD_SIMPLE_POST_HANDLER_OK; } /*---------------------------------------------------------------------------*/ -static int -ping_interval_post_handler(char *key, int key_len, char *val, int val_len) -{ - int rv = 0; - - if(key_len != strlen("ping_interval") || - strncasecmp(key, "ping_interval", strlen("ping_interval")) != 0) { - /* Not ours */ - return HTTPD_SIMPLE_POST_HANDLER_UNKNOWN; - } - - rv = atoi(val); - - if(rv < MQTT_CLIENT_RSSI_MEASURE_INTERVAL_MIN || - rv > MQTT_CLIENT_RSSI_MEASURE_INTERVAL_MAX) { - return HTTPD_SIMPLE_POST_HANDLER_ERROR; - } - - conf->def_rt_ping_interval = rv * CLOCK_SECOND; - - return HTTPD_SIMPLE_POST_HANDLER_OK; -} -/*---------------------------------------------------------------------------*/ HTTPD_SIMPLE_POST_HANDLER(org_id, org_id_post_handler); HTTPD_SIMPLE_POST_HANDLER(type_id, type_id_post_handler); HTTPD_SIMPLE_POST_HANDLER(event_type_id, event_type_id_post_handler); @@ -420,16 +394,6 @@ HTTPD_SIMPLE_POST_HANDLER(ip_addr, ip_addr_post_handler); HTTPD_SIMPLE_POST_HANDLER(port, port_post_handler); HTTPD_SIMPLE_POST_HANDLER(interval, interval_post_handler); HTTPD_SIMPLE_POST_HANDLER(reconnect, reconnect_post_handler); -HTTPD_SIMPLE_POST_HANDLER(ping_interval, ping_interval_post_handler); -/*---------------------------------------------------------------------------*/ -static void -echo_reply_handler(uip_ipaddr_t *source, uint8_t ttl, uint8_t *data, - uint16_t datalen) -{ - if(uip_ip6addr_cmp(source, uip_ds6_defrt_choose())) { - def_rt_rssi = sicslowpan_get_last_rssi(); - } -} /*---------------------------------------------------------------------------*/ static void pub_handler(const char *topic, uint16_t topic_len, const uint8_t *chunk, @@ -624,7 +588,6 @@ init_config() conf->broker_port = CC26XX_WEB_DEMO_DEFAULT_BROKER_PORT; conf->pub_interval = CC26XX_WEB_DEMO_DEFAULT_PUBLISH_INTERVAL; - conf->def_rt_ping_interval = CC26XX_WEB_DEMO_DEFAULT_RSSI_MEAS_INTERVAL; return 1; } @@ -641,7 +604,6 @@ register_http_post_handlers(void) httpd_simple_register_post_handler(&port_handler); httpd_simple_register_post_handler(&ip_addr_handler); httpd_simple_register_post_handler(&reconnect_handler); - httpd_simple_register_post_handler(&ping_interval_handler); } /*---------------------------------------------------------------------------*/ static void @@ -664,6 +626,7 @@ publish(void) /* Publish MQTT topic in IBM quickstart format */ int len; int remaining = APP_BUFFER_SIZE; + char def_rt_str[64]; seq_nr_value++; @@ -686,7 +649,6 @@ publish(void) buf_ptr += len; /* Put our Default route's string representation in a buffer */ - char def_rt_str[64]; memset(def_rt_str, 0, sizeof(def_rt_str)); cc26xx_web_demo_ipaddr_sprintf(def_rt_str, sizeof(def_rt_str), uip_ds6_defrt_choose()); @@ -743,17 +705,6 @@ connect_to_broker(void) } /*---------------------------------------------------------------------------*/ static void -ping_parent(void) -{ - if(uip_ds6_get_global(ADDR_PREFERRED) == NULL) { - return; - } - - uip_icmp6_send(uip_ds6_defrt_choose(), ICMP6_ECHO_REQUEST, 0, - CC26XX_WEB_DEMO_ECHO_REQ_PAYLOAD_LEN); -} -/*---------------------------------------------------------------------------*/ -static void state_machine(void) { switch(state) { @@ -794,7 +745,6 @@ state_machine(void) if(uip_ds6_get_global(ADDR_PREFERRED) != NULL) { /* Registered and with a public IP. Connect */ DBG("Registered. Connect attempt %u\n", connect_attempt); - ping_parent(); connect_to_broker(); } etimer_set(&publish_periodic_timer, CC26XX_WEB_DEMO_NET_CONNECT_PERIODIC); @@ -923,11 +873,6 @@ PROCESS_THREAD(mqtt_client_process, ev, data) update_config(); - def_rt_rssi = 0x8000000; - uip_icmp6_echo_reply_callback_add(&echo_reply_notification, - echo_reply_handler); - etimer_set(&echo_request_timer, conf->def_rt_ping_interval); - /* Main loop */ while(1) { @@ -956,11 +901,6 @@ PROCESS_THREAD(mqtt_client_process, ev, data) state_machine(); } - if(ev == PROCESS_EVENT_TIMER && data == &echo_request_timer) { - ping_parent(); - etimer_set(&echo_request_timer, conf->def_rt_ping_interval); - } - if(ev == cc26xx_web_demo_load_config_defaults) { init_config(); etimer_set(&publish_periodic_timer, NEW_CONFIG_WAIT_INTERVAL); diff --git a/examples/cc26xx/cc26xx-web-demo/mqtt-client.h b/examples/cc26xx/cc26xx-web-demo/mqtt-client.h index b4b50085f..ab7c08227 100644 --- a/examples/cc26xx/cc26xx-web-demo/mqtt-client.h +++ b/examples/cc26xx/cc26xx-web-demo/mqtt-client.h @@ -45,8 +45,6 @@ #define MQTT_CLIENT_CONFIG_CMD_TYPE_LEN 8 #define MQTT_CLIENT_CONFIG_IP_ADDR_STR_LEN 64 /*---------------------------------------------------------------------------*/ -#define MQTT_CLIENT_RSSI_MEASURE_INTERVAL_MAX 86400 /* secs: 1 day */ -#define MQTT_CLIENT_RSSI_MEASURE_INTERVAL_MIN 5 /* secs */ #define MQTT_CLIENT_PUBLISH_INTERVAL_MAX 86400 /* secs: 1 day */ #define MQTT_CLIENT_PUBLISH_INTERVAL_MIN 5 /* secs */ /*---------------------------------------------------------------------------*/ @@ -63,7 +61,6 @@ typedef struct mqtt_client_config { char broker_ip[MQTT_CLIENT_CONFIG_IP_ADDR_STR_LEN]; char cmd_type[MQTT_CLIENT_CONFIG_CMD_TYPE_LEN]; clock_time_t pub_interval; - int def_rt_ping_interval; uint16_t broker_port; } mqtt_client_config_t; /*---------------------------------------------------------------------------*/ diff --git a/examples/cc26xx/cc26xx-web-demo/resources/res-net.c b/examples/cc26xx/cc26xx-web-demo/resources/res-net.c new file mode 100644 index 000000000..1a5ce7b81 --- /dev/null +++ b/examples/cc26xx/cc26xx-web-demo/resources/res-net.c @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2015, Texas Instruments Incorporated - http://www.ti.com/ + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup cc26xx-web-demo + * @{ + * + * \file + * CoAP resource handler for network-related resources + */ +/*---------------------------------------------------------------------------*/ +#include "contiki.h" +#include "rest-engine.h" +#include "er-coap.h" +#include "coap-server.h" +#include "cc26xx-web-demo.h" + +#include "ti-lib.h" + +#include +/*---------------------------------------------------------------------------*/ +extern int def_rt_rssi; +/*---------------------------------------------------------------------------*/ +static void +res_get_handler_parent_rssi(void *request, void *response, uint8_t *buffer, + uint16_t preferred_size, int32_t *offset) +{ + unsigned int accept = -1; + + REST.get_header_accept(request, &accept); + + if(accept == -1 || accept == REST.type.TEXT_PLAIN) { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", def_rt_rssi); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } else if(accept == REST.type.APPLICATION_JSON) { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{\"Parent RSSI\":\"%d\"}", + def_rt_rssi); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } else if(accept == REST.type.APPLICATION_XML) { + REST.set_header_content_type(response, REST.type.APPLICATION_XML); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, + "", def_rt_rssi); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } else { + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); + REST.set_response_payload(response, coap_server_supported_msg, + strlen(coap_server_supported_msg)); + } +} +/*---------------------------------------------------------------------------*/ +static void +res_get_handler_pref_parent(void *request, void *response, uint8_t *buffer, + uint16_t preferred_size, int32_t *offset) +{ + unsigned int accept = -1; + char def_rt_str[64]; + + REST.get_header_accept(request, &accept); + + memset(def_rt_str, 0, sizeof(def_rt_str)); + cc26xx_web_demo_ipaddr_sprintf(def_rt_str, sizeof(def_rt_str), + uip_ds6_defrt_choose()); + + if(accept == -1 || accept == REST.type.TEXT_PLAIN) { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%s", def_rt_str); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } else if(accept == REST.type.APPLICATION_JSON) { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{\"Parent\":\"%s\"}", + def_rt_str); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } else if(accept == REST.type.APPLICATION_XML) { + REST.set_header_content_type(response, REST.type.APPLICATION_XML); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, + "", def_rt_str); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } else { + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); + REST.set_response_payload(response, coap_server_supported_msg, + strlen(coap_server_supported_msg)); + } +} +/*---------------------------------------------------------------------------*/ +RESOURCE(res_parent_rssi, "title=\"Parent RSSI\";rt=\"dBm\"", + res_get_handler_parent_rssi, NULL, NULL, NULL); +/*---------------------------------------------------------------------------*/ +RESOURCE(res_parent_ip, "title=\"Preferred Parent\";rt=\"IPv6 address\"", + res_get_handler_pref_parent, NULL, NULL, NULL); +/*---------------------------------------------------------------------------*/ +/** @} */ From 8cb7562684a339477f9c91fdb810e5b3397b4ec6 Mon Sep 17 00:00:00 2001 From: Jonas Olsson Date: Sun, 16 Aug 2015 17:24:05 +0100 Subject: [PATCH 8/8] Improve the SPI and external flash driver for the sensortag For the SPI * We improve the return semantics of _read() and _write() * We set speed based on the value returned from ti_lib_sys_ctrl_clock_get() instead of using a hard-coded value External flash changes: * Rename macros to match instruction names * verify_part(): Return a different value when the device is powered down and when communication fails * Change return value semantics of static functions * Adjust checks of board_spi_ return values * Wait for BUSY to clear before attempting to send PD * Accept two possible flash parts: W25X40CL (4MBit) as well as the W25X20CL (2MBit) --- platform/srf06-cc26xx/sensortag/board-spi.c | 19 ++-- platform/srf06-cc26xx/sensortag/board-spi.h | 19 +++- platform/srf06-cc26xx/sensortag/ext-flash.c | 112 ++++++++++++-------- 3 files changed, 93 insertions(+), 57 deletions(-) diff --git a/platform/srf06-cc26xx/sensortag/board-spi.c b/platform/srf06-cc26xx/sensortag/board-spi.c index 640f8266c..960db75c8 100644 --- a/platform/srf06-cc26xx/sensortag/board-spi.c +++ b/platform/srf06-cc26xx/sensortag/board-spi.c @@ -43,8 +43,6 @@ #include /*---------------------------------------------------------------------------*/ -#define CPU_FREQ 48000000ul -/*---------------------------------------------------------------------------*/ static bool accessible(void) { @@ -62,11 +60,11 @@ accessible(void) return true; } /*---------------------------------------------------------------------------*/ -int +bool board_spi_write(const uint8_t *buf, size_t len) { if(accessible() == false) { - return 0; + return false; } while(len > 0) { @@ -78,14 +76,14 @@ board_spi_write(const uint8_t *buf, size_t len) buf++; } - return 0; + return true; } /*---------------------------------------------------------------------------*/ -int +bool board_spi_read(uint8_t *buf, size_t len) { if(accessible() == false) { - return 0; + return false; } while(len > 0) { @@ -93,14 +91,14 @@ board_spi_read(uint8_t *buf, size_t len) if(!ti_lib_rom_ssi_data_put_non_blocking(SSI0_BASE, 0)) { /* Error */ - return -1; + return false; } ti_lib_rom_ssi_data_get(SSI0_BASE, &ul); *buf = (uint8_t)ul; len--; buf++; } - return 0; + return true; } /*---------------------------------------------------------------------------*/ void @@ -132,7 +130,8 @@ board_spi_open(uint32_t bit_rate, uint32_t clk_pin) /* SPI configuration */ ti_lib_ssi_int_disable(SSI0_BASE, SSI_RXOR | SSI_RXFF | SSI_RXTO | SSI_TXFF); ti_lib_ssi_int_clear(SSI0_BASE, SSI_RXOR | SSI_RXTO); - ti_lib_rom_ssi_config_set_exp_clk(SSI0_BASE, CPU_FREQ, SSI_FRF_MOTO_MODE_0, + ti_lib_rom_ssi_config_set_exp_clk(SSI0_BASE, ti_lib_sys_ctrl_clock_get(), + SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, bit_rate, 8); ti_lib_rom_ioc_pin_type_ssi_master(SSI0_BASE, BOARD_IOID_SPI_MISO, BOARD_IOID_SPI_MOSI, IOID_UNUSED, clk_pin); diff --git a/platform/srf06-cc26xx/sensortag/board-spi.h b/platform/srf06-cc26xx/sensortag/board-spi.h index 0c1e49d1f..26bdff162 100644 --- a/platform/srf06-cc26xx/sensortag/board-spi.h +++ b/platform/srf06-cc26xx/sensortag/board-spi.h @@ -51,12 +51,21 @@ * \param bit_rate The bit rate to use * \param clk_pin The IOID for the clock pin. This can be IOID_0 etc * \return none + * + * This function will make sure the peripheral is powered, clocked and + * initialised. A chain of calls to board_spi_read(), board_spi_write() and + * board_spi_flush() must be preceded by a call to this function. It is + * recommended to call board_spi_close() after such chain of calls. */ void board_spi_open(uint32_t bit_rate, uint32_t clk_pin); /** * \brief Close the SPI interface * \return True when successful. + * + * This function will stop clocks to the SSI module and will set MISO, MOSI + * and CLK to a low leakage state. It is recommended to call this function + * after a chain of calls to board_spi_read() and board_spi_write() */ void board_spi_close(void); @@ -71,16 +80,22 @@ void board_spi_flush(void); * \param buf The buffer to store data * \param length The number of bytes to read * \return True when successful. + * + * Calls to this function must be preceded by a call to board_spi_open(). It is + * recommended to call board_spi_close() at the end of an operation. */ -int board_spi_read(uint8_t *buf, size_t length); +bool board_spi_read(uint8_t *buf, size_t length); /** * \brief Write to an SPI device * \param buf The buffer with the data to write * \param length The number of bytes to write * \return True when successful. + * + * Calls to this function must be preceded by a call to board_spi_open(). It is + * recommended to call board_spi_close() at the end of an operation. */ -int board_spi_write(const uint8_t *buf, size_t length); +bool board_spi_write(const uint8_t *buf, size_t length); /*---------------------------------------------------------------------------*/ #endif /* BOARD_SPI_H_ */ /*---------------------------------------------------------------------------*/ diff --git a/platform/srf06-cc26xx/sensortag/ext-flash.c b/platform/srf06-cc26xx/sensortag/ext-flash.c index d896473d3..c734e826a 100644 --- a/platform/srf06-cc26xx/sensortag/ext-flash.c +++ b/platform/srf06-cc26xx/sensortag/ext-flash.c @@ -50,8 +50,8 @@ #define BLS_CODE_SECTOR_ERASE 0x20 /**< Sector Erase */ #define BLS_CODE_MDID 0x90 /**< Manufacturer Device ID */ -#define BLS_CODE_DP 0xB9 /**< Power down */ -#define BLS_CODE_RDP 0xAB /**< Power standby */ +#define BLS_CODE_PD 0xB9 /**< Power down */ +#define BLS_CODE_RPD 0xAB /**< Release Power-Down */ /*---------------------------------------------------------------------------*/ /* Erase instructions */ @@ -70,13 +70,18 @@ #define BLS_STATUS_BIT_BUSY 0x01 /**< Busy bit of the status register */ /*---------------------------------------------------------------------------*/ /* Part specific constants */ +#define BLS_DEVICE_ID_W25X20CL 0x11 +#define BLS_DEVICE_ID_W25X40CL 0x12 #define BLS_MANUFACTURER_ID 0xEF -#define BLS_DEVICE_ID 0x12 #define BLS_PROGRAM_PAGE_SIZE 256 #define BLS_ERASE_SECTOR_SIZE 4096 /*---------------------------------------------------------------------------*/ +#define VERIFY_PART_ERROR -1 +#define VERIFY_PART_POWERED_DOWN 0 +#define VERIFY_PART_OK 1 +/*---------------------------------------------------------------------------*/ /** * Clear external flash CSN line */ @@ -97,11 +102,12 @@ deselect(void) /*---------------------------------------------------------------------------*/ /** * \brief Wait till previous erase/program operation completes. - * \return Zero when successful. + * \return True when successful. */ -static int +static bool wait_ready(void) { + bool ret; const uint8_t wbuf[1] = { BLS_CODE_READ_STATUS }; select(); @@ -109,11 +115,11 @@ wait_ready(void) /* Throw away all garbages */ board_spi_flush(); - int ret = board_spi_write(wbuf, sizeof(wbuf)); + ret = board_spi_write(wbuf, sizeof(wbuf)); - if(ret) { + if(ret == false) { deselect(); - return -2; + return false; } for(;;) { @@ -125,10 +131,10 @@ wait_ready(void) */ ret = board_spi_read(&buf, sizeof(buf)); - if(ret) { + if(ret == false) { /* Error */ deselect(); - return -2; + return false; } if(!(buf & BLS_STATUS_BIT_BUSY)) { /* Now ready */ @@ -136,36 +142,44 @@ wait_ready(void) } } deselect(); - return 0; + return true; } /*---------------------------------------------------------------------------*/ /** * \brief Verify the flash part. - * \return True when successful. + * \retval VERIFY_PART_OK The part was identified successfully + * \retval VERIFY_PART_ERROR There was an error communicating with the part + * \retval VERIFY_PART_POWERED_DOWN Communication was successful, but the part + * was powered down */ -static bool +static uint8_t verify_part(void) { const uint8_t wbuf[] = { BLS_CODE_MDID, 0xFF, 0xFF, 0x00 }; - uint8_t rbuf[2]; - int ret; + uint8_t rbuf[2] = {0, 0}; + bool ret; select(); ret = board_spi_write(wbuf, sizeof(wbuf)); - if(ret) { + if(ret == false) { deselect(); - return false; + return VERIFY_PART_ERROR; } ret = board_spi_read(rbuf, sizeof(rbuf)); deselect(); - if(ret || rbuf[0] != BLS_MANUFACTURER_ID || rbuf[1] != BLS_DEVICE_ID) { - return false; + if(ret == false) { + return VERIFY_PART_ERROR; } - return true; + + if(rbuf[0] != BLS_MANUFACTURER_ID || + (rbuf[1] != BLS_DEVICE_ID_W25X20CL && rbuf[1] != BLS_DEVICE_ID_W25X40CL)) { + return VERIFY_PART_POWERED_DOWN; + } + return VERIFY_PART_OK; } /*---------------------------------------------------------------------------*/ /** @@ -178,15 +192,21 @@ power_down(void) uint8_t cmd; uint8_t i; - cmd = BLS_CODE_DP; + /* First, wait for the device to be ready */ + if(wait_ready() == false) { + /* Entering here will leave the device in standby instead of powerdown */ + return; + } + + cmd = BLS_CODE_PD; select(); board_spi_write(&cmd, sizeof(cmd)); deselect(); i = 0; while(i < 10) { - if(!verify_part()) { - /* Verify Part failed: Device is powered down */ + if(verify_part() == VERIFY_PART_POWERED_DOWN) { + /* Device is powered down */ return; } i++; @@ -206,12 +226,12 @@ power_standby(void) uint8_t cmd; bool success; - cmd = BLS_CODE_RDP; + cmd = BLS_CODE_RPD; select(); success = board_spi_write(&cmd, sizeof(cmd)); if(success) { - success = wait_ready() == 0; + success = wait_ready() == true ? true : false; } deselect(); @@ -221,21 +241,22 @@ power_standby(void) /*---------------------------------------------------------------------------*/ /** * \brief Enable write. - * \return Zero when successful. + * \return True when successful. */ -static int +static bool write_enable(void) { + bool ret; const uint8_t wbuf[] = { BLS_CODE_WRITE_ENABLE }; select(); - int ret = board_spi_write(wbuf, sizeof(wbuf)); + ret = board_spi_write(wbuf, sizeof(wbuf)); deselect(); - if(ret) { - return -3; + if(ret == false) { + return false; } - return 0; + return true; } /*---------------------------------------------------------------------------*/ bool @@ -252,7 +273,7 @@ ext_flash_open() /* Put the part is standby mode */ power_standby(); - return verify_part(); + return verify_part() == VERIFY_PART_OK ? true : false; } /*---------------------------------------------------------------------------*/ void @@ -270,8 +291,8 @@ ext_flash_read(size_t offset, size_t length, uint8_t *buf) uint8_t wbuf[4]; /* Wait till previous erase/program operation completes */ - int ret = wait_ready(); - if(ret) { + bool ret = wait_ready(); + if(ret == false) { return false; } @@ -286,7 +307,7 @@ ext_flash_read(size_t offset, size_t length, uint8_t *buf) select(); - if(board_spi_write(wbuf, sizeof(wbuf))) { + if(board_spi_write(wbuf, sizeof(wbuf)) == false) { /* failure */ deselect(); return false; @@ -296,25 +317,25 @@ ext_flash_read(size_t offset, size_t length, uint8_t *buf) deselect(); - return ret == 0; + return ret; } /*---------------------------------------------------------------------------*/ bool ext_flash_write(size_t offset, size_t length, const uint8_t *buf) { uint8_t wbuf[4]; - int ret; + bool ret; size_t ilen; /* interim length per instruction */ while(length > 0) { /* Wait till previous erase/program operation completes */ ret = wait_ready(); - if(ret) { + if(ret == false) { return false; } ret = write_enable(); - if(ret) { + if(ret == false) { return false; } @@ -338,13 +359,13 @@ ext_flash_write(size_t offset, size_t length, const uint8_t *buf) * as much. */ select(); - if(board_spi_write(wbuf, sizeof(wbuf))) { + if(board_spi_write(wbuf, sizeof(wbuf)) == false) { /* failure */ deselect(); return false; } - if(board_spi_write(buf, ilen)) { + if(board_spi_write(buf, ilen) == false) { /* failure */ deselect(); return false; @@ -365,6 +386,7 @@ ext_flash_erase(size_t offset, size_t length) * sector erase is used blindly. */ uint8_t wbuf[4]; + bool ret; size_t i, numsectors; size_t endoffset = offset + length - 1; @@ -375,13 +397,13 @@ ext_flash_erase(size_t offset, size_t length) for(i = 0; i < numsectors; i++) { /* Wait till previous erase/program operation completes */ - int ret = wait_ready(); - if(ret) { + ret = wait_ready(); + if(ret == false) { return false; } ret = write_enable(); - if(ret) { + if(ret == false) { return false; } @@ -391,7 +413,7 @@ ext_flash_erase(size_t offset, size_t length) select(); - if(board_spi_write(wbuf, sizeof(wbuf))) { + if(board_spi_write(wbuf, sizeof(wbuf)) == false) { /* failure */ deselect(); return false;