Skip to content

This PR adds official Armbian support for two EasePi IoT gateway/NAS devices#9880

Open
ifroncy01 wants to merge 14 commits into
armbian:mainfrom
ifroncy01:main
Open

This PR adds official Armbian support for two EasePi IoT gateway/NAS devices#9880
ifroncy01 wants to merge 14 commits into
armbian:mainfrom
ifroncy01:main

Conversation

@ifroncy01
Copy link
Copy Markdown

@ifroncy01 ifroncy01 commented May 23, 2026

#Description

This PR adds official Armbian support for two EasePi IoT gateway/NAS devices:

  • EasePi-A2 (RK3568) — IoT gateway with OLED display, infrared receiver, AP6255 Bluetooth, PCIe 2.5G Ethernet
  • EasePi-R2 (RK3588) — 4-port 2.5G NAS with infrared receiver, AP6255 Bluetooth, SATA, HDMI IN/OUT

Changes (42 files, 11,914 lines):

  • Board configs for both devices (config/boards/easepi-a2.conf, config/boards/easepi-r2.conf)
  • Vendor kernel (6.1) DTS/DTSI files for both boards (patch/kernel/rk35xx-vendor-6.1/dt/)
  • Mainline kernel (6.18) DTS/DTSI files for both boards (patch/kernel/archive/rockchip64-6.18/dt/)
  • Legacy U-Boot patches for vendor branch (patch/u-boot/legacy/u-boot-radxa-rk35xx/)
  • Mainline U-Boot (v2025.10) defconfig and DTS files (patch/u-boot/v2025.10/)
  • Extension scripts for peripherals — OLED, IR, Bluetooth (extensions/easepi-a2-peripherals.sh, extensions/easepi-r2-peripherals.sh)
  • Go source for OLED display (https://github.com/ifroncy01/easepi-oled-daemon)
  • Vendor kernel config (config/kernel/linux-rk35xx-vendor.config)

Dependencies:

  • Extends existing rk35xx and rockchip-rk3588 board families
  • Mainline kernel uses rockchip64 LINUXFAMILY via rockchip64_common.inc
  • U-Boot mainline overrides default radxa U-Boot via board config post_family_config__ hook
  • Extracted the OLED Go source code into a dedicated repository

Documentation Summary

  • short description: Add board support for EasePi-A2 (RK3568) and EasePi-R2 (RK3588)
  • summary: Two new Rockchip boards for IoT gateway and NAS use cases. EasePi-A2 features OLED display, IR receiver, AP6255 Bluetooth/WiFi, and PCIe 2.5G Ethernet. EasePi-R2 features 4x 2.5G Ethernet, IR, Bluetooth, SATA, and HDMI IN/OUT. Both boards support vendor (6.1) and mainline (6.18) kernels.
  • example of usage: Build with ./compile.sh BOARD=easepi-a2 BRANCH=current or ./compile.sh BOARD=easepi-r2 BRANCH=vendor

How Has This Been Tested?

  • easepi-a2 vendor build — 451s, kernel 6.1.115, image generated
  • easepi-a2 current build — 1022s, kernel 6.18.33, image generated
  • easepi-r2 vendor build — 487s, kernel 6.1.115, image generated
  • easepi-r2 current build — 914s, kernel 6.18.33, image generated
  • Physical device testing (completed)

All builds: BUILD_MINIMAL=yes BUILD_DESKTOP=no KERNEL_CONFIGURE=no ARTIFACT_IGNORE_CACHE=yes

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • My changes generate no new warnings (shellcheck passes all extension scripts)
  • Any dependent changes have been merged and published in downstream modules

File Statistics

Category Files Lines
Board configs 2 114
Extensions + Go source 6 1,817
Vendor kernel DTS/DTSI 7 3,238
Mainline kernel DTS/DTSI 17 5,478
Legacy U-Boot (vendor) 4 910
Mainline U-Boot (v2025.10) 4 324
Total 42 11,914

Kernel Sources

Branch Kernel Source Branch/Tag
vendor https://github.com/armbian/linux-rockchip.git rk-6.1-rkr5.1
current https://git.kernel.org/.../stable/linux.git linux-6.18.y
edge https://github.com/torvalds/linux.git v7.1-rc3

Summary by CodeRabbit

  • New Features
    • Added EasePi‑A2 (RK3568) and EasePi‑R2 (RK3588) board support.
    • On‑board peripherals: Bluetooth, Wi‑Fi SDIO, IR receiver (NEC), OLED display, NVMe storage, PCIe Ethernet, HDMI/audio, RTC, and fan control.
    • Includes image tooling to enable services (OLED, IR, Bluetooth) and an IR diagnostic/setup helper.
    • Adds required user utilities (i2c-tools, ir-keytable, fonts) and full U-Boot + Linux kernel/device-tree support for both boards.

Review Change Stack

ifroncy01 and others added 5 commits May 22, 2026 23:04
Add easepi-a2-rk3568_defconfig
Add easepi-r2-rk3588_defconfig
Add rk3568-easepi-a2-u-boot.dtsi
Add rk3588-easepi-r2-u-boot.dtsi
Add rk3568-easepi-a2.dts
Add rk3588-easepi-r2.dts
@github-actions
Copy link
Copy Markdown
Contributor

🚫 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

  • Board image missing for easepi-a2

    • Expected: board-images/easepi-a2.png
    • Fix: add the file to armbian/armbian.github.io (folder board-images/)
  • Vendor logo missing for vendor easepi (used by board easepi-a2)

    • Expected: board-vendor-logos/easepi-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)
  • Board image missing for easepi-r2

    • Expected: board-images/easepi-r2.png
    • Fix: add the file to armbian/armbian.github.io (folder board-images/)
  • Vendor logo missing for vendor easepi (used by board easepi-r2)

    • Expected: board-vendor-logos/easepi-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.

