#!/bin/sh SDDEV=${1:-da0} USBDEV=${2:-da4} EFIKA=${3:-smartbook} UID=$(id -u) SVN_URL="http://svn.freebsd.org/base/projects/efika_mx/" if [ ! -c /dev/${SDDEV} ]; then echo "/dev/${SDDEV} is not char device"; exit 1; fi if [ ! -c /dev/${USBDEV} ]; then echo "/dev/${USBDEV} is not char device"; exit 1; fi case ${EFIKA} in [Ss][Mm][Aa][Rr][Tt][Tt][Oo][Pp]) EFIKA="smarttop" UBOOT_URL="http://people.freebsd.org/~ray/u-boot_efika_mx_smarttop.imx" ;; [Ss][Mm][Aa][Rr][Tt][Bb][Oo][Oo][Kk]) EFIKA="smartbook" UBOOT_URL="http://people.freebsd.org/~ray/u-boot_efika_mx_smartbook.imx" ;; *) echo "Unknown target device, please use Smartbook or Smarttop" exit 1 ;; esac cat << EOF For begining we have to have: 1. Empty SD/MMC card, for example at /dev/da0 2. Empty USB flash stick at /dev/da4 both can be overriden with command line arguments You can select device names and target device by command line arguments: $0 [sdcarddev [usbflashdev [targetdevice]]] Using: SD/MMC card device: /dev/${SDDEV} USB Flash stick: /dev/${USBDEV} Target device: ${EFIKA} User ID: ${UID} ****************************************************************************** *** Please note, you must run script with root privileges, unless you *** *** chown/chmod devices and done something with SUID bit on installworld :)*** *** *** *** All work will be done in current dir, so take care about free space on *** *** that FS. Think free space must be at least 3GB (not sure). And please *** *** start in clean dir, so things I will create do not broke something *** *** yours :) *** ****************************************************************************** EOF echo "It's ok? (Enter 'yes' to start)" read START if [ "${START}" != "yes" ]; then exit 0; fi BINDIR=${PWD}/tmp TMPDIR=${PWD}/tmp SRCDIR=${PWD}/src OBJDIR=${PWD}/obj MOUNTDIR=${PWD}/rootfs FAT32DIR=${PWD}/fat32 TARGET=arm TARGET_ARCH=armv6 TARGET_CPUTYPE=armv6 KERNCONF=EFIKA_MX MAKEOBJDIRPREFIX=${OBJDIR} BUILD_FLAGS=-DNO_CLEAN export MAKEOBJDIRPREFIX export TARGET export TARGET_ARCH export TARGET_CPUTYPE mkdir -p ${BINDIR} mkdir -p ${TMPDIR} mkdir -p ${SRCDIR} mkdir -p ${OBJDIR} mkdir -p ${MOUNTDIR} mkdir -p ${FAT32DIR} echo "-> Stage 1, Prepare SD card and install IMX U-Boot image to it" echo "---> 1.1 download U-Boot image" UBOOT_IMG_NAME=${UBOOT_URL##*\/} fetch -o ${TMPDIR}/${UBOOT_IMG_NAME} ${UBOOT_URL} echo "---> 1.2 copy U-Boot image into SD card" dd if=${TMPDIR}/${UBOOT_IMG_NAME} of=/dev/${SDDEV} bs=1k oseek=1 conv=sync echo "-> Stage 2, Get/update project source tree" if [ -d ${SRCDIR}/efika_mx/.svn ]; then cd ${SRCDIR}/efika_mx/ svn update else cd ${SRCDIR}/ svn checkout ${SVN_URL} fi # Update SRCDIR SRCDIR="${SRCDIR}/efika_mx" KERNOBJDIR="${OBJDIR}/${TARGET}.${TARGET_ARCH}/${SRCDIR}/sys/${KERNCONF}" ### Build toolchain echo "-> Stage 3, Build toolchain" cd ${SRCDIR}/ echo make ${BUILD_FLAGS} toolchain make ${BUILD_FLAGS} toolchain || exit 1 ### Build kernel echo "-> Stage 4, Build kernel" cd ${SRCDIR}/ if [ ! -f sys/arm/conf/EFIKA_MX.before_mount_fix ]; then # Set ROOTFS to bsd partition 'a' on second slice of USB flash sed -i.before_mount_fix 's/ufs:ada0s2a/ufs:da0s2a/' sys/arm/conf/EFIKA_MX fi cd ${SRCDIR}/ echo make KERNCONF=${KERNCONF} ${BUILD_FLAGS} buildkernel make KERNCONF=${KERNCONF} ${BUILD_FLAGS} buildkernel || exit 1 ### Preparing Flash echo "-> Stage 5, Preparing USB flash" /sbin/gpart destroy -F ${USBDEV} || true /sbin/gpart create -s MBR ${USBDEV} || exit 1 /sbin/gpart add -t fat32 -s 512M ${USBDEV} || exit 1 /sbin/gpart add -t freebsd ${USBDEV} || exit 1 /sbin/gpart destroy -F ${USBDEV}s2 || true /sbin/gpart create -s BSD ${USBDEV}s2 || exit 1 /sbin/gpart add -t freebsd-swap -i2 -s 1G ${USBDEV}s2 || exit 1 /sbin/gpart add -t freebsd-ufs -i1 ${USBDEV}s2 || exit 1 /sbin/gpart list ${USBDEV}s2 /sbin/gpart list ${USBDEV} echo " 5.1, Create Filesystems" echo /sbin/newfs_msdos /dev/${USBDEV}s1 || exit 1 /sbin/newfs_msdos /dev/${USBDEV}s1 || exit 1 echo /sbin/newfs /dev/${USBDEV}s2a || exit 1 /sbin/newfs /dev/${USBDEV}s2a || exit 1 echo " 5.2, Making U-Boot kernel image" if [ ! -x ${BINDIR}/uboot_mkimage ] ; then echo " Install uboot_mkimage tool" fetch -o- http://people.freebsd.org/~ray/u-boot.new.tar.gz | \ tar xvzf - -C ${TMPDIR} echo cd ${TMPDIR}/u-boot.new cd ${TMPDIR}/u-boot.new echo make make install -s ${TMPDIR}/u-boot.new/work/u-boot-2010.12/tools/mkimage \ ${BINDIR}/uboot_mkimage fi /sbin/mount -t msdosfs /dev/${USBDEV}s1 ${FAT32DIR} uboot_mkimage -A ARM -O Linux -T kernel -C none -a 0x90100000 -e 0x90100100 \ -n "FreeBSD kernel" -d "${KERNOBJDIR}/kernel" "${FAT32DIR}/kernel.uboot" sync && sync && sync /sbin/umount -f /dev/${USBDEV}s1 # Building world echo "-> Stage 6, Building world" cd ${SRCDIR}/ echo make KERNCONF=${KERNCONF} ${BUILD_FLAGS} buildworld || exit 1 make KERNCONF=${KERNCONF} ${BUILD_FLAGS} buildworld || exit 1 ### Install echo "-> Stage 7, Install Everything" /sbin/mount -t ufs /dev/${USBDEV}s2a ${MOUNTDIR} cd ${SRCDIR}/ echo make DESTDIR=${MOUNTDIR} KERNCONF=${KERNCONF} ${BUILD_FLAGS} installkernel make DESTDIR=${MOUNTDIR} KERNCONF=${KERNCONF} ${BUILD_FLAGS} installkernel || exit 1 echo make DESTDIR=${MOUNTDIR} ${BUILD_FLAGS} installworld make DESTDIR=${MOUNTDIR} ${BUILD_FLAGS} installworld || exit 1 echo make DESTDIR=${MOUNTDIR} ${BUILD_FLAGS} distribution make DESTDIR=${MOUNTDIR} ${BUILD_FLAGS} distribution || exit 1 ### Update /etc settings echo "Update /etc settings" # Enable virtual terminals sed -i.orig -E 's#^(ttyv.[[:space:]]+"/usr/libexec/getty[[:space:]]+Pc"[[:space:]]+xterm[[:space:]]+)off([[:space:]]+secure)#\1on\2#' ${MOUNTDIR}/etc/ttys # Make fstab cat << EOF > ${MOUNTDIR}/etc/fstab /dev/da0s2a / ufs ro 0 0 /dev/da0s2b none swap sw 0 0 tmpfs /tmp tmpfs rw 0 0 tmpfs /var tmpfs rw 0 0 devfs /dev devfs rw 0 0 EOF # Define some config cat << EOF > ${MOUNTDIR}/etc/rc.conf watchdogd_enable="YES" watchdogd_flags="-t 45" hostname="efika_mx" ifconfig_ue0="DHCP" inetd_enable="YES" sshd_enable="YES" sendmail_enable="NONE" EOF sync && sync && sync /sbin/umount -f /dev/${USBDEV}s2a cat << EOF Now set DIP switch to: For Smarttop Off|Off|Off|Off For Smartbook Off|Off|Off|On when you would want to switch back, set it to On|On|On|Off (for both) Insert SD card and USB Flash stick Power up device Wait while U-Boot initialize screen and other device. Now run: usb reset fatload usb 0 0x91000000 kernel.uboot bootm 0x91000000 After that, U-Boot start kernel. Wait few seconds and "WoW! FreeBSD here! in my Efika MX Smartbook" :) EOF exit 0