The NanoPi NEOLTS is a SBC from FriendlyElec that uses the Allwinner H3 SOC. The NanoPi NEOLTS has a nice selection of hardware including 100Mbit Ethernet, 3 USB Ports and a bunch of exposed GPIO.
FreeBSD on the NanoPi uses GENERICSD image. This image requires a bootloader to be added before it will work. We can prepare a single image to be copied to many SD cards by using a memory disk as an intermediate step.
We need to:
- Get the latest GENERICSD card image snapshot
- Install the correct boot loader pkg
- Create a memory disk
- Copy the GENERICSD image to memory disk
- Copy the bootloader to the memory disk
- Mount the root partition of the sd card image
- Copy the programs and files we need for the tutorial to the sd card
The latest image is as I write is 13 CURRENT from 20190829:
$ fetch ftp://ftp.freebsd.org/pub/FreeBSD/snapshots/arm/armv7/ISO-IMAGES/13.0/FreeBSD-13.0-CURRENT-arm-armv7-GENERICSD-20190829-r351591.img.xz
We have to decompress the image before we can use it
$ xz -d FreeBSD-13.0-CURRENT-arm-armv7-GENERICSD-20190829-r351591.img.xz
Each u-boot bootloader platform has its own package, currently there are 46 different bootloaders in the FreeBSD ports system. We want the u-boot for the nanopi_neo (our target).
$ pkg search nanopi u-boot-nanopi-neo2-2019.07 Cross-build das u-boot for model nanopi-neo2 u-boot-nanopi_a64-2019.07 Cross-build das u-boot for model nanopi_a64 u-boot-nanopi_m1plus-2019.07 Cross-build das u-boot for model nanopi_m1plus u-boot-nanopi_neo-2019.07 Cross-build das u-boot for model nanopi_neo u-boot-nanopi_neo_air-2019.07 Cross-build das u-boot for model nanopi_neo_air # pkg install u-boot-nanopi_neo-2019.07
u-boot-nanopi_neo package contains the binary bootloader we need in
$ pkg info -l u-boot-nanopi_neo-2019.07 u-boot-nanopi_neo-2019.07: /usr/local/share/licenses/u-boot-nanopi_neo-2019.07/GPLv2 /usr/local/share/licenses/u-boot-nanopi_neo-2019.07/LICENSE /usr/local/share/licenses/u-boot-nanopi_neo-2019.07/catalog.mk /usr/local/share/u-boot/u-boot-nanopi_neo/README /usr/local/share/u-boot/u-boot-nanopi_neo/boot.scr /usr/local/share/u-boot/u-boot-nanopi_neo/metadata /usr/local/share/u-boot/u-boot-nanopi_neo/u-boot-sunxi-with-spl.bin
With the GENERICSD image and the bootloader we need to create the memory disk image we will use for staging. First we need to create a large enough backing file.
$ truncate -s 8G nanopi.img # mdconfig -f nanopi.img md0
Now we can
dd the GENERICSD image to the memory disk
# dd if=FreeBSD-13.0-CURRENT-arm-armv7-GENERICSD-20190829-r351591.img of=/dev/md0 bs=1m
We need to
dd the bootloader to the start of the SD card, i.e. the entire
device and not a partition.
# dd if=/usr/local/share/u-boot/u-boot-nanopi_neo/u-boot-sunxi-with-spl.bin of=/dev/da0 bs=1k seek=8 conv=sync
With the memory disk attached we can interact with the image file as if it were a real USB drive or SD card.
$ gpart show md0 => 63 16777153 md0 MBR (8.0G) 63 2016 - free - (1.0M) 2079 102312 1 fat32lba [active] (50M) 104391 6187041 2 freebsd (3.0G) 6291432 10485784 - free - (5.0G)
We can mount the root partition of the SD card and modify or add any files we wish:
# mount /dev/md0sa mnt
When we are done changing things we have to disconnect the memory disk:
# sudo mdconfig -d -u md0
Finally we can copy the memory disk to a real sd card using
# sudo dd if=nanopi.img of=/dev/da0 bs=1m