Add partition flags to ARM host image script

This allows the user to specify what partitions
are generated by the script.  This is useful if,
for example, the U-Boot partitions are needed
but the rootfs is not needed.

BUG: 141692755
Test: local build and run on rock pi 4b
Change-Id: I07e404f4c79731e97800cf884864619215a31866
diff --git a/tools/create_base_image_arm.sh b/tools/create_base_image_arm.sh
index 76afda0..bae7a04 100755
--- a/tools/create_base_image_arm.sh
+++ b/tools/create_base_image_arm.sh
@@ -16,11 +16,34 @@
 
 source "${ANDROID_BUILD_TOP}/external/shflags/src/shflags"
 
-FLAGS_HELP="USAGE: $0 <KERNEL_DIR> [IMAGE]"
+DEFINE_boolean p1 \
+	false "Only generate/write the 1st partition (loader1)" "1"
+DEFINE_boolean p2 \
+	false "Only generate/write the 2nd partition (env)" "2"
+DEFINE_boolean p3 \
+	false "Only generate/write the 3rd partition (loader2)" "3"
+DEFINE_boolean p4 \
+	false "Only generate/write the 4th partition (trust)" "4"
+DEFINE_boolean p5 \
+	false "Only generate/write the 5th partition (rootfs)" "5"
+
+FLAGS_HELP="USAGE: $0 <KERNEL_DIR> [IMAGE] [flags]"
 
 FLAGS "$@" || exit $?
 eval set -- "${FLAGS_ARGV}"
 
+if [ ${FLAGS_p1} -eq ${FLAGS_FALSE} ] &&
+   [ ${FLAGS_p2} -eq ${FLAGS_FALSE} ] &&
+   [ ${FLAGS_p3} -eq ${FLAGS_FALSE} ] &&
+   [ ${FLAGS_p4} -eq ${FLAGS_FALSE} ] &&
+   [ ${FLAGS_p5} -eq ${FLAGS_FALSE} ]; then
+	FLAGS_p1=${FLAGS_TRUE}
+	FLAGS_p2=${FLAGS_TRUE}
+	FLAGS_p3=${FLAGS_TRUE}
+	FLAGS_p4=${FLAGS_TRUE}
+	FLAGS_p5=${FLAGS_TRUE}
+fi
+
 for arg in "$@" ; do
 	if [ -z $KERNEL_DIR ]; then
 		KERNEL_DIR=$arg
@@ -91,16 +114,19 @@
 	echo "Detected device at /dev/${mmc_dev}"
 fi
 
-cd ${ANDROID_BUILD_TOP}/external/arm-trusted-firmware
-CROSS_COMPILE=aarch64-linux-gnu- make PLAT=rk3399 DEBUG=0 ERROR_DEPRECATED=1 bl31
-export BL31="${ANDROID_BUILD_TOP}/external/arm-trusted-firmware/build/rk3399/release/bl31/bl31.elf"
-cd -
+if [ ${FLAGS_p1} -eq ${FLAGS_TRUE} ]; then
+	cd ${ANDROID_BUILD_TOP}/external/arm-trusted-firmware
+	CROSS_COMPILE=aarch64-linux-gnu- make PLAT=rk3399 DEBUG=0 ERROR_DEPRECATED=1 bl31
+	export BL31="${ANDROID_BUILD_TOP}/external/arm-trusted-firmware/build/rk3399/release/bl31/bl31.elf"
+	cd -
+fi
 
 cd ${ANDROID_BUILD_TOP}/external/u-boot
 
-tmpfile=`mktemp`
-bootenv=`mktemp`
-cat > ${tmpfile} << "EOF"
+if [ ${FLAGS_p2} -eq ${FLAGS_TRUE} ]; then
+	tmpfile=`mktemp`
+	bootenv=`mktemp`
+	cat > ${tmpfile} << "EOF"
 bootdelay=2
 baudrate=1500000
 scriptaddr=0x00500000
@@ -114,32 +140,43 @@
 find_init_script=if test -e mmc ${devnum}:${part} /boot/init.scr; then echo Found U-Boot script /boot/init.scr; run init_scr; fi
 init_scr=load mmc ${devnum}:${part} ${scriptaddr} /boot/init.scr; source ${scriptaddr}
 EOF
-${ANDROID_HOST_OUT}/bin/mkenvimage -s 32768 -o ${bootenv} - < ${tmpfile}
+	${ANDROID_HOST_OUT}/bin/mkenvimage -s 32768 -o ${bootenv} - < ${tmpfile}
+fi
 
-idbloader=`mktemp`
-make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- rock-pi-4-rk3399_defconfig
-make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- -j`nproc`
-${ANDROID_HOST_OUT}/bin/mkimage -n rk3399 -T rksd -d tpl/u-boot-tpl.bin ${idbloader}
-cat spl/u-boot-spl.bin >> ${idbloader}
+if [ ${FLAGS_p1} -eq ${FLAGS_TRUE} ] || [ ${FLAGS_p3} -eq ${FLAGS_TRUE} ]; then
+	make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- rock-pi-4-rk3399_defconfig
+	if [ ${FLAGS_p1} -eq ${FLAGS_TRUE} ]; then
+		make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- -j`nproc`
+	fi
+	if [ ${FLAGS_p3} -eq ${FLAGS_TRUE} ]; then
+		make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- u-boot.itb
+	fi
+	if [ ${FLAGS_p1} -eq ${FLAGS_TRUE} ]; then
+		idbloader=`mktemp`
+		${ANDROID_HOST_OUT}/bin/mkimage -n rk3399 -T rksd -d tpl/u-boot-tpl.bin ${idbloader}
+		cat spl/u-boot-spl.bin >> ${idbloader}
+	fi
+fi
 cd -
 
-${ANDROID_BUILD_TOP}/kernel/tests/net/test/build_rootfs.sh -a arm64 -s buster -n ${IMAGE}
-if [ $? -ne 0 ]; then
-	echo "error: failed to build rootfs. exiting..."
-	exit 1
-fi
-truncate -s +3G ${IMAGE}
-e2fsck -f ${IMAGE}
-resize2fs ${IMAGE}
+if [ ${FLAGS_p5} -eq ${FLAGS_TRUE} ]; then
+	${ANDROID_BUILD_TOP}/kernel/tests/net/test/build_rootfs.sh -a arm64 -s buster -n ${IMAGE}
+	if [ $? -ne 0 ]; then
+		echo "error: failed to build rootfs. exiting..."
+		exit 1
+	fi
+	truncate -s +3G ${IMAGE}
+	e2fsck -f ${IMAGE}
+	resize2fs ${IMAGE}
 
-mntdir=`mktemp -d`
-mount ${IMAGE} ${mntdir}
-if [ $? != 0 ]; then
-	echo "error: unable to mount ${IMAGE} ${mntdir}"
-	exit 1
-fi
+	mntdir=`mktemp -d`
+	mount ${IMAGE} ${mntdir}
+	if [ $? != 0 ]; then
+		echo "error: unable to mount ${IMAGE} ${mntdir}"
+		exit 1
+	fi
 
-cat > ${mntdir}/boot/init.cmd << "EOF"
+	cat > ${mntdir}/boot/init.cmd << "EOF"
 mmc dev 1 0; mmc read 0x02080000 0x1fc0 0x40;
 ethaddr=$ethaddr
 env default -a
@@ -150,10 +187,10 @@
 mmc dev 0 0; mmc write 0x04000000 0x1fc0 0x40;
 mmc dev 1 0; mmc write 0x02080000 0x1fc0 0x40;
 EOF
-${ANDROID_BUILD_TOP}/external/u-boot/tools/mkimage \
+	${ANDROID_BUILD_TOP}/external/u-boot/tools/mkimage \
 		-C none -A arm -T script -d ${mntdir}/boot/init.cmd ${mntdir}/boot/init.scr
 
-cat > ${mntdir}/boot/boot.cmd << "EOF"
+	cat > ${mntdir}/boot/boot.cmd << "EOF"
 load mmc ${devnum}:${distro_bootpart} 0x02080000 /boot/Image
 load mmc ${devnum}:${distro_bootpart} 0x04000000 /boot/uInitrd
 load mmc ${devnum}:${distro_bootpart} 0x01f00000 /boot/dtb/rockchip/rk3399-rock-pi-4.dtb
@@ -162,34 +199,34 @@
 setenv bootargs "earlycon=uart8250,mmio32,0xff1a0000 console=ttyS2,1500000n8 loglevel=7 root=PARTUUID=${uuid} rootwait rootfstype=ext4 sdhci.debug_quirks=0x20000000"
 booti 0x02080000 0x04000000 0x01f00000
 EOF
-${ANDROID_HOST_OUT}/bin/mkimage \
-	-C none -A arm -T script -d ${mntdir}/boot/boot.cmd ${mntdir}/boot/boot.scr
+	${ANDROID_HOST_OUT}/bin/mkimage \
+		-C none -A arm -T script -d ${mntdir}/boot/boot.cmd ${mntdir}/boot/boot.scr
 
-cd ${KERNEL_DIR}
-export PATH=${ANDROID_BUILD_TOP}/prebuilts/clang/host/linux-x86/clang-r353983c/bin:$PATH
-export PATH=${ANDROID_BUILD_TOP}/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin:$PATH
-make ARCH=arm64 CC=clang CROSS_COMPILE=aarch64-linux-androidkernel- \
-      CLANG_TRIPLE=aarch64-linux-gnu- rockpi4_defconfig
-make ARCH=arm64 CC=clang CROSS_COMPILE=aarch64-linux-androidkernel- \
-      CLANG_TRIPLE=aarch64-linux-gnu- -j`nproc`
+	cd ${KERNEL_DIR}
+	export PATH=${ANDROID_BUILD_TOP}/prebuilts/clang/host/linux-x86/clang-r353983c/bin:$PATH
+	export PATH=${ANDROID_BUILD_TOP}/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin:$PATH
+	make ARCH=arm64 CC=clang CROSS_COMPILE=aarch64-linux-androidkernel- \
+	      CLANG_TRIPLE=aarch64-linux-gnu- rockpi4_defconfig
+	make ARCH=arm64 CC=clang CROSS_COMPILE=aarch64-linux-androidkernel- \
+	      CLANG_TRIPLE=aarch64-linux-gnu- -j`nproc`
 
-cp ${KERNEL_DIR}/arch/arm64/boot/Image ${mntdir}/boot/
-mkdir -p ${mntdir}/boot/dtb/rockchip/
-cp ${KERNEL_DIR}/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtb ${mntdir}/boot/dtb/rockchip/
-cd -
+	cp ${KERNEL_DIR}/arch/arm64/boot/Image ${mntdir}/boot/
+	mkdir -p ${mntdir}/boot/dtb/rockchip/
+	cp ${KERNEL_DIR}/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtb ${mntdir}/boot/dtb/rockchip/
+	cd -
 
-mount -o bind /proc ${mntdir}/proc
-mount -o bind /sys ${mntdir}/sys
-mount -o bind /dev ${mntdir}/dev
+	mount -o bind /proc ${mntdir}/proc
+	mount -o bind /sys ${mntdir}/sys
+	mount -o bind /dev ${mntdir}/dev
 
-echo "Installing required packages..."
-chroot ${mntdir} /bin/bash <<EOF
+	echo "Installing required packages..."
+	chroot ${mntdir} /bin/bash <<EOF
 apt-get update
 apt-get install -y -f initramfs-tools u-boot-tools network-manager openssh-server sudo man-db vim git dpkg-dev cdbs debhelper config-package-dev gdisk eject lzop binfmt-support ntpdate
 EOF
 
-echo "Turning on DHCP client..."
-cat >${mntdir}/etc/systemd/network/dhcp.network <<EOF
+	echo "Turning on DHCP client..."
+	cat >${mntdir}/etc/systemd/network/dhcp.network <<EOF
 [Match]
 Name=en*
 
@@ -197,59 +234,59 @@
 DHCP=yes
 EOF
 
-chroot ${mntdir} /bin/bash << "EOT"
+	chroot ${mntdir} /bin/bash << "EOT"
 echo "Adding user vsoc-01 and groups..."
 useradd -m -G kvm,sudo -d /home/vsoc-01 --shell /bin/bash vsoc-01
 echo -e "cuttlefish\ncuttlefish" | passwd
 echo -e "cuttlefish\ncuttlefish" | passwd vsoc-01
 EOT
 
-echo "Cloning android-cuttlefish..."
-cd ${mntdir}/home/vsoc-01
-git clone https://github.com/google/android-cuttlefish.git
-cd -
+	echo "Cloning android-cuttlefish..."
+	cd ${mntdir}/home/vsoc-01
+	git clone https://github.com/google/android-cuttlefish.git
+	cd -
 
-echo "Creating led script..."
-cat > ${mntdir}/usr/local/bin/led << "EOF"
+	echo "Creating led script..."
+	cat > ${mntdir}/usr/local/bin/led << "EOF"
 #!/bin/bash
 
 if [ "$1" == "--start" ]; then
-  echo 125 > /sys/class/gpio/export
-  echo out > /sys/class/gpio/gpio125/direction
-  chmod 666 /sys/class/gpio/gpio125/value
-  echo 0 > /sys/class/gpio/gpio125/value
-  exit 0
+	echo 125 > /sys/class/gpio/export
+	echo out > /sys/class/gpio/gpio125/direction
+	chmod 666 /sys/class/gpio/gpio125/value
+	echo 0 > /sys/class/gpio/gpio125/value
+	exit 0
 fi
 
 if [ "$1" == "--stop" ]; then
-  echo 0 > /sys/class/gpio/gpio125/value
-  echo 125 > /sys/class/gpio/unexport
-  exit 0
+	echo 0 > /sys/class/gpio/gpio125/value
+	echo 125 > /sys/class/gpio/unexport
+	exit 0
 fi
 
 if [ ! -e /sys/class/gpio/gpio125/value ]; then
-  echo "error: led service not initialized"
-  exit 1
+	echo "error: led service not initialized"
+	exit 1
 fi
 
 if [ "$1" == "0" ] || [ "$1" == "off" ] || [ "$1" == "OFF" ]; then
-  echo 0 > /sys/class/gpio/gpio125/value
-  exit 0
+	echo 0 > /sys/class/gpio/gpio125/value
+	exit 0
 fi
 
 if [ "$1" == "1" ] || [ "$1" == "on" ] || [ "$1" == "ON" ]; then
-  echo 1 > /sys/class/gpio/gpio125/value
-  exit 0
+	echo 1 > /sys/class/gpio/gpio125/value
+	exit 0
 fi
 
 echo "usage: led <0|1>"
 exit 1
 EOF
-chown root:root ${mntdir}/usr/local/bin/led
-chmod 755 ${mntdir}/usr/local/bin/led
+	chown root:root ${mntdir}/usr/local/bin/led
+	chmod 755 ${mntdir}/usr/local/bin/led
 
-echo "Creating led service..."
-cat > ${mntdir}/etc/systemd/system/led.service << EOF
+	echo "Creating led service..."
+	cat > ${mntdir}/etc/systemd/system/led.service << EOF
 [Unit]
  Description=led service
  ConditionPathExists=/usr/local/bin/led
@@ -265,8 +302,8 @@
  WantedBy=multi-user.target
 EOF
 
-echo "Creating SD duplicator script..."
-cat > ${mntdir}/usr/local/bin/sd-dupe << "EOF"
+	echo "Creating SD duplicator script..."
+	cat > ${mntdir}/usr/local/bin/sd-dupe << "EOF"
 #!/bin/bash
 led 0
 
@@ -275,68 +312,68 @@
 part_num=p5
 
 if [ -e /dev/mmcblk0p5 ]; then
-  led 1
+	led 1
 
-  sgdisk -Z -a1 /dev/${dest_dev}
-  sgdisk -a1 -n:1:64:8127 -t:1:8301 -c:1:loader1 /dev/${dest_dev}
-  sgdisk -a1 -n:2:8128:8191 -t:2:8301 -c:2:env /dev/${dest_dev}
-  sgdisk -a1 -n:3:16384:24575 -t:3:8301 -c:3:loader2 /dev/${dest_dev}
-  sgdisk -a1 -n:4:24576:32767 -t:4:8301 -c:4:trust /dev/${dest_dev}
-  sgdisk -a1 -n:5:32768:- -A:5:set:2 -t:5:8305 -c:5:rootfs /dev/${dest_dev}
+	sgdisk -Z -a1 /dev/${dest_dev}
+	sgdisk -a1 -n:1:64:8127 -t:1:8301 -c:1:loader1 /dev/${dest_dev}
+	sgdisk -a1 -n:2:8128:8191 -t:2:8301 -c:2:env /dev/${dest_dev}
+	sgdisk -a1 -n:3:16384:24575 -t:3:8301 -c:3:loader2 /dev/${dest_dev}
+	sgdisk -a1 -n:4:24576:32767 -t:4:8301 -c:4:trust /dev/${dest_dev}
+	sgdisk -a1 -n:5:32768:- -A:5:set:2 -t:5:8305 -c:5:rootfs /dev/${dest_dev}
 
-  src_block_count=`tune2fs -l /dev/${src_dev}${part_num} | grep "Block count:" | sed 's/.*: *//'`
-  src_block_size=`tune2fs -l /dev/${src_dev}${part_num} | grep "Block size:" | sed 's/.*: *//'`
-  src_fs_size=$(( src_block_count*src_block_size ))
-  src_fs_size_m=$(( src_fs_size / 1024 / 1024 + 1 ))
+	src_block_count=`tune2fs -l /dev/${src_dev}${part_num} | grep "Block count:" | sed 's/.*: *//'`
+	src_block_size=`tune2fs -l /dev/${src_dev}${part_num} | grep "Block size:" | sed 's/.*: *//'`
+	src_fs_size=$(( src_block_count*src_block_size ))
+	src_fs_size_m=$(( src_fs_size / 1024 / 1024 + 1 ))
 
-  dd if=/dev/${src_dev}p1 of=/dev/${dest_dev}p1 conv=sync,noerror status=progress
-  dd if=/dev/${src_dev}p2 of=/dev/${dest_dev}p2 conv=sync,noerror status=progress
-  dd if=/dev/${src_dev}p3 of=/dev/${dest_dev}p3 conv=sync,noerror status=progress
-  dd if=/dev/${src_dev}p4 of=/dev/${dest_dev}p4 conv=sync,noerror status=progress
+	dd if=/dev/${src_dev}p1 of=/dev/${dest_dev}p1 conv=sync,noerror status=progress
+	dd if=/dev/${src_dev}p2 of=/dev/${dest_dev}p2 conv=sync,noerror status=progress
+	dd if=/dev/${src_dev}p3 of=/dev/${dest_dev}p3 conv=sync,noerror status=progress
+	dd if=/dev/${src_dev}p4 of=/dev/${dest_dev}p4 conv=sync,noerror status=progress
 
-  echo "Writing ${src_fs_size_m} MB: /dev/${src_dev} -> /dev/${dest_dev}..."
-  dd if=/dev/${src_dev}${part_num} of=/dev/${dest_dev}${part_num} bs=1M conv=sync,noerror status=progress
+	echo "Writing ${src_fs_size_m} MB: /dev/${src_dev} -> /dev/${dest_dev}..."
+	dd if=/dev/${src_dev}${part_num} of=/dev/${dest_dev}${part_num} bs=1M conv=sync,noerror status=progress
 
-  echo "Expanding /dev/${dest_dev}${part_num} filesystem..."
-  e2fsck -fy /dev/${dest_dev}${part_num}
-  resize2fs /dev/${dest_dev}${part_num}
-  tune2fs -O has_journal /dev/${dest_dev}${part_num}
-  e2fsck -fy /dev/${dest_dev}${part_num}
-  sync /dev/${dest_dev}
+	echo "Expanding /dev/${dest_dev}${part_num} filesystem..."
+	e2fsck -fy /dev/${dest_dev}${part_num}
+	resize2fs /dev/${dest_dev}${part_num}
+	tune2fs -O has_journal /dev/${dest_dev}${part_num}
+	e2fsck -fy /dev/${dest_dev}${part_num}
+	sync /dev/${dest_dev}
 
-  echo "Cleaning up..."
-  mount /dev/${dest_dev}${part_num} /media
-  chroot /media /usr/local/bin/install-cleanup
+	echo "Cleaning up..."
+	mount /dev/${dest_dev}${part_num} /media
+	chroot /media /usr/local/bin/install-cleanup
 
-  if [ $? == 0 ]; then
-    echo "Successfully copied Rock Pi image!"
-    while true; do
-      led 1; sleep 0.5
-      led 0; sleep 0.5
-    done
-  else
-    echo "Error while copying Rock Pi image"
-    while true; do
-      led 1; sleep 0.1
-      led 0; sleep 0.1
-    done
-  fi
+	if [ $? == 0 ]; then
+		echo "Successfully copied Rock Pi image!"
+		while true; do
+			led 1; sleep 0.5
+			led 0; sleep 0.5
+		done
+	else
+		echo "Error while copying Rock Pi image"
+		while true; do
+			led 1; sleep 0.1
+			led 0; sleep 0.1
+		done
+	fi
 else
