From d4828c7baf5edbf809cd14b0b3205ebf6dd16e4d Mon Sep 17 00:00:00 2001 From: Edvard Pettersen Date: Fri, 29 Jun 2018 19:03:17 +0200 Subject: [PATCH] Fixed GPIO HAL issue. --- arch/cpu/cc13xx-cc26xx/Makefile.cc13xx-cc26xx | 13 +- .../cc13x0-cc26x0/cc13x0-cc26x0.lds | 4 +- .../cc13x2-cc26x2/cc13x2-cc26x2.lds | 4 +- arch/cpu/cc13xx-cc26xx/cc13xx-cc26xx-conf.h | 46 +++--- arch/cpu/cc13xx-cc26xx/dev/clock-arch.c | 4 +- .../dev/{putchar-arch.c => dbg-arch.c} | 61 +++----- arch/cpu/cc13xx-cc26xx/dev/dot-15-4g.h | 55 +++---- arch/cpu/cc13xx-cc26xx/dev/gpio-hal-arch.c | 135 ++++++++++++++++++ .../dev/{debug-uart.h => gpio-hal-arch.h} | 52 +++++-- .../dev/{dbg.h => int-master-arch.c} | 53 ++++--- arch/cpu/cc13xx-cc26xx/dev/rf-common.h | 2 + arch/cpu/cc13xx-cc26xx/dev/uart0-arch.c | 2 - arch/cpu/cc26xx-cc13xx/dev/gpio-hal-arch.h | 1 + .../cc13xx-cc26xx/launchpad/cc1352r1/Board.h | 10 +- .../cc13xx-cc26xx/launchpad/leds-arch.c | 59 +------- .../simplelink/cc13xx-cc26xx/platform.c | 27 ++-- os/dev/button-hal.c | 5 +- os/dev/gpio-hal.c | 1 + os/dev/gpio-hal.h | 44 ++++-- os/sys/timer.c | 4 +- 20 files changed, 362 insertions(+), 220 deletions(-) rename arch/cpu/cc13xx-cc26xx/dev/{putchar-arch.c => dbg-arch.c} (77%) create mode 100644 arch/cpu/cc13xx-cc26xx/dev/gpio-hal-arch.c rename arch/cpu/cc13xx-cc26xx/dev/{debug-uart.h => gpio-hal-arch.h} (57%) rename arch/cpu/cc13xx-cc26xx/dev/{dbg.h => int-master-arch.c} (67%) diff --git a/arch/cpu/cc13xx-cc26xx/Makefile.cc13xx-cc26xx b/arch/cpu/cc13xx-cc26xx/Makefile.cc13xx-cc26xx index a9b36ab17..35e88181a 100644 --- a/arch/cpu/cc13xx-cc26xx/Makefile.cc13xx-cc26xx +++ b/arch/cpu/cc13xx-cc26xx/Makefile.cc13xx-cc26xx @@ -68,12 +68,15 @@ EXTERNALDIRS += $(SDK_DEVICE)/startup_files ### CPU-dependent source files CONTIKI_CPU_SOURCEFILES += rtimer-arch.c clock-arch.c -CONTIKI_CPU_SOURCEFILES += watchdog-arch.c putchar-arch.c +CONTIKI_CPU_SOURCEFILES += watchdog-arch.c dbg-arch.c CONTIKI_CPU_SOURCEFILES += uart0-arch.c slip-arch.c -CONTIKI_CPU_SOURCEFILES += batmon-sensor.c -CONTIKI_CPU_SOURCEFILES += rf-common.c +CONTIKI_CPU_SOURCEFILES += batmon-sensor.c gpio-hal-arch.c +CONTIKI_CPU_SOURCEFILES += rf-common.c int-master-arch.c CONTIKI_CPU_SOURCEFILES += ieee-addr.c +### CPU-dependent debug source files +MODULES += os/lib/dbg-io + ifeq ($(SUPPORTS_PROP_MODE),1) CONTIKI_CPU_SOURCEFILES += rf-prop-mode.c prop-settings.c endif @@ -85,10 +88,6 @@ endif ### CPU-dependent directories CONTIKI_CPU_DIRS += . dev $(SUBFAMILY) rf-settings/$(DEVICE_FAMILY_LC) -### CPU-dependent debug source files -### CONTIKI_ARM_DIRS populated by Makefile.arm -DEBUG_IO_SOURCEFILES += dbg-printf.c dbg-snprintf.c dbg-sprintf.c strformat.c - CONTIKI_SOURCEFILES += $(CONTIKI_CPU_SOURCEFILES) $(DEBUG_IO_SOURCEFILES) ### Linker flag diff --git a/arch/cpu/cc13xx-cc26xx/cc13x0-cc26x0/cc13x0-cc26x0.lds b/arch/cpu/cc13xx-cc26xx/cc13x0-cc26x0/cc13x0-cc26x0.lds index 0e8e66510..dd4732580 100644 --- a/arch/cpu/cc13xx-cc26xx/cc13x0-cc26x0/cc13x0-cc26x0.lds +++ b/arch/cpu/cc13xx-cc26xx/cc13x0-cc26x0/cc13x0-cc26x0.lds @@ -34,8 +34,8 @@ * Default Linker script for the Texas Instruments CC1310 */ -MIN_STACKSIZE = 0x600; -HEAPSIZE = 256; +MIN_STACKSIZE = 0x800; /* 2048 bytes */ +HEAPSIZE = 0x100; /* 256 bytes */ MEMORY { diff --git a/arch/cpu/cc13xx-cc26xx/cc13x2-cc26x2/cc13x2-cc26x2.lds b/arch/cpu/cc13xx-cc26xx/cc13x2-cc26x2/cc13x2-cc26x2.lds index 9da90ebcd..cdfb619b2 100644 --- a/arch/cpu/cc13xx-cc26xx/cc13x2-cc26x2/cc13x2-cc26x2.lds +++ b/arch/cpu/cc13xx-cc26xx/cc13x2-cc26x2/cc13x2-cc26x2.lds @@ -34,8 +34,8 @@ * Default Linker script for the Texas Instruments CC1352 */ -MIN_STACKSIZE = 0x600; -HEAPSIZE = 256; /* Size of heap buffer used by HeapMem */ +MIN_STACKSIZE = 0x800; /* 2048 bytes */ +HEAPSIZE = 0x100; /* 256 bytes */ MEMORY { diff --git a/arch/cpu/cc13xx-cc26xx/cc13xx-cc26xx-conf.h b/arch/cpu/cc13xx-cc26xx/cc13xx-cc26xx-conf.h index f86ceb521..fc5243b51 100644 --- a/arch/cpu/cc13xx-cc26xx/cc13xx-cc26xx-conf.h +++ b/arch/cpu/cc13xx-cc26xx/cc13xx-cc26xx-conf.h @@ -42,6 +42,10 @@ /*---------------------------------------------------------------------------*/ #include "cc13xx-cc26xx-def.h" /*---------------------------------------------------------------------------*/ + +#define GPIO_HAL_CONF_ARCH_SW_TOGGLE 0 +#define GPIO_HAL_CONF_ARCH_HDR_PATH "dev/gpio-hal-arch.h" + /** * \name Network Stack Configuration * @@ -56,10 +60,27 @@ #define CC2650_FAST_RADIO_STARTUP (MAC_CONF_WITH_TSCH) #endif -#ifdef RF_CORE_CONF_CHANNEL -#define RF_CHANNEL RF_CORE_CONF_CHANNEL +#define RF_CORE_MODE_SUB_1_GHZ (1 << 0) +#define RF_CORE_MODE_2_4_GHZ (1 << 1) + +#define RF_CORE_MODE_MASK ( RF_CORE_MODE_SUB_1_GHZ \ + | RF_CORE_MODE_2_4_GHZ \ + ) + +/* Default RF mode is 2.4 GHz */ +#ifdef RF_CORE_CONF_MODE +# if !(RF_CORE_CONF_MODE & RF_CORE_MODE_MASK) +# error "Invalid RF_CORE_CONF_MODE" +# endif +# define RF_CORE_MODE RF_CORE_CONF_MODE #else -#define RF_CHANNEL 25 +# define RF_CORE_MODE RF_CORE_MODE_2_4_GHZ +#endif + +#ifdef RF_CORE_CONF_CHANNEL +# define RF_CHANNEL RF_CORE_CONF_CHANNEL +#else +# define RF_CHANNEL 25 #endif /* Number of Prop Mode RX buffers */ @@ -69,22 +90,11 @@ /* Configure Radio mode, i.e. prop or ieee */ - /*----- CC13xx Device Line --------------------------------------------------*/ /* CC13xx supports both IEEE and Prop mode, depending on which device */ #if defined(DEVICE_LINE_CC13XX) -/* Default mode should be prop for prop-only devices (CC1310, CC1312R); - * Else, IEEE mode is default. */ -# ifndef CC13XX_CONF_PROP_MODE -# if (SUPPORTS_IEEE_MODE == 0) -# define CC13XX_CONF_PROP_MODE 1 -# else -# define CC13XX_CONF_PROP_MODE 0 -# endif -# endif - -# if (CC13XX_CONF_PROP_MODE == 1) && (SUPPORTS_PROP_MODE == 1) +# if (RF_CORE_MODE == RF_CORE_MODE_SUB_1_GHZ) && (SUPPORTS_PROP_MODE) /*----- CC13xx Prop Mode ----------------------------------------------------*/ # define NETSTACK_CONF_RADIO prop_mode_driver @@ -92,7 +102,7 @@ # define CSMA_CONF_AFTER_ACK_DETECTED_WAIT_TIME (RTIMER_SECOND / 1000) # define CSMA_CONF_SEND_SOFT_ACK 1 -# elif (CC13XX_CONF_PROP_MODE == 0) && (SUPPORTS_IEEE_MODE == 1) +# elif (RF_CORE_MODE == RF_CORE_MODE_2_4_GHZ) && (SUPPORTS_IEEE_MODE) /*----- CC13xx IEEE Mode ----------------------------------------------------*/ # define NETSTACK_CONF_RADIO ieee_mode_driver @@ -101,13 +111,13 @@ # else /*----- CC13xx Non-supported Mode -------------------------------------------*/ # error "Invalid radio mode configuration of CC13xx device" -# endif /* (CC13XX_CONF_PROP_MODE == 1) && (SUPPORTS_PROP_MODE == 1) */ +# endif /* (RF_CORE_IS_SUB_1_GHZ == 1) && (SUPPORTS_PROP_MODE == 1) */ /*----- CC26xx Device Line --------------------------------------------------*/ /* CC26xx only supports IEEE mode */ #elif defined(DEVICE_LINE_CC26XX) -# if (SUPPORTS_IEEE_MODE == 1) +# if (SUPPORTS_IEEE_MODE) /*----- CC26xx IEEE Mode ----------------------------------------------------*/ # define NETSTACK_CONF_RADIO ieee_mode_driver diff --git a/arch/cpu/cc13xx-cc26xx/dev/clock-arch.c b/arch/cpu/cc13xx-cc26xx/dev/clock-arch.c index 784530de9..e39d54f4c 100644 --- a/arch/cpu/cc13xx-cc26xx/dev/clock-arch.c +++ b/arch/cpu/cc13xx-cc26xx/dev/clock-arch.c @@ -73,7 +73,7 @@ clock_init(void) ClockP_construct(&etimerClock, (ClockP_Fxn)&clock_update, CLOCK_TICKS_SECOND, ¶ms); } /*---------------------------------------------------------------------------*/ -CCIF clock_time_t +clock_time_t clock_time(void) { uint64_t count_read; @@ -100,7 +100,7 @@ clock_update(void) } } /*---------------------------------------------------------------------------*/ -CCIF unsigned long +unsigned long clock_seconds(void) { uint64_t count_read; diff --git a/arch/cpu/cc13xx-cc26xx/dev/putchar-arch.c b/arch/cpu/cc13xx-cc26xx/dev/dbg-arch.c similarity index 77% rename from arch/cpu/cc13xx-cc26xx/dev/putchar-arch.c rename to arch/cpu/cc13xx-cc26xx/dev/dbg-arch.c index d5dd4ac49..a12a877ed 100644 --- a/arch/cpu/cc13xx-cc26xx/dev/putchar-arch.c +++ b/arch/cpu/cc13xx-cc26xx/dev/dbg-arch.c @@ -28,60 +28,39 @@ * OF THE POSSIBILITY OF SUCH DAMAGE. */ /*---------------------------------------------------------------------------*/ +#include "sys/cc.h" +/*---------------------------------------------------------------------------*/ #include +#include #include - +/*---------------------------------------------------------------------------*/ #include "uart0-arch.h" - - -#undef putchar -#undef puts /*---------------------------------------------------------------------------*/ int -putchar(int c) +dbg_putchar(int c) { const unsigned char ch = (unsigned char)c; - return (uart0_write(&ch, 1) == 1) - ? (int)ch - : EOF; -} -/*---------------------------------------------------------------------------*/ -int -puts(const char *str) -{ - if(!str) - { - return EOF; - } - const size_t len = strlen(str); - const unsigned char newline = '\n'; - - if ((uart0_write(str, len) != len) && - (uart0_write(&newline, 1) != 1)) - { - return EOF; - } - - return len + 1; + const int num_bytes = (int)uart0_write(&ch, 1); + return (num_bytes > 0) + ? num_bytes + : 0; } /*---------------------------------------------------------------------------*/ unsigned int -dbg_send_bytes(const unsigned char *s, unsigned int len) +dbg_send_bytes(const unsigned char *seq, unsigned int len) { - if(!s || strlen((const char *)s) < len) - { - return EOF; + const size_t seq_len = strlen((const char *)seq); + + const size_t max_len = MIN(seq_len, (size_t)len); + + if (max_len == 0) { + return 0; } - const unsigned char newline = '\n'; - - if ((uart0_write(s, len) != len) && - (uart0_write(&newline, 1) != 1)) - { - return EOF; - } - - return len + 1; + const int num_bytes = (int)uart0_write(seq, max_len); + return (num_bytes > 0) + ? num_bytes + : 0; } /*---------------------------------------------------------------------------*/ diff --git a/arch/cpu/cc13xx-cc26xx/dev/dot-15-4g.h b/arch/cpu/cc13xx-cc26xx/dev/dot-15-4g.h index 7282ac9ba..9e9ae696d 100644 --- a/arch/cpu/cc13xx-cc26xx/dev/dot-15-4g.h +++ b/arch/cpu/cc13xx-cc26xx/dev/dot-15-4g.h @@ -79,45 +79,46 @@ * 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 -#define SMARTRF_SETTINGS_CONF_BAND_OVERRIDES HW32_ARRAY_OVERRIDE(0x405C,1), \ - (uint32_t)0x18000280, +# 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 +# define SMARTRF_SETTINGS_CONF_BAND_OVERRIDES \ + HW32_ARRAY_OVERRIDE(0x405C,1), \ + (uint32_t)0x18000280, #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 +# 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 +# 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 +# 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 +# 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 +# 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 +# error The selected IEEE 802.15.4g frequency band is not supported #endif /*---------------------------------------------------------------------------*/ #endif /* DOT_15_4G_H_ */ diff --git a/arch/cpu/cc13xx-cc26xx/dev/gpio-hal-arch.c b/arch/cpu/cc13xx-cc26xx/dev/gpio-hal-arch.c new file mode 100644 index 000000000..b34200d68 --- /dev/null +++ b/arch/cpu/cc13xx-cc26xx/dev/gpio-hal-arch.c @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2017, George Oikonomou - http://www.spd.gr + * 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-gpio-hal + * @{ + * + * \file + * Implementation file for the CC13xx/CC26xx GPIO HAL functions + */ +/*---------------------------------------------------------------------------*/ +#include "contiki.h" +#include "dev/gpio-hal.h" + +#include +#include DeviceFamily_constructPath(driverlib/gpio.h) +#include DeviceFamily_constructPath(driverlib/ioc.h) + +#include +/*---------------------------------------------------------------------------*/ +#define CONFIG_MASK (IOC_IOPULL_M | IOC_INT_M | IOC_IOMODE_OPEN_SRC_INV) +/*---------------------------------------------------------------------------*/ +void +gpio_hal_arch_interrupt_enable(gpio_hal_pin_t pin, gpio_hal_pin_cfg_t cfg) +{ + GPIO_clearEventDio(pin); + gpio_hal_arch_pin_cfg_set(pin, cfg); + IOCIntEnable(pin); +} +/*---------------------------------------------------------------------------*/ +void +gpio_hal_arch_pin_cfg_set(gpio_hal_pin_t pin, gpio_hal_pin_cfg_t cfg) +{ + /* Clear settings that we are about to change, keep everything else */ + uint32_t config = IOCPortConfigureGet(pin); + config &= ~CONFIG_MASK; + + switch (cfg & GPIO_HAL_PIN_CFG_INT_MASK) { + case GPIO_HAL_PIN_CFG_INT_DISABLE: config |= (IOC_NO_EDGE | IOC_INT_DISABLE); break; + case GPIO_HAL_PIN_CFG_INT_FALLING: config |= (IOC_FALLING_EDGE | IOC_INT_ENABLE); break; + case GPIO_HAL_PIN_CFG_INT_RISING: config |= (IOC_RISING_EDGE | IOC_INT_ENABLE); break; + case GPIO_HAL_PIN_CFG_INT_BOTH: config |= (IOC_BOTH_EDGES | IOC_INT_ENABLE); break; + default: {} + } + + switch (cfg & GPIO_HAL_PIN_CFG_PULL_MASK) { + case GPIO_HAL_PIN_CFG_PULL_NONE: config |= IOC_NO_IOPULL; break; + case GPIO_HAL_PIN_CFG_PULL_DOWN: config |= IOC_IOPULL_DOWN; break; + case GPIO_HAL_PIN_CFG_PULL_UP: config |= IOC_IOPULL_UP; break; + default: {} + } + + IOCPortConfigureSet(pin, IOC_PORT_GPIO, config); +} +/*---------------------------------------------------------------------------*/ +gpio_hal_pin_cfg_t +gpio_hal_arch_pin_cfg_get(gpio_hal_pin_t pin) +{ + gpio_hal_pin_cfg_t cfg = 0; + uint32_t config = IOCPortConfigureGet(pin); + + switch (config & IOC_IOPULL_M) { + case IOC_IOPULL_UP: cfg |= GPIO_HAL_PIN_CFG_PULL_UP; break; + case IOC_IOPULL_DOWN: cfg |= GPIO_HAL_PIN_CFG_PULL_DOWN; break; + case IOC_NO_IOPULL: cfg |= GPIO_HAL_PIN_CFG_PULL_NONE; break; + default: {} + } + + /* Interrupt enable/disable */ + uint32_t tmp = config & IOC_INT_M; + if (tmp & IOC_INT_ENABLE) { + switch (tmp) { + case IOC_FALLING_EDGE: cfg |= GPIO_HAL_PIN_CFG_INT_FALLING; break; + case IOC_RISING_EDGE: cfg |= GPIO_HAL_PIN_CFG_INT_RISING; break; + case IOC_BOTH_EDGES: cfg |= GPIO_HAL_PIN_CFG_INT_BOTH; break; + default: {} + } + } else { + cfg |= GPIO_HAL_PIN_CFG_INT_DISABLE; + } + + return cfg; +} +/*---------------------------------------------------------------------------*/ +gpio_hal_pin_mask_t +gpio_hal_arch_read_pins(gpio_hal_pin_mask_t pins) +{ + /* For pins configured as output we need to read DOUT31_0 */ + gpio_hal_pin_mask_t oe_pins = GPIO_getOutputEnableMultiDio(pins); + + pins &= ~oe_pins; + + return (HWREG(GPIO_BASE + GPIO_O_DOUT31_0) & oe_pins) | + GPIO_readMultiDio(pins); +} +/*---------------------------------------------------------------------------*/ +uint8_t +gpio_hal_arch_read_pin(gpio_hal_pin_t pin) +{ + if (GPIO_getOutputEnableDio(pin)) { + return (HWREG(GPIO_BASE + GPIO_O_DOUT31_0) >> pin) & 1; + } + + return GPIO_readDio(pin); +} +/*---------------------------------------------------------------------------*/ +/** @} */ diff --git a/arch/cpu/cc13xx-cc26xx/dev/debug-uart.h b/arch/cpu/cc13xx-cc26xx/dev/gpio-hal-arch.h similarity index 57% rename from arch/cpu/cc13xx-cc26xx/dev/debug-uart.h rename to arch/cpu/cc13xx-cc26xx/dev/gpio-hal-arch.h index c2d9b0ffb..6fd5a520c 100644 --- a/arch/cpu/cc13xx-cc26xx/dev/debug-uart.h +++ b/arch/cpu/cc13xx-cc26xx/dev/gpio-hal-arch.h @@ -1,16 +1,16 @@ /* - * Copyright (c) 2012, Texas Instruments Incorporated - http://www.ti.com/ + * Copyright (c) 2017, George Oikonomou - http://www.spd.gr * 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. @@ -30,20 +30,50 @@ */ /*---------------------------------------------------------------------------*/ /** - * \addtogroup cc26xx-char-io + * \addtogroup cc26xx + * @{ + * + * \defgroup cc26xx-gpio-hal CC13xx/CC26xx GPIO HAL implementation + * * @{ * * \file - * This file is here because DBG I/O expects it to be. It just includes - * our own dbg.h which has a non-misleading name and which also adheres - * to Contiki's naming convention + * Header file for the CC13xx/CC26xx GPIO HAL functions + * + * \note + * Do not include this header directly */ /*---------------------------------------------------------------------------*/ -#ifndef DEBUG_UART_H_ -#define DEBUG_UART_H_ +#ifndef GPIO_HAL_ARCH_H_ +#define GPIO_HAL_ARCH_H_ /*---------------------------------------------------------------------------*/ -#include "dbg.h" +#include "contiki.h" + +#include +#include DeviceFamily_constructPath(driverlib/gpio.h) +#include DeviceFamily_constructPath(driverlib/ioc.h) + +#include /*---------------------------------------------------------------------------*/ -#endif /* DEBUG_UART_H_ */ +#define gpio_hal_arch_init() do { /* do nothing */ } while (0) +#define gpio_hal_arch_interrupt_disable(p) IOCIntDisable(p) + +#define gpio_hal_arch_pin_set_input(p) IOCPinTypeGpioInput(p) +#define gpio_hal_arch_pin_set_output(p) IOCPinTypeGpioOutput(p) + +#define gpio_hal_arch_set_pin(p) GPIO_setDio(p) +#define gpio_hal_arch_clear_pin(p) GPIO_clearDio(p) +#define gpio_hal_arch_toggle_pin(p) GPIO_toggleDio(p) +#define gpio_hal_arch_write_pin(p, v) GPIO_writeDio(p, v) + +#define gpio_hal_arch_set_pins(p) GPIO_setMultiDio(p) +#define gpio_hal_arch_clear_pins(p) GPIO_clearMultiDio(p) +#define gpio_hal_arch_toggle_pins(p) GPIO_toggleMultiDio(p) +#define gpio_hal_arch_write_pins(p, v) GPIO_writeMultiDio(p, v) /*---------------------------------------------------------------------------*/ -/** @} */ +#endif /* GPIO_HAL_ARCH_H_ */ +/*---------------------------------------------------------------------------*/ +/** + * @} + * @} + */ diff --git a/arch/cpu/cc13xx-cc26xx/dev/dbg.h b/arch/cpu/cc13xx-cc26xx/dev/int-master-arch.c similarity index 67% rename from arch/cpu/cc13xx-cc26xx/dev/dbg.h rename to arch/cpu/cc13xx-cc26xx/dev/int-master-arch.c index 4460b6eb4..c06cc364f 100644 --- a/arch/cpu/cc13xx-cc26xx/dev/dbg.h +++ b/arch/cpu/cc13xx-cc26xx/dev/int-master-arch.c @@ -1,10 +1,11 @@ /* - * Copyright (c) 2014, Texas Instruments Incorporated - http://www.ti.com/ + * Copyright (c) 2017, George Oikonomou - http://www.spd.gr * 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 @@ -32,32 +33,48 @@ * \addtogroup cc26xx * @{ * - * \defgroup cc26xx-char-io CC13xx/CC26xx Character I/O + * \defgroup cc26xx-interrupts CC13xx-CC26xx master interrupt manipulation + * + * Master interrupt manipulation routines for the CC13xx and CC26xx CPUs * - * CC13xx/CC26xx CPU-specific functions for debugging and SLIP I/O * @{ * * \file - * Header file for the CC13xx/CC26xx Debug I/O module + * Master interrupt manipulation implementation for the TI CC13xx/CC26xx */ -#ifndef DBG_H_ -#define DBG_H_ /*---------------------------------------------------------------------------*/ #include "contiki.h" + +#include "sys/int-master.h" /*---------------------------------------------------------------------------*/ -/** - * \brief Print a stream of bytes - * \param seq A pointer to the stream - * \param len The number of bytes to print - * \return The number of printed bytes - * - * This function is an arch-specific implementation required by the dbg-io - * API in cpu/arm/common/dbg-io. It prints a stream of bytes over the - * peripheral used by the platform. - */ -unsigned int dbg_send_bytes(const unsigned char *seq, unsigned int len); +#include +#include DeviceFamily_constructPath(driverlib/cpu.h) + +#include /*---------------------------------------------------------------------------*/ -#endif /* DBG_H_ */ +void +int_master_enable(void) +{ + HwiP_enable(); +} +/*---------------------------------------------------------------------------*/ +int_master_status_t +int_master_read_and_disable(void) +{ + return HwiP_disable(); +} +/*---------------------------------------------------------------------------*/ +void +int_master_status_set(int_master_status_t status) +{ + HwiP_restore(status); +} +/*---------------------------------------------------------------------------*/ +bool +int_master_is_enabled(void) +{ + return CPUprimask() ? false : true; +} /*---------------------------------------------------------------------------*/ /** * @} diff --git a/arch/cpu/cc13xx-cc26xx/dev/rf-common.h b/arch/cpu/cc13xx-cc26xx/dev/rf-common.h index 9c3f244b9..f67466613 100644 --- a/arch/cpu/cc13xx-cc26xx/dev/rf-common.h +++ b/arch/cpu/cc13xx-cc26xx/dev/rf-common.h @@ -43,6 +43,8 @@ #ifndef RF_COMMON_H_ #define RF_COMMON_H_ /*---------------------------------------------------------------------------*/ +#include "contiki.h" +/*---------------------------------------------------------------------------*/ typedef enum { CMD_RESULT_ERROR = 0, CMD_RESULT_OK = 1, diff --git a/arch/cpu/cc13xx-cc26xx/dev/uart0-arch.c b/arch/cpu/cc13xx-cc26xx/dev/uart0-arch.c index 00390a3e5..f2b22b54d 100644 --- a/arch/cpu/cc13xx-cc26xx/dev/uart0-arch.c +++ b/arch/cpu/cc13xx-cc26xx/dev/uart0-arch.c @@ -44,7 +44,6 @@ /*---------------------------------------------------------------------------*/ #include #include -#include /*---------------------------------------------------------------------------*/ #include "uart0-arch.h" /*---------------------------------------------------------------------------*/ @@ -91,7 +90,6 @@ uart0_init(void) params.readReturnMode = UART_RETURN_NEWLINE; gh_uart = UART_open(Board_UART0, ¶ms); - assert(gh_uart != NULL); } /*---------------------------------------------------------------------------*/ int_fast32_t diff --git a/arch/cpu/cc26xx-cc13xx/dev/gpio-hal-arch.h b/arch/cpu/cc26xx-cc13xx/dev/gpio-hal-arch.h index 7d87670c5..2e83336d9 100644 --- a/arch/cpu/cc26xx-cc13xx/dev/gpio-hal-arch.h +++ b/arch/cpu/cc26xx-cc13xx/dev/gpio-hal-arch.h @@ -53,6 +53,7 @@ #include /*---------------------------------------------------------------------------*/ +#define gpio_hal_arch_init() do { /* do nothing */ } while (0) #define gpio_hal_arch_interrupt_enable(p) interrupt_enable(p) #define gpio_hal_arch_interrupt_disable(p) ti_lib_rom_ioc_int_disable(p) diff --git a/arch/platform/simplelink/cc13xx-cc26xx/launchpad/cc1352r1/Board.h b/arch/platform/simplelink/cc13xx-cc26xx/launchpad/cc1352r1/Board.h index 2c46e0b7c..148f96146 100644 --- a/arch/platform/simplelink/cc13xx-cc26xx/launchpad/cc1352r1/Board.h +++ b/arch/platform/simplelink/cc13xx-cc26xx/launchpad/cc1352r1/Board.h @@ -52,12 +52,12 @@ extern "C" { * Those values are not meant to be modified by the user * @{ */ -#define LEDS_RED (1 << 0) -#define LEDS_GREEN (1 << 1) -#define LEDS_YELLOW LEDS_GREEN -#define LEDS_ORANGE LEDS_RED +#define LEDS_CONF_COUNT 2 -#define LEDS_CONF_ALL (LEDS_RED | LEDS_GREEN) +#define LEDS_CONF_RED 0 +#define LEDS_CONF_GREEN 1 + +#define LEDS_CONF_ALL ((1 << LEDS_CONF_COUNT) - 1) /*---------------------------------------------------------------------------*/ /* These #defines allow us to reuse TI-RTOS across other device families */ diff --git a/arch/platform/simplelink/cc13xx-cc26xx/launchpad/leds-arch.c b/arch/platform/simplelink/cc13xx-cc26xx/launchpad/leds-arch.c index 463349854..97c912a84 100644 --- a/arch/platform/simplelink/cc13xx-cc26xx/launchpad/leds-arch.c +++ b/arch/platform/simplelink/cc13xx-cc26xx/launchpad/leds-arch.c @@ -37,66 +37,17 @@ */ /*---------------------------------------------------------------------------*/ /* Contiki API */ -#include -#include +#include "contiki.h" +#include "dev/leds.h" /*---------------------------------------------------------------------------*/ -/* Simplelink SDK API */ #include - -#include /*---------------------------------------------------------------------------*/ /* Standard library */ #include -#include /*---------------------------------------------------------------------------*/ -static const PIN_Config pin_table[] = { - Board_PIN_LED0 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, - Board_PIN_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, - PIN_TERMINATE +const leds_t leds_arch_leds[] = { + { .pin = Board_PIN_LED0, .negative_logic = false }, + { .pin = Board_PIN_LED1, .negative_logic = false }, }; - -static PIN_State pin_state; -static PIN_Handle pin_handle; - -static volatile unsigned char c; -/*---------------------------------------------------------------------------*/ -void -leds_arch_init(void) -{ - static bool bHasInit = false; - if(bHasInit) { - return; - } - - // PIN_init() called from Board_initGeneral() - pin_handle = PIN_open(&pin_state, pin_table); - if (!pin_handle) { - return; - } - - bHasInit = true; -} -/*---------------------------------------------------------------------------*/ -unsigned char -leds_arch_get(void) -{ - return c; -} -/*---------------------------------------------------------------------------*/ -void -leds_arch_set(unsigned char leds) -{ - c = leds; - - PIN_setPortOutputValue(pin_handle, 0); - - if (leds & LEDS_RED) { - PIN_setOutputValue(pin_handle, Board_PIN_LED0, 1); - } - - if (leds & LEDS_GREEN) { - PIN_setOutputValue(pin_handle, Board_PIN_LED1, 1); - } -} /*---------------------------------------------------------------------------*/ /** @} */ diff --git a/arch/platform/simplelink/cc13xx-cc26xx/platform.c b/arch/platform/simplelink/cc13xx-cc26xx/platform.c index a7c2e326e..a773d3ff0 100644 --- a/arch/platform/simplelink/cc13xx-cc26xx/platform.c +++ b/arch/platform/simplelink/cc13xx-cc26xx/platform.c @@ -71,6 +71,7 @@ #include "sys/rtimer.h" #include "sys/node-id.h" #include "sys/platform.h" +#include "dev/gpio-hal.h" #include "dev/serial-line.h" #include "dev/leds.h" #include "net/mac/framer/frame802154.h" @@ -85,6 +86,7 @@ #include "button-sensor.h" /*---------------------------------------------------------------------------*/ #include +#include /*---------------------------------------------------------------------------*/ /* Log configuration */ #include "sys/log.h" @@ -107,13 +109,9 @@ fade(unsigned char l) int j = k > 400 ? 800 - k : k; leds_on(l); - for(i = 0; i < j; ++i) { - __asm("nop"); - } + for(i = 0; i < j; ++i) { __asm("nop"); } leds_off(l); - for(i = 0; i < 400 - j; ++i) { - __asm("nop"); - } + for(i = 0; i < 400 - j; ++i) { __asm("nop"); } } } /*---------------------------------------------------------------------------*/ @@ -121,6 +119,7 @@ static void set_rf_params(void) { uint8_t ext_addr[8]; + memset(ext_addr, 0x0, sizeof(ext_addr)); ieee_addr_cpy_to(ext_addr, sizeof(ext_addr)); @@ -140,9 +139,9 @@ platform_init_stage_one(void) { DRIVERLIB_ASSERT_CURR_RELEASE(); - // Enable flash cache + /* Enable flash cache */ VIMSModeSet(VIMS_BASE, VIMS_MODE_ENABLED); - // Configure round robin arbitration and prefetching + /* Configure round robin arbitration and prefetching */ VIMSConfigure(VIMS_BASE, true, true); Power_init(); @@ -155,19 +154,20 @@ platform_init_stage_one(void) /* Perform board-specific initialization */ Board_initHook(); - // Contiki drivers init + /* Contiki drivers init */ + gpio_hal_init(); leds_init(); fade(LEDS_RED); - // TI Drivers init + /* TI Drivers init */ I2C_init(); SPI_init(); UART_init(); fade(LEDS_GREEN); - // NoRTOS should be called last + /* NoRTOS should be called last */ NoRTOS_start(); } /*---------------------------------------------------------------------------*/ @@ -205,6 +205,9 @@ platform_init_stage_three(void) ChipInfo_SupportsIEEE_802_15_4() ? "Yes" : "No", ChipInfo_SupportsPROPRIETARY() ? "Yes" : "No", ChipInfo_SupportsBLE() ? "Yes" : "No"); + + LOG_INFO("Operating frequency on %s\n", + (RF_CORE_MODE == RF_CORE_MODE_SUB_1_GHZ) ? "Sub-1 GHz" : "2.4 GHz"); LOG_INFO("RF: Channel %d, PANID 0x%04X\n", chan, pan); LOG_INFO("Node ID: %d\n", g_nodeId); @@ -216,7 +219,7 @@ platform_init_stage_three(void) void platform_idle(void) { - // Drop to some low power mode + /* Drop to some low power mode */ Power_idleFunc(); } /*---------------------------------------------------------------------------*/ diff --git a/os/dev/button-hal.c b/os/dev/button-hal.c index 58cded790..a1255e7f7 100644 --- a/os/dev/button-hal.c +++ b/os/dev/button-hal.c @@ -178,11 +178,10 @@ button_hal_init() button_event_handler.handler = press_release_handler; for(button = button_hal_buttons; *button != NULL; button++) { - cfg = GPIO_HAL_PIN_CFG_EDGE_BOTH | GPIO_HAL_PIN_CFG_INT_ENABLE | - (*button)->pull; + cfg = (*button)->pull; gpio_hal_arch_pin_set_input((*button)->pin); gpio_hal_arch_pin_cfg_set((*button)->pin, cfg); - gpio_hal_arch_interrupt_enable((*button)->pin); + gpio_hal_arch_interrupt_enable((*button)->pin, GPIO_HAL_PIN_CFG_INT_BOTH); button_event_handler.pin_mask |= gpio_hal_pin_to_mask((*button)->pin); } diff --git a/os/dev/gpio-hal.c b/os/dev/gpio-hal.c index 658152293..949d829a7 100644 --- a/os/dev/gpio-hal.c +++ b/os/dev/gpio-hal.c @@ -75,6 +75,7 @@ void gpio_hal_init() { list_init(handlers); + gpio_hal_arch_init(); } /*---------------------------------------------------------------------------*/ #if GPIO_HAL_ARCH_SW_TOGGLE diff --git a/os/dev/gpio-hal.h b/os/dev/gpio-hal.h index b6af7bf74..1ca1c141c 100644 --- a/os/dev/gpio-hal.h +++ b/os/dev/gpio-hal.h @@ -82,7 +82,7 @@ typedef uint8_t gpio_hal_pin_t; * A logical representation of a pin's configuration. It is an OR combination * of GPIO_HAL_PIN_CFG_xyz macros. */ -typedef uint8_t gpio_hal_pin_cfg_t; +typedef uint32_t gpio_hal_pin_cfg_t; #ifdef GPIO_HAL_CONF_PIN_COUNT #define GPIO_HAL_PIN_COUNT GPIO_HAL_CONF_PIN_COUNT @@ -101,21 +101,23 @@ typedef uint32_t gpio_hal_pin_mask_t; typedef void (*gpio_hal_callback_t)(gpio_hal_pin_mask_t pin_mask); /*---------------------------------------------------------------------------*/ -#define GPIO_HAL_PIN_CFG_PULL_NONE 0x00 -#define GPIO_HAL_PIN_CFG_PULL_UP 0x01 -#define GPIO_HAL_PIN_CFG_PULL_DOWN 0x02 -#define GPIO_HAL_PIN_CFG_PULL_MASK (GPIO_HAL_PIN_CFG_PULL_UP | \ - GPIO_HAL_PIN_CFG_PULL_DOWN) +#define GPIO_HAL_PIN_CFG_PULL_NONE (0) +#define GPIO_HAL_PIN_CFG_PULL_UP (1 << 0) +#define GPIO_HAL_PIN_CFG_PULL_DOWN (1 << 1) -#define GPIO_HAL_PIN_CFG_EDGE_NONE 0x00 -#define GPIO_HAL_PIN_CFG_EDGE_RISING 0x04 -#define GPIO_HAL_PIN_CFG_EDGE_FALLING 0x08 -#define GPIO_HAL_PIN_CFG_EDGE_BOTH (GPIO_HAL_PIN_CFG_EDGE_RISING | \ - GPIO_HAL_PIN_CFG_EDGE_FALLING) +#define GPIO_HAL_PIN_CFG_PULL_MASK ( GPIO_HAL_PIN_CFG_PULL_UP \ + | GPIO_HAL_PIN_CFG_PULL_DOWN \ + ) -#define GPIO_HAL_PIN_CFG_INT_DISABLE 0x00 -#define GPIO_HAL_PIN_CFG_INT_ENABLE 0x80 -#define GPIO_HAL_PIN_CFG_INT_MASK 0x80 +#define GPIO_HAL_PIN_CFG_INT_DISABLE (0) +#define GPIO_HAL_PIN_CFG_INT_FALLING (1 << 2) +#define GPIO_HAL_PIN_CFG_INT_RISING (1 << 3) +#define GPIO_HAL_PIN_CFG_INT_BOTH (1 << 4) + +#define GPIO_HAL_PIN_CFG_INT_MASK ( GPIO_HAL_PIN_CFG_INT_RISING \ + | GPIO_HAL_PIN_CFG_INT_FALLING \ + | GPIO_HAL_PIN_CFG_INT_BOTH \ + ) /*---------------------------------------------------------------------------*/ /** * \brief Datatype for GPIO event handlers @@ -233,6 +235,18 @@ void gpio_hal_event_handler(gpio_hal_pin_mask_t pins); #include GPIO_HAL_CONF_ARCH_HDR_PATH #endif /* GPIO_HAL_CONF_ARCH_HDR_PATH */ /*---------------------------------------------------------------------------*/ +#ifndef gpio_hal_arch_init +/** + * \brief Perform architecture specific gpio initaliaztion + * + * It is the platform developer's responsibility to provide an implementation. + * + * The implementation can be provided as a global symbol, an inline function + * or a function-like macro, as described above. + */ +void gpio_hal_arch_init(void); +#endif +/*---------------------------------------------------------------------------*/ #ifndef gpio_hal_arch_interrupt_enable /** * \brief Enable interrupts for a gpio pin @@ -243,7 +257,7 @@ void gpio_hal_event_handler(gpio_hal_pin_mask_t pins); * The implementation can be provided as a global symbol, an inline function * or a function-like macro, as described above. */ -void gpio_hal_arch_interrupt_enable(gpio_hal_pin_t pin); +void gpio_hal_arch_interrupt_enable(gpio_hal_pin_t pin, gpio_hal_pin_cfg_t cfg); #endif /*---------------------------------------------------------------------------*/ #ifndef gpio_hal_arch_interrupt_disable diff --git a/os/sys/timer.c b/os/sys/timer.c index 1eeae64de..068d57777 100644 --- a/os/sys/timer.c +++ b/os/sys/timer.c @@ -84,7 +84,9 @@ timer_set(struct timer *t, clock_time_t interval) void timer_reset(struct timer *t) { - t->start += t->interval; + if(timer_expired(t)) { + t->start += t->interval; + } } /*---------------------------------------------------------------------------*/ /**