Skip to content

Radxa Zero 3W — Unlock SD Card UHS-I SDR104 on DietPi #8083

@jcmtang

Description

@jcmtang

For a few weeks I just accepted the poor r/w performance the SD card on this SBC, but then after seeing some Youtube videos with double the performance on some other distro, I had to start investigating. With the help of Claude Sonnet 4.6, I got document generated. I ran the script for both the generic micro SD card and on a Samsung EVO micro SD card and got better performance.

Radxa Zero 3W — Unlock SD Card UHS-I SDR104 on DietPi

Background

By default, the Radxa Zero 3W ships with the SD card slot locked to SD High-Speed mode
(50 MHz, ~21 MB/s)
. The hardware is fully capable of UHS-I SDR104 (150 MHz), but Radxa's
device tree omits the required flags. This guide unlocks it via a custom device tree overlay.

What this achieves

Before After
Clock 50 MHz 150 MHz
Mode SD High-Speed UHS-I SDR104
Signal Voltage 3.3V 1.8V
Read speed (hdparm) ~21 MB/s ~66 MB/s
Sequential read ~21 MB/s ~56 MB/s
Sequential write ~18 MB/s ~25 MB/s

Tested on DietPi with kernel 6.18.16-current-rockchip64.


How it works

The RK3566 SoC's SD slot (mmc@fe2b0000) has a vqmmc-supply pointing to LDO_REG5
(vccio_sd) on the RK805 PMIC — a switchable regulator supporting both 1.8V and 3.3V.
The kernel just needs to be told UHS-I is allowed via the sd-uhs-sdr104 device tree flag.
The overlay adds this flag at boot time without modifying any system files permanently.


One-shot script

Copy and paste the entire block below into your terminal as root or with sudo:

#!/bin/bash
set -e
 
echo "=== Radxa Zero 3W SD UHS-I unlock ==="
 
# Step 1: Install device-tree-compiler if missing
if ! command -v dtc &>/dev/null; then
    echo "[+] Installing device-tree-compiler..."
    sudo apt install -y device-tree-compiler
fi
 
# Step 2: Write the overlay source
echo "[+] Writing DTS overlay..."
cat << 'EOF' > /tmp/rk3566-sd-uhs.dts
/dts-v1/;
/plugin/;
 
/ {
    fragment@0 {
        target-path = "/mmc@fe2b0000";
        __overlay__ {
            sd-uhs-sdr50;
            sd-uhs-sdr104;
        };
    };
};
EOF
 
# Step 3: Compile the overlay
echo "[+] Compiling overlay..."
dtc -@ -I dts -O dtb -o /tmp/rk3566-sd-uhs.dtbo /tmp/rk3566-sd-uhs.dts
 
# Step 4: Install overlay to system overlay directory
echo "[+] Installing overlay to /boot/dtb/rockchip/overlay/..."
sudo cp /tmp/rk3566-sd-uhs.dtbo /boot/dtb/rockchip/overlay/radxa-zero3-sd-uhs.dtbo
 
# Step 5: Enable overlay in dietpiEnv.txt
echo "[+] Enabling overlay in /boot/dietpiEnv.txt..."
if grep -q "^overlays=" /boot/dietpiEnv.txt; then
    if ! grep -q "sd-uhs" /boot/dietpiEnv.txt; then
        sudo sed -i 's/^overlays=\(.*\)/overlays=\1 sd-uhs/' /boot/dietpiEnv.txt
        sudo sed -i 's/^overlays= /overlays=/' /boot/dietpiEnv.txt
    else
        echo "[=] sd-uhs already listed in overlays, skipping."
    fi
else
    echo "overlays=sd-uhs" | sudo tee -a /boot/dietpiEnv.txt
fi
 
echo ""
echo "=== Done! dietpiEnv.txt now reads: ==="
grep "^overlays=" /boot/dietpiEnv.txt
echo ""
echo "[!] Reboot now to apply: sudo reboot"
echo "    After reboot, verify with:"
echo "    sudo cat /sys/kernel/debug/mmc1/ios"
echo "    Look for: timing spec: sd uhs SDR104 and signal voltage: 1.80 V"

Verify after reboot

# Should show: timing spec: sd uhs SDR104 and signal voltage: 1.80 V
sudo cat /sys/kernel/debug/mmc1/ios
 
# Benchmark
sudo hdparm -t /dev/mmcblk1
sudo dietpi-benchmark

Reverting

If anything goes wrong, remove the SD card, mount it on another Linux machine, and either:

  • Delete /boot/dtb/rockchip/overlay/radxa-zero3-sd-uhs.dtbo, or
  • Edit /boot/dietpiEnv.txt and change overlays=sd-uhs back to overlays=

Then reboot normally.


Notes

  • Tested on: Radxa Zero 3W, DietPi, kernel 6.18.16-current-rockchip64
  • PMIC: RK805 on I2C (i2c@fdd40000), LDO_REG5 = vccio_sd (1.8V–3.3V switchable)
  • SD controller: dwmmc_rockchip at fe2b0000
  • The overlay is non-destructive — it is applied at boot and does not modify your DTB
  • The overlay sits alongside official Armbian/DietPi overlays in the system overlay directory
  • A kernel update may overwrite the overlay directory — re-run this script if speeds regress after apt upgrade
  • Write speed improvement is modest (~25 MB/s) due to flash controller overhead; reads benefit most

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions