From 65fdef963ce4ccf1b74185c1f8cfc5224a5c06aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20=C4=8Cerm=C3=A1k?= Date: Wed, 14 May 2025 17:25:29 +0200 Subject: [PATCH] Enable usage of rpi-eeprom-update on Raspberry Pi 4/5/Yellow (#4063) * package/vcgencmd: add tool for RPi VideoCore commands This tool is used by rpi-eeprom-update and is fairly lightweight binary without dependencies. Use it as-is from raspberry/utils repo. * package/rpi-eeprom: change package to install EEPROM userspace scripts * configs: enable rpi-eeprom for rpi4, rpi4-64, rpi5-64 and yellow On Pi5 and Yellow also enable flashrom so the firmware can be installed directly without recovery being involved. On Yellow/CM4 this can't be done without config.txt changes though (SPI and pinmuxing needs to be enabled) but the image is shared there and users may eventually use the tools if they want, so install BCM2711 on Yellow too. The "officially recommended" method is rpiboot though, which is also documented in Yellow docs. --- buildroot-external/Config.in | 1 + buildroot-external/configs/rpi4_64_defconfig | 2 + buildroot-external/configs/rpi4_defconfig | 2 + buildroot-external/configs/rpi5_64_defconfig | 3 + buildroot-external/configs/yellow_defconfig | 2 + ...-update-adjust-hassos-boot-discovery.patch | 30 ++++++++ ...e-remove-raspi-config-mentions-and-u.patch | 68 +++++++++++++++++++ .../package/rpi-eeprom/Config.in | 33 ++++++++- .../package/rpi-eeprom/rpi-eeprom.hash | 3 + .../package/rpi-eeprom/rpi-eeprom.mk | 34 ++++++---- buildroot-external/package/vcgencmd/Config.in | 5 ++ .../package/vcgencmd/vcgencmd.hash | 3 + .../package/vcgencmd/vcgencmd.mk | 17 +++++ 13 files changed, 190 insertions(+), 13 deletions(-) create mode 100644 buildroot-external/package/rpi-eeprom/0001-rpi-eeprom-update-adjust-hassos-boot-discovery.patch create mode 100644 buildroot-external/package/rpi-eeprom/0002-rpi-eeprom-update-remove-raspi-config-mentions-and-u.patch create mode 100644 buildroot-external/package/rpi-eeprom/rpi-eeprom.hash create mode 100644 buildroot-external/package/vcgencmd/Config.in create mode 100644 buildroot-external/package/vcgencmd/vcgencmd.hash create mode 100644 buildroot-external/package/vcgencmd/vcgencmd.mk diff --git a/buildroot-external/Config.in b/buildroot-external/Config.in index 1bdb1b922..c2e9b877a 100644 --- a/buildroot-external/Config.in +++ b/buildroot-external/Config.in @@ -17,4 +17,5 @@ source "$BR2_EXTERNAL_HASSOS_PATH/package/rpi-rf-mod/Config.in" source "$BR2_EXTERNAL_HASSOS_PATH/package/rtl88x2bu/Config.in" source "$BR2_EXTERNAL_HASSOS_PATH/package/tempio/Config.in.host" source "$BR2_EXTERNAL_HASSOS_PATH/package/udisks2/Config.in" +source "$BR2_EXTERNAL_HASSOS_PATH/package/vcgencmd/Config.in" source "$BR2_EXTERNAL_HASSOS_PATH/package/xe-guest-utilities/Config.in" diff --git a/buildroot-external/configs/rpi4_64_defconfig b/buildroot-external/configs/rpi4_64_defconfig index b90128956..70c9c154d 100644 --- a/buildroot-external/configs/rpi4_64_defconfig +++ b/buildroot-external/configs/rpi4_64_defconfig @@ -160,6 +160,8 @@ BR2_PACKAGE_HASSIO_MACHINE="raspberrypi4-64" BR2_PACKAGE_OS_AGENT=y BR2_PACKAGE_OS_AGENT_BOARD="RaspberryPi4" BR2_PACKAGE_PI_BLUETOOTH=y +BR2_PACKAGE_RPI_EEPROM=y +BR2_PACKAGE_RPI_EEPROM_TARGET_RPI4=y BR2_PACKAGE_RPI_RF_MOD=y BR2_PACKAGE_RPI_RF_MOD_DTS=y BR2_PACKAGE_RTL88X2BU=y diff --git a/buildroot-external/configs/rpi4_defconfig b/buildroot-external/configs/rpi4_defconfig index a3a5c0c7b..ce7dd1d7c 100644 --- a/buildroot-external/configs/rpi4_defconfig +++ b/buildroot-external/configs/rpi4_defconfig @@ -158,6 +158,8 @@ BR2_PACKAGE_HASSIO_MACHINE="raspberrypi4" BR2_PACKAGE_OS_AGENT=y BR2_PACKAGE_OS_AGENT_BOARD="RaspberryPi4" BR2_PACKAGE_PI_BLUETOOTH=y +BR2_PACKAGE_RPI_EEPROM=y +BR2_PACKAGE_RPI_EEPROM_TARGET_RPI4=y BR2_PACKAGE_RPI_RF_MOD=y BR2_PACKAGE_RPI_RF_MOD_DTS=y BR2_PACKAGE_RTL88X2BU=y diff --git a/buildroot-external/configs/rpi5_64_defconfig b/buildroot-external/configs/rpi5_64_defconfig index f674b7bfa..d62ef6011 100644 --- a/buildroot-external/configs/rpi5_64_defconfig +++ b/buildroot-external/configs/rpi5_64_defconfig @@ -75,6 +75,7 @@ BR2_PACKAGE_LINUX_FIRMWARE_RTL_RTW89=y BR2_PACKAGE_LINUX_FIRMWARE_RTL_815X=y BR2_PACKAGE_LINUX_FIRMWARE_USB_SERIAL_TI=y BR2_PACKAGE_DBUS_BROKER=y +BR2_PACKAGE_FLASHROM=y BR2_PACKAGE_GPTFDISK=y BR2_PACKAGE_GPTFDISK_SGDISK=y # BR2_PACKAGE_LVM2_STANDARD_INSTALL is not set @@ -151,6 +152,8 @@ BR2_PACKAGE_HASSIO_MACHINE="raspberrypi5-64" BR2_PACKAGE_OS_AGENT=y BR2_PACKAGE_OS_AGENT_BOARD="RaspberryPi5" BR2_PACKAGE_PI_BLUETOOTH=y +BR2_PACKAGE_RPI_EEPROM=y +BR2_PACKAGE_RPI_EEPROM_TARGET_RPI5=y BR2_PACKAGE_RPI_RF_MOD=y BR2_PACKAGE_RPI_RF_MOD_DTS=y BR2_PACKAGE_RTL88X2BU=y diff --git a/buildroot-external/configs/yellow_defconfig b/buildroot-external/configs/yellow_defconfig index dd6e0a5a2..22ec270ab 100644 --- a/buildroot-external/configs/yellow_defconfig +++ b/buildroot-external/configs/yellow_defconfig @@ -77,6 +77,7 @@ BR2_PACKAGE_RPI_FIRMWARE=y BR2_PACKAGE_RPI_FIRMWARE_VARIANT_PI4=y # BR2_PACKAGE_RPI_FIRMWARE_INSTALL_DTB_OVERLAYS is not set BR2_PACKAGE_DBUS_BROKER=y +BR2_PACKAGE_FLASHROM=y BR2_PACKAGE_GPTFDISK=y BR2_PACKAGE_GPTFDISK_SGDISK=y BR2_PACKAGE_INPUT_EVENT_DAEMON=y @@ -164,6 +165,7 @@ BR2_PACKAGE_HASSIO_MACHINE="yellow" BR2_PACKAGE_OS_AGENT=y BR2_PACKAGE_OS_AGENT_BOARD="Yellow" BR2_PACKAGE_PI_BLUETOOTH=y +BR2_PACKAGE_RPI_EEPROM=y BR2_PACKAGE_RPI_RF_MOD=y BR2_PACKAGE_RPI_RF_MOD_DTS=y BR2_PACKAGE_RPI_RF_MOD_DTS_YELLOW=y diff --git a/buildroot-external/package/rpi-eeprom/0001-rpi-eeprom-update-adjust-hassos-boot-discovery.patch b/buildroot-external/package/rpi-eeprom/0001-rpi-eeprom-update-adjust-hassos-boot-discovery.patch new file mode 100644 index 000000000..e99c1853a --- /dev/null +++ b/buildroot-external/package/rpi-eeprom/0001-rpi-eeprom-update-adjust-hassos-boot-discovery.patch @@ -0,0 +1,30 @@ +From ecc0714d0c132acdce1d7363567917e00ece26f9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jan=20=C4=8Cerm=C3=A1k?= +Date: Tue, 13 May 2025 17:19:59 +0200 +Subject: [PATCH] rpi-eeprom-update: adjust hassos-boot discovery +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Make discovery of boot partition compatible with HAOS without the need +to set BOOTFS in /etc/default/rpi-eeprom-update. + +Signed-off-by: Jan Čermák +Upstream: not applicable +--- + rpi-eeprom-update | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/rpi-eeprom-update b/rpi-eeprom-update +index b970142..720efb7 100755 +--- a/rpi-eeprom-update ++++ b/rpi-eeprom-update +@@ -725,7 +725,7 @@ findBootFS() + # If ${BOOTFS} is not writable OR is not on /dev/mmcblk0 then error because the ROM + # can only load recovery.bin from the on-board SD-CARD slot or the EEPROM. + +- if blkid | grep -qE "/dev/mmcblk0p1.*LABEL_FATBOOT.*RECOVERY.*TYPE.*vfat"; then ++ if blkid | grep -qE "/dev/mmcblk0p1.*LABEL_FATBOOT.*hassos-boot.*TYPE.*vfat"; then + TMP_BOOTFS_MNT="$(mktemp -d)" + mount /dev/mmcblk0p1 "${TMP_BOOTFS_MNT}" + BOOTFS="${TMP_BOOTFS_MNT}" diff --git a/buildroot-external/package/rpi-eeprom/0002-rpi-eeprom-update-remove-raspi-config-mentions-and-u.patch b/buildroot-external/package/rpi-eeprom/0002-rpi-eeprom-update-remove-raspi-config-mentions-and-u.patch new file mode 100644 index 000000000..846f068a6 --- /dev/null +++ b/buildroot-external/package/rpi-eeprom/0002-rpi-eeprom-update-remove-raspi-config-mentions-and-u.patch @@ -0,0 +1,68 @@ +From bea845559542e556dfaffcec7334695a6387e0d9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jan=20=C4=8Cerm=C3=A1k?= +Date: Tue, 13 May 2025 18:07:13 +0200 +Subject: [PATCH] rpi-eeprom-update: remove raspi-config mentions and + unnecessary sudo in help +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +There is no sudo on HAOS, remove it from messages that could be shown to +users. Also remove raspi-config mention, we will only carry the default +release. + +Signed-off-by: Jan Čermák +Upstream: not applicable +--- + rpi-eeprom-update | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +diff --git a/rpi-eeprom-update b/rpi-eeprom-update +index 720efb7..eb19872 100755 +--- a/rpi-eeprom-update ++++ b/rpi-eeprom-update +@@ -30,7 +30,6 @@ FIRMWARE_RELEASE_STATUS=${FIRMWARE_RELEASE_STATUS:-default} + FIRMWARE_BACKUP_DIR=${FIRMWARE_BACKUP_DIR:-/var/lib/raspberrypi/bootloader/backup} + ENABLE_VL805_UPDATES=${ENABLE_VL805_UPDATES:-1} + CM4_ENABLE_RPI_EEPROM_UPDATE=${CM4_ENABLE_RPI_EEPROM_UPDATE:-0} +-RPI_EEPROM_UPDATE_CONFIG_TOOL="${RPI_EEPROM_UPDATE_CONFIG_TOOL:-raspi-config}" + + # Self-update is preferred to using recovery.bin because it avoids modifiy the + # boot partition in order to rename recovery.bin after use. Since the 2711 ROM +@@ -315,7 +314,7 @@ applyRecoveryUpdate() + echo "EEPROM updates pending. Please reboot to apply the update." + + if [ "${RPI_EEPROM_USE_FLASHROM}" = 0 ]; then +- echo "To cancel a pending update run \"sudo rpi-eeprom-update -r\"." ++ echo "To cancel a pending update run \"rpi-eeprom-update -r\"." + fi + } + +@@ -634,7 +633,7 @@ To update the configuration file in an EEPROM image: + rpi-eeprom-config pieeprom.bin --config bootconf.txt --out pieeprom-new.bin + + To flash the new image: +- sudo rpi-eeprom-update -d -f ./pieeprom-new.bin ++ rpi-eeprom-update -d -f ./pieeprom-new.bin + + The syntax is the same as config.txt See online documentation for the list of parameters. + +@@ -694,7 +693,6 @@ printVersions() + echo " CURRENT: $(date -u "-d@${BOOTLOADER_CURRENT_VERSION}") (${BOOTLOADER_CURRENT_VERSION})" + echo " LATEST: $(date -u "-d@${BOOTLOADER_UPDATE_VERSION}") (${BOOTLOADER_UPDATE_VERSION})" + echo " RELEASE: ${FIRMWARE_RELEASE_STATUS} (${FIRMWARE_IMAGE_DIR})" +- echo " Use ${RPI_EEPROM_UPDATE_CONFIG_TOOL} to change the release." + + if [ "${BCM_CHIP}" = 2711 ]; then + echo "" +@@ -905,9 +903,7 @@ checkVersion() + if [ "${ACTION_UPDATE_BOOTLOADER}" = 1 ] || [ "${ACTION_UPDATE_VL805}" = 1 ]; then + echo "*** UPDATE AVAILABLE ***" + echo "" +- echo "Run \"sudo rpi-eeprom-update -a\" to install this update now." +- echo +- echo "To configure the bootloader update policy run \"sudo ${RPI_EEPROM_UPDATE_CONFIG_TOOL}\"" ++ echo "Run \"rpi-eeprom-update -a\" to install this update now." + echo "" + printVersions + write_status_info "EXIT_UPDATE_REQUIRED" diff --git a/buildroot-external/package/rpi-eeprom/Config.in b/buildroot-external/package/rpi-eeprom/Config.in index 08f6987df..3aa59f621 100644 --- a/buildroot-external/package/rpi-eeprom/Config.in +++ b/buildroot-external/package/rpi-eeprom/Config.in @@ -1,6 +1,37 @@ config BR2_PACKAGE_RPI_EEPROM bool "rpi-eeprom" + select BR2_PACKAGE_PYTHON3 + select BR2_PACKAGE_VCGENCMD help - EEPROM bootloader firmware for Raspberry Pi 4 + EEPROM bootloader firmware update tool for Raspberry Pi https://github.com/raspberrypi/rpi-eeprom + +if BR2_PACKAGE_RPI_EEPROM + +choice + prompt "Target platform" + default BR2_PACKAGE_RPI_EEPROM_TARGET_ANY + help + Select the target platform for the EEPROM files to be + installed. The default is to install all EEPROM files for + all Raspberry Pi boards. + +config BR2_PACKAGE_RPI_EEPROM_TARGET_ANY + bool "Any Raspberry Pi" + help + Install all EEPROM files for all Raspberry Pi boards. + +config BR2_PACKAGE_RPI_EEPROM_TARGET_RPI4 + bool "Raspberry Pi 4" + help + Install EEPROM files for Raspberry Pi 4 boards only. + +config BR2_PACKAGE_RPI_EEPROM_TARGET_RPI5 + bool "Raspberry Pi 5" + help + Install EEPROM files for Raspberry Pi 5 boards only. + +endchoice + +endif diff --git a/buildroot-external/package/rpi-eeprom/rpi-eeprom.hash b/buildroot-external/package/rpi-eeprom/rpi-eeprom.hash new file mode 100644 index 000000000..958b57bb8 --- /dev/null +++ b/buildroot-external/package/rpi-eeprom/rpi-eeprom.hash @@ -0,0 +1,3 @@ +# Locally computed +sha256 9e64372f0480b8410fce3f9cc12c01548eaac36e36fe0fe8f979535281d41290 rpi-eeprom-cd4048df1d55be89bf84879754a4acf9c92e1f7a.tar.gz +sha256 594b7565fd3ccf8acd4711a2ec1b199181aafbc3426d0bacaa50ef40edbf7c4a LICENSE diff --git a/buildroot-external/package/rpi-eeprom/rpi-eeprom.mk b/buildroot-external/package/rpi-eeprom/rpi-eeprom.mk index a1ee7d0a6..a85e4644b 100644 --- a/buildroot-external/package/rpi-eeprom/rpi-eeprom.mk +++ b/buildroot-external/package/rpi-eeprom/rpi-eeprom.mk @@ -4,24 +4,34 @@ # ################################################################################ -RPI_EEPROM_VERSION = 16bb29427f96dc8276a7102c0526154a1084bffd +RPI_EEPROM_VERSION = cd4048df1d55be89bf84879754a4acf9c92e1f7a RPI_EEPROM_SITE = $(call github,raspberrypi,rpi-eeprom,$(RPI_EEPROM_VERSION)) RPI_EEPROM_LICENSE = BSD-3-Clause RPI_EEPROM_LICENSE_FILES = LICENSE -RPI_EEPROM_INSTALL_IMAGES = YES -RPI_EEPROM_FIRMWARE_PATH = firmware/beta/pieeprom-2020-10-28.bin -define RPI_EEPROM_BUILD_CMDS - $(@D)/rpi-eeprom-config $(@D)/$(RPI_EEPROM_FIRMWARE_PATH) --out $(@D)/default.conf - (cat $(@D)/default.conf | grep -v ^$$; echo HDMI_DELAY=0) > $(@D)/boot.conf - $(@D)/rpi-eeprom-config $(@D)/$(RPI_EEPROM_FIRMWARE_PATH) --config $(@D)/boot.conf --out $(@D)/pieeprom.upd - sha256sum $(@D)/pieeprom.upd | awk '{ print $$1 }' > $(@D)/pieeprom.sig - echo "ts: $$(date -u +%s)" >> $(@D)/pieeprom.sig +ifneq ($(BR2_PACKAGE_RPI_EEPROM_TARGET_ANY)$(BR2_PACKAGE_RPI_EEPROM_TARGET_RPI4),) +define RPI_EEPROM_INSTALL_RPI4_FILES + $(INSTALL) -d $(TARGET_DIR)/usr/lib/firmware/raspberrypi/bootloader-2711/default + $(INSTALL) -D -m 0644 $(@D)/firmware-2711/default/recovery.bin $(TARGET_DIR)/usr/lib/firmware/raspberrypi/bootloader-2711/default/ + $(INSTALL) -D -m 0644 $(@D)/firmware-2711/default/vl805-000138c0.bin $(TARGET_DIR)/usr/lib/firmware/raspberrypi/bootloader-2711/default/ + $(INSTALL) -D -m 0644 $(@D)/firmware-2711/default/pieeprom-2025-02-11.bin $(TARGET_DIR)/usr/lib/firmware/raspberrypi/bootloader-2711/default/ endef +endif -define RPI_EEPROM_INSTALL_IMAGES_CMDS - $(INSTALL) -D -m 0644 $(@D)/pieeprom.sig $(BINARIES_DIR)/rpi-eeprom/pieeprom.sig - $(INSTALL) -D -m 0644 $(@D)/pieeprom.upd $(BINARIES_DIR)/rpi-eeprom/pieeprom.upd +ifneq ($(BR2_PACKAGE_RPI_EEPROM_TARGET_ANY)$(BR2_PACKAGE_RPI_EEPROM_TARGET_RPI5),) +define RPI_EEPROM_INSTALL_RPI5_FILES + $(INSTALL) -d $(TARGET_DIR)/usr/lib/firmware/raspberrypi/bootloader-2712/default + $(INSTALL) -D -m 0644 $(@D)/firmware-2712/default/recovery.bin $(TARGET_DIR)/usr/lib/firmware/raspberrypi/bootloader-2712/default/ + $(INSTALL) -D -m 0644 $(@D)/firmware-2712/default/pieeprom-2025-03-10.bin $(TARGET_DIR)/usr/lib/firmware/raspberrypi/bootloader-2712/default/ +endef +endif + +define RPI_EEPROM_INSTALL_TARGET_CMDS + $(RPI_EEPROM_INSTALL_RPI4_FILES) + $(RPI_EEPROM_INSTALL_RPI5_FILES) + $(INSTALL) -D -m 0755 $(@D)/rpi-eeprom-config $(TARGET_DIR)/usr/bin/rpi-eeprom-config + $(INSTALL) -D -m 0755 $(@D)/rpi-eeprom-digest $(TARGET_DIR)/usr/bin/rpi-eeprom-digest + $(INSTALL) -D -m 0755 $(@D)/rpi-eeprom-update $(TARGET_DIR)/usr/bin/rpi-eeprom-update endef $(eval $(generic-package)) diff --git a/buildroot-external/package/vcgencmd/Config.in b/buildroot-external/package/vcgencmd/Config.in new file mode 100644 index 000000000..d5e42fb0b --- /dev/null +++ b/buildroot-external/package/vcgencmd/Config.in @@ -0,0 +1,5 @@ +config BR2_PACKAGE_VCGENCMD + bool "vcgencmd" + help + Command line utility that can get various pieces of + information from the VideoCore GPU on the Raspberry Pi. diff --git a/buildroot-external/package/vcgencmd/vcgencmd.hash b/buildroot-external/package/vcgencmd/vcgencmd.hash new file mode 100644 index 000000000..35ed7e000 --- /dev/null +++ b/buildroot-external/package/vcgencmd/vcgencmd.hash @@ -0,0 +1,3 @@ +# Locally computed +sha256 c31953e8ee666c9b01499d4da639f4f4ec6567822b6daa55dd402468564b1a12 vcgencmd-c57d8c29c46993d93f191218bbc1dc3a73fc7918.tar.gz +sha256 731da956431d1a7c5073e7ee5ebe01f54e359c5339310b32f0893c6fe6507d5a LICENSE diff --git a/buildroot-external/package/vcgencmd/vcgencmd.mk b/buildroot-external/package/vcgencmd/vcgencmd.mk new file mode 100644 index 000000000..3c015ae2a --- /dev/null +++ b/buildroot-external/package/vcgencmd/vcgencmd.mk @@ -0,0 +1,17 @@ +################################################################################ +# +# vcgencmd +# +################################################################################ + +VCGENCMD_VERSION = c57d8c29c46993d93f191218bbc1dc3a73fc7918 +VCGENCMD_SITE = $(call github,raspberrypi,utils,$(VCGENCMD_VERSION)) +VCGENCMD_LICENSE = BSD-3-Clause +VCGENCMD_LICENSE_FILES = LICENSE +VCGENCMD_SUBDIR = vcgencmd + +define VCGENCMD_INSTALL_TARGET_CMDS + $(INSTALL) -D -m 0755 $(@D)/vcgencmd/vcgencmd $(TARGET_DIR)/usr/bin/vcgencmd +endef + +$(eval $(cmake-package))