-  echo "Expanding /dev/${dest_dev}${part_num} filesystem..."
-  e2fsck -fy /dev/${dest_dev}${part_num}
-  resize2fs /dev/${dest_dev}${part_num}
-  tune2fs -O has_journal /dev/${dest_dev}${part_num}
-  e2fsck -fy /dev/${dest_dev}${part_num}
-  sync /dev/${dest_dev}
+	echo "Expanding /dev/${dest_dev}${part_num} filesystem..."
+	e2fsck -fy /dev/${dest_dev}${part_num}
+	resize2fs /dev/${dest_dev}${part_num}
+	tune2fs -O has_journal /dev/${dest_dev}${part_num}
+	e2fsck -fy /dev/${dest_dev}${part_num}
+	sync /dev/${dest_dev}
 
-  echo "Cleaning up..."
-  /usr/local/bin/install-cleanup
+	echo "Cleaning up..."
+	/usr/local/bin/install-cleanup
 fi
 EOF
-chmod +x ${mntdir}/usr/local/bin/sd-dupe
+	chmod +x ${mntdir}/usr/local/bin/sd-dupe
 
-echo "Creating SD duplicator service..."
-cat > ${mntdir}/etc/systemd/system/sd-dupe.service << EOF
+	echo "Creating SD duplicator service..."
+	cat > ${mntdir}/etc/systemd/system/sd-dupe.service << EOF
 [Unit]
  Description=Duplicate SD card rootfs to eMMC on Rock Pi
  ConditionPathExists=/usr/local/bin/sd-dupe
@@ -352,8 +389,8 @@
  WantedBy=multi-user.target
 EOF
 
-echo "Creating cleanup script..."
-cat > ${mntdir}/usr/local/bin/install-cleanup << "EOF"
+	echo "Creating cleanup script..."
+	cat > ${mntdir}/usr/local/bin/install-cleanup << "EOF"
 #!/bin/bash
 echo "Installing cuttlefish-common package..."
 echo "nameserver 8.8.8.8" > /etc/resolv.conf
@@ -389,9 +426,9 @@
 rm /usr/local/bin/sd-dupe
 rm /usr/local/bin/install-cleanup
 EOF
-chmod +x ${mntdir}/usr/local/bin/install-cleanup
+	chmod +x ${mntdir}/usr/local/bin/install-cleanup
 
-chroot ${mntdir} /bin/bash << "EOT"
+	chroot ${mntdir} /bin/bash << "EOT"
 echo "Enabling services..."
 systemctl enable led
 systemctl enable sd-dupe
@@ -402,15 +439,19 @@
 ln -s /boot/uInitrd-5.2.0 /boot/uInitrd
 EOT
 
-umount ${mntdir}/sys
-umount ${mntdir}/dev
-umount ${mntdir}/proc
-umount ${mntdir}
+	umount ${mntdir}/sys
+	umount ${mntdir}/dev
+	umount ${mntdir}/proc
+	umount ${mntdir}
+
+	# Turn on journaling
+	tune2fs -O ^has_journal ${IMAGE}
+	e2fsck -fy ${IMAGE} >/dev/null 2>&1
+fi
 
 if [ ${USE_IMAGE} -eq 0 ]; then
 	# 32GB eMMC size
-	last_sector=61071326
-
+	end_sector=61071326
 	device=/dev/${mmc_dev}
 	devicep=${device}
 
@@ -419,39 +460,41 @@
 	sgdisk -a1 -n:2:8128:8191 -t:2:8301 -c:2:env ${device}
 	sgdisk -a1 -n:3:16384:24575 -t:3:8301 -c:3:loader2 ${device}
 	sgdisk -a1 -n:4:24576:32767 -t:4:8301 -c:4:trust ${device}
-	sgdisk -a1 -n:5:32768:${last_sector} -A:5:set:2 -t:5:8305 -c:5:rootfs ${device}
-fi
-
-# Turn on journaling
-tune2fs -O ^has_journal ${IMAGE}
-e2fsck -fy ${IMAGE} >/dev/null 2>&1
-
-if [ ${USE_IMAGE} -eq 0 ]; then
-	dd if=${IMAGE} of=${devicep}5 bs=1M
-	resize2fs ${devicep}5 >/dev/null 2>&1
+	sgdisk -a1 -n:5:32768:${end_sector} -A:5:set:2 -t:5:8305 -c:5:rootfs ${device}
+	if [ ${FLAGS_p5} -eq ${FLAGS_TRUE} ]; then
+		dd if=${IMAGE} of=${devicep}5 bs=1M
+		resize2fs ${devicep}5 >/dev/null 2>&1
+	fi
 else
