🛠 Bootloader EEPROM du CM4 : maîtriser BOOT_ORDER via usbboot

Raspberry Pi Compute Module 4 (CM4, 2020) — Fiche de carte · intermediaire · Schéma : IMG-compute-module-4-intermediaire-1-ordre-boot-eeprom-cm4.svg — CM4 sur IO Board avec jumper J2 (nRPI_BOOT) posé, câble micro-USB J11 relié à un PC hôte exécutant rpiboot ; une puce EEPROM sur le module est mise en évidence avec les valeurs BOOT_ORDER 0xf1, 0xf2, 0xf15, 0xf6.

Objetivos

El CM4 es el primer Compute Module con un bootloader en una EEPROM SPI integrada en el módulo. Consecuencias concretas: recovery.bin nunca se ejecuta desde la eMMC/SD, el servicio rpi-eeprom-update está desactivado por defecto, y cualquier modificación del orden de arranque debe realizarse mediante usbboot/rpiboot. Este tutorial: leer la versión del bootloader, cambiar BOOT_ORDER (0xf1 SD/eMMC, 0xf2 red, 0xf15 USB→eMMC, 0xf6 NVMe) a través del flujo de recuperación, y luego bloquear la escritura en la EEPROM.

Material

Código completo

#!/usr/bin/env bash
# bootorder-cm4.sh — reprogrammer BOOT_ORDER de l'EEPROM d'un CM4 (flux officiel).
set -euo pipefail
git clone --depth 1 https://github.com/raspberrypi/usbboot && cd usbboot
cd recovery
cat > boot.conf <<'EOF'
[All]
BOOT_ORDER=0xf15
EOF
./update-pieeprom.sh                     # régénère pieeprom.bin depuis boot.conf
cd .. && sudo ./rpiboot -d recovery      # écrit l'EEPROM (J2 posé, EEPROM_nWP non maintenu bas)

Luego, una vez que el módulo haya reiniciado normalmente (J2 retirado):

vcgencmd bootloader_version | head -1    # la date doit correspondre au build fraîchement écrit
grep -i boot /var/log/bootstrap.log 2>/dev/null || true
# Durcissement production : protection en écriture
echo 'eeprom_write_protect=1' | sudo tee -a /boot/firmware/config.txt

Verificación esperada

vcgencmd bootloader_version muestra la fecha de la compilación regenerada; con BOOT_ORDER=0xf15, conectar una memoria USB arrancable hace que el módulo inicie desde ella con respaldo en eMMC. El registro del arranque (uart o journalctl -b) registra el orden de arranque utilizado.

Errores frecuentes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales