blob: 5c2b1b8323ac2454b0441b3f268f8aee8f3805fe [file] [log] [blame]
#!/bin/bash
set -eo pipefail
help=$'Generate PNOR UBI image from a PNOR SquashFS Tarball
Generates a UBI, Unsorted Block Images, PNOR image from a PNOR SquashFS Tarball.
The PNOR SquashFS Tarball is generated from the generate-squashfs script.
usage: generate-ubi [OPTION] <PNOR SquashFS Tarball>...
Options:
-f, --file <file> Specify destination file. Defaults to
`pwd`/<PNOR Tarball FILE, removing .squashfs.tar>.ubi.mtd
(For example, "generate-ubi my.pnor.squashfs.tar"
would generate `pwd`/my.pnor.ubi.mtd output.)
-s, --size <MiB> Specify the size of the PNOR UBI image in MiBs.
Defaults to 128.
-h, --help Display this help text and exit.
'
# 128MiB is the default image size
image_size="128"
while [[ $# -gt 0 ]]; do
key="$1"
case $key in
-f|--file)
outfile="$2"
shift 2
;;
-s|--size)
image_size="$2"
shift 2
;;
-h|--help)
echo "$help"
exit
;;
*)
tarball="$1"
shift 1
;;
esac
done
if [ ! -f "${tarball}" ]; then
echo "Please enter a PNOR SquashFS Tarball."
echo "To generate PNOR SquashFS Tarball see generate-squashfs"
echo "$help"
exit 1
fi
if [[ -z $outfile ]]; then
# Remove .squashfs.tar from end if present and add .ubi.mtd
outfile=`pwd`/${tarball%".squashfs.tar"}.ubi.mtd
else
if [[ $outfile != /* ]]; then
outfile=`pwd`/$outfile
fi
fi
echo "Generating PNOR UBI image."
squashfs_file_name="pnor.xz.squashfs"
manifest_file_name="MANIFEST"
# Scratch directory for untarring and config file
scratch_dir=`mktemp -d`
# Make sure scratch directory always gets cleaned up
trap "{ rm -r ${scratch_dir}; }" EXIT
squashfs_file=${scratch_dir}/${squashfs_file_name}
manifest_file=${scratch_dir}/${manifest_file_name}
# Untar tarball
tar -xvf ${tarball} -C ${scratch_dir} ${squashfs_file_name} ${manifest_file_name}
# All valid PNOR SquashFS Tarballs have a file named "pnor.xz.squashfs"
if [ ! -f "${squashfs_file}" ]; then
echo "No \"${squashfs_file_name}\" file in the tarball!"
exit 1
fi
# Need the manifest file for calculating the version id
if [ ! -f "${manifest_file}" ]; then
echo "No \"${manifest_file_name}\" file in the tarball!"
exit 1
fi
# Flash page size in bytes
FLASH_PAGE_SIZE="1"
# kibibyte(KiB)
FLASH_PEB_SIZE="64"
# Convert image size from MiB to KiB
image_size=$((${image_size} * 1024))
# Create UBI volume
add_volume()
{
config_file=$1
vol_id=$2
vol_type=$3
vol_name=$4
image=$5
vol_size=$6
echo \[$vol_name\] >> $config_file
echo mode=ubi >> $config_file
if [ ! -z $image ]; then
echo image=$image >> $config_file
fi
echo vol_type=$vol_type >> $config_file
echo vol_name=$vol_name >> $config_file
echo vol_id=$vol_id >> $config_file
if [ ! -z $vol_size ]; then
echo vol_size=$vol_size >> $config_file
fi
}
# Create an image with all 1's
mk_nor_image()
{
image_dst=$1
image_size_kb=$2
dd if=/dev/zero bs=1k count=$image_size_kb | tr '\000' '\377' > $image_dst
}
# Used to temporary hold the UBI image
tmpfile=$(mktemp ${scratch_dir}/ubinized.XXXXXX)
# Configuration file used to create UBI image
config_file=${scratch_dir}/ubinize-PNOR.cfg
# The version is listed in the MANIFEST file as "version=v1.99.10-19"
# Use the version to calculate the version id, a unique 8 hexadecimal digit id
version_id=$(sed -ne '/version=/ {s/version=//;p}' ${manifest_file} | head -n1 | \
tr -d '\n' | sha512sum | cut -b 1-8)
add_volume $config_file 0 static pnor-ro-${version_id} ${squashfs_file}
add_volume $config_file 1 dynamic pnor-prsv "" 2MiB
add_volume $config_file 2 dynamic pnor-rw-${version_id} "" 16MiB
# Build the UBI image
ubinize -p ${FLASH_PEB_SIZE}KiB -m ${FLASH_PAGE_SIZE} -o ${tmpfile} $config_file
mk_nor_image ${outfile} ${image_size}
dd bs=1k conv=notrunc seek=0 if=${tmpfile} of=${outfile}
echo "PNOR UBI image at ${outfile}"