Skip to content

Instantly share code, notes, and snippets.

@virajkanwade
Created January 25, 2018 22:27
Show Gist options
  • Save virajkanwade/2e7078c29e531b16a1015c5e0eab6df0 to your computer and use it in GitHub Desktop.
Save virajkanwade/2e7078c29e531b16a1015c5e0eab6df0 to your computer and use it in GitHub Desktop.
linuxium-create-android-sdcard-split
#!/bin/bash
# Linuxium's script to create a bootable SD card with Android for RK3188 devices
SDCARD="/dev/sdc"
SOURCE_DIR='~'
WORKING_DIR=`pwd`
ANDROID_DIR=${WORKING_DIR}/Android
IMAGE_DIR=${ANDROID_DIR}/Image
BOOT_DIR=${ANDROID_DIR}/Image/boot
TOOLS_DIR=${WORKING_DIR}/Tools
PARAMETER_FILE=${ANDROID_DIR}/parameter
RKCRC=${TOOLS_DIR}/rkcrc
RKUNPACK=${TOOLS_DIR}/rkunpack
SPLIT_BOOT_IMAGE=${TOOLS_DIR}/split_bootimg_pl
MKKRNLIMG=${TOOLS_DIR}/mkkrnlimg
SDBOOT=${TOOLS_DIR}/sdboot_rk3188.img
BOOT_PARTITION=false
KERNEL_PARTITION=false
CACHE_PARTITION=false
DATA_PARTITION=false
METADATA_PARTITION=false
SYSTEM_PARTITION=false
USER_PARTITION=false
CTRL_C()
{
cd ${WORKING_DIR}
#rm -f ${ANDROID_IMAGE}-BOOT ${ANDROID_IMAGE}-HEAD ${ANDROID_IMAGE}-MD5 > /dev/null 2>&1
rm -rf ${ANDROID_DIR} > /dev/null 2>&1
echo
echo "$0: Android SD card creation interrupted ... exiting."
exit
}
ERROR()
{
cd ${WORKING_DIR}
#rm -f ${ANDROID_IMAGE}-BOOT ${ANDROID_IMAGE}-HEAD ${ANDROID_IMAGE}-MD5 > /dev/null 2>&1
rm -rf ${ANDROID_DIR} > /dev/null 2>&1
ERROR_MESSAGE=$*
echo
echo "$0: ${ERROR_MESSAGE} ... exiting."
exit
}
START()
{
cd ${WORKING_DIR}
if [ $# -ne 1 ]; then
ERROR "Usage: '$0 <Android images directory>'"
fi
SOURCE_DIR=$1
if [ -z "${SOURCE_DIR}" ]; then
ERROR "Incorrect usage ... Android image must be specified"
fi
if [ ! -d "${SOURCE_DIR}" ]; then
ERROR "Android images directory '${SOURCE_DIR}' not found"
fi
if [ ! -f ${RKCRC} ]; then
ERROR "Missing system tool '${RKCRC}'"
fi
if [ ! -f ${RKUNPACK} ]; then
ERROR "Missing system tool '${RKUNPACK}'"
fi
if [ ! -f ${SPLIT_BOOT_IMAGE} ]; then
ERROR "Missing system tool '${SPLIT_BOOT_IMAGE}'"
fi
if [ ! -f ${MKKRNLIMG} ]; then
ERROR "Missing system tool '${MKKRNLIMG}'"
fi
if [ ! -f ${SDBOOT} ]; then
ERROR "Missing bootloader image '${SDBOOT}'"
fi
NECESSARY=true
while ${NECESSARY}; do
echo -n "$0: Is your SD card loaded as '${SDCARD}' (y/n)? "
read -n 1 ANSWER
echo
if [ "${ANSWER}" = "y" ]; then
if [ ! -b "${SDCARD}" ]; then
ERROR "Device '${SDCARD}' not found"
else
break
fi
else
echo -n "$0: Do you want to use a different device? "
read -n 1 ANSWER
echo
if [ "${ANSWER}" = "y" -o -z "${ANSWER}" ]; then
echo -n "$0: Enter new device name? "
read SDCARD
else
ERROR "Android SD card creation terminated"
fi
fi
done
echo -n "$0: Unmounting partitions on '${SDCARD}' ... "
umount ${SDCARD}? > /dev/null 2>&1
echo "done."
}
COPY_IMG()
{
echo -n "$0: Copying Android image files from '${SOURCE_DIR}' ... "
rm -rf ${ANDROID_DIR} > /dev/null 2>&1
mkdir ${ANDROID_DIR}
cd ${ANDROID_DIR}
cp ${SOURCE_DIR}/6gb_parameter parameter
mkdir ${IMAGE_DIR}
cd ${IMAGE_DIR}
cp ${SOURCE_DIR}/kernel1080p.img kernel.img
cp ${SOURCE_DIR}/boot.img boot.img
cp ${SOURCE_DIR}/system.img system.img
}
INIT_BOOT_IMG()
{
echo -n "$0: Unpacking Android boot image ... "
cd ${IMAGE_DIR}
rm -rf boot.img-ramdisk.cpio boot.img-ramdisk.cpio.gz > /dev/null 2>&1
if [ -f boot.img-raw ]; then
cp boot.img-raw boot.img-ramdisk.cpio.gz
else
ANDROID_BOOT_UNPACK_SUCCESSFUL=false
${SPLIT_BOOT_IMAGE} boot.img > /dev/null 2>&1 && ANDROID_BOOT_UNPACK_SUCCESSFUL=true
if ! ${ANDROID_BOOT_UNPACK_SUCCESSFUL}; then
ERROR "Unpacking of Android boot image unsuccessful"
fi
if [ -f boot.img-ramdisk.gz ]; then
cp boot.img-ramdisk.gz boot.img-ramdisk.cpio.gz
else
ERROR "Android boot image 'boot.img' not found"
fi
fi
if [ ! -f kernel.img ]; then
if [ -f boot.img-kernel ]; then
ANDROID_IMAGE_CREATION_SUCCESSFUL=false
${MKKRNLIMG} boot.img-kernel kernel.img > /dev/null 2>&1 && ANDROID_IMAGE_CREATION_SUCCESSFUL=true
if ! ${ANDROID_IMAGE_CREATION_SUCCESSFUL}; then
ERROR "Cannot create Android kernel image"
fi
else
ERROR "Android kernel image 'kernel.img' not found"
fi
fi
gunzip boot.img-ramdisk.cpio.gz
rm -rf boot > /dev/null 2>&1
mkdir ${BOOT_DIR}
cd ${BOOT_DIR}
cpio -ivdum < ../boot.img-ramdisk.cpio > /dev/null 2>&1
echo "done."
}
CREATE_PARTITIONS_ON_SDCARD()
{
echo -n "$0: Calculating partition sizes for '${SDCARD}' ... "
cd ${ANDROID_DIR}
METADATA=
PARTITION_NUMBER=1
for PARTITION in `cat ${PARAMETER_FILE} | grep '^CMDLINE' | sed 's/ //g' | sed 's/.*:\(0x.*[^)])\).*/\1/' | sed 's/,/ /g'`; do
PARTITION_NAME=`echo ${PARTITION} | sed 's/\(.*\)(\(.*\))/\2/'`
START_PARTITION=`echo ${PARTITION} | sed 's/.*@\(.*\)(.*)/\1/'`
LENGTH_PARTITION=`echo ${PARTITION} | sed 's/\(.*\)@.*/\1/'`
if [ "${LENGTH_PARTITION}" = "-" ]; then
LENGTH_PARTITION=0
fi
case ${PARTITION_NAME} in
"boot")
BOOT_PARTITION=true
BOOT_START_PARTITION=${START_PARTITION}
BOOT_LENGTH_PARTITION=${LENGTH_PARTITION}
;;
"kernel")
KERNEL_PARTITION=true
KERNEL_START_PARTITION=${START_PARTITION}
KERNEL_LENGTH_PARTITION=${LENGTH_PARTITION}
;;
"cache")
CACHE_PARTITION=true
CACHE_LENGTH_PARTITION=${LENGTH_PARTITION}
;;
"userdata")
DATA_PARTITION=true
DATA_LENGTH_PARTITION=${LENGTH_PARTITION}
;;
"metadata")
METADATA=METADATA
METADATA_PARTITION=true
METADATA_LENGTH_PARTITION=${LENGTH_PARTITION}
;;
"system")
SYSTEM_PARTITION=true
SYSTEM_LENGTH_PARTITION=${LENGTH_PARTITION}
;;
"user")
USER_PARTITION=true
USER_START_PARTITION=${START_PARTITION}
USER_DEFINED_PARTITION_NUMBER=${PARTITION_NUMBER}
USER_LENGTH_PARTITION=${LENGTH_PARTITION}
ACTUAL_START_PARTITION=$((0x2000+USER_START_PARTITION))
SIZE_OF_SDCARD=`gdisk -l ${SDCARD} | grep "last usable sector" | sed 's/.* //'`
if [ ${ACTUAL_START_PARTITION} -gt ${SIZE_OF_SDCARD} ]; then
ERROR "Android image too big for '${SDCARD}'"
fi
;;
*)
;;
esac
PARTITION_NUMBER=$((PARTITION_NUMBER+1))
done
LAST_DEFINED_PARTITION_NUMBER=$((PARTITION_NUMBER-1))
if [ ${USER_DEFINED_PARTITION_NUMBER} -ne ${LAST_DEFINED_PARTITION_NUMBER} ]; then
ERROR "Android's 'user' partition must be defined as last partition in parameter file"
fi
for PARTITION in BOOT KERNEL CACHE DATA ${METADATA} SYSTEM USER
do
eval PARTITION_EXISTS=${PARTITION}_PARTITION
if ! ${!PARTITION_EXISTS}; then
ERROR "Android's parameter file missing '`echo ${PARTITION} | tr '[:upper:]' '[:lower:]'`' partition definition"
fi
done
echo "done."
PARTITION_NUMBER=1
for PARTITION in CACHE DATA ${METADATA} SYSTEM USER
do
eval VALUE=${PARTITION}_LENGTH_PARTITION
LENGTH_PARTITION=${!VALUE}
PARTITION_SIZE=$((LENGTH_PARTITION*512/1024/1024))
if [ ${PARTITION_NUMBER} = 1 ]; then
if [ $((LENGTH_PARTITION)) -eq 0 ]; then
ERROR "Android's 'user' partition must not be defined as first partition in parameter file"
fi
START_OF_PARTITION=$(((0x2000+0x2000+BOOT_LENGTH_PARTITION+KERNEL_LENGTH_PARTITION)*512/1024/1024))
echo -n "$0: Creating '`echo ${PARTITION} | tr '[:upper:]' '[:lower:]'`' partition as '${SDCARD}${PARTITION_NUMBER}' with size of ${PARTITION_SIZE} MB ..."
sgdisk -n ${PARTITION_NUMBER}:${START_OF_PARTITION}M:+${PARTITION_SIZE}M -t ${PARTITION_NUMBER}:8300 ${SDCARD} > /dev/null 2>&1
echo "done."
echo -n "$0: Making 'ext4' file system for '`echo ${PARTITION} | tr '[:upper:]' '[:lower:]'`' partition on '${SDCARD}${PARTITION_NUMBER}' ... "
mkfs.ext4 -F ${SDCARD}${PARTITION_NUMBER} > /dev/null 2>&1
echo "done."
else
if [ ${PARTITION_SIZE} -gt 0 ]; then
echo -n "$0: Creating '`echo ${PARTITION} | tr '[:upper:]' '[:lower:]'`' partition as '${SDCARD}${PARTITION_NUMBER}' with size of ${PARTITION_SIZE} MB ... "
sgdisk -n ${PARTITION_NUMBER}:0:+${PARTITION_SIZE}M -t ${PARTITION_NUMBER}:8300 ${SDCARD} > /dev/null 2>&1
echo "done."
echo -n "$0: Making 'ext4' file system for '`echo ${PARTITION} | tr '[:upper:]' '[:lower:]'`' partition on '${SDCARD}${PARTITION_NUMBER}' ... "
mkfs.ext4 -F ${SDCARD}${PARTITION_NUMBER} > /dev/null 2>&1
echo "done."
else
echo -n "$0: Creating '`echo ${PARTITION} | tr '[:upper:]' '[:lower:]'`' partition as '${SDCARD}${PARTITION_NUMBER}' using rest of space on '${SDCARD}' ... "
sgdisk -n ${PARTITION_NUMBER}:: -t ${PARTITION_NUMBER}:0700 ${SDCARD} > /dev/null 2>&1
echo "done."
echo -n "$0: Making 'vfat' file system for '`echo ${PARTITION} | tr '[:upper:]' '[:lower:]'`' partition on '${SDCARD}${PARTITION_NUMBER}' ... "
mkfs.vfat ${SDCARD}${PARTITION_NUMBER} > /dev/null 2>&1
echo "done."
fi
fi
eval ${PARTITION}_PARTITION_NUMBER=${PARTITION_NUMBER}
PARTITION_NUMBER=$((PARTITION_NUMBER+1))
done
}
CONVERT_ANDROID_IMAGE_TO_RUN_ON_SDCARD()
{
echo -n "$0: Updating Android boot source ... "
cd ${BOOT_DIR}
for FILE in `egrep -Il "insmod.*rk30xxnand" *`; do
sed -i 's/\(insmod.*rk30xxnand\)/# \1/g' ${FILE}
done
if [ -f fstab.rk30board.bootmode.unknown ]; then
for FILE in `egrep -Il "mount.*ext4.*mtd@" *`; do
sed -i "s/\(mount.*ext4.*mtd@\)/# \1/g" ${FILE}
done
sed -i "s?/dev/block/mtd/by-name/cache?/dev/block/mmcblk0p${CACHE_PARTITION_NUMBER}?" fstab.rk30board.bootmode.unknown
sed -i "s?/dev/block/mtd/by-name/userdata?/dev/block/mmcblk0p${DATA_PARTITION_NUMBER}?" fstab.rk30board.bootmode.unknown
sed -i "s?/dev/block/mtd/by-name/metadata?/dev/block/mmcblk0p${METADATA_PARTITION_NUMBER}?" fstab.rk30board.bootmode.unknown
sed -i "s?/dev/block/mtd/by-name/system?/dev/block/mmcblk0p${SYSTEM_PARTITION_NUMBER}?" fstab.rk30board.bootmode.unknown
sed -i "s?/dev/block/mtd/by-name/user?/dev/block/mmcblk0p${USER_PARTITION_NUMBER}?" fstab.rk30board.bootmode.unknown
sed -i "s?\(/dev/block/mmcblk0p${USER_PARTITION_NUMBER}.*/mnt/internal_sd.*vfat\).*defaults.*voldmanaged=internal_sd:auto,noemulatedsd?\1 defaults wait?" fstab.rk30board.bootmode.unknown
sed -i "s?\(/devices/platform/rk29_sdmmc.0/mmc_host/mmc\)?# \1?" fstab.rk30board.bootmode.unknown
else
for FILE in `egrep -Il "mount.*ext4.*mtd@" *`; do
sed -i "s?mount.*ext4.*mtd@cache?mount ext4 /dev/block/mmcblk0p${CACHE_PARTITION_NUMBER}?" ${FILE}
sed -i "s?mount.*ext4.*mtd@userdata?mount ext4 /dev/block/mmcblk0p${DATA_PARTITION_NUMBER}?" ${FILE}
sed -i "s?mount.*ext4.*mtd@metadata?mount ext4 /dev/block/mmcblk0p${METADATA_PARTITION_NUMBER}?" ${FILE}
sed -i "s?mount.*ext4.*mtd@system?mount ext4 /dev/block/mmcblk0p${SYSTEM_PARTITION_NUMBER}?" ${FILE}
done
for FILE in `egrep -Il "mount.*vfat.*mtd@" *`; do
sed -i "s?#\(.*mkdir.*/mnt/sdcard.*0000.*system.*system\)?\1?" ${FILE}
sed -i "s?#\(.*mount.*vfat.*mtd@user\)?\1?" ${FILE}
sed -i "s?mount.*vfat.*mtd@user?mount vfat /dev/block/mmcblk0p${USER_PARTITION_NUMBER}?" ${FILE}
done
echo "done."
echo -n "$0: Updating Android system image ..."
cd ${IMAGE_DIR}
rm -rf system > /dev/null 2>&1
mkdir system
SYSTEM_MOUNTED_SUCCESSFULLY=false
mount system.img system && SYSTEM_MOUNTED_SUCCESSFULLY=true
if ! ${SYSTEM_MOUNTED_SUCCESSFULLY}; then
ERROR "Cannot update system image"
else
sed -i "s?\(dev_mount.*flash.*/mnt/sdcard.*auto\)?# \1?" system/etc/vold.fstab
#sed -i "s?\(dev_mount.*sdcard.*/mnt/external_sd.*auto\)?# \1?" system/etc/vold.fstab
sync
sync
umount system
fi
rm -rf system > /dev/null 2>&1
e2fsck -fp system.img > /dev/null 2>&1
fi
echo "done."
echo -n "$0: Rebuilding Android boot image ... "
cd ${BOOT_DIR}
rm -rf ../boot.img-ramdisk.cpio ../boot.img-ramdisk.cpio.gz > /dev/null 2>&1
find . | cpio -o -H newc > ../boot.img-ramdisk.cpio 2> /dev/null
cd ..
gzip boot.img-ramdisk.cpio
ANDROID_IMAGE_CREATION_SUCCESSFUL=false
${MKKRNLIMG} boot.img-ramdisk.cpio.gz boot.img > /dev/null 2>&1 && ANDROID_IMAGE_CREATION_SUCCESSFUL=true
if ! ${ANDROID_IMAGE_CREATION_SUCCESSFUL}; then
ERROR "Cannot create Android boot image"
fi
rm -f boot.img-ramdisk.cpio.gz
echo "done."
}
FLASH_BOOTLOADER_TO_SDCARD()
{
echo -n "$0: Formatting SD card '${SDCARD}' ... "
cd ${ANDROID_DIR}
sgdisk -Z ${SDCARD} > /dev/null 2>&1
echo "done."
echo -n "$0: Flashing bootloader '`basename ${SDBOOT}`' to '${SDCARD}' ... "
dd if=${SDBOOT} of=${SDCARD} conv=sync,fsync > /dev/null 2>&1
echo "done."
echo -n "$0: Updating partition table on '${SDCARD}' ... "
sgdisk -og ${SDCARD} > /dev/null 2>&1
echo "done."
}
FLASH_BOOT_TO_SDCARD()
{
echo -n "$0: Flashing boot 'boot.img' to '${SDCARD} ... "
cd ${IMAGE_DIR}
dd if=boot.img of=${SDCARD} seek=$((0x2000+BOOT_START_PARTITION)) conv=sync,fsync > /dev/null 2>&1
echo "done."
}
FLASH_PARAMETER_TO_SDCARD()
{
cd ${ANDROID_DIR}
echo -n "$0: Creating 'parameter.img' from 'parameter' ... "
PARAMETER_IMAGE_CREATED=false
rm -rf parameter.img > /dev/null 2>&1
${RKCRC} -p ${PARAMETER_FILE} parameter.img && PARAMETER_IMAGE_CREATED=true
echo "done."
if ${PARAMETER_IMAGE_CREATED}; then
echo -n "$0: Flashing 'parameter.img' to '${SDCARD}' ... "
dd if=parameter.img of=${SDCARD} seek=$((0x2000)) conv=sync,fsync > /dev/null 2>&1
echo "done."
else
ERROR "Cannot create 'parameter.img'"
fi
}
FLASH_KERNEL_TO_SDCARD()
{
echo -n "$0: Flashing kernel 'kernel' to '${SDCARD} ... "
cd ${IMAGE_DIR}
dd if=kernel.img of=${SDCARD} seek=$((0x2000+KERNEL_START_PARTITION)) conv=sync,fsync > /dev/null 2>&1
echo "done."
}
FLASH_SYSTEM_TO_SDCARD()
{
echo -n "$0: Flashing system 'system.img' to '${SDCARD}${SYSTEM_PARTITION_NUMBER}' ... "
cd ${IMAGE_DIR}
dd if=system.img of=${SDCARD}${SYSTEM_PARTITION_NUMBER} conv=sync,fsync > /dev/null 2>&1
e2fsck -fp ${SDCARD}${SYSTEM_PARTITION_NUMBER} > /dev/null 2>&1
resize2fs ${SDCARD}${SYSTEM_PARTITION_NUMBER} > /dev/null 2>&1
echo "done."
}
FINISH()
{
echo -n "$0: Removing unpacked Android image ... "
cd ${WORKING_DIR}
rm -rf ${ANDROID_DIR} > /dev/null 2>&1
echo "done."
echo -n "$0: Flushing buffers for '${SDCARD}' ... "
sync
sync
echo "done."
echo "$0: Android SD card created on '${SDCARD}'."
}
trap CTRL_C SIGINT
START $*
COPY_IMG
INIT_BOOT_IMG
FLASH_BOOTLOADER_TO_SDCARD
CREATE_PARTITIONS_ON_SDCARD
CONVERT_ANDROID_IMAGE_TO_RUN_ON_SDCARD
FLASH_PARAMETER_TO_SDCARD
FLASH_BOOT_TO_SDCARD
FLASH_KERNEL_TO_SDCARD
FLASH_SYSTEM_TO_SDCARD
FINISH
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment