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} 68*38e4df10SEmmanuel Vadot if [ "${PART_SCHEME}" == "GPT" ]; then 69*38e4df10SEmmanuel Vadot chroot ${CHROOTDIR} gpart add -t efi -l efi -a 512k -s ${FAT_SIZE} ${mddev} 70*38e4df10SEmmanuel Vadot chroot ${CHROOTDIR} newfs_msdos -L efi -F ${FAT_TYPE} /dev/${mddev}p1 71*38e4df10SEmmanuel Vadot chroot ${CHROOTDIR} gpart add -t freebsd-ufs -l rootfs -a 64k ${mddev} 72*38e4df10SEmmanuel Vadot chroot ${CHROOTDIR} newfs -U -L rootfs /dev/${mddev}p2 73*38e4df10SEmmanuel Vadot fi 74*38e4df10SEmmanuel Vadot if [ "${PART_SCHEME}" == "MBR" ]; then 75751c20d8SGlen Barber chroot ${CHROOTDIR} gpart add -t '!12' -a 512k -s ${FAT_SIZE} ${mddev} 7604b7fd00SGlen Barber chroot ${CHROOTDIR} gpart set -a active -i 1 ${mddev} 7704b7fd00SGlen Barber chroot ${CHROOTDIR} newfs_msdos -L msdosboot -F ${FAT_TYPE} /dev/${mddev}s1 7804b7fd00SGlen Barber chroot ${CHROOTDIR} gpart add -t freebsd ${mddev} 7904b7fd00SGlen Barber chroot ${CHROOTDIR} gpart create -s bsd ${mddev}s2 8004b7fd00SGlen Barber chroot ${CHROOTDIR} gpart add -t freebsd-ufs -a 64k /dev/${mddev}s2 8104b7fd00SGlen Barber chroot ${CHROOTDIR} newfs -U -L rootfs /dev/${mddev}s2a 82*38e4df10SEmmanuel Vadot fi 834ad8b75dSGlen Barber 844ad8b75dSGlen Barber return 0 854ad8b75dSGlen Barber} 864ad8b75dSGlen Barber 8788feae84SGlen Barberarm_create_user() { 8888feae84SGlen Barber # Create a default user account 'freebsd' with the password 'freebsd', 8988feae84SGlen Barber # and set the default password for the 'root' user to 'root'. 90b07d911fSGlen Barber chroot ${CHROOTDIR} /usr/sbin/pw -R ${DESTDIR} \ 91f3ca4d91SGlen Barber groupadd freebsd -g 1001 92717a45fcSGlen Barber chroot ${CHROOTDIR} mkdir -p ${DESTDIR}/home/freebsd 93b07d911fSGlen Barber chroot ${CHROOTDIR} /usr/sbin/pw -R ${DESTDIR} \ 94f3ca4d91SGlen Barber useradd freebsd \ 9588feae84SGlen Barber -m -M 0755 -w yes -n freebsd -u 1001 -g 1001 -G 0 \ 96b07d911fSGlen Barber -c 'FreeBSD User' -d '/home/freebsd' -s '/bin/csh' 97b07d911fSGlen Barber chroot ${CHROOTDIR} /usr/sbin/pw -R ${DESTDIR} \ 98f3ca4d91SGlen Barber usermod root -w yes 9988feae84SGlen Barber 10088feae84SGlen Barber return 0 10188feae84SGlen Barber} 10288feae84SGlen Barber 1034fe984fdSEdward Tomasz Napieralaarm_setup_usb_otg() { 1044fe984fdSEdward Tomasz Napierala # Set up virtual serial port over USB OTG / device mode. 1054fe984fdSEdward Tomasz Napierala echo >> ${CHROOTDIR}/${DESTDIR}/etc/devd.conf 1064fe984fdSEdward Tomasz Napierala echo '# Required for USB OTG virtual serial port.' \ 1074fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/etc/devd.conf 1084fe984fdSEdward Tomasz Napierala echo 'notify 100 {' \ 1094fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/etc/devd.conf 1104fe984fdSEdward Tomasz Napierala echo ' match "system" "DEVFS";' \ 1114fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/etc/devd.conf 1124fe984fdSEdward Tomasz Napierala echo ' match "subsystem" "CDEV";' \ 1134fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/etc/devd.conf 1144fe984fdSEdward Tomasz Napierala echo ' match "type" "CREATE";' \ 1154fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/etc/devd.conf 1164fe984fdSEdward Tomasz Napierala echo ' match "cdev" "ttyU[0-9]+";' \ 1174fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/etc/devd.conf 1184fe984fdSEdward Tomasz Napierala echo ' action "/sbin/init q";' \ 1194fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/etc/devd.conf 1204fe984fdSEdward Tomasz Napierala echo '};' \ 1214fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/etc/devd.conf 1224fe984fdSEdward Tomasz Napierala 1234fe984fdSEdward Tomasz Napierala echo '# USB OTG virtual serial port' \ 1244fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/etc/ttys 1254fe984fdSEdward Tomasz Napierala echo 'ttyU0 "/usr/libexec/getty 3wire" vt100 onifconsole secure' \ 1264fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/etc/ttys 1274fe984fdSEdward Tomasz Napierala echo 'ttyU1 "/usr/libexec/getty 3wire" vt100 onifconsole secure' \ 1284fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/etc/ttys 1294fe984fdSEdward Tomasz Napierala 1304fe984fdSEdward Tomasz Napierala echo '# Configure USB OTG; see usb_template(4).' \ 1314fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf 1324fe984fdSEdward Tomasz Napierala echo 'hw.usb.template=3' \ 1334fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf 1344fe984fdSEdward Tomasz Napierala echo 'umodem_load="YES"' \ 1354fe984fdSEdward Tomasz Napierala >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf 1364fe984fdSEdward Tomasz Napierala} 1374fe984fdSEdward Tomasz Napierala 138a8d0ee75SEmmanuel Vadotarm64_setup_multicons() { 139a8d0ee75SEmmanuel Vadot if [ "${EMBEDDED_TARGET_ARCH}" != "aarch64" ]; then 140a8d0ee75SEmmanuel Vadot return 141a8d0ee75SEmmanuel Vadot fi 142a8d0ee75SEmmanuel Vadot 143a8d0ee75SEmmanuel Vadot echo '# Multiple console (serial+efi gop) enabled.' \ 144a8d0ee75SEmmanuel Vadot >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf 145a8d0ee75SEmmanuel Vadot echo 'boot_multicons="YES"' \ 146a8d0ee75SEmmanuel Vadot >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf 147a8d0ee75SEmmanuel Vadot echo 'boot_serial="YES"' \ 148a8d0ee75SEmmanuel Vadot >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf 149a8d0ee75SEmmanuel Vadot} 150a8d0ee75SEmmanuel Vadot 15166e38012SEmmanuel Vadotarm_setup_fdt_overlays() { 15266e38012SEmmanuel Vadot if [ -z "${FDT_OVERLAYS}" ]; then 15366e38012SEmmanuel Vadot return 15466e38012SEmmanuel Vadot fi 15566e38012SEmmanuel Vadot 15666e38012SEmmanuel Vadot echo '# DTB OVERLAYS' \ 15766e38012SEmmanuel Vadot >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf 15866e38012SEmmanuel Vadot echo "fdt_overlays=\"${FDT_OVERLAYS}\"" \ 15966e38012SEmmanuel Vadot >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf 16066e38012SEmmanuel Vadot} 16166e38012SEmmanuel Vadot 1629de0425eSKyle Evansarm_setup_minimal_loader() { 1639de0425eSKyle Evans echo '# Disable the beastie menu and color' \ 1649de0425eSKyle Evans >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf 1659de0425eSKyle Evans echo 'beastie_disable="YES"' \ 1669de0425eSKyle Evans >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf 1679de0425eSKyle Evans echo 'loader_color="NO"' \ 1689de0425eSKyle Evans >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf 1699de0425eSKyle Evans} 1709de0425eSKyle Evans 1714ad8b75dSGlen Barberarm_install_base() { 172*38e4df10SEmmanuel Vadot if [ "${PART_SCHEME}" == "GPT" ]; then 173*38e4df10SEmmanuel Vadot chroot ${CHROOTDIR} mount /dev/${mddev}p2 ${DESTDIR} 174*38e4df10SEmmanuel Vadot fi 175*38e4df10SEmmanuel Vadot if [ "${PART_SCHEME}" == "MBR" ]; then 17604b7fd00SGlen Barber chroot ${CHROOTDIR} mount /dev/${mddev}s2a ${DESTDIR} 177*38e4df10SEmmanuel Vadot fi 17804b7fd00SGlen Barber eval chroot ${CHROOTDIR} make -C ${WORLDDIR} \ 17904b7fd00SGlen Barber TARGET=${EMBEDDED_TARGET} \ 1804ad8b75dSGlen Barber TARGET_ARCH=${EMBEDDED_TARGET_ARCH} \ 1814ad8b75dSGlen Barber DESTDIR=${DESTDIR} KERNCONF=${KERNEL} \ 182c1f64992SGlen Barber ${CONF_FILES} installworld installkernel distribution 183fef41f60SGlen Barber chroot ${CHROOTDIR} mkdir -p ${DESTDIR}/boot/msdos 1844ad8b75dSGlen Barber 185f3ca4d91SGlen Barber arm_create_user 1864fe984fdSEdward Tomasz Napierala arm_setup_usb_otg 187a8d0ee75SEmmanuel Vadot arm64_setup_multicons 18866e38012SEmmanuel Vadot arm_setup_fdt_overlays 1899de0425eSKyle Evans arm_setup_minimal_loader 1909848333bSEmmanuel Vadot arm_do_quirk 19188feae84SGlen Barber 1924ad8b75dSGlen Barber echo '# Custom /etc/fstab for FreeBSD embedded images' \ 19304b7fd00SGlen Barber > ${CHROOTDIR}/${DESTDIR}/etc/fstab 194*38e4df10SEmmanuel Vadot if [ "${PART_SCHEME}" == "GPT" ]; then 195*38e4df10SEmmanuel Vadot echo "/dev/ufs/rootfs / ufs rw 1 1" \ 196*38e4df10SEmmanuel Vadot >> ${CHROOTDIR}/${DESTDIR}/etc/fstab 197*38e4df10SEmmanuel Vadot echo "/dev/msdosfs/efi /boot/efi msdosfs rw,noatime 0 0" \ 198*38e4df10SEmmanuel Vadot >> ${CHROOTDIR}/${DESTDIR}/etc/fstab 199*38e4df10SEmmanuel Vadot fi 200*38e4df10SEmmanuel Vadot if [ "${PART_SCHEME}" == "MBR" ]; then 2014ad8b75dSGlen Barber echo "/dev/ufs/rootfs / ufs rw 1 1" \ 20204b7fd00SGlen Barber >> ${CHROOTDIR}/${DESTDIR}/etc/fstab 203869ef347SGlen Barber echo "/dev/msdosfs/MSDOSBOOT /boot/msdos msdosfs rw,noatime 0 0" \ 204869ef347SGlen Barber >> ${CHROOTDIR}/${DESTDIR}/etc/fstab 205*38e4df10SEmmanuel Vadot fi 206c7161c4aSEmmanuel Vadot echo "tmpfs /tmp tmpfs rw,mode=1777,size=50m 0 0" \ 20704b7fd00SGlen Barber >> ${CHROOTDIR}/${DESTDIR}/etc/fstab 2084ad8b75dSGlen Barber 2094ad8b75dSGlen Barber local hostname 2104ad8b75dSGlen Barber hostname="$(echo ${KERNEL} | tr '[:upper:]' '[:lower:]')" 21104b7fd00SGlen Barber echo "hostname=\"${hostname}\"" > ${CHROOTDIR}/${DESTDIR}/etc/rc.conf 21204b7fd00SGlen Barber echo 'ifconfig_DEFAULT="DHCP"' >> ${CHROOTDIR}/${DESTDIR}/etc/rc.conf 21304b7fd00SGlen Barber echo 'sshd_enable="YES"' >> ${CHROOTDIR}/${DESTDIR}/etc/rc.conf 21404b7fd00SGlen Barber echo 'sendmail_enable="NONE"' >> ${CHROOTDIR}/${DESTDIR}/etc/rc.conf 21504b7fd00SGlen Barber echo 'sendmail_submit_enable="NO"' >> ${CHROOTDIR}/${DESTDIR}/etc/rc.conf 21604b7fd00SGlen Barber echo 'sendmail_outbound_enable="NO"' >> ${CHROOTDIR}/${DESTDIR}/etc/rc.conf 21704b7fd00SGlen Barber echo 'sendmail_msp_queue_enable="NO"' >> ${CHROOTDIR}/${DESTDIR}/etc/rc.conf 21860bc17f4SGlen Barber echo 'growfs_enable="YES"' >> ${CHROOTDIR}/${DESTDIR}/etc/rc.conf 2194ad8b75dSGlen Barber 2204ad8b75dSGlen Barber sync 22104b7fd00SGlen Barber umount_loop ${CHROOTDIR}/${DESTDIR} 2224ad8b75dSGlen Barber 2234ad8b75dSGlen Barber return 0 2244ad8b75dSGlen Barber} 2254ad8b75dSGlen Barber 22643e289dfSEmmanuel Vadotarm_install_boot() { 22743e289dfSEmmanuel Vadot FATMOUNT="${DESTDIR%${KERNEL}}/fat" 22843e289dfSEmmanuel Vadot UFSMOUNT="${DESTDIR%${KERNEL}}/ufs" 22943e289dfSEmmanuel Vadot chroot ${CHROOTDIR} mkdir -p "${FATMOUNT}" "${UFSMOUNT}" 230*38e4df10SEmmanuel Vadot if [ "${PART_SCHEME}" == "GPT" ]; then 231*38e4df10SEmmanuel Vadot dospart="/dev/${mddev}p1" 232*38e4df10SEmmanuel Vadot ufspart="/dev/${mddev}p2" 233*38e4df10SEmmanuel Vadot fi 234*38e4df10SEmmanuel Vadot if [ "${PART_SCHEME}" == "MBR" ]; then 235*38e4df10SEmmanuel Vadot dospart="/dev/${mddev}s1" 236*38e4df10SEmmanuel Vadot ufspart="/dev/${mddev}s2a" 237*38e4df10SEmmanuel Vadot fi 238*38e4df10SEmmanuel Vadot 239*38e4df10SEmmanuel Vadot chroot ${CHROOTDIR} mount_msdosfs ${dospart} ${FATMOUNT} 240*38e4df10SEmmanuel Vadot chroot ${CHROOTDIR} mount ${ufspart} ${UFSMOUNT} 24143e289dfSEmmanuel Vadot 24243e289dfSEmmanuel Vadot if [ "${EMBEDDED_TARGET}" == "arm" ]; then 24343e289dfSEmmanuel Vadot chroot ${CHROOTDIR} cp -p ${UFSMOUNT}/boot/ubldr.bin \ 24443e289dfSEmmanuel Vadot ${FATMOUNT}/ubldr.bin 24543e289dfSEmmanuel Vadot fi 24643e289dfSEmmanuel Vadot 24743e289dfSEmmanuel Vadot BOOTFILES="$(chroot ${CHROOTDIR} \ 24843e289dfSEmmanuel Vadot env TARGET=${EMBEDDED_TARGET} TARGET_ARCH=${EMBEDDED_TARGET_ARCH} \ 24943e289dfSEmmanuel Vadot WITH_UNIFIED_OBJDIR=yes \ 25043e289dfSEmmanuel Vadot make -C ${WORLDDIR}/stand -V .OBJDIR)" 25143e289dfSEmmanuel Vadot BOOTFILES="$(chroot ${CHROOTDIR} realpath ${BOOTFILES})" 25243e289dfSEmmanuel Vadot 25343e289dfSEmmanuel Vadot chroot ${CHROOTDIR} mkdir -p ${FATMOUNT}/EFI/BOOT 2543e6e16b4SWarner Losh chroot ${CHROOTDIR} cp -p ${BOOTFILES}/efi/loader_lua/loader_lua.efi \ 25543e289dfSEmmanuel Vadot ${FATMOUNT}/EFI/BOOT/$(efi_boot_name ${EMBEDDED_TARGET}) 25643e289dfSEmmanuel Vadot 2577b7dbfa9SEmmanuel Vadot chroot ${CHROOTDIR} cp -R ${UFSMOUNT}/boot/dtb ${FATMOUNT} 2587b7dbfa9SEmmanuel Vadot 25943e289dfSEmmanuel Vadot chroot ${CHROOTDIR} touch ${UFSMOUNT}/firstboot 26043e289dfSEmmanuel Vadot sync 26143e289dfSEmmanuel Vadot umount_loop ${CHROOTDIR}/${FATMOUNT} 26243e289dfSEmmanuel Vadot umount_loop ${CHROOTDIR}/${UFSMOUNT} 26343e289dfSEmmanuel Vadot chroot ${CHROOTDIR} rmdir ${FATMOUNT} 26443e289dfSEmmanuel Vadot chroot ${CHROOTDIR} rmdir ${UFSMOUNT} 26543e289dfSEmmanuel Vadot} 26643e289dfSEmmanuel Vadot 2674ad8b75dSGlen Barberarm_install_uboot() { 2684ad8b75dSGlen Barber # Override in the arm/KERNEL.conf file. 2694ad8b75dSGlen Barber 2704ad8b75dSGlen Barber return 0 2714ad8b75dSGlen Barber} 2729848333bSEmmanuel Vadot 2739848333bSEmmanuel Vadotarm_do_quirk() { 2749848333bSEmmanuel Vadot # Override in the arm{,64}/BOARD.conf file. 2759848333bSEmmanuel Vadot} 276