xref: /minix/releasetools/arm_sdimage.sh (revision eb1e5bf0)
15acaa081SBen Gras#!/bin/bash
25acaa081SBen Grasset -e
38a3677deSKees Jongenburger#set -x
4149ed6cfSKees Jongenburger
5*eb1e5bf0SKees Jongenburger#
6*eb1e5bf0SKees Jongenburger# Source settings if present
7*eb1e5bf0SKees Jongenburger#
8*eb1e5bf0SKees Jongenburgerif [ -e .settings ]
9*eb1e5bf0SKees Jongenburgerthen
10*eb1e5bf0SKees Jongenburger	echo "Sourcing settings from .settings"
11*eb1e5bf0SKees Jongenburger	# Display the content (so we can check in the build logs
12*eb1e5bf0SKees Jongenburger	# what the settings contain.
13*eb1e5bf0SKees Jongenburger	cat .settings | sed "s,^,CONTENT ,g"
14*eb1e5bf0SKees Jongenburger 	. .settings
15*eb1e5bf0SKees Jongenburgerfi
16*eb1e5bf0SKees Jongenburger
175acaa081SBen Gras: ${ARCH=evbearm-el}
18149ed6cfSKees Jongenburger: ${OBJ=../obj.${ARCH}}
195acaa081SBen Gras: ${CROSS_TOOLS=${OBJ}/"tooldir.`uname -s`-`uname -r`-`uname -m`"/bin}
205acaa081SBen Gras: ${CROSS_PREFIX=${CROSS_TOOLS}/arm-elf32-minix-}
21881ff3f6SLionel Sambuc: ${JOBS=1}
225acaa081SBen Gras: ${DESTDIR=${OBJ}/destdir.$ARCH}
235180c3cfSLionel Sambuc: ${FSTAB=${DESTDIR}/etc/fstab}
24881ff3f6SLionel Sambuc: ${BUILDVARS=}
25881ff3f6SLionel Sambuc: ${BUILDSH=build.sh}
26881ff3f6SLionel Sambuc
278a3677deSKees Jongenburger#
288a3677deSKees Jongenburger# Directory where to store temporary file system images
298a3677deSKees Jongenburger#
308a3677deSKees Jongenburger: ${IMG_DIR=${OBJ}/img}
315acaa081SBen Gras: ${IMG=minix_arm_sd.img}
328a3677deSKees Jongenburger: ${MLO=MLO}
338a3677deSKees Jongenburger: ${UBOOT=u-boot.img}
345e5ea947SKees Jongenburger
355e5ea947SKees Jongenburger
365e5ea947SKees Jongenburger# beagleboard-xm
376364989eSKees Jongenburger: ${BASE_URL=http://www.minix3.org/arm/beagleboard-xm}
385e5ea947SKees Jongenburger: ${FLAG=-DDM37XX}
395e5ea947SKees Jongenburger: ${CONSOLE=tty02}
405e5ea947SKees Jongenburger
415e5ea947SKees Jongenburger
425e5ea947SKees Jongenburger#beaglebone (and black)
436364989eSKees Jongenburger#: ${BASE_URL=http://www.minix3.org/arm/beaglebone}
445e5ea947SKees Jongenburger#: ${FLAG=-DAM335X}
455e5ea947SKees Jongenburger#: ${CONSOLE=tty00}
465acaa081SBen Gras
475180c3cfSLionel Sambucif [ ! -f ${BUILDSH} ]
485180c3cfSLionel Sambucthen	echo "Please invoke me from the root source dir, where ${BUILDSH} is."
495acaa081SBen Gras	exit 1
505acaa081SBen Grasfi
515acaa081SBen Gras
524ab5b32eSKees Jongenburgerexport PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:$PATH
534ab5b32eSKees Jongenburger
548a3677deSKees Jongenburgerfor needed in sfdisk mcopy dd wget mkfs.vfat
558a3677deSKees Jongenburgerdo
568a3677deSKees Jongenburger	if ! which $needed 2>&1 > /dev/null
578a3677deSKees Jongenburger	then
588a3677deSKees Jongenburger		echo "**Skipping image creation: missing tool '$needed'"
598a3677deSKees Jongenburger		exit 1
608a3677deSKees Jongenburger	fi
618a3677deSKees Jongenburgerdone
628a3677deSKees Jongenburger
638a3677deSKees Jongenburger#
648a3677deSKees Jongenburger# Artifacts from this script are stored in the IMG_DIR
658a3677deSKees Jongenburger#
668a3677deSKees Jongenburgermkdir -p $IMG_DIR
678a3677deSKees Jongenburger
688a3677deSKees Jongenburger#
698a3677deSKees Jongenburger# Download the stage 1 bootloader  and u-boot
708a3677deSKees Jongenburger#
718a3677deSKees Jongenburgerfor i in ${MLO} ${UBOOT}
728a3677deSKees Jongenburgerdo
738a3677deSKees Jongenburger	if [ ! -f ${IMG_DIR}/${i} ]
748a3677deSKees Jongenburger	then
756364989eSKees Jongenburger		if ! wget -O ${IMG_DIR}/$i ${BASE_URL}/$i
768a3677deSKees Jongenburger		then
778a3677deSKees Jongenburger			echo "Failed to download $i"
788a3677deSKees Jongenburger			rm -f ${IMG_DIR}/$i
798a3677deSKees Jongenburger			exit 1
805acaa081SBen Gras		fi
815acaa081SBen Gras
825acaa081SBen Gras	fi
838a3677deSKees Jongenburgerdone
845acaa081SBen Gras
858a3677deSKees Jongenburger#
868a3677deSKees Jongenburger# Call build.sh using a sloppy file list so we don't need to remove the installed /etc/fstag
878a3677deSKees Jongenburger#
885e5ea947SKees Jongenburgerexport CPPFLAGS=${FLAG}
89881ff3f6SLionel Sambucsh ${BUILDSH} -V SLOPPY_FLIST=yes -V MKBINUTILS=yes -V MKGCCCMDS=yes -j ${JOBS} -m ${ARCH} -O ${OBJ} -D ${DESTDIR} ${BUILDVARS} -U -u distribution
905acaa081SBen Gras
918a3677deSKees Jongenburger#
928a3677deSKees Jongenburger# This script creates a bootable image and should at some point in the future
938a3677deSKees Jongenburger# be replaced by makefs.
948a3677deSKees Jongenburger#
958a3677deSKees Jongenburger# All sized are written in 512 byte blocks
968a3677deSKees Jongenburger#
978a3677deSKees Jongenburger# we create a disk image of about 2 gig's
988a3677deSKees Jongenburger#
998a3677deSKees Jongenburger# The size of the extended partition where we store
1008a3677deSKees Jongenburger# /root /home and /usr in separate sub partitions is
1018a3677deSKees Jongenburger# about 1 gig
1028a3677deSKees Jongenburger#
103881ff3f6SLionel Sambuc: ${IMG_SIZE=$((2**31 / 512))}
104881ff3f6SLionel Sambuc: ${FAT_SIZE=$((20480))}
105881ff3f6SLionel Sambuc: ${EXTENDED_SIZE=$((2**30 / 512))}
106881ff3f6SLionel Sambuc: ${ROOT_SIZE=$((2**26 / 512))}
107881ff3f6SLionel Sambuc: ${HOME_SIZE=$((2**27 / 512))}
108881ff3f6SLionel Sambuc: ${USR_SIZE=$((2**29 / 512))}
1095acaa081SBen Gras
1108a3677deSKees Jongenburger#
1118a3677deSKees Jongenburger# create a fstab entry in /etc this is normally done during the
1128a3677deSKees Jongenburger# setup phase on x86
1138a3677deSKees Jongenburger#
1145180c3cfSLionel Sambuccat >${FSTAB} <<END_FSTAB
1155acaa081SBen Gras/dev/c0d0p1s0   /       mfs     rw                      0       1
1165acaa081SBen Gras/dev/c0d0p1s1   /home   mfs     rw                      0       2
1178a3677deSKees Jongenburger/dev/c0d0p1s2   /usr    mfs     rw                      0       2
1185acaa081SBen GrasEND_FSTAB
1195acaa081SBen Gras
1205180c3cfSLionel Sambucrm -f ${DESTDIR}/SETS.*
1215acaa081SBen Gras
1225180c3cfSLionel Sambuc${CROSS_TOOLS}/nbpwd_mkdb -V 0 -p -d ${DESTDIR} ${DESTDIR}/etc/master.passwd
1235acaa081SBen Gras
12499c52474SKees Jongenburger#
1258a3677deSKees Jongenburger# Now given the sizes above use DD to create separate files representing
1268a3677deSKees Jongenburger# the partitions we are going to use.
12799c52474SKees Jongenburger#
1287e2c8b51SKees Jongenburgerdd if=/dev/zero of=${IMG_DIR}/fat.img bs=512 count=1 seek=$(($FAT_SIZE -1)) 2>/dev/null
1297e2c8b51SKees Jongenburgerdd if=/dev/zero of=${IMG_DIR}/root.img bs=512 count=1 seek=$(($ROOT_SIZE -1)) 2>/dev/null
1307e2c8b51SKees Jongenburgerdd if=/dev/zero of=${IMG_DIR}/home.img bs=512 count=1 seek=$(($HOME_SIZE -1)) 2>/dev/null
1317e2c8b51SKees Jongenburgerdd if=/dev/zero of=${IMG_DIR}/usr.img bs=512 count=1 seek=$(($USR_SIZE -1)) 2>/dev/null
1325acaa081SBen Gras
1338a3677deSKees Jongenburger#
1348a3677deSKees Jongenburger# Create the empty image where we later will but the partitions in
1358a3677deSKees Jongenburger#
1368a3677deSKees Jongenburgerdd if=/dev/zero of=${IMG} bs=512 count=1 seek=$(($IMG_SIZE -1))
1375acaa081SBen Gras
1388a3677deSKees Jongenburger#
1398a3677deSKees Jongenburger# Do some math to determine the start addresses of the partitions.
1408a3677deSKees Jongenburger#
1418a3677deSKees JongenburgerFAT_START=2048
1428a3677deSKees JongenburgerEXTENDED_START=$(($FAT_START + $FAT_SIZE))
1438a3677deSKees JongenburgerEXTENDED_SIZE=$(($ROOT_SIZE + $HOME_SIZE + $USR_SIZE + 3))
1448a3677deSKees JongenburgerROOT_START=$(($EXTENDED_START + 1))
1458a3677deSKees JongenburgerHOME_START=$(($ROOT_START + $ROOT_SIZE + 1))
1468a3677deSKees JongenburgerUSR_START=$(($HOME_START + $HOME_SIZE + 1))
1475acaa081SBen Gras
1488a3677deSKees Jongenburger#
1498a3677deSKees Jongenburger# Generate the partitions using sfdisk to partition the
1508a3677deSKees Jongenburger#
1517e2c8b51SKees Jongenburgersfdisk --no-reread -q ${IMG} 1>/dev/null <<END_SFDISK
1528a3677deSKees Jongenburger# partition table of test.img
1538a3677deSKees Jongenburgerunit: sectors
1545acaa081SBen Gras
1558a3677deSKees Jongenburgertest.img1 : start=     $FAT_START, size=    $FAT_SIZE, Id= c, bootable
1568a3677deSKees Jongenburgertest.img2 : start=    $EXTENDED_START, size=  $EXTENDED_SIZE, Id= 5
1578a3677deSKees Jongenburgertest.img3 : start=        0, size=        0, Id= 0
1588a3677deSKees Jongenburgertest.img4 : start=        0, size=        0, Id= 0
1598a3677deSKees Jongenburgertest.img5 : start=    $ROOT_START, size=   $ROOT_SIZE, Id=81
1608a3677deSKees Jongenburgertest.img6 : start=   $HOME_START, size=   $HOME_SIZE, Id=81
1618a3677deSKees Jongenburgertest.img7 : start=   $USR_START, size=   $USR_SIZE, Id=81
1628a3677deSKees JongenburgerEND_SFDISK
1635acaa081SBen Gras
1648a3677deSKees Jongenburger#
1658a3677deSKees Jongenburger# Format the fat partition and put the bootloaders
1668a3677deSKees Jongenburger# uEnv and the kernel command line in the FAT partition
1678a3677deSKees Jongenburger#
1688a3677deSKees Jongenburgermkfs.vfat ${IMG_DIR}/fat.img
1695180c3cfSLionel Sambuc
170167c4d97SKees Jongenburger#
171167c4d97SKees Jongenburger# Create a uEnv.txt file
172167c4d97SKees Jongenburger# -n default to network boot
173167c4d97SKees Jongenburger# -p add a prefix to the network booted files (e.g. xm/"
174ad68d15eSKees Jongenburger./releasetools/gen_uEnv.txt.sh > ${IMG_DIR}/uEnv.txt
175167c4d97SKees Jongenburger
176167c4d97SKees Jongenburger#
1775e5ea947SKees Jongenburger# Generate the MINIX command line
178167c4d97SKees Jongenburger#
179167c4d97SKees Jongenburger# options:
180167c4d97SKees Jongenburger# -c set console e.g. tty02 or tty00
1815e5ea947SKees Jongenburger# -v set verbosity e.g. 0 to 3
1825e5ea947SKees Jongenburger./releasetools/gen_cmdline.txt.sh -c ${CONSOLE} > ${IMG_DIR}/cmdline.txt
183167c4d97SKees Jongenburger
1848a3677deSKees Jongenburgerecho "Copying configuration kernel and boot modules"
1858a3677deSKees Jongenburgermcopy -bsp -i ${IMG_DIR}/fat.img  ${IMG_DIR}/$MLO ::MLO
1868a3677deSKees Jongenburgermcopy -bsp -i ${IMG_DIR}/fat.img ${IMG_DIR}/$UBOOT ::u-boot.img
187ad68d15eSKees Jongenburgermcopy -bsp -i ${IMG_DIR}/fat.img ${IMG_DIR}/uEnv.txt ::uEnv.txt
188167c4d97SKees Jongenburgermcopy -bsp -i ${IMG_DIR}/fat.img ${IMG_DIR}/cmdline.txt ::cmdline.txt
1895180c3cfSLionel Sambuc
1900aeb7d85SKees Jongenburger#
1910aeb7d85SKees Jongenburger# For tftp booting
1920aeb7d85SKees Jongenburger#
193ad68d15eSKees Jongenburgercp ${IMG_DIR}/uEnv.txt ${OBJ}/
194167c4d97SKees Jongenburgercp ${IMG_DIR}/cmdline.txt ${OBJ}/
1950aeb7d85SKees Jongenburger
1968a3677deSKees Jongenburger#
1978a3677deSKees Jongenburger# Do some last processing of the kernel and servers before also putting
1988a3677deSKees Jongenburger# them on the FAT
1998a3677deSKees Jongenburger#
2005acaa081SBen Gras${CROSS_PREFIX}objcopy ${OBJ}/kernel/kernel -O binary ${OBJ}/kernel.bin
2018a3677deSKees Jongenburger
2028a3677deSKees Jongenburgermcopy -bsp -i ${IMG_DIR}/fat.img ${OBJ}/kernel.bin ::kernel.bin
2035acaa081SBen Gras
2045acaa081SBen Grasfor f in vm rs pm sched vfs ds mfs pfs init
2055acaa081SBen Grasdo
2065180c3cfSLionel Sambuc    cp ${OBJ}/servers/${f}/${f} ${OBJ}/${f}.elf
2075180c3cfSLionel Sambuc    ${CROSS_PREFIX}strip -s ${OBJ}/${f}.elf
2088a3677deSKees Jongenburger    mcopy -bsp -i ${IMG_DIR}/fat.img  ${OBJ}/${f}.elf ::${f}.elf
2095acaa081SBen Grasdone
2105acaa081SBen Gras
2115acaa081SBen Grasfor f in tty memory log
2125acaa081SBen Grasdo
2135180c3cfSLionel Sambuc    cp ${OBJ}/drivers/${f}/${f} ${OBJ}/${f}.elf
2145180c3cfSLionel Sambuc    ${CROSS_PREFIX}strip -s ${OBJ}/${f}.elf
2158a3677deSKees Jongenburger    mcopy -bsp -i ${IMG_DIR}/fat.img  ${OBJ}/${f}.elf ::${f}.elf
2165acaa081SBen Grasdone
2175acaa081SBen Gras
2188a3677deSKees Jongenburger#
2198a3677deSKees Jongenburger# make the different file system. this part is *also* hacky. We first convert
2208a3677deSKees Jongenburger# the METALOG.sanitised using mtree into a input METALOG containing uids and
2218a3677deSKees Jongenburger# gids.
2228a3677deSKees Jongenburger# Afther that we do some magic processing to add device nodes (also missing from METALOG)
2238a3677deSKees Jongenburger# and convert the METALOG into a proto file that can be used by mkfs.mfs
2248a3677deSKees Jongenburger#
2258a3677deSKees Jongenburgerecho "creating the file systems"
2268a3677deSKees Jongenburger
2278a3677deSKees Jongenburger#
2288a3677deSKees Jongenburger# read METALOG and use mtree to conver the user and group names into uid and gids
2298a3677deSKees Jongenburger# FIX put "input somwhere clean"
2308a3677deSKees Jongenburger#
2318a3677deSKees Jongenburgercat ${DESTDIR}/METALOG.sanitised | ${CROSS_TOOLS}/nbmtree -N ${DESTDIR}/etc -C > ${IMG_DIR}/input
2328a3677deSKees Jongenburger
2338a3677deSKees Jongenburger# add fstab
2348a3677deSKees Jongenburgerecho "./etc/fstab type=file uid=0 gid=0 mode=0755 size=747 time=1365060731.000000000" >> ${IMG_DIR}/input
2358a3677deSKees Jongenburger
2368a3677deSKees Jongenburger# fill root.img (skipping /usr entries while keeping the /usr directory)
2378a3677deSKees Jongenburgercat ${IMG_DIR}/input  | grep -v "^./usr/" | ${CROSS_TOOLS}/nbtoproto -b ${DESTDIR} -o ${IMG_DIR}/root.in
238881ff3f6SLionel Sambuc
2398a3677deSKees Jongenburger#
2408a3677deSKees Jongenburger# add device nodes somewhere in the middle of the proto file. Better would be to add the entries in the
2418a3677deSKees Jongenburger# original METALOG
2428a3677deSKees Jongenburger# grab the first part
2438a3677deSKees Jongenburgergrep -B 10000 "^ dev"  ${IMG_DIR}/root.in >  ${IMG_DIR}/root.proto
2448a3677deSKees Jongenburger# add the device nodes from the ramdisk
2458a3677deSKees Jongenburgercat  ${OBJ}/drivers/ramdisk/proto.dev >> ${IMG_DIR}/root.proto
2468a3677deSKees Jongenburger# and add the rest of the file
2478a3677deSKees Jongenburgergrep -A 10000 "^ dev"  ${IMG_DIR}/root.in | tail -n +2    >>  ${IMG_DIR}/root.proto
2488a3677deSKees Jongenburgerrm ${IMG_DIR}/root.in
2498a3677deSKees Jongenburger
2508a3677deSKees Jongenburger#
2518a3677deSKees Jongenburger# Create proto files for /usr and /home using toproto.
2528a3677deSKees Jongenburger#
2538a3677deSKees Jongenburgercat ${IMG_DIR}/input  | grep  "^\./usr/\|^. "  | sed "s,\./usr,\.,g" | ${CROSS_TOOLS}/nbtoproto -b ${DESTDIR}/usr -o ${IMG_DIR}/usr.proto
2548a3677deSKees Jongenburgercat ${IMG_DIR}/input  | grep  "^\./home/\|^. "  | sed "s,\./home,\.,g" | ${CROSS_TOOLS}/nbtoproto -b ${DESTDIR}/home -o ${IMG_DIR}/home.proto
2558a3677deSKees Jongenburger
2568a3677deSKees Jongenburger#
257881ff3f6SLionel Sambuc# Generate /root, /usr and /home partition images.
258881ff3f6SLionel Sambuc#
259881ff3f6SLionel Sambuc${CROSS_TOOLS}/nbmkfs.mfs -b $((${ROOT_SIZE} / 8)) ${IMG_DIR}/root.img ${IMG_DIR}/root.proto
260881ff3f6SLionel Sambuc${CROSS_TOOLS}/nbmkfs.mfs -b $((${USR_SIZE} / 8))  ${IMG_DIR}/usr.img  ${IMG_DIR}/usr.proto
261881ff3f6SLionel Sambuc${CROSS_TOOLS}/nbmkfs.mfs -b $((${HOME_SIZE} / 8)) ${IMG_DIR}/home.img ${IMG_DIR}/home.proto
2628a3677deSKees Jongenburger
2638a3677deSKees Jongenburger#
2648a3677deSKees Jongenburger# Merge the partitions into a single image.
2658a3677deSKees Jongenburger#
2668a3677deSKees Jongenburgerecho "Merging file systems"
2678a3677deSKees Jongenburgerdd if=${IMG_DIR}/fat.img of=${IMG} seek=$FAT_START conv=notrunc
2688a3677deSKees Jongenburgerdd if=${IMG_DIR}/root.img of=${IMG} seek=$ROOT_START conv=notrunc
2698a3677deSKees Jongenburgerdd if=${IMG_DIR}/home.img of=${IMG} seek=$HOME_START conv=notrunc
2708a3677deSKees Jongenburgerdd if=${IMG_DIR}/usr.img of=${IMG} seek=$USR_START conv=notrunc
271