Contents
- Current status (2024-07)
-
Boot and Installing Debian on the Raspberry PI 4
- Tested and Daily Debian Images
- Using EFI Firmware and the regular Debian Installer
- Booting from USB
-
Bootloaders Alternatives
- Directly load kernel and initramfs from RPI firmware
- RPI firmware loads u-boot, which loads kernel/initramfs
- RPI firmware loads u-boot, which loads grub using EFI, which loads kernel/initramfs
- Tianocore EDK II on RPI4 is used to boot iPXE as a Network Boot/Installer for Debian
- Tianocore EDK II on RPI4 is used to boot Debian
- Network boot
- U-boot
- Hardware Information and Issues
- Upstream kernel
- Various technical tips
This page provides details about Raspberry Pi 4. You probably want to read the RaspberryPi page first (and maybe look at the images available at https://raspi.debian.net/), and then decide whether you want to read this page.
Current status (2024-07)
Debian 11 and 12 kernel (> Linux 5.10) supports most of what is required (except hardware-accelerated 3D graphics).
Pulse Audio and Sound don't work as of 2021-04-07
You won't get sound using pulse audio using and the current debian installs using HDMI or A/V.
Boot and Installing Debian on the Raspberry PI 4
Tested and Daily Debian Images
We are automatically building daily images to run on all of the Raspberry Pi models, including the Raspberry Pi 4. There are also Tested Images that are verified to work and have their issues documented.
This is currently the recommended way of using Debian on the Raspberry Pi 4
Using EFI Firmware and the regular Debian Installer
The Pi Firmware Task Force works on an SBBR-compliant (UEFI+ACPI) AArch64 firmware for the Raspberry Pi 4 which allows the normal, vanilla Debian aarch64 installer to run and install a working Debian bullseye on the Raspberry PI.
Instructions to doing so are here and here.
The installed system does not use the Device Tree approach that is common on the ARM platforms to detect and enumerate hardware. Instead, vanilla ACPI is used like this is the case on the normal PC/Intel architecture. This might cause Raspberry Pi device drivers to support ACPI which some of today's device drivers (2021-06) don't do. If hardware that works on a device tree system doesn't work on an EFI/ACPI system, it might be possible that the device driver doesn't support ACPI yet. Unfortunately, the most prominent driver suffering from this lack of ACPI support is vc4, making this installation method unsuitable for systems that need a graphical console.
As of 2024-7, The EFI firmware limits the usable memory amount to 3 GB to cater for a hardware issue that has been worked around in the Debian 11 and 12 kernel. The option to enable the full memory is accessible in the EFI Setup at system startup: Device Manager → Raspberry Pi Configuration → Advanced Configuration and set Limit RAM to 3 GB to <Disabled>. This setting is safe for those kernels.
Booting from USB
Earlier versions of the Raspberry Pi 4 can only boot from the Micro SD card. Since April 2020, a boot loader EEPROM that can also boot from USB storage and UASP media is used. The EEPROM can be updated with media from here.
Bootloaders Alternatives
There are several ways to boot a kernel on the Debian 11 and 12 kernel
Directly load kernel and initramfs from RPI firmware
That's what the Debian images currently do.
RPI firmware loads u-boot, which loads kernel/initramfs
That's what the Ubuntu images do, and is promising.
# https://a-delacruz.github.io/ubuntu/rpi3-setup-64bit-uboot.html # mkimage -A arm64 -O linux -T script -d boot.txt boot.scr # vmlinuz and initrd must be converted. See https://linux-sunxi.org/Initial_Ramdisk or https://andrei.gherzan.ro/linux/uboot-on-rpi/ # mkimage -A arm64 -T ramdisk -C none -n uInitrd -d initrd.img uInitrd # mkimage -A arm -O linux -T kernel -C none -a 0x00008000 -e 0x00008000 -n "Linux kernel" -d vmlinuz uImage #setenv bootargs earlyprintk console=ttyS0,115200 console=tty1 root=LABEL=writable rw #fdt addr ${fdt_addr} && fdt get value bootargs /chosen bootargs
RPI firmware loads u-boot, which loads grub using EFI, which loads kernel/initramfs
That's what OpenSUSE does. See https://www.suse.com/media/article/UEFI_on_Top_of_U-Boot.pdf on archive.org
Tianocore EDK II on RPI4 is used to boot iPXE as a Network Boot/Installer for Debian
This method provides a UEFI Network boot environment with a user GUI. SD Card or USB is not required. Requirements:
- Post Sept 2020 eeprom/firmware update.
- iPXE Compiled for arm64-efi.
Tiancore EDK II from ?GitHub compiled for RPI4.
- Debian Testing/Bullseye on Arm64
Tianocore EDK II on RPI4 is used to boot Debian
This method provides a UEFI boot environment on the SD card with a user GUI.
- Post Sept 2020 eeprom/firmware update.
Tiancore EDK II from ?GitHub compiled for RPI4.
- Debian 11 and 12 on Arm64
Network boot
Some info at http://lig-membres.imag.fr/duble/software/raspberry-pi-netboot/
U-boot
- U-boot patches for USB support exists and are integrated upstream since u-boot v2020.10
https://lists.denx.de/pipermail/u-boot/2020-May/413505.html
- USB support
- Included in u-boot v2020.10
https://lists.denx.de/pipermail/u-boot/2020-June/417996.html
- USB firmware reloader - perhaps only needed for more recent rpi4's ie 8GB version
- Included in u-boot v2020.10
- For USB keyboard support need above and the line "CONFIG_USB_KEYBOARD=y" added to configs/rpi_4_defconfig
- Included in u-boot v2020.10
Hardware Information and Issues
Chip is Broadcom BCM2711 https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2711/README.md
Upstream kernel
Upstream mailing list: http://lists.infradead.org/pipermail/linux-rpi-kernel/
Issue to track progress of support: https://github.com/lategoodbye/rpi-zero/issues/43
Many patches already landed in the vanilla kernel, mainly from Nicolas Saenz Julienne. https://github.com/torvalds/linux/search?q=repo%3Atorvalds%2Flinux+Nicolas+Saenz+Julienne&unscoped_q=repo%3Atorvalds%2Flinux+Nicolas+Saenz+Julienne&type=Commits
https://git.kernel.org/pub/scm/linux/kernel/git/nsaenz/linux-rpi.git
Various technical tips
changing command line
At least in bullseye, raspi-firmware overwrites /boot/firmware/cmdline.txt . This is done on every call of update-initramfs. There is a config file /etc/default/raspi-firmware to adjust the behavior. Extra command line options should go into /etc/default/raspi-extra-cmdline .
changing kernel version to boot
On the VFAT partition, change the entries in config.txt to the kernel and initramfs version.
E.g.,
kernel=vmlinuz-5.16.0-6-arm64 initramfs initrd.img-5.16.0-6-arm64
serial console
https://www.raspberrypi.org/documentation/usage/gpio/
Red |
+5V |
Green |
Tx |
White |
Rx |
Black |
GND |
Black |
GND |
|
White |
TXD |
GPIO 14 |
Green |
RXD |
GPIO 15 |
add enable_uart=1 to /boot/config.txt then connect to the serial port of your client system:
On a Raspberry Pi 4B 4G with bullseye/linux 5.10.13-1, the serial stopped working after the vc4 module was loaded. As a workaround, add module_blacklist=vc4 to the command line to make it work
Root file system on a USB disk
As of bullseye/linux 5.10.13-1, the xhci/USB3 controller is not initialized until the reset_raspberrypi is loaded. This is by default not included in the initramdisk, making it impossible to use a usb disk as root filesystem. To make it work create an updated initramdisk by booting the Raspberry Pi from a MicroSD card or via network with the same kernel. Add reset_raspberrypi to /etc/initramfs-tools/modules of the running file system and run update-initramfs -k all -u (977694) Then copy the new /boot/initrd.img-{kernel}-amd64 to same location on your USB disk.
(Editor's Note 2021-06: This does not seem to be case for EFI installs in as long as the flashed bootloader is current)
USB 3 enclosures
Many USB3 enclosures (especially with jmicron chip) do not work with uas. To make them work find out the device/vendor id with lsusb and add usb-storage.quirks=152d:9561:u to your kernel command line (replace 152d:9561 with your device/vendor id).
Bluetooth
needs some firmware:
wget -O /lib/firmware/brcm/BCM4345C5.hcd https://github.com/armbian/firmware/raw/master/brcm/BCM4345C5.hcd wget -O /lib/firmware/brcm/BCM4345C0.hcd https://github.com/armbian/firmware/raw/master/BCM4345C0.hcd
Build a kernel as a Debian package
To disable DEBUG_INFO before build: scripts/config --disable DEBUG_INFO
With some boot methods, vmlinuz must be decompressed in /boot/firmware, or RPI4 won't boot. (zcat vmlinuz-... > vmlinux-... ; then point config.txt to vmlinuz)
Building a custom kernel from upstream (mainline) sources
# disable debug info scripts/config --disable DEBUG_INFO # build uncompressed kernel sed -i '/KBUILD_IMAGE/ s/.gz//' arch/arm64/Makefile # build debs make -j `nproc` bindeb-pkg
Building a custom kernel from github.com/raspberrypi/linux sources
# generate config make bcm2711_defconfig # disable debug info scripts/config --disable DEBUG_INFO # build uncompressed kernel sed -i '/KBUILD_IMAGE/ s/.gz//' arch/arm64/Makefile # build debs make -j `nproc` bindeb-pkg
Then copy and install the generated deb.
After installing:
- Copy your vmlinuz file from /boot to /boot/firmware/
- Copy the dtb for your kernel from /usr/lib/linux-image-(...)/broadcom/ to /boot/firmware/
- Copy the dtb overlays for your kernel from /usr/lib/linux-image-(...)/overlays/ to /boot/firmware/overlays
Example config.txt:
[pi4] enable_uart=1 # Enable DRM VC4 V3D driver on top of the dispmanx display stack #dtoverlay=vc4-fkms-v3d max_framebuffers=2 arm_64bit=1 kernel=vmlinuz
(You don't need an initrd)
Example cmdline.txt:
console=tty1 console=ttyS0,115200 root=/dev/mmcblk0p2 rw elevator=deadline fsck.repair=yes net.ifnames=0 rootwait
Accelerated 3D graphics on Debian
To get accelerated 3D graphics on Debian, you will need the following (status on 2021-02):
- Run Debian testing, because Mesa is Debian stable is not recent enough
- Build a kernel from github.com/raspberrypi/linux as documented above
Example config.txt:
arm_64bit=1 enable_uart=1 upstream_kernel=1 #http://lists.infradead.org/pipermail/linux-rpi-kernel/2020-November/007906.html disable_fw_kms_setup=1 kernel=vmlinuz initramfs initrd.img
Example cmdline.txt:
console=tty0 console=ttyS1,115200 root=/dev/mmcblk1p2 rw fsck.repair=yes net.ifnames=0 rootwait
(Editor's Note 2021-06: Is a running glxgears and present /sys/class/drm/card0 a sure sign of 3D acceleration working?)
GPIO support
All examples below are based on the "blinking led" schema. See https://pimylifeup.com/raspberry-pi-gpio/
The Debian kernel is compiled with CONFIG_STRICT_DEVMEM=y. You need to add iomem=relaxed to the kernel command line (/boot/firmware/cmdline.txt) to allow mmap on /dev/mem.
using RPi.GPIO (python3-rpi.gpio)
RPi.GPIO doesn't support the RPI 4 currently. See this bug https://sourceforge.net/p/raspberry-gpio-python/tickets/191/ (with a patch that makes it working).
Debian bug: 976114
using GPIOZERO
Debian has gpiozero version 1.4.1, which doesn't work with the RPI 4. After fixing RPi.GPIO, gpiozero 1.5.1 (current git) works.
Debian bug: 976118