Skip to main content

U-Boot

sudo apt install -y git build-essential gcc-aarch64-linux-gnu bison flex libssl-dev libgnutls28-dev

BOARD=board-virt
mkdir $BOARD
cd $BOARD
git clone https://source.denx.de/u-boot/u-boot.git
pushd u-boot

ls configs/qemu_*_defconfig
make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- qemu_arm64_defconfig

sudo apt-get install libncurses-dev

make menuconfig

# Partition Type --->
# [*] Enbale EFI GPT partition table
# Environment --->
# [*] Environment is in a EXT4 filesystem
# [ ] Environment in flash memory
# (virtio) Name of the block device for the environment
# (0:2) Device and partition for where to store the environemt in EXT4 partition

# Virtual board virt not support MMC
# MMC Host controller Support --->
# [*] MMC/SD/SDIO card support
# Environment --->
# (0x04000000) Environment offset
# (0) mmc device number
# (1) mmc partition number

make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)

popd

sudo apt install -y qemu-system-aarch64

# virt maybe not support SATA, SD, eMMC
qemu-img create -f qcow2 qemu-arm64.qcow2 16G
sudo modprobe nbd max_part=16
sudo qemu-nbd --connect=/dev/nbd0 qemu-arm64.qcow2

sudo parted /dev/nbd0 --script -- \
mklabel gpt \
mkpart primary fat32 1MiB 5MiB \
mkpart primary ext4 64MiB 65MiB \
mkpart primary ext4 128MiB 1128MiB \
mkpart primary ext4 1128MiB 2128MiB \
mkpart primary ext4 2128MiB 100%

sudo mkfs.vfat /dev/nbd0p1 # virt not support load u-boot from virto
sudo mkfs.ext4 -O ^metadata_csum,^64bit /dev/nbd0p2 # ENV file
sudo mkfs.ext4 /dev/nbd0p3 # System A
sudo mkfs.ext4 /dev/nbd0p4 # System B
sudo mkfs.ext4 /dev/nbd0p5 # Data

sudo parted /dev/nbd0 print

sudo qemu-nbd --disconnect /dev/nbd0
sudo modprobe -r nbd

qemu-system-aarch64 -M virt -cpu cortex-a57 -smp 2 -m 512M -nographic \
-bios u-boot/u-boot.bin \
-drive file=qemu-arm64.qcow2,if=virtio,format=qcow2

# At u-boot
=> saveenv
=> ext4ls virtio 0:2
./
../
lost+found/
262144 uboot.env

0 file(s), 3 dir(s)

# Open new console to close qemu at u-boot
kill -9 $(pgrep -f "qemu-system-aarch64")

Maybe not support SDcard

qemu-img create -f raw sdcard.img 16G
ls -lh sdcard.img # 16G
sudo losetup --show -f sdcard.img
# Example: /dev/loop10
LOOP=/dev/loop10
losetup -a
lsblk
ls -l /dev/loop10*

sudo parted ${LOOP} mklabel gpt
sudo parted ${LOOP} mkpart primary 1MiB 5MiB # u-boot
sudo parted ${LOOP} mkpart primary 64MiB 65MiB # env
sudo parted ${LOOP} mkpart primary 128MiB 1128MiB # system A
sudo parted ${LOOP} mkpart primary 1128MiB 2128MiB # System B
sudo parted ${LOOP} mkpart primary 2128MiB 100% # data

sudo mkfs.vfat /dev/loop10p1 #
sudo mkfs.ext4 -O ^metadata_csum,^64bit /dev/loop10p2
sudo mkfs.ext4 /dev/loop10p3 # System A
sudo mkfs.ext4 /dev/loop10p4 # System B
sudo mkfs.ext4 /dev/loop10p5 # Data

sudo umount /dev/loop10p1
sudo umount /dev/loop10p2
sudo umount /dev/loop10p3
sudo umount /dev/loop10p4
sudo umount /dev/loop10p5

sudo losetup -d ${LOOP}

# check part
parted sdcard.img
print
quit

dd if=u-boot/u-boot.bin of=sdcard.img bs=1M seek=1 conv=notrunc

qemu-system-aarch64 -M virt -cpu cortex-a57 -m 2048M -nographic \
-bios u-boot/u-boot.bin \
-device sdhci-pci \
-drive file=sdcard.img,if=none,format=raw,id=sd \
-device sd-card,drive=sd

Test saveenv

setenv test_var hello
printenv test_var
saveenv
reset
printenv test_var

Clean nhd & loop

for dev in /dev/nbd*; do
sudo nbd-client -d $dev
done

for dev in /dev/loop*; do
sudo losetup -d $dev
done