Architecture
Overall software architecture of the network player
Architecture
Components
flowchart LR
subgraph ESP["ESP32-C3"]
ESPFW["ESP-Hosted firmware
Wi-Fi + BLE 5.0"]
end
subgraph F1C["Allwinner f1c200s"]
direction TB
subgraph LINUX["Linux 6.x rootfs (musl)"]
SPDIF["sun4i-spdif"]
ESPH["esp-hosted-ng"]
GETHER["g_ether"]
end
UBOOT["U-Boot 2026.04"]
SPL["U-Boot SPL"]
UBOOT --> LINUX
SPL --> UBOOT
end
NAND[("SPI NAND 128 MiB
boot / fota / rootfs / data")]
ESPFW <-->|SPI + UART| ESPH
NAND --> SPL
SPDIF -->|SPDIF| SPDIFOUT([SPDIF out])
GETHER -->|USB| USBC([USB-C host])
Sources of truth
Everything that ends up on the device is generated from this repository through Buildroot:
buildroot_config/mds_<machine>_defconfig— Buildroot top-level configmds_external/—BR2_EXTERNALtree (boards, packages, defconfigs, overlays)mds_external/board/mds_network_player/— board files used by the network player:u-boot_defconfig,u-boot_devicetree.dts,uboot.envkernel_defconfig,linux-patches/,uboot-patches/image.its— FIT image descriptionmknandboot.sh,f1c100_uboot_spinand.sh— SPL/U-Boot relocation for SPI NAND bootrootfs_overlay/,fota_rootfs_overlay/— files added on top of the Buildroot rootfspost-images.sh,post-images-fota.sh— post-build image assembly
Userspace highlights
sun4i-spdif— kernel module driving the SPDIF output. The driver lives in mainline; seesound/soc/sunxi/sun4i-spdif.ko.g_ether— USB gadget that exposes the board to the host as an Ethernet device (default IP192.168.2.2).esp-hosted-ng— host driver that runs over SPI to talk to the ESP32-C3 firmware. The repository vendors the ESP-Hosted sources undersrc/esp-hosted/.
Why musl
Buildroot is configured with the musl C library. This keeps the rootfs small and aligned with the ARMv5TE / 64 MiB constraints of the f1c200s.