Skip to content

Releases: gahingwoo/edk2-rk3576

0.2.0: Windows 11 on the CM5-IO

Choose a tag to compare

@gahingwoo gahingwoo released this 01 Oct 06:58

Windows 11 23H2 boots to the desktop on the ArmSoM CM5-IO, from its eMMC, with Ethernet and both USB ports working. The Windows drivers and the install tools are in woa-rk3576 0.1.0.

What changed

Ethernet. The firmware set RXC_DLY_EN on the YT8531C PHY. Mainline clears it when the device tree gives no rx-internal-delay-ps, as on this board, because it adds a fixed delay on top of the programmed one. With it set, every frame UEFI received failed its CRC. The PHY's 25 MHz reference clock is now programmed by the firmware instead of being left to whatever ran before, and GMAC0 has no MAC-side TX delay, matching rgmii-id.

USB-C under Windows. The USB-C controller's USB3 port starts disabled, and its xHCI then describes a USB3 port range with no ports in it. UEFI and Linux skip that; Windows rejected the whole controller with code 10. The firmware now enables the port at ExitBootServices. The port runs at USB 2.0 outside Linux, because no driver here brings up its USBDP PHY.

ACPI for the Windows drivers. Every I²C controller publishes rockchip,bclk, which the I²C driver needs to start. The SD controller no longer advertises UHS modes and sets no-1-8-v, since nothing Windows can reach switches the card to 1.8 V on RK3576.

Docs. Shorter, one place for board status, and FLASHING now explains how to update the firmware on an eMMC that already holds Windows.

Tested

On the CM5-IO with Windows 11 23H2 Enterprise 22631.2428: boots from the eMMC, eight cores, 3.7 GB, the NVMe, the SD card, a DHCP lease on Ethernet, and a device on each USB controller. Each of these was seen on one boot or a few. Fedora booted from NVMe the same day, on a build from before the USB-C change.

The ROCK 4D image is built but not tested with this release. Two changes reach it: the ACPI changes above, and the USB-C port write at ExitBootServices. The Ethernet changes are CM5-IO only.

Known issues

  • Windows 11 24H2 and later cannot run: RK3576 is ARMv8.0.
  • Boot entries written from an OS do not reach the firmware. Windows boots through \EFI\Boot\bootaa64.efi.
  • The USB-C port is USB 2.0 in UEFI and Windows.
  • The ComboPHY and PCIe device-tree fixups look in the wrong place and do nothing. NVMe works without them.
  • The firmware reports itself as rk3576-<board>-b62c824-dirty; the suffix comes from the vendored EDK2 patches.

Images

Built from b62c824, which is the 0.2.0 tag. It differs from the build tested on hardware (5edeab0) only in documentation.

File Board Goes on
ROCK4D-spi-edk2-0.2.0.img Radxa ROCK 4D 16 MB SPI NOR, rkdeveloptool wl 0
CM5IO-sdcard-edk2-0.2.0.img ArmSoM CM5-IO SD card, dd
CM5IO-emmc-edk2-0.2.0.img ArmSoM CM5-IO eMMC. On an empty eMMC, wl 0. If Windows or anything else is installed, write only the firmware partition: tail -c +32769 <img> > p1.bin, then rkdeveloptool wl 64 p1.bin. Writing the whole image replaces the partition table.
CM5IO-emmc.sfdisk ArmSoM CM5-IO the eMMC partition table on its own

rkdeveloptool db needs an RKLD loader such as rkbin's rk3576_spl_loader_*.bin. On the CM5-IO the MaskROM port is the USB-C port. Full instructions, and the browser tool at flash.gahingwoo.com: FLASHING. Serial console: 1500000 8N1.

0.1.2 — a display that stays up, and Linux from NVMe

Choose a tag to compare

@gahingwoo gahingwoo released this 26 Sep 19:01

104 commits since 0.1.1. The display intermittency that made 0.1.1 a coin flip is gone, PCIe works, and both boards boot Linux.

Highlights

Display. CM5-IO reaches a clean 2560x1440 picture on 15 of 15 cold boots. Six independent defects were behind the old behaviour: RK3576's per-VP mixers were left at their reset values (this was the black vertical stripes), VP0's STANDBY bit was cleared after HDMI setup instead of before it (an SError on every boot), every HDMI and HDPTX reset ID was computed with the vendor encoding and landed in DDR and NPU registers, the overlay block was programmed with RK3568's register layout, the VOP and VO0 power domains were never powered before the display was touched, and register reads left in the display path killed the signal on this SoC.

Memory map. RK3576's DRAM starts at 0x40000000. The shared RK3588 map declared roughly 700 MB of non-DRAM as System RAM, so the first touch was a synchronous external abort. All 4 GB is now mapped: a 4 GB board reports 3838 MB where it used to report 2814 MB.

PCIe. PERST# was driven inverted, and the LTSSM was enabled after PERST# was released instead of before. NVMe enumerates, and Fedora boots from it on both boards.

eMMC. The card runs at HighSpeed rather than the legacy 26 MHz workaround, which was breaking every multi-block write. UEFI variables persist on the boot medium. The card clock is restarted after a CRU rate change, which took the probe from 8 errors over 4 rounds and about five minutes down to one clean round in about a second. Both controllers are quiesced at ExitBootServices.

