To successfully boot from USB on a Raspberry Pi 5, you must update the RP1/BCM2712 bootloader EEPROM to prioritize USB Mass Storage (MSD) by setting the BOOT_ORDER to 0xf416 (USB first, SD fallback) or 0xf146 (SD first, USB fallback). Unlike the Pi 4, the Pi 5 routes its USB 3.0 lanes through the RP1 southbridge chip, meaning power delivery limits and UAS (USB Attached SCSI) driver quirks are the primary failure points for external SSDs. If your drive spins up but the system hangs, you are likely hitting a 1.2A downstream current limit or a kernel UAS panic.
Hardware Requirements & Build Specs
Before touching the EEPROM, ensure your bench setup can handle the Pi 5’s transient power spikes. The official 27W USB-C PD power supply is practically mandatory for USB boot; a standard 15W phone charger will trigger brownouts the moment the SSD controller initializes.
Estimated Time: 30 minutes
Target Board Variant: Raspberry Pi 5 (8GB RAM, BCM2712 SoC, RP1 Southbridge)
Exact Parts List
- Compute: Raspberry Pi 5 (8GB model) with active cooler
- Storage: Samsung T7 Shield 1TB USB 3.2 Gen 2 SSD (or Sabrent EC-SNVE NVMe USB enclosure)
- Power: Official Raspberry Pi 27W USB-C PD Power Supply
- Debug: Adafruit PL2303HX Console Cable (for UART serial output)
- Indicator: 5mm LED + 330Ω resistor (for USB link status)
Boot Media Performance & EEPROM Hex Codes
The Pi 5 bootloader uses a hexadecimal mask to determine the boot sequence. Below is the performance reality of different media types on the Pi 5, alongside the exact EEPROM hex codes required to enable them. This data is based on BCM2712 silicon running the 2026 stable EEPROM branch.
| Media Type | Seq. Read (MB/s) | Random 4K (IOPS) | Boot Order Hex | Peak Power Draw |
|---|---|---|---|---|
| microSD (SanDisk Extreme A2) | 85 MB/s | ~2,500 | 0xf1 (SD Only) |
0.3A |
| USB 3.0 SATA SSD (Samsung T7) | 410 MB/s | ~12,000 | 0xf41 (USB then SD) |
0.9A |
| USB 3.0 NVMe Enclosure (RTL9210B) | 430 MB/s | ~18,000 | 0xf416 (USB, SD, Restart) |
1.4A (Risk of Brownout) |
| PCIe Gen 2 NVMe (via M.2 HAT+) | 850 MB/s | ~45,000 | 0xf461 (PCIe, USB, SD) |
1.1A (Dedicated Rail) |
Wiring the Debug UART & Flashing the Bootloader
When a Pi 5 fails to boot from USB, the HDMI output often remains completely dark because the GPU hasn't initialized. To see why it's failing, you need the serial console. The Pi 5 moved the primary UART pins compared to older models, but the physical header layout remains compatible with standard 40-pin wiring.
Pin Mapping Table: UART Debug & Status LED
| Pi 5 GPIO (BCM) | Physical Pin | Function | Connect To |
|---|---|---|---|
| GPIO 14 (TXD) | Pin 8 | Serial Transmit | UART Cable RX (White) |
| GPIO 15 (RXD) | Pin 10 | Serial Receive | UART Cable TX (Green) |
| GND | Pin 6 | Ground Reference | UART Cable GND (Black) |
| GPIO 17 | Pin 11 | USB 3.0 Link Status | LED Anode (via 330Ω) |
Step-by-Step EEPROM Update
- Boot the Pi 5 from a spare microSD card first to access the CLI.
- Open the terminal and check your current bootloader config:
sudo rpi-eeprom-config - Look for the
BOOT_ORDERline. If it is missing or set to0xf1, you need to edit it. - Run the interactive editor:
sudo -E rpi-eeprom-config --edit - Change or add the line to:
BOOT_ORDER=0xf416 - Save and exit (Ctrl+O, Enter, Ctrl+X in nano). The system will flash the EEPROM and prompt a reboot.
- Power down, remove the microSD card, plug in your USB SSD, and apply power.
0xf416 hex code breaks down as: 6 (Restart loop), 1 (SD Card fallback), 4 (USB-MSD primary). If you want the Pi to try the network (PXE) before giving up, use 0xf4216.
Troubleshooting: "USB-MSD: timeout" and Boot Failures
If your serial console is connected at 115200 baud, you will see the bootloader's raw output. The most common exact error string when a USB drive fails to initialize on the Pi 5 is:
Boot mode: USB-MSD (02) order f4
USB2: over-current
USB-MSD: timeout
Boot failed: device not found
The First Three Things to Check
- Power Supply Handshake (The 27W Rule): The Pi 5 negotiates 5V/5A via USB-C PD. If you use a standard 5V/3A charger, the RP1 chip artificially limits downstream USB current to 600mA to prevent system brownouts. Most NVMe enclosures need 900mA+ to spin up. Fix: Use the official 27W Pi PSU or a verified 100W PD laptop charger.
- UAS (USB Attached SCSI) Kernel Panics: Many Realtek (RTL9210B) and JMicron NVMe-to-USB bridge chips crash the Pi 5 Linux kernel during boot because they mishandle UAS TRIM commands. Fix: You must disable UAS for that specific drive by adding a quirk to
cmdline.txt. Find your drive ID withlsusb(e.g.,0bda:9210) and addusb-storage.quirks=0bda:9210:uto the end of your kernel parameters. - Cable Impedance & USB 2.0 Fallback: If the Pi 5 detects signal degradation on the USB-C to USB-A adapter or the SSD cable, it will silently drop the link from 5Gbps (USB 3.0) to 480Mbps (USB 2.0). The bootloader often times out at 480Mbps before the drive finishes enumerating. Fix: Use the factory cable included with the SSD, no longer than 0.5m.
Verifying USB 3.0 Link Speed with Python
Once booted, you need to verify the drive didn't silently drop to USB 2.0 speeds. The following Python script targets the Raspberry Pi 5 (8GB) BCM2712 variant. It parses the USB tree, checks for the 5000M (5Gbps) link speed, and triggers a physical LED on GPIO 17 if the bus degrades. This is highly useful for headless kiosk builds.
import subprocess
import re
from gpiozero import LED
import time
import sys
# Pin Definitions for Raspberry Pi 5 (BCM2712)
# GPIO 17: Status LED (USB 3.0 Link Indicator)
# Wired to Anode via 330 ohm resistor, Cathode to GND
USB_STATUS_LED = LED(17)
def check_usb_link_speed():
"""
Parses lsusb tree to verify USB 3.0 (5000M) link speeds.
Returns True if 5Gbps is detected, False otherwise.
"""
try:
# Execute lsusb to check bus speeds natively
result = subprocess.run(
['lsusb', '-t'],
capture_output=True,
text=True,
check=True
)
output = result.stdout
# Look for 5000M (USB 3.0/3.1/3.2 Gen 1) on the root hubs
# The Pi 5 RP1 chip exposes USB 3.0 as 5000M in the sysfs tree
if '5000M' in output:
print("[OK] USB 3.0 link established (5000M).")
USB_STATUS_LED.on()
return True
else:
print("[WARN] USB dropped to 2.0 (480M) or lower. Check cable/impedance.")
USB_STATUS_LED.blink(0.5, 0.5)
return False
except subprocess.CalledProcessError as e:
print(f"[ERROR] Failed to execute lsusb: {e.stderr}")
USB_STATUS_LED.off()
return False
except Exception as e:
print(f"[ERROR] Unexpected system failure: {e}")
USB_STATUS_LED.off()
return False
if __name__ == "__main__":
print("--- Raspberry Pi 5 USB Boot Verification Script ---")
print("Target Board: Raspberry Pi 5 (8GB) - BCM2712 / RP1")
# Run initial check
is_usb3 = check_usb_link_speed()
if not is_usb3:
print("Action required: Inspect physical USB layer and UAS quirks.")
sys.exit(1)
else:
print("Boot media operating at full bandwidth.")
sys.exit(0)
Extending and Simplifying Your USB Boot Build
Depending on your end goal, you can either simplify this setup for mass deployment or extend it for maximum I/O throughput.
How to Simplify (Mass Deployment)
If you are building a fleet of Pi 5s and don't want to manually edit EEPROMs via CLI, use the Raspberry Pi Imager on your host PC. Under the 'OS Customisation' menu (the gear icon), you can inject a custom rpi-eeprom-config file directly into the boot partition. Furthermore, if you pre-format your USB SSDs with the boot partition labeled exactly as the Pi expects, and set the EEPROM to 0xf416, the Pi 5 will automatically clone and boot without requiring a monitor or keyboard.
How to Extend (PCIe NVMe Migration)
While USB 3.0 SSDs cap out around 430 MB/s due to the RP1 chip's internal bus architecture and UAS overhead, the Pi 5 features a dedicated PCIe 2.0 x1 lane. If your project requires sustained database writes or heavy Docker container swapping, abandon USB boot and migrate to an M.2 NVMe HAT+. You will need to change your BOOT_ORDER to 0xf461 to prioritize the PCIe bus over the USB controller, and ensure you add dtparam=pciex1_gen=2 to your config.txt to force Gen 2 speeds (yielding ~850 MB/s real-world throughput).
For deeper technical specifications on the BCM2712 bootloader modes, refer to the official Raspberry Pi bootmode documentation. For verified storage benchmarks and UAS quirk lists, the Raspberry Pi 5 community forums remain the most up-to-date repository for edge-case silicon bugs.






