#!/bin/sh set -e # Change this export SRCROOT=/src/FreeBSD/head export MNTDIR=/mnt export MAKEOBJDIRPREFIX=/src/FreeBSD/obj export VCSRCROOT=/src/FreeBSD/vc export GPU_MEM=128 export IMG=/src/FreeBSD/obj/bsd-pi.img export TARGET_ARCH=armv6 export MAKESYSPATH=$SRCROOT/share/mk export KERNCONF=RPI-B KERNEL=`realpath $MAKEOBJDIRPREFIX`/arm.armv6/`realpath $SRCROOT`/sys/$KERNCONF/kernel UBLDR=`realpath $MAKEOBJDIRPREFIX`/arm.armv6/`realpath $SRCROOT`/sys/boot/arm/uboot/ubldr DTB=`realpath $MAKEOBJDIRPREFIX`/arm.armv6/`realpath $SRCROOT`/sys/$KERNCONF/bcm2835-rpi-b.dtb build_videocore() { mkdir -p $VCSRCROOT rm -Rf $VCSRCROOT/vchiq-freebsd rm -Rf $VCSRCROOT/userland git clone git://github.com/gonzoua/vchiq-freebsd.git $VCSRCROOT/vchiq-freebsd git clone git://github.com/gonzoua/userland.git $VCSRCROOT/userland eval $buildenv SYSDIR=$SRCROOT/sys make -C $VCSRCROOT/vchiq-freebsd clean eval $buildenv SYSDIR=$SRCROOT/sys make -C $VCSRCROOT/vchiq-freebsd mkdir -p $VCSRCROOT/userland/build/arm-freebsd/release/ cd $VCSRCROOT/userland/ git checkout freebsd cd $VCSRCROOT/userland/build/arm-freebsd/release/ eval $buildenv /usr/local/bin/cmake -DCMAKE_TOOLCHAIN_FILE=../../../makefiles/cmake/toolchains/arm-freebsd.cmake -DCMAKE_BUILD_TYPE=Release ../../.. cd - eval $buildenv make -C $VCSRCROOT/userland/build/arm-freebsd/release/ } install_videocore() { eval $buildenv SYSDIR=$SRCROOT/sys make -C $VCSRCROOT/vchiq-freebsd DESTDIR=$MNTDIR install eval $buildenv make -C $VCSRCROOT/userland/build/arm-freebsd/release/ DESTDIR=$MNTDIR install echo /opt/vc/lib > $MNTDIR/etc/ld-elf.so.conf # hello_triangle demo, not really necessary cd $VCSRCROOT/userland/host_applications/linux/apps/hello_pi/hello_triangle eval $buildenv SDKSTAGE=$MNTDIR /usr/local/bin/gmake cp hello_triangle.bin *.raw $MNTDIR/root/ } make -C $SRCROOT kernel-toolchain make -C $SRCROOT KERNCONF=$KERNCONF WITH_FDT=yes buildkernel make -C $SRCROOT MALLOC_PRODUCTION=yes buildworld buildenv=`make -C $SRCROOT buildenvvars` eval $buildenv make -C $SRCROOT/sys/boot clean eval $buildenv make -C $SRCROOT/sys/boot obj eval $buildenv make -C $SRCROOT/sys/boot UBLDR_LOADADDR=0x2000000 all build_videocore rm -f $IMG dd if=/dev/zero of=$IMG bs=128M count=8 MDFILE=`mdconfig -a -f $IMG` gpart create -s MBR ${MDFILE} # Boot partition gpart add -s 32m -t '!12' ${MDFILE} gpart set -a active -i 1 ${MDFILE} newfs_msdos -L boot -F 16 /dev/${MDFILE}s1 mount_msdosfs /dev/${MDFILE}s1 $MNTDIR fetch -q -o - http://people.freebsd.org/~gonzo/arm/rpi/freebsd-uboot-20121129.tar.gz | tar -x -v -z -C $MNTDIR -f - cat >> $MNTDIR/config.txt <<__EOC__ gpu_mem=$GPU_MEM device_tree=devtree.dat device_tree_address=0x100 disable_commandline_tags=1 __EOC__ cp $UBLDR $MNTDIR cp $DTB $MNTDIR/devtree.dat umount $MNTDIR # FreeBSD partition gpart add -t freebsd ${MDFILE} gpart create -s BSD ${MDFILE}s2 gpart add -t freebsd-ufs ${MDFILE}s2 newfs /dev/${MDFILE}s2a # Turn on Softupdates tunefs -n enable /dev/${MDFILE}s2a # Turn on SUJ with a minimally-sized journal. # This makes reboots tolerable if you just pull power on the BB # Note: A slow SDHC reads about 1MB/s, so a 30MB # journal can delay boot by 30s. tunefs -j enable -S 4194304 /dev/${MDFILE}s2a # Turn on NFSv4 ACLs tunefs -N enable /dev/${MDFILE}s2a mount /dev/${MDFILE}s2a $MNTDIR make -C $SRCROOT DESTDIR=$MNTDIR installkernel make -C $SRCROOT DESTDIR=$MNTDIR installworld make -C $SRCROOT DESTDIR=$MNTDIR distribution install_videocore echo 'fdt addr 0x100' > $MNTDIR/boot/loader.rc echo '/dev/mmcsd0s2a / ufs rw,noatime 1 1' > $MNTDIR/etc/fstab cat > $MNTDIR/etc/rc.conf <<__EORC__ hostname="raspberry-pi" ifconfig_ue0="DHCP" sshd_enable="YES" # Turn off a lot of standard stuff # for more free memory. cron_enable="NO" devd_enable="NO" syslogd_enable="NO" sendmail_submit_enable="NO" sendmail_outbound_enable="NO" sendmail_msp_queue_enable="NO" __EORC__ cat > $MNTDIR/etc/ttys <<__EOTTYS__ ttyv0 "/usr/libexec/getty Pc" xterm on secure ttyv1 "/usr/libexec/getty Pc" xterm on secure ttyv2 "/usr/libexec/getty Pc" xterm on secure ttyv3 "/usr/libexec/getty Pc" xterm on secure ttyv4 "/usr/libexec/getty Pc" xterm on secure ttyv5 "/usr/libexec/getty Pc" xterm on secure ttyv6 "/usr/libexec/getty Pc" xterm on secure ttyv7 "/usr/libexec/getty Pc" xterm on secure ttyu0 "/usr/libexec/getty 3wire.115200" dialup on secure __EOTTYS__ umount $MNTDIR mdconfig -d -u $MDFILE