diff --git a/boards/sodaq-one/Makefile b/boards/sodaq-one/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..f8fcbb53a06595771dae356338a7bf2c0673734d --- /dev/null +++ b/boards/sodaq-one/Makefile @@ -0,0 +1,3 @@ +MODULE = board + +include $(RIOTBASE)/Makefile.base diff --git a/boards/sodaq-one/Makefile.dep b/boards/sodaq-one/Makefile.dep new file mode 100644 index 0000000000000000000000000000000000000000..5472bf8b8d8fd463a18815c0f10e5d348f90fe51 --- /dev/null +++ b/boards/sodaq-one/Makefile.dep @@ -0,0 +1,3 @@ +ifneq (,$(filter saul_default,$(USEMODULE))) + USEMODULE += saul_gpio +endif diff --git a/boards/sodaq-one/Makefile.features b/boards/sodaq-one/Makefile.features new file mode 100644 index 0000000000000000000000000000000000000000..62ad960d64f7209cd5ca4fe8505e6554407f2373 --- /dev/null +++ b/boards/sodaq-one/Makefile.features @@ -0,0 +1,14 @@ +# Put defined MCU peripherals here (in alphabetical order) +FEATURES_PROVIDED += periph_adc +FEATURES_PROVIDED += periph_gpio +FEATURES_PROVIDED += periph_i2c +FEATURES_PROVIDED += periph_rtc +FEATURES_PROVIDED += periph_rtt +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_m0_2 + +-include $(RIOTCPU)/samd21/Makefile.features diff --git a/boards/sodaq-one/Makefile.include b/boards/sodaq-one/Makefile.include new file mode 100644 index 0000000000000000000000000000000000000000..95366d62a2b1adb3b647d8f0abd7614b98a6702b --- /dev/null +++ b/boards/sodaq-one/Makefile.include @@ -0,0 +1,19 @@ +# define the cpu used by the SODAQ ONE board +export CPU = samd21 +export CPU_MODEL = samd21g18a + +#export needed for flash rule +export PORT_LINUX ?= /dev/ttyACM0 +export PORT_DARWIN ?= $(firstword $(sort $(wildcard /dev/tty.usbmodem*))) + +# setup serial terminal +include $(RIOTMAKE)/tools/serial.inc.mk + +# setup the flash tool used +# we use BOSSA to flash this board since there's an Arduino bootloader +# preflashed on it. ROM_OFFSET skips the space taken by such bootloader. +ROM_OFFSET ?= 0x2000 +include $(RIOTMAKE)/tools/bossa.inc.mk + +# setup the boards dependencies +include $(RIOTBOARD)/$(BOARD)/Makefile.dep diff --git a/boards/sodaq-one/board.c b/boards/sodaq-one/board.c new file mode 100644 index 0000000000000000000000000000000000000000..15c39bf2148227d94d28f7f46f6071345c7220d2 --- /dev/null +++ b/boards/sodaq-one/board.c @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2017 Kees Bakker, SODAQ + * + * 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_sodaq-one + * @{ + * + * @file + * @brief Board common implementations for the SODAQ ONE board + * + * @author Kees Bakker <kees@sodaq.com> + * @} + */ + +#include "cpu.h" +#include "board.h" +#include "periph/gpio.h" + +void board_init(void) +{ + /* initialize the on-board LEDs, switch them off to start with */ + LED0_OFF; + gpio_init(LED0_PIN, GPIO_OUT); + LED1_OFF; + gpio_init(LED1_PIN, GPIO_OUT); + LED2_OFF; + gpio_init(LED2_PIN, GPIO_OUT); + + /* reset RN2483 (LoRa) */ + LORA_RESET_OFF; + gpio_init(LORA_RESET_PIN, GPIO_OUT); + + GPS_ENABLE_OFF; + gpio_init(GPS_ENABLE_PIN, GPIO_OUT); + + /* initialize the CPU */ + cpu_init(); +} diff --git a/boards/sodaq-one/doc.txt b/boards/sodaq-one/doc.txt new file mode 100644 index 0000000000000000000000000000000000000000..43a4eb037583a883faa4b5d7fec066c296134d80 --- /dev/null +++ b/boards/sodaq-one/doc.txt @@ -0,0 +1,29 @@ +/** + * @defgroup boards_sodaq-one SODAQ ONE + * @ingroup boards + * @brief Support for the SODAQ ONE board + * + * ### General information + * + * General information about this board can be found on the + * [SODAQ support](http://support.sodaq.com/sodaq-one/sodaq-one/) website. + * + * ### Flash the board + * + * 1. Put the board in bootloader mode by double tapping the reset button.<br/> + * When the board is in bootloader mode, the user led (blue) oscillates + * smoothly. + * + * + * 2. Use `BOARD=sodaq-one` with the `make` command.<br/> + * Example with `hello-world` application: + * ``` + * make BOARD=sodaq-one -C examples/hello-world flash + * ``` + * + * ### Accessing STDIO via UART + * + * To access the STDIO of RIOT, a FTDI to USB converter needs to be plugged to + * the RX/TX pins on the board. + * + */ diff --git a/boards/sodaq-one/include/board.h b/boards/sodaq-one/include/board.h new file mode 100644 index 0000000000000000000000000000000000000000..175b55dc75eca757283d081c340802f175829c6f --- /dev/null +++ b/boards/sodaq-one/include/board.h @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2017 Kees Bakker, SODAQ + * + * 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_sodaq-one + * @{ + * + * @file + * @brief Board specific definitions for the SODAQ ONE board + * + * @author Kees Bakker <kees@sodaq.com> + */ + +#ifndef BOARD_H +#define BOARD_H + +#include "cpu.h" +#include "periph_conf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @name xtimer configuration + * @{ + */ +#define XTIMER_WIDTH (16) +/** @} */ + +/** + * @name LED pin definitions and handlers + * @{ + */ +#define LED0_PIN GPIO_PIN(PA, 15) + +#define LED0_PORT PORT->Group[PA] +#define LED0_MASK (1 << 15) + +#define LED0_OFF (LED0_PORT.OUTSET.reg = LED0_MASK) +#define LED0_ON (LED0_PORT.OUTCLR.reg = LED0_MASK) +#define LED0_TOGGLE (LED0_PORT.OUTTGL.reg = LED0_MASK) + +#define LED1_PIN GPIO_PIN(PB, 10) + +#define LED1_PORT PORT->Group[PB] +#define LED1_MASK (1 << 10) + +#define LED1_OFF (LED1_PORT.OUTSET.reg = LED1_MASK) +#define LED1_ON (LED1_PORT.OUTCLR.reg = LED1_MASK) +#define LED1_TOGGLE (LED1_PORT.OUTTGL.reg = LED1_MASK) + +#define LED2_PIN GPIO_PIN(PB, 11) + +#define LED2_PORT PORT->Group[PB] +#define LED2_MASK (1 << 11) + +#define LED2_OFF (LED2_PORT.OUTSET.reg = LED2_MASK) +#define LED2_ON (LED2_PORT.OUTCLR.reg = LED2_MASK) +#define LED2_TOGGLE (LED2_PORT.OUTTGL.reg = LED2_MASK) +/** @} */ + +/** + * @name User button + */ +#define BTN0_PIN GPIO_PIN(PA, 16) +#define BTN0_MODE GPIO_IN +/** @} */ + +/** + * @name GPS Time Pulse + */ +#define GPS_TIMEPULSE_PIN GPIO_PIN(PA, 14) +#define GPS_TIMEPULSE_MODE GPIO_IN +/** @} */ + +/** + * @name GPS Enable + * @{ + */ +#define GPS_ENABLE_PIN GPIO_PIN(PA, 18) + +#define GPS_ENABLE_PORT PORT->Group[PA] +#define GPS_ENABLE_MASK (1 << 18) + +#define GPS_ENABLE_ON (GPS_ENABLE_PORT.OUTSET.reg = GPS_ENABLE_MASK) +#define GPS_ENABLE_OFF (GPS_ENABLE_PORT.OUTCLR.reg = GPS_ENABLE_MASK) +/** @} */ + +/** + * @name LORA Reset + * @{ + */ +#define LORA_RESET_PIN GPIO_PIN(PA, 4) + +#define LORA_RESET_PORT PORT->Group[PA] +#define LORA_RESET_MASK (1 << 4) + +#define LORA_RESET_OFF (LORA_RESET_PORT.OUTSET.reg = LORA_RESET_MASK) +#define LORA_RESET_ON (LORA_RESET_PORT.OUTCLR.reg = LORA_RESET_MASK) +#define LORA_RESET_TOGGLE (LORA_RESET_PORT.OUTTGL.reg = LORA_RESET_MASK) +/** @} */ + +/** + * @brief Initialize board specific hardware, including clock, LEDs and std-IO + */ +void board_init(void); + +#ifdef __cplusplus +} +#endif + +#endif /* BOARD_H */ +/** @} */ diff --git a/boards/sodaq-one/include/gpio_params.h b/boards/sodaq-one/include/gpio_params.h new file mode 100644 index 0000000000000000000000000000000000000000..e742b0d66bd02fae677d4106b88824770030a043 --- /dev/null +++ b/boards/sodaq-one/include/gpio_params.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2017 Kees Bakker, SODAQ + * + * 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_sodaq-one + * @{ + * + * @file + * @brief Board specific configuration of direct mapped GPIOs + * + * @author Kees Bakker <kees@sodaq.com> + */ + +#ifndef GPIO_PARAMS_H +#define GPIO_PARAMS_H + +#include "board.h" +#include "saul/periph.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief GPIO pin configuration + */ +static const saul_gpio_params_t saul_gpio_params[] = +{ + { + .name = "LED Red", + .pin = LED0_PIN, + .mode = GPIO_OUT + }, + { + .name = "LED Green", + .pin = LED1_PIN, + .mode = GPIO_OUT + }, + { + .name = "LED Blue", + .pin = LED2_PIN, + .mode = GPIO_OUT + }, + { + .name = "Button", + .pin = BTN0_PIN, + .mode = BTN0_MODE, + .flags = SAUL_GPIO_INVERTED + }, +}; + +#ifdef __cplusplus +} +#endif + +#endif /* GPIO_PARAMS_H */ +/** @} */ diff --git a/boards/sodaq-one/include/periph_conf.h b/boards/sodaq-one/include/periph_conf.h new file mode 100644 index 0000000000000000000000000000000000000000..5c4cc4c78a8130fb299d23e4849cfc520f48797d --- /dev/null +++ b/boards/sodaq-one/include/periph_conf.h @@ -0,0 +1,243 @@ +/* + * Copyright (C) 2017 Kees Bakker, SODAQ + * + * 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_sodaq-one + * @{ + * + * @file + * @brief Configuration of CPU peripherals for the SODAQ ONE board + * + * @author Kees Bakker <kees@sodaq.com> + */ + +#ifndef PERIPH_CONF_H +#define PERIPH_CONF_H + +#include <stdint.h> + +#include "cpu.h" +#include "periph_cpu.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @name External oscillator and clock configuration + * + * For selection of the used CORECLOCK, we have implemented two choices: + * + * - usage of the PLL fed by the internal 8MHz oscillator divided by 8 + * - usage of the internal 8MHz oscillator directly, divided by N if needed + * + * + * The PLL option allows for the usage of a wider frequency range and a more + * stable clock with less jitter. This is why we use this option as default. + * + * The target frequency is computed from the PLL multiplier and the PLL divisor. + * Use the following formula to compute your values: + * + * CORECLOCK = ((PLL_MUL + 1) * 1MHz) / PLL_DIV + * + * NOTE: The PLL circuit does not run with less than 32MHz while the maximum PLL + * frequency is 96MHz. So PLL_MULL must be between 31 and 95! + * + * + * The internal Oscillator used directly can lead to a slightly better power + * efficiency to the cost of a less stable clock. Use this option when you know + * what you are doing! The actual core frequency is adjusted as follows: + * + * CORECLOCK = 8MHz / DIV + * + * NOTE: A core clock frequency below 1MHz is not recommended + * + * @{ + */ +#define CLOCK_USE_PLL (1) + +#if CLOCK_USE_PLL +/* edit these values to adjust the PLL output frequency */ +#define CLOCK_PLL_MUL (47U) /* must be >= 31 & <= 95 */ +#define CLOCK_PLL_DIV (1U) /* adjust to your needs */ +/* generate the actual used core clock frequency */ +#define CLOCK_CORECLOCK (((CLOCK_PLL_MUL + 1) * 1000000U) / CLOCK_PLL_DIV) +#else +/* edit this value to your needs */ +#define CLOCK_DIV (1U) +/* generate the actual core clock frequency */ +#define CLOCK_CORECLOCK (8000000 / CLOCK_DIV) +#endif +/** @} */ + +/** + * @name Timer peripheral configuration + * @{ + */ +#define TIMER_NUMOF (2U) +#define TIMER_0_EN 1 +#define TIMER_1_EN 1 + +/* Timer 0 configuration */ +#define TIMER_0_DEV TC3->COUNT16 +#define TIMER_0_CHANNELS 2 +#define TIMER_0_MAX_VALUE (0xffff) +#define TIMER_0_ISR isr_tc3 + +/* Timer 1 configuration */ +#define TIMER_1_DEV TC4->COUNT32 +#define TIMER_1_CHANNELS 2 +#define TIMER_1_MAX_VALUE (0xffffffff) +#define TIMER_1_ISR isr_tc4 +/** @} */ + +/** + * @name UART configuration + * @{ + * See Table 6.1 of the SAM D21 Datasheet + */ +static const uart_conf_t uart_config[] = { + { + .dev = &SERCOM5->USART, + .rx_pin = GPIO_PIN(PB,3), /* D0, RX Pin */ + .tx_pin = GPIO_PIN(PB,2), /* D1, TX Pin */ + .mux = GPIO_MUX_D, + .rx_pad = UART_PAD_RX_1, + .tx_pad = UART_PAD_TX_0, + .flags = UART_FLAG_NONE, + .gclk_src = GCLK_CLKCTRL_GEN_GCLK0 + }, + { + .dev = &SERCOM2->USART, + .rx_pin = GPIO_PIN(PA,13), + .tx_pin = GPIO_PIN(PA,12), + .mux = GPIO_MUX_C, + .rx_pad = UART_PAD_RX_1, + .tx_pad = UART_PAD_TX_0, + .flags = UART_FLAG_NONE, + .gclk_src = GCLK_CLKCTRL_GEN_GCLK0 + }, +}; + +/* interrupt function name mapping */ +#define UART_0_ISR isr_sercom5 +#define UART_1_ISR isr_sercom2 + +#define UART_NUMOF (sizeof(uart_config) / sizeof(uart_config[0])) +/** @} */ + +/** + * @name ADC configuration + * @{ + */ +#define ADC_0_EN 1 +#define ADC_MAX_CHANNELS 17 +/* ADC 0 device configuration */ +#define ADC_0_DEV ADC +#define ADC_0_IRQ ADC_IRQn + +/* ADC 0 Default values */ +#define ADC_0_CLK_SOURCE 0 /* GCLK_GENERATOR_0 */ +#define ADC_0_PRESCALER ADC_CTRLB_PRESCALER_DIV512 + +#define ADC_0_NEG_INPUT ADC_INPUTCTRL_MUXNEG_GND +#define ADC_0_GAIN_FACTOR_DEFAULT ADC_INPUTCTRL_GAIN_1X +#define ADC_0_REF_DEFAULT ADC_REFCTRL_REFSEL_INT1V + +static const adc_conf_chan_t adc_channels[] = { + /* port, pin, muxpos */ + {GPIO_PIN(PA, 2), ADC_INPUTCTRL_MUXPOS_PIN0}, /* A0 */ + {GPIO_PIN(PA, 3), ADC_INPUTCTRL_MUXPOS_PIN1}, /* A1 */ + {GPIO_PIN(PB, 8), ADC_INPUTCTRL_MUXPOS_PIN2}, /* A2 */ + {GPIO_PIN(PB, 9), ADC_INPUTCTRL_MUXPOS_PIN3}, /* A3 */ + {GPIO_PIN(PA, 6), ADC_INPUTCTRL_MUXPOS_PIN6}, /* A4 */ + {GPIO_PIN(PA, 7), ADC_INPUTCTRL_MUXPOS_PIN7}, /* A5 */ + {GPIO_PIN(PA, 8), ADC_INPUTCTRL_MUXPOS_PIN16}, /* A6 */ + {GPIO_PIN(PA, 9), ADC_INPUTCTRL_MUXPOS_PIN17}, /* A7 */ + {GPIO_PIN(PA,10), ADC_INPUTCTRL_MUXPOS_PIN18}, /* A8 */ + {GPIO_PIN(PA,11), ADC_INPUTCTRL_MUXPOS_PIN19}, /* A9 */ + {GPIO_PIN(PB, 2), ADC_INPUTCTRL_MUXPOS_PIN10}, /* A10 */ + {GPIO_PIN(PB, 3), ADC_INPUTCTRL_MUXPOS_PIN11}, /* A11 */ + + {GPIO_PIN(PA, 2), ADC_INPUTCTRL_MUXPOS_PIN0}, /* DAC/VOUT */ + {GPIO_PIN(PA, 3), ADC_INPUTCTRL_MUXPOS_PIN1}, /* AREF */ + {GPIO_PIN(PA, 5), ADC_INPUTCTRL_MUXPOS_PIN5}, /* BAT_VOLT */ +}; + +#define ADC_0_CHANNELS (12) +#define ADC_NUMOF ADC_0_CHANNELS +/** @} */ + +/** + * @name SPI configuration + * @{ + */ +static const spi_conf_t spi_config[] = { + { + .dev = &SERCOM0->SPI, + .miso_pin = GPIO_PIN(PA, 8), + .mosi_pin = GPIO_PIN(PA, 10), + .clk_pin = GPIO_PIN(PA, 11), + .miso_mux = GPIO_MUX_C, + .mosi_mux = GPIO_MUX_C, + .clk_mux = GPIO_MUX_C, + .miso_pad = SPI_PAD_MISO_0, + .mosi_pad = SPI_PAD_MOSI_2_SCK_3 + } +}; + +#define SPI_NUMOF (sizeof(spi_config) / sizeof(spi_config[0])) +/** @} */ + +/** + * @name I2C configuration + * @{ + */ +static const i2c_conf_t i2c_config[] = { + { + .dev = &(SERCOM3->I2CM), + .speed = I2C_SPEED_NORMAL, + .scl_pin = GPIO_PIN(PA, 23), + .sda_pin = GPIO_PIN(PA, 22), + .mux = GPIO_MUX_C, + .gclk_src = GCLK_CLKCTRL_GEN_GCLK0, + .flags = I2C_FLAG_NONE + } +}; +#define I2C_NUMOF (sizeof(i2c_config) / sizeof(i2c_config[0])) + +/** @} */ + +/** + * @name RTC configuration + * @{ + */ +#define RTC_NUMOF (1U) +#define RTC_DEV RTC->MODE2 +/** @} */ + +/** + * @name RTT configuration + * @{ + */ +#define RTT_NUMOF (1U) +#define RTT_DEV RTC->MODE0 +#define RTT_IRQ RTC_IRQn +#define RTT_IRQ_PRIO 10 +#define RTT_ISR isr_rtc +#define RTT_MAX_VALUE (0xffffffff) +#define RTT_FREQUENCY (32768U) /* in Hz. For changes see `rtt.c` */ +#define RTT_RUNSTDBY (1) /* Keep RTT running in sleep states */ +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* PERIPH_CONF_H */ +/** @} */ diff --git a/examples/lua_REPL/Makefile b/examples/lua_REPL/Makefile index 39ba81f50c434c46ff58acabe77427ea275a61aa..cacf10fbcc06eb0d784cdb48a57955a960c51868 100644 --- a/examples/lua_REPL/Makefile +++ b/examples/lua_REPL/Makefile @@ -22,7 +22,7 @@ BOARD_INSUFFICIENT_MEMORY := bluepill calliope-mini cc2650-launchpad \ remote-pa remote-reva remote-revb samd21-xpro \ saml21-xpro samr21-xpro seeeduino_arch-pro \ slstk3401a sltb001a slwstk6220a sodaq-autonomo \ - sodaq-explorer stk3600 stm32f3discovery \ + sodaq-explorer sodaq-one stk3600 stm32f3discovery \ yunjia-nrf51822 BOARD_BLACKLIST := arduino-duemilanove arduino-mega2560 arduino-uno \ diff --git a/tests/unittests/Makefile b/tests/unittests/Makefile index f4a6a9f4a530364d03980960a8f2dda3ba55235d..0ca0d3457e19ebdc62542a4356d72d4f65f9da25 100644 --- a/tests/unittests/Makefile +++ b/tests/unittests/Makefile @@ -63,6 +63,7 @@ BOARD_INSUFFICIENT_MEMORY := airfy-beacon \ slwstk6220a \ sodaq-autonomo \ sodaq-explorer \ + sodaq-one \ spark-core \ stk3600 \ stm32f0discovery \ @@ -172,6 +173,7 @@ ARM_CORTEX_M_BOARDS := airfy-beacon \ slwstk6220a \ sodaq-autonomo \ sodaq-explorer \ + sodaq-one \ spark-core \ stk3600 \ stk3700 \