From dfc50024b85f90379a51973cf79fc60f18533ea8 Mon Sep 17 00:00:00 2001
From: Bas Stottelaar <basstottelaar@gmail.com>
Date: Mon, 19 Mar 2018 23:30:07 +0100
Subject: [PATCH] boards: slstk3402a: add support

---
 boards/slstk3402a/Makefile              |   5 +
 boards/slstk3402a/Makefile.dep          |   8 +
 boards/slstk3402a/Makefile.features     |  13 ++
 boards/slstk3402a/Makefile.include      |  22 +++
 boards/slstk3402a/board.c               |  39 +++++
 boards/slstk3402a/include/board.h       | 119 +++++++++++++++
 boards/slstk3402a/include/gpio_params.h |  63 ++++++++
 boards/slstk3402a/include/periph_conf.h | 194 ++++++++++++++++++++++++
 8 files changed, 463 insertions(+)
 create mode 100644 boards/slstk3402a/Makefile
 create mode 100644 boards/slstk3402a/Makefile.dep
 create mode 100644 boards/slstk3402a/Makefile.features
 create mode 100644 boards/slstk3402a/Makefile.include
 create mode 100644 boards/slstk3402a/board.c
 create mode 100644 boards/slstk3402a/include/board.h
 create mode 100644 boards/slstk3402a/include/gpio_params.h
 create mode 100644 boards/slstk3402a/include/periph_conf.h

diff --git a/boards/slstk3402a/Makefile b/boards/slstk3402a/Makefile
new file mode 100644
index 0000000000..39108f4589
--- /dev/null
+++ b/boards/slstk3402a/Makefile
@@ -0,0 +1,5 @@
+MODULE = board
+
+DIRS = $(RIOTBOARD)/common/silabs
+
+include $(RIOTBASE)/Makefile.base
diff --git a/boards/slstk3402a/Makefile.dep b/boards/slstk3402a/Makefile.dep
new file mode 100644
index 0000000000..6821288802
--- /dev/null
+++ b/boards/slstk3402a/Makefile.dep
@@ -0,0 +1,8 @@
+ifneq (,$(filter saul_default,$(USEMODULE)))
+  USEMODULE += saul_gpio
+endif
+
+# include board common dependencies
+include $(RIOTBOARD)/common/silabs/Makefile.dep
+
+include $(RIOTCPU)/efm32/Makefile.dep
diff --git a/boards/slstk3402a/Makefile.features b/boards/slstk3402a/Makefile.features
new file mode 100644
index 0000000000..671cfa79fb
--- /dev/null
+++ b/boards/slstk3402a/Makefile.features
@@ -0,0 +1,13 @@
+# Put defined MCU peripherals here (in alphabetical order)
+FEATURES_PROVIDED += periph_adc
+FEATURES_PROVIDED += periph_gpio
+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_m4_2
+
+-include $(RIOTCPU)/efm32/Makefile.features
diff --git a/boards/slstk3402a/Makefile.include b/boards/slstk3402a/Makefile.include
new file mode 100644
index 0000000000..0667f8a449
--- /dev/null
+++ b/boards/slstk3402a/Makefile.include
@@ -0,0 +1,22 @@
+# define the cpu used by SLSTK3402A
+export CPU = efm32
+export CPU_MODEL = efm32pg12b500f1024gl125
+
+# set default port depending on operating system
+PORT_LINUX ?= /dev/ttyACM0
+PORT_DARWIN ?= $(firstword $(sort $(wildcard /dev/tty.usbmodem*)))
+
+# setup serial terminal
+include $(RIOTMAKE)/tools/serial.inc.mk
+
+# setup JLink for flashing
+export JLINK_DEVICE := $(CPU_MODEL)
+include $(RIOTMAKE)/tools/jlink.inc.mk
+
+# add board common drivers
+USEMODULE += boards_common_silabs
+USEMODULE += silabs_aem
+USEMODULE += silabs_bc
+
+# include board common
+include $(RIOTBOARD)/common/silabs/Makefile.include
diff --git a/boards/slstk3402a/board.c b/boards/slstk3402a/board.c
new file mode 100644
index 0000000000..4a0f9170e6
--- /dev/null
+++ b/boards/slstk3402a/board.c
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2015-2018 Freie Universität Berlin
+ *
+ * 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_slstk3402a
+ * @{
+ *
+ * @file
+ * @brief       Board specific implementations SLSTK3402A board
+ *
+ * @author      Hauke Petersen <hauke.petersen@fu-berlin.de>
+ * @author      Bas Stottelaar <basstottelaar@gmail.com>
+ *
+ * @}
+ */
+
+#include "board.h"
+#include "board_common.h"
+#include "periph/gpio.h"
+
+void board_init(void)
+{
+    /* initialize the CPU */
+    cpu_init();
+
+    /* perform common board initialization */
+    board_common_init();
+
+#ifdef MODULE_SI7021
+    /* initialize the Si7021 sensor */
+    gpio_init(SI7021_EN_PIN, GPIO_OUT);
+    gpio_set(SI7021_EN_PIN);
+#endif
+}
diff --git a/boards/slstk3402a/include/board.h b/boards/slstk3402a/include/board.h
new file mode 100644
index 0000000000..b556ed44e2
--- /dev/null
+++ b/boards/slstk3402a/include/board.h
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2015-2018 Freie Universität Berlin
+ *
+ * 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_slstk3402a Silicon Labs SLSTK3402A starter kit
+ * @ingroup     boards
+ * @brief       Support for the Silicon Labs SLSTK3402A starter kit
+ * @{
+ *
+ * @file
+ * @brief       Board specific definitions for the SLSTK3402A starter kit
+ *
+ * @author      Hauke Petersen <hauke.petersen@fu-berlin.de>
+ * @author      Bas Stottelaar <basstottelaar@gmail.com>
+ */
+
+#ifndef BOARD_H
+#define BOARD_H
+
+#include "cpu.h"
+#include "periph_conf.h"
+#include "periph/gpio.h"
+#include "periph/spi.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @name    Xtimer configuration
+ *
+ * The timer runs at 250 KHz to increase accuracy.
+ * @{
+ */
+#define XTIMER_HZ           (250000UL)
+#define XTIMER_WIDTH        (16)
+/** @} */
+
+/**
+ * @name    Board controller configuration
+ *
+ * Define the GPIO pin to enable the BC, to allow serial communication
+ * via the USB port.
+ * @{
+ */
+#define BC_PIN              GPIO_PIN(PA, 5)
+/** @} */
+
+/**
+ * @name    Push button pin definitions
+ * @{
+ */
+#define PB0_PIN             GPIO_PIN(PF, 6)
+#define PB1_PIN             GPIO_PIN(PF, 7)
+/** @} */
+
+/**
+ * @name    LED pin definitions
+ * @{
+ */
+#define LED0_PIN            GPIO_PIN(PF, 4)
+#define LED1_PIN            GPIO_PIN(PF, 5)
+/** @} */
+
+/**
+ * @name    Macros for controlling the on-board LEDs
+ * @{
+ */
+#define LED0_ON             gpio_set(LED0_PIN)
+#define LED0_OFF            gpio_clear(LED0_PIN)
+#define LED0_TOGGLE         gpio_toggle(LED0_PIN)
+#define LED1_ON             gpio_set(LED1_PIN)
+#define LED1_OFF            gpio_clear(LED1_PIN)
+#define LED1_TOGGLE         gpio_toggle(LED1_PIN)
+/** @} */
+
+/**
+ * @name    Display configuration
+ *
+ * Connection to the on-board Sharp Memory LCD (LS013B7DH03).
+ * @{
+ */
+#define DISP_SPI            SPI_DEV(0)
+#define DISP_COM_PIN        GPIO_PIN(PD, 13)
+#define DISP_CS_PIN         GPIO_PIN(PD, 14)
+#define DISP_EN_PIN         GPIO_PIN(PD, 15)
+/** @} */
+
+/**
+ * @name    Temperature sensor configuration
+ *
+ * Connection to the on-board temperature/humidity sensor (Si7021).
+ * @{
+ */
+#ifndef SI7021_ENABLED
+#define SI7021_ENABLED          (1)
+#endif
+#define SI7021_I2C              I2C_DEV(0)
+#define SI7021_EN_PIN           GPIO_PIN(PB, 10)
+
+#define SI70XX_PARAM_I2C_DEV    SI7021_I2C
+/** @} */
+
+/**
+ * @brief   Initialize the board (GPIO, sensors, clocks).
+ */
+void board_init(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* BOARD_H */
+/** @} */
diff --git a/boards/slstk3402a/include/gpio_params.h b/boards/slstk3402a/include/gpio_params.h
new file mode 100644
index 0000000000..b7f0a996ba
--- /dev/null
+++ b/boards/slstk3402a/include/gpio_params.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2016-2017 Bas Stottelaar <basstottelaar@gmail.com>
+ *
+ * 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_slstk3402a
+ * @{
+ *
+ * @file
+ * @brief       Board specific configuration of direct mapped GPIOs
+ *
+ * @author      Bas Stottelaar <basstottelaar@gmail.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 0",
+        .pin = LED0_PIN,
+        .mode = GPIO_OUT
+    },
+    {
+        .name = "LED 1",
+        .pin = LED1_PIN,
+        .mode = GPIO_OUT
+    },
+    {
+        .name = "Button 1",
+        .pin = PB0_PIN,
+        .mode = GPIO_IN_PU,
+        .flags = SAUL_GPIO_INVERTED
+    },
+    {
+        .name = "Button 2",
+        .pin = PB1_PIN,
+        .mode = GPIO_IN_PU,
+        .flags = SAUL_GPIO_INVERTED
+    }
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* GPIO_PARAMS_H */
+/** @} */
diff --git a/boards/slstk3402a/include/periph_conf.h b/boards/slstk3402a/include/periph_conf.h
new file mode 100644
index 0000000000..c71fce578c
--- /dev/null
+++ b/boards/slstk3402a/include/periph_conf.h
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2015-2018 Freie Universität Berlin
+ *
+ * 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_slstk3402a
+ * @{
+ *
+ * @file
+ * @brief       Configuration of CPU peripherals for the SLSTK3402A starter kit
+ *
+ * @author      Hauke Petersen <hauke.petersen@fu-berlin.de>
+ * @author      Bas Stottelaar <basstottelaar@gmail.com>
+ */
+
+#ifndef PERIPH_CONF_H
+#define PERIPH_CONF_H
+
+#include "cpu.h"
+#include "periph_cpu.h"
+#include "em_cmu.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @brief   Internal macro to calculate *_NUMOF based on config.
+ */
+#define PERIPH_NUMOF(config)    (sizeof(config) / sizeof(config[0]))
+
+/**
+ * @name    Clock configuration
+ * @{
+ */
+#ifndef CLOCK_HF
+#define CLOCK_HF            cmuSelect_HFXO
+#endif
+#ifndef CLOCK_CORE_DIV
+#define CLOCK_CORE_DIV      cmuClkDiv_1
+#endif
+#ifndef CLOCK_LFA
+#define CLOCK_LFA           cmuSelect_LFXO
+#endif
+#ifndef CLOCK_LFB
+#define CLOCK_LFB           cmuSelect_LFXO
+#endif
+#ifndef CLOCK_LFE
+#define CLOCK_LFE           cmuSelect_LFXO
+#endif
+/** @} */
+
+/**
+ * @name    ADC configuration
+ * @{
+ */
+static const adc_conf_t adc_config[] = {
+    {
+        .dev = ADC0,
+        .cmu = cmuClock_ADC0,
+    }
+};
+
+static const adc_chan_conf_t adc_channel_config[] = {
+    {
+        .dev = 0,
+        .input = adcPosSelTEMP,
+        .reference = adcRef1V25,
+        .acq_time = adcAcqTime8
+    },
+    {
+        .dev = 0,
+        .input = adcPosSelAVDD,
+        .reference = adcRef5V,
+        .acq_time = adcAcqTime8
+    }
+};
+
+#define ADC_DEV_NUMOF       PERIPH_NUMOF(adc_config)
+#define ADC_NUMOF           PERIPH_NUMOF(adc_channel_config)
+/** @} */
+
+/**
+ * @name    I2C configuration
+ * @{
+ */
+static const i2c_conf_t i2c_config[] = {
+
+};
+
+#define I2C_NUMOF           PERIPH_NUMOF(i2c_config)
+#define I2C_0_ISR           isr_i2c0
+/** @} */
+
+/**
+ * @brief   RTC configuration
+ */
+#define RTC_NUMOF           (1U)
+
+/**
+ * @name    RTT configuration
+ * @{
+ */
+#define RTT_NUMOF           (1U)
+
+#define RTT_MAX_VALUE       (0xFFFFFFFF)
+#define RTT_FREQUENCY       (1U)
+/** @} */
+
+/**
+ * @name    SPI configuration
+ * @{
+ */
+static const spi_dev_t spi_config[] = {
+    {
+        .dev = USART2,
+        .mosi_pin = GPIO_PIN(PA, 6),
+        .miso_pin = GPIO_PIN(PA, 7),
+        .clk_pin = GPIO_PIN(PA, 8),
+        .loc = USART_ROUTELOC0_RXLOC_LOC1 |
+               USART_ROUTELOC0_TXLOC_LOC1 |
+               USART_ROUTELOC0_CLKLOC_LOC1,
+        .cmu = cmuClock_USART2,
+        .irq = USART2_RX_IRQn
+    }
+};
+
+#define SPI_NUMOF           PERIPH_NUMOF(spi_config)
+/** @} */
+
+/**
+ * @name    Timer configuration
+ *
+ * The implementation uses two timers in cascade mode.
+ * @{
+ */
+static const timer_conf_t timer_config[] = {
+    {
+        {
+            .dev = TIMER0,
+            .cmu = cmuClock_TIMER0
+        },
+        {
+            .dev = TIMER1,
+            .cmu = cmuClock_TIMER1
+        },
+        .irq = TIMER1_IRQn
+    }
+};
+
+#define TIMER_NUMOF         PERIPH_NUMOF(timer_config)
+#define TIMER_0_ISR         isr_timer1
+/** @} */
+
+/**
+ * @name    UART configuration
+ * @{
+ */
+static const uart_conf_t uart_config[] = {
+    {
+        .dev = USART0,
+        .rx_pin = GPIO_PIN(PA, 1),
+        .tx_pin = GPIO_PIN(PA, 0),
+        .loc = USART_ROUTELOC0_RXLOC_LOC0 |
+               USART_ROUTELOC0_TXLOC_LOC0,
+        .cmu = cmuClock_USART0,
+        .irq = USART0_RX_IRQn
+    },
+    {
+        .dev = LEUART0,
+        .rx_pin = GPIO_PIN(PD, 11),
+        .tx_pin = GPIO_PIN(PD, 10),
+        .loc = LEUART_ROUTELOC0_RXLOC_LOC18 |
+               LEUART_ROUTELOC0_TXLOC_LOC18,
+        .cmu = cmuClock_LEUART0,
+        .irq = LEUART0_IRQn
+    }
+};
+
+#define UART_NUMOF          PERIPH_NUMOF(uart_config)
+#define UART_0_ISR_RX       isr_usart0_rx
+#define UART_1_ISR_RX       isr_leuart0
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PERIPH_CONF_H */
+/** @} */
-- 
GitLab