14ad8b75dSGlen Barber#!/bin/sh 24ad8b75dSGlen Barber#- 3751c20d8SGlen Barber# Copyright (c) 2015-2017 The FreeBSD Foundation 44ad8b75dSGlen Barber# All rights reserved. 54ad8b75dSGlen Barber# 64ad8b75dSGlen Barber# Portions of this software were developed by Glen Barber 74ad8b75dSGlen Barber# under sponsorship from the FreeBSD Foundation. 84ad8b75dSGlen Barber# 94ad8b75dSGlen Barber# Redistribution and use in source and binary forms, with or without 104ad8b75dSGlen Barber# modification, are permitted provided that the following conditions 114ad8b75dSGlen Barber# are met: 124ad8b75dSGlen Barber# 1. Redistributions of source code must retain the above copyright 134ad8b75dSGlen Barber# notice, this list of conditions and the following disclaimer. 144ad8b75dSGlen Barber# 2. Redistributions in binary form must reproduce the above copyright 154ad8b75dSGlen Barber# notice, this list of conditions and the following disclaimer in the 164ad8b75dSGlen Barber# documentation and/or other materials provided with the distribution. 174ad8b75dSGlen Barber# 184ad8b75dSGlen Barber# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 194ad8b75dSGlen Barber# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 204ad8b75dSGlen Barber# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 214ad8b75dSGlen Barber# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 224ad8b75dSGlen Barber# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 234ad8b75dSGlen Barber# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 244ad8b75dSGlen Barber# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 254ad8b75dSGlen Barber# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 264ad8b75dSGlen Barber# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 274ad8b75dSGlen Barber# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 284ad8b75dSGlen Barber# SUCH DAMAGE. 294ad8b75dSGlen Barber# 30751c20d8SGlen Barber# Common subroutines used to build arm SD card images. 314ad8b75dSGlen Barber# 324ad8b75dSGlen Barber# $FreeBSD$ 334ad8b75dSGlen Barber# 344ad8b75dSGlen Barber 354ad8b75dSGlen Barbercleanup() { 364ad8b75dSGlen Barber if [ -c "${DESTDIR}/dev/null" ]; then 374ad8b75dSGlen Barber umount_loop ${DESTDIR}/dev 2>/dev/null 384ad8b75dSGlen Barber fi 394ad8b75dSGlen Barber umount_loop ${DESTDIR} 404ad8b75dSGlen Barber if [ ! -z "${mddev}" ]; then 414ad8b75dSGlen Barber mdconfig -d -u ${mddev} 424ad8b75dSGlen Barber fi 434ad8b75dSGlen Barber 444ad8b75dSGlen Barber return 0 454ad8b75dSGlen Barber} 464ad8b75dSGlen Barber 474ad8b75dSGlen Barberumount_loop() { 484ad8b75dSGlen Barber DIR=$1 494ad8b75dSGlen Barber i=0 504ad8b75dSGlen Barber sync 514ad8b75dSGlen Barber while ! umount ${DIR}; do 524ad8b75dSGlen Barber i=$(( $i + 1 )) 534ad8b75dSGlen Barber if [ $i -ge 10 ]; then 544ad8b75dSGlen Barber # This should never happen. But, it has happened. 554ad8b75dSGlen Barber echo "Cannot umount(8) ${DIR}" 564ad8b75dSGlen Barber echo "Something has gone horribly wrong." 574ad8b75dSGlen Barber return 1 584ad8b75dSGlen Barber fi 594ad8b75dSGlen Barber sleep 1 604ad8b75dSGlen Barber done 614ad8b75dSGlen Barber 624ad8b75dSGlen Barber return 0 634ad8b75dSGlen Barber} 644ad8b75dSGlen Barber 654ad8b75dSGlen Barberarm_create_disk() { 664ad8b75dSGlen Barber # Create the target raw file and temporary work directory. 6704b7fd00SGlen Barber chroot ${CHROOTDIR} gpart create -s ${PART_SCHEME} ${mddev} 68751c20d8SGlen Barber chroot ${CHROOTDIR} gpart add -t '!12' -a 512k -s ${FAT_SIZE} ${mddev} 6904b7fd00SGlen Barber chroot ${CHROOTDIR} gpart set -a active -i 1 ${mddev} 7004b7fd00SGlen Barber chroot ${CHROOTDIR} newfs_msdos -L msdosboot -F ${FAT_TYPE} /dev/${mddev}s1 7104b7fd00SGlen Barber chroot ${CHROOTDIR} gpart add -t freebsd ${mddev} 7204b7fd00SGlen Barber chroot ${CHROOTDIR} gpart create -s bsd ${mddev}s2 7304b7fd00SGlen Barber chroot ${CHROOTDIR} gpart add -t freebsd-ufs -a 64k /dev/${mddev}s2 7404b7fd00SGlen Barber chroot ${CHROOTDIR} newfs -U -L rootfs /dev/${mddev}s2a 754ad8b75dSGlen Barber 764ad8b75dSGlen Barber return 0 774ad8b75dSGlen Barber} 784ad8b75dSGlen Barber 7988feae84SGlen Barberarm_create_user() { 8088feae84SGlen Barber # Create a default user account 'freebsd' with the password 'freebsd', 8188feae84SGlen Barber # and set the default password for the 'root' user to 'root'. 82b07d911fSGlen Barber chroot ${CHROOTDIR} /usr/sbin/pw -R ${DESTDIR} \ 83f3ca4d91SGlen Barber groupadd freebsd -g 1001 84717a45fcSGlen Barber chroot ${CHROOTDIR} mkdir -p ${DESTDIR}/home/freebsd 85b07d911fSGlen Barber chroot ${CHROOTDIR} /usr/sbin/pw -R ${DESTDIR} \ 86f3ca4d91SGlen Barber useradd freebsd \ 8788feae84SGlen Barber -m -M 0755 -w yes -n freebsd -u 1001 -g 1001 -G 0 \ 88b07d911fSGlen Barber -c 'FreeBSD User' -d '/home/freebsd' -s '/bin/csh' 89b07d911fSGlen Barber chroot ${CHROOTDIR} /usr/sbin/pw -R ${DESTDIR} \ 90f3ca4d91SGlen Barber usermod root -w yes 9188feae84SGlen Barber 9288feae84SGlen Barber return 0 9388feae84SGlen Barber} 9488feae84SGlen Barber 954fe984fdSEdward Tomasz Napieralaarm_setup_usb_otg() { 964fe984fdSEdward Tomasz Napierala # Set up virtual serial port over USB OTG / device mode. 974fe984fdSEdward Tomasz Napierala echo >> ${CHROOTDIR}/${DESTDIR}/etc/devd.conf 984fe984fdSEdward Tomasz Napierala echo '# Required for USB OTG virtual serial port.' \ 994fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/etc/devd.conf 1004fe984fdSEdward Tomasz Napierala echo 'notify 100 {' \ 1014fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/etc/devd.conf 1024fe984fdSEdward Tomasz Napierala echo ' match "system" "DEVFS";' \ 1034fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/etc/devd.conf 1044fe984fdSEdward Tomasz Napierala echo ' match "subsystem" "CDEV";' \ 1054fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/etc/devd.conf 1064fe984fdSEdward Tomasz Napierala echo ' match "type" "CREATE";' \ 1074fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/etc/devd.conf 1084fe984fdSEdward Tomasz Napierala echo ' match "cdev" "ttyU[0-9]+";' \ 1094fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/etc/devd.conf 1104fe984fdSEdward Tomasz Napierala echo ' action "/sbin/init q";' \ 1114fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/etc/devd.conf 1124fe984fdSEdward Tomasz Napierala echo '};' \ 1134fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/etc/devd.conf 1144fe984fdSEdward Tomasz Napierala 1154fe984fdSEdward Tomasz Napierala echo '# USB OTG virtual serial port' \ 1164fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/etc/ttys 1174fe984fdSEdward Tomasz Napierala echo 'ttyU0 "/usr/libexec/getty 3wire" vt100 onifconsole secure' \ 1184fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/etc/ttys 1194fe984fdSEdward Tomasz Napierala echo 'ttyU1 "/usr/libexec/getty 3wire" vt100 onifconsole secure' \ 1204fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/etc/ttys 1214fe984fdSEdward Tomasz Napierala 1224fe984fdSEdward Tomasz Napierala echo '# Configure USB OTG; see usb_template(4).' \ 1234fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf 1244fe984fdSEdward Tomasz Napierala echo 'hw.usb.template=3' \ 1254fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf 1264fe984fdSEdward Tomasz Napierala echo 'umodem_load="YES"' \ 1274fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf 1284fe984fdSEdward Tomasz Napierala} 1294fe984fdSEdward Tomasz Napierala 130a8d0ee75SEmmanuel Vadotarm64_setup_multicons() { 131a8d0ee75SEmmanuel Vadot if [ "${EMBEDDED_TARGET_ARCH}" != "aarch64" ]; then 132a8d0ee75SEmmanuel Vadot return 133a8d0ee75SEmmanuel Vadot fi 134a8d0ee75SEmmanuel Vadot 135a8d0ee75SEmmanuel Vadot echo '# Multiple console (serial+efi gop) enabled.' \ 136a8d0ee75SEmmanuel Vadot >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf 137a8d0ee75SEmmanuel Vadot echo 'boot_multicons="YES"' \ 138a8d0ee75SEmmanuel Vadot >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf 139a8d0ee75SEmmanuel Vadot echo 'boot_serial="YES"' \ 140a8d0ee75SEmmanuel Vadot >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf 141a8d0ee75SEmmanuel Vadot} 142a8d0ee75SEmmanuel Vadot 14366e38012SEmmanuel Vadotarm_setup_fdt_overlays() { 14466e38012SEmmanuel Vadot if [ -z "${FDT_OVERLAYS}" ]; then 14566e38012SEmmanuel Vadot return 14666e38012SEmmanuel Vadot fi 14766e38012SEmmanuel Vadot 14866e38012SEmmanuel Vadot echo '# DTB OVERLAYS' \ 14966e38012SEmmanuel Vadot >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf 15066e38012SEmmanuel Vadot echo "fdt_overlays=\"${FDT_OVERLAYS}\"" \ 15166e38012SEmmanuel Vadot >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf 15266e38012SEmmanuel Vadot} 15366e38012SEmmanuel Vadot 154*9de0425eSKyle Evansarm_setup_minimal_loader() { 155*9de0425eSKyle Evans echo '# Disable the beastie menu and color' \ 156*9de0425eSKyle Evans >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf 157*9de0425eSKyle Evans echo 'beastie_disable="YES"' \ 158*9de0425eSKyle Evans >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf 159*9de0425eSKyle Evans echo 'loader_color="NO"' \ 160*9de0425eSKyle Evans >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf 161*9de0425eSKyle Evans} 162*9de0425eSKyle Evans 1634ad8b75dSGlen Barberarm_install_base() { 16404b7fd00SGlen Barber chroot ${CHROOTDIR} mount /dev/${mddev}s2a ${DESTDIR} 16504b7fd00SGlen Barber eval chroot ${CHROOTDIR} make -C ${WORLDDIR} \ 16604b7fd00SGlen Barber TARGET=${EMBEDDED_TARGET} \ 1674ad8b75dSGlen Barber TARGET_ARCH=${EMBEDDED_TARGET_ARCH} \ 1684ad8b75dSGlen Barber DESTDIR=${DESTDIR} KERNCONF=${KERNEL} \ 1694ad8b75dSGlen Barber installworld installkernel distribution 170fef41f60SGlen Barber chroot ${CHROOTDIR} mkdir -p ${DESTDIR}/boot/msdos 1714ad8b75dSGlen Barber 172f3ca4d91SGlen Barber arm_create_user 1734fe984fdSEdward Tomasz Napierala arm_setup_usb_otg 174a8d0ee75SEmmanuel Vadot arm64_setup_multicons 17566e38012SEmmanuel Vadot arm_setup_fdt_overlays 176*9de0425eSKyle Evans arm_setup_minimal_loader 17788feae84SGlen Barber 1784ad8b75dSGlen Barber echo '# Custom /etc/fstab for FreeBSD embedded images' \ 17904b7fd00SGlen Barber > ${CHROOTDIR}/${DESTDIR}/etc/fstab 1804ad8b75dSGlen Barber echo "/dev/ufs/rootfs / ufs rw 1 1" \ 18104b7fd00SGlen Barber >> ${CHROOTDIR}/${DESTDIR}/etc/fstab 182869ef347SGlen Barber echo "/dev/msdosfs/MSDOSBOOT /boot/msdos msdosfs rw,noatime 0 0" \ 183869ef347SGlen Barber >> ${CHROOTDIR}/${DESTDIR}/etc/fstab 184c7161c4aSEmmanuel Vadot echo "tmpfs /tmp tmpfs rw,mode=1777,size=50m 0 0" \ 18504b7fd00SGlen Barber >> ${CHROOTDIR}/${DESTDIR}/etc/fstab 1864ad8b75dSGlen Barber 1874ad8b75dSGlen Barber local hostname 1884ad8b75dSGlen Barber hostname="$(echo ${KERNEL} | tr '[:upper:]' '[:lower:]')" 18904b7fd00SGlen Barber echo "hostname=\"${hostname}\"" > ${CHROOTDIR}/${DESTDIR}/etc/rc.conf 19004b7fd00SGlen Barber echo 'ifconfig_DEFAULT="DHCP"' >> ${CHROOTDIR}/${DESTDIR}/etc/rc.conf 19104b7fd00SGlen Barber echo 'sshd_enable="YES"' >> ${CHROOTDIR}/${DESTDIR}/etc/rc.conf 19204b7fd00SGlen Barber echo 'sendmail_enable="NONE"' >> ${CHROOTDIR}/${DESTDIR}/etc/rc.conf 19304b7fd00SGlen Barber echo 'sendmail_submit_enable="NO"' >> ${CHROOTDIR}/${DESTDIR}/etc/rc.conf 19404b7fd00SGlen Barber echo 'sendmail_outbound_enable="NO"' >> ${CHROOTDIR}/${DESTDIR}/etc/rc.conf 19504b7fd00SGlen Barber echo 'sendmail_msp_queue_enable="NO"' >> ${CHROOTDIR}/${DESTDIR}/etc/rc.conf 19660bc17f4SGlen Barber echo 'growfs_enable="YES"' >> ${CHROOTDIR}/${DESTDIR}/etc/rc.conf 1974ad8b75dSGlen Barber 1984ad8b75dSGlen Barber sync 19904b7fd00SGlen Barber umount_loop ${CHROOTDIR}/${DESTDIR} 2004ad8b75dSGlen Barber 2014ad8b75dSGlen Barber return 0 2024ad8b75dSGlen Barber} 2034ad8b75dSGlen Barber 20443e289dfSEmmanuel Vadotarm_install_boot() { 20543e289dfSEmmanuel Vadot FATMOUNT="${DESTDIR%${KERNEL}}/fat" 20643e289dfSEmmanuel Vadot UFSMOUNT="${DESTDIR%${KERNEL}}/ufs" 20743e289dfSEmmanuel Vadot chroot ${CHROOTDIR} mkdir -p "${FATMOUNT}" "${UFSMOUNT}" 20843e289dfSEmmanuel Vadot chroot ${CHROOTDIR} mount_msdosfs /dev/${mddev}s1 ${FATMOUNT} 20943e289dfSEmmanuel Vadot chroot ${CHROOTDIR} mount /dev/${mddev}s2a ${UFSMOUNT} 21043e289dfSEmmanuel Vadot 21143e289dfSEmmanuel Vadot if [ "${EMBEDDED_TARGET}" == "arm" ]; then 21243e289dfSEmmanuel Vadot chroot ${CHROOTDIR} cp -p ${UFSMOUNT}/boot/ubldr.bin \ 21343e289dfSEmmanuel Vadot ${FATMOUNT}/ubldr.bin 21443e289dfSEmmanuel Vadot fi 21543e289dfSEmmanuel Vadot 21643e289dfSEmmanuel Vadot BOOTFILES="$(chroot ${CHROOTDIR} \ 21743e289dfSEmmanuel Vadot env TARGET=${EMBEDDED_TARGET} TARGET_ARCH=${EMBEDDED_TARGET_ARCH} \ 21843e289dfSEmmanuel Vadot WITH_UNIFIED_OBJDIR=yes \ 21943e289dfSEmmanuel Vadot make -C ${WORLDDIR}/stand -V .OBJDIR)" 22043e289dfSEmmanuel Vadot BOOTFILES="$(chroot ${CHROOTDIR} realpath ${BOOTFILES})" 22143e289dfSEmmanuel Vadot 22243e289dfSEmmanuel Vadot chroot ${CHROOTDIR} mkdir -p ${FATMOUNT}/EFI/BOOT 2233e6e16b4SWarner Losh chroot ${CHROOTDIR} cp -p ${BOOTFILES}/efi/loader_lua/loader_lua.efi \ 22443e289dfSEmmanuel Vadot ${FATMOUNT}/EFI/BOOT/$(efi_boot_name ${EMBEDDED_TARGET}) 22543e289dfSEmmanuel Vadot 2267b7dbfa9SEmmanuel Vadot chroot ${CHROOTDIR} cp -R ${UFSMOUNT}/boot/dtb ${FATMOUNT} 2277b7dbfa9SEmmanuel Vadot 22843e289dfSEmmanuel Vadot chroot ${CHROOTDIR} touch ${UFSMOUNT}/firstboot 22943e289dfSEmmanuel Vadot sync 23043e289dfSEmmanuel Vadot umount_loop ${CHROOTDIR}/${FATMOUNT} 23143e289dfSEmmanuel Vadot umount_loop ${CHROOTDIR}/${UFSMOUNT} 23243e289dfSEmmanuel Vadot chroot ${CHROOTDIR} rmdir ${FATMOUNT} 23343e289dfSEmmanuel Vadot chroot ${CHROOTDIR} rmdir ${UFSMOUNT} 23443e289dfSEmmanuel Vadot} 23543e289dfSEmmanuel Vadot 2364ad8b75dSGlen Barberarm_install_uboot() { 2374ad8b75dSGlen Barber # Override in the arm/KERNEL.conf file. 2384ad8b75dSGlen Barber 2394ad8b75dSGlen Barber return 0 2404ad8b75dSGlen Barber} 241