@HeyMeco
Copy link
Copy Markdown
Collaborator

HeyMeco commented May 23, 2026

OLED Go should probably be maintained outside of armbian/build. Can you please add a summary for its purpose?

- Move OLED Go source to separate github.com/ifroncy01/easepi-oled-daemon repo
  with GitHub Actions release workflow for prebuilt arm64/amd64 binaries
- Remove golang-go host dependency (no longer needed)
- Replace in-tree Go compilation with curl download from GitHub Releases
- Remove `|| true` error masking on systemctl enable, chmod, and symlink
  operations to surface real errors during image build
- Clean up `|| true` in bluetooth-hciattach script: log warning instead

The OLED daemon (SSD1306 128x32, I2C on /dev/i2c-3) is now maintained
separately with proper CI/CD, versioning, and release artifacts.
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

♻️ Duplicate comments (1)
extensions/easepi-a2-peripherals.sh (1)

640-641: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Don't enable oled.service when the OLED binary was allowed to go missing.

The warning-only path above still reaches this unconditional enable, so the image can boot with ExecStart=/usr/local/oled/oled pointing at a nonexistent file. Either fail the build on download errors or guard this enable step with an executable check.

Based on learnings: In the Armbian build framework, scripts run with set -e, so failures that must be tolerated should be handled explicitly instead of leaving later critical steps unchecked.

🤖 Prompt for 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.

In `@extensions/easepi-a2-peripherals.sh` around lines 640 - 641, The script
unconditionally enables oled.service via chroot_sdcard even when the OLED binary
(/usr/local/oled/oled) may be missing due to a warned download failure; modify
the flow so you either (A) make the download failure fatal (stop the build when
the OLED binary download in the earlier step fails) or (B) guard the enable call
by testing for the OLED executable before enabling the service (e.g., check that
/usr/local/oled/oled exists and is executable) and only run chroot_sdcard
systemctl enable oled.service when that check passes; update the logic around
the download step and the chroot_sdcard enable to use one of these two
approaches so the image never enables a service pointing at a nonexistent
ExecStart.
🧹 Nitpick comments (1)
config/boards/easepi-a2.conf (1)

