A bare-metal firmware framework and bootloader toolkit for Allwinner SoCs
Documentation · API Reference · Report Bug · Request Feature
SyterKit is a small, static bare-metal firmware framework for Allwinner SoCs. It provides board bring-up, peripheral drivers, image loading, bootloader applications, and standalone firmware utilities for both ARM and RISC-V platforms.
SyterKit uses GNU Make, Kconfig, Kbuild-style object lists, application-owned initialization, and Linux-style board device trees compiled to immutable C data by dt2c.
Run make list-defconfigs for the authoritative list in your checkout. Board-specific applications and hardware notes live in boards/. Archived board sources are preserved under archive/.
| Board | SoC / Platform | SyterKit CPU | Configuration |
|---|---|---|---|
| TinyVision | V851se/V851s3 | 1 × Cortex-A7 | tinyvision_defconfig |
| LonganPi 3H | H618 | 4 × Cortex-A53 | longanpi-3h_defconfig |
| Avaota A1 | T527/A527 | 8 × Cortex-A55 | avaota-a1_defconfig |
| Radxa Cubie A7A | A733 | 6 × Cortex-A55 + 2 × Cortex-A76 | radxa-cubie-a7a_defconfig |
| Avaota F1 | V821 | Xuantie E907 + Andes A27L2 | avaota-f1_defconfig |
| Avaota F2 | V861 | Xuantie E907 + 2 × Xuantie C907 | avaota-f2_defconfig |
| Avaota M1 | A537 | 6 × Cortex-A53 + 2 × Cortex-A73 | avaota-m1_defconfig |
| YuzukiNeko | F101 | Xuantie C907 | yuzukineko_rv32_defconfig, yuzukineko_rv32_usb_defconfig, yuzukineko_rv64_defconfig |
| TLT153 MiniEVM | T153 | 4 × Cortex-A7 | tlt153-minievm_defconfig |
| TLT536 EVM | T536 | 4 × Cortex-A55 | tlt536-evm_defconfig |
Active configurations are grouped under configs/<board>/. Most boards provide sram_defconfig, efex_defconfig, and dram_defconfig variants; the public Make targets remain flat, e.g. make avaota-a1_efex_defconfig.
SyterKit is intentionally small and static. The selected board contributes its applications and DTS, Kconfig selects the architecture and drivers, dt2c turns the board DTS into compile-time data, and the linker combines the selected objects into the final firmware image.
See Compile-time device tree, Driver architecture, and optional Rust FFI for the full model.
A Linux host needs GNU Make, a host C compiler, Flex, Bison, pkg-config, ncurses development headers, and a bare-metal cross compiler. On Ubuntu (ARM32 targets):
sudo apt-get update
sudo apt-get install -y build-essential gcc-arm-none-eabi flex bison \
libncurses-dev pkg-config doxygen graphviz default-jreRISC-V boards require a compatible RISC-V toolchain whose flags match the CPU selected by Kconfig.
The checked-in Linux x86_64 dt2c distribution (tools/bin/dt2c) includes a musl-static binary and matching headers, so neither Rust nor the submodule is needed for a normal build. Initialize the submodule only to develop dt2c itself:
git submodule update --init tools/dt2cAn external dt2c installation can be selected instead:
make DT2C=/opt/dt2c/dt2c DT2C_INCLUDE=/opt/dt2c/include ...List the available boards, select one, and build:
make list-defconfigs
make tinyvision_defconfig
make -j$(nproc)Out-of-tree builds follow the Linux kernel O= convention:
make O=out tinyvision_defconfig
make O=out -j$(nproc)Useful targets:
| Target | Description |
|---|---|
make menuconfig |
Edit the active configuration interactively |
make list-apps |
List applications selected for the active board |
make syter_boot |
Build a single application and its three images |
make firmware |
Build board companion firmware, when declared |
make utilities |
Build the standalone BL33 utilities |
make artifacts |
Build images, companion firmware, and utilities |
make test |
Run host and QEMU tests |
make docs |
Generate the Doxygen API documentation |
make check |
Make/Kconfig source-tree consistency checks |
Override the toolchain prefix when it is not in the default location:
make CROSS_COMPILE=/opt/toolchains/arm-none-eabi- -j$(nproc)Each application is written below build/<board>/<application>/ (or the chosen O= directory):
| File | Purpose |
|---|---|
<app>_fel.bin |
Load and run from SRAM with a host FEL tool |
<app>_card.bin |
Padded and checksummed for SD/eMMC boot |
<app>_spi.bin |
Padded and checksummed for SPI NOR/NAND boot |
<app>_fel.elf, <app>_bin.elf |
Symbols and debugging |
<app>_fel.map, <app>_bin.map |
Link maps |
Warning: Writing raw devices can destroy existing data. Confirm the target device before running any command.
SD/eMMC, MBR-formatted media (BROM searches at an 8 KiB offset):
sudo dd if=syter_boot_card.bin of=/dev/sdX bs=1024 seek=8 conv=fsyncSD/eMMC, GPT media (secondary 128 KiB BROM location):
sudo dd if=syter_boot_card.bin of=/dev/sdX bs=1024 seek=128 conv=fsyncSPI NAND/NOR (redundant copies at 64 KiB intervals, programmed with xfel):
dd if=syter_boot_spi.bin of=spi.img bs=2k
dd if=syter_boot_spi.bin of=spi.img bs=2k seek=32
dd if=syter_boot_spi.bin of=spi.img bs=2k seek=64
xfel spinand write 0 spi.img # or: xfel spinor write 0 spi.imgDetailed boot-header and media-layout documentation is available in the documentation source.
- Getting started and Allwinner boot flow
- Driver architecture
- Compile-time device tree
- Bare-metal Rust FFI
- Generated API documentation
Contributions are welcome! To contribute:
- Fork the repository and create a feature branch.
- Follow the existing code style (
.clang-formatis provided). - Run
make checkandmake testbefore submitting. - Open a pull request with a clear description of the change.
Bug reports and feature requests are tracked in the issue tracker.
This project follows the Contributor Covenant Code of Conduct. By participating, you are expected to uphold this code. Please report unacceptable behavior to the community leaders listed in the document.
SyterKit is released under the GNU General Public License v2.0. See LICENSE for the full text.

