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 CM (aka Raspberry Pi Compute Module).
  - the model Zero (aka Raspberry Pi Zero)
  - the model Zero W (aka Raspberry Pi Zero W)
  - the model Zero 2 W (aka Raspberry Pi Zero 2 W)
  - the model B2 (aka Raspberry Pi 2)
  - the model B3 (aka Raspberry Pi 3).
  - the model CM3 (aka Raspberry Pi Compute Module 3).
  - the model CM3+ (aka Raspberry Pi Compute Module 3+).
  - the model B4 (aka Raspberry Pi 4).
  - the model 400 (aka Raspberry Pi 400).
  - the model CM4 (aka Raspberry Pi Compute Module 4 and IO Board).
  - the model CM4s (aka Raspberry Pi Compute Module 4s).
  - the model B5 (aka Raspberry Pi 5).
  - the model 500 (aka Raspberry Pi 500).
  - the model CM5 (aka Raspberry Pi Compute Module 5 and IO Board).

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+, B+ and CM:

  $ 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

or for model Zero 2 W (model B3 in smaller form factor, 64-bit):

  $ make raspberrypizero2w_64_defconfig

For model 2 B:

  $ make raspberrypi2_defconfig

or for model 2 B (Rev 1.2, model B3 without wireless LAN and Bluetooth, 64 bit):

  $ make raspberrypi2_64_defconfig

For model 3 B, B+, CM3 and CM3+:

  $ make raspberrypi3_defconfig

or for model 3 B, B+, CM3 and CM3+ (64 bit):

  $ make raspberrypi3_64_defconfig

For model 4 B, 400, CM4 and CM4s:

  $ make raspberrypi4_defconfig

or for model 4 B, 400, CM4 and CM4s (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 and 500:

  $ make raspberrypi5_defconfig

For model CM5 (on IO Board):

  $ make raspberrypicm5io_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]
    +-- 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]
    +-- bcm2710-rpi-zero-2-w.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]
    +-- bcm2712-rpi-500.dtb         [1]
    +-- bcm2712-rpi-cm5-cm5io       [1]
    +-- bcm2712-rpi-cm5l-cm5io      [1]
    +-- boot.vfat
    +-- rootfs.ext4
    +-- rpi-firmware/
    |   +-- bootcode.bin            [2]
    |   +-- cmdline.txt
    |   +-- config.txt
    |   +-- fixup.dat               [3]
    |   +-- fixup4.dat              [4]
    |   +-- start.elf               [3]
    |   +-- start4.elf              [4]
    |   `-- overlays/               [5]
    +-- 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 1, 2, 3, Zero, Zero W and Zero 2 W. The Raspberry
    Pi 4, 400, 5 and the Compute Module 4, 4s and 5 load the second stage
    bootloader from a SPI flash EEPROM.

[3] Only for the Raspberry Pi 1, 2, 3, Zero and Zero 2.

[4] Only for the Raspberry Pi 4, 400, Compute Module 4 and 4s.

[5] Only for the Raspberry Pi installing device-tree overlays. The Raspberry Pi
    with Bluetooth connectivity (Zero W, Zero 2 W, 3, 4, 400, Compute Module 4
    and 4s) use the miniuart-bt overlay to enable UART0 for the serial console;
    the Bluetooth uses the mini-UART instead. 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

CM5 debug UART
==============

The debug UART header is not assembled on the Compute Module 5.

	2.23. Debug UART

	Space is provided for the user to fit a debug UART connector. This
	connector provides the same functionality as Raspberry Pi 5. The
	connector is a three-pin 1mm pitch JST-SH connector, Part number
	BM03B-SRSS-TB. The signals are replicated on the bottom as test points.

	Appendix B: Test Points

	| Reference | X   | Y    | NAME          |
	| TP35      | 11  | 37.8 | DEBUG_UART_TX |
	| TP36      | 8.5 | 37.1 | DEBUG_UART_RX |

	Debug UART

	TP35 and TP36 are a TX and RX of the debug UART. TP46 should be used as
	the ground. It is very useful to have access to these pins during
	programming and initial boot.

See https://datasheets.raspberrypi.com/cm5/cm5-datasheet.pdf.

The signals are not wired up to 100-pin headers either. And thus, it is
impossible to output early boot traces in the EEPROM firmware without
assembling a JST-SH connector (or using the test points).