-	# Minimize rootfs filesystem
-	while true; do
-		out=`sudo resize2fs -M ${IMAGE} 2>&1`
-		if [[ $out =~ "Nothing to do" ]]; then
-			break
-		fi
-	done
-
-	# Minimize rootfs file size
-	block_count=`sudo tune2fs -l ${IMAGE} | grep "Block count:" | sed 's/.*: *//'`
-	block_size=`sudo tune2fs -l ${IMAGE} | grep "Block size:" | sed 's/.*: *//'`
-	sector_size=512
-	start_sector=32768
-	fs_size=$(( block_count*block_size ))
-	fs_sectors=$(( fs_size/sector_size ))
-	part_sectors=$(( ((fs_sectors-1)/2048+1)*2048 ))  # 1MB-aligned
-	end_sector=$(( start_sector+part_sectors-1 ))
-	secondary_gpt_sectors=33
-	fs_end=$(( (end_sector+secondary_gpt_sectors+1)*sector_size ))
-	image_size=$(( part_sectors*sector_size ))
-	truncate -s ${image_size} ${IMAGE}
-	e2fsck -fy ${IMAGE} >/dev/null 2>&1
+	device=$(losetup -f)
+	devicep=${device}p
+	if [ ${FLAGS_p5} -eq ${FLAGS_FALSE} ]; then
+		fs_end=3G
+		end_sector=-
+	fi
+	if [ ${FLAGS_p5} -eq ${FLAGS_TRUE} ]; then
+		# Minimize rootfs filesystem
+		while true; do
+			out=`sudo resize2fs -M ${IMAGE} 2>&1`
+			if [[ $out =~ "Nothing to do" ]]; then
+				break
+			fi
+		done
+		# Minimize rootfs file size
+		block_count=`sudo tune2fs -l ${IMAGE} | grep "Block count:" | sed 's/.*: *//'`
+		block_size=`sudo tune2fs -l ${IMAGE} | grep "Block size:" | sed 's/.*: *//'`
+		sector_size=512
+		start_sector=32768
+		fs_size=$(( block_count*block_size ))
+		fs_sectors=$(( fs_size/sector_size ))
+		part_sectors=$(( ((fs_sectors-1)/2048+1)*2048 ))  # 1MB-aligned
+		end_sector=$(( start_sector+part_sectors-1 ))
+		secondary_gpt_sectors=33
+		fs_end=$(( (end_sector+secondary_gpt_sectors+1)*sector_size ))
+		image_size=$(( part_sectors*sector_size ))
+		truncate -s ${image_size} ${IMAGE}
+		e2fsck -fy ${IMAGE} >/dev/null 2>&1
+	fi
 
 	# Create final image
 	tmpimg=`mktemp`
@@ -465,19 +508,22 @@
 	sgdisk -a1 -n:4:24576:32767 -t:4:8301 -c:4:trust ${tmpimg}
 	sgdisk -a1 -n:5:32768:${end_sector} -A:5:set:2 -t:5:8305 -c:5:rootfs ${tmpimg}
 
-	device=$(losetup -f)
-	devicep=${device}p
 	losetup ${device} ${tmpimg}
 	partx -v --add ${device}
 
-	# copy over data
-	dd if=${IMAGE} of=${devicep}5 bs=1M
+	if [ ${FLAGS_p5} -eq ${FLAGS_TRUE} ]; then
+		dd if=${IMAGE} of=${devicep}5 bs=1M
+	fi
 fi
-
-dd if=${idbloader} of=${devicep}1
-dd if=${bootenv} of=${devicep}2
-dd if=${ANDROID_BUILD_TOP}/external/u-boot/u-boot.itb of=${devicep}3
-
+if [ ${FLAGS_p1} -eq ${FLAGS_TRUE} ]; then
+	dd if=${idbloader} of=${devicep}1
+fi
+if [ ${FLAGS_p2} -eq ${FLAGS_TRUE} ]; then
+	dd if=${bootenv} of=${devicep}2
+fi
+if [ ${FLAGS_p3} -eq ${FLAGS_TRUE} ]; then
+	dd if=${ANDROID_BUILD_TOP}/external/u-boot/u-boot.itb of=${devicep}3
+fi
 if [ ${USE_IMAGE} -eq 1 ]; then
 	chown $SUDO_USER:`id -ng $SUDO_USER` ${tmpimg}
 	mv ${tmpimg} ${IMAGE}