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

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions