From 65e6d5d731cc3bbb9e2a5909ed3de39e4606c85a Mon Sep 17 00:00:00 2001 From: Lukas Woodtli Date: Fri, 23 May 2025 15:21:56 +0200 Subject: [PATCH 1/2] soc: Add support for Silabs EFM32TG * ARM Cortex-M3 processor * Up to 32 kB Flash and 4 kB RAM memory * Energy efficient and autonomous peripherals * Ultra low power Energy Modes * Fast wake-up Signed-off-by: Lukas Woodtli --- dts/arm/silabs/efm32tg.dtsi | 169 ++++++++++++++++++ modules/hal_silabs/gecko/CMakeLists.txt | 1 + soc/silabs/silabs_s0/efm32tg/Kconfig | 14 ++ .../silabs_s0/efm32tg/Kconfig.defconfig | 10 ++ soc/silabs/silabs_s0/efm32tg/Kconfig.soc | 21 +++ soc/silabs/silabs_s0/efm32tg/soc.h | 29 +++ soc/silabs/silabs_s0/efm32tg/soc_pinmap.h | 19 ++ soc/silabs/soc.yml | 3 + west.yml | 2 +- 9 files changed, 267 insertions(+), 1 deletion(-) create mode 100644 dts/arm/silabs/efm32tg.dtsi create mode 100644 soc/silabs/silabs_s0/efm32tg/Kconfig create mode 100644 soc/silabs/silabs_s0/efm32tg/Kconfig.defconfig create mode 100644 soc/silabs/silabs_s0/efm32tg/Kconfig.soc create mode 100644 soc/silabs/silabs_s0/efm32tg/soc.h create mode 100644 soc/silabs/silabs_s0/efm32tg/soc_pinmap.h diff --git a/dts/arm/silabs/efm32tg.dtsi b/dts/arm/silabs/efm32tg.dtsi new file mode 100644 index 000000000000..0a699654a365 --- /dev/null +++ b/dts/arm/silabs/efm32tg.dtsi @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2025 Lukas Woodtli + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include "gpio_gecko.h" + +/ { + chosen { + zephyr,flash-controller = &msc; + }; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + + cpu0: cpu@0 { + compatible = "arm,cortex-m3"; + reg = <0>; + }; + }; + + sram0: memory@20000000 { + compatible = "mmio-sram"; + }; + + soc { + msc: flash-controller@400c0000 { + compatible = "silabs,gecko-flash-controller"; + reg = <0x400c0000 0x78>; + interrupts = <21 0>; + + #address-cells = <1>; + #size-cells = <1>; + + flash0: flash@0 { + compatible = "soc-nv-flash"; + write-block-size = <4>; + erase-block-size = <512>; + }; + }; + + usart0: usart@4000c000 { /* USART0 */ + compatible = "silabs,gecko-usart"; + reg = <0x4000c000 0x400>; + interrupts = <3 0>, <4 0>; + interrupt-names = "rx", "tx"; + peripheral-id = <0>; + status = "disabled"; + }; + + usart1: usart@4000c400 { /* USART1 */ + compatible = "silabs,gecko-usart"; + reg = <0x4000c400 0x400>; + interrupts = <15 0>, <16 0>; + interrupt-names = "rx", "tx"; + peripheral-id = <1>; + status = "disabled"; + }; + + + leuart0: leuart@40084000 { /* LEUART0 */ + compatible = "silabs,gecko-leuart"; + reg = <0x40084000 0x400>; + interrupts = <24 0>; + peripheral-id = <0>; + status = "disabled"; + }; + + leuart1: leuart@40084400 { /* LEUART1 */ + compatible = "silabs,gecko-leuart"; + reg = <0x40084400 0x400>; + interrupts = <25 0>; + peripheral-id = <1>; + status = "disabled"; + }; + + i2c0: i2c@4000a000 { + compatible = "silabs,gecko-i2c"; + clock-frequency = ; + #address-cells = <1>; + #size-cells = <0>; + reg = <0x4000a000 0x400>; + interrupts = <9 0>; + status = "disabled"; + }; + + gpio@40006100 { + compatible = "silabs,gecko-gpio"; + reg = <0x40006100 0xf00>; + interrupts = <1 2 11 2>; + interrupt-names = "GPIO_EVEN", "GPIO_ODD"; + + ranges; + #address-cells = <1>; + #size-cells = <1>; + + gpioa: gpio@40006000 { + compatible = "silabs,gecko-gpio-port"; + reg = <0x40006000 0x24>; + peripheral-id = <0>; + gpio-controller; + #gpio-cells = <2>; + status = "disabled"; + }; + + gpiob: gpio@40006024 { + compatible = "silabs,gecko-gpio-port"; + reg = <0x40006024 0x24>; + peripheral-id = <1>; + gpio-controller; + #gpio-cells = <2>; + status = "disabled"; + }; + + gpioc: gpio@40006048 { + compatible = "silabs,gecko-gpio-port"; + reg = <0x40006048 0x24>; + peripheral-id = <2>; + gpio-controller; + #gpio-cells = <2>; + status = "disabled"; + }; + + gpiod: gpio@4000606c { + compatible = "silabs,gecko-gpio-port"; + reg = <0x4000606c 0x24>; + peripheral-id = <3>; + gpio-controller; + #gpio-cells = <2>; + status = "disabled"; + }; + + gpioe: gpio@40006090 { + compatible = "silabs,gecko-gpio-port"; + reg = <0x40006090 0x24>; + peripheral-id = <4>; + gpio-controller; + #gpio-cells = <2>; + status = "disabled"; + }; + + gpiof: gpio@400060b4 { + compatible = "silabs,gecko-gpio-port"; + reg = <0x400060b4 0x24>; + peripheral-id = <5>; + gpio-controller; + #gpio-cells = <2>; + status = "disabled"; + }; + }; + + pinctrl: pin-controller { + /* Pin controller is a "virtual" device since SiLabs SoCs do pin + * control in a distributed way (GPIO registers and PSEL + * registers on each peripheral). + */ + compatible = "silabs,gecko-pinctrl"; + }; + }; +}; + +&nvic { + arm,num-irq-priority-bits = <3>; +}; diff --git a/modules/hal_silabs/gecko/CMakeLists.txt b/modules/hal_silabs/gecko/CMakeLists.txt index acf8ead687d8..7050322c79b7 100644 --- a/modules/hal_silabs/gecko/CMakeLists.txt +++ b/modules/hal_silabs/gecko/CMakeLists.txt @@ -102,6 +102,7 @@ zephyr_library_sources_ifdef(CONFIG_SOC_GECKO_TIMER ${EMLIB_DIR}/src/em_t zephyr_library_sources_ifdef(CONFIG_SOC_GECKO_USART ${EMLIB_DIR}/src/em_usart.c) zephyr_library_sources_ifdef(CONFIG_SOC_GECKO_WDOG ${EMLIB_DIR}/src/em_wdog.c) zephyr_library_sources_ifdef(CONFIG_SOC_SERIES_EFM32WG ${DEVICE_DIR}/SiliconLabs/EFM32WG/Source/system_efm32wg.c) +zephyr_library_sources_ifdef(CONFIG_SOC_SERIES_EFM32TG ${DEVICE_DIR}/SiliconLabs/EFM32TG/Source/system_efm32tg.c) zephyr_library_sources_ifdef(CONFIG_SOC_SERIES_EFR32BG13P ${DEVICE_DIR}/SiliconLabs/EFR32BG13P/Source/system_efr32bg13p.c) zephyr_library_sources_ifdef(CONFIG_SOC_SERIES_EFR32FG1P ${DEVICE_DIR}/SiliconLabs/EFR32FG1P/Source/system_efr32fg1p.c) zephyr_library_sources_ifdef(CONFIG_SOC_SERIES_EFR32FG13P ${DEVICE_DIR}/SiliconLabs/EFR32FG13P/Source/system_efr32fg13p.c) diff --git a/soc/silabs/silabs_s0/efm32tg/Kconfig b/soc/silabs/silabs_s0/efm32tg/Kconfig new file mode 100644 index 000000000000..7dcaf7bd02e4 --- /dev/null +++ b/soc/silabs/silabs_s0/efm32tg/Kconfig @@ -0,0 +1,14 @@ +# Copyright (c) 2025 Lukas Woodtli +# SPDX-License-Identifier: Apache-2.0 + +config SOC_SERIES_EFM32TG + select ARM + select CPU_CORTEX_M3 + select CPU_CORTEX_M_HAS_DWT + select HAS_SILABS_GECKO + select SOC_GECKO_CMU + select SOC_GECKO_GPIO + select HAS_PM + +config SOC_GECKO_SDID + default 73 if SOC_SERIES_EFM32TG diff --git a/soc/silabs/silabs_s0/efm32tg/Kconfig.defconfig b/soc/silabs/silabs_s0/efm32tg/Kconfig.defconfig new file mode 100644 index 000000000000..852aba20110b --- /dev/null +++ b/soc/silabs/silabs_s0/efm32tg/Kconfig.defconfig @@ -0,0 +1,10 @@ +# Copyright (c) 2025 Lukas Woodtli +# SPDX-License-Identifier: Apache-2.0 + +if SOC_SERIES_EFM32TG + +config NUM_IRQS + # must be >= the highest interrupt number used + default 39 + +endif diff --git a/soc/silabs/silabs_s0/efm32tg/Kconfig.soc b/soc/silabs/silabs_s0/efm32tg/Kconfig.soc new file mode 100644 index 000000000000..c9f81eeb4d67 --- /dev/null +++ b/soc/silabs/silabs_s0/efm32tg/Kconfig.soc @@ -0,0 +1,21 @@ +# Copyright (c) 2025 Lukas Woodtli +# SPDX-License-Identifier: Apache-2.0 + +config SOC_SERIES_EFM32TG + bool + select SOC_FAMILY_SILABS_S0 + help + Silicon Labs EFM32TG (Tiny Gecko) Series MCU + +config SOC_PART_NUMBER_EFM32TG840F32 + bool + select SOC_SERIES_EFM32TG + +config SOC_SERIES + default "efm32tg" if SOC_SERIES_EFM32TG + +config SOC + default "efm32tg840f32" if SOC_PART_NUMBER_EFM32TG840F32 + +config SOC_PART_NUMBER + default "EFM32TG840F32" if SOC_PART_NUMBER_EFM32TG840F32 diff --git a/soc/silabs/silabs_s0/efm32tg/soc.h b/soc/silabs/silabs_s0/efm32tg/soc.h new file mode 100644 index 000000000000..641e7408ac47 --- /dev/null +++ b/soc/silabs/silabs_s0/efm32tg/soc.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2025 Lukas Woodtli + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief Board configuration macros for the efm32tg soc + * + */ + +#ifndef _SOC__H_ +#define _SOC__H_ + +#include + +#ifndef _ASMLANGUAGE + +#include +#include + + +#include "soc_pinmap.h" +#include "../common/soc_gpio.h" + +#endif /* !_ASMLANGUAGE */ + +#endif /* _SOC__H_ */ diff --git a/soc/silabs/silabs_s0/efm32tg/soc_pinmap.h b/soc/silabs/silabs_s0/efm32tg/soc_pinmap.h new file mode 100644 index 000000000000..01800f767415 --- /dev/null +++ b/soc/silabs/silabs_s0/efm32tg/soc_pinmap.h @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2025 Lukas Woodtli + * SPDX-License-Identifier: Apache-2.0 + */ + +/** @file + * @brief Silabs EFM32TG MCU pin definitions. + * + * This file contains pin configuration data required by different MCU + * modules to correctly configure GPIO controller. + */ + +#ifndef _SILABS_EFM32TG_SOC_PINMAP_H_ +#define _SILABS_EFM32TG_SOC_PINMAP_H_ + +#include +#include + +#endif /* _SILABS_EFM32TG_SOC_PINMAP_H_ */ diff --git a/soc/silabs/soc.yml b/soc/silabs/soc.yml index 4617f804692d..48c30aeba7cc 100644 --- a/soc/silabs/soc.yml +++ b/soc/silabs/soc.yml @@ -7,6 +7,9 @@ family: - name: efm32hg socs: - name: efm32hg322f64 + - name: efm32tg + socs: + - name: efm32tg840f32 - name: silabs_s1 series: - name: efm32pg1b diff --git a/west.yml b/west.yml index 7032362af5ce..09412c604ce1 100644 --- a/west.yml +++ b/west.yml @@ -235,7 +235,7 @@ manifest: groups: - hal - name: hal_silabs - revision: 190a144a16bed9a938a94543ed5bbc70c0552e0f + revision: pull/108/head path: modules/hal/silabs groups: - hal From 5baa9fdda53d1010ec7ef90024b37dd0b20147cd Mon Sep 17 00:00:00 2001 From: Lukas Woodtli Date: Fri, 23 May 2025 15:21:56 +0200 Subject: [PATCH 2/2] boards: silabs: Add support for efm32tg_stk3300 Support for the Silabs EFM32TG-STK3300 Starter Kit. Board features: * EFM32TG840F32 MCU with 32 kB flash and 4 kB RAM * Advanced Energy Monitoring * Real-time, accurate energy and power profiling * Light, LC and touch sensors * 8 x 20 LCD * SEGGER J-Link debugger Signed-off-by: Lukas Woodtli --- .../efm32tg_stk3300/Kconfig.defconfig | 12 ++ .../efm32tg_stk3300/Kconfig.efm32tg_stk3300 | 5 + .../starter_kits/efm32tg_stk3300/board.cmake | 5 + .../starter_kits/efm32tg_stk3300/board.yml | 6 + .../efm32tg_stk3300/doc/efm32tg_stk3300.webp | Bin 0 -> 34732 bytes .../efm32tg_stk3300/doc/index.rst | 142 ++++++++++++++++++ .../efm32tg_stk3300/efm32tg_stk3300.dts | 78 ++++++++++ .../efm32tg_stk3300/efm32tg_stk3300.yaml | 17 +++ .../efm32tg_stk3300/efm32tg_stk3300_defconfig | 10 ++ dts/arm/silabs/efm32tg840f32.dtsi | 24 +++ 10 files changed, 299 insertions(+) create mode 100644 boards/silabs/starter_kits/efm32tg_stk3300/Kconfig.defconfig create mode 100644 boards/silabs/starter_kits/efm32tg_stk3300/Kconfig.efm32tg_stk3300 create mode 100644 boards/silabs/starter_kits/efm32tg_stk3300/board.cmake create mode 100644 boards/silabs/starter_kits/efm32tg_stk3300/board.yml create mode 100644 boards/silabs/starter_kits/efm32tg_stk3300/doc/efm32tg_stk3300.webp create mode 100644 boards/silabs/starter_kits/efm32tg_stk3300/doc/index.rst create mode 100644 boards/silabs/starter_kits/efm32tg_stk3300/efm32tg_stk3300.dts create mode 100644 boards/silabs/starter_kits/efm32tg_stk3300/efm32tg_stk3300.yaml create mode 100644 boards/silabs/starter_kits/efm32tg_stk3300/efm32tg_stk3300_defconfig create mode 100644 dts/arm/silabs/efm32tg840f32.dtsi diff --git a/boards/silabs/starter_kits/efm32tg_stk3300/Kconfig.defconfig b/boards/silabs/starter_kits/efm32tg_stk3300/Kconfig.defconfig new file mode 100644 index 000000000000..f6000ac81b43 --- /dev/null +++ b/boards/silabs/starter_kits/efm32tg_stk3300/Kconfig.defconfig @@ -0,0 +1,12 @@ +# Copyright (c) 2025, Lukas Woodtli +# SPDX-License-Identifier: Apache-2.0 + +if BOARD_EFM32TG_STK3300 + +config CMU_HFXO_FREQ + default 32000000 + +config CMU_LFXO_FREQ + default 32768 + +endif # BOARD_EFM32TG_STK3300 diff --git a/boards/silabs/starter_kits/efm32tg_stk3300/Kconfig.efm32tg_stk3300 b/boards/silabs/starter_kits/efm32tg_stk3300/Kconfig.efm32tg_stk3300 new file mode 100644 index 000000000000..6f75cb272dad --- /dev/null +++ b/boards/silabs/starter_kits/efm32tg_stk3300/Kconfig.efm32tg_stk3300 @@ -0,0 +1,5 @@ +# Copyright (c) 2025, Lukas Woodtli +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_EFM32TG_STK3300 + select SOC_PART_NUMBER_EFM32TG840F32 diff --git a/boards/silabs/starter_kits/efm32tg_stk3300/board.cmake b/boards/silabs/starter_kits/efm32tg_stk3300/board.cmake new file mode 100644 index 000000000000..8e6a4f402789 --- /dev/null +++ b/boards/silabs/starter_kits/efm32tg_stk3300/board.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2025, Lukas Woodtli +# SPDX-License-Identifier: Apache-2.0 + +board_runner_args(jlink "--device=EFM32TG840F32") +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) diff --git a/boards/silabs/starter_kits/efm32tg_stk3300/board.yml b/boards/silabs/starter_kits/efm32tg_stk3300/board.yml new file mode 100644 index 000000000000..74befd35f1e8 --- /dev/null +++ b/boards/silabs/starter_kits/efm32tg_stk3300/board.yml @@ -0,0 +1,6 @@ +board: + name: efm32tg_stk3300 + full_name: EFM32 Tiny Gecko (EFM32TG-STK3300) + vendor: silabs + socs: + - name: efm32tg840f32 diff --git a/boards/silabs/starter_kits/efm32tg_stk3300/doc/efm32tg_stk3300.webp b/boards/silabs/starter_kits/efm32tg_stk3300/doc/efm32tg_stk3300.webp new file mode 100644 index 0000000000000000000000000000000000000000..cd5190bd67ec60dfecb83eb41ed1c926e2a5486f GIT binary patch literal 34732 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 +#include + +/ { + model = "Silicon Labs EFM32TG STK3300 board"; + compatible = "silabs,efm32tg_stk3300", "silabs,efm32tg"; + + chosen { + zephyr,console = &usart1; + zephyr,flash = &flash0; + zephyr,shell-uart = &usart1; + zephyr,sram = &sram0; + }; + + /* These aliases are provided for compatibility with samples */ + aliases { + led0 = &led0; + sw0 = &button0; + sw1 = &button1; + }; + + leds { + compatible = "gpio-leds"; + + led0: led_0 { + gpios = <&gpiod 7 0>; + label = "LED 0"; + }; + }; + + buttons { + compatible = "gpio-keys"; + + button0: button_0 { + /* gpio flags need validation */ + gpios = <&gpiod 8 GPIO_ACTIVE_LOW>; + label = "User Push Button 0"; + zephyr,code = ; + }; + + button1: button_1 { + /* gpio flags need validation */ + gpios = <&gpiob 11 GPIO_ACTIVE_LOW>; + label = "User Push Button 1"; + zephyr,code = ; + }; + }; +}; + +&cpu0 { + clock-frequency = <32000000>; +}; + +&gpiob { + status = "okay"; +}; + +&gpioc { + status = "okay"; +}; + +&gpiod { + status = "okay"; +}; + +&usart1 { + current-speed = <115200>; + location-tx = ; + location-rx = ; + status = "okay"; +}; diff --git a/boards/silabs/starter_kits/efm32tg_stk3300/efm32tg_stk3300.yaml b/boards/silabs/starter_kits/efm32tg_stk3300/efm32tg_stk3300.yaml new file mode 100644 index 000000000000..2a44e6ab5656 --- /dev/null +++ b/boards/silabs/starter_kits/efm32tg_stk3300/efm32tg_stk3300.yaml @@ -0,0 +1,17 @@ +identifier: efm32tg_stk3300 +name: EFM32 Wonder Gecko Starter Kit (EFM32TG-STK3300, BRD2100) +type: mcu +arch: arm +ram: 4 +flash: 32 +toolchain: + - zephyr + - gnuarmemb +supported: + - gpio + - nvs +testing: + ignore_tags: + - net + - bluetooth +vendor: silabs diff --git a/boards/silabs/starter_kits/efm32tg_stk3300/efm32tg_stk3300_defconfig b/boards/silabs/starter_kits/efm32tg_stk3300/efm32tg_stk3300_defconfig new file mode 100644 index 000000000000..9565bc01cf24 --- /dev/null +++ b/boards/silabs/starter_kits/efm32tg_stk3300/efm32tg_stk3300_defconfig @@ -0,0 +1,10 @@ +# Copyright (c) 2025, Lukas Woodtli +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_ARM_MPU=n +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y +CONFIG_SERIAL=y +CONFIG_GPIO=y +CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=32000000 +CONFIG_CMU_HFCLK_HFXO=y diff --git a/dts/arm/silabs/efm32tg840f32.dtsi b/dts/arm/silabs/efm32tg840f32.dtsi new file mode 100644 index 000000000000..b320342cb1f0 --- /dev/null +++ b/dts/arm/silabs/efm32tg840f32.dtsi @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2025 Lukas Woodtli + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include + +/ { + sram0: memory@20000000 { + reg = <0x20000000 DT_SIZE_K(32)>; + }; + + soc { + compatible = "silabs,efm32tg840f32", "silabs,efm32tg", "silabs,efm32", "simple-bus"; + + flash-controller@400c0000 { + flash0: flash@0 { + reg = <0 DT_SIZE_K(256)>; + }; + }; + }; +};