From 3fd0fe9f14ea3fd84ce112436df7ba74fdfc483c Mon Sep 17 00:00:00 2001 From: Arunmani Alagarsamy Date: Thu, 20 Jun 2024 10:50:29 +0530 Subject: [PATCH] boards: silabs: radio_boards: Add silabs board support for BRD4180B board Added board support for the Silicon Labs MG21 BRD4180B radio board Signed-off-by: Arunmani Alagarsamy --- .../radio_boards/slwrb4180b/Kconfig.defconfig | 18 ++ .../slwrb4180b/Kconfig.slwrb4180b | 5 + .../radio_boards/slwrb4180b/board.cmake | 10 + .../silabs/radio_boards/slwrb4180b/board.yml | 6 + .../slwrb4180b/doc/efr32mg21-slwrb4180b.webp | Bin 0 -> 6108 bytes .../radio_boards/slwrb4180b/doc/index.rst | 133 +++++++++++++ .../slwrb4180b/pre_dt_board.cmake | 5 + .../slwrb4180b/slwrb4180b-pinctrl.dtsi | 22 +++ .../radio_boards/slwrb4180b/slwrb4180b.dts | 183 ++++++++++++++++++ .../radio_boards/slwrb4180b/slwrb4180b.yaml | 18 ++ .../slwrb4180b/slwrb4180b_defconfig | 7 + .../slwrb4180b/support/openocd.cfg | 25 +++ 12 files changed, 432 insertions(+) create mode 100644 boards/silabs/radio_boards/slwrb4180b/Kconfig.defconfig create mode 100644 boards/silabs/radio_boards/slwrb4180b/Kconfig.slwrb4180b create mode 100644 boards/silabs/radio_boards/slwrb4180b/board.cmake create mode 100644 boards/silabs/radio_boards/slwrb4180b/board.yml create mode 100644 boards/silabs/radio_boards/slwrb4180b/doc/efr32mg21-slwrb4180b.webp create mode 100644 boards/silabs/radio_boards/slwrb4180b/doc/index.rst create mode 100644 boards/silabs/radio_boards/slwrb4180b/pre_dt_board.cmake create mode 100644 boards/silabs/radio_boards/slwrb4180b/slwrb4180b-pinctrl.dtsi create mode 100644 boards/silabs/radio_boards/slwrb4180b/slwrb4180b.dts create mode 100644 boards/silabs/radio_boards/slwrb4180b/slwrb4180b.yaml create mode 100644 boards/silabs/radio_boards/slwrb4180b/slwrb4180b_defconfig create mode 100644 boards/silabs/radio_boards/slwrb4180b/support/openocd.cfg diff --git a/boards/silabs/radio_boards/slwrb4180b/Kconfig.defconfig b/boards/silabs/radio_boards/slwrb4180b/Kconfig.defconfig new file mode 100644 index 00000000000..9fa20f62d7c --- /dev/null +++ b/boards/silabs/radio_boards/slwrb4180b/Kconfig.defconfig @@ -0,0 +1,18 @@ +# Copyright (c) 2020 Piotr Mienkowski +# Copyright (c) 2020 TriaGnoSys GmbH +# SPDX-License-Identifier: Apache-2.0 + +if BOARD_SLWRB4180B + +config LOG_BACKEND_SWO_FREQ_HZ + default 875000 + depends on LOG_BACKEND_SWO + +if SOC_GECKO_USE_RAIL + +config FPU + default y + +endif # SOC_GECKO_USE_RAIL + +endif # BOARD_SLWRB4180B diff --git a/boards/silabs/radio_boards/slwrb4180b/Kconfig.slwrb4180b b/boards/silabs/radio_boards/slwrb4180b/Kconfig.slwrb4180b new file mode 100644 index 00000000000..b802cf3ae94 --- /dev/null +++ b/boards/silabs/radio_boards/slwrb4180b/Kconfig.slwrb4180b @@ -0,0 +1,5 @@ +# Copyright (c) 2024 Capgemini +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_SLWRB4180B + select SOC_PART_NUMBER_EFR32MG21A020F1024IM32 diff --git a/boards/silabs/radio_boards/slwrb4180b/board.cmake b/boards/silabs/radio_boards/slwrb4180b/board.cmake new file mode 100644 index 00000000000..9505e42eed4 --- /dev/null +++ b/boards/silabs/radio_boards/slwrb4180b/board.cmake @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: Apache-2.0 + +board_runner_args(jlink "--device=EFR32MG21AxxxF1024") +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) + +board_runner_args(openocd) +include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake) + +board_runner_args(silabs_commander "--device=EFR32MG21A020F1024IM32") +include(${ZEPHYR_BASE}/boards/common/silabs_commander.board.cmake) diff --git a/boards/silabs/radio_boards/slwrb4180b/board.yml b/boards/silabs/radio_boards/slwrb4180b/board.yml new file mode 100644 index 00000000000..adef398703b --- /dev/null +++ b/boards/silabs/radio_boards/slwrb4180b/board.yml @@ -0,0 +1,6 @@ +board: + name: slwrb4180b + full_name: EFR32xG21 2.4 GHz 20 dBm (SLWRB4180B) + vendor: silabs + socs: + - name: efr32mg21a020f1024im32 diff --git a/boards/silabs/radio_boards/slwrb4180b/doc/efr32mg21-slwrb4180b.webp b/boards/silabs/radio_boards/slwrb4180b/doc/efr32mg21-slwrb4180b.webp new file mode 100644 index 0000000000000000000000000000000000000000..cc37a1a57471797e9ffe95b1124bba74fb00e091 GIT binary patch literal 6108 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 k)C2b}T^U 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 i*q3Ip$i)XEpCC*|0#Mpu%9;D+r?e6j + +&pinctrl { + usart0_default: usart0_default { + group0 { + pins = ; + drive-push-pull; + output-high; + }; + group1 { + pins = ; + input-enable; + silabs,input-filter; + }; + }; +}; diff --git a/boards/silabs/radio_boards/slwrb4180b/slwrb4180b.dts b/boards/silabs/radio_boards/slwrb4180b/slwrb4180b.dts new file mode 100644 index 00000000000..77654a1f033 --- /dev/null +++ b/boards/silabs/radio_boards/slwrb4180b/slwrb4180b.dts @@ -0,0 +1,183 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2024 Capgemini + * + */ + +/dts-v1/; +#include +#include +#include "slwrb4180b-pinctrl.dtsi" + +/ { + model = "Silicon Labs BRD4180B (Wireless Gecko 21 Radio Board)"; + compatible = "silabs,slwrb4180b", "silabs,efr32mg21"; + + chosen { + zephyr,console = &usart0; + zephyr,shell-uart = &usart0; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,code-partition = &slot0_partition; + }; + + /* These aliases are provided for compatibility with samples */ + aliases { + led0 = &led0; + led1 = &led1; + sw0 = &button0; + sw1 = &button1; + watchdog0 = &wdog0; + }; + + leds { + compatible = "gpio-leds"; + + led0: led_0 { + gpios = <&gpiod 2 0>; + label = "LED0"; + }; + + led1: led_1 { + gpios = <&gpiod 3 0>; + label = "LED1"; + }; + }; + + buttons { + compatible = "gpio-keys"; + + button0: button_0 { + gpios = <&gpiob 0 GPIO_ACTIVE_LOW>; + label = "BTN0"; + zephyr,code = ; + }; + + button1: button_1 { + gpios = <&gpiob 1 GPIO_ACTIVE_LOW>; + label = "BTN1"; + zephyr,code = ; + }; + }; +}; + +&cpu0 { + clock-frequency = <76800000>; +}; + +&hfxo { + status = "okay"; + ctune = <129>; + precision = <50>; +}; + +&lfxo { + status = "okay"; + ctune = <79>; + precision = <50>; +}; + +&hfrcodpll { + clock-frequency = ; + clocks = <&hfxo>; + dpll-n = <3839>; + dpll-m = <1919>; + dpll-edge = "fall"; + dpll-lock = "phase"; + dpll-autorecover; +}; + +&em23grpaclk { + clocks = <&lfxo>; +}; + +&em4grpaclk { + clocks = <&lfxo>; +}; + +&rtccclk { + clocks = <&lfxo>; +}; + +&wdog0clk { + clocks = <&lfxo>; +}; + +&wdog1clk { + clocks = <&lfxo>; +}; + +&usart0 { + current-speed = <115200>; + pinctrl-0 = <&usart0_default>; + pinctrl-names = "default"; + status = "okay"; +}; + +&rtcc0 { + prescaler = <1>; + status = "okay"; +}; + +&gpio { + status = "okay"; +}; + +&gpioa { + status = "okay"; +}; + +&gpiob { + status = "okay"; +}; + +&gpioc { + status = "okay"; +}; + +&gpiod { + status = "okay"; + + board-controller-enable { + gpio-hog; + gpios = <4 GPIO_ACTIVE_HIGH>; + output-high; + }; +}; + +&wdog0 { + status = "okay"; +}; + +&dma0 { + status = "okay"; +}; + +&flash0 { + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + boot_partition: partition@0 { + label = "mcuboot"; + reg = <0x00000000 DT_SIZE_K(48)>; + }; + + slot0_partition: partition@c000 { + label = "image-0"; + reg = <0x0000C000 DT_SIZE_K(472)>; + }; + + slot1_partition: partition@82000 { + label = "image-1"; + reg = <0x00082000 DT_SIZE_K(472)>; + }; + + storage_partition: partition@F8000 { + label = "storage"; + reg = <0x000F8000 DT_SIZE_K(32)>; + }; + }; +}; diff --git a/boards/silabs/radio_boards/slwrb4180b/slwrb4180b.yaml b/boards/silabs/radio_boards/slwrb4180b/slwrb4180b.yaml new file mode 100644 index 00000000000..c6e9d2b90cf --- /dev/null +++ b/boards/silabs/radio_boards/slwrb4180b/slwrb4180b.yaml @@ -0,0 +1,18 @@ +identifier: slwrb4180b +name: EFR32xG21 2.4 GHz 20 dBm Radio Board (SLWRB4180B) +type: mcu +arch: arm +ram: 96 +flash: 1024 +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - counter + - gpio + - nvs + - uart + - dma + - watchdog +vendor: silabs diff --git a/boards/silabs/radio_boards/slwrb4180b/slwrb4180b_defconfig b/boards/silabs/radio_boards/slwrb4180b/slwrb4180b_defconfig new file mode 100644 index 00000000000..e70f8f5c519 --- /dev/null +++ b/boards/silabs/radio_boards/slwrb4180b/slwrb4180b_defconfig @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_ARM_MPU=y +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y +CONFIG_SERIAL=y +CONFIG_GPIO=y diff --git a/boards/silabs/radio_boards/slwrb4180b/support/openocd.cfg b/boards/silabs/radio_boards/slwrb4180b/support/openocd.cfg new file mode 100644 index 00000000000..38409eb70ad --- /dev/null +++ b/boards/silabs/radio_boards/slwrb4180b/support/openocd.cfg @@ -0,0 +1,25 @@ +if {[info exists env(OPENOCD_INTERFACE)]} { + set INTERFACE $env(OPENOCD_INTERFACE) +} else { + # By default connect over Debug USB port using the J-Link interface + set INTERFACE "jlink" +} + +source [find interface/$INTERFACE.cfg] + +transport select swd + +set CHIPNAME efr32 + +source [find target/efm32.cfg] + +$_TARGETNAME configure -event gdb-attach { + echo "Debugger attaching: halting execution" + reset halt + gdb_breakpoint_override hard +} + +$_TARGETNAME configure -event gdb-detach { + echo "Debugger detaching: resuming execution" + resume +}