Manufacture du Son
On this page

Boot Flow

From BootROM to userspace, step by step

Edit on GitHub

Boot Flow

This page walks through what happens between power-up and the login prompt. The timings come from real boot logs captured on 16/06/2024 (total ≈ 24 s cold boot).

1. BootROM

The Allwinner BootROM is the first thing to run. It looks for a valid SPL header on the SPI NAND (offset 0x0000). If the f1c200s BOOT button is held during reset, the BootROM enters FEL mode instead — the device then appears as a USB peripheral and the host can push code into RAM using sunxi-fel.

2. U-Boot SPL

The SPL is the first stage U-Boot loader. On this board it has to be specially formatted for SPI NAND, because the mainline SPL on the f1c200s does not natively support reading a second-stage payload from SPI NAND.

The mknandboot.sh script (in mds_external/board/mds_network_player/) splits and re-packs u-boot-with-spl.bin so that:

  1. The BootROM can read and execute the SPL.
  2. The SPL can locate u-boot.bin at the expected offset and load it.

Expected SPL output:

U-Boot SPL 2026.04
DRAM: 64 MiB
Trying to boot from sunxi SPI
spi0_nand_reset()
Found U-Boot image
load() success 0
spl_spi_try_load() success

3. U-Boot

U-Boot brings up the device, applies the saved environment and prepares to load the kernel.

U-Boot 2026.04 Allwinner Technology
CPU:   Allwinner F Series (SUNIV)
Model: La Manufacture du Son - Network Streamer
DRAM:  64 MiB

The environment lives in mds_external/board/mds_network_player/uboot.env. It typically:

  • Attaches the fota and rootfs UBI partitions.
  • Loads /boot/uImage from the rootfs (or from the fota recovery if requested).
  • Loads the device tree suniv-f1c200s-mds-network-streamer-v1.0.dtb.
  • Boots via bootm using a FIT image (image.its).

Why FIT? The plain bootm command refused legacy kernel images on this U-Boot build (Wrong Image Type for bootm command). Switching to FIT made things work.

4. Kernel

The kernel boots with a command line like:

ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs rootwait rw console=ttyS0,115200

Notable bring-up messages:

Booting Linux on physical CPU 0x0
Linux version 6.9.2 ... (Buildroot 2024.02.2 / musl)
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ)
OF: fdt: Machine model: MDS Network Streamer v1.0
spi-nand spi0.0: Winbond SPI NAND was found.
spi-nand spi0.0: 128 MiB, block size: 128 KiB, page size: 2048, OOB size: 64
4 fixed-partitions partitions found on MTD device spi0.0
  0x000000000000-0x000000100000 : "boot"
  0x000000100000-0x000001000000 : "fota"
  0x000001000000-0x000004800000 : "rootfs"
  0x000004800000-0x000008000000 : "data"
ALSA device list:
  #0: On-board SPDIF
UBIFS (ubi0:0): UBIFS: mounted UBI device 0, volume 0, name "rootfs"
VFS: Mounted root (ubifs filesystem) on device 0:15.

5. Userspace

The Buildroot rootfs uses BusyBox init. Once mounted:

  • g_ether exposes a USB Ethernet gadget at 192.168.2.2.
  • The SPDIF ALSA device is available as card 0.
  • Login is available over the serial console and over SSH on the USB Ethernet (user root, password root).

Common pitfalls

  • System reset not supported on this platform when running reset in U-Boot — make sure the watchdog reset support is enabled in the U-Boot defconfig.
  • Wrong Image Type for bootm command — switch to a FIT image (see image.its).
  • LEB size mismatch when mounting a UBIFS image generated by Buildroot — see SPI NAND Partitioning for the exact LEB size that has to match.