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