NixOS on ARM/PINE A64-LTS
The PINE A64-LTS is an affordable "Long Time Supply" single board computer built around the Allwinner R18 SOC.
PINE A64-LTS | |
---|---|
Manufacturer | PINE64 (Pine Microsystems Inc.) |
Architecture | AArch64 |
Bootloader | Upstream u-boot[1] |
Boot order | SD, eMMC, SPI NOR Flash |
Maintainer | samueldr |
It can boot from SD or from an eMMC.
The SOPINE board from the same manufacturer, using the Baseboard "Model A" should be 100% compatible with the A64-LTS; the A64-LTS support is built using the device tree of the Baseboard "Model A". Though untested, this should mean that the Baseboard "Model A" will work with NixOS[testing needed].
Status
Upstream NixOS AArch64 image boots on the PINE A64-LTS, using the proper upstream u-boot.
U-boot support has been added 2018-03-18. The bootloader with SPL can be downloaded from these location:
Board-specific installation notes
First follow the generic installation steps to get the installer image on an SD card or the eMMC. A compatible eMMC to SD may be required to flash the eMMC. If you do not have one available, it is possible to boot another operating system on the A64-LTS and from there dd
to the eMMC.
U-Boot needs to be copied to specific sectors on the microSD card with dd
. Download u-boot for the board (sopine-u-boot-sunxi-with-spl.bin
), and copy it to the correct location with (again, replace /dev/sdX
with the correct path to the SD card device):
sudo dd if=sopine-u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1024 seek=8
Then, install using the installation and configuration steps.
Serial console
Compatibility notes
- Using the upstream kernel at 4.15, neither ethernet seems to have troubles. The interface is detected but seems to not work right.
- HDMI support is untested.
SPI NOR flash
The Pine A64-LTS is equipe with a 4MB SPI NOR flash chip. The CPU will read the bootloader from it, after trying the SD card and the eMMC.
Flashing u-boot to the SPI NOR flash will allow booting the sd-image-aarch64.img
based images without further manipulating the image or the boot device (e.g. without embedding u-boot to the usb drive). It may also allow booting UEFI compliant AArch64 images, though this is unverified.
The author did not find ways to flash the NOR flash from a running Linux system using the mainline kernel.
Flashing from FEL
The easiest method to trigger FEL mode is to not have previously flashed the SPI NOR flash with a valid bootloader, and to remove all storage devices used to boot. The Pine A64-LTS will fallback to FEL mode.
To connect the Pine A64-LTS to the computer in FEL mode, you will need a USB A-to-A (male to male) cable, and plug to the upper USB port[2].
Once started in FEL mode, the computer should see the following device.
Bus ___ Device ___: ID 1f3a:efe8 Onda (unverified) V972 tablet in flashing mode
It is, then, possible to use sunxi-fel
from sunxi-tools
to flash the a bootloader to the SPI NOR flash.
$ nix-shell -p sunxi-tools [nix-shell:~]$ sudo sunxi-fel -l USB device ___:___ Allwinner A64 ________:________:________:________ [nix-shell:~]$ sudo sunxi-fel -p spiflash-write 0 u-boot-sunxi-with-spl.bin 100% [================================================] 575 kB, 96.9 kB/s
Once complete, unplug the power from the Pine A64-LTS, unplug the Pine A64-LTS from the host computer, and try booting without storage devices, but either serial or HDMI. When successful, u-boot will start, and eventually try to network boot.
Flashing from u-boot
It is possible, through using a u-boot bootloader built from the u-boot-sunxi tree, to write to the SPI NOR flash. The ayufan-pine64/bootloader-build has such a build. Using the released .img
files, it is possible to write their custom build or erase their custom build. From their custom build, it is possible to write to the SPI NOR flash using the sf
command[3].
# Detect the SPI NOR flash => sf probe SF: Detected w25q128bv with page size 256 Bytes, erase size 4 KiB, total 16 MiB # Sanity checks => ls mmc 0:1 558296 u-boot.bin 1 file(s), 0 dir(s) # Loading the bootloader from an SD card => load mmc 0:1 ${kernel_addr_r} /u-boot.bin reading /u-boot.bin 558296 bytes read in 79 ms (6.7 MiB/s) # Erasing the SPI NOR flash => sf erase 0 3e8000 SF: 4096000 bytes @ 0x0 Erased: OK # Writing to the SPI NOR flash => sf write ${kernel_addr_r} 0 3e8000 device 0 offset 0x0, size 0x3e8000 SF: 4096000 bytes @ 0x0 Written: OK