1-1: ⚡ Quick win

Make the board description match the actual hardware.

This comment is shown in interactive build flows, so it should mention the A2's distinguishing features as well, not just the generic SoC/storage baseline. Please include at least the onboard Wi‑Fi/BT, OLED/IR, and 2.5GbE/NVMe-relevant hardware summary here.

Based on learnings: In Armbian board configuration files, the first-line comment should describe the hardware accurately, including SoC model, RAM options, and key features.

🤖 Prompt for 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.

In `@config/boards/easepi-a2.conf` at line 1, Update the first-line comment in
easepi-a2.conf so it accurately describes the A2 board hardware: mention the
Rockchip RK3568 SoC (quad-core), RAM option(s) (e.g., 4GB), onboard Wi‑Fi/BT,
built-in OLED and IR sensor, 2.5GbE port and NVMe support, plus eMMC and USB3 —
replace the generic comment line "# Rockchip RK3568 quad core 4GB SoC GBe eMMC
USB3" with a single-line summary that includes these distinguishing features.
🤖 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 `@extensions/easepi-a2-peripherals.sh`:
- Around line 602-612: Replace the unpinned download of the OLED Go binary and
blind curl install by pinning OLED_RELEASE_URL to a specific release asset
(e.g., include the release tag in the URL), download the corresponding published
SHA-256 checksum file for that exact asset, compute the local SHA-256 (via
sha256sum or similar) and compare it to the published checksum, and only install
(chmod +x and write to "${SDCARD}/usr/local/oled/oled") if the checksum matches;
update the display_alert calls to report the specific release tag and to error
out (and skip install) on checksum mismatch. Use the existing OLED_RELEASE_URL
and the target path "${SDCARD}/usr/local/oled/oled" as the identifiers to
modify.

---

Duplicate comments:
In `@extensions/easepi-a2-peripherals.sh`:
- Around line 640-641: The script unconditionally enables oled.service via
chroot_sdcard even when the OLED binary (/usr/local/oled/oled) may be missing
due to a warned download failure; modify the flow so you either (A) make the
download failure fatal (stop the build when the OLED binary download in the
earlier step fails) or (B) guard the enable call by testing for the OLED
executable before enabling the service (e.g., check that /usr/local/oled/oled
exists and is executable) and only run chroot_sdcard systemctl enable
oled.service when that check passes; update the logic around the download step
and the chroot_sdcard enable to use one of these two approaches so the image
never enables a service pointing at a nonexistent ExecStart.

---

Nitpick comments:
In `@config/boards/easepi-a2.conf`:
- Line 1: Update the first-line comment in easepi-a2.conf so it accurately
describes the A2 board hardware: mention the Rockchip RK3568 SoC (quad-core),
RAM option(s) (e.g., 4GB), onboard Wi‑Fi/BT, built-in OLED and IR sensor, 2.5GbE
port and NVMe support, plus eMMC and USB3 — replace the generic comment line "#
Rockchip RK3568 quad core 4GB SoC GBe eMMC USB3" with a single-line summary that
includes these distinguishing features.
🪄 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: 7137dc46-7ec3-4386-8c93-268c1577bfd6

📥 Commits

Reviewing files that changed from the base of the PR and between 57dc69d and deeb140.

📒 Files selected for processing (2)
  • config/boards/easepi-a2.conf
  • extensions/easepi-a2-peripherals.sh

Comment thread extensions/easepi-a2-peripherals.sh Outdated
- Download and verify SHA-256 checksum alongside the binary for supply
  chain security and reproducible builds (CodeRabbit review)
- Guard oled.service enablement: skip if binary download/verification
  failed, preventing broken service on resulting image
- Use OLED_BINARY_OK flag to communicate download status between
  pre_customize_image__ and post_customize_image__ hooks
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

♻️ Duplicate comments (1)
extensions/easepi-a2-peripherals.sh (1)

605-610: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Pin the OLED asset instead of using releases/latest.

