Skip to content

feat(boards): Add Seeed Studio reComputer RK3576/RK3588 DevKit support#9719

Merged
igorpecovnik merged 78 commits into
armbian:mainfrom
Seeed-Studio:main
Jun 5, 2026
Merged

feat(boards): Add Seeed Studio reComputer RK3576/RK3588 DevKit support#9719
igorpecovnik merged 78 commits into
armbian:mainfrom
Seeed-Studio:main

Conversation

@baorepo
Copy link
Copy Markdown

@baorepo baorepo commented Apr 24, 2026

Summary

Add board support for Seeed Studio's reComputer RK3576 DevKit and reComputer RK3588 DevKit to the Armbian build framework. These are industrial-grade single-board computers based on Rockchip RK3576 (octa-core A72/A53) and RK3588 (octa-core A76/A55) SoCs, targeting edge AI and IoT applications.

Board Support

  • reComputer RK3576 DevKit (config/boards/recomputer-rk3576-devkit.conf): RK3576 SoC, BOARDFAMILY=rk35xx, vendor kernel, custom bootscript, PCA953X GPIO expander, AD5398 DAC for fan control, X11 KMS on card0, ES8311 audio codec
  • reComputer RK3588 DevKit (config/boards/recomputer-rk3588-devkit.conf): RK3588 SoC, BOARDFAMILY=rockchip-rk3588, vendor kernel, custom bootscript, Mali-G610 GPU (libmali), Realtek r8125 Ethernet DKMS, multi-display audio naming (HDMI0/HDMI1/HDMI-In/DP0/ES8311)
  • Shared configuration (config/boards/recomputer-rk35xx-common.inc): Extracted ~300 lines of common hooks covering wireless, Bluetooth, USB gadget, security hardening, PATH, and OTA support. BT UART selection uses ${BOOT_SOC} case branching (rk3576→ttyS4, rk3588→ttyS6)

Hardware Support

  • Wireless: AIC8800 SDIO WiFi/BT with custom modprobe options and module loading; Morse FGH100M WiFi (HaLow) firmware and tools via GitHub releases
  • Bluetooth: Custom bluez package for FCS960K headset support; AIC8800 BT UART service with SoC-specific serial port selection
  • USB Gadget: Dual-mode ACM serial + RNDIS network gadget on usb0 (192.168.42.1/24) with dnsmasq DHCP, NetworkManager static IP, and serial console on ttyGS0 with proper systemd dependency handling
  • Security: SSH hardening, fail2ban, DHCP privacy (MAC randomization), Terrapin mitigation via security-hardening/recomputer-security.sh
  • USB Auto-mount: udev-based auto-mounting of USB storage under /media/seeed/LABEL
  • OTA: Recovery OTA and A/B dual-partition OTA with rollback support (via seeed_armbian_extension)
  • Encrypted Disk: LUKS root with OP-TEE auto-unlock (RK_AUTO_DECRYP=yes)
  • Camera: RKAIQ camera engine packages for both SoCs

Boot & Firmware

  • Custom U-Boot boot scripts (boot-seeed-rk3576.cmd, boot-seeed-rk35xx.cmd) with SPI flash boot support
  • U-Boot defconfigs for both boards (EEPROM boot, I2C config, HDMI voltage swing patches)
  • Device trees: rk3576-recomputer-rk3576-devkit.dts, rk3588-recomputer-rk3588-devkit.dts
  • Kernel config additions: AD5398 DAC, PCA953X GPIO, fan control for RK3576

Build Framework Integration

  • lib/functions/compilation/patch/drivers_network.sh: Driver harness integration for Morse wireless FGH100M kernel module
  • lib/functions/compilation/patch/drivers-harness.sh: Hook for Morse driver build
  • External extension system: ENABLE_SEEED_RK_EXTENSION=yes clones seeed_armbian_extension from GitHub for OTA, encryption, and secure boot features

Changed Files

File Description
config/boards/recomputer-rk3576-devkit.conf RK3576 board config (113 lines)
config/boards/recomputer-rk3588-devkit.conf RK3588 board config (107 lines)
config/boards/recomputer-rk35xx-common.inc Shared hooks for both boards (305 lines)
config/bootscripts/boot-seeed-rk3576.cmd RK3576 U-Boot boot script
config/bootscripts/boot-seeed-rk35xx.cmd RK3588 U-Boot boot script
config/kernel/linux-rk35xx-vendor.config Kernel config: AD5398, PCA953X, fan
patch/kernel/rockchip-rk35xx-legacy/ RK3576 DTS, fan curve, camera engine
patch/kernel/rockchip-rk3588-legacy/ RK3588 DTS, HDMI voltage, camera engine
patch/kernel/rockchip64-7.0/ Upstream kernel patch refresh
patch/misc/wireless-fgh100m.patch Morse FGH100M HaLow WiFi driver
patch/u-boot/* U-Boot defconfigs, EEPROM boot, flash patches
lib/functions/compilation/patch/ Morse driver build integration

How to Test

# RK3576  build
 ./compile.sh \                                                                                        
      BOARD=recomputer-rk3576-devkit \                                  
      BRANCH=vendor \                                                                                   
      RELEASE=bookworm \                                                                                
      BUILD_MINIMAL=no \                                                                                
      BUILD_DESKTOP=yes \                                                                               
      KERNEL_CONFIGURE=no \                                                                             
      ENABLE_SEEED_RK_EXTENSION=yes \                                                                   
      OTA_ENABLE=no \                                                                                   
      DESKTOP_ENVIRONMENT=gnome \                                      
      DESKTOP_ENVIRONMENT_CONFIG_NAME=config_base \                                                     
      DESKTOP_APPGROUPS_SELECTED=browsers

Serial console: minicom -b 1500000 -D /dev/ttyUSB0

Summary by CodeRabbit

  • New Features

    • Added first-class support for Seeed reComputer RK3576 and RK3588 DevKit boards (boot, device trees, and U-Boot configs).
    • On-image integration of Seeed APT packages to enable GPU drivers, camera engine, Bluetooth/Wi‑Fi, and firmware.
  • Enhancements

    • Automatic board DTB selection at boot via EEPROM, improved bootargs handling, and USB gadget/network defaults.
    • Audio device renaming, Wayland disabled for GDM, suspend/hibernation disabled, and USB auto-mounting for partitions.

Review Change Stack

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 24, 2026

Important

Review skipped

Auto reviews are limited based on label configuration.

🏷️ Required labels (at least one) (1)
  • Needs review

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 00503b2e-090d-44a0-8540-d4f2126bdfd0

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds Seeed reComputer RK3576 and RK3588 support: shared vendor provisioning and image hooks, board configs installing Mali/camera packages and audio/system tweaks, U-Boot device trees enabling regulators/PCIe/USB, and a bootscript that selects DTB via EEPROM and applies DT overlays.

Changes

Seeed reComputer RK35xx Board Integration

Layer / File(s) Summary
Shared RK35xx vendor infrastructure and image customization
config/sources/vendors/seeed-studio/recomputer-rk35xx-common.inc
Configures Seeed APT repo and installer helper, installs Seeed packages (including fcs960k-aic-bluez with conflict-reinstall handling), configures AIC8800 wireless/bluetooth, fetches MorseMicro firmware, enables USB gadget networking and DE-agnostic USB automount, prepends sbin to PATH, disables GDM auto-login, applies RK35xx kernel .config tweaks, stages Seeed kernel patches, and fetches/enables seeed_armbian_extension when requested.
RK3576 board configuration and U-Boot device tree
config/boards/recomputer-rk3576-devkit.conf, patch/u-boot/legacy/u-boot-radxa-rk35xx/dt/rk3576-recomputer-rk3576-devkit.dts
Defines RK3576 board metadata and enables radxa-aic8800; hooks set bootscript mapping, install Mali-G52 and RK3576 camera engine, add audio udev renames, force GDM X11, and disable suspend/hibernation. U-Boot DTS configures 3.3V regulators with GPIO control, enables I2C4 EEPROM, combphy0 and PCIe0 with reset GPIO, SPI flash and SD/MMC pinctrl, USB OTG DRD, and fSPI pinctrl entries.
RK3588 board configuration and U-Boot device tree
config/boards/recomputer-rk3588-devkit.conf, patch/u-boot/legacy/u-boot-radxa-rk35xx/dt/rk3588-recomputer-rk3588-devkit.dts
Defines RK3588 board metadata with AIC8800 SDIO type; hooks install Mali Valhall G610 and RK3588 camera engine, add multi-endpoint audio udev renames, and disable armbian-hardware-optimize.service. U-Boot DTS adds ADC keys, fixed regulators and GPIO-controlled power/clock rails, I2C4 EEPROM, multiple combphy and PCIe links with resets and supplies, USB PHYs and DWC3 host controllers, and pinctrl entries for EEPROM/USB/PCIe.
U-Boot bootscript with EEPROM-based DTB selection
config/bootscripts/boot-seeed-rk35xx.cmd
Adds a unified Seeed RK35xx boot script that loads/imports armbianEnv.txt, optionally reads EEPROM over I2C4 (addr 0x57) to choose RK3576 vs RK3588 DTB, composes bootargs (root, rootfstype, ubootpart, cryptdevice, docker cgroup), loads kernel/initrd/DTB, applies kernel and user .dtbo overlays with rollback on failure, optionally runs overlay fixups, attempts kaslrseed, and boots with booti.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • armbian/build#9879: Related AIC8800 wireless/Bluetooth integration and radxa-aic8800 extension enablement.

Suggested reviewers

  • igorpecovnik
  • HeyMeco
  • prahal
  • SuperKali
  • paolosabatino
  • joekhoobyar
  • amazingfate
  • Tonymac32

Poem

🐰 I hopped through configs, patches, and DTC,
Picked Mali drivers and a camera key;
An EEPROM whispers which tree to load,
USB gadgets hum along the road—
Seeed boards born for Armbian's tree!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: adding support for two Seeed Studio reComputer boards (RK3576 and RK3588 DevKit) to Armbian.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions github-actions Bot added size/large PR with 250 lines or more 05 Milestone: Second quarter release Needs review Seeking for review Hardware Hardware related like kernel, U-Boot, ... Framework Framework components Patches Patches related to kernel, U-Boot, ... labels Apr 24, 2026
Comment thread config/boards/recomputer-rk3576-devkit.conf Outdated
@armbian armbian deleted a comment from github-actions Bot Apr 24, 2026
@armbian armbian deleted a comment from github-actions Bot Apr 24, 2026
@armbian armbian deleted a comment from github-actions Bot Apr 24, 2026
Comment thread config/boards/recomputer-rk3576-devkit.conf Outdated
Comment thread config/boards/recomputer-rk3576-devkit.conf Outdated
Comment thread config/boards/recomputer-rk3588-devkit.conf Outdated
Comment thread config/boards/recomputer-rk3588-devkit.conf Outdated
Comment thread lib/functions/compilation/patch/drivers-harness.sh Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

♻️ Duplicate comments (5)
lib/functions/compilation/patch/drivers_network.sh (1)

926-940: ⚠️ Potential issue | 🟠 Major

Move FGH100M integration to an extension, and until then scope it to the affected families.

Two concerns on this new harness entry:

  1. Per earlier reviewer feedback on the companion file, out-of-tree drivers should be added as an extension, not by extending drivers_network.sh / drivers-harness.sh. Because this entire file is hashed into the drivers cache key, any change here invalidates the drivers-patch cache for every kernel/family across the framework — adding a Seeed-specific driver here pays that cost for every build.

  2. Unconditional scope — unlike the surrounding out-of-tree drivers (e.g., driver_rtl8852bs guards on LINUXFAMILY in spacemit|rk35xx|rockchip64, driver_uwe5622 guards on sun*|rockchip64|rk35xx, driver_rtl88x2cs guards on meson64), this one only gates on kernel version ≥6.1. That means the FGH100M patch/misc/wireless-fgh100m.patch will be applied and drivers/net/wireless/fgh100m/ added to the Makefile/Kconfig on every kernel build the driver harness runs against, including families that have nothing to do with the Morse FGH100M HaLow module. If the patch doesn't apply cleanly on some family kernel, it'll break that board's build; if it does apply, you're injecting a driver directory into unrelated images.

Until migration to an extension is done, please at minimum add the family guard, matching how the Morse module is actually wired (Seeed RK35xx boards):

🛠️ Minimal interim scoping
 driver_fgh100m() {
-
-    if linux-version compare "${version}" ge 6.1; then
+	if linux-version compare "${version}" ge 6.1 && [[ "${LINUXFAMILY}" == rk35xx || "${LINUXFAMILY}" == rockchip-rk3588 ]]; then
         display_alert "Adding" "MorseMicro FG-H100M WiFi (MORSE) driver patch for kernel ${version}" "info"
         process_patch_file "${SRC}/patch/misc/wireless-fgh100m.patch" "applying"
-        # Add to section Makefile (append, like other drivers)
         echo "obj-\$(CONFIG_WLAN_VENDOR_MORSE) += fgh100m/" >> "$kerneldir/drivers/net/wireless/Makefile"
-        # Add to wireless Kconfig (insert after a stable anchor, like other drivers)
         sed -i '/source "drivers\/net\/wireless\/ti\/Kconfig"/a source "drivers\/net\/wireless\/fgh100m\/Kconfig"' \
             "$kerneldir/drivers/net/wireless/Kconfig"
     fi
 }

Also note the function body is indented with 4 spaces whereas the rest of this file uses tabs — please align style.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/functions/compilation/patch/drivers_network.sh` around lines 926 - 940,
The driver_fgh100m function unconditionally injects an out-of-tree driver for
all families and uses spaces for indentation; scope it to the affected families
and fix indentation: wrap the existing checks so the body only runs when both
the kernel version check and a family guard (e.g., LINUXFAMILY matches rk35xx—or
the same family set you use for other Morse drivers) are true, keep the call to
process_patch_file("${SRC}/patch/misc/wireless-fgh100m.patch"), the Makefile
echo and the sed Kconfig insertion, and convert the function body indentation to
tabs; also add a TODO comment to move this integration into an extension (so
reviewers know it's temporary).
config/boards/recomputer-rk3588-devkit.conf (2)

4-4: ⚠️ Potential issue | 🟠 Major

BOARD_MAINTAINER must be a GitHub user ID of a named individual, not a company name.

Per the Armbian Board Support Rules linked in the past review, .conf (standard-supported) boards require a named individual maintainer with a GitHub ID. "seeed studio" is neither an individual nor a GitHub handle. Without a qualifying maintainer, the board does not qualify for standard support and should either be renamed to a valid GitHub handle or the file moved to .csc (community supported).

As per coding guidelines/learnings: ".wip and .conf extensions require BOARD_MAINTAINER to be present and contain at least one maintainer. If no maintainer is present, ... it does not qualify for standard support and must be moved to community support (.csc extension)."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@config/boards/recomputer-rk3588-devkit.conf` at line 4, The BOARD_MAINTAINER
value "seeed studio" is not an individual GitHub user ID as required; update the
BOARD_MAINTAINER entry to a real GitHub handle of a named individual (e.g.,
replace "seeed studio" with the maintainer's GitHub username) so the .conf board
qualifies for standard support, or if no individual maintainer exists move the
board to community support by changing the file to a .csc variant and/or
remove/adjust BOARD_MAINTAINER accordingly.

56-90: ⚠️ Potential issue | 🟠 Major

Board-level kernel config changes break cross-board kernel package consistency.

custom_kernel_config__* and kernel_config_set_* are tied to LINUXFAMILY/BOARDFAMILY, not individual boards. Because BOARDFAMILY="rockchip-rk3588" is shared with other boards that will consume the same kernel .deb from the apt repo, applying these toggles here causes inconsistent kernel packages depending on which board triggered the build. Move these config toggles into a family-level overlay (config/kernel/linux-rockchip-rk3588-*.config or config/sources/families/*.inc) instead of the board .conf.

As per coding guidelines/learnings: "do not use kernel_config_set, kernel_config_set_m, kernel_config_set_y, or custom_kernel_config__ functions to modify kernel configuration. Kernel configuration is associated with LINUXFAMILY/BOARDFAMILY, not individual BOARD. ... Kernel configuration changes must be made in the appropriate kernel config file ... or in family configuration files ... instead."*

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@config/boards/recomputer-rk3588-devkit.conf` around lines 56 - 90, The
board-specific function custom_kernel_config__recomputer_rk3588_customizations
and its kernel_config_set_*/kernel_config_set_m/y/n calls must be removed from
the board .conf and relocated to the Rockchip family-level kernel config (e.g.,
add the toggles to config/kernel/linux-rockchip-rk3588-*.config or the family
include under config/sources/families/*.inc) so the kernel options
(CONFIG_RTC_DRV_PCF8563, CONFIG_MORSE_*, CONFIG_VIDEO_*,
CONFIG_NVMEM_ROCKCHIP_OTP, CONFIG_DRM_PANFROST/PANTHOR,
CONFIG_NET_VENDOR_REALTEK, CONFIG_SENSORS_PWM_FAN, etc.) are applied per
LINUXFAMILY/BOARDFAMILY and not per individual BOARD; remove the
custom_kernel_config__recomputer_rk3588_customizations function and its
kernel_config_set_* invocations from the board file after migrating the
settings.
config/boards/recomputer-rk3576-devkit.conf (2)

5-5: ⚠️ Potential issue | 🟠 Major

BOARD_MAINTAINER should be a GitHub user ID of a named individual.

.conf (standard-supported) boards must list a named individual maintainer by GitHub handle, not a company name. If no individual maintainer can be committed to long-term support of this board, the file should be moved to .csc (community supported) instead.

As per coding guidelines/learnings: ".wip and .conf extensions require BOARD_MAINTAINER to be present and contain at least one maintainer. If no maintainer is present, ... it does not qualify for standard support and must be moved to community support (.csc extension)."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@config/boards/recomputer-rk3576-devkit.conf` at line 5, The BOARD_MAINTAINER
entry currently contains a company name; update the BOARD_MAINTAINER value to a
real GitHub user handle of a named individual who will maintain this board
(e.g., set BOARD_MAINTAINER="githubHandle") so the .conf file meets
standard-supported requirements, or if no individual maintainer can be
committed, convert this configuration to a community-supported file by
renaming/adapting it to the .csc format instead of keeping it as a .conf.

40-67: ⚠️ Potential issue | 🟠 Major

Board-level kernel config changes break cross-board kernel package consistency.

This hook modifies kernel .config at the board level, but kernel configuration is associated with LINUXFAMILY/BOARDFAMILY in the Armbian build system — other boards in the rk35xx family will consume the same kernel .deb from the apt repo, so whichever board triggered the build determines the final kernel content. This yields inconsistent published packages.

Move these toggles to config/kernel/linux-rk35xx-vendor.config (or the appropriate family .inc) so they apply consistently to every board in the family.

As per coding guidelines/learnings: "do not use kernel_config_set, kernel_config_set_m, kernel_config_set_y, or custom_kernel_config__ functions to modify kernel configuration. Kernel configuration is associated with LINUXFAMILY/BOARDFAMILY, not individual BOARD. ... Kernel configuration changes must be made in the appropriate kernel config file ... or in family configuration files ... instead."*

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@config/boards/recomputer-rk3576-devkit.conf` around lines 40 - 67, The
custom_kernel_config__recomputer_rk3576_customizations function is modifying
kernel .config at the board level using
kernel_config_set_y/kernel_config_set_m/kernel_config_set_val, which must
instead live in the rk35xx family/kernel config; move all toggles
(CONFIG_GPIO_PCA953X, CONFIG_RTC_DRV_PCF8563, CONFIG_WLAN_VENDOR_MORSE,
CONFIG_MORSE_SPI, CONFIG_MORSE_USER_ACCESS, CONFIG_MORSE_VENDOR_COMMAND,
CONFIG_MORSE_MONITOR, CONFIG_MAC80211_MESH, CONFIG_MORSE_DEBUG_MASK,
CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_V2, CONFIG_VIDEO_IMX708,
CONFIG_VIDEO_DW9800W, CONFIG_REGULATOR_AD5398, CONFIG_SENSORS_PWM_FAN) out of
custom_kernel_config__recomputer_rk3576_customizations and add equivalent
settings to the family-level kernel config (e.g.,
config/kernel/linux-rk35xx-vendor.config or the rk35xx .inc) so the kernel
package is consistent across the rk35xx LINUXFAMILY/BOARDFAMILY builds.
🧹 Nitpick comments (10)
patch/u-boot/legacy/u-boot-radxa-rk35xx/dt/rk3588-recomputer-rk3588-devkit.dts (1)

44-53: Drop commented-out DT blocks before merge.

There are several dead commented-out blocks (vcc5v0_sys node at lines 44–53, // startup-delay-us at lines 73/85, // vpcie3v3-supply at lines 158/178). These should be deleted so the final DTS reflects the intended hardware configuration without ambiguity about "is this supposed to be enabled?". If some of them are meant for future enablement, note that in a single /* TODO */ comment at the top of the affected node instead.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@patch/u-boot/legacy/u-boot-radxa-rk35xx/dt/rk3588-recomputer-rk3588-devkit.dts`
around lines 44 - 53, Remove all dead commented-out device-tree blocks so the
DTS is unambiguous: delete the commented node for vcc5v0_sys (the block
containing "vcc5v0_sys" / "vcc5v0-sys"), remove the commented "startup-delay-us"
entries, and remove the commented "vpcie3v3-supply" blocks; if any of these are
intentionally retained for future use, replace the entire commented block with a
single inline TODO comment at the top of the affected node (e.g., "/* TODO:
re-enable vcc5v0_sys if needed */") rather than leaving large commented code
sections.
patch/u-boot/legacy/u-boot-radxa-rk35xx/board_recomputer-rk3588-devkit/0001-change-hdmi-voltage-swing.patch (1)

22-30: Remove the commented-out 0x2f register writes.

The previous voltage-swing values are preserved as // comments next to the new 0x20 writes, which is effectively dead code in a production HDMI PHY init sequence. Either delete the commented lines, or if the intent is to document the prior tuning, reduce it to a single explanatory comment above the block (e.g., "voltage-swing lowered from 0x2f to 0x20 for RK3588 reComputer HDMI signal integrity"). Makes future rebases against the vendor driver cleaner.

♻️ Proposed cleanup
-	// voltage-swing 
-	// hdptx_write(hdptx, LANE_REG0303, 0x2f);
-	// hdptx_write(hdptx, LANE_REG0403, 0x2f);
-	// hdptx_write(hdptx, LANE_REG0503, 0x2f);
-	// hdptx_write(hdptx, LANE_REG0603, 0x2f);
+	/* voltage-swing: lowered from 0x2f to 0x20 for reComputer RK3588 */
 	hdptx_write(hdptx, LANE_REG0303, 0x20);
 	hdptx_write(hdptx, LANE_REG0403, 0x20);
 	hdptx_write(hdptx, LANE_REG0503, 0x20);
 	hdptx_write(hdptx, LANE_REG0603, 0x20);
-	// pre-shoot
+	/* pre-shoot */
 	hdptx_write(hdptx, LANE_REG0305, 0x03);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@patch/u-boot/legacy/u-boot-radxa-rk35xx/board_recomputer-rk3588-devkit/0001-change-hdmi-voltage-swing.patch`
around lines 22 - 30, Remove the dead commented-out register writes and leave
only the active hdptx_write calls: delete the four lines with "//
hdptx_write(hdptx, LANE_REG0[3-6]03, 0x2f);" and, if desired, replace them with
a single concise comment above the block like "voltage-swing lowered from 0x2f
to 0x20 for RK3588 reComputer HDMI signal integrity" so the change is documented
while keeping the active hdptx_write(hdptx, LANE_REG0303, 0x20),
hdptx_write(hdptx, LANE_REG0403, 0x20), hdptx_write(hdptx, LANE_REG0503, 0x20),
hdptx_write(hdptx, LANE_REG0603, 0x20) lines intact.
patch/u-boot/legacy/u-boot-radxa-rk35xx/board_recomputer-rk3588-devkit/0002-fix-download-devtype-reinit.patch (1)

1-21: Duplicate of the RK3576 counterpart — consider deduplicating.

This patch is byte-identical to patch/u-boot/legacy/u-boot-radxa-rk35xx/board_recomputer-rk3576-devkit/0002-fix-download-devtype-reinit.patch. Since both boards share the u-boot-radxa-rk35xx tree, consider placing shared fixes in a common patch/u-boot/legacy/u-boot-radxa-rk35xx/ directory (applied to both boards) rather than maintaining two copies. Not blocking, but reduces future drift.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@patch/u-boot/legacy/u-boot-radxa-rk35xx/board_recomputer-rk3588-devkit/0002-fix-download-devtype-reinit.patch`
around lines 1 - 21, The same change to boot_devtype_init (adding need_reinit
logic) is duplicated across two board-specific patches; remove the duplicate by
extracting the shared edit into a single patch placed under the
u-boot-radxa-rk35xx common patch directory and delete the board-specific copy;
update the patch series/manifest to reference only the new common patch and
ensure the patch header/description mentions both rk3576 and rk3588 boards so
the single patch applies to both trees and prevents future drift.
config/bootscripts/boot-seeed-rk35xx.cmd (2)

52-52: EEPROM signature check is correct but brittle; consider documenting.

The six-byte ASCII magic "rk35xx" (0x72 0x6b 0x33 0x35 0x78 0x78) is matched byte-by-byte via setexpr.b — functional, but any future bump to a 7+ byte magic or a different vendor prefix will silently fall through to the fallback path. A short comment above line 52 documenting that these literals correspond to the ASCII bytes of "rk35xx" (and similarly for "00A0"/"00B0" at 63/68) would help future maintainers.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@config/bootscripts/boot-seeed-rk35xx.cmd` at line 52, Add a brief inline
comment above the if condition that checks ee0..ee5 (the line starting with if
test "${ee0}" = "0x72" && test "${ee1}" = "0x6b" && test "${ee2}" = "0x33" &&
test "${ee3}" = "0x35" && test "${ee4}" = "0x78" && test "${ee5}" = "0x78";
then) documenting that those hex literals are the ASCII bytes for "rk35xx", and
note that this byte-by-byte check is brittle (will not handle longer/future
magic strings) and point maintainers to the analogous checks for "00A0"/"00B0"
(the comparisons around ee* at the later checks) so they know to update comments
or logic if the EEPROM signature changes.

1-146: Significant duplication with boot-seeed-rk3576.cmd.

This script and config/bootscripts/boot-seeed-rk3576.cmd differ only in load_addr (0x9000000 vs 0x48000000) and the default fdtfile fallback. The EEPROM detection logic supports both RK3576 (00A0) and RK3588 (00B0) in both files. Maintaining two near-identical 146-line scripts is a long-term bug magnet — any overlay/bootargs/fixup change has to be kept in sync by hand.

Consider either:

  • Keeping a single boot-seeed-rk35xx.cmd and setting the SoC-specific load_addr/fallback fdtfile via board-env (or armbianEnv.txt), and pointing both boards' BOOTSCRIPT at it; or
  • Generating one from the other via sed at build time.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@config/bootscripts/boot-seeed-rk35xx.cmd` around lines 1 - 146, There is
duplicate boot script logic between boot-seeed-rk35xx.cmd and
boot-seeed-rk3576.cmd; consolidate them by creating a single shared
boot-seeed-rk35xx.cmd that reads SoC-specific values from board environment
(armbianEnv.txt) instead of hardcoding load_addr and fallback fdtfile: keep the
EEPROM detection and overlay/bootargs logic as-is (symbols: eeprom_dtb_select,
eeprom_dtb_matched, overlays, user_overlays, fdtfile, load_addr, bootargs) and
change initialization so load_addr and the default fdtfile are set from
environment variables (or fall back to sensible defaults) and ensure BOOTSCRIPT
for each board points to the shared script; alternatively implement a build-time
generator that produces the board-specific file by replacing load_addr and
fallback fdtfile when packaging.
config/boards/recomputer-rk3588-devkit.conf (2)

1-1: Expand the first-line hardware description and add a space after #.

Per coding guidelines, the first-line comment in a board config is shown during interactive compilation and must list SoC model, core count, RAM options, and key features (connectivity, storage, notable IO). The current line omits storage/connectivity (eMMC, NVMe/PCIe, GbE, USB3, HDMI, WiFi/BT) and uses #Seeed without the customary space after #.

✏️ Suggested revision
-#Seeed Studio Rockchip RK3588 octa core 4/8/16GB RAM SoC
+# Seeed Studio reComputer RK3588 DevKit octa core 4/8/16GB RAM eMMC NVMe GbE USB3 HDMI WiFi BT

As per coding guidelines/learnings: "the first line comment in Armbian board configuration files ... must specify: SoC model, core count, RAM options, and key features (connectivity options, storage interfaces, special features). This text is used during interactive compilation, so accuracy and completeness matter."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@config/boards/recomputer-rk3588-devkit.conf` at line 1, Update the first-line
comment currently "#Seeed Studio Rockchip RK3588 octa core 4/8/16GB RAM SoC" to
include a leading space after "#" and expand it to list SoC model, core count,
RAM options and key features (storage and connectivity) — e.g. mention eMMC,
NVMe/PCIe, GbE, USB3, HDMI, WiFi/BT — so the board header in
recomputer-rk3588-devkit.conf clearly reads like: "# Seeed Studio Rockchip
RK3588 octa-core, 4/8/16GB RAM — eMMC, NVMe/PCIe, Gigabit Ethernet, USB3, HDMI,
WiFi/BT". Ensure you replace the existing string exactly and keep formatting as
a single-line comment.

96-101: Quote $SDCARD expansions to avoid word-splitting on path changes.

Minor robustness nit: $SDCARD expansions on these lines are unquoted. While unlikely today, future directory changes with spaces would break the redirections. Prefer "${SDCARD}/etc/udev/rules.d/".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@config/boards/recomputer-rk3588-devkit.conf` around lines 96 - 101, The mkdir
and echo lines use an unquoted $SDCARD variable which can break redirections if
the directory contains spaces; update the usages in the mkdir -p and all echo >>
redirections that write to 90-naming-audios.rules to use a quoted expansion of
the variable (e.g., "${SDCARD}/etc/udev/rules.d/") so the path is safe from
word-splitting.
patch/u-boot/legacy/u-boot-radxa-rk35xx/defconfig/recomputer-rk3576-devkit_defconfig (2)

237-237: Trailing whitespace.

CONFIG_AVB_LIBAVB_ATX=y has a trailing space; trivial but worth cleaning up so the line is byte-identical to the equivalent entry in the RK3588 defconfig.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@patch/u-boot/legacy/u-boot-radxa-rk35xx/defconfig/recomputer-rk3576-devkit_defconfig`
at line 237, The line containing CONFIG_AVB_LIBAVB_ATX has trailing whitespace;
remove the trailing space so the entry is exactly "CONFIG_AVB_LIBAVB_ATX=y" (no
trailing whitespace) to match the RK3588 defconfig and ensure byte-identical
config entries. Target the line with the symbol CONFIG_AVB_LIBAVB_ATX in the
defconfig and delete the extra space at the end of the line.

45-45: Use the canonical "is not set" form instead of =n.

U-Boot defconfigs conventionally disable an option with # CONFIG_FOO is not set rather than CONFIG_FOO=n. The =n form is not wrong at parse time for bool symbols but will be rewritten by savedefconfig and is inconsistent with the rest of this file (e.g., # CONFIG_SPL_SYS_DCACHE_OFF is not set). For easier diffing against upstream and future savedefconfig regeneration:

✏️ Suggested revision
-CONFIG_SPL_UFS_SUPPORT=n
+# CONFIG_SPL_UFS_SUPPORT is not set
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@patch/u-boot/legacy/u-boot-radxa-rk35xx/defconfig/recomputer-rk3576-devkit_defconfig`
at line 45, Replace the boolean disablement line for CONFIG_SPL_UFS_SUPPORT so
it uses the canonical "is not set" form; locate the CONFIG_SPL_UFS_SUPPORT entry
and change the current `CONFIG_SPL_UFS_SUPPORT=n` style to the conventional `#
CONFIG_SPL_UFS_SUPPORT is not set` line to match the rest of the defconfig and
avoid savedefconfig churn.
config/boards/recomputer-rk3576-devkit.conf (1)

1-1: Expand the first-line hardware description and add a space after #.

Per coding guidelines, this one-line comment surfaces during interactive compilation and should describe hardware in detail: SoC + cores + RAM options + connectivity + storage + notable IO (eMMC, NVMe/PCIe, GbE, USB3, HDMI, WiFi/BT/HaLow, etc.).

✏️ Suggested revision
-#Seeed Studio Rockchip RK3576 octa core 4/8/16GB RAM SoC
+# Seeed Studio reComputer RK3576 DevKit octa core 4/8/16GB RAM eMMC NVMe GbE USB3 HDMI WiFi BT HaLow

As per coding guidelines/learnings: "the first line comment ... must specify: SoC model, core count, RAM options, and key features (connectivity options, storage interfaces, special features). This text is used during interactive compilation, so accuracy and completeness matter."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@config/boards/recomputer-rk3576-devkit.conf` at line 1, Replace the terse
first-line comment "#Seeed Studio Rockchip RK3576 octa core 4/8/16GB RAM SoC"
with an expanded hardware description and add a space after the '#'; the new
single-line header should state the SoC model (Rockchip RK3576), core count
(octa‑core), RAM options (4/8/16GB), and key features such as storage interfaces
(eMMC, NVMe/PCIe), networking (GbE, Wi‑Fi/BT/HaLow), USB/HDMI I/O and any
notable peripherals present on the Recomputer RK3576 devkit so it can be shown
during interactive compilation.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@config/boards/recomputer-rk3588-devkit.conf`:
- Around line 32-53: Update the seeed_recomputer_download_and_install_deb flow
in recomputer-rk35xx-common.inc to verify downloaded .deb integrity and fail
noisily: modify the helper so callers like
pre_install_distribution_specific__recomputer_rk3588_install_libmali,
pre_install_distribution_specific__recomputer_rk3588_install_r8125_dkms, and
pre_install_distribution_specific__recomputer_rk3588_install_camera_engine pass
an expected SHA256 (or the helper looks it up), then after download compute and
compare the SHA256 and abort with a clear error if it mismatches or the download
is not a valid .deb; also handle HTTP errors (non-200/HTML responses) and return
non-zero on failure. Prefer switching the download to Armbian’s fetch_from_repo
/ GIT_FIXED_WORKDIR pattern or otherwise host/pin assets to ensure reproducible
builds and update the helper to use that pattern when a fixed commit/tag is
provided.

In `@config/sources/vendors/seeed-studio/recomputer-rk35xx-common.inc`:
- Around line 44-79: The current
pre_install_distribution_specific__recomputer_install_morse_tools unpacks debs
with dpkg-deb and cp (dpkg-deb -x ... and cp ... "${SDCARD}/"), which leaves
files orphaned outside the dpkg database; instead download the .deb URLs and
install them through the existing package install helpers (e.g.
seeed_recomputer_download_and_install_deb or install_deb_chroot /
install_deb_chroot_via_chroot) so the packages are installed via dpkg in the SD
card chroot, run maintainer scripts, update triggers/ldconfig, and register
files with apt/dpkg; replace the dpkg-deb/cp flow in
pre_install_distribution_specific__recomputer_install_morse_tools with calls to
those helpers and ensure errors are handled similarly to the other deb installs.
- Around line 230-232: The chown call hardcodes seeed:seeed (in the block using
mount -o noatime "$DEV" "$MPOINT" and the subsequent chown seeed:seeed
"$MPOINT"), which may not exist on the image; change this to either create the
seeed user/group before chown or — preferably — detect a real target user (use
SUDO_USER or determine the first non-root user/UID on the system at mount time),
resolve its uid/gid and call chown with that uid:gid for "$MPOINT" (fall back to
creating the seeed user via useradd if no suitable existing user is found), and
remove/suppress the 2>/dev/null on the chown error so failures are visible
during setup.
- Around line 216-243: The script's use of eval on the udev property output (the
usb-automount script line with eval "$(udevadm info ... | grep -E
'^ID_FS_LABEL_ENC=|^ID_MODEL=')" ) allows a malicious device to inject shell
code via ID_MODEL/ID_FS_LABEL_ENC; replace the eval with a safe parser: read
udevadm output line-by-line (e.g., while IFS= read -r line; do case "$line" in
ID_FS_LABEL_ENC=*) value="${line#ID_FS_LABEL_ENC=}" ;; ID_MODEL=*)
value="${line#ID_MODEL=}" ;; esac; done), strip any surrounding quotes, and then
sanitize LABEL (remove/control characters and shell metacharacters like
backticks, $(), ;, \, newlines — e.g., tr -d '\000-\037' and tr -cd '[:alnum:]
_-.' or sed to collapse spaces) before using it to build MPOINT; keep the rest
of usb-automount logic but ensure LABEL is never subject to shell expansion or
eval and always used quoted.
- Around line 6-24: Update the function
seeed_recomputer_download_and_install_deb to (1) accept or determine an expected
SHA256 (e.g., a new fourth argument or sidecar .sha256 file) and after download
verify the checksum with sha256sum before installing; (2) download into a
temporary path (use deb_file + .tmp) with wget using a timeout and retry flags
(e.g., --timeout=30 --tries=3), rm -f the temp file on any wget failure so
partial files aren't left behind, and only mv the temp to deb_file on success;
and (3) only call install_deb_chroot("${deb_file}", ...) after the checksum
passes, logging clear error messages via display_alert on download, checksum
mismatch, or install failures. Ensure references to deb_file,
SRC/cache/download, wget invocation, and install_deb_chroot are updated
accordingly.
- Around line 287-299: The current top-level clone/pull and enable_extension
calls run network I/O during config sourcing; move them into a deferred hook so
fetching happens in the proper build phase. Create a hook function (e.g.,
fetch_sources_tools__seeed_rk_extension_clone or
post_family_config__seeed_rk_extension_clone) that checks
ENABLE_SEEED_RK_EXTENSION and performs the git clone/pull into
${SRC}/extensions/seeed_armbian_extension with proper error handling, and call
enable_extension "seeed_armbian_extension" from inside that hook instead of at
top-level; keep the .inc file free of side-effectful network operations so
config parsing remains deterministic.

In
`@patch/u-boot/legacy/u-boot-radxa-rk35xx/dt/rk3576-recomputer-rk3576-devkit.dts`:
- Around line 20-29: The press-threshold-microvolt on the volumeup-key node is
using the wrong units (1750 µV) so the key never registers; update the property
press-threshold-microvolt in the volumeup-key node to the correct microvolt
value (1750000) to match the keyup-threshold-microvolt pattern (e.g.,
keyup-threshold-microvolt = <1800000>) so the VOL+ press region is around 1.75
V.

In
`@patch/u-boot/legacy/u-boot-radxa-rk35xx/dt/rk3588-recomputer-rk3588-devkit.dts`:
- Around line 13-14: The compatible property contains an invalid string with
spaces; update the compatible entry so it is a single token without whitespace
(e.g., replace the value used in the compatible property with a hyphenated token
like "seeed,recomputer-rk3588-devkit") while keeping the existing secondary
compatible "rockchip,rk3588"; locate the compatible property in the DTS (the
compatible = ... line) and change only that string to the hyphenated form to
match DT conventions and sibling RK3576 DTS.
- Around line 25-30: The press-threshold-microvolt value in the volumeup-key
node is using microvolts but was written as <1750> (1,750 µV) which is incorrect
for a 1.8 V threshold; update the volumeup-key's press-threshold-microvolt
property (node "volumeup-key") to <1750000> so it represents 1,750,000 µV (1.75
V). Also apply the same fix to the corresponding press-threshold-microvolt entry
in rk3576-recomputer-rk3576-devkit.dts to keep both DT files consistent.
- Around line 93-105: The pcie_clk regulator node sets enable-active-low but
passes the GPIO as GPIO_ACTIVE_HIGH, causing a polarity conflict; update the
pcie_clk node (regulator-fixed, regulator-name = "pcie_clk") to match the
vcc3v3_pcie_clk pattern by using enable-active-high with GPIO_ACTIVE_HIGH, or
alternatively change the gpio cell to GPIO_ACTIVE_LOW so the enable-active-low
flag and the gpio cell agree—make the pcie_clk node's enable polarity consistent
with the gpio cell.

---

Duplicate comments:
In `@config/boards/recomputer-rk3576-devkit.conf`:
- Line 5: The BOARD_MAINTAINER entry currently contains a company name; update
the BOARD_MAINTAINER value to a real GitHub user handle of a named individual
who will maintain this board (e.g., set BOARD_MAINTAINER="githubHandle") so the
.conf file meets standard-supported requirements, or if no individual maintainer
can be committed, convert this configuration to a community-supported file by
renaming/adapting it to the .csc format instead of keeping it as a .conf.
- Around line 40-67: The custom_kernel_config__recomputer_rk3576_customizations
function is modifying kernel .config at the board level using
kernel_config_set_y/kernel_config_set_m/kernel_config_set_val, which must
instead live in the rk35xx family/kernel config; move all toggles
(CONFIG_GPIO_PCA953X, CONFIG_RTC_DRV_PCF8563, CONFIG_WLAN_VENDOR_MORSE,
CONFIG_MORSE_SPI, CONFIG_MORSE_USER_ACCESS, CONFIG_MORSE_VENDOR_COMMAND,
CONFIG_MORSE_MONITOR, CONFIG_MAC80211_MESH, CONFIG_MORSE_DEBUG_MASK,
CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_V2, CONFIG_VIDEO_IMX708,
CONFIG_VIDEO_DW9800W, CONFIG_REGULATOR_AD5398, CONFIG_SENSORS_PWM_FAN) out of
custom_kernel_config__recomputer_rk3576_customizations and add equivalent
settings to the family-level kernel config (e.g.,
config/kernel/linux-rk35xx-vendor.config or the rk35xx .inc) so the kernel
package is consistent across the rk35xx LINUXFAMILY/BOARDFAMILY builds.

In `@config/boards/recomputer-rk3588-devkit.conf`:
- Line 4: The BOARD_MAINTAINER value "seeed studio" is not an individual GitHub
user ID as required; update the BOARD_MAINTAINER entry to a real GitHub handle
of a named individual (e.g., replace "seeed studio" with the maintainer's GitHub
username) so the .conf board qualifies for standard support, or if no individual
maintainer exists move the board to community support by changing the file to a
.csc variant and/or remove/adjust BOARD_MAINTAINER accordingly.
- Around line 56-90: The board-specific function
custom_kernel_config__recomputer_rk3588_customizations and its
kernel_config_set_*/kernel_config_set_m/y/n calls must be removed from the board
.conf and relocated to the Rockchip family-level kernel config (e.g., add the
toggles to config/kernel/linux-rockchip-rk3588-*.config or the family include
under config/sources/families/*.inc) so the kernel options
(CONFIG_RTC_DRV_PCF8563, CONFIG_MORSE_*, CONFIG_VIDEO_*,
CONFIG_NVMEM_ROCKCHIP_OTP, CONFIG_DRM_PANFROST/PANTHOR,
CONFIG_NET_VENDOR_REALTEK, CONFIG_SENSORS_PWM_FAN, etc.) are applied per
LINUXFAMILY/BOARDFAMILY and not per individual BOARD; remove the
custom_kernel_config__recomputer_rk3588_customizations function and its
kernel_config_set_* invocations from the board file after migrating the
settings.

In `@lib/functions/compilation/patch/drivers_network.sh`:
- Around line 926-940: The driver_fgh100m function unconditionally injects an
out-of-tree driver for all families and uses spaces for indentation; scope it to
the affected families and fix indentation: wrap the existing checks so the body
only runs when both the kernel version check and a family guard (e.g.,
LINUXFAMILY matches rk35xx—or the same family set you use for other Morse
drivers) are true, keep the call to
process_patch_file("${SRC}/patch/misc/wireless-fgh100m.patch"), the Makefile
echo and the sed Kconfig insertion, and convert the function body indentation to
tabs; also add a TODO comment to move this integration into an extension (so
reviewers know it's temporary).

---

Nitpick comments:
In `@config/boards/recomputer-rk3576-devkit.conf`:
- Line 1: Replace the terse first-line comment "#Seeed Studio Rockchip RK3576
octa core 4/8/16GB RAM SoC" with an expanded hardware description and add a
space after the '#'; the new single-line header should state the SoC model
(Rockchip RK3576), core count (octa‑core), RAM options (4/8/16GB), and key
features such as storage interfaces (eMMC, NVMe/PCIe), networking (GbE,
Wi‑Fi/BT/HaLow), USB/HDMI I/O and any notable peripherals present on the
Recomputer RK3576 devkit so it can be shown during interactive compilation.

In `@config/boards/recomputer-rk3588-devkit.conf`:
- Line 1: Update the first-line comment currently "#Seeed Studio Rockchip RK3588
octa core 4/8/16GB RAM SoC" to include a leading space after "#" and expand it
to list SoC model, core count, RAM options and key features (storage and
connectivity) — e.g. mention eMMC, NVMe/PCIe, GbE, USB3, HDMI, WiFi/BT — so the
board header in recomputer-rk3588-devkit.conf clearly reads like: "# Seeed
Studio Rockchip RK3588 octa-core, 4/8/16GB RAM — eMMC, NVMe/PCIe, Gigabit
Ethernet, USB3, HDMI, WiFi/BT". Ensure you replace the existing string exactly
and keep formatting as a single-line comment.
- Around line 96-101: The mkdir and echo lines use an unquoted $SDCARD variable
which can break redirections if the directory contains spaces; update the usages
in the mkdir -p and all echo >> redirections that write to
90-naming-audios.rules to use a quoted expansion of the variable (e.g.,
"${SDCARD}/etc/udev/rules.d/") so the path is safe from word-splitting.

In `@config/bootscripts/boot-seeed-rk35xx.cmd`:
- Line 52: Add a brief inline comment above the if condition that checks
ee0..ee5 (the line starting with if test "${ee0}" = "0x72" && test "${ee1}" =
"0x6b" && test "${ee2}" = "0x33" && test "${ee3}" = "0x35" && test "${ee4}" =
"0x78" && test "${ee5}" = "0x78"; then) documenting that those hex literals are
the ASCII bytes for "rk35xx", and note that this byte-by-byte check is brittle
(will not handle longer/future magic strings) and point maintainers to the
analogous checks for "00A0"/"00B0" (the comparisons around ee* at the later
checks) so they know to update comments or logic if the EEPROM signature
changes.
- Around line 1-146: There is duplicate boot script logic between
boot-seeed-rk35xx.cmd and boot-seeed-rk3576.cmd; consolidate them by creating a
single shared boot-seeed-rk35xx.cmd that reads SoC-specific values from board
environment (armbianEnv.txt) instead of hardcoding load_addr and fallback
fdtfile: keep the EEPROM detection and overlay/bootargs logic as-is (symbols:
eeprom_dtb_select, eeprom_dtb_matched, overlays, user_overlays, fdtfile,
load_addr, bootargs) and change initialization so load_addr and the default
fdtfile are set from environment variables (or fall back to sensible defaults)
and ensure BOOTSCRIPT for each board points to the shared script; alternatively
implement a build-time generator that produces the board-specific file by
replacing load_addr and fallback fdtfile when packaging.

In
`@patch/u-boot/legacy/u-boot-radxa-rk35xx/board_recomputer-rk3588-devkit/0001-change-hdmi-voltage-swing.patch`:
- Around line 22-30: Remove the dead commented-out register writes and leave
only the active hdptx_write calls: delete the four lines with "//
hdptx_write(hdptx, LANE_REG0[3-6]03, 0x2f);" and, if desired, replace them with
a single concise comment above the block like "voltage-swing lowered from 0x2f
to 0x20 for RK3588 reComputer HDMI signal integrity" so the change is documented
while keeping the active hdptx_write(hdptx, LANE_REG0303, 0x20),
hdptx_write(hdptx, LANE_REG0403, 0x20), hdptx_write(hdptx, LANE_REG0503, 0x20),
hdptx_write(hdptx, LANE_REG0603, 0x20) lines intact.

In
`@patch/u-boot/legacy/u-boot-radxa-rk35xx/board_recomputer-rk3588-devkit/0002-fix-download-devtype-reinit.patch`:
- Around line 1-21: The same change to boot_devtype_init (adding need_reinit
logic) is duplicated across two board-specific patches; remove the duplicate by
extracting the shared edit into a single patch placed under the
u-boot-radxa-rk35xx common patch directory and delete the board-specific copy;
update the patch series/manifest to reference only the new common patch and
ensure the patch header/description mentions both rk3576 and rk3588 boards so
the single patch applies to both trees and prevents future drift.

In
`@patch/u-boot/legacy/u-boot-radxa-rk35xx/defconfig/recomputer-rk3576-devkit_defconfig`:
- Line 237: The line containing CONFIG_AVB_LIBAVB_ATX has trailing whitespace;
remove the trailing space so the entry is exactly "CONFIG_AVB_LIBAVB_ATX=y" (no
trailing whitespace) to match the RK3588 defconfig and ensure byte-identical
config entries. Target the line with the symbol CONFIG_AVB_LIBAVB_ATX in the
defconfig and delete the extra space at the end of the line.
- Line 45: Replace the boolean disablement line for CONFIG_SPL_UFS_SUPPORT so it
uses the canonical "is not set" form; locate the CONFIG_SPL_UFS_SUPPORT entry
and change the current `CONFIG_SPL_UFS_SUPPORT=n` style to the conventional `#
CONFIG_SPL_UFS_SUPPORT is not set` line to match the rest of the defconfig and
avoid savedefconfig churn.

In
`@patch/u-boot/legacy/u-boot-radxa-rk35xx/dt/rk3588-recomputer-rk3588-devkit.dts`:
- Around line 44-53: Remove all dead commented-out device-tree blocks so the DTS
is unambiguous: delete the commented node for vcc5v0_sys (the block containing
"vcc5v0_sys" / "vcc5v0-sys"), remove the commented "startup-delay-us" entries,
and remove the commented "vpcie3v3-supply" blocks; if any of these are
intentionally retained for future use, replace the entire commented block with a
single inline TODO comment at the top of the affected node (e.g., "/* TODO:
re-enable vcc5v0_sys if needed */") rather than leaving large commented code
sections.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: b0175836-09b1-400b-8dfa-eb9a0f409de2

📥 Commits

Reviewing files that changed from the base of the PR and between 6618b89 and 612f524.

📒 Files selected for processing (18)
  • config/boards/recomputer-rk3576-devkit.conf
  • config/boards/recomputer-rk3588-devkit.conf
  • config/bootscripts/boot-seeed-rk3576.cmd
  • config/bootscripts/boot-seeed-rk35xx.cmd
  • config/kernel/linux-rk35xx-vendor.config
  • config/sources/vendors/seeed-studio/recomputer-rk35xx-common.inc
  • lib/functions/compilation/patch/drivers-harness.sh
  • lib/functions/compilation/patch/drivers_network.sh
  • patch/misc/wireless-fgh100m.patch
  • patch/u-boot/legacy/u-boot-radxa-rk35xx/board_recomputer-rk3576-devkit/0001-update-new-flash-for-rockchip.patch
  • patch/u-boot/legacy/u-boot-radxa-rk35xx/board_recomputer-rk3576-devkit/0002-fix-download-devtype-reinit.patch
  • patch/u-boot/legacy/u-boot-radxa-rk35xx/board_recomputer-rk3588-devkit/0001-change-hdmi-voltage-swing.patch
  • patch/u-boot/legacy/u-boot-radxa-rk35xx/board_recomputer-rk3588-devkit/0001-update-new-flash-for-rockchip.patch
  • patch/u-boot/legacy/u-boot-radxa-rk35xx/board_recomputer-rk3588-devkit/0002-fix-download-devtype-reinit.patch
  • patch/u-boot/legacy/u-boot-radxa-rk35xx/defconfig/recomputer-rk3576-devkit_defconfig
  • patch/u-boot/legacy/u-boot-radxa-rk35xx/defconfig/recomputer-rk3588-devkit_defconfig
  • patch/u-boot/legacy/u-boot-radxa-rk35xx/dt/rk3576-recomputer-rk3576-devkit.dts
  • patch/u-boot/legacy/u-boot-radxa-rk35xx/dt/rk3588-recomputer-rk3588-devkit.dts

Comment thread config/boards/recomputer-rk3588-devkit.conf
Comment thread config/sources/vendors/seeed-studio/recomputer-rk35xx-common.inc Outdated
Comment thread config/sources/vendors/seeed-studio/recomputer-rk35xx-common.inc Outdated
Comment thread config/sources/vendors/seeed-studio/recomputer-rk35xx-common.inc Outdated
Comment thread config/sources/vendors/seeed-studio/recomputer-rk35xx-common.inc Outdated
Comment thread config/sources/vendors/seeed-studio/recomputer-rk35xx-common.inc Outdated
Comment thread patch/u-boot/legacy/u-boot-radxa-rk35xx/dt/rk3576-recomputer-rk3576-devkit.dts Outdated
Comment thread patch/u-boot/legacy/u-boot-radxa-rk35xx/dt/rk3588-recomputer-rk3588-devkit.dts Outdated
Comment thread config/sources/vendors/seeed-studio/recomputer-rk35xx-common.inc Outdated
@armbian armbian deleted a comment from github-actions Bot Apr 25, 2026
@armbian armbian deleted a comment from github-actions Bot Apr 25, 2026
@armbian armbian deleted a comment from github-actions Bot Apr 25, 2026
@armbian armbian deleted a comment from github-actions Bot Apr 25, 2026
@armbian armbian deleted a comment from github-actions Bot Apr 25, 2026
@baorepo
Copy link
Copy Markdown
Author

baorepo commented Apr 25, 2026

@EvilOlaf Thanks for the feedback on custom_kernel_config. We've investigated the cache mechanism in detail.

What we found:

The kernel artifact cache key is LINUXFAMILY + BRANCH (see artifact-kernel.sh:11BOARD is explicitly excluded). Armbian tracks config modifications through the kernel_config_modifying_hashes array, which feeds into the cache hash. However, kernel_config_set_y/n/m/val directly calls scripts/config and does not populate this array — so our board-level custom_kernel_config hooks modify .config without affecting the cache key. This means the first build's kernel gets cached and reused for all boards in the same family, with our custom options baked in.

We checked: no other board in rockchip-rk3588 or rk35xx families defines a custom_kernel_config hook. The opts_y/opts_n/opts_m array approach is used at the family level (e.g., filogic.conf, meson-s4t7.conf) and in extensions (e.g., kernel-rust.sh, gateway-dk-ask.sh), but never at the board level.

Options we're considering:

  1. Convert to opts_y/opts_n/opts_m arrays — minimal change, cache hash is tracked correctly. But this still puts kernel config at the board level, which no other board does.

  2. Create a new board family (e.g., recomputer-rk35xx) — most correct per Armbian conventions, independent cache. But we'd diverge from upstream rockchip-rk3588 / rk35xx families, losing shared kernel patches and configs. Maintenance burden increases significantly.

  3. Move our kernel config additions to a shared family include — e.g., config/sources/families/include/recomputer_common.inc, sourced from the existing family configs. This follows the meson64_common.inc / uefi_common.inc pattern. But it modifies files shared with other boards.

Our preference is option 1 for now — it's the smallest fix that correctly tracks the cache hash, and we can revisit the family structure later if needed. What do you think?

@EvilOlaf
Copy link
Copy Markdown
Member

EvilOlaf commented Apr 25, 2026

I be totally honest, I don't know exactly how the internals on this work, I just know from previous PRs that on various occasions board-level kernel adjustments are flagged as a bad idea since it breaks apt repo
#9600 (comment)

Anyway it might be possible to move all of this to family level and work around this. I just throw in some random thoughts, may be totally wrong though.

  # GPIO PCA953X - enable as built-in (needed for I2C GPIO expander)
  kernel_config_set_y CONFIG_GPIO_PCA953X

If the issue is that, when built as module, it loads (too) late, perhaps create a hook for initramfs generation to force the module into initramfs image? Then it should behave similar to being built-in I guess

  # RTC driver PCF8563 - enable as built-in
  kernel_config_set_y CONFIG_RTC_DRV_PCF8563

If module is sufficient, I'd do the same as above

  # Morse Wireless (FGH100M) configuration
  kernel_config_set_m CONFIG_WLAN_VENDOR_MORSE
  kernel_config_set_y CONFIG_MORSE_SPI
  kernel_config_set_y CONFIG_MORSE_USER_ACCESS
  kernel_config_set_y CONFIG_MORSE_VENDOR_COMMAND
  kernel_config_set_y CONFIG_MORSE_MONITOR
  kernel_config_set_y CONFIG_MAC80211_MESH
  kernel_config_set_val CONFIG_MORSE_DEBUG_MASK "1"

Without looking deeper, tbh not sure how to exactly handle this. Perhaps there are other extensions already that add some sort of drivers which obviously also come with kernel config settings.

  # Regulator for Raspberry Pi Touchscreen V2 and camera v3
  kernel_config_set_y CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_V2
  kernel_config_set_y CONFIG_VIDEO_IMX708
  kernel_config_set_y CONFIG_VIDEO_DW9800W
  kernel_config_set_y CONFIG_REGULATOR_AD5398
  # fan
  kernel_config_set_y CONFIG_SENSORS_PWM_FAN

If added as module I don't see a reason not to add to family kernel config and if needed again force move into initramfs.

@SteeManMI
Copy link
Copy Markdown
Contributor

Do be totally honest, I don't know exactly how the internals on this work, I just know from previous PRs that on various occasions board-level kernel adjustments are flagged as a bad idea since it breaks apt repo #9600 (comment)

At a high level the issue is with the software deployment lifecycle via apt and the Armbian apt repositories. kernel apt packages are produced and populated into the apt repositories keyed by Family-Branch. So after initial image creation when an apt update/upgrade is run the latest kernel package from the repositories will be deployed to the device which will upgrade the kernel to the standard kernel for the Family-Branch. Which will effectively remove any board specific kernel that was originally installed.

The Armbian concept of Family is a superset of kernel features that work for all boards within the family. Generally adding additional board feature to the family kernel won't be a problem, but it can sometimes cause conflicts.

The other consideration is that this is done to minimize Armbian infrastructure costs. If each board had its own kernel, the storage and infrastructure cost for the build farms and the apt mirrors would be unmaintainable.

@baorepo
Copy link
Copy Markdown
Author

baorepo commented Apr 27, 2026

@EvilOlaf @SteeManMI Thanks both for the detailed explanation — that clears up a lot.

@SteeManMI The apt repository deployment angle makes perfect sense now. We hadn't considered the full lifecycle beyond the build cache — the fact that apt upgrade would pull the family-standard kernel and wipe board-specific config is the real blocker. So board-level custom_kernel_config is indeed not the right approach.

@EvilOlaf The initramfs hook approach for forcing module load is a good idea for PCA953X and RTC. For the Morse wireless bits we'll look at how other extensions handle driver kernel config additions.

The direction seems clear: move our config changes to family level (or an extension, for the Morse driver parts), prefer modules over built-in, and use initramfs hooks for anything that needs to be available early. We'll take some time to figure out the right split and come back with a concrete proposal. Thanks again for the guidance.

mingzhangqun and others added 15 commits May 29, 2026 12:14
Copy linux-rk35xx-vendor.config as base for seeed-rk3576 and
seeed-rk3588 families. Board-specific options will be applied
in follow-up commits.
Per Armbian guidelines, kernel configuration is associated with
LINUXFAMILY/BOARDFAMILY, not individual BOARD. Remove
custom_kernel_config__* hooks from board configs and apply all
kernel config options directly in per-family LINUXCONFIG files.

Each family now has its own LINUXCONFIG derived from the shared
rk35xx-vendor base with board-specific overrides:
- seeed-rk3576: PCA953X=y, CSF=n (Mali-G52 JM only)
- seeed-rk3588: CSF=y (Mali-G610 requires CSF)

Also fix unquoted $SDCARD in RK3588 audio naming hook.
- Remove commented-out DT nodes and properties in RK3588 DTS
- Replace commented-out register writes in HDMI voltage-swing patch
  with concise block comment
- Fix defconfig: use canonical "# is not set" form, remove trailing
  whitespace
Merge boot-seeed-rk3576.cmd and boot-seeed-rk3588.cmd into a single
boot-seeed-rk35xx.cmd. The scripts only differed in load_addr and the
hardcoded fdtfile fallback. The shared script:
- Uses load_addr 0x9000000 (safe for both RK3576 and RK3588)
- Relies on armbianEnv.txt (BOOT_FDT_FILE) for the default fdtfile
  instead of hardcoding it, with EEPROM detection as override
Swap mount order so uid=1000,gid=1000,umask=002 is tried first.
Plain "mount -o noatime" succeeds on VFAT/exFAT/NTFS but leaves
files root-owned, breaking the per-user automount UX.
Correct hunk header count (21 -> 17) and diffstat (11 -> 7 insertions)
in the RK3588 HDMI voltage-swing patch. The mismatched counts caused
"Hunk is longer than expected" errors during U-Boot patching.
Drop the Debian/Ubuntu branch detection for Seeed APT dist selection.
All releases now use "stable" since packages are built on bookworm and
forward-compatible.
fcs960k-aic-bluez replaces bluez but does not ship bluetooth.service,
which blocks aic-bluetooth.service (Requires=bluetooth.service). Fix by:

- Creating a synthetic bluetooth.service unit pointing to fcs960k's
  bluetoothd when the unit is missing
- Softening aic-bluetooth.service dependency from Requires= to Wants=
  so it can start even without bluetooth.service
Add `|| true` to sed commands that modify aic-bluetooth.service across
multiple systemd unit paths, preventing non-zero exit when the file
doesn't exist at all locations.
Add build hooks to ensure Mali EGL/GLES/GBM stack works correctly
instead of falling back to Mesa/llvmpipe: DMA heap udev rules for
GBM, X11 KMS OutputClass, libglvnd bypass for EGL/GLES, and
dpkg-divert protected GBM symlink fixup.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move shared Mali hooks (DMA heap, X11 KMS, EGL override, GBM fixup)
from RK3576/RK3588 board configs to recomputer-rk35xx-common.inc.
Both boards now use the same Mali EGL/GBM stack with dpkg-divert
protected GBM symlink.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move the inline heredoc in recomputer-rk35xx-common.inc to a standalone
script file under packages/bsp/seeed/, matching the project convention of
vendor-named BSP directories.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Mali deb packages a 5928-byte GBM stub (2020) that overrides system
libgbm via ldconfig and causes incorrect pixel format in DRM framebuffer
allocation, resulting in red/blue color swap on all outputs (HDMI, DP, DSI)
when the DSI overlay is enabled.

Add MALI_USE_SYSTEM_GBM variable — RK3576 sets it to "yes" to opt out of
Mali's bundled GBM stub and use the system libgbm instead.
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@config/boards/recomputer-rk3588-devkit.conf`:
- Line 2: BOARD_NAME uses hyphens causing inconsistent display; change the
BOARD_NAME value (the BOARD_NAME variable in this config) from
"reComputer-RK3588-Devkit" to use spaces ("reComputer RK3588 Devkit") so it
matches the RK3576 sibling's display style.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: d50cc36d-b7f2-490b-bedd-dc25c422e8c6

📥 Commits

Reviewing files that changed from the base of the PR and between 39592ec and 6e48154.

📒 Files selected for processing (3)
  • config/boards/recomputer-rk3576-devkit.conf
  • config/boards/recomputer-rk3588-devkit.conf
  • config/bootscripts/boot-seeed-rk35xx.cmd

Comment thread config/boards/recomputer-rk3588-devkit.conf Outdated
Match the RK3576 sibling's display style (reComputer RK3576 Devkit)
instead of hyphenated form.
@mingzhangqun
Copy link
Copy Markdown
Contributor

Thanks for the detailed suggestions. Here's how we've addressed this:

  1. Board-level kernel_config_set_* calls have been removed entirely. We're no longer modifying kernel config at board level, so the apt repo cache concern is resolved.

  2. New dedicated families created (seeed-rk3576 and seeed-rk3588) with their own complete kernel config files (linux-seeed-rk3576-vendor.config, linux-seeed-rk3588-vendor.config). The Armbian build framework doesn't support kernel config fragments — every BOARDFAMILY + BRANCH uses a full .config file, so this is the standard approach.

  3. Regarding initramfs hooks for early module loading — good point. Currently PCA953X and PCF8563 are built-in (=y) in the defconfig. We could switch them to modules (=m) and add an initramfs hook if needed in a follow-up. That said, since we have dedicated family configs, the built-in approach doesn't affect other boards.

  4. Morse FGH100M — the kernel config for this has also been moved into the dedicated family config file, and the driver itself is now installed via the morse-fgh100m-dkms APT package instead of patching drivers_network.sh.

Does this approach look good to you, or do you see a better way to handle this?

@sven-ola
Copy link
Copy Markdown
Member

What happened to this PR? +419.662 -325.242 Lines changed: 419662 additions & 325242 deletions

PR was not merged to upstream/main before submitting. @baorepo: Why not merge to upstream, do your QA again, and submit PR after this? Something like:

sven-ola@pcsven-ola:~$ git clone git@github.com:Seeed-Studio/armbian-build.git seeed-armbian-build
sven-ola@pcsven-ola:~$ cd seeed-armbian-build/
sven-ola@pcsven-ola:~/seeed-armbian-build$ git remote add upstream git@github.com:armbian/build.git
sven-ola@pcsven-ola:~/seeed-armbian-build$ git fetch upstream
sven-ola@pcsven-ola:~/seeed-armbian-build$ git merge upstream/main
[... do your quality checks...]
[... create PR ...]

@Pillar1989
Copy link
Copy Markdown
Contributor

@sven-ola It’s possible that @mingzhangqun might have made a mistake just now, but he has already corrected it. For now, there’s no such information available.

@mingzhangqun
Copy link
Copy Markdown
Contributor

mingzhangqun commented Jun 1, 2026

@HeyMeco Thanks for the guidance! The LED patch has been reworked to use a realtek,led-data DT property instead of the shared driver path — tested and working on the RK3588 board.

The remaining patches have been submitted as separate PRs to armbian/linux-rockchip:

Move the disable hook from RK3588 board config to recomputer-rk35xx-common.inc
so both RK3576 and RK3588 benefit. The service's IRQ affinity is a no-op for
seeed-rk35xx families, its cpufreq settings conflict with the BSP interactive
governor, and its USB quirks function risks corrupting /boot/armbianEnv.txt.
@mingzhangqun
Copy link
Copy Markdown
Contributor

mingzhangqun commented Jun 4, 2026

@sven-ola Thanks for the review! This is already merged via the seeed-main branch.

For reference, here's a breakdown of the diff:

Category Files Lines Notes
Kernel config linux-seeed-rk3576-vendor.config + linux-seeed-rk3588-vendor.config ~5,532 (41%) Rockchip SDK defconfig, autogenerated
U-Boot patches 0001-update-new-flash-for-rockchip.patch ×2, 0002-fix-download-devtype-reinit.patch ×2, 0001-change-hdmi-voltage-swing.patch, defconfig ×2, DTS ×2 ~6,366 (48%) Rockchip BSP, per-SoC
Board config rk3576/rk3588 .conf, recomputer-rk35xx-common.inc, family .conf ~792 (6%) Hand-written
Boot script boot-seeed-rk35xx.cmd ~172 (1%) Hand-written
Other drivers_network, usb-automount ~30

~89% of the diff is Rockchip SDK autogenerated content (kernel config + U-Boot patches). The actual hand-written business logic is ~800 lines (board configs + bootscript).

- bootscript: use command return values instead of rootdev sentinel
  for corruption detection, add .bak fallback with load/import checks
- common.inc: create armbianEnv.txt.bak at build time (no systemd service)
Comment thread config/sources/families/seeed-rk3576.conf
Comment thread config/sources/families/seeed-rk3576.conf
Comment thread config/sources/families/seeed-rk3588.conf
Copy link
Copy Markdown
Member

@igorpecovnik igorpecovnik left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this should be good to make 1st images, but job needs to continue.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 5, 2026

✅ This PR has been reviewed and approved — all set for merge!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

05 Milestone: Second quarter release BSP Board Support Packages Documentation Documentation changes or additions Framework Framework components GitHub Actions GitHub Actions code GitHub GitHub-related changes like labels, templates, ... Hardware Hardware related like kernel, U-Boot, ... Patches Patches related to kernel, U-Boot, ... Ready to merge Reviewed, tested and ready for merge size/large PR with 250 lines or more

Development

Successfully merging this pull request may close these issues.