Decode · Allwinner

eGON.BT0 magic: the Allwinner SPL header

The Allwinner boot ROM (BROM) is silent on the UART: the first console output on an Allwinner board comes from U-Boot SPL after the BROM has already handed control over. To find the SPL, the BROM scans the boot media for a specific 8-byte magic string: `eGON.BT0`.

The full search order the BROM follows on H616/H618 silicon (and most sun50i-family Allwinner ARMv8):

  1. MMC0 sector 16 (SD card slot on OrangePi-family boards)
  2. MMC2 sector 16 (eMMC on boards that have one)
  3. SPI-NOR at offset 0 (for boards with SPI-boot silicon)
  4. FEL over USB: recovery / bring-up path when no other media has a valid SPL

The magic sits at the very start of the SPL image, followed by a small header (image size, load address, checksum) and then the actual SPL code. U-Boot's SPL build for Allwinner emits this header automatically when built with CONFIG_SUN50I_H616-family board configs.

What to check on a non-booting Allwinner board: dd if=/dev/mmcblk0 bs=512 skip=16 count=1 | head -c 16 should show eGON.BT0 followed by more binary. If it doesn't, you have a corrupted SPL: BROM can't find anything to jump to and will fall through to FEL mode, where the board waits silently for USB.

The eGON convention predates linux-sunxi's community involvement: it goes back to Allwinner's original A10 (sun4i) BROM in 2011 and hasn't changed materially since.

References

Full walkthrough: /blog/allwinner-h616-h618-axp313-boot

More decoders: /decode · /faq

Have a boot log with something you can't decode? Paste it into the free fingerprinter. It identifies bootloader / kernel / SoC / autoboot exposure client-side, nothing uploaded.