From f4001aa44bdcd8482409461384bf3231904cd718 Mon Sep 17 00:00:00 2001 From: pstruebi Date: Mon, 21 Apr 2025 16:35:54 +0200 Subject: [PATCH] add rpi5 custom example --- board/raspberrypi5_custom/cmdline.txt | 1 + board/raspberrypi5_custom/config.txt | 26 +++ board/raspberrypi5_custom/genimage.cfg.in | 25 +++ .../linux-4k-page-size.fragment | 1 + .../patches/linux-headers/linux-headers.hash | 1 + .../patches/linux/linux.hash | 2 + board/raspberrypi5_custom/post-build.sh | 16 ++ board/raspberrypi5_custom/post-image.sh | 44 +++++ board/raspberrypi5_custom/readme.txt | 172 ++++++++++++++++++ configs/raspberrypi5_custom_defconfig | 37 ++++ 10 files changed, 325 insertions(+) create mode 100644 board/raspberrypi5_custom/cmdline.txt create mode 100644 board/raspberrypi5_custom/config.txt create mode 100644 board/raspberrypi5_custom/genimage.cfg.in create mode 100644 board/raspberrypi5_custom/linux-4k-page-size.fragment create mode 120000 board/raspberrypi5_custom/patches/linux-headers/linux-headers.hash create mode 100644 board/raspberrypi5_custom/patches/linux/linux.hash create mode 100755 board/raspberrypi5_custom/post-build.sh create mode 100755 board/raspberrypi5_custom/post-image.sh create mode 100644 board/raspberrypi5_custom/readme.txt create mode 100644 configs/raspberrypi5_custom_defconfig diff --git a/board/raspberrypi5_custom/cmdline.txt b/board/raspberrypi5_custom/cmdline.txt new file mode 100644 index 0000000..155a546 --- /dev/null +++ b/board/raspberrypi5_custom/cmdline.txt @@ -0,0 +1 @@ +root=/dev/mmcblk0p2 rootwait console=tty1 console=ttyAMA0,115200 diff --git a/board/raspberrypi5_custom/config.txt b/board/raspberrypi5_custom/config.txt new file mode 100644 index 0000000..61443d6 --- /dev/null +++ b/board/raspberrypi5_custom/config.txt @@ -0,0 +1,26 @@ +# See http://buildroot.org/manual.html#rootfs-custom +# and http://elinux.org/RPiconfig for a description of config.txt syntax + +kernel=Image + +# To use an external initramfs file +#initramfs rootfs.cpio.gz + +# Disable HDMI to reduce noise +hdmi_ignore_hotplug=1 +hdmi_blanking=2 +disable_splash=1 + +# gpu mem config (seems to be totally nececcarry - smaller than 32m does not boot on rpi3) +gpu_mem=32 + +# uart debug enable on GPIO14/15 +enable_uart=1 +uart_2ndstage=1 +dtparam=uart0_console +dtdebug=1 + +dtoverlay=disable-bt +dtoverlay=disable-wifi +dtoverlay=uart1-pi5 +dtoverlay=uart2-pi5 \ No newline at end of file diff --git a/board/raspberrypi5_custom/genimage.cfg.in b/board/raspberrypi5_custom/genimage.cfg.in new file mode 100644 index 0000000..fd38b86 --- /dev/null +++ b/board/raspberrypi5_custom/genimage.cfg.in @@ -0,0 +1,25 @@ +image boot.vfat { + vfat { + files = { +#BOOT_FILES# + } + } + + size = 32M +} + +image sdcard.img { + hdimage { + } + + partition boot { + partition-type = 0xC + bootable = "true" + image = "boot.vfat" + } + + partition rootfs { + partition-type = 0x83 + image = "rootfs.ext4" + } +} diff --git a/board/raspberrypi5_custom/linux-4k-page-size.fragment b/board/raspberrypi5_custom/linux-4k-page-size.fragment new file mode 100644 index 0000000..5df91df --- /dev/null +++ b/board/raspberrypi5_custom/linux-4k-page-size.fragment @@ -0,0 +1 @@ +CONFIG_ARM64_4K_PAGES=y diff --git a/board/raspberrypi5_custom/patches/linux-headers/linux-headers.hash b/board/raspberrypi5_custom/patches/linux-headers/linux-headers.hash new file mode 120000 index 0000000..5808d92 --- /dev/null +++ b/board/raspberrypi5_custom/patches/linux-headers/linux-headers.hash @@ -0,0 +1 @@ +../linux/linux.hash \ No newline at end of file diff --git a/board/raspberrypi5_custom/patches/linux/linux.hash b/board/raspberrypi5_custom/patches/linux/linux.hash new file mode 100644 index 0000000..8d43c25 --- /dev/null +++ b/board/raspberrypi5_custom/patches/linux/linux.hash @@ -0,0 +1,2 @@ +# Locally calculated +sha256 dab3052783c68c46a5bc645b1c38d9705da995ab42823566518b62eb1fa1ef97 linux-576cc10e1ed50a9eacffc7a05c796051d7343ea4.tar.gz diff --git a/board/raspberrypi5_custom/post-build.sh b/board/raspberrypi5_custom/post-build.sh new file mode 100755 index 0000000..73026e5 --- /dev/null +++ b/board/raspberrypi5_custom/post-build.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +set -u +set -e + +# Add a console on tty1 +if [ -e ${TARGET_DIR}/etc/inittab ]; then + grep -qE '^tty1::' ${TARGET_DIR}/etc/inittab || \ + sed -i '/GENERIC_SERIAL/a\ +tty1::respawn:/sbin/getty -L tty1 0 vt100 # HDMI console' ${TARGET_DIR}/etc/inittab +# systemd doesn't use /etc/inittab, enable getty.tty1.service instead +elif [ -d ${TARGET_DIR}/etc/systemd ]; then + mkdir -p "${TARGET_DIR}/etc/systemd/system/getty.target.wants" + ln -sf /lib/systemd/system/getty@.service \ + "${TARGET_DIR}/etc/systemd/system/getty.target.wants/getty@tty1.service" +fi diff --git a/board/raspberrypi5_custom/post-image.sh b/board/raspberrypi5_custom/post-image.sh new file mode 100755 index 0000000..9b9eac9 --- /dev/null +++ b/board/raspberrypi5_custom/post-image.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +set -e + +BOARD_DIR="$(dirname $0)" +BOARD_NAME="$(basename ${BOARD_DIR})" +GENIMAGE_CFG="${BOARD_DIR}/genimage-${BOARD_NAME}.cfg" +GENIMAGE_TMP="${BUILD_DIR}/genimage.tmp" + +# generate genimage from template if a board specific variant doesn't exists +if [ ! -e "${GENIMAGE_CFG}" ]; then + GENIMAGE_CFG="${BINARIES_DIR}/genimage.cfg" + FILES=() + + for i in "${BINARIES_DIR}"/*.dtb "${BINARIES_DIR}"/rpi-firmware/*; do + FILES+=( "${i#${BINARIES_DIR}/}" ) + done + + KERNEL=$(sed -n 's/^kernel=//p' "${BINARIES_DIR}/rpi-firmware/config.txt") + FILES+=( "${KERNEL}" ) + + BOOT_FILES=$(printf '\\t\\t\\t"%s",\\n' "${FILES[@]}") + sed "s|#BOOT_FILES#|${BOOT_FILES}|" "${BOARD_DIR}/genimage.cfg.in" \ + > "${GENIMAGE_CFG}" +fi + +# Pass an empty rootpath. genimage makes a full copy of the given rootpath to +# ${GENIMAGE_TMP}/root so passing TARGET_DIR would be a waste of time and disk +# space. We don't rely on genimage to build the rootfs image, just to insert a +# pre-built one in the disk image. + +trap 'rm -rf "${ROOTPATH_TMP}"' EXIT +ROOTPATH_TMP="$(mktemp -d)" + +rm -rf "${GENIMAGE_TMP}" + +genimage \ + --rootpath "${ROOTPATH_TMP}" \ + --tmppath "${GENIMAGE_TMP}" \ + --inputpath "${BINARIES_DIR}" \ + --outputpath "${BINARIES_DIR}" \ + --config "${GENIMAGE_CFG}" + +exit $? diff --git a/board/raspberrypi5_custom/readme.txt b/board/raspberrypi5_custom/readme.txt new file mode 100644 index 0000000..81cd81a --- /dev/null +++ b/board/raspberrypi5_custom/readme.txt @@ -0,0 +1,172 @@ +Raspberry Pi + +Intro +===== + +These instructions apply to all models of the Raspberry Pi: + - the original models A and B, + - the "enhanced" models A+ and B+, + - the model B2 (aka Raspberry Pi 2) + - the model B3 (aka Raspberry Pi 3). + - the model B4 (aka Raspberry Pi 4). + - the model CM4 (aka Raspberry Pi Compute Module 4 and IO Board). + - the model B5 (aka Raspberry Pi 5). + +How to build it +=============== + +Configure Buildroot +------------------- + +There are several Raspberry Pi defconfig files in Buildroot, one for +each major variant, which you should base your work on: + +For models A, B, A+ or B+: + + $ make raspberrypi_defconfig + +For model Zero (model A+ in smaller form factor): + + $ make raspberrypi0_defconfig + +or for model Zero W (model Zero with wireless LAN and Bluetooth): + + $ make raspberrypi0w_defconfig + +For model Zero 2 W (model B3 in smaller form factor): + + $ make raspberrypizero2w_defconfig + +For model 2 B: + + $ make raspberrypi2_defconfig + +For model 3 B and B+: + + $ make raspberrypi3_defconfig + +or for model 3 B and B+ (64 bit): + + $ make raspberrypi3_64_defconfig + +For model 4 B: + + $ make raspberrypi4_defconfig + +or for model 4 B (64 bit): + + $ make raspberrypi4_64_defconfig + +For model CM4 (on IO Board): + + $ make raspberrypicm4io_defconfig + +or for CM4 (on IO Board - 64 bit): + + $ make raspberrypicm4io_64_defconfig + +For model 5 B: + + $ make raspberrypi5_defconfig + +Build the rootfs +---------------- + +Note: you will need to have access to the network, since Buildroot will +download the packages' sources. + +You may now build your rootfs with: + + $ make + +(This may take a while, consider getting yourself a coffee ;-) ) + +Result of the build +------------------- + +After building, you should obtain this tree: + + output/images/ + +-- bcm2708-rpi-b-rev1.dtb [1] + +-- bcm2708-rpi-b.dtb [1] + +-- bcm2708-rpi-b-plus.dtb [1] + +-- bcm2708-rpi-cm.dtb [1] + +-- bcm2708-rpi-zero.dtb [1] + +-- bcm2708-rpi-zero-w.dtb [1] + +-- bcm2710-rpi-zero-2-w.dtb [1] + +-- bcm2709-rpi-2-b.dtb [1] + +-- bcm2710-rpi-2-b.dtb [1] + +-- bcm2710-rpi-3-b.dtb [1] + +-- bcm2710-rpi-3-b-plus.dtb [1] + +-- bcm2710-rpi-cm3.dtb [1] + +-- bcm2711-rpi-4-b.dtb [1] + +-- bcm2711-rpi-400.dtb [1] + +-- bcm2711-rpi-cm4.dtb [1] + +-- bcm2711-rpi-cm4s.dtb [1] + +-- bcm2712-rpi-5-b.dtb [1] + +-- bcm2712d0-rpi-5-b.dtb [1] + +-- boot.vfat + +-- rootfs.ext4 + +-- rpi-firmware/ + | +-- bootcode.bin + | +-- cmdline.txt + | +-- config.txt + | +-- fixup.dat [1] + | +-- fixup4.dat [1] + | +-- start.elf [1] + | +-- start4.elf [1] + | `-- overlays/ [2] + +-- sdcard.img + +-- Image [1] + `-- zImage [1] + +[1] Not all of them will be present, depending on the RaspberryPi + model you are using. + +[2] Only for the Raspberry Pi 3/4 Models (overlay miniuart-bt is needed + to enable the RPi3 serial console otherwise occupied by the bluetooth + chip). Alternative would be to disable the serial console in cmdline.txt + and /etc/inittab. + +How to write the SD card +======================== + +Once the build process is finished you will have an image called "sdcard.img" +in the output/images/ directory. + +Copy the bootable "sdcard.img" onto an SD card with "dd": + + $ sudo dd if=output/images/sdcard.img of=/dev/sdX + +Insert the SDcard into your Raspberry Pi, and power it up. Your new system +should come up now and start two consoles: one on the serial port on +the P1 header, one on the HDMI output where you can login using a USB +keyboard. + +How to write to CM4 eMMC memory +=============================== + +For CM4 modules without eMMC memory see above for booting from SD card, +for CM4 modules with eMMC memory proceed as following: + +- fit jumper on IO Board header J2 to disable eMMC boot +- connect IO Board micro USB port (J11 USB slave) to your host linux system +- power up CM4/IO Board (lsusb command should show a '0a5c:2711 Broadcom Corp. + BCM2711 Boot' device) +- run 'sudo ./host/bin/rpiboot', output should look like the following: + Waiting for BCM2835/6/7/2711... + Loading embedded: bootcode4.bin + Sending bootcode.bin + Successful read 4 bytes + Waiting for BCM2835/6/7/2711... + Loading embedded: bootcode4.bin + Second stage boot server + Loading embedded: start4.elf + File read: start4.elf + Second stage boot server done + +- a USB mass storage device should show up (the CM4 eMMC memory), proceed + as described above to copy sdcard.img to it +- power down CM4/IO Board +- remove jumper on IO Board header J2 to re-enable eMMC boot +- power up CM4/IO Board diff --git a/configs/raspberrypi5_custom_defconfig b/configs/raspberrypi5_custom_defconfig new file mode 100644 index 0000000..d71b99a --- /dev/null +++ b/configs/raspberrypi5_custom_defconfig @@ -0,0 +1,37 @@ +BR2_aarch64=y +BR2_cortex_a76=y +BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_6_6=y +BR2_TOOLCHAIN_BUILDROOT_CXX=y +BR2_GLOBAL_PATCH_DIR="$(BR2_EXTERNAL_AURACASTER_SYSTEM_PATH)/board/raspberrypi5_custom/patches" +BR2_DOWNLOAD_FORCE_CHECK_HASHES=y +BR2_TARGET_GENERIC_ROOT_PASSWD="123" +BR2_TARGET_GENERIC_GETTY_PORT="ttyAMA0" +BR2_TARGET_GENERIC_GETTY_BAUDRATE_115200=y +BR2_SYSTEM_DHCP="eth0" +BR2_ROOTFS_POST_BUILD_SCRIPT="$(BR2_EXTERNAL_AURACASTER_SYSTEM_PATH)/board/raspberrypi5_custom/post-build.sh" +BR2_ROOTFS_POST_IMAGE_SCRIPT="$(BR2_EXTERNAL_AURACASTER_SYSTEM_PATH)/board/raspberrypi5_custom/post-image.sh" +BR2_LINUX_KERNEL=y +BR2_LINUX_KERNEL_CUSTOM_TARBALL=y +BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION="$(call github,raspberrypi,linux,576cc10e1ed50a9eacffc7a05c796051d7343ea4)/linux-576cc10e1ed50a9eacffc7a05c796051d7343ea4.tar.gz" +BR2_LINUX_KERNEL_DEFCONFIG="bcm2712" +BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES="$(BR2_EXTERNAL_AURACASTER_SYSTEM_PATH)/board/raspberrypi5_custom/linux-4k-page-size.fragment" +BR2_LINUX_KERNEL_DTS_SUPPORT=y +BR2_LINUX_KERNEL_INTREE_DTS_NAME="broadcom/bcm2712-rpi-5-b broadcom/bcm2712d0-rpi-5-b" +BR2_LINUX_KERNEL_NEEDS_HOST_OPENSSL=y +BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y +BR2_PACKAGE_XZ=y +BR2_PACKAGE_RPI_FIRMWARE=y +BR2_PACKAGE_RPI_FIRMWARE_CONFIG_FILE="$(BR2_EXTERNAL_AURACASTER_SYSTEM_PATH)/board/raspberrypi5_custom/config.txt" +BR2_PACKAGE_RPI_FIRMWARE_CMDLINE_FILE="$(BR2_EXTERNAL_AURACASTER_SYSTEM_PATH)/board/raspberrypi5_custom/cmdline.txt" +# BR2_PACKAGE_RPI_FIRMWARE_INSTALL_DTB_OVERLAYS is not set +BR2_PACKAGE_DROPBEAR=y +BR2_PACKAGE_KMOD=y +BR2_PACKAGE_KMOD_TOOLS=y +BR2_TARGET_ROOTFS_EXT2=y +BR2_TARGET_ROOTFS_EXT2_4=y +BR2_TARGET_ROOTFS_EXT2_SIZE="120M" +# BR2_TARGET_ROOTFS_TAR is not set +BR2_PACKAGE_HOST_DOSFSTOOLS=y +BR2_PACKAGE_HOST_GENIMAGE=y +BR2_PACKAGE_HOST_KMOD_XZ=y +BR2_PACKAGE_HOST_MTOOLS=y