From a48b8e741b22f600fd735ee0bc063959c268d436 Mon Sep 17 00:00:00 2001 From: Kevin Weiss Date: Wed, 28 Mar 2018 14:47:09 +0200 Subject: [PATCH] boards/openmote-b: Add board support --- boards/openmote-b/Makefile | 3 + boards/openmote-b/Makefile.dep | 5 + boards/openmote-b/Makefile.features | 12 ++ boards/openmote-b/Makefile.include | 36 +++++ boards/openmote-b/board.c | 42 ++++++ boards/openmote-b/include/board.h | 113 ++++++++++++++++ boards/openmote-b/include/periph_conf.h | 170 ++++++++++++++++++++++++ examples/lua_REPL/Makefile | 8 +- tests/unittests/Makefile | 1 + 9 files changed, 386 insertions(+), 4 deletions(-) create mode 100644 boards/openmote-b/Makefile create mode 100644 boards/openmote-b/Makefile.dep create mode 100644 boards/openmote-b/Makefile.features create mode 100644 boards/openmote-b/Makefile.include create mode 100644 boards/openmote-b/board.c create mode 100644 boards/openmote-b/include/board.h create mode 100644 boards/openmote-b/include/periph_conf.h diff --git a/boards/openmote-b/Makefile b/boards/openmote-b/Makefile new file mode 100644 index 0000000000..f8fcbb53a0 --- /dev/null +++ b/boards/openmote-b/Makefile @@ -0,0 +1,3 @@ +MODULE = board + +include $(RIOTBASE)/Makefile.base diff --git a/boards/openmote-b/Makefile.dep b/boards/openmote-b/Makefile.dep new file mode 100644 index 0000000000..dd120c6dfa --- /dev/null +++ b/boards/openmote-b/Makefile.dep @@ -0,0 +1,5 @@ +ifneq (,$(filter gnrc_netdev_default,$(USEMODULE))) + USEMODULE += netif + USEMODULE += cc2538_rf + USEMODULE += netdev_ieee802154 +endif diff --git a/boards/openmote-b/Makefile.features b/boards/openmote-b/Makefile.features new file mode 100644 index 0000000000..24693fb349 --- /dev/null +++ b/boards/openmote-b/Makefile.features @@ -0,0 +1,12 @@ +# Put defined MCU peripherals here (in alphabetical order) +FEATURES_PROVIDED += periph_adc +FEATURES_PROVIDED += periph_gpio +FEATURES_PROVIDED += periph_i2c +FEATURES_PROVIDED += periph_spi +FEATURES_PROVIDED += periph_timer +FEATURES_PROVIDED += periph_uart + +# The board MPU family (used for grouping by the CI system) +FEATURES_MCU_GROUP = cortex_m3_2 + +-include $(RIOTCPU)/cc2538/Makefile.features diff --git a/boards/openmote-b/Makefile.include b/boards/openmote-b/Makefile.include new file mode 100644 index 0000000000..48ff10a2d0 --- /dev/null +++ b/boards/openmote-b/Makefile.include @@ -0,0 +1,36 @@ +# define the cpu used by the OpenMote-B board +export CPU = cc2538 +export CPU_MODEL = cc2538sf53 + +# define the default port depending on the host OS +PORT_LINUX ?= /dev/ttyUSB1 +PORT_DARWIN ?= $(firstword $(sort $(wildcard /dev/tty.usbserial*))) + +# Set default flash tool +export PROGRAMMER ?= cc2538-bsl + +ifeq ($(PROGRAMMER),cc2538-bsl) + OS := $(shell uname) + ifeq ($(OS),Linux) + PORT_BSL ?= $(PORT_LINUX) + else ifeq ($(OS),Darwin) + PORT_BSL ?= $(PORT_DARWIN) + endif + export FLASHER = $(RIOTBASE)/dist/tools/cc2538-bsl/cc2538-bsl.py + export FFLAGS = -p "$(PORT_BSL)" --bootloader-invert-lines -e -w -v -b 460800 $(HEXFILE) +else ifeq ($(PROGRAMMER),jlink) + export FLASHER = $(RIOTBOARD)/$(BOARD)/dist/flash.sh + export FFLAGS = $(BINDIR) $(HEXFILE) + export DEBUGGER = $(RIOTBOARD)/$(BOARD)/dist/debug.sh + export DEBUGSERVER = JLinkGDBServer -device CC2538SF53 + export RESET = $(RIOTBOARD)/$(BOARD)/dist/reset.sh +endif + +export OFLAGS = -O binary +export HEXFILE = $(ELFFILE:.elf=.bin) +export DEBUGGER_FLAGS = $(BINDIR) $(ELFFILE) +export RESET_FLAGS = $(BINDIR) +export OBJDUMPFLAGS += --disassemble --source --disassembler-options=force-thumb + +# setup serial terminal +include $(RIOTMAKE)/tools/serial.inc.mk diff --git a/boards/openmote-b/board.c b/boards/openmote-b/board.c new file mode 100644 index 0000000000..222f23ea47 --- /dev/null +++ b/boards/openmote-b/board.c @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2014 Freie Universität Berlin + * Copyright (C) 2018 HAW Hamburg + * + * This file is subject to the terms and conditions of the GNU Lesser General + * Public License v2.1. See the file LICENSE in the top level directory for more + * details. + */ + +/** + * @ingroup boards_openmote-b + * @{ + * + * @file + * @brief Board specific implementations for the OpenMote-B board + * + * @author Hauke Petersen + * @author Kevin Weiss + * @} + */ + +#include "board.h" +#include "periph/gpio.h" + +void board_init(void) +{ + /* initialize the boards LEDs */ + gpio_init(LED0_PIN, GPIO_OUT); + gpio_init(LED1_PIN, GPIO_OUT); + gpio_init(LED2_PIN, GPIO_OUT); + gpio_init(LED3_PIN, GPIO_OUT); + gpio_init(USER_BUTTON_PIN, GPIO_IN); + gpio_init(RF_SWITCH_2_4_GHZ_PIN, GPIO_OUT); + gpio_init(RF_SWITCH_SUB_GHZ_PIN, GPIO_OUT); + + /* start with cc2538 2.4ghz radio*/ + RF_SWITCH_2_4_GHZ_ON; + RF_SWITCH_SUB_GHZ_OFF; + + /* initialize the CPU */ + cpu_init(); +} diff --git a/boards/openmote-b/include/board.h b/boards/openmote-b/include/board.h new file mode 100644 index 0000000000..d425baeca4 --- /dev/null +++ b/boards/openmote-b/include/board.h @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2014 Freie Universität Berlin + * Copyright (C) 2018 HAW Hamburg + * + * This file is subject to the terms and conditions of the GNU Lesser General + * Public License v2.1. See the file LICENSE in the top level directory for more + * details. + */ + +/** + * @defgroup boards_openmote-b OpenMote-B + * @ingroup boards + * @brief Support for the OpenMote-B board + * @{ + * + * @file + * @brief Board specific definitions for the OpenMote-B board + * + * @author Hauke Petersen + * @author Kevin Weiss + */ + +#ifndef BOARD_H +#define BOARD_H + +#include "cpu.h" +#include "periph/gpio.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** + * @name LED pin definitions and handlers + * @{ + */ +#define LED0_PIN GPIO_PIN(2, 4) +#define LED1_PIN GPIO_PIN(2, 7) +#define LED2_PIN GPIO_PIN(2, 6) +#define LED3_PIN GPIO_PIN(2, 5) +#define LED3_PIN GPIO_PIN(2, 5) +#define USER_BUTTON_PIN GPIO_PIN(2, 5) +#define RF_SWITCH_2_4_GHZ_PIN GPIO_PIN(3, 4) /**< PD4 -- 2.4ghz */ +#define RF_SWITCH_SUB_GHZ_PIN GPIO_PIN(3, 3) /**< PD3 -- subghz */ + +#define LED_PORT GPIO_C +#define LED0_MASK (1 << 4) +#define LED1_MASK (1 << 7) +#define LED2_MASK (1 << 6) +#define LED3_MASK (1 << 5) + +#define RF_SWITCH_PORT GPIO_D +#define RF_SWITCH_2_4_GHZ_MASK (1 << 4) +#define RF_SWITCH_SUB_GHZ_MASK (1 << 3) + +#define LED0_ON (LED_PORT->DATA &= ~LED0_MASK) +#define LED0_OFF (LED_PORT->DATA |= LED0_MASK) +#define LED0_TOGGLE (LED_PORT->DATA ^= LED0_MASK) + +#define LED1_ON (LED_PORT->DATA &= ~LED1_MASK) +#define LED1_OFF (LED_PORT->DATA |= LED1_MASK) +#define LED1_TOGGLE (LED_PORT->DATA ^= LED1_MASK) + +#define LED2_ON (LED_PORT->DATA &= ~LED2_MASK) +#define LED2_OFF (LED_PORT->DATA |= LED2_MASK) +#define LED2_TOGGLE (LED_PORT->DATA ^= LED2_MASK) + +#define LED3_ON (LED_PORT->DATA &= ~LED3_MASK) +#define LED3_OFF (LED_PORT->DATA |= LED3_MASK) +#define LED3_TOGGLE (LED_PORT->DATA ^= LED3_MASK) + +#define RF_SWITCH_2_4_GHZ_ON (RF_SWITCH_PORT->DATA |= RF_SWITCH_2_4_GHZ_MASK) +#define RF_SWITCH_2_4_GHZ_OFF (RF_SWITCH_PORT->DATA &= ~RF_SWITCH_2_4_GHZ_MASK) +#define RF_SWITCH_2_4_GHZ_TOGGLE (RF_SWITCH_PORT->DATA ^= RF_SWITCH_2_4_GHZ_MASK) + +#define RF_SWITCH_SUB_GHZ_ON (RF_SWITCH_PORT->DATA |= RF_SWITCH_SUB_GHZ_MASK) +#define RF_SWITCH_SUB_GHZ_OFF (RF_SWITCH_PORT->DATA &= ~RF_SWITCH_SUB_GHZ_MASK) +#define RF_SWITCH_SUB_GHZ_TOGGLE (RF_SWITCH_PORT->DATA ^= RF_SWITCH_SUB_GHZ_MASK) +/** @} */ + +/** + * @name xtimer configuration + * @{ + */ +#define XTIMER_WIDTH (16) +#define XTIMER_BACKOFF (50) +#define XTIMER_ISR_BACKOFF (40) +/** @} */ + +/** + * @name Flash Customer Configuration Area (CCA) parameters + * @{ + */ +#ifndef UPDATE_CCA +#define UPDATE_CCA (1) +#endif + +#define CCA_BACKDOOR_ENABLE (1) +#define CCA_BACKDOOR_PORT_A_PIN (6) /**< BSL_BOOT Pin */ +#define CCA_BACKDOOR_ACTIVE_LEVEL (0) /**< Active low */ +/** @} */ + +/** + * @brief Initialize board specific hardware, including clock, LEDs and std-IO + */ +void board_init(void); + +#ifdef __cplusplus +} /* end extern "C" */ +#endif + +#endif /* BOARD_H */ +/** @} */ diff --git a/boards/openmote-b/include/periph_conf.h b/boards/openmote-b/include/periph_conf.h new file mode 100644 index 0000000000..a952f66aee --- /dev/null +++ b/boards/openmote-b/include/periph_conf.h @@ -0,0 +1,170 @@ +/* + * Copyright (C) 2014 Freie Universität Berlin + * Copyright (C) 2018 HAW Hamburg + * + * This file is subject to the terms and conditions of the GNU Lesser General + * Public License v2.1. See the file LICENSE in the top level directory for more + * details. + */ + +/** + * @ingroup boards_openmote-b + * @{ + * + * @file + * @brief Peripheral MCU configuration for the OpenMote-B board + * + * @author Hauke Petersen + * @author Sebastian Meiling + * @author Kevin Weiss + */ + +#ifndef PERIPH_CONF_H +#define PERIPH_CONF_H + +#include "cc2538_gpio.h" +#include "periph_cpu.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** + * @name Clock system configuration + * @{ + */ +#define CLOCK_CORECLOCK (32000000U) /* desired core clock frequency, 32MHz */ +/** @} */ + +/** + * @name Timer configuration + * + * General purpose timers (GPT[0-3]) are configured consecutively and + * in order (without gaps) starting from GPT0, i.e. if multiple timers are enabled. + * + * @{ + */ +static const timer_conf_t timer_config[] = { + { + .chn = 2, + .cfg = GPTMCFG_16_BIT_TIMER, /* required for XTIMER */ + }, + { + .chn = 1, + .cfg = GPTMCFG_32_BIT_TIMER, + }, + { + .chn = 2, + .cfg = GPTMCFG_16_BIT_TIMER, + }, + { + .chn = 1, + .cfg = GPTMCFG_32_BIT_TIMER, + }, +}; + +#define TIMER_NUMOF (sizeof(timer_config) / sizeof(timer_config[0])) +#define TIMER_IRQ_PRIO 1 +/** @} */ + +/** + * @name ADC configuration + * @{ + */ +#define SOC_ADC_ADCCON_REF SOC_ADC_ADCCON_REF_AVDD5 + +static const adc_conf_t adc_config[] = { + GPIO_PIN(1, 0), /**< GPIO_PB0 = GPIO0_PIN */ + GPIO_PIN(1, 1), /**< GPIO_PB1 = GPIO1_PIN */ + GPIO_PIN(1, 2), /**< GPIO_PB2 = GPIO2_PIN */ + GPIO_PIN(1, 3), /**< GPIO_PB3 = GPIO3_PIN */ + GPIO_PIN(2, 3), /**< GPIO_PC3 = GPIO4_PIN */ + GPIO_PIN(0, 7), /**< GPIO_PA7 = GPIO5_PIN */ + +}; + +#define ADC_NUMOF (sizeof(adc_config) / sizeof(adc_config[0])) +/** @} */ + +/** + * @name UART configuration + * @{ + */ +static const uart_conf_t uart_config[] = { + { + .dev = UART0_BASEADDR, + .rx_pin = GPIO_PIN(0, 0), + .tx_pin = GPIO_PIN(0, 1), + .cts_pin = GPIO_UNDEF, + .rts_pin = GPIO_UNDEF + } +}; + +/* interrupt function name mapping */ +#define UART_0_ISR isr_uart0 + +/* macros common across all UARTs */ +#define UART_NUMOF (sizeof(uart_config) / sizeof(uart_config[0])) +/** @} */ + +/** + * @name I2C configuration + * @{ + */ +#define I2C_IRQ_PRIO 1 + +static const i2c_conf_t i2c_config[] = { + { + .speed = I2C_SPEED_FAST, /**< bus speed */ + .scl_pin = GPIO_PIN(1, 5), /* SI7006 Temp/RH sensor */ + .sda_pin = GPIO_PIN(1, 4) /* SI7006 Temp/RH sensor */ + }, +}; + +#define I2C_NUMOF (sizeof(i2c_config) / sizeof(i2c_config[0])) +/** @} */ + +/** + * @brief Pre-calculated clock divider values based on a CLOCK_CORECLOCK (32MHz) + * + * Calculated with (CPSR * (SCR + 1)) = (CLOCK_CORECLOCK / bus_freq), + * where 1 < CPSR < 255 and 0 < SCR < 256 + */ +static const spi_clk_conf_t spi_clk_config[] = { + { .cpsr = 10, .scr = 31 }, /* 100khz */ + { .cpsr = 2, .scr = 39 }, /* 400khz */ + { .cpsr = 2, .scr = 15 }, /* 1MHz */ + { .cpsr = 2, .scr = 2 }, /* ~4.5MHz */ + { .cpsr = 2, .scr = 1 } /* ~10.7MHz */ +}; + +/** + * @name SPI configuration + * @{ + */ +static const spi_conf_t spi_config[] = { + { + .dev = SSI0, + .mosi_pin = GPIO_PA5, + .miso_pin = GPIO_PA4, + .sck_pin = GPIO_PA2, + .cs_pin = GPIO_PA3, + }, +}; + +#define SPI_NUMOF (sizeof(spi_config) / sizeof(spi_config[0])) +/** @} */ + +/** + * @name Radio peripheral configuration + * @{ + */ +#define RADIO_IRQ_PRIO 1 +/** @} */ + +#ifdef __cplusplus +} /* end extern "C" */ +#endif + +#endif /* PERIPH_CONF_H */ +/** @} */ diff --git a/examples/lua_REPL/Makefile b/examples/lua_REPL/Makefile index fb397b5319..39ba81f50c 100644 --- a/examples/lua_REPL/Makefile +++ b/examples/lua_REPL/Makefile @@ -18,10 +18,10 @@ BOARD_INSUFFICIENT_MEMORY := bluepill calliope-mini cc2650-launchpad \ b-l072z-lrwan1 cc2538dk ek-lm4f120xl feather-m0 \ ikea-tradfri limifrog-v1 mbed_lpc1768 nrf6310 \ nucleo-f091rc nucleo-l073rz nz32-sc151 \ - openmote-cc2538 pba-d-01-kw2x remote-pa \ - remote-reva remote-revb samd21-xpro saml21-xpro \ - samr21-xpro seeeduino_arch-pro slstk3401a \ - sltb001a slwstk6220a sodaq-autonomo \ + openmote-cc2538 openmote-b pba-d-01-kw2x \ + remote-pa remote-reva remote-revb samd21-xpro \ + saml21-xpro samr21-xpro seeeduino_arch-pro \ + slstk3401a sltb001a slwstk6220a sodaq-autonomo \ sodaq-explorer stk3600 stm32f3discovery \ yunjia-nrf51822 diff --git a/tests/unittests/Makefile b/tests/unittests/Makefile index 38e8a0a2e8..f4a6a9f4a5 100644 --- a/tests/unittests/Makefile +++ b/tests/unittests/Makefile @@ -49,6 +49,7 @@ BOARD_INSUFFICIENT_MEMORY := airfy-beacon \ opencm904 \ openmote \ openmote-cc2538 \ + openmote-b \ pba-d-01-kw2x \ remote-pa \ remote-reva \