Raspberry PI 3 Model B and Model B+
This is an experimental port and is not guaranteed to work.
Hardware
RPI-3B-V1_2-SCHEMATIC-REDUCED.pdf
Feature | Part | Datasheet |
---|---|---|
USB+ETH | SMSC LAN9514 | 9514.pdf |
SoC | BCM2837 |
Running seL4 on the Raspberry Pi 3B/3B+
Please also find a feature article going on seL4 the Raspberry Pi 3 on our blog (and check out the rest of the blog too!)
Serial connection
Serial TX and RX are located at GPIO pins 14 and 15 respectively (See Hardware schematic above)
Reset
Short the jumper marked “RUN” between the expansion header and USB sockets to perform a soft reset of the CPU.
U-Boot
Right now, the default U-Boot will not successfully boot an seL4 image on the RPi3, because of cache configuration issues in the seL4 ELFLoader. This problem can be remedied by having U-boot disable caches before loading seL4. Unfortunately, the stock upstream U-boot used to disable caches before loading the kernel image, but as of this patch (https://github.com/u-boot/u-boot/commit/995eab8b5b580b67394312b1621c60a71042cd18), U-boot no longer disables caches.
In order to obtain a U-boot binary that disables caching, you can either compile U-Boot from source yourself, or you can use this prebuilt U-Boot binary image which already works.
If you choose to build your own U-boot, then clone U-boot from upstream, then revert commit 995eab8b5b580b67394312b1621c60a71042cd18, and then build it:
git clone https://github.com/u-boot/u-boot.git u-boot
cd u-boot
git revert 995eab8b5b580b67394312b1621c60a71042cd18
make CROSS_COMPILE=arm-linux-gnueabi- rpi_3_32b_defconfig
make CROSS_COMPILE=arm-linux-gnueabi-
This will enable you to get the most up-to-date U-boot which will boot seL4 on the RPi3 successfully.
NOTE: Automatic revert is not going to work if you are using the latest version of u-boot. You need to manually revert the change by looking at the changeset.
Building u-boot using configuration rpi_3_3b_defconfig
is going to
produce an image that can boot seL4 on the Raspberry PI Model 3B and
3B+. Unfortunately for the 3B+ tftp boot is not going to work using
this version of u-boot (the tftp
command will report error
No Ethernet found
).
In this case you need to build an image specific for the 3B+.
Unfortunately the provided defconfig file for the 3B+ model
(rpi_3_b_plus_defconfig
) doesn’t appear to build correctly.
In order to use tftp boot on a Raspberry PI Model 3B+, use the
defconfig for the 3B (as described above), then manually change the
CONFIG_DEFAULT_DEVICE_TREE
parameter in the .config
from:
CONFIG_DEFAULT_DEVICE_TREE="bcm2837-rpi-3-b"
to:
CONFIG_DEFAULT_DEVICE_TREE="bcm2837-rpi-3-b-plus"
Now the generated image should be able to use the on-board Ethernet device for TFTP.
SD card setup
The PI boots from the first FAT32 partition on the SD card. Where files are specified, they should be located in the root directory of this partition.
Stage | Filename | Description | Source |
---|---|---|---|
FSBL | - | Mounts SD and loads SSBL | ROM |
SSBL | bootcode.bin | Loads GPU firmware and boots GPU | https://github.com/raspberrypi/firmware/tree/master/boot |
GPU firmware | start.elf or recovery.elf | Loads CPU bootloader and boots CPU | https://github.com/raspberrypi/firmware/tree/master/boot |
Usually the Linux kernel, but could also be u-boot | u-boot.bin | u-boot | You can either use our prebuilt U-boot which works, or compile your own using the instructions above |
config.txt | u-boot parameters | Add enable_uart=1 and kernel=u-boot.bin to the bottom of config.txt (Sample: http://codepad.org/ykVYFSyP) | |
uboot.env | u-boot saved environment | Generated by u-boot (default environment) bootcmd copied to bootcmd_orig bootcmd and bootdelay removed |
Getting seL4 onto your Raspberry Pi 3
In this section you should find the two most convenient methods of getting a kernel image booted on your RPi3 described. All three methods assume that you have already built a kernel image using one of our projects—such as seL4Test:
Checkout the sel4test project using repo as per seL4Test
repo init -u https://github.com/seL4/sel4test-manifest.git
repo sync
mkdir cbuild
cd cbuild
../init-build.sh -DPLATFORM=rpi3 -DAARCH32=1
# The default cmake wrapper sets up a default configuration for the target platform.
# To change individual settings, run `ccmake` and change the configuration
# parameters to suit your needs.
ninja
Generated binaries can be found in the images/
directory.
The two methods described here are using the SD card and TFTP.
Both methods require you to use an SD card to provide the RPi3 firmware with a U-boot bootloader it can load. The RPi3 doesn’t store its bootloader in flash memory, so it looks for the bootloader on the SD card. Please see the section above for how to prepare your SD Card for the base set of requirements; you can glance at the table above to see the files you’ll need and how to obtain them.
SD Card
Get a micro-SD card ready by getting the base files copied onto it (See the previous section).
Following this, copy your seL4 image (such as an seL4test image), onto the SD card in its root directory - that’s it. You can now remove the SD Card from your PC and re-insert it into the RPi3, and power the RPi3 on.
When the RPi3 boots up, be sure to interrupt the boot process and drop into the U-boot command prompt. From the U-boot command prompt, type something the following: fatls mmc 0. If you don’t see your seL4 image file’s name printed out, then you might need to double-check your steps so far to make sure you didn’t forget something along the way. If you see your file listed, then do something like:
fatload mmc 0 0x10000000 sel4test-driver-image-arm-bcm2837
bootelf 0x10000000
TFTP
Be sure you’ve set up the internal SD card with the required files for U-Boot and the RPi3 firmware (consult the table above). Then make certain that you’ve started up a TFTP server with your seL4 image being served by that TFTP server. From there:
usb start
dhcp
tftp 0x10000000 <YOUR_TFTP_SERVER_IP_ADDRESS>:sel4test-driver-image-arm-bcm2837
bootelf 0x10000000
If you are using a Raspberry PI Model 3B+, make sure you build the correct u-boot image as described above.
To use static IP instead of DHCP, use:
usb start
setenv ipaddr <RPI_IP_ADDRESS>
setenv serverip <YOUR_TFTP_SERVER_IP_ADDRESS>
tftp 0x10000000 sel4test-driver-image-arm-bcm2837
bootelf 0x10000000