From ea3f239ac6d596775c8982897b3ffcb4f54e5a71 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 8 Apr 2025 15:05:31 -0600 Subject: [PATCH] boards: seeed: Add XIAO MG24 Add the basic XIAO MG24 board definition. Signed-off-by: Peter Johanson --- boards/seeed/xiao_mg24/Kconfig.defconfig | 37 ++++ boards/seeed/xiao_mg24/Kconfig.xiao_mg24 | 7 + boards/seeed/xiao_mg24/board.cmake | 7 + boards/seeed/xiao_mg24/board.yml | 6 + boards/seeed/xiao_mg24/doc/index.rst | 119 +++++++++++ boards/seeed/xiao_mg24/doc/xiao_mg24.webp | Bin 0 -> 37838 bytes boards/seeed/xiao_mg24/pre_dt_board.cmake | 5 + .../seeed/xiao_mg24/seeed_xiao_connector.dtsi | 31 +++ boards/seeed/xiao_mg24/support/openocd.cfg | 25 +++ boards/seeed/xiao_mg24/xiao_mg24-pinctrl.dtsi | 59 +++++ boards/seeed/xiao_mg24/xiao_mg24.dts | 202 ++++++++++++++++++ boards/seeed/xiao_mg24/xiao_mg24.yaml | 20 ++ boards/seeed/xiao_mg24/xiao_mg24_defconfig | 7 + 13 files changed, 525 insertions(+) create mode 100644 boards/seeed/xiao_mg24/Kconfig.defconfig create mode 100644 boards/seeed/xiao_mg24/Kconfig.xiao_mg24 create mode 100644 boards/seeed/xiao_mg24/board.cmake create mode 100644 boards/seeed/xiao_mg24/board.yml create mode 100644 boards/seeed/xiao_mg24/doc/index.rst create mode 100644 boards/seeed/xiao_mg24/doc/xiao_mg24.webp create mode 100644 boards/seeed/xiao_mg24/pre_dt_board.cmake create mode 100644 boards/seeed/xiao_mg24/seeed_xiao_connector.dtsi create mode 100644 boards/seeed/xiao_mg24/support/openocd.cfg create mode 100644 boards/seeed/xiao_mg24/xiao_mg24-pinctrl.dtsi create mode 100644 boards/seeed/xiao_mg24/xiao_mg24.dts create mode 100644 boards/seeed/xiao_mg24/xiao_mg24.yaml create mode 100644 boards/seeed/xiao_mg24/xiao_mg24_defconfig diff --git a/boards/seeed/xiao_mg24/Kconfig.defconfig b/boards/seeed/xiao_mg24/Kconfig.defconfig new file mode 100644 index 00000000000..33f72abc057 --- /dev/null +++ b/boards/seeed/xiao_mg24/Kconfig.defconfig @@ -0,0 +1,37 @@ +# Copyright (c) 2020 Piotr Mienkowski +# Copyright (c) 2020 TriaGnoSys GmbH +# Copyright (c) 2025 Pete Johanson +# SPDX-License-Identifier: Apache-2.0 + +if BOARD_XIAO_MG24 + +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 + +if BT + +# Used to enable RF switch and selection +config GPIO_HOGS + default y + +config FPU + default y + +config COMMON_LIBC_MALLOC_ARENA_SIZE + default 8192 + +config MAIN_STACK_SIZE + default 3072 if PM + default 2304 + +endif # BT + +endif # BOARD_XIAO_MG24 diff --git a/boards/seeed/xiao_mg24/Kconfig.xiao_mg24 b/boards/seeed/xiao_mg24/Kconfig.xiao_mg24 new file mode 100644 index 00000000000..441384dd416 --- /dev/null +++ b/boards/seeed/xiao_mg24/Kconfig.xiao_mg24 @@ -0,0 +1,7 @@ +# Copyright (c) 2020 Piotr Mienkowski +# Copyright (c) 2020 TriaGnoSys GmbH +# Copyright (c) 2025 Pete Johanson +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_XIAO_MG24 + select SOC_PART_NUMBER_EFR32MG24B220F1536IM48 diff --git a/boards/seeed/xiao_mg24/board.cmake b/boards/seeed/xiao_mg24/board.cmake new file mode 100644 index 00000000000..503f4a0a2e2 --- /dev/null +++ b/boards/seeed/xiao_mg24/board.cmake @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: Apache-2.0 + +board_runner_args(openocd) +include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake) + +board_runner_args(jlink "--device=EFR32MG24BxxxF1536") +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) diff --git a/boards/seeed/xiao_mg24/board.yml b/boards/seeed/xiao_mg24/board.yml new file mode 100644 index 00000000000..fe6e7c9452e --- /dev/null +++ b/boards/seeed/xiao_mg24/board.yml @@ -0,0 +1,6 @@ +board: + name: xiao_mg24 + full_name: XIAO MG24 + vendor: seeed + socs: + - name: efr32mg24b220f1536im48 diff --git a/boards/seeed/xiao_mg24/doc/index.rst b/boards/seeed/xiao_mg24/doc/index.rst new file mode 100644 index 00000000000..2625f5d0e58 --- /dev/null +++ b/boards/seeed/xiao_mg24/doc/index.rst @@ -0,0 +1,119 @@ +.. zephyr:board:: xiao_mg24 + +Overview +******** + +Seeed Studio XIAO MG24 is a mini development board based on Silicon Labs' MG24. XIAO MG24 is based +on ARM Cortex-M33 core, 32-bit RISC architecture with a maximum clock speed of 78MHz, supporting DSP +instructions and FPU floating-point operations, possessing powerful computing power, and built-in +AL/ML hardware accelerator MVP, which can efficiently process AI/machine learning algorithms. +Secondly, it has excellent RF performance, with a transmission power of up to+19.5 dBm and a +reception sensitivity as low as -105.4 dBm. It supports multiple IoT and wireless transmission +protocols such as Matter, Thread, Zigbee, Bluetooth LE 5.3,Bluetooth mesh etc. + +Hardware +******** + +- EFR32MG24B220F1536IM48 Mighty Gecko SoC +- CPU core: ARM Cortex®-M33 with FPU +- Flash memory: 1536 kB +- RAM: 256 kB +- Transmit power: up to +20 dBm +- Operation frequency: 2.4 GHz +- Crystals for LFXO (32.768 kHz) and HFXO (39 MHz). +- 3.7v LiPo power and charge support +- User and battery charge LEDs + +For more information about the EFR32MG24 SoC and XIAO MG24 board, refer to these +documents: + +- `EFR32MG24 Website`_ +- `EFR32MG24 Datasheet`_ +- `EFR32xG24 Reference Manual`_ +- `XIAO MG24 Wiki`_ + +Supported Features +================== + +.. zephyr:board-supported-hw:: + +Connections and IOs +=================== + +In the following table, the column **Name** contains Pin names. For example, PA2 +means Pin number 2 on PORTA, as used in the board's datasheets and manuals. + ++-------+-------------+------------------+ +| Name | Function | Usage | ++=======+=============+==================+ +| PA7 | GPIO | LED0 | ++-------+-------------+------------------+ +| PA8 | USART0_TX | UART Console TX | ++-------+-------------+------------------+ +| PA9 | USART0_RX | UART Console RX | ++-------+-------------+------------------+ + +The default configuration can be found in +:zephyr_file:`boards/seeed/xiao_mg24/xiao_mg24_defconfig` + +System Clock +============ + +The EFR32MG24 SoC is configured to use the 39 MHz external oscillator on the +board. + +Serial Port +=========== + +The EFR32MG24 SoC has one USART and two EUSARTs. +USART0 is connected to the board controller and is used for the console. + +Programming and Debugging +************************* + +The XIAO MG24 contains an SAMD11 with CMSIS-DAP, allowing flashing, debugging, logging, etc. over +the USB port. Doing so requires a version of OpenOCD that includes support for the flash on the MG24 +MCU. Until those changes are included in stock OpenOCD, the version bundled with Arduino can be +used, or can be installed from the `OpenOCD Arduino Fork`_. When flashing, debugging, etc. you may +need to include ``--openocd=/usr/local/bin/openocd +--openocd-search=/usr/local/share/openocd/scripts/`` options to the command. + +Flashing +======== + +Connect the XIAO MG24 board to your host computer using the USB port. A USB CDC ACM serial port +should appear on the host, that can be used to view logs from the flashed application. + +Here is an example for the :zephyr:code-sample:`hello_world` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: xiao_mg24 + :goals: flash + +Open a serial terminal (minicom, putty, etc.) connecting to the UCB CDC ACM serial port. + +Reset the board and you should see the following message in the terminal: + +.. code-block:: console + + Hello World! xiao_mg24 + + +.. _XIAO MG24 Wiki: + https://wiki.seeedstudio.com/xiao_mg24_getting_started/ + +.. _BRD4187C User Guide: + https://www.silabs.com/documents/public/user-guides/ug526-brd4187c-user-guide.pdf + +.. _EFR32MG24 Website: + https://www.silabs.com/wireless/zigbee/efr32mg24-series-2-socs + +.. _EFR32MG24 Datasheet: + https://www.silabs.com/documents/public/data-sheets/efr32mg24-datasheet.pdf + +.. _EFR32xG24 Reference Manual: + https://www.silabs.com/documents/public/reference-manuals/brd4187c-rm.pdf + +.. _OpenOCD Arduino Fork: + https://github.com/facchinm/OpenOCD/tree/arduino-0.12.0-rtx5 diff --git a/boards/seeed/xiao_mg24/doc/xiao_mg24.webp b/boards/seeed/xiao_mg24/doc/xiao_mg24.webp new file mode 100644 index 0000000000000000000000000000000000000000..00821e38c191913c0e12e3331231ca089ff74734 GIT binary patch literal 37838 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 literal 0 HcmV?d00001 diff --git a/boards/seeed/xiao_mg24/pre_dt_board.cmake b/boards/seeed/xiao_mg24/pre_dt_board.cmake new file mode 100644 index 00000000000..beb76b85552 --- /dev/null +++ b/boards/seeed/xiao_mg24/pre_dt_board.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2021 Linaro Limited +# SPDX-License-Identifier: Apache-2.0 + +# SPI is implemented via usart so node name isn't spi@... +list(APPEND EXTRA_DTC_FLAGS "-Wno-spi_bus_bridge") diff --git a/boards/seeed/xiao_mg24/seeed_xiao_connector.dtsi b/boards/seeed/xiao_mg24/seeed_xiao_connector.dtsi new file mode 100644 index 00000000000..027f44c07ef --- /dev/null +++ b/boards/seeed/xiao_mg24/seeed_xiao_connector.dtsi @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2025 Peter Johanson + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + xiao_d: connector { + compatible = "seeed,xiao-gpio"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map = <0 0 &gpioc 0 0>, /* D0 */ + <1 0 &gpioc 1 0>, /* D1 */ + <2 0 &gpioc 2 0>, /* D2 */ + <3 0 &gpioc 3 0>, /* D3 */ + <4 0 &gpioc 4 0>, /* D4 */ + <5 0 &gpioc 5 0>, /* D5 */ + <6 0 &gpioc 6 0>, /* D6 */ + <7 0 &gpioc 7 0>, /* D7 */ + <8 0 &gpioa 3 0>, /* D8 */ + <9 0 &gpioa 4 0>, /* D9 */ + <10 0 &gpioa 5 0>; /* D10 */ + }; +}; + +xiao_spi: &eusart1 {}; + +xiao_serial: &eusart0 {}; + +xiao_i2c: &i2c0 {}; diff --git a/boards/seeed/xiao_mg24/support/openocd.cfg b/boards/seeed/xiao_mg24/support/openocd.cfg new file mode 100644 index 00000000000..eed46c1687d --- /dev/null +++ b/boards/seeed/xiao_mg24/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 CMSIS-DAP interface + set INTERFACE "cmsis-dap" +} + +source [find interface/$INTERFACE.cfg] + +transport select swd + +set CHIPNAME efr32 + +source [find target/efm32s2_g23.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 +} diff --git a/boards/seeed/xiao_mg24/xiao_mg24-pinctrl.dtsi b/boards/seeed/xiao_mg24/xiao_mg24-pinctrl.dtsi new file mode 100644 index 00000000000..a1930b8e78b --- /dev/null +++ b/boards/seeed/xiao_mg24/xiao_mg24-pinctrl.dtsi @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2025 Pete Johanson + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +&pinctrl { + eusart0_default: eusart0_default { + group0 { + pins = ; + drive-push-pull; + output-high; + }; + + group1 { + pins = ; + input-enable; + silabs,input-filter; + }; + }; + + eusart1_default: eusart1_default { + group0 { + pins = , ; + drive-push-pull; + output-high; + }; + + group1 { + pins = ; + input-enable; + silabs,input-filter; + }; + }; + + usart0_default: usart0_default { + group0 { + pins = ; + drive-push-pull; + output-high; + }; + + group1 { + pins = ; + input-enable; + silabs,input-filter; + }; + }; + + i2c0_default: i2c0_default { + group0 { + pins = , ; + drive-open-drain; + bias-pull-up; + }; + }; +}; diff --git a/boards/seeed/xiao_mg24/xiao_mg24.dts b/boards/seeed/xiao_mg24/xiao_mg24.dts new file mode 100644 index 00000000000..24a2cc570ea --- /dev/null +++ b/boards/seeed/xiao_mg24/xiao_mg24.dts @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2025 Pete Johanson + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; +#include +#include "xiao_mg24-pinctrl.dtsi" +#include "seeed_xiao_connector.dtsi" + +/ { + model = "Seeed XIAO MG24"; + compatible = "seeed,xiao_mg24", "silabs,efr32mg24"; + + chosen { + zephyr,console = &usart0; + zephyr,shell-uart = &usart0; + zephyr,uart-pipe = &usart0; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,code-partition = &slot0_partition; + zephyr,bt-hci = &bt_hci_silabs; + }; + + /* These aliases are provided for compatibility with samples */ + aliases { + led0 = &led0; + watchdog0 = &wdog0; + }; + + leds { + compatible = "gpio-leds"; + + led0: led_0 { + gpios = <&gpioa 7 GPIO_ACTIVE_LOW>; + label = "LED 0"; + }; + }; +}; + +&cpu0 { + clock-frequency = <78000000>; +}; + +&pstate_em3 { + status = "disabled"; +}; + +&hfxo { + status = "okay"; + ctune = <95>; + precision = <50>; +}; + +&lfxo { + status = "okay"; + ctune = <44>; + 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>; +}; + +&sysrtcclk { + clocks = <&lfxo>; +}; + +&wdog0clk { + clocks = <&lfxo>; +}; + +&wdog1clk { + clocks = <&lfxo>; +}; + +&usart0 { + current-speed = <115200>; + pinctrl-0 = <&usart0_default>; + pinctrl-names = "default"; + status = "okay"; +}; + +&eusart0 { + compatible = "silabs,eusart-uart"; + pinctrl-0 = <&eusart0_default>; + pinctrl-names = "default"; + current-speed = <115200>; +}; + +&eusart1 { + compatible = "silabs,eusart-spi"; + pinctrl-0 = <&eusart1_default>; + pinctrl-names = "default"; + cs-gpios = <&gpioc 7 GPIO_ACTIVE_LOW>; + clock-frequency = <4000000>; + #address-cells = <1>; + #size-cells = <0>; +}; + +&i2c0 { + pinctrl-0 = <&i2c0_default>; + pinctrl-names = "default"; +}; + +&gpio { + location-swo = <0>; + status = "okay"; +}; + +&gpioa { + status = "okay"; +}; + +&gpiob { + status = "okay"; + + rf_sw: rf_sw { + gpio-hog; + gpios = <4 GPIO_ACTIVE_HIGH>; + output-low; + }; + + rf_sw_enable: rf_sw_enable { + gpio-hog; + gpios = <5 GPIO_ACTIVE_HIGH>; + output-high; + }; +}; + +&gpioc { + status = "okay"; + +}; + +&gpiod { + status = "okay"; +}; + +&wdog0 { + status = "okay"; +}; + +&sysrtc0 { + status = "okay"; +}; + +&se { + status = "okay"; +}; + +&flash0 { + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* Reserve 48 kB for the bootloader */ + boot_partition: partition@0 { + label = "mcuboot"; + reg = <0x0 DT_SIZE_K(48)>; + read-only; + }; + + /* Reserve 720 kB for the application in slot 0 */ + slot0_partition: partition@c000 { + label = "image-0"; + reg = <0x0000c000 0x000B8000>; + }; + + /* Reserve 720 kB for the application in slot 1 */ + slot1_partition: partition@C4000 { + label = "image-1"; + reg = <0x000C0000 0x000B8000>; + }; + + /* Set 16 kB of storage at the end of the 1536 kB of flash */ + storage_partition: partition@17c000 { + label = "storage"; + reg = <0x0017c000 DT_SIZE_K(16)>; + }; + }; +}; + +&bt_hci_silabs { + status = "okay"; +}; diff --git a/boards/seeed/xiao_mg24/xiao_mg24.yaml b/boards/seeed/xiao_mg24/xiao_mg24.yaml new file mode 100644 index 00000000000..aaacd6892e8 --- /dev/null +++ b/boards/seeed/xiao_mg24/xiao_mg24.yaml @@ -0,0 +1,20 @@ +identifier: xiao_mg24 +name: XIAO MG24 +type: mcu +arch: arm +ram: 256 +flash: 1536 +toolchain: + - zephyr + - gnuarmemb +supported: + - bluetooth + - gpio + - uart + - dma + - watchdog + - comparator +testing: + ignore_tags: + - pm +vendor: seeed diff --git a/boards/seeed/xiao_mg24/xiao_mg24_defconfig b/boards/seeed/xiao_mg24/xiao_mg24_defconfig new file mode 100644 index 00000000000..e70f8f5c519 --- /dev/null +++ b/boards/seeed/xiao_mg24/xiao_mg24_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