i.MX8 - Loading Pre-built Images using Android SD Partitions RidgeRun Script
General Description
The following script is a modified version of the Android script for the creation of the partition on SD cards. The original version can be found inside the packages provided by Android for i.MX8 platforms.
Objective
This script provides support for devices recognized as /dev/sdX or /dev/mmcblkX among others, by the host machine.
Example Usage
You can run the script in order to write Android images on SD cards. Please refer to the Loading_Pre-built_Images guide for a usage example for writing pre-built Android images for i.MX8 platforms.
Script Content
You can name the script as fsl-sdcard-partition-rr.sh and put the following content inside it:
#!/bin/bash
# android-tools-fsutils should be installed as
# "sudo apt-get install android-tools-fsutils"
help() {
bn=`basename $0`
cat << EOF
usage $bn <option> device_node
options:
-h displays this help message
-s only get partition size
-np not partition.
-f soc_name flash android image file with soc_name
-F soc_name determine the device_node's offset to flash bootloader and flash default android image file
soc offset(KB)
default 1
imx8dv 16
imx8qm/imx8qxp/imx8mq 33
-a only flash image to slot_a
-b only flash image to slot_b
-c card_size optional setting: 7 / 14 / 28
If not set, use partition-table.img
If set to 7, use partition-table-7GB.img for 7GB SD card
EOF
}
# parse command line
moreoptions=1
node="na"
soc_name=""
cal_only=0
card_size=0
bootloader_offset=1
vaild_gpt_size=17
not_partition=0
not_format_fs=0
slot=""
systemimage_file="system.img"
systemimage_raw_file="system_raw.img"
vendor_file="vendor.img"
vendor_raw_file="vendor_raw.img"
partition_file="partition-table.img"
g_sizes=0
append_soc_name=0
while [ "$moreoptions" = 1 -a $# -gt 0 ]; do
case $1 in
-h) help; exit ;;
-s) cal_only=1 ;;
-f) append_soc_name=1 ; soc_name=$2; shift;;
-F) soc_name=$2; shift;;
-c) card_size=$2; shift;;
-np) not_partition=1 ;;
-nf) not_format_fs=1 ;;
-a) slot="_a" ;;
-b) slot="_b" ;;
*) moreoptions=0; node=$1 ;;
esac
[ "$moreoptions" = 0 ] && [ $# -gt 1 ] && help && exit
[ "$moreoptions" = 1 ] && shift
done
if [ ${card_size} -ne 0 ] && [ ${card_size} -ne 7 ] && [ ${card_size} -ne 14 ] && [ ${card_size} -ne 28 ]; then
help; exit;
fi
if [ "${soc_name}" = "imx8dv" ]; then
bootloader_offset=16
fi
if [ "${soc_name}" = "imx8qm" -o "${soc_name}" = "imx8qxp" -o "${soc_name}" = "imx8mq" ]; then
bootloader_offset=33
fi
echo "${soc_name} bootloader offset is: ${bootloader_offset}"
if [ "${soc_name}" != "" ] && [ "${append_soc_name}" -eq 1 ]; then
soc_name="-${soc_name}"
else
soc_name=""
fi
if [ ! -e ${node} ]; then
help
exit
fi
# dump partitions
if [ "${cal_only}" -eq "1" ]; then
gdisk -l ${node} 2>/dev/null | grep -A 20 "Number "
exit
fi
function get_partition_size
{
start_sector=`gdisk -l ${node} | grep -w $1 | awk '{print $2}'`
end_sector=`gdisk -l ${node} | grep -w $1 | awk '{print $3}'`
# 1 sector = 512 bytes. This will change unit from sector to MBytes.
let "g_sizes=($end_sector - $start_sector + 1) / 2048"
}
function format_partition
{
num=`gdisk -l ${node} | grep -w $1 | awk '{print $1}'`
num_part=`fdisk -l ${node} | grep '^/dev' | cut -d' ' -f1 | grep -oP "^${node}\K.*" | awk "NR==$num"`
if [ ${num} -gt 0 ] 2>/dev/null; then
echo "format_partition: $1:${node}${num_part} ext4"
mkfs.ext4 -F ${node}${num_part} -L$1
fi
}
function erase_partition
{
num=`gdisk -l ${node} | grep -w $1 | awk '{print $1}'`
num_part=`fdisk -l ${node} | grep '^/dev' | cut -d' ' -f1 | grep -oP "^${node}\K.*" | awk "NR==$num"`
if [ ${num} -gt 0 ] 2>/dev/null; then
get_partition_size $1
echo "erase_partition: $1 : ${node}${num_part} ${g_sizes}M"
dd if=/dev/zero of=${node}${num_part} bs=1048576 conv=fsync count=$g_sizes
fi
}
function flash_partition
{
for num in `gdisk -l ${node} | grep -E -w "$1|$1_a|$1_b" | awk '{print $1}'`
do
num_part=`fdisk -l ${node} | grep '^/dev' | cut -d' ' -f1 | grep -oP "^${node}\K.*" | awk "NR==$num"`
if [ $? -eq 0 ]; then
if [ $(echo ${1} | grep "system") != "" ] 2>/dev/null; then
img_name=${systemimage_raw_file}
elif [ $(echo ${1} | grep "vendor") != "" ] 2>/dev/null; then
img_name=${vendor_raw_file}
else
img_name="${1%_*}${soc_name}.img"
fi
echo "flash_partition: ${img_name} ---> ${node}${num_part}"
dd if=${img_name} of=${node}${num_part} bs=10M conv=fsync
fi
done
}
function format_android
{
echo "formating android images"
format_partition userdata
format_partition cache
erase_partition presistdata
erase_partition fbmisc
erase_partition misc
}
function make_partition
{
if [ ${card_size} -gt 0 ]; then
partition_file="partition-table-${card_size}GB.img"
fi
echo "make gpt partition for android: ${partition_file}"
dd if=${partition_file} of=${node} bs=1k count=${vaild_gpt_size} conv=fsync
}
function flash_android
{
boot_partition="boot"${slot}
recovery_partition="recovery"${slot}
system_partition="system"${slot}
vendor_partition="vendor"${slot}
vbmeta_partition="vbmeta"${slot}
bootloader_file="u-boot${soc_name}.imx"
flash_partition ${boot_partition}
flash_partition ${recovery_partition}
simg2img ${systemimage_file} ${systemimage_raw_file}
flash_partition ${system_partition}
rm ${systemimage_raw_file}
simg2img ${vendor_file} ${vendor_raw_file}
flash_partition ${vendor_partition}
rm ${vendor_raw_file}
flash_partition ${vbmeta_partition}
echo "erase_partition: uboot : ${node}"
echo "flash_partition: ${bootloader_file} ---> ${node}"
first_partition_offset=`gdisk -l ${node} | grep ' 1 ' | awk '{print $2}'`
# the unit of first_partition_offset is sector size which is 512 Byte.
count_bootloader=`expr ${first_partition_offset} / 2 - ${bootloader_offset}`
echo "the bootloader partition size: ${count_bootloader}"
dd if=/dev/zero of=${node} bs=1k seek=${bootloader_offset} conv=fsync count=${count_bootloader}
dd if=${bootloader_file} of=${node} bs=1k seek=${bootloader_offset} conv=fsync
}
if [ "${not_partition}" -eq "1" ] ; then
flash_android
exit
fi
make_partition
sleep 3
for i in `cat /proc/mounts | grep "${node}" | awk '{print $2}'`; do umount $i; done
hdparm -z ${node}
# backup the GPT table to last LBA for sd card.
echo -e 'r\ne\nY\nw\nY\nY' | gdisk ${node}
format_android
flash_android
# For MFGTool Notes:
# MFGTool use mksdcard-android.tar store this script
# if you want change it.
# do following:
# tar xf mksdcard-android.sh.tar
# vi mksdcard-android.sh
# [ edit want you want to change ]
# rm mksdcard-android.sh.tar; tar cf mksdcard-android.sh.tar mksdcard-android.sh