Fetching both the binary and its checksum from releases/latest/download still leaves this image non-reproducible, and upstream can change between the two curl calls. Pin a concrete release tag and verify that exact asset instead.

Suggested hardening
-	local OLED_BASE_URL="https://github.com/ifroncy01/easepi-oled-daemon/releases/latest/download"
+	local OLED_RELEASE_TAG="vX.Y.Z"
+	local OLED_BASE_URL="https://github.com/ifroncy01/easepi-oled-daemon/releases/download/${OLED_RELEASE_TAG}"
 	local OLED_BIN_NAME="oled-linux-arm64"
🤖 Prompt for 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.

In `@extensions/easepi-a2-peripherals.sh` around lines 605 - 610, Change the
downloads to use a pinned release tag instead of releases/latest by updating
OLED_BASE_URL (and/or OLED_BIN_NAME) to include the concrete tag string,
download both the binary and its .sha256 from that tag, and then verify the
binary against the downloaded checksum before installing; specifically modify
the block that defines OLED_BASE_URL/OLED_BIN_NAME and the curl lines that fetch
"${OLED_BASE_URL}/${OLED_BIN_NAME}" and
"${OLED_BASE_URL}/${OLED_BIN_NAME}.sha256" so they reference the pinned tag and
add a checksum verification step (e.g., sha256sum -c or comparable) to ensure
the asset matches the exact release before proceeding.
🤖 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 `@extensions/easepi-a2-peripherals.sh`:
- Around line 609-622: The checksum is written to a hardcoded /tmp/oled.sha256
which can collide in parallel runs; change the code to create a unique temp file
(e.g., OLED_SHA_FILE="$(mktemp)") before downloading the checksum, use that
variable instead of /tmp/oled.sha256 when extracting EXPECTED_SUM and when
removing the file, and ensure the temp file is removed on all paths (success or
SHA mismatch) — update the curl target, the EXPECTED_SUM extraction, and the
final rm -f to reference OLED_SHA_FILE so display_alert, OLED_BINARY_OK, and the
chmod logic remain unchanged.

---

Duplicate comments:
In `@extensions/easepi-a2-peripherals.sh`:
- Around line 605-610: Change the downloads to use a pinned release tag instead
of releases/latest by updating OLED_BASE_URL (and/or OLED_BIN_NAME) to include
the concrete tag string, download both the binary and its .sha256 from that tag,
and then verify the binary against the downloaded checksum before installing;
specifically modify the block that defines OLED_BASE_URL/OLED_BIN_NAME and the
curl lines that fetch "${OLED_BASE_URL}/${OLED_BIN_NAME}" and
"${OLED_BASE_URL}/${OLED_BIN_NAME}.sha256" so they reference the pinned tag and
add a checksum verification step (e.g., sha256sum -c or comparable) to ensure
the asset matches the exact release before proceeding.
🪄 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: 96d8a9fb-812e-47ed-bc0d-9a27d45bf71d

📥 Commits

Reviewing files that changed from the base of the PR and between deeb140 and 0e6cb2b.

📒 Files selected for processing (1)
  • extensions/easepi-a2-peripherals.sh

Comment thread extensions/easepi-a2-peripherals.sh Outdated
@ifroncy01
Copy link
Copy Markdown
Author

@HeyMeco @EvilOlaf Thanks for your valuable feedback! I have completely refactored the workflow based on your suggestions:

Architecture Decoupling: Extracted the OLED Go source code into a dedicated repository (ifroncy01/easepi-oled-daemon) to keep the build system clean.
Security & Robustness: Implemented proper SHA-256 checksum verification for the prebuilt binary downloads and replaced all blind || true error masking with conditional guards.
Code Cleanup: Translated all residual Chinese comments to English and resolved all DTS compilation warnings (duplicate labels, CMA size conflict, and LED macros).

The required board assets and logos are currently pending in armbian/armbian.github.io#317. Once that asset PR is merged, the CI check here should turn green automatically.
Please take another look when you have time. Thank you! 🙏

