Created
January 25, 2018 22:27
-
-
Save virajkanwade/2e7078c29e531b16a1015c5e0eab6df0 to your computer and use it in GitHub Desktop.
linuxium-create-android-sdcard-split
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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