diff mbox series

[v2,2/2] board: rockchip: Add FriendlyElec NanoPi R6S

Message ID 20240607202111.453943-2-seb-dev@mail.de
State Superseded
Delegated to: Kever Yang
Headers show
Series [v2,1/2] board: rockchip: Add FriendlyElec NanoPi R6C | expand

Commit Message

Sebastian Kropatsch June 7, 2024, 8:17 p.m. UTC
The NanoPi R6S is a SBC by FriendlyElec based on the Rockchip RK3588s.
It comes with 4GB or 8GB of RAM, a microSD card slot, 32GB eMMC storage,
one RTL8211F 1GbE and two RTL8125 2.5GbE Ethernet ports, one USB 2.0
Type-A and one USB 3.0 Type-A port, a HDMI port, a 12-pin GPIO FPC
connector, a fan connector, IR receiver as well as some buttons and LEDs.

Add initial support for this board using the upstream devicetree sources.

Kernel commit:
f1b11f43b3e9 ("arm64: dts: rockchip: Add support for NanoPi R6S")

Signed-off-by: Sebastian Kropatsch <seb-dev@mail.de>
---

The R6S is very similar to the R6C, the major difference being that
instead of the M.2 NVMe socket on the R6C, the R6S has a second RTL8125BG
Ethernet chip, which uses the same PCIe lanes that the R6C uses for its
M.2 socket. Other minor differences include:
- 12-pin GPIO FPC instead of 30-pin header
- IR receiver (pwm-based)
- 5V fan connector
Other than that, they are the same, which is why the difference in
U-Boot is only the missing NVME config option in the R6S defconfig.

Please note that I was not able to test this device. I only chose to
add it due to it being a very similar implementation to the R6C, like the
NanoPi R5C and R5S are similar. It should however boot just fine and even
both RTL8125 Ethernet ports should work in U-Boot since RTL8125 is the
same chip used in the R6C, using the rtl8169 driver.

If this is not how things should be done in U-Boot, please disregard
and drop this patch :) Thanks!

---
 arch/arm/dts/rk3588s-nanopi-r6s-u-boot.dtsi   |  3 +
 arch/arm/mach-rockchip/rk3588/Kconfig         | 12 +++
 board/friendlyelec/nanopi-r6s-rk3588s/Kconfig | 12 +++
 .../nanopi-r6s-rk3588s/MAINTAINERS            |  7 ++
 configs/nanopi-r6s-rk3588s_defconfig          | 82 +++++++++++++++++++
 doc/board/rockchip/rockchip.rst               |  1 +
 include/configs/nanopi-r6s-rk3588s.h          | 12 +++
 7 files changed, 129 insertions(+)
 create mode 100644 arch/arm/dts/rk3588s-nanopi-r6s-u-boot.dtsi
 create mode 100644 board/friendlyelec/nanopi-r6s-rk3588s/Kconfig
 create mode 100644 board/friendlyelec/nanopi-r6s-rk3588s/MAINTAINERS
 create mode 100644 configs/nanopi-r6s-rk3588s_defconfig
 create mode 100644 include/configs/nanopi-r6s-rk3588s.h

Comments

Kever Yang June 14, 2024, 8:58 a.m. UTC | #1
On 2024/6/8 04:17, Sebastian Kropatsch wrote:
> The NanoPi R6S is a SBC by FriendlyElec based on the Rockchip RK3588s.
> It comes with 4GB or 8GB of RAM, a microSD card slot, 32GB eMMC storage,
> one RTL8211F 1GbE and two RTL8125 2.5GbE Ethernet ports, one USB 2.0
> Type-A and one USB 3.0 Type-A port, a HDMI port, a 12-pin GPIO FPC
> connector, a fan connector, IR receiver as well as some buttons and LEDs.
>
> Add initial support for this board using the upstream devicetree sources.
>
> Kernel commit:
> f1b11f43b3e9 ("arm64: dts: rockchip: Add support for NanoPi R6S")
>
> Signed-off-by: Sebastian Kropatsch <seb-dev@mail.de>
Reviewed-by: Kever Yang <kever.yang@rock-chips.com>