Ethernet. CM5-IO's GbE PHY is a Motorcomm YT8531C, not the RTL8211F its device tree claimed, and is now recognised.

Windows on Arm. All 8 cores start (each MADT GICC needed its own CPU interface number; RK3576 is GICv2, not GICv3). The MCFG no longer folds the bus offset into the base address or claims more buses than the aperture holds. The RK3588 SCMI device, which cannot work on this SoC, is gone. Windows 10 21H2 Setup runs and NVMe works under it. Storage on the eMMC is still incomplete.

Build. The tree was restructured so RK3576 no longer includes RK3588's DSC, EDK2 is pinned to edk2-stable202602, CI builds both boards green, and the local EDK2 core changes live in patches/ instead of an untracked tree.

Boards

ArmSoM CM5-IO is the verified board: display 15 of 15 cold boots, eMMC reads and writes with persistent UEFI variables, NVMe, GbE, and Fedora on the desktop.

Radxa ROCK 4D puts out a stable HDMI signal and boots Fedora from an NVMe disk with this firmware, so both PCIe fixes hold there too. That was a bench run, but its serial log was lost, so there is no boot count and no capture behind the claim, and nothing identifies which of the display fixes closed the earlier HPD-reads-low failure. Treat it as working on thin evidence.

Known issues

  • eMMC is not usable under Windows yet. The card is found and the driver runs, but identification stops at the bus-width test.
  • An SD card in the slot makes a Windows boot crawl. Firmware now quiesces both controllers at ExitBootServices, which fixed it in the four boots tested since.
  • The ComboPHY and PCIe device-tree fixups address /pcie@… where mainline puts those nodes under /soc/, so they are silent no-ops. NVMe works without them.
  • The firmware reports itself as rk3576-<board>-ab08ae9-dirty. CI's checkout carries the vendored EDK2 patches, so git describe sees a modified tree. Cosmetic.

Images

Built from ab08ae9. The 0.1.2 tag is one documentation-only commit on top of it, so no code differs from what the images carry.

File Board Medium How to flash
ROCK4D-spi-edk2-0.1.2.img Radxa ROCK 4D SPI NOR (16 MB) MaskROM, then rkdeveloptool db rk3576_spl_loader.bin && rkdeveloptool wl 0 <img>
CM5IO-sdcard-edk2-0.1.2.img ArmSoM CM5-IO SD card dd if=<img> of=/dev/sdX bs=1M
CM5IO-emmc-edk2-0.1.2.img ArmSoM CM5-IO eMMC MaskROM wl 0, or dd to /dev/mmcblk0. Carries a GPT that leaves the remaining 29 GiB usable.
CM5IO-emmc.sfdisk ArmSoM CM5-IO eMMC Only needed if you flashed the plain sdcard image to eMMC and want the partition table back: sfdisk --wipe always /dev/mmcblk0 < CM5IO-emmc.sfdisk

db needs an RKLD loader such as rkbin's rk3576_spl_loader_*.bin, not binaries/rk3576_ddr.bin. Full instructions, including the browser tool at flash.gahingwoo.com, are in docs/FLASHING.md.

SHA256SUMS.txt is attached. Serial console is 1500000 8N1.

0.1.1 — HDMI on the glass

Choose a tag to compare

@gahingwoo gahingwoo released this 20 Jun 09:57

EDK2 UEFI firmware for RK3576 now drives HDMI to a real picture on both Radxa ROCK 4D and ArmSoM CM5-IO (EDID read, TianoCore GOP at native resolution).

Highlights

  • HDMI works on both boards. Root fix: removed the ReadyToBoot VOP2 register dump that was corrupting the video stream and killing the signal.
  • RK3576 ComboPhy: validate GetVariable size before use.
  • Copyright attribution + stale duplicate-tree cleanup across the RK3576 port.

Known issue

  • CM5-IO HDMI has a minor horizontal offset. The picture is correct otherwise; the RK3576 background/pre-scan delay still uses the RK3588 formula (one-register fix pending).

Images

File Board Medium How to flash
ROCK4D-spi-edk2-0.1.1.img Radxa ROCK 4D SPI NOR (16 MB) MaskROM + rkdeveloptool db rk3576_ddr.bin && rkdeveloptool wl 0 <img>
CM5IO-sdcard-edk2-0.1.1.img ArmSoM CM5-IO SD card / eMMC dd if=<img> of=/dev/sdX bs=1M (or MaskROM wl 0 to eMMC)

SHA256SUMS.txt included for verification. Serial: 1500000 8N1.

0.1: docs: add edk2-webflash WebUSB browser flash tool

Choose a tag to compare

@gahingwoo gahingwoo released this 20 May 11:18
Add link and instructions for the browser-based WebUSB flasher:
  https://gahingwoo.github.io/edk2-webflash/

- README: badge + Option 1 (browser) in TL;DR flash section
- docs/FLASHING.md: Option 0 with step-by-step instructions

Wraps rkdeveloptool compiled to WASM; no tools or drivers needed
on Linux/macOS (Chrome/Edge with WebUSB).

0.1-alpha

0.1-alpha Pre-release
Pre-release

Choose a tag to compare

@gahingwoo gahingwoo released this 11 Apr 09:27
3b34c08

HDMI is not working, please use ttl
Screenshot 2026-04-11 at 21 26 15