#!/bin/sh # apk add qemu-img qemu-openrc losetup blkid sgdisk e2fsprogs wget tar set -eu if [ $model = "vf1" ]; then : "${DISK:=visionfive-v1-mmc.img}" elif [ $model = "vf2" ]; then : "${DISK:=visionfive-v2-mmc.img}" else echo "model must be set, vf1 or vf2" exit fi : "${DISK:=visionfive-v2-mmc.img}" : "${DISKSIZE:=300M}" readonly SCRIPT="${0##*/}" readonly TMPDIR="$(mktemp -dt "${SCRIPT%.*}".XXXXXX)" readonly APK_KEY="alpine-devel@lists.alpinelinux.org-60ac2099.rsa.pub" readonly MIRROR="http://dl-cdn.alpinelinux.org/alpine" readonly LOOPDEV="$(losetup --find)" readonly BOOTDEV="$LOOPDEV"p3 readonly ROOTDEV="$LOOPDEV"p4 cleanup() { set +e mountpoint -q "$TMPDIR"/boot && umount "$TMPDIR"/boot mountpoint -q "$TMPDIR" && umount "$TMPDIR" losetup --detach-all rm -rf "$TMPDIR" } trap cleanup EXIT INT if [ $model = "vf1" ]; then kernel="linux-starfive-6.2_rc7-r1.apk" elif [ $model = "vf2" ]; then kernel="linux-starfive-6.5.3-r0.apk" fi #if [ $model = "vf1" ]; then # kernel="linux-starfive-6.2_rc7-r1.apk" if [ $model = "vf2" ]; then uboot="u-boot-jh7110-0_git20231016-r0.apk" fi if [ ! -f $kernel ]; then wget http://starfive.infra.alpinelinux.org/starfive/riscv64/"$kernel" fi if [ ! -f $uboot ]; then wget http://starfive.infra.alpinelinux.org/starfive/riscv64/"$uboot" fi rm -f $DISK truncate -s $DISKSIZE $DISK echo "Paritioning disk" sgdisk --clear \ --set-alignment=2 \ --new=1:4096:+2MiB: --change-name=1:spl --typecode=1:2E54B353-1271-4842-806F-E436D6AF6985\ --new=2::+4MiB: --change-name=2:uboot --typecode=2:BC13C2FF-59E6-4262-A352-B275FD6F7172 \ --new=3::+128MiB: --change-name=3:boot --typecode=3:EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 \ --new 4::: -c 4:root \ "${DISK}" sgdisk --attributes=3:set:2 ${DISK} # #-n 4::: -c 4:root -A 4:set:2 \ echo "Creating dirs and mounting" losetup -P "$LOOPDEV" "$DISK" mkfs.ext4 -qL boot "$BOOTDEV" mkfs.ext4 -qL root "$ROOTDEV" mount -t ext4 "$ROOTDEV" "$TMPDIR" mkdir -p "$TMPDIR"/boot mkdir -p "$TMPDIR"/etc/apk/keys mount -t ext4 "$BOOTDEV" "$TMPDIR"/boot cat < "$TMPDIR"/boot/uEnv.txt fdt_high=0xffffffffffffffff initrd_high=0xffffffffffffffff scriptaddr=0x88100000 script_offset_f=0x1fff000 script_size_f=0x1000 kernel_addr_r=0x84000000 kernel_comp_addr_r=0x90000000 kernel_comp_size=0x10000000 fdt_addr_r=0x88000000 ramdisk_addr_r=0x88300000 bootcmd=devnum=0; run mmc_boot bootcmd_mmc0=devnum=0; run mmc_boot distro_bootcmd=run bootcmd_mmc0 EOF echo "Setup apk keys and repositories" wget -qP "$TMPDIR"/etc/apk/keys https://alpinelinux.org/keys/"$APK_KEY" printf "$MIRROR/edge/%s\n" main community testing > "$TMPDIR"/etc/apk/repositories echo "installing base packages" apk --allow-untrusted --root "$TMPDIR" --arch riscv64 --initdb add \ alpine-base alpine-baselayout alpine-conf kmod openrc \ dbus util-linux blkid chrony \ sysfsutils ssl_client ca-certificates-bundle alpine-keys \ ethtool e2fsprogs e2fsprogs-extra libudev-zero libudev-zero-helper \ iwd linux-firmware-brcm linux-firmware-cypress installkernel mkinitfs \ agetty openresolv tar tzdata openssh wget sgdisk apk --allow-untrusted --root "$TMPDIR" --arch riscv64 add $kernel if [ $model = "vf2" ]; then apk --allow-untrusted --root "$TMPDIR" --arch riscv64 add $uboot dd if="$TMPDIR"/usr/share/u-boot-jh7110/u-boot-spl.bin.normal.out of=${LOOPDEV}p1 dd if="$TMPDIR"/usr/share/u-boot-jh7110/u-boot.itb of=${LOOPDEV}p2 fi echo "Setting up services and inittab" for rc in boot/bootmisc boot/hostname boot/modules boot/sysctl boot/urandom boot/networking \ sysinit/devfs sysinit/hwdrivers sysinit/mdev sysinit/modules \ shutdown/mount-ro shutdown/killprocs \ default/dbus default/chronyd default/local; do ln -s /etc/init.d/"${rc##*/}" "$TMPDIR"/etc/runlevels/"$rc" done echo 'SUBSYSTEM=drm;.* root:video 660 */usr/libexec/libudev-zero-helper' >> $TMPDIR/etc/mdev.conf echo 'SUBSYSTEM=input;.* root:input 660 */usr/libexec/libudev-zero-helper' >> $TMPDIR/etc/mdev.conf echo 'blacklist jh7110_crypto' >> $TMPDIR/etc/modprobe.d/blacklist-local.conf echo "Settting boot loader" bootuuid=$(blkid -s UUID -o value $BOOTDEV) echo "LABEL=boot /boot ext4 auto" >> $TMPDIR/etc/fstab rootuuid=$(blkid -s UUID -o value $ROOTDEV) mkdir -p "$TMPDIR"/boot/extlinux if [ $model = "vf1" ]; then cat < "$TMPDIR"/boot/extlinux/extlinux.conf menu title StarFive VisionFive timeout 50 default alpine label alpine menu label Alpine visionfive V1 board kernel /vmlinuz-starfive initrd /initramfs-starfive fdt /dtbs-starfive/starfive/jh7100-starfive-visionfive-v1.dtb append earlycon=sbi rw root=UUID=$rootuuid rootfstype=ext4 rootwait console=ttyS0,115200 console=tty0 stmmaceth=chain_mode:1 EOF elif [ $model = "vf2" ]; then cat < "$TMPDIR"/boot/extlinux/extlinux.conf menu title StarFive VisionFive timeout 50 default starfive label starfive menu label Alpine visionfive kernel /vmlinuz-starfive initrd /initramfs-starfive fdt /dtbs-starfive/ append earlycon=sbi rw root=UUID=$rootuuid rootfstype=ext4 rootwait console=ttyS0,115200 console=tty0 stmmaceth=chain_mode:1 label alpineV2v2 menu label Alpine visionfive V2-v1.3b kernel /vmlinuz-starfive initrd /initramfs-starfive fdt /dtbs-starfive/starfive/jh7110-starfive-visionfive-2-v1.3b.dtb append earlycon=sbi rw root=UUID=$rootuuid rootfstype=ext4 rootwait console=ttyS0,115200 console=tty0 stmmaceth=chain_mode:1 label alpineV2v1 menu label Alpine visionfive V2-v1.2a kernel /vmlinuz-starfive initrd /initramfs-starfive fdt /dtbs-starfive/starfive/jh7110-starfive-visionfive-2-v1.2a.dtb append earlycon=sbi rw root=UUID=$rootuuid rootfstype=ext4 rootwait console=ttyS0,115200 console=tty0 stmmaceth=chain_mode:1 EOF fi sed -i 's/^tty1.*/tty1::respawn:\/sbin\/agetty -L 115200 tty1 linux --login-pause --autologin root --noclear/' $TMPDIR/etc/inittab sed -i 's/^#ttyS0/ttyS0/' $TMPDIR/etc/inittab sed -i 's/^ttyS0.*/ttyS0::respawn:\/sbin\/agetty -L 115200 ttyS0 linux --login-pause --autologin root --noclear/' $TMPDIR/etc/inittab echo "Finished, cleaning up"