[PATCH v5 4/4] mips: mt7628: Add Onion Omega2/2+ board support
Daniel Schwierzeck
daniel.schwierzeck at gmail.com
Mon Aug 4 17:02:25 CEST 2025
Hi Philip,
sorry for the long delay
On 7/30/25 14:38, Philip Oberfichtner wrote:
> The Omega2 / Omega2+ are based on the MediaTek MT7688 SoC with the
> following features:
> - 64 / 128MB of DDR2 memory
> - 16 / 32MB of SPI NOR flash
> - USB, WiFi and many more peripherals
>
> Signed-off-by: Philip Oberfichtner <pro at denx.de>
> ---
>
> Notes:
> Changes in v5: none
>
> Changes in v4:
> - Adapt bootcmd
> - Rebase defconfig
>
> Changes in v3:
> - Adapt defconfig to [PATCH 1/2] (SPL_SIZE_LIMIT)
>
> Changes in v2:
> - Fix style issues as reported by checkpatch
> - Add MAINTAINERS file
>
> arch/mips/dts/Makefile | 1 +
> arch/mips/dts/onion-omega2p.dts | 58 ++++++++++++
> arch/mips/mach-mtmips/mt7628/Kconfig | 7 ++
> board/onion/omega2p/Kconfig | 12 +++
> board/onion/omega2p/MAINTAINERS | 10 ++
> board/onion/omega2p/Makefile | 3 +
> board/onion/omega2p/board.c | 134 +++++++++++++++++++++++++++
> board/onion/omega2p/omega2p.env | 32 +++++++
> configs/onion-omega2p_defconfig | 82 ++++++++++++++++
> include/configs/onion-omega2p.h | 15 +++
> 10 files changed, 354 insertions(+)
> create mode 100644 arch/mips/dts/onion-omega2p.dts
> create mode 100644 board/onion/omega2p/Kconfig
> create mode 100644 board/onion/omega2p/MAINTAINERS
> create mode 100644 board/onion/omega2p/Makefile
> create mode 100644 board/onion/omega2p/board.c
> create mode 100644 board/onion/omega2p/omega2p.env
> create mode 100644 configs/onion-omega2p_defconfig
> create mode 100644 include/configs/onion-omega2p.h
>
> diff --git a/arch/mips/dts/Makefile b/arch/mips/dts/Makefile
> index 7c4ee8b668b..cb33f96edee 100644
> --- a/arch/mips/dts/Makefile
> +++ b/arch/mips/dts/Makefile
> @@ -21,6 +21,7 @@ dtb-$(CONFIG_BOARD_MT7621_NAND_RFB) += mediatek,mt7621-nand-rfb.dtb
> dtb-$(CONFIG_BOARD_MT7628_RFB) += mediatek,mt7628-rfb.dtb
> dtb-$(CONFIG_BOARD_GARDENA_SMART_GATEWAY_MT7688) += gardena-smart-gateway-mt7688.dtb
> dtb-$(CONFIG_BOARD_LINKIT_SMART_7688) += linkit-smart-7688.dtb
> +dtb-$(CONFIG_BOARD_ONION_OMEGA2) += onion-omega2p.dtb
> dtb-$(CONFIG_TARGET_OCTEON_EBB7304) += mrvl,octeon-ebb7304.dtb
> dtb-$(CONFIG_TARGET_OCTEON_NIC23) += mrvl,octeon-nic23.dtb
> dtb-$(CONFIG_BOARD_NETGEAR_CG3100D) += netgear,cg3100d.dtb
> diff --git a/arch/mips/dts/onion-omega2p.dts b/arch/mips/dts/onion-omega2p.dts
> new file mode 100644
> index 00000000000..64fecba1db9
> --- /dev/null
> +++ b/arch/mips/dts/onion-omega2p.dts
> @@ -0,0 +1,58 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (C) 2024 Zheng Han <zh at onioniot.com>, Lazar Demin <lazar at onioniot.com>
> + */
> +
> +/dts-v1/;
> +
> +#include "mt7628a.dtsi"
> +#include <dt-bindings/gpio/gpio.h>
> +
> +/ {
> + compatible = "onion,omega2", "onion,omega2p", "ralink,mt7628a-soc";
> + model = "Onion Omega2/Omega2+";
> +
> + aliases {
> + serial0 = &uart0;
> + spi0 = &spi0;
> + };
> +
> + chosen {
> + stdout-path = &uart0;
> + };
> +};
> +
> +&pinctrl {
> + state_default: pin_state {
> + p0led {
> + groups = "p0led_a";
> + function = "led";
> + };
> + };
> +};
> +
> +&uart0 {
> + status = "okay";
> +};
> +
> +&spi0 {
> + status = "okay";
> + num-cs = <2>;
> +
> + pinctrl-names = "default";
> + pinctrl-0 = <&spi_dual_pins>;
> +
> + spi-flash at 0 {
> + #address-cells = <1>;
> + #size-cells = <1>;
> + compatible = "jedec,spi-nor";
> + spi-max-frequency = <40000000>;
> + reg = <0>;
> + };
> +};
> +
> +ð {
> + pinctrl-names = "default";
> + pinctrl-0 = <&ephy_iot_mode>;
> + mediatek,poll-link-phy = <0>;
> +};
> diff --git a/arch/mips/mach-mtmips/mt7628/Kconfig b/arch/mips/mach-mtmips/mt7628/Kconfig
> index 79b2ddc6692..a75196eaefd 100644
> --- a/arch/mips/mach-mtmips/mt7628/Kconfig
> +++ b/arch/mips/mach-mtmips/mt7628/Kconfig
> @@ -27,6 +27,12 @@ config BOARD_MT7628_RFB
> SPI-NOR flash, 1 built-in switch with 5 ports, 1 UART, 1 USB host,
> 1 SDXC, 1 PCIe socket and JTAG pins.
>
> +config BOARD_ONION_OMEGA2
> + bool "Onion Omega2/2+"
> + help
> + Onion Omega2/2+ IoT computer. Has a MT7688 SoC with 64/128 MiB of DDR2
> + RAM and 16/32 MiB of SPI flash.
> +
> config BOARD_VOCORE2
> bool "VoCore2"
> select SPL_SERIAL
> @@ -52,6 +58,7 @@ config SYS_CONFIG_NAME
> default "mt7628" if BOARD_MT7628_RFB
>
> source "board/gardena/smart-gateway-mt7688/Kconfig"
> +source "board/onion/omega2p/Kconfig"
> source "board/seeed/linkit-smart-7688/Kconfig"
> source "board/vocore/vocore2/Kconfig"
>
> diff --git a/board/onion/omega2p/Kconfig b/board/onion/omega2p/Kconfig
> new file mode 100644
> index 00000000000..45c18ee27ef
> --- /dev/null
> +++ b/board/onion/omega2p/Kconfig
> @@ -0,0 +1,12 @@
> +if BOARD_ONION_OMEGA2
> +
> +config SYS_BOARD
> + default "omega2p"
> +
> +config SYS_VENDOR
> + default "onion"
> +
> +config SYS_CONFIG_NAME
> + default "onion-omega2p"
> +
> +endif
> diff --git a/board/onion/omega2p/MAINTAINERS b/board/onion/omega2p/MAINTAINERS
> new file mode 100644
> index 00000000000..4532c1c6d3e
> --- /dev/null
> +++ b/board/onion/omega2p/MAINTAINERS
> @@ -0,0 +1,10 @@
> +ONION OMEGA2/2+
> +M: Philip Oberfichtner <pro at denx.de>
> +S: Maintained
> +F: arch/mips/dts/onion-omega2p.dts
> +F: board/onion/omega2p/Kconfig
> +F: board/onion/omega2p/Makefile
> +F: board/onion/omega2p/board.c
> +F: board/onion/omega2p/omega2p.env
> +F: configs/onion-omega2p_defconfig
> +F: include/configs/onion-omega2p.h
> diff --git a/board/onion/omega2p/Makefile b/board/onion/omega2p/Makefile
> new file mode 100644
> index 00000000000..70cd7a8e568
> --- /dev/null
> +++ b/board/onion/omega2p/Makefile
> @@ -0,0 +1,3 @@
> +# SPDX-License-Identifier: GPL-2.0+
> +
> +obj-y += board.o
> diff --git a/board/onion/omega2p/board.c b/board/onion/omega2p/board.c
> new file mode 100644
> index 00000000000..b56fbf262ad
> --- /dev/null
> +++ b/board/onion/omega2p/board.c
> @@ -0,0 +1,134 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2024 Zheng Han <zh at onioniot.com>, Lazar Demin <lazar at onioniot.com>
> + * Copyright (C) 2025 DENX Software Engineering GmbH, Philip Oberfichtner <pro at denx.de>
> + */
> +
> +#include <asm/io.h>
> +#include <env.h>
> +#include <init.h>
> +#include <mtd.h>
> +
> +#define OMEGA2_REG(x) (*((u32 *)(x)))
> +#define OMEGA2_SYSCTL_BASE 0xB0000000
> +#define OMEGA2_SYS_CNTL_BASE (OMEGA2_SYSCTL_BASE)
> +#define OMEGA2_REG_PIODIR (OMEGA2_SYSCTL_BASE + 0x600)
> +
> +static int detect_rst(void)
> +{
> + u32 val = OMEGA2_REG(0xb0000624); // Read GPIO 44 (reset button)
> +
> + return (val & 1 << 6) ? 1 : 0;
> +}
> +
> +static void gpio_init(void)
> +{
> + u32 val;
> +
> + printf("Initializing MT7688 GPIO system.\n");
> +
> + //set gpio2_mode - setting wled, and p0,p1,p2,p3,p4 LED pins to GPIO mode
> + val = 0x555;
> + OMEGA2_REG(OMEGA2_SYS_CNTL_BASE + 0x64) = val; // GPIO2_MODE register
> + // GINT_FEDGE_1: setting "Enable falling edge triggered" for GPIOs 39-42
> + OMEGA2_REG(0xb0000644) = 0x0f << 7;
> +
> + // set gpio_ctrl_1 register: set GPIO44 to output
> + //gpio44 output gpio_ctrl_1 bit3=1
> + val = OMEGA2_REG(OMEGA2_REG_PIODIR + 0x04);
> + val |= 1 << 12;
> + OMEGA2_REG(OMEGA2_REG_PIODIR + 0x04) = val;
> +
> + // set gpio1_mode register: set WDT_MODE to GPIO mode
> + //set gpio1_mode 14=1b1
> + val = OMEGA2_REG(OMEGA2_SYS_CNTL_BASE + 0x60);
> + val |= 1 << 14;
> + OMEGA2_REG(OMEGA2_SYS_CNTL_BASE + 0x60) = val;
> +
> + // set gpio_ctrl_1 resgister: set GPIO38 to input
> + //gpio38 input gpio_ctrl_1 bit5=0
> + val = OMEGA2_REG(OMEGA2_REG_PIODIR + 0x04);
> + val &= ~1 << 6;
> + OMEGA2_REG(OMEGA2_REG_PIODIR + 0x04) = val;
MT7628 has a pinctrl driver. As you are using "mt7628a.dtsi", you could
try to configure those pin configs via device-tree
> +}
> +
> +enum onion_board_variant {
> + OMEGA2,
> + OMEGA2P,
> + UNKNOWN,
> +};
> +
> +static enum onion_board_variant board_variant(void)
> +{
> + struct mtd_info *mtd;
> +
> + mtd_probe_devices();
> +
> + mtd_for_each_device(mtd) {
> + if (mtd->type != MTD_NORFLASH)
> + continue;
> +
> + switch (mtd->size) {
> + case 16 * 1024 * 1024: // 16 MB
> + return OMEGA2;
> +
> + case 32 * 1024 * 1024: // 32 MB
> + return OMEGA2P;
> +
> + default:
> + break;
> + }
> + }
> +
> + return UNKNOWN;
> +}
> +
> +#define ONION_MTDPARTS_BASE "spi0.0:192k(u-boot),64k(u-boot-env),64k(factory)"
> +
> +static void set_mtdparts(void)
> +{
> + switch (board_variant()) {
> + case OMEGA2P:
> + printf("Detected board variant OMEGA2+: ");
> + env_set("mtdparts", ONION_MTDPARTS_BASE ",32448k(firmware)");
> + break;
> +
> + case OMEGA2:
> + printf("Detected board variant OMEGA2: ");
> + env_set("mtdparts", ONION_MTDPARTS_BASE ",16064k(firmware)");
> + break;
> +
> + default:
> + printf("Unable to detect board variant! Using default value: ");
> + env_set("mtdparts", ONION_MTDPARTS_BASE);
> + }
> +
> + printf("mtdparts=\"%s\"\n", env_get("mtdparts"));
> +}
you should just configure the basic MTD layout needed to boot U-Boot in
your defconfig file. All further partitions should be set by the user or
downstream sources. All that custom runtime code is not necessary and
should be removed.
BTW: the part "...,32448k(firmware)" could be replaced with
",-(firmware)" to auto-fill the remaining space.
For example:
CONFIG_MTDIDS_DEFAULT="nor0=spi0.0"
CONFIG_MTDPARTS_DEFAULT="mtdparts=spi0.0:192k(u-boot),64k(u-boot-env),64k(factory)"
> +
> +#define WELCOME_MESSAGE \
> + "\n\n" \
> + " *************************************************************\n"\
> + " * For more info on using U-Boot, visit *\n"\
> + " * https://documentation.onioniot.com/bootloader/overview *\n"\
> + " * *\n"\
> + " * Hold the reset button to enter the U-Boot commandline. *\n"\
> + " *************************************************************\n"\
> + "\n"
custom message is not necessary, mainline code should just use the
default U-Boot console prompt
> +
> +int board_late_init(void)
> +{
> + gpio_init();
> +
> + printf(WELCOME_MESSAGE);
> +
> + set_mtdparts();
> +
> + if (detect_rst()) {
> + printf("Reset button pressed - entering shell ...\n");
> + env_set("reset_pressed", "1");
> + // This env variable is evaluated by our bootcmd.
> + }
mainline code should always stop at console prompt without any magic.
Custom MTD partitions and boot methods should be configured by the user
or in downstream sources.
> +
> + return 0;
> +}
> diff --git a/board/onion/omega2p/omega2p.env b/board/onion/omega2p/omega2p.env
> new file mode 100644
> index 00000000000..f8c10b584e2
> --- /dev/null
> +++ b/board/onion/omega2p/omega2p.env
> @@ -0,0 +1,32 @@
> +# SPDX-License-Identifier: GPL-2.0+
> +# Copyright (C) 2025 DENX Software Engineering GmbH, Philip Oberfichtner <pro at denx.de>
> +
> +# Boot options
> +bootargs=console=ttyS0,115200 rootfstype=squashfs,jffs2
should be reduced and set via defconfig, e.g.:
CONFIG_BOOTARGS="console=ttyS0,115200"
> +bootfile=firmware.bin
> +boot_linux=sf probe && mtd read firmware 81800000 0 400000 && bootm 81800000
> +
> +# unset temporary variable and make the environment persist if necessary.
> +env_check= \
> + env set reset_pressed; \
> + if env info -p -d -q; then \
> + echo "No valid environment found on flash. Write out the defaults."; \
> + env save; \
> + fi
> +
> +bootcmd= \
> + if test -z "${reset_pressed}"; then \
> + run env_check; \
> + run boot_linux; \
> + else \
> + run env_check; \
> + fi
> +
> +# Network configuration
> +serverip=192.168.8.100
> +ipaddr=192.168.8.8
> +loadaddr=0x81800000
> +
> +# MTD settings
> +mtdids=nor0=spi0.0
> +# mtdparts will be set at runtime, according to the specific board variant.
with the suggestions above this custom env file as well as board.c are
not really needed and can be dropped from this patch.
> diff --git a/configs/onion-omega2p_defconfig b/configs/onion-omega2p_defconfig
> new file mode 100644
> index 00000000000..a73d1cd3d60
> --- /dev/null
> +++ b/configs/onion-omega2p_defconfig
> @@ -0,0 +1,82 @@
> +CONFIG_MIPS=y
> +CONFIG_SKIP_LOWLEVEL_INIT=y
> +CONFIG_SYS_MALLOC_LEN=0x1000000
> +CONFIG_SPL_LIBCOMMON_SUPPORT=y
> +CONFIG_SPL_LIBGENERIC_SUPPORT=y
> +CONFIG_NR_DRAM_BANKS=1
> +CONFIG_ENV_SIZE=0x4000
> +CONFIG_ENV_OFFSET=0x30000
> +CONFIG_ENV_SECT_SIZE=0x10000
> +CONFIG_DEFAULT_DEVICE_TREE="onion-omega2p"
> +CONFIG_SPL_SERIAL=y
> +CONFIG_SPL_SYS_MALLOC_F_LEN=0x80000
> +CONFIG_SPL_BSS_START_ADDR=0x80010000
> +CONFIG_SPL_BSS_MAX_SIZE=0x10000
> +CONFIG_SYS_LOAD_ADDR=0x81800000
> +CONFIG_SPL=y
> +CONFIG_ARCH_MTMIPS=y
> +CONFIG_SOC_MT7628=y
> +CONFIG_BOARD_ONION_OMEGA2=y
> +CONFIG_SYS_MIPS_TIMER_FREQ=290000000
> +CONFIG_MIPS_CACHE_SETUP=y
> +CONFIG_MIPS_CACHE_DISABLE=y
> +CONFIG_RESTORE_EXCEPTION_VECTOR_BASE=y
> +# CONFIG_MIPS_BOOT_ENV_LEGACY is not set
> +CONFIG_MIPS_BOOT_FDT=y
> +CONFIG_ENV_VARS_UBOOT_CONFIG=y
> +CONFIG_FIT=y
> +CONFIG_FIT_SIGNATURE=y
> +CONFIG_LEGACY_IMAGE_FORMAT=y
> +CONFIG_BOOTDELAY=0
> +CONFIG_AUTOBOOT_KEYED=y
> +CONFIG_AUTOBOOT_KEYED_CTRLC=y
autoboot shouldn't be enabled if there is no generic boot method
available (e.g. like distro boot or EFI)
> +CONFIG_OF_STDOUT_VIA_ALIAS=y
> +CONFIG_BOARD_LATE_INIT=y
> +CONFIG_SYS_MALLOC_BOOTPARAMS=y
> +CONFIG_UBOOT_WITH_SPL_SIZE_LIMIT=0x30000
> +CONFIG_SPL_MAX_SIZE=0x10000
> +CONFIG_SPL_SYS_MALLOC_SIMPLE=y
> +CONFIG_SPL_NOR_SUPPORT=y
> +CONFIG_HUSH_PARSER=y
> +# CONFIG_CMD_ELF is not set
> +CONFIG_CMD_ERASEENV=y
> +CONFIG_CMD_NVEDIT_INFO=y
> +CONFIG_CMD_MEMINFO=y
> +CONFIG_CMD_GPIO=y
> +CONFIG_CMD_MTD=y
> +CONFIG_CMD_PART=y
> +CONFIG_CMD_SPI=y
> +CONFIG_CMD_DHCP=y
> +CONFIG_CMD_MII=y
> +CONFIG_CMD_PING=y
> +CONFIG_CMD_TIME=y
> +CONFIG_CMD_FS_GENERIC=y
> +CONFIG_CMD_MTDPARTS=y
> +CONFIG_ENV_IS_IN_SPI_FLASH=y
> +CONFIG_ENV_USE_DEFAULT_ENV_TEXT_FILE=y
> +CONFIG_ENV_DEFAULT_ENV_TEXT_FILE="board/onion/omega2p/omega2p.env"
> +CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
> +CONFIG_USE_IPADDR=y
> +CONFIG_IPADDR="192.168.8.8"
> +CONFIG_USE_SERVERIP=y
> +CONFIG_SERVERIP="192.168.8.100"
mainline code should not have any specific network config
> +CONFIG_NET_RANDOM_ETHADDR=y
> +CONFIG_SPL_DM=y
> +CONFIG_LED=y
> +CONFIG_LED_BLINK=y
> +CONFIG_LED_GPIO=y
> +CONFIG_DM_MTD=y
> +CONFIG_SPI_FLASH_BAR=y
> +CONFIG_SPI_FLASH_GIGADEVICE=y
> +CONFIG_SPI_FLASH_MACRONIX=y
> +CONFIG_SPI_FLASH_SPANSION=y
> +CONFIG_SPI_FLASH_STMICRO=y
> +CONFIG_SPI_FLASH_WINBOND=y
does the board vendor really use all SPI flash chips? If not you can
drop the unneeded drivers to reduce code size
> +CONFIG_SPI_FLASH_MTD=y
> +CONFIG_MT7628_ETH=y
> +CONFIG_PHY=y
> +CONFIG_SPI=y
> +CONFIG_MT7621_SPI=y
> +CONFIG_LZMA=y
> +# CONFIG_GZIP is not set
> +CONFIG_SPL_LZMA=y
> diff --git a/include/configs/onion-omega2p.h b/include/configs/onion-omega2p.h
> new file mode 100644
> index 00000000000..ca170b22a40
> --- /dev/null
> +++ b/include/configs/onion-omega2p.h
> @@ -0,0 +1,15 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright (C) 2024 Zheng Han <zh at onioniot.com>, Lazar Demin <lazar at onioniot.com>
> + */
> +#ifndef __CONFIG_ONION_OMEGA2P_H
> +#define __CONFIG_ONION_OMEGA2P_H
> +
> +/* RAM */
> +#define CFG_SYS_SDRAM_BASE 0x80000000
> +#define CFG_SYS_INIT_SP_OFFSET 0x400000
> +
> +/* Dummy value */
> +#define CFG_SYS_UBOOT_BASE 0
> +
> +#endif /* __CONFIG_ONION_OMEGA2P_H */
--
- Daniel
More information about the U-Boot
mailing list