Contents
- 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 (11/2020)
- Debian testing (and buster-backports) kernel (Linux 5.9) supports most of what is required (except hardware-accelerated 3D graphics).
Random notes
Chip is Broadcom BCM2711 https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2711/README.md
U-boot
- U-boot patches for USB support now exists and appear to be in review process with upstream. (2020-06-16)
https://lists.denx.de/pipermail/u-boot/2020-June/414411.html
- USB firmware reloader - perhaps only needed for more recent rpi4's ie 8GB version
- For USB keyboard support need above and the line "CONFIG_USB_KEYBOARD=y" added to configs/rpi_4_defconfig
Raspberry PI 4 8G
- USB doesn't work up to kernel 5.7 for the hardware variant of PI4 with 8GB RAM
This was fixed in kernel 5.8: https://lkml.org/lkml/2020/5/5/998
Other distros
Raspbian Raspberry Pi OS
- ships only a armhf image
- 5.4 kernel with a lot of non-mainlined changes
Ubuntu
both armhf and arm64 images. See https://ubuntu.com/download/raspberry-pi/
- Boots using u-boot and a custom 5.3.0 kernel. Serial console, HDMI, network all work. Very nice.
- The three important pieces seem to be:
- the linux-firmware-raspi2 source package. Maybe equivalent to Debian's raspi-firmware source package?
- the u-boot-rpi package (different from Debian's)
the kernel (linux-raspi2 source package https://launchpad.net/ubuntu/eoan/+source/linux-raspi2 )
openSUSE
boots using u-boot -> grub -> Linux 5.4.14
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
Boot methods
There are several ways to boot...
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.
FIXME
# 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
Network boot
Some info at http://lig-membres.imag.fr/duble/software/raspberry-pi-netboot/
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 .
loop-mounting images
# fdisk -l 2020-02-13-raspbian-buster-lite.img Disk 2020-02-13-raspbian-buster-lite.img: 1,7 GiB, 1849688064 bytes, 3612672 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x738a4d67 Device Boot Start End Sectors Size Id Type 2020-02-13-raspbian-buster-lite.img1 8192 532479 524288 256M c W95 FAT32 (LBA) 2020-02-13-raspbian-buster-lite.img2 532480 3612671 3080192 1,5G 83 Linux # mount -o loop,offset=$((8192*512)) 2020-02-13-raspbian-buster-lite.img mountpoint
serial console
https://www.raspberrypi.org/documentation/usage/gpio/ Red: +5V. Green: Tx. White : Rx. Black: GND. => black on GND, white on TXD (GPIO 14) Green on RXD (GPIO 15) add enable_uart=1 to /boot/config.txt
then screen /dev/ttyUSB0 115200
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
monitor DHCP traffic using tcpdump
tcpdump -i eth0 -pvn port 67 and port 68
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, add reset_raspberrypi to /etc/initramfs-tools/modules and run =update-initramfs -k all -u= (This is https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=977694)
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
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.
Copy your vmlinuz file from /boot to /boot/firmware/ Copy the dtb for your kernel from /usr/lib to /boot/firmware/ Copy the dtb overlays for your kernel to /boot/firmware/
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 11/2020):
- 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
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: https://bugs.debian.org/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: https://bugs.debian.org/976118