Gunnar Mills | 6a3e4e4 | 2017-10-23 11:05:03 -0500 | [diff] [blame] | 1 | #!/bin/bash |
| 2 | set -eo pipefail |
| 3 | |
| 4 | help=$'Generate PNOR UBI image from a PNOR SquashFS Tarball |
| 5 | |
| 6 | Generates a UBI, Unsorted Block Images, PNOR image from a PNOR SquashFS Tarball. |
| 7 | The PNOR SquashFS Tarball is generated from the generate-squashfs script. |
| 8 | |
| 9 | usage: generate-ubi [OPTION] <PNOR SquashFS Tarball>... |
| 10 | |
| 11 | Options: |
| 12 | -f, --file <file> Specify destination file. Defaults to |
| 13 | `pwd`/<PNOR Tarball FILE, removing .squashfs.tar>.ubi.mtd |
| 14 | (For example, "generate-ubi my.pnor.squashfs.tar" |
| 15 | would generate `pwd`/my.pnor.ubi.mtd output.) |
Gunnar Mills | 8f61867 | 2017-10-25 11:24:39 -0500 | [diff] [blame] | 16 | -s, --size <MiB> Specify the size of the PNOR UBI image in MiBs. |
| 17 | Defaults to 128. |
Gunnar Mills | 6a3e4e4 | 2017-10-23 11:05:03 -0500 | [diff] [blame] | 18 | -h, --help Display this help text and exit. |
| 19 | ' |
Gunnar Mills | 8f61867 | 2017-10-25 11:24:39 -0500 | [diff] [blame] | 20 | # 128MiB is the default image size |
| 21 | image_size="128" |
Gunnar Mills | 6a3e4e4 | 2017-10-23 11:05:03 -0500 | [diff] [blame] | 22 | |
| 23 | while [[ $# -gt 0 ]]; do |
| 24 | key="$1" |
| 25 | case $key in |
| 26 | -f|--file) |
| 27 | outfile="$2" |
| 28 | shift 2 |
| 29 | ;; |
Gunnar Mills | 8f61867 | 2017-10-25 11:24:39 -0500 | [diff] [blame] | 30 | -s|--size) |
| 31 | image_size="$2" |
| 32 | shift 2 |
| 33 | ;; |
Gunnar Mills | 6a3e4e4 | 2017-10-23 11:05:03 -0500 | [diff] [blame] | 34 | -h|--help) |
| 35 | echo "$help" |
| 36 | exit |
| 37 | ;; |
| 38 | *) |
| 39 | tarball="$1" |
| 40 | shift 1 |
| 41 | ;; |
| 42 | esac |
| 43 | done |
| 44 | |
| 45 | if [ ! -f "${tarball}" ]; then |
| 46 | echo "Please enter a PNOR SquashFS Tarball." |
| 47 | echo "To generate PNOR SquashFS Tarball see generate-squashfs" |
| 48 | echo "$help" |
| 49 | exit 1 |
| 50 | fi |
| 51 | |
| 52 | if [[ -z $outfile ]]; then |
| 53 | # Remove .squashfs.tar from end if present and add .ubi.mtd |
| 54 | outfile=`pwd`/${tarball%".squashfs.tar"}.ubi.mtd |
| 55 | else |
| 56 | if [[ $outfile != /* ]]; then |
| 57 | outfile=`pwd`/$outfile |
| 58 | fi |
| 59 | fi |
| 60 | |
Gunnar Mills | f821084 | 2017-10-23 13:08:38 -0500 | [diff] [blame] | 61 | echo "Generating PNOR UBI image." |
| 62 | |
| 63 | squashfs_file_name="pnor.xz.squashfs" |
Gunnar Mills | 927ac0f | 2017-10-23 16:11:09 -0500 | [diff] [blame] | 64 | manifest_file_name="MANIFEST" |
Gunnar Mills | f821084 | 2017-10-23 13:08:38 -0500 | [diff] [blame] | 65 | |
| 66 | # Scratch directory for untarring and config file |
| 67 | scratch_dir=`mktemp -d` |
| 68 | |
Gunnar Mills | 0e30f86 | 2017-10-25 11:35:18 -0500 | [diff] [blame] | 69 | # Make sure scratch directory always gets cleaned up |
| 70 | trap "{ rm -r ${scratch_dir}; }" EXIT |
| 71 | |
Gunnar Mills | 927ac0f | 2017-10-23 16:11:09 -0500 | [diff] [blame] | 72 | squashfs_file=${scratch_dir}/${squashfs_file_name} |
| 73 | manifest_file=${scratch_dir}/${manifest_file_name} |
Gunnar Mills | f821084 | 2017-10-23 13:08:38 -0500 | [diff] [blame] | 74 | # Untar tarball |
Gunnar Mills | 927ac0f | 2017-10-23 16:11:09 -0500 | [diff] [blame] | 75 | tar -xvf ${tarball} -C ${scratch_dir} ${squashfs_file_name} ${manifest_file_name} |
Gunnar Mills | f821084 | 2017-10-23 13:08:38 -0500 | [diff] [blame] | 76 | |
| 77 | # All valid PNOR SquashFS Tarballs have a file named "pnor.xz.squashfs" |
Gunnar Mills | 927ac0f | 2017-10-23 16:11:09 -0500 | [diff] [blame] | 78 | if [ ! -f "${squashfs_file}" ]; then |
Gunnar Mills | f821084 | 2017-10-23 13:08:38 -0500 | [diff] [blame] | 79 | echo "No \"${squashfs_file_name}\" file in the tarball!" |
Gunnar Mills | f821084 | 2017-10-23 13:08:38 -0500 | [diff] [blame] | 80 | exit 1 |
| 81 | fi |
| 82 | |
Gunnar Mills | 927ac0f | 2017-10-23 16:11:09 -0500 | [diff] [blame] | 83 | # Need the manifest file for calculating the version id |
| 84 | if [ ! -f "${manifest_file}" ]; then |
| 85 | echo "No \"${manifest_file_name}\" file in the tarball!" |
Gunnar Mills | 927ac0f | 2017-10-23 16:11:09 -0500 | [diff] [blame] | 86 | exit 1 |
| 87 | fi |
| 88 | |
| 89 | # Flash page size in bytes |
| 90 | FLASH_PAGE_SIZE="1" |
| 91 | # kibibyte(KiB) |
| 92 | FLASH_PEB_SIZE="64" |
Gunnar Mills | 8f61867 | 2017-10-25 11:24:39 -0500 | [diff] [blame] | 93 | |
| 94 | # Convert image size from MiB to KiB |
| 95 | image_size=$((${image_size} * 1024)) |
Gunnar Mills | 927ac0f | 2017-10-23 16:11:09 -0500 | [diff] [blame] | 96 | |
| 97 | # Create UBI volume |
| 98 | add_volume() |
| 99 | { |
| 100 | config_file=$1 |
| 101 | vol_id=$2 |
| 102 | vol_type=$3 |
| 103 | vol_name=$4 |
| 104 | image=$5 |
| 105 | vol_size=$6 |
| 106 | |
| 107 | echo \[$vol_name\] >> $config_file |
| 108 | echo mode=ubi >> $config_file |
| 109 | if [ ! -z $image ]; then |
| 110 | echo image=$image >> $config_file |
| 111 | fi |
| 112 | echo vol_type=$vol_type >> $config_file |
| 113 | echo vol_name=$vol_name >> $config_file |
| 114 | echo vol_id=$vol_id >> $config_file |
| 115 | if [ ! -z $vol_size ]; then |
| 116 | echo vol_size=$vol_size >> $config_file |
| 117 | fi |
| 118 | } |
| 119 | |
| 120 | # Create an image with all 1's |
| 121 | mk_nor_image() |
| 122 | { |
| 123 | image_dst=$1 |
| 124 | image_size_kb=$2 |
| 125 | dd if=/dev/zero bs=1k count=$image_size_kb | tr '\000' '\377' > $image_dst |
| 126 | } |
| 127 | |
Gunnar Mills | 0e30f86 | 2017-10-25 11:35:18 -0500 | [diff] [blame] | 128 | # Used to temporary hold the UBI image |
Gunnar Mills | 927ac0f | 2017-10-23 16:11:09 -0500 | [diff] [blame] | 129 | tmpfile=$(mktemp ${scratch_dir}/ubinized.XXXXXX) |
| 130 | |
| 131 | # Configuration file used to create UBI image |
| 132 | config_file=${scratch_dir}/ubinize-PNOR.cfg |
| 133 | |
| 134 | # The version is listed in the MANIFEST file as "version=v1.99.10-19" |
| 135 | # Use the version to calculate the version id, a unique 8 hexadecimal digit id |
| 136 | version_id=$(sed -ne '/version=/ {s/version=//;p}' ${manifest_file} | head -n1 | \ |
| 137 | tr -d '\n' | sha512sum | cut -b 1-8) |
| 138 | |
| 139 | add_volume $config_file 0 static pnor-ro-${version_id} ${squashfs_file} |
| 140 | add_volume $config_file 1 dynamic pnor-prsv "" 2MiB |
| 141 | add_volume $config_file 2 dynamic pnor-rw-${version_id} "" 16MiB |
| 142 | |
| 143 | # Build the UBI image |
| 144 | ubinize -p ${FLASH_PEB_SIZE}KiB -m ${FLASH_PAGE_SIZE} -o ${tmpfile} $config_file |
Gunnar Mills | 8f61867 | 2017-10-25 11:24:39 -0500 | [diff] [blame] | 145 | mk_nor_image ${outfile} ${image_size} |
Gunnar Mills | 927ac0f | 2017-10-23 16:11:09 -0500 | [diff] [blame] | 146 | dd bs=1k conv=notrunc seek=0 if=${tmpfile} of=${outfile} |
| 147 | |
| 148 | echo "PNOR UBI image at ${outfile}" |