Booting a recent kernel on the Xilinx Ultra96

Last boot 2018-05-28 using kernel v4.17-rc7, and an ArchLinuxARM as rootfs

Ultra96

Ultra96 board with a Grove IoT Mezzanine board mounted on top. The Grove board provided the UART through a serial-to-USB connector.

This board is produced by Xilinx. There is a great resource for hardware documentation over at 96boards.

Like other famous deities, the Ultra96 board is known under many names. It is also known as "Zynqmp ZCU100 rev C".

Getting a Cross Compiler for AArch64

For compiling the U-Boot, kernel and root filesystem you can just use the latest Linaro AArch64 GCC toolchain I'm using the Aarch64 7.2.1 for Linux as of writing.

Building the upstream kernel

Here are some files that I use to configure and build Ultra96 also known as ZCU100 revision C kernels out-of-the box. These use a minimal initramfs root filesystem placed in your home directory. (This is to get you to a prompt without a root filesystem installed in the flash, such as the ArchLinux method described below.) These root filesystems are created using this script. Prebuilt versions can be obtained here:

Copy the rootfs to you home directory and the ultra96.mak file to your linux git tree or base dir and simply:

> make -f ultra96.mak config
> make -f ultra96.mak build

Pre-built kernels

Here are a bunch of pre-built kernels with initramfs that can be used to test that the Ultra96 board is working. They should give prompt on the serial console and a heartbeat LED on the Ultra96 board itself (blinks between the USB host connectors). See below for boot methods.

Boot over serial port using Xmodem

An exteremely rudimentary boot method is to boot the kernel over serial port. (In this case the emulated serial port that you access on USB-to-serial.) As the board comes with U-Boot you can load the kernel to 0x10000000 and the DTB to 0x11800000.

If you can't get your homecooked kernel to boot, verify that you can boot one of my kernels, see below for downloads.

Get to the U-Boot prompt:

Boot from SD Card

The default boot of the Ultra96 board is from the SD card. The images that will be automatically booted comes from the /boot partition on the device, which is partition 1 on the MMC card /dev/mmcblk0p1 in a machine with a proper SD card reader, if you have a USB-based SD card reader it may appear as /dev/sdN1 instead.

Install and boot ArchLinux

I made an ArchLinux ARM installation based on the generic Aarch64. I do this using a USB stick with Aarch64 archlinux on it. This means we need to mount the rootfs from /dev/sda1 and pass the right command line to the kernel to do this. I just compile root=/dev/sda1 rw rootwait into the kernel using CONFIG_CMDLINE.

Here is first bootlog for ArchLinuxARM on the Ultra96 board as reference. Systemd and everything works like a charm.

If you have trouble compiling your kernel for ArchLinuxARM or applying the specific DTS patches here are my binary snapshots, these need to be renamed to Image and zynqmp-zcu100-revC.dtb respectively and then places on the SD card as described above:

After booting