Skip to content

WIP: Add Seeed Studio reComputer RK3576/RK3588 DevKit support#9719

Draft
baorepo wants to merge 40 commits into
armbian:mainfrom
Seeed-Studio:main
Draft

WIP: Add Seeed Studio reComputer RK3576/RK3588 DevKit support#9719
baorepo wants to merge 40 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 minimal build
./compile.sh BOARD=recomputer-rk3576-devkit BRANCH=vendor RELEASE=noble \
    BUILD_MINIMAL=yes BUILD_DESKTOP=no KERNEL_CONFIGURE=no

# RK3588 full desktop with OTA + encryption
./compile.sh BOARD=recomputer-rk3588-devkit BRANCH=vendor RELEASE=noble \
    BUILD_MINIMAL=no BUILD_DESKTOP=yes DESKTOP_ENVIRONMENT=xfce \
    KERNEL_CONFIGURE=no ENABLE_SEEED_RK_EXTENSION=yes \
    OTA_ENABLE=yes CRYPTROOT_ENABLE=yes RK_AUTO_DECRYP=yes \
    CRYPTROOT_PASSPHRASE=<64-char-hex>

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

Summary by CodeRabbit

Release Notes

  • New Features

    • Added support for Seeed Studio reComputer RK3576 and RK3588 DevKit boards with complete hardware enablement.
    • Added camera engine support for reComputer devices.
    • Added USB gadget mode with network connectivity capabilities.
    • Added Morse WiFi wireless driver support.
    • Enhanced audio device naming and X11 display configuration.
  • Bug Fixes

    • Fixed boot device type reinitialization to handle missing environment variables.
    • Adjusted HDMI voltage swing configuration for improved stability.

ackPeng and others added 17 commits April 14, 2026 10:43
Extract duplicated hooks from rk3576 and rk3588 board configs into
recomputer-rk35xx-common.inc. Both configs source the shared file and
keep only SoC-specific hooks.

Common hooks: bluez (FCS960K), USB gadget, Morse FGH100M tools,
AIC8800 wireless, security hardening, PATH config, USB auto-mount.

Key fixes included:
- USB gadget: NM managed via ExecStartPost in usbdevice.service drop-in
  (not via broken keyfile unmanaged-devices exception)
- dnsmasq: After=usbdevice + Restart=on-failure for reliable boot
- serial-getty@ttyGS0: ordering via drop-in, not custom service
- USB auto-mount: udev SYSTEMD_WANTS triggers usb-automount@.service,
  mounts under /media/seeed/ with proper ownership
- SSH: MaxAuthTries 6 (OpenSSH default) to support multi-key clients

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
When usbdevice fails on first attempt, serial-getty@ttyGS0 tries to
start before ttyGS0 exists and stays dead. Add Restart=on-failure
so it retries after usbdevice eventually succeeds.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
bind-interfaces fails if usb0 doesn't exist at startup, requiring
After=usbdevice + Restart=on-failure workarounds. bind-dynamic
tolerates missing interfaces and serves DHCP when usb0 appears,
removing the need for the dnsmasq systemd drop-in entirely.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Clear BindsTo=dev-ttyGS0.device from the base unit via drop-in override.
ttyGS0 is a USB gadget device not present at boot, so the base unit's
BindsTo causes a dependency failure. Also drop Restart=on-failure override
to preserve the base unit's Restart=always, preventing the getty from
staying dead after a normal logout.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 24, 2026

Important

Review skipped

Ignore keyword(s) in the title.

⛔ Ignored keywords (2)
  • wip
  • draft

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: afb14f68-bcb8-4829-9097-86b0a320df7a

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
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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
Pillar1989 and others added 2 commits April 24, 2026 15:08
The BT UART assignment is per-board, not per-SoC.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Move BT UART selection from BOOT_SOC-based case logic in common.inc to
per-board BT_UART variables. RK3576 DevKit uses ttyS4, RK3588 DevKit
uses ttyS6. Remove redundant pre_umount_final_image BT UART hook from
RK3576 config since common.inc BSP hook now handles it.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AIC8800_TYPE="sdio"
enable_extension "radxa-aic8800"

source "${SRC}/config/boards/recomputer-rk35xx-common.inc"
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Hi, this is not standard. There's no real standard for this, really, except using extensions and/or using family code. Long ago I've tried a "vendor" common dir for the Mekotronics, see sources/vendors/mekotronics and config/boards/mekotronics-r58x.csc? In the end it's just about the file/folder structure.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Okay, I made revisions based on your two references. Thanks

