[PATCH 2/2] board: rockchip: Add FriendlyElec NanoPi R76S

Quentin Schulz quentin.schulz at cherry.de
Wed Jan 14 17:52:59 CET 2026


Hi Jonas,

On 1/8/26 3:35 PM, Jonas Karlman wrote:
> The NanoPi R76S (as "R76S") is an open-sourced mini IoT gateway
> device with two 2.5G, designed and developed by FriendlyElec.
> 
> Features tested on a NanoPi R76S 2411:
> - SD-card boot
> - eMMC boot
> - LEDs and button
> - PCIe/Ethernet
> - USB host
> 
> Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
> ---
>   arch/arm/dts/rk3576-nanopi-r76s-u-boot.dtsi |  3 ++
>   arch/arm/mach-rockchip/rk3576/MAINTAINERS   |  6 +++
>   configs/nanopi-r76s-rk3576_defconfig        | 60 +++++++++++++++++++++
>   doc/board/rockchip/rockchip.rst             |  1 +
>   4 files changed, 70 insertions(+)
>   create mode 100644 arch/arm/dts/rk3576-nanopi-r76s-u-boot.dtsi
>   create mode 100644 configs/nanopi-r76s-rk3576_defconfig
> 
> diff --git a/arch/arm/dts/rk3576-nanopi-r76s-u-boot.dtsi b/arch/arm/dts/rk3576-nanopi-r76s-u-boot.dtsi
> new file mode 100644
> index 000000000000..632fabb6af56
> --- /dev/null
> +++ b/arch/arm/dts/rk3576-nanopi-r76s-u-boot.dtsi
> @@ -0,0 +1,3 @@
> +// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
> +
> +#include "rk3576-u-boot.dtsi"

I don't think that should be necessary?

U-Boot should fallback to rj3576-u-boot.dtsi if there's no 
rk3576-nanopi-r76s-u-boot.dtsi, because SYS_SOC is rk3576 in 
arch/arm/mach-rockchip/rk3576/Kconfig and the wildcard list in 
u_boot_dtsi_options in scripts/Makefile.lib.

More comments below but they are definitely not blocker for merging this.

> diff --git a/arch/arm/mach-rockchip/rk3576/MAINTAINERS b/arch/arm/mach-rockchip/rk3576/MAINTAINERS
> index 393edd3984ce..79cf9e97f70b 100644
> --- a/arch/arm/mach-rockchip/rk3576/MAINTAINERS
> +++ b/arch/arm/mach-rockchip/rk3576/MAINTAINERS
> @@ -10,6 +10,12 @@ S:	Maintained
>   F:	arch/arm/dts/rk3576-nanopi-m5*
>   F:	configs/nanopi-m5-rk3576_defconfig
>   
> +NANOPI-R76S-RK3576
> +M:	Jonas Karlman <jonas at kwiboo.se>
> +S:	Maintained
> +F:	arch/arm/dts/rk3576-nanopi-r76s*
> +F:	configs/nanopi-r76s-rk3576_defconfig
> +
>   OMNI3576-RK3576
>   M:	Jonas Karlman <jonas at kwiboo.se>
>   S:	Maintained
> diff --git a/configs/nanopi-r76s-rk3576_defconfig b/configs/nanopi-r76s-rk3576_defconfig
> new file mode 100644
> index 000000000000..af149dc4ba56
> --- /dev/null
> +++ b/configs/nanopi-r76s-rk3576_defconfig
> @@ -0,0 +1,60 @@
> +CONFIG_ARM=y
> +CONFIG_SKIP_LOWLEVEL_INIT=y
> +CONFIG_SYS_HAS_NONCACHED_MEMORY=y
> +CONFIG_COUNTER_FREQUENCY=24000000
> +CONFIG_ARCH_ROCKCHIP=y
> +CONFIG_DEFAULT_DEVICE_TREE="rockchip/rk3576-nanopi-r76s"
> +CONFIG_ROCKCHIP_RK3576=y
> +CONFIG_SYS_LOAD_ADDR=0x40c00800

Should we think about adding a default value for various Rockchip SoCs 
in root Kconfig for SYS_LOAD_ADDR?

> +CONFIG_DEBUG_UART_BASE=0x2AD40000
> +CONFIG_DEBUG_UART_CLOCK=24000000

Same here. I'm assuming there's a reference design most people are 
basing their HW on, so having a default DEBUG_UART_BASE common for the 
SoC makes sense (and we could even then have a comment specifying which 
UART controller that is). As for the clock speed, I'm wondering if we 
ever had something different than that. And also wondering if it's 
related (should be in sync?) with &uart0/clock-frequency?

> +CONFIG_PCI=y
> +CONFIG_DEBUG_UART=y
> +CONFIG_DEFAULT_FDT_FILE="rockchip/rk3576-nanopi-r76s.dtb"
> +# CONFIG_DISPLAY_CPUINFO is not set

Why not :)?

> +CONFIG_SPL_MAX_SIZE=0x40000
> +# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
> +CONFIG_CMD_MEMINFO=y
> +CONFIG_CMD_MEMINFO_MAP=y
> +CONFIG_CMD_ADC=y
> +CONFIG_CMD_GPIO=y
> +CONFIG_CMD_GPT=y
> +CONFIG_CMD_I2C=y
> +CONFIG_CMD_MISC=y
> +CONFIG_CMD_MMC=y
> +CONFIG_CMD_PCI=y
> +CONFIG_CMD_USB=y
> +# CONFIG_CMD_SETEXPR is not set
> +CONFIG_CMD_RNG=y
> +CONFIG_CMD_REGULATOR=y
> +# CONFIG_SPL_DOS_PARTITION is not set
> +CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
> +CONFIG_BUTTON=y
> +CONFIG_BUTTON_GPIO=y
> +CONFIG_ROCKCHIP_GPIO=y
> +CONFIG_SYS_I2C_ROCKCHIP=y
> +CONFIG_LED=y
> +CONFIG_LED_GPIO=y
> +CONFIG_SUPPORT_EMMC_RPMB=y
> +CONFIG_MMC_DW=y
> +CONFIG_MMC_DW_ROCKCHIP=y
> +CONFIG_MMC_SDHCI=y
> +CONFIG_MMC_SDHCI_SDMA=y
> +CONFIG_MMC_SDHCI_ROCKCHIP=y
> +CONFIG_RTL8169=y
> +CONFIG_PCIE_DW_ROCKCHIP=y
> +CONFIG_PHY_ROCKCHIP_INNO_USB2=y
> +CONFIG_PHY_ROCKCHIP_NANENG_COMBOPHY=y
> +CONFIG_PHY_ROCKCHIP_USBDP=y
> +CONFIG_DM_PMIC=y
> +CONFIG_PMIC_RK8XX=y
> +CONFIG_REGULATOR_RK8XX=y
> +CONFIG_BAUDRATE=1500000
> +CONFIG_DEBUG_UART_SHIFT=2
> +CONFIG_SYS_NS16550_MEM32=y

The two above also are always the same on Rockchip no?

By default, the expected baudrate is probably 1500000 on Rockchip, 
wondering if we shouldn't make that the default either?

> +CONFIG_SYSRESET_PSCI=y
> +CONFIG_USB=y
> +CONFIG_USB_XHCI_HCD=y
> +CONFIG_USB_DWC3=y
> +CONFIG_USB_DWC3_GENERIC=y
> +CONFIG_ERRNO_STR=y

I'm wondering whether we should think about setting WERROR on by default 
for new boards? What do you think?

Cheers,
Quentin


More information about the U-Boot mailing list