Thanks,
- Kever
> ---
>
> The R6S is very similar to the R6C, the major difference being that
> instead of the M.2 NVMe socket on the R6C, the R6S has a second RTL8125BG
> Ethernet chip, which uses the same PCIe lanes that the R6C uses for its
> M.2 socket. Other minor differences include:
> - 12-pin GPIO FPC instead of 30-pin header
> - IR receiver (pwm-based)
> - 5V fan connector
> Other than that, they are the same, which is why the difference in
> U-Boot is only the missing NVME config option in the R6S defconfig.
>
> Please note that I was not able to test this device. I only chose to
> add it due to it being a very similar implementation to the R6C, like the
> NanoPi R5C and R5S are similar. It should however boot just fine and even
> both RTL8125 Ethernet ports should work in U-Boot since RTL8125 is the
> same chip used in the R6C, using the rtl8169 driver.
>
> If this is not how things should be done in U-Boot, please disregard
> and drop this patch :) Thanks!
>
> ---
>   arch/arm/dts/rk3588s-nanopi-r6s-u-boot.dtsi   |  3 +
>   arch/arm/mach-rockchip/rk3588/Kconfig         | 12 +++
>   board/friendlyelec/nanopi-r6s-rk3588s/Kconfig | 12 +++
>   .../nanopi-r6s-rk3588s/MAINTAINERS            |  7 ++
>   configs/nanopi-r6s-rk3588s_defconfig          | 82 +++++++++++++++++++
>   doc/board/rockchip/rockchip.rst               |  1 +
>   include/configs/nanopi-r6s-rk3588s.h          | 12 +++
>   7 files changed, 129 insertions(+)
>   create mode 100644 arch/arm/dts/rk3588s-nanopi-r6s-u-boot.dtsi
>   create mode 100644 board/friendlyelec/nanopi-r6s-rk3588s/Kconfig
>   create mode 100644 board/friendlyelec/nanopi-r6s-rk3588s/MAINTAINERS
>   create mode 100644 configs/nanopi-r6s-rk3588s_defconfig
>   create mode 100644 include/configs/nanopi-r6s-rk3588s.h
>
> diff --git a/arch/arm/dts/rk3588s-nanopi-r6s-u-boot.dtsi b/arch/arm/dts/rk3588s-nanopi-r6s-u-boot.dtsi
> new file mode 100644
> index 0000000000..853ed58cfe
> --- /dev/null
> +++ b/arch/arm/dts/rk3588s-nanopi-r6s-u-boot.dtsi
> @@ -0,0 +1,3 @@
> +// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
> +
> +#include "rk3588s-u-boot.dtsi"
> diff --git a/arch/arm/mach-rockchip/rk3588/Kconfig b/arch/arm/mach-rockchip/rk3588/Kconfig
> index 4b7d751c6f..a9e400861a 100644
> --- a/arch/arm/mach-rockchip/rk3588/Kconfig
> +++ b/arch/arm/mach-rockchip/rk3588/Kconfig
> @@ -90,6 +90,18 @@ config TARGET_NANOPI_R6C_RK3588S
>   	  Type-A port, a HDMI port, a 30-pin GPIO header as well as some
>   	  buttons and LEDs.
>   
> +config TARGET_NANOPI_R6S_RK3588S
> +	bool "FriendlyElec NanoPi R6S"
> +	select BOARD_LATE_INIT
> +	help
> +	  The NanoPi R6S is a SBC by FriendlyElec based on the Rockchip
> +	  RK3588s.
> +	  It comes with 4GB or 8GB of RAM, a microSD card slot, 32GB eMMC
> +	  storage, one RTL8211F 1GbE and two RTL8125 2.5GbE Ethernet ports,
> +	  one USB 2.0 Type-A and one USB 3.0 Type-A port, a HDMI port, a
> +	  12-pin GPIO FPC connector, a fan connector, IR receiver as well
> +	  as some buttons and LEDs.
> +
>   config TARGET_NOVA_RK3588
>   	bool "Indiedroid Nova RK3588"
>   	select BOARD_LATE_INIT
> diff --git a/board/friendlyelec/nanopi-r6s-rk3588s/Kconfig b/board/friendlyelec/nanopi-r6s-rk3588s/Kconfig
> new file mode 100644
> index 0000000000..4d579816b1
> --- /dev/null
> +++ b/board/friendlyelec/nanopi-r6s-rk3588s/Kconfig
> @@ -0,0 +1,12 @@
> +if TARGET_NANOPI_R6S_RK3588S
> +
> +config SYS_BOARD
> +	default "nanopi-r6s-rk3588s"
> +
> +config SYS_VENDOR
> +	default "friendlyelec"
> +
> +config SYS_CONFIG_NAME
> +	default "nanopi-r6s-rk3588s"
> +
> +endif
> diff --git a/board/friendlyelec/nanopi-r6s-rk3588s/MAINTAINERS b/board/friendlyelec/nanopi-r6s-rk3588s/MAINTAINERS
> new file mode 100644
> index 0000000000..76288b4320
> --- /dev/null
> +++ b/board/friendlyelec/nanopi-r6s-rk3588s/MAINTAINERS
> @@ -0,0 +1,7 @@
> +NANOPI-R6S
> +M:	Sebastian Kropatsch <seb-dev@mail.de>
> +S:	Maintained
> +F:	arch/arm/dts/rk3588s-nanopi-r6s-u-boot.dtsi
> +F:	board/friendlyelec/nanopi-r6s-rk3588s
> +F:	configs/nanopi-r6s-rk3588s_defconfig
> +F:	include/configs/nanopi-r6s-rk3588s.h
> diff --git a/configs/nanopi-r6s-rk3588s_defconfig b/configs/nanopi-r6s-rk3588s_defconfig
> new file mode 100644
> index 0000000000..f7b364655f
> --- /dev/null
> +++ b/configs/nanopi-r6s-rk3588s_defconfig
> @@ -0,0 +1,82 @@
> +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/rk3588s-nanopi-r6s"
> +CONFIG_ROCKCHIP_RK3588=y
> +CONFIG_SPL_SERIAL=y
> +CONFIG_TARGET_NANOPI_R6S_RK3588S=y
> +CONFIG_DEBUG_UART_BASE=0xFEB50000
> +CONFIG_DEBUG_UART_CLOCK=24000000
> +CONFIG_SYS_LOAD_ADDR=0xc00800
> +CONFIG_PCI=y
> +CONFIG_DEBUG_UART=y
> +CONFIG_FIT=y
> +CONFIG_FIT_VERBOSE=y
> +CONFIG_SPL_FIT_SIGNATURE=y
> +CONFIG_SPL_LOAD_FIT=y
> +CONFIG_LEGACY_IMAGE_FORMAT=y
> +CONFIG_DEFAULT_FDT_FILE="rockchip/rk3588s-nanopi-r6s.dtb"
> +# CONFIG_DISPLAY_CPUINFO is not set
> +CONFIG_DISPLAY_BOARDINFO_LATE=y
> +CONFIG_SPL_MAX_SIZE=0x40000
> +CONFIG_SPL_PAD_TO=0x7f8000
> +# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
> +CONFIG_SPL_ATF=y
> +CONFIG_CMD_GPIO=y
> +CONFIG_CMD_PWM=y
> +CONFIG_CMD_GPT=y
> +CONFIG_CMD_I2C=y
> +CONFIG_CMD_MMC=y
> +CONFIG_CMD_PCI=y
> +CONFIG_CMD_USB=y
> +CONFIG_CMD_ROCKUSB=y
> +# CONFIG_CMD_SETEXPR is not set
> +CONFIG_CMD_REGULATOR=y
> +# CONFIG_SPL_DOS_PARTITION is not set
> +CONFIG_SPL_OF_CONTROL=y
> +CONFIG_OF_LIVE=y
> +CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
> +CONFIG_SPL_DM_SEQ_ALIAS=y
> +CONFIG_SPL_REGMAP=y
> +CONFIG_SPL_SYSCON=y
> +CONFIG_SPL_CLK=y
> +# CONFIG_USB_FUNCTION_FASTBOOT is not set
> +CONFIG_ROCKCHIP_GPIO=y
> +CONFIG_SYS_I2C_ROCKCHIP=y
> +CONFIG_MISC=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_SPI_FLASH is not set
> +CONFIG_PHY_REALTEK=y
> +CONFIG_DWC_ETH_QOS=y
> +CONFIG_DWC_ETH_QOS_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_SPL_PINCTRL=y
> +CONFIG_PWM_ROCKCHIP=y
> +CONFIG_SPL_RAM=y
> +CONFIG_BAUDRATE=1500000
> +CONFIG_DEBUG_UART_SHIFT=2
> +CONFIG_SYS_NS16550_MEM32=y
> +CONFIG_SYSRESET=y
> +CONFIG_USB=y
> +CONFIG_USB_XHCI_HCD=y
> +CONFIG_USB_EHCI_HCD=y
> +CONFIG_USB_EHCI_GENERIC=y
> +CONFIG_USB_OHCI_HCD=y
> +CONFIG_USB_OHCI_GENERIC=y
> +CONFIG_USB_DWC3=y
> +CONFIG_USB_DWC3_GENERIC=y
> +CONFIG_USB_GADGET=y
> +CONFIG_USB_GADGET_DOWNLOAD=y
> +CONFIG_USB_FUNCTION_ROCKUSB=y
> +CONFIG_ERRNO_STR=y
> diff --git a/doc/board/rockchip/rockchip.rst b/doc/board/rockchip/rockchip.rst
> index a3d9837dda..0b58086f06 100644
> --- a/doc/board/rockchip/rockchip.rst
> +++ b/doc/board/rockchip/rockchip.rst
> @@ -124,6 +124,7 @@ List of mainline supported Rockchip boards:
>        - Edgeble Neural Compute Module 6B SoM - Neu6b (neu6b-io-rk3588)
>        - FriendlyElec NanoPC-T6 (nanopc-t6-rk3588)
>        - FriendlyElec NanoPi R6C (nanopi-r6c-rk3588s)
> +     - FriendlyElec NanoPi R6S (nanopi-r6s-rk3588s)
>        - Generic RK3588S/RK3588 (generic-rk3588)
>        - Indiedroid Nova (nova-rk3588s)
>        - Pine64 QuartzPro64 (quartzpro64-rk3588)
> diff --git a/include/configs/nanopi-r6s-rk3588s.h b/include/configs/nanopi-r6s-rk3588s.h
> new file mode 100644
> index 0000000000..a1b19783c5
> --- /dev/null
> +++ b/include/configs/nanopi-r6s-rk3588s.h
> @@ -0,0 +1,12 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +
> +#ifndef __NANOPI_R6S_RK3588S_H
> +#define __NANOPI_R6S_RK3588S_H
> +
> +#define ROCKCHIP_DEVICE_SETTINGS \
> +		"stdout=serial,vidconsole\0" \
> +		"stderr=serial,vidconsole\0"
> +
> +#include <configs/rk3588_common.h>
> +
> +#endif /* __NANOPI_R6S_RK3588S_H */
Ulli Kehrle June 20, 2024, 10:07 p.m. UTC | #2
Sebastian Kropatsch <seb-dev@mail.de> writes:
> The R6S is very similar to the R6C, the major difference being that
> instead of the M.2 NVMe socket on the R6C, the R6S has a second RTL8125BG
> Ethernet chip, which uses the same PCIe lanes that the R6C uses for its
> M.2 socket. Other minor differences include:
> - 12-pin GPIO FPC instead of 30-pin header
> - IR receiver (pwm-based)
> - 5V fan connector
> Other than that, they are the same, which is why the difference in
> U-Boot is only the missing NVME config option in the R6S defconfig.
>
> Please note that I was not able to test this device. I only chose to
> add it due to it being a very similar implementation to the R6C, like the
> NanoPi R5C and R5S are similar. It should however boot just fine and even
> both RTL8125 Ethernet ports should work in U-Boot since RTL8125 is the
> same chip used in the R6C, using the rtl8169 driver.

Hi Sebastian,

it looks like you forgot to include the hunk that includes the board
config board/friendlyelec/nanopi-r6s-rk3588s/Kconfig into
rk3588/Kconfig.

> diff --git a/arch/arm/mach-rockchip/rk3588/Kconfig b/arch/arm/mach-rockchip/rk3588/Kconfig
> index a9e400861a3..051d50e26f6 100644
> --- a/arch/arm/mach-rockchip/rk3588/Kconfig
> +++ b/arch/arm/mach-rockchip/rk3588/Kconfig
> @@ -257,6 +257,7 @@ config TEXT_BASE
>  source "board/edgeble/neural-compute-module-6/Kconfig"
>  source "board/friendlyelec/nanopc-t6-rk3588/Kconfig"
>  source "board/friendlyelec/nanopi-r6c-rk3588s/Kconfig"
> +source "board/friendlyelec/nanopi-r6s-rk3588s/Kconfig"
>  source "board/indiedroid/nova/Kconfig"
>  source "board/pine64/quartzpro64-rk3588/Kconfig"
>  source "board/turing/turing-rk1-rk3588/Kconfig"

Other than that, this appears to work great on my Nanopi R6S (with the
device tree from linux-6.9), including all three network interfaces, but
no working status leds for the rtl8169 ports. I have also noticed the
minor inconvenience that only the first two interfaces are initialized
with nonzero MAC addresses (because rockchip_setup_macaddr is hardcoded
for two interfaces?):

> => pci enum
> => net list
> eth0 : ethernet@fe1c0000 7a:d9:6d:ad:cb:26 active
> eth1 : eth_rtl8169 7a:d9:6d:ad:cb:27
> eth2 : eth_rtl8169 00:00:00:00:00:00

I don't think this is a huge deal as it works fine when manually setting
a MAC address and other boards with three or more interfaces (like the
NanoPi R5S) also behave that way. What do you think?

Best regards
Ulli
Sebastian Kropatsch July 11, 2024, 11:03 a.m. UTC | #3
Hi Ulli,

Sorry for the late reply, but thanks for testing!
I have sent a v3 of this patch, please reply to that mail
with your reviewed-by or tested-by tag if you'd like them
to be included.

Am 21.06.2024 um 00:07 schrieb Ulli Kehrle:
> 
> Sebastian Kropatsch <seb-dev@mail.de> writes:
>> The R6S is very similar to the R6C, the major difference being that
>> instead of the M.2 NVMe socket on the R6C, the R6S has a second RTL8125BG
>> Ethernet chip, which uses the same PCIe lanes that the R6C uses for its
>> M.2 socket. Other minor differences include:
>> - 12-pin GPIO FPC instead of 30-pin header
>> - IR receiver (pwm-based)
>> - 5V fan connector
>> Other than that, they are the same, which is why the difference in
>> U-Boot is only the missing NVME config option in the R6S defconfig.
>>
>> Please note that I was not able to test this device. I only chose to
>> add it due to it being a very similar implementation to the R6C, like the
>> NanoPi R5C and R5S are similar. It should however boot just fine and even
>> both RTL8125 Ethernet ports should work in U-Boot since RTL8125 is the
>> same chip used in the R6C, using the rtl8169 driver.
> 
> Hi Sebastian,
> 
> it looks like you forgot to include the hunk that includes the board
> config board/friendlyelec/nanopi-r6s-rk3588s/Kconfig into
> rk3588/Kconfig.

Yes indeed, thanks for catching this oversight! This is fixed in v3.

>> diff --git a/arch/arm/mach-rockchip/rk3588/Kconfig b/arch/arm/mach-rockchip/rk3588/Kconfig
>> index a9e400861a3..051d50e26f6 100644
>> --- a/arch/arm/mach-rockchip/rk3588/Kconfig
>> +++ b/arch/arm/mach-rockchip/rk3588/Kconfig
>> @@ -257,6 +257,7 @@ config TEXT_BASE
>>   source "board/edgeble/neural-compute-module-6/Kconfig"
>>   source "board/friendlyelec/nanopc-t6-rk3588/Kconfig"
>>   source "board/friendlyelec/nanopi-r6c-rk3588s/Kconfig"
>> +source "board/friendlyelec/nanopi-r6s-rk3588s/Kconfig"
>>   source "board/indiedroid/nova/Kconfig"
>>   source "board/pine64/quartzpro64-rk3588/Kconfig"
>>   source "board/turing/turing-rk1-rk3588/Kconfig"
> 
> Other than that, this appears to work great on my Nanopi R6S (with the
> device tree from linux-6.9), including all three network interfaces, but
> no working status leds for the rtl8169 ports.

Yes, I have noticed that too. Maybe this is a bug in the rtl8169 driver
from u-boot? Or maybe this can be fixed in the devicetree? Not sure.

> I have also noticed the
> minor inconvenience that only the first two interfaces are initialized
> with nonzero MAC addresses (because rockchip_setup_macaddr is hardcoded
> for two interfaces?):
> 
>> => pci enum
>> => net list
>> eth0 : ethernet@fe1c0000 7a:d9:6d:ad:cb:26 active
>> eth1 : eth_rtl8169 7a:d9:6d:ad:cb:27
>> eth2 : eth_rtl8169 00:00:00:00:00:00
> 
> I don't think this is a huge deal as it works fine when manually setting
> a MAC address and other boards with three or more interfaces (like the
> NanoPi R5S) also behave that way. What do you think?

Maybe this is a similar issue to this:
https://lore.kernel.org/u-boot/CAPDEroXsN03yKL3D-tCcfQqA6vde7P4t2GmwQq80vnLQJw+4YA@mail.gmail.com/T/

Solving this issue is beyond my current abilities unfortunately.

Cheers,
Sebastian
diff mbox series

Patch

diff --git a/arch/arm/dts/rk3588s-nanopi-r6s-u-boot.dtsi b/arch/arm/dts/rk3588s-nanopi-r6s-u-boot.dtsi
new file mode 100644
index 0000000000..853ed58cfe
--- /dev/null
+++ b/arch/arm/dts/rk3588s-nanopi-r6s-u-boot.dtsi
@@ -0,0 +1,3 @@ 
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+
+#include "rk3588s-u-boot.dtsi"
diff --git a/arch/arm/mach-rockchip/rk3588/Kconfig b/arch/arm/mach-rockchip/rk3588/Kconfig
index 4b7d751c6f..a9e400861a 100644
--- a/arch/arm/mach-rockchip/rk3588/Kconfig
+++ b/arch/arm/mach-rockchip/rk3588/Kconfig
@@ -90,6 +90,18 @@  config TARGET_NANOPI_R6C_RK3588S
 	  Type-A port, a HDMI port, a 30-pin GPIO header as well as some
 	  buttons and LEDs.
 
+config TARGET_NANOPI_R6S_RK3588S
+	bool "FriendlyElec NanoPi R6S"
+	select BOARD_LATE_INIT
+	help
+	  The NanoPi R6S is a SBC by FriendlyElec based on the Rockchip
+	  RK3588s.
+	  It comes with 4GB or 8GB of RAM, a microSD card slot, 32GB eMMC
+	  storage, one RTL8211F 1GbE and two RTL8125 2.5GbE Ethernet ports,
+	  one USB 2.0 Type-A and one USB 3.0 Type-A port, a HDMI port, a
+	  12-pin GPIO FPC connector, a fan connector, IR receiver as well
+	  as some buttons and LEDs.
+
 config TARGET_NOVA_RK3588
 	bool "Indiedroid Nova RK3588"
 	select BOARD_LATE_INIT
diff --git a/board/friendlyelec/nanopi-r6s-rk3588s/Kconfig b/board/friendlyelec/nanopi-r6s-rk3588s/Kconfig
new file mode 100644
index 0000000000..4d579816b1
--- /dev/null
+++ b/board/friendlyelec/nanopi-r6s-rk3588s/Kconfig
@@ -0,0 +1,12 @@ 
+if TARGET_NANOPI_R6S_RK3588S
+
+config SYS_BOARD
+	default "nanopi-r6s-rk3588s"
+
+config SYS_VENDOR
+	default "friendlyelec"
+
+config SYS_CONFIG_NAME
+	default "nanopi-r6s-rk3588s"
+
+endif
diff --git a/board/friendlyelec/nanopi-r6s-rk3588s/MAINTAINERS b/board/friendlyelec/nanopi-r6s-rk3588s/MAINTAINERS
new file mode 100644
index 0000000000..76288b4320
--- /dev/null
+++ b/board/friendlyelec/nanopi-r6s-rk3588s/MAINTAINERS
@@ -0,0 +1,7 @@ 
+NANOPI-R6S
+M:	Sebastian Kropatsch <seb-dev@mail.de>
+S:	Maintained
+F:	arch/arm/dts/rk3588s-nanopi-r6s-u-boot.dtsi
+F:	board/friendlyelec/nanopi-r6s-rk3588s
+F:	configs/nanopi-r6s-rk3588s_defconfig
+F:	include/configs/nanopi-r6s-rk3588s.h
diff --git a/configs/nanopi-r6s-rk3588s_defconfig b/configs/nanopi-r6s-rk3588s_defconfig
new file mode 100644
index 0000000000..f7b364655f
--- /dev/null
+++ b/configs/nanopi-r6s-rk3588s_defconfig
@@ -0,0 +1,82 @@ 
+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/rk3588s-nanopi-r6s"
+CONFIG_ROCKCHIP_RK3588=y
+CONFIG_SPL_SERIAL=y
+CONFIG_TARGET_NANOPI_R6S_RK3588S=y
+CONFIG_DEBUG_UART_BASE=0xFEB50000
+CONFIG_DEBUG_UART_CLOCK=24000000
+CONFIG_SYS_LOAD_ADDR=0xc00800
+CONFIG_PCI=y
+CONFIG_DEBUG_UART=y
+CONFIG_FIT=y
+CONFIG_FIT_VERBOSE=y
+CONFIG_SPL_FIT_SIGNATURE=y
+CONFIG_SPL_LOAD_FIT=y
+CONFIG_LEGACY_IMAGE_FORMAT=y
+CONFIG_DEFAULT_FDT_FILE="rockchip/rk3588s-nanopi-r6s.dtb"
+# CONFIG_DISPLAY_CPUINFO is not set
+CONFIG_DISPLAY_BOARDINFO_LATE=y
+CONFIG_SPL_MAX_SIZE=0x40000
+CONFIG_SPL_PAD_TO=0x7f8000
+# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
+CONFIG_SPL_ATF=y
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_PWM=y
+CONFIG_CMD_GPT=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_PCI=y
+CONFIG_CMD_USB=y
+CONFIG_CMD_ROCKUSB=y
+# CONFIG_CMD_SETEXPR is not set
+CONFIG_CMD_REGULATOR=y
+# CONFIG_SPL_DOS_PARTITION is not set
+CONFIG_SPL_OF_CONTROL=y
+CONFIG_OF_LIVE=y
+CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
+CONFIG_SPL_DM_SEQ_ALIAS=y
+CONFIG_SPL_REGMAP=y
+CONFIG_SPL_SYSCON=y
+CONFIG_SPL_CLK=y
+# CONFIG_USB_FUNCTION_FASTBOOT is not set
+CONFIG_ROCKCHIP_GPIO=y
+CONFIG_SYS_I2C_ROCKCHIP=y
+CONFIG_MISC=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_SPI_FLASH is not set
+CONFIG_PHY_REALTEK=y
+CONFIG_DWC_ETH_QOS=y
+CONFIG_DWC_ETH_QOS_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_SPL_PINCTRL=y
+CONFIG_PWM_ROCKCHIP=y
+CONFIG_SPL_RAM=y
+CONFIG_BAUDRATE=1500000
+CONFIG_DEBUG_UART_SHIFT=2
+CONFIG_SYS_NS16550_MEM32=y
+CONFIG_SYSRESET=y
+CONFIG_USB=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_GENERIC=y
+CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_OHCI_GENERIC=y
+CONFIG_USB_DWC3=y
+CONFIG_USB_DWC3_GENERIC=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET_DOWNLOAD=y
+CONFIG_USB_FUNCTION_ROCKUSB=y
+CONFIG_ERRNO_STR=y
diff --git a/doc/board/rockchip/rockchip.rst b/doc/board/rockchip/rockchip.rst
index a3d9837dda..0b58086f06 100644
--- a/doc/board/rockchip/rockchip.rst
+++ b/doc/board/rockchip/rockchip.rst
@@ -124,6 +124,7 @@  List of mainline supported Rockchip boards:
      - Edgeble Neural Compute Module 6B SoM - Neu6b (neu6b-io-rk3588)
      - FriendlyElec NanoPC-T6 (nanopc-t6-rk3588)
      - FriendlyElec NanoPi R6C (nanopi-r6c-rk3588s)
+     - FriendlyElec NanoPi R6S (nanopi-r6s-rk3588s)
      - Generic RK3588S/RK3588 (generic-rk3588)
      - Indiedroid Nova (nova-rk3588s)
      - Pine64 QuartzPro64 (quartzpro64-rk3588)
diff --git a/include/configs/nanopi-r6s-rk3588s.h b/include/configs/nanopi-r6s-rk3588s.h
new file mode 100644
index 0000000000..a1b19783c5
--- /dev/null
+++ b/include/configs/nanopi-r6s-rk3588s.h
@@ -0,0 +1,12 @@ 
+/* SPDX-License-Identifier: GPL-2.0+ */
+
+#ifndef __NANOPI_R6S_RK3588S_H
+#define __NANOPI_R6S_RK3588S_H
+
+#define ROCKCHIP_DEVICE_SETTINGS \
+		"stdout=serial,vidconsole\0" \
+		"stderr=serial,vidconsole\0"
+
+#include <configs/rk3588_common.h>
+
+#endif /* __NANOPI_R6S_RK3588S_H */