@armbian armbian deleted a comment from github-actions Bot Apr 24, 2026
is-qian and others added 3 commits April 27, 2026 14:24
Move enable_extension "seeed_armbian_extension" back to top-level code
in recomputer-rk35xx-common.inc. The armbian framework finalizes the
extension system before post_family_config hooks run, so calling
enable_extension inside a hook triggers "already initialized" error.
The git clone/pull remains in the hook to defer network I/O.
Reverts the split introduced by 3f3a384 and partially reverted by
ade3393. Both the git clone/pull and enable_extension must execute
at top-level in recomputer-rk35xx-common.inc; they cannot be deferred
to a post_family_config hook.

Root cause
----------
The Armbian extension system has a strict initialization sequence:

  1. Board/family config files are sourced (top-level code runs)
  2. enable_extension() calls register extensions
  3. initialize_extension_manager() scans all __-separated hook
     functions via compgen -A function, then locks further
     enable_extension() calls (counter > 0 → fatal exit)
  4. post_family_config hooks are called

enable_extension() is hard-gated after step 3 (see
lib/functions/general/extensions.sh:461-465). All hooks, including
post_family_config, run at step 4 — too late to call
enable_extension().

Previous attempts
-----------------
- 3f3a384 moved both clone and enable_extension into a
  post_family_config hook → "already initialized" fatal error
  because enable_extension runs after the manager is locked.

- ade3393 moved enable_extension back to top-level but kept
  git clone in the hook → "cant find extension 'seeed_armbian_extension'
  anywhere" because enable_extension runs before the hook clones the
  extension files to disk.

Both attempts fail because they split an atomic operation: the
extension files must exist on disk before enable_extension() is
called, and enable_extension() must run before the extension manager
initializes. Therefore both steps must happen at top-level during
config file sourcing (step 1).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The previous dpkg --force-depends installation can leave apt dependency
tracking in a broken state. Add --fix-broken install to repair it.
baorepo pushed a commit to baorepo/armbian.github.io that referenced this pull request Apr 30, 2026
- board-images/recomputer-rk3576-devkit.png
- board-images/recomputer-rk3588-devkit.png
- board-vendor-logos/seeed-studio-logo.png

Required by armbian/build#9719
Replace manual prebuilt deb downloads and source compilation with
apt-get install from the Seeed APT repository hosted on GitHub Pages.
This applies to all Seeed packages across RK3576 and RK3588 boards:

- fcs960k-aic-bluez, usbdevice-gadget, morse tools (common)
- camera-engine-rkaiq-rk3576 (RK3576)
- libmali-g610, camera-engine-rkaiq-rk3588, realtek-r8125-dkms (RK3588)

Use chroot_sdcard instead of chroot_sdcard_apt_get_install to avoid
the framework's bind-mounted apt lists cache overwriting the Seeed
repo index. Extract seeed_recomputer_install_from_apt() helper to
centralize the add-repo/install/remove cycle.
igorpecovnik added a commit to armbian/armbian.github.io that referenced this pull request Apr 30, 2026
* Add Seeed Studio reComputer board images and vendor logo

- board-images/recomputer-rk3576-devkit.png
- board-images/recomputer-rk3588-devkit.png
- board-vendor-logos/seeed-studio-logo.png

Required by armbian/build#9719

* Add border to Seeedstudio logo and run trough size optimizer

---------

Co-authored-by: pillar1989 <zuobaozhu@gmail.com>
Co-authored-by: Igor Pecovnik <igor@armbian.com>
…lict

- Add post_family_tweaks_bsp hook to write seeed.list with signed-by
  GPG key into the final image, enabling apt upgrade for Seeed packages
- Import GPG key with gpg --dearmor (binary format required by signed-by)
- Only refresh Seeed source index during build (skip Ubuntu/Armbian)
  to cut build time from ~54 min to ~22 min
- Move fcs960k-aic-bluez install to post_repo_customize_image hook
  so it replaces bluez after desktop packages are installed
@armbian armbian deleted a comment from github-actions Bot May 6, 2026
@armbian armbian deleted a comment from github-actions Bot May 6, 2026
@armbian armbian deleted a comment from github-actions Bot May 6, 2026
@armbian armbian deleted a comment from github-actions Bot May 6, 2026
@armbian armbian deleted a comment from github-actions Bot May 6, 2026
@armbian armbian deleted a comment from github-actions Bot May 6, 2026
@armbian armbian deleted a comment from github-actions Bot May 6, 2026
The package uses generic Rockchip configfs USB gadget which works on
both RK3576 and RK3588.
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 6, 2026

🚫 Missing required board assets

This PR adds new board configuration(s). Required assets must already exist in github/armbian/armbian.github.io.
They are required by Armbian Imager to ensure all boards are displayed with proper images.

  • Board images: board-images/<board>.png (1920x1080 px transparent)
  • Vendor logos: board-vendor-logos/<vendor>-logo.png (512x512 px transparent)

Missing items

  • Vendor logo missing for vendor seeed studio (used by board recomputer-rk3576-devkit)

    • Expected: board-vendor-logos/seeed studio-logo.png
    • Fix: add the file to armbian/armbian.github.io (folder board-vendor-logos/)
    • Naming rules: lowercase, dashes (e.g. kobol-logo.png, not Kobol_logo.png)
  • Vendor logo missing for vendor seeed studio (used by board recomputer-rk3588-devkit)

    • Expected: board-vendor-logos/seeed studio-logo.png
    • Fix: add the file to armbian/armbian.github.io (folder board-vendor-logos/)
    • Naming rules: lowercase, dashes (e.g. kobol-logo.png, not Kobol_logo.png)

Once the missing files are added (or a PR is opened in armbian/armbian.github.io), re-run this check.

@armbian armbian deleted a comment from github-actions Bot May 6, 2026
- Change BOARD_VENDOR from "Seeed Studio" to "seeed-studio" to match
  the logo filename (seeed-studio-logo.png) in armbian.github.io.
  CI lowercases BOARD_VENDOR and appends "-logo.png", so spaces in
  the vendor name produce an unmatchable filename.
- Add INTRODUCED="2025" to both board configs as recommended by CI.
SARADC channel 1 is susceptible to electrical interference when a USB
device is connected to the OTG port, causing rockchip_dnl_key_pressed()
to return true and U-Boot to enter download/recovery mode instead of
normal boot. The reComputer board has no physical volume-up button; this
node was inherited from the reference design and is not needed.
Open-source Panfrost/Panthor drivers allocate 10-bit XR30 framebuffers
which trigger VOP CSC color corruption on the RK3576. Disable them so
the vendor Mali driver is used instead.
Remove bluetooth and bluez-tools from PACKAGE_LIST_BOARD on both
reComputer boards to prevent pulling standard bluez as a dependency.
Improve the snapshot-diff-reinstall logic in common.inc:
- Perform snapshot and diff entirely inside chroot to avoid
  pipe/process-substitution issues across chroot boundary
- Only count packages with "ii" status to exclude rc/unpacked entries
- Re-disable display managers after reinstalling gdm3 (its postinst
  re-enables display-manager.service, breaking first-login prompt)
- Disable GDM auto-login in armbian-firstlogin (upstream's background
  sleep+sed approach is unreliable and gets killed)
…ed seeed

Replace hardcoded /media/seeed with /media/<first-user> detected at
runtime via UID 1000 lookup. Add UDISKS_IGNORE=1 to udev rule to
prevent conflict between udisks2 and the custom automount script.
@mingzhangqun
Copy link
Copy Markdown

Hi @EvilOlaf @SteeManMI,

We understand the Armbian convention: kernel packages are keyed by LINUXFAMILY + BRANCH and shared
across all boards in the family via the official apt repository. Board-level kernel config changes would be overwritten by apt upgrade.

Our approach: We maintain our own kernel deb packages through a separate CI pipeline in Seeed-Studio/seeed_armbian_extension@a92f1b3, published to our Seeed APT repository (GitHub Pages + aptly). This is completely independent of the Armbian official apt infrastructure.

  • The workflow builds kernel debs per-board (recomputer-rk3576-devkit and recomputer-rk3588-devkit), differentiating by version string
  • Only Seeed reComputer boards consume this repo, so there is no cross-family conflict
  • The custom_kernel_config hooks remain at board level — this is intentional, since the two boards genuinely need different kernel config options

In other words, we opt out of the Armbian kernel apt repository and take full responsibility for kernel package lifecycle on our boards.

@vidplace7 vidplace7 self-requested a review May 11, 2026 16:30
…upport

Move per-board kernel config customizations into a unified
custom_kernel_config__recomputer_rk35xx_customizations() in common.inc,
since both boards share LINUXFAMILY=rk35xx and produce one kernel build.

Add RK3576 Mali-G52 userspace library installation from APT repo,
DMA heap udev rule for non-root GPU access, and disable Mali CSF mode
(JM only for RK3576, also works for RK3588 Mali-G610).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

05 Milestone: Second quarter release Framework Framework components Hardware Hardware related like kernel, U-Boot, ... Needs review Seeking for review Patches Patches related to kernel, U-Boot, ... size/large PR with 250 lines or more

Development

Successfully merging this pull request may close these issues.

8 participants