From 28d8748bdba28d9a448bcaad5b4d574c378974fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Walstr=C3=B6m?= Date: Sat, 6 Sep 2025 22:18:27 +0200 Subject: [PATCH 1/6] uboot: Att uboot patches for 2025.01 - Fix CTRL-C misbehave - Add new command to detect RPI standard display --- ...ush-Remove-Ctrl-C-detection-in-loops.patch | 41 ++++++ .../2025.01/0002-add-rpidisplay-check.patch | 132 ++++++++++++++++++ 2 files changed, 173 insertions(+) create mode 100644 patches/uboot/2025.01/0001-hush-Remove-Ctrl-C-detection-in-loops.patch create mode 100644 patches/uboot/2025.01/0002-add-rpidisplay-check.patch diff --git a/patches/uboot/2025.01/0001-hush-Remove-Ctrl-C-detection-in-loops.patch b/patches/uboot/2025.01/0001-hush-Remove-Ctrl-C-detection-in-loops.patch new file mode 100644 index 00000000..0e1c0880 --- /dev/null +++ b/patches/uboot/2025.01/0001-hush-Remove-Ctrl-C-detection-in-loops.patch @@ -0,0 +1,41 @@ +From 989ef8436df2ee48d308981098c44b1b8257c23b Mon Sep 17 00:00:00 2001 +From: Tobias Waldekranz +Date: Mon, 10 Jun 2024 13:25:31 +0200 +Subject: [PATCH 8/8] hush: Remove Ctrl-C detection in loops +Organization: Addiva Elektronik + +Assume that the original intent was to emulate SIGINT to a shell. This +only works as expected if the loop in question is the ouermost, and +last, statement. In all other cases, it completely breaks the expected +execution flow. It more or less resurrects Visual Basic's "On Error +Resume Next". + +Disable this behavior and delegate the problem of loop termination to +the writer of the script instead. + +Signed-off-by: Tobias Waldekranz +--- + common/cli_hush.c | 7 ------- + 1 file changed, 7 deletions(-) + +diff --git a/common/cli_hush.c b/common/cli_hush.c +index 171069f5f4..d6d487893f 100644 +--- a/common/cli_hush.c ++++ b/common/cli_hush.c +@@ -1796,13 +1796,6 @@ static int run_list_real(struct pipe *pi) + for (; pi; pi = (flag_restore != 0) ? rpipe : pi->next) { + if (pi->r_mode == RES_WHILE || pi->r_mode == RES_UNTIL || + pi->r_mode == RES_FOR) { +-#ifdef __U_BOOT__ +- /* check Ctrl-C */ +- ctrlc(); +- if ((had_ctrlc())) { +- return 1; +- } +-#endif + flag_restore = 0; + if (!rpipe) { + flag_rep = 0; +-- +2.34.1 + diff --git a/patches/uboot/2025.01/0002-add-rpidisplay-check.patch b/patches/uboot/2025.01/0002-add-rpidisplay-check.patch new file mode 100644 index 00000000..5629d150 --- /dev/null +++ b/patches/uboot/2025.01/0002-add-rpidisplay-check.patch @@ -0,0 +1,132 @@ +diff --git a/cmd/Kconfig b/cmd/Kconfig +index 1d7ddb4ed36..8572dc4353e 100644 +--- a/cmd/Kconfig ++++ b/cmd/Kconfig +@@ -176,6 +176,20 @@ config CMD_CPU + internal name) and clock frequency. Other information may be + available depending on the CPU driver. + ++config CMD_RPI_DISPLAY ++ bool "rpidisplay" ++ depends on ARCH_BCM283X ++ help ++ Enable commands to detect Raspberry Pi 7" DSI display connection. ++ ++ This provides two commands: ++ - rpidisplay: Shows detailed detection information ++ - testrpidisplay: Silent test for use in boot scripts ++ ++ Detection is performed by querying the VideoCore GPU for the ++ active display resolution. The official Raspberry Pi 7" DSI ++ display uses 800x480 resolution. ++ + config CMD_FWU_METADATA + bool "fwu metadata read" + depends on FWU_MULTI_BANK_UPDATE +diff --git a/cmd/Makefile b/cmd/Makefile +index d1f369deec0..033ea1312ed 100644 +--- a/cmd/Makefile ++++ b/cmd/Makefile +@@ -48,6 +48,7 @@ obj-$(CONFIG_CMD_CLK) += clk.o + obj-$(CONFIG_CMD_CLS) += cls.o + obj-$(CONFIG_CMD_CONFIG) += config.o + obj-$(CONFIG_CMD_CONITRACE) += conitrace.o ++obj-$(CONFIG_CMD_RPI_DISPLAY) += rpi_display.o + obj-$(CONFIG_CMD_CONSOLE) += console.o + obj-$(CONFIG_CMD_CPU) += cpu.o + obj-$(CONFIG_CMD_DATE) += date.o +@@ -201,7 +202,6 @@ obj-$(CONFIG_CMD_LZMADEC) += lzmadec.o + obj-$(CONFIG_CMD_UFS) += ufs.o + obj-$(CONFIG_CMD_USB) += usb.o disk.o + obj-$(CONFIG_CMD_VIDCONSOLE) += video.o +- + obj-$(CONFIG_CMD_FASTBOOT) += fastboot.o + obj-$(CONFIG_CMD_FS_UUID) += fs_uuid.o + +diff --git a/cmd/rpi_display.c b/cmd/rpi_display.c +new file mode 100644 +index 00000000000..07abdc08552 +--- /dev/null ++++ b/cmd/rpi_display.c +@@ -0,0 +1,81 @@ ++// SPDX-License-Identifier: GPL-2.0+ ++/* ++ * Raspberry Pi 7" DSI Display Detection Command ++ * Detects if the official Raspberry Pi 7" DSI display is connected ++ */ ++ ++#include ++#include ++ ++static int do_rpi_display(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) ++{ ++ int width, height; ++ int ret; ++ ++ printf("=== Raspberry Pi 7\" DSI Display Detection ===\n"); ++ ++ /* Use official VideoCore mailbox interface to get display resolution */ ++ ret = bcm2835_get_video_size(&width, &height); ++ if (ret) { ++ printf("Failed to query VideoCore display size (ret=%d)\n", ret); ++ printf("Display Status: NOT DETECTED\n"); ++ return 2; ++ } ++ ++ printf("VideoCore reports display: %dx%d", width, height); ++ ++ /* Official Raspberry Pi 7" DSI display is 800x480 */ ++ if (width == 800 && height == 480) { ++ printf(" - RASPBERRY PI 7\" DSI DISPLAY DETECTED!\n"); ++ printf("Display Status: CONNECTED\n"); ++ return 0; ++ } ++ /* No resolution could indicate no display */ ++ else if (width == 0 || height == 0) { ++ printf(" - No active display\n"); ++ printf("Display Status: NOT DETECTED\n"); ++ return 1; ++ } ++ else { ++ printf(" - Not Raspberry Pi DSI display (resolution %dx%d)\n", width, height); ++ printf("Display Status: NOT DETECTED\n"); ++ return 1; ++ } ++} ++ ++static int do_test_rpi_display(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) ++{ ++ int width, height; ++ int ret; ++ ++ /* Silent test using VideoCore mailbox interface */ ++ ret = bcm2835_get_video_size(&width, &height); ++ if (ret) { ++ return 2; /* Failed to query VideoCore */ ++ } ++ ++ /* Check for Raspberry Pi DSI display resolutions */ ++ if ((width == 800 && height == 480)) { ++ return 0; /* DSI display found */ ++ } ++ ++ return 1; /* DSI display not found */ ++} ++ ++U_BOOT_CMD( ++ rpidisplay, 1, 1, do_rpi_display, ++ "detect Raspberry Pi DSI display", ++ "\n" ++ "Detects Raspberry Pi 7\" DSI display by checking resolution:\n" ++ " - 800x480 = Official Raspberry Pi 7\" DSI display\n" ++ "Returns: 0=connected, 1=not detected, 2=no video" ++); ++ ++U_BOOT_CMD( ++ testrpidisplay, 1, 1, do_test_rpi_display, ++ "silent test for Raspberry Pi DSI display", ++ "\n" ++ "Silent test for Raspberry Pi DSI display (for use in scripts):\n" ++ "Returns: 0=connected, 1=not detected, 2=no video\n" ++ "Usage: if testrpidisplay; then echo DSI found; fi" ++); From 19b965ac417f2bc7db3b5e84dd05020fb03a91e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Walstr=C3=B6m?= Date: Sat, 6 Sep 2025 22:17:03 +0200 Subject: [PATCH 2/6] RPI4: dts: Create a new device tree for the DSI display --- src/board/raspberry-pi-4/dts/Makefile | 2 +- .../dts/broadcom/bcm2711-rpi-4-b-dsi.dts | 88 +++++++++++++++++++ .../dts/broadcom/bcm2711-rpi-4-b.dts | 84 ------------------ 3 files changed, 89 insertions(+), 85 deletions(-) create mode 100644 src/board/raspberry-pi-4/dts/broadcom/bcm2711-rpi-4-b-dsi.dts diff --git a/src/board/raspberry-pi-4/dts/Makefile b/src/board/raspberry-pi-4/dts/Makefile index 80ebbc00..0b6f5ce9 100644 --- a/src/board/raspberry-pi-4/dts/Makefile +++ b/src/board/raspberry-pi-4/dts/Makefile @@ -1 +1 @@ -dtb-y += broadcom/bcm2711-rpi-4-b.dtb +dtb-y += broadcom/bcm2711-rpi-4-b.dtb broadcom/bcm2711-rpi-4-b-dsi.dtb diff --git a/src/board/raspberry-pi-4/dts/broadcom/bcm2711-rpi-4-b-dsi.dts b/src/board/raspberry-pi-4/dts/broadcom/bcm2711-rpi-4-b-dsi.dts new file mode 100644 index 00000000..f1c9b856 --- /dev/null +++ b/src/board/raspberry-pi-4/dts/broadcom/bcm2711-rpi-4-b-dsi.dts @@ -0,0 +1,88 @@ +#include "bcm2711-rpi-4-b.dts" + +/ { + panel_disp: panel_disp@1 { + reg = <1>; + compatible = "raspberrypi,7inch-dsi", "simple-panel"; + backlight = <®_display>; + power-supply = <®_display>; + port { + panel_in: endpoint { + remote-endpoint = <&bridge_out>; + }; + }; + }; + + reg_bridge: reg_bridge@1 { + reg = <1>; + compatible = "regulator-fixed"; + regulator-name = "bridge_reg"; + gpio = <®_display 0 0>; + vin-supply = <®_display>; + enable-active-high; + }; + +}; + +&i2c0mux { + status = "okay"; +}; + +&i2c0 { + status = "okay"; + reg_display: reg_display@45 { + compatible = "raspberrypi,7inch-touchscreen-panel-regulator"; + reg = <0x45>; + gpio-controller; + #gpio-cells = <2>; + }; + + ft5406: ts@38 { + compatible = "edt,edt-ft5506"; + reg = <0x38>; + touchscreen-size-x = < 800 >; + touchscreen-size-y = < 480 >; + vcc-supply = <®_display>; + reset-gpio = <®_display 1 1>; + }; +}; + + +&dsi1 { + status = "okay"; + port { + dsi_out: endpoint { + remote-endpoint = <&bridge_in>; + }; + }; + bridge@0 { + reg = <0>; + compatible = "toshiba,tc358762"; + vddc-supply = <®_bridge>; + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + bridge_in: endpoint { + remote-endpoint = <&dsi_out>; + }; + }; + + port@1 { + reg = <1>; + bridge_out: endpoint { + remote-endpoint = <&panel_in>; + }; + }; + }; + }; +}; + +&hdmi0 { + status = "disabled"; +}; +&hdmi1 { + status = "disabled"; +}; diff --git a/src/board/raspberry-pi-4/dts/broadcom/bcm2711-rpi-4-b.dts b/src/board/raspberry-pi-4/dts/broadcom/bcm2711-rpi-4-b.dts index cdf4fa68..3153526f 100644 --- a/src/board/raspberry-pi-4/dts/broadcom/bcm2711-rpi-4-b.dts +++ b/src/board/raspberry-pi-4/dts/broadcom/bcm2711-rpi-4-b.dts @@ -18,27 +18,6 @@ reusable; }; - panel_disp: panel_disp@1 { - reg = <1>; - compatible = "raspberrypi,7inch-dsi", "simple-panel"; - backlight = <®_display>; - power-supply = <®_display>; - port { - panel_in: endpoint { - remote-endpoint = <&bridge_out>; - }; - }; - }; - - reg_bridge: reg_bridge@1 { - reg = <1>; - compatible = "regulator-fixed"; - regulator-name = "bridge_reg"; - gpio = <®_display 0 0>; - vin-supply = <®_display>; - enable-active-high; - }; - chosen { /* 8250 auxiliary UART instead of pl011 */ stdout-path = "serial1:115200n8"; @@ -54,66 +33,3 @@ &vc4 { status = "okay"; }; -&i2c0mux { - status = "okay"; -}; - -&i2c0 { - status = "okay"; - reg_display: reg_display@45 { - compatible = "raspberrypi,7inch-touchscreen-panel-regulator"; - reg = <0x45>; - gpio-controller; - #gpio-cells = <2>; - }; - - ft5406: ts@38 { - compatible = "edt,edt-ft5506"; - reg = <0x38>; - touchscreen-size-x = < 800 >; - touchscreen-size-y = < 480 >; - vcc-supply = <®_display>; - reset-gpio = <®_display 1 1>; - }; -}; - - -&dsi1 { - status = "okay"; - port { - dsi_out: endpoint { - remote-endpoint = <&bridge_in>; - }; - }; - bridge@0 { - reg = <0>; - compatible = "toshiba,tc358762"; - vddc-supply = <®_bridge>; - ports { - #address-cells = <1>; - #size-cells = <0>; - - port@0 { - reg = <0>; - bridge_in: endpoint { - remote-endpoint = <&dsi_out>; - }; - }; - - port@1 { - reg = <1>; - bridge_out: endpoint { - remote-endpoint = <&panel_in>; - }; - }; - }; - }; -}; - -/* -&hdmi0 { - status = "disabled"; -}; -&hdmi1 { - status = "disabled"; -};*/ From 709f2769ce966c7e9e7dee4871b1ce0cad41c7db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Walstr=C3=B6m?= Date: Fri, 29 Aug 2025 21:59:22 +0200 Subject: [PATCH 3/6] Build aux when build infix --- package/board/raspberry-pi-4/Config.in | 1 + 1 file changed, 1 insertion(+) diff --git a/package/board/raspberry-pi-4/Config.in b/package/board/raspberry-pi-4/Config.in index a1c24996..31a01632 100644 --- a/package/board/raspberry-pi-4/Config.in +++ b/package/board/raspberry-pi-4/Config.in @@ -1,6 +1,7 @@ config BR2_PACKAGE_RASPBERRY_PI_4 bool "Raspberry Pi 4" depends on BR2_aarch64 + select SDCARD_AUX select BR2_PACKAGE_FEATURE_WIFI select BR2_PACKAGE_BRCMFMAC_SDIO_FIRMWARE_RPI select BR2_PACKAGE_BRCMFMAC_SDIO_FIRMWARE_RPI_WIFI From 700ec2f855a54f7cb164e8903ff9ca6286063a32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Walstr=C3=B6m?= Date: Wed, 27 Aug 2025 16:32:23 +0200 Subject: [PATCH 4/6] Add crete SD Card workflow --- .github/workflows/build-image.yml | 220 ++++++++++++++++++ .../{mksdcard.sh => mkimage.sh} | 13 +- 2 files changed, 224 insertions(+), 9 deletions(-) create mode 100644 .github/workflows/build-image.yml rename src/board/raspberry-pi-4/{mksdcard.sh => mkimage.sh} (76%) diff --git a/.github/workflows/build-image.yml b/.github/workflows/build-image.yml new file mode 100644 index 00000000..044a1510 --- /dev/null +++ b/.github/workflows/build-image.yml @@ -0,0 +1,220 @@ +name: Create SD Card Images + +on: + workflow_dispatch: + inputs: + board: + description: 'Board to create image for' + type: choice + required: true + options: + - raspberry-pi-4 + default: 'raspberry-pi-4' + use_latest_release: + description: 'Use latest release artifacts instead of workflow artifacts' + type: boolean + default: false + +jobs: + create-image: + name: Create SD Card Image for ${{ inputs.board }} + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + clean: true + fetch-depth: 0 + submodules: recursive + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y \ + genimage \ + u-boot-tools \ + parted \ + gdisk \ + qemu-utils \ + dosfstools \ + e2fsprogs \ + genext2fs \ + mtools \ + jq + + - name: Prepare build environment + run: | + # Set up directory structure similar to buildroot build + mkdir -p output/images + mkdir -p build + + - name: Set bootloader and target based on board + run: | + case "${{ inputs.board }}" in + raspberry-pi-4) + echo "BOOTLOADER=rpi4_boot" >> $GITHUB_ENV + echo "TARGET=aarch64" >> $GITHUB_ENV + ;; + *) + echo "Error: Unknown board ${{ inputs.board }}" + exit 1 + ;; + esac + echo "Using bootloader: $BOOTLOADER and target: $TARGET for board: ${{ inputs.board }}" + + - name: Download bootloader artifacts + if: ${{ !inputs.use_latest_release }} + run: | + # Download from latest bootloader build workflow on main branch + gh run list --workflow=build-boot.yml --branch=main --limit=1 --status=success --json databaseId --jq '.[0].databaseId' > latest_boot_run_id + BOOT_RUN_ID=$(cat latest_boot_run_id) + + gh run download ${BOOT_RUN_ID} --name artifact-${BOOTLOADER} --dir temp_bootloader/ + + # Extract bootloader directly to output/images + cd temp_bootloader/ + tar -xzf *.tar.gz --strip-components=1 -C ../output/images/ + cd ../ + rm -rf temp_bootloader/ + + echo "Bootloader files extracted to output/images:" + ls -la output/images/ + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Download Infix artifacts + if: ${{ !inputs.use_latest_release }} + run: | + # Download from latest Kernelkit Trigger workflow for main branch + gh run list --workflow=164295764 --branch=main --limit=1 --status=success --json databaseId --jq '.[0].databaseId' > latest_infix_run_id + INFIX_RUN_ID=$(cat latest_infix_run_id) + + gh run download ${INFIX_RUN_ID} --name artifact-${TARGET} --dir temp_infix/ + + # Extract Infix directly to output/images + cd temp_infix/ + tar -xzf *.tar.gz --strip-components=1 -C ../output/images/ + cd ../ + rm -rf temp_infix/ + + echo "Infix files extracted to output/images:" + ls -la output/images/ + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Download from latest releases + if: ${{ inputs.use_latest_release }} + run: | + # Download latest bootloader release + gh release download latest-boot --pattern "*${BOOTLOADER}*" --dir temp_bootloader/ + cd temp_bootloader/ + tar -xzf *.tar.gz --strip-components=1 -C ../output/images/ + cd ../ + rm -rf temp_bootloader/ + + # Download latest Infix release + gh release download latest --pattern "*${TARGET}*" --dir temp_infix/ + cd temp_infix/ + tar -xzf *.tar.gz --strip-components=1 -C ../output/images/ + cd ../ + rm -rf temp_infix/ + + echo "All files extracted to output/images:" + ls -la output/images/ + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Verify extracted files + run: | + echo "Files available for mkimage.sh:" + ls -la output/images/ + echo "" + echo "File types:" + file output/images/* || true + + - name: Create SD card image + run: | + export BINARIES_DIR=$PWD/output/images + export BUILD_DIR=$PWD/build + export BR2_EXTERNAL_INFIX_PATH=$PWD + export RELEASE="" + export INFIX_ID="infix" + + # Use the standardized mkimage.sh path for the selected board + # BOARD_SCRIPT="src/board/${{ inputs.board }}/mkimage.sh" + BOARD_SCRIPT="src/board/raspberry-pi-4/mkimage.sh" + + if [ -f "$BOARD_SCRIPT" ]; then + echo "Using board-specific image creation script: $BOARD_SCRIPT" + chmod +x "$BOARD_SCRIPT" + "$BOARD_SCRIPT" + else + echo "Error: Board script $BOARD_SCRIPT not found!" + exit 1 + fi + + - name: Verify created image + run: | + echo "Contents of output/images after mkimage.sh:" + ls -lh output/images/ + + # Look for SD card image with pattern: *-sdcard.img + if ls output/images/*-sdcard.img 1> /dev/null 2>&1; then + echo "Found SD card image(s):" + for img in output/images/*-sdcard.img; do + echo "- $(basename $img)" + file "$img" + fdisk -l "$img" 2>/dev/null || true + done + else + echo "No SD card image found matching pattern: *-sdcard.img" + echo "Available files:" + ls -la output/images/ + exit 1 + fi + + - name: Upload SD card image + uses: actions/upload-artifact@v4 + with: + name: sdcard-image-${{ inputs.board }}-${{ env.BOOTLOADER }} + path: | + output/images/*-sdcard.img + retention-days: 30 + + - name: Create checksums + run: | + cd output/images/ + for file in *-sdcard.img; do + if [ -f "$file" ]; then + sha256sum "$file" > "$file.sha256" + fi + done + + - name: Upload to release + uses: ncipollo/release-action@v1 + with: + allowUpdates: true + omitName: true + omitBody: true + omitBodyDuringUpdate: true + prerelease: true + tag: "latest-boot" + token: ${{ secrets.GITHUB_TOKEN }} + artifacts: "output/images/*-sdcard.img*" + + - name: Generate summary + run: | + cat <> $GITHUB_STEP_SUMMARY + # SD Card Image Build Complete! 🚀 + + **Board:** ${{ inputs.board }} + **Target:** ${{ env.TARGET }} + **Bootloader:** ${{ env.BOOTLOADER }} + **Artifact Source:** ${{ inputs.use_latest_release && 'Latest Release' || 'Latest Workflow Run' }} + + ## Created Images + $(find output/images/ -name "*.img" -o -name "*.qcow2" -o -name "*.raw" | xargs ls -lh 2>/dev/null | sed 's/^/- /' || echo "- No images found") + + ## Download + The SD card image is available as a workflow artifact above. + EOF diff --git a/src/board/raspberry-pi-4/mksdcard.sh b/src/board/raspberry-pi-4/mkimage.sh similarity index 76% rename from src/board/raspberry-pi-4/mksdcard.sh rename to src/board/raspberry-pi-4/mkimage.sh index 612f2be1..f2b39e34 100755 --- a/src/board/raspberry-pi-4/mksdcard.sh +++ b/src/board/raspberry-pi-4/mkimage.sh @@ -1,16 +1,10 @@ #!/bin/sh set -e -#. "$BR2_CONFIG" 2>/dev/null BOARD_DIR=$(dirname "$0") GENIMAGE_CFG="${BUILD_DIR}/genimage.cfg" GENIMAGE_TMP="${BUILD_DIR}/genimage.tmp" -# Device trees are installed for distro boot (syslinux.conf), but on RPi -# we need them for the SPL, which feeds the TPL (U-Boot) for use instead -# of the (built-in) control DT other platforms use. -find "${TARGET_DIR}/boot" -type f -name '*.dtb' -exec cp '{}' "${BINARIES_DIR}/" \; - # We've asked U-Boot previously to build overlays for us: Infix signing # key and our ixboot scripts. Make sure here they are installed in the # proper directory so genimage can create the DOS partition the SPL @@ -26,15 +20,16 @@ for f in "${BINARIES_DIR}"/rpi-firmware/*; do echo "${FILES}" | grep -q `basename $f` && continue # If already exist it has been added by us. FILES="${FILES}\t\t\t\"${f#"${BINARIES_DIR}/"}\",\n" done - +FILES="${FILES}\t\t\t\"splash.bmp\",\n" echo $FILES KERNEL=$(sed -n 's/^kernel=//p' "${BINARIES_DIR}/rpi-firmware/config.txt") FILES="${FILES}\t\t\t\"${KERNEL}\"" sed "s|#BOOT_FILES#|${FILES}|" "${BOARD_DIR}/genimage.cfg.in" | \ -sed "s|#VERSION#|${RELEASE}|" | \ -sed "s|#INFIX_ID#|${INFIX_ID}|" > "${GENIMAGE_CFG}" +sed "s|#INFIX_ID#|${INFIX_ID}|" | \ +sed "s|#VERSION#|${RELEASE}|" > "${GENIMAGE_CFG}" + ROOTPATH_TMP=$(mktemp -d) trap 'rm -rf \"$ROOTPATH_TMP\"' EXIT From 0477446e49d3a2c73d6e24518b7f9a2da9ecbca7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Walstr=C3=B6m?= Date: Fri, 29 Aug 2025 11:34:23 +0200 Subject: [PATCH 5/6] package/bootloader-splashscreen: New packet for adding/modify bootloader splash --- board/common/uboot/splash.bmp | Bin 0 -> 1152138 bytes configs/rpi4_boot_defconfig | 3 +++ package/Config.in | 1 + package/bootloader-splashscreen/Config.in | 12 +++++++++++ .../bootloader-splashscreen.mk | 19 ++++++++++++++++++ 5 files changed, 35 insertions(+) create mode 100644 board/common/uboot/splash.bmp create mode 100644 package/bootloader-splashscreen/Config.in create mode 100644 package/bootloader-splashscreen/bootloader-splashscreen.mk diff --git a/board/common/uboot/splash.bmp b/board/common/uboot/splash.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a72b2c258d1550878c2dc5b72ff67f5c3977a449 GIT binary patch literal 1152138 zcmeI*Yph+_K_Bo*W+oZW!()3q_IPa1`2Dzk`}%EPzwPU5`(9taJ(FoDfe?ZUii(Pg znl>l`0cop>7HBD=QU$8`KuAB8N|jPkwNg`BK2-Dt2q=}RBC58Oh9o?a{x91s@7d>Z z&pG#D``+Kk8LhL=-fQpu+sE1eS!?aJ&yRoZN0&b{_0Q+>zfb3X8=igUncw=rGtYeB znKz~uKl4n!|4*+x^QZr-7EJy78-MoaPZymZz4hIXzU!^@!QNK076AeT2oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N 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 Date: Fri, 29 Aug 2025 12:26:20 +0200 Subject: [PATCH 6/6] board: rpi4: Add splashscreen on boot Show splash in uboot. --- board/common/uboot/splash.bmp | Bin 1152138 -> 1152138 bytes src/board/raspberry-pi-4/config.txt | 6 ++++-- src/board/raspberry-pi-4/uboot/extras.config | 8 ++++++++ src/board/raspberry-pi-4/uboot/rpi-env.dtso | 9 ++++++++- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/board/common/uboot/splash.bmp b/board/common/uboot/splash.bmp index a72b2c258d1550878c2dc5b72ff67f5c3977a449..46afbdb94f00ccf7abe48df38fafc7e9bd71b031 100644 GIT binary patch literal 1152138 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 z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs 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