@EvilOlaf
Copy link
Copy Markdown
Member

EvilOlaf commented May 24, 2026

I don't understand what all these dtsi files are for. Some of this stuff is probably upstream already and (if it is expected that these boards will never hit upstream), why not simply putting a full device tree for each into the dt folder/s?

About vendor kernel: We maintain our own version of kernel sources so you may want to send directly here: https://github.com/armbian/linux-rockchip instead of using a patch

edge is 7.0.y at this time. If you want to add/test 7.1-rcX, you can use bleedingedge as BRANCH.
Note that new current is most likely made from the latest edge once there is a new LTS kernel out there. This means your boards will abandon because it wasn't carried over through the non-lts kernels via edge.

All of rabbits concerns must be addressed or dismissed.

@armbian armbian deleted a comment from github-actions Bot May 24, 2026
@armbian armbian deleted a comment from github-actions Bot May 24, 2026
@armbian armbian deleted a comment from github-actions Bot May 24, 2026
@armbian armbian deleted a comment from github-actions Bot May 24, 2026
@ifroncy01
Copy link
Copy Markdown
Author

ifroncy01 commented May 24, 2026

#Hi @EvilOlaf,Thank you for the detailed feedback regarding architecture and maintenance.
Based on your comments and CodeRabbit suggestions, I have restructured the PR as follows:
DTS Cleanup: Removed 14 intermediate .dtsi files, inlining content directly into board .dts files to simplify and comply with standards.
Kernel Focus: Dropped edge targets for easepi-a2 and easepi-r2, prioritizing current (mainline) and vendor branches for stability.Code Migration:
I have already submitted the easepi-a2/r2 DTS patches directly to the armbian/linux-rockchip repository and am currently awaiting its review.
Validation: Addressed all CodeRabbit, security, and reproducibility concerns.Pending: Missing assets are tracked in armbian/armbian.github.io#317.Please re-review. Thank you! 🙏

@HeyMeco
Copy link
Copy Markdown
Collaborator

HeyMeco commented May 24, 2026

Since the extensions are board specific in this case it probably makes sense to keep them inside the board config too instead of separate.

@EvilOlaf
Copy link
Copy Markdown
Member

Not much more from my side.
Keeping extension stuff in board config file is a sane suggestion as extensions should ideally work on all boards or a whole family at least.
once the pr at linux-rockchip was accepted you can remove the needless dts in this repo from the pr.

@ifroncy01
Copy link
Copy Markdown
Author

I will integrate the extensions into the board configuration and monitor the review status of the linux-rockchip PR.

- Move easepi-a2-peripherals extension into easepi-a2.conf
- Move easepi-r2-peripherals extension into easepi-r2.conf
- Remove standalone extension files
- Refactor rk3568-easepi-a2 device tree structure
- Fix OLED binary download and verification
- Clean up DTS patches and drop edge target
@ifroncy01
Copy link
Copy Markdown
Author

@EvilOlaf @HeyMeco
work done...Still monitor the review status of the linux-rockchip PR.

@github-actions
Copy link
Copy Markdown
Contributor

🚫 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

  • Board image missing for easepi-a2

    • Expected: board-images/easepi-a2.png
    • Fix: add the file to armbian/armbian.github.io (folder board-images/)
  • Vendor logo missing for vendor easepi (used by board easepi-a2)

    • Expected: board-vendor-logos/easepi-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)
  • Board image missing for easepi-r2

    • Expected: board-images/easepi-r2.png
    • Fix: add the file to armbian/armbian.github.io (folder board-images/)
  • Vendor logo missing for vendor easepi (used by board easepi-r2)

    • Expected: board-vendor-logos/easepi-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 25, 2026
@armbian armbian deleted a comment from github-actions Bot May 25, 2026
@armbian armbian deleted a comment from github-actions Bot May 25, 2026
@armbian armbian deleted a comment from github-actions Bot May 25, 2026
Comment thread config/boards/easepi-a2.conf
Comment thread config/boards/easepi-r2.conf
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.

3 participants