| 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 | 927ac0f | 2017-10-23 16:11:09 -0500 | [diff] [blame] | 69 | squashfs_file=${scratch_dir}/${squashfs_file_name} | 
 | 70 | manifest_file=${scratch_dir}/${manifest_file_name} | 
| Gunnar Mills | f821084 | 2017-10-23 13:08:38 -0500 | [diff] [blame] | 71 | # Untar tarball | 
| Gunnar Mills | 927ac0f | 2017-10-23 16:11:09 -0500 | [diff] [blame] | 72 | tar -xvf ${tarball} -C ${scratch_dir} ${squashfs_file_name} ${manifest_file_name} | 
| Gunnar Mills | f821084 | 2017-10-23 13:08:38 -0500 | [diff] [blame] | 73 |  | 
 | 74 | # All valid PNOR SquashFS Tarballs have a file named "pnor.xz.squashfs" | 
| Gunnar Mills | 927ac0f | 2017-10-23 16:11:09 -0500 | [diff] [blame] | 75 | if [ ! -f "${squashfs_file}" ]; then | 
| Gunnar Mills | f821084 | 2017-10-23 13:08:38 -0500 | [diff] [blame] | 76 |   echo "No \"${squashfs_file_name}\" file in the tarball!" | 
 | 77 |   rm -r "${scratch_dir}" | 
 | 78 |   exit 1 | 
 | 79 | fi | 
 | 80 |  | 
| Gunnar Mills | 927ac0f | 2017-10-23 16:11:09 -0500 | [diff] [blame] | 81 | # Need the manifest file for calculating the version id | 
 | 82 | if [ ! -f "${manifest_file}" ]; then | 
 | 83 |   echo "No \"${manifest_file_name}\" file in the tarball!" | 
 | 84 |   rm -r "${scratch_dir}" | 
 | 85 |   exit 1 | 
 | 86 | fi | 
 | 87 |  | 
 | 88 | # Flash page size in bytes | 
 | 89 | FLASH_PAGE_SIZE="1" | 
 | 90 | # kibibyte(KiB) | 
 | 91 | FLASH_PEB_SIZE="64" | 
| Gunnar Mills | 8f61867 | 2017-10-25 11:24:39 -0500 | [diff] [blame^] | 92 |  | 
 | 93 | # Convert image size from MiB to KiB | 
 | 94 | image_size=$((${image_size} * 1024)) | 
| Gunnar Mills | 927ac0f | 2017-10-23 16:11:09 -0500 | [diff] [blame] | 95 |  | 
 | 96 | # Create UBI volume | 
 | 97 | add_volume() | 
 | 98 | { | 
 | 99 |   config_file=$1 | 
 | 100 |   vol_id=$2 | 
 | 101 |   vol_type=$3 | 
 | 102 |   vol_name=$4 | 
 | 103 |   image=$5 | 
 | 104 |   vol_size=$6 | 
 | 105 |  | 
 | 106 |   echo \[$vol_name\] >> $config_file | 
 | 107 |   echo mode=ubi >> $config_file | 
 | 108 |   if [ ! -z $image ]; then | 
 | 109 |     echo image=$image >> $config_file | 
 | 110 |   fi | 
 | 111 |   echo vol_type=$vol_type >> $config_file | 
 | 112 |   echo vol_name=$vol_name >> $config_file | 
 | 113 |   echo vol_id=$vol_id >> $config_file | 
 | 114 |   if [ ! -z $vol_size ]; then | 
 | 115 |     echo vol_size=$vol_size >> $config_file | 
 | 116 |   fi | 
 | 117 | } | 
 | 118 |  | 
 | 119 | # Create an image with all 1's | 
 | 120 | mk_nor_image() | 
 | 121 | { | 
 | 122 |   image_dst=$1 | 
 | 123 |   image_size_kb=$2 | 
 | 124 |   dd if=/dev/zero bs=1k count=$image_size_kb | tr '\000' '\377' > $image_dst | 
 | 125 | } | 
 | 126 |  | 
 | 127 | # Used to temporary hold the UBI volume | 
 | 128 | tmpfile=$(mktemp ${scratch_dir}/ubinized.XXXXXX) | 
 | 129 |  | 
 | 130 | # Configuration file used to create UBI image | 
 | 131 | config_file=${scratch_dir}/ubinize-PNOR.cfg | 
 | 132 |  | 
 | 133 | # The version is listed in the MANIFEST file as "version=v1.99.10-19" | 
 | 134 | # Use the version to calculate the version id, a unique 8 hexadecimal digit id | 
 | 135 | version_id=$(sed -ne '/version=/ {s/version=//;p}' ${manifest_file} | head -n1 | \ | 
 | 136 |   tr -d '\n' | sha512sum | cut -b 1-8) | 
 | 137 |  | 
 | 138 | add_volume $config_file 0 static pnor-ro-${version_id} ${squashfs_file} | 
 | 139 | add_volume $config_file 1 dynamic pnor-prsv "" 2MiB | 
 | 140 | add_volume $config_file 2 dynamic pnor-rw-${version_id} "" 16MiB | 
 | 141 |  | 
 | 142 | # Build the UBI image | 
 | 143 | 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^] | 144 | mk_nor_image ${outfile} ${image_size} | 
| Gunnar Mills | 927ac0f | 2017-10-23 16:11:09 -0500 | [diff] [blame] | 145 | dd bs=1k conv=notrunc seek=0 if=${tmpfile} of=${outfile} | 
 | 146 |  | 
 | 147 | echo "PNOR UBI image at ${outfile}" | 
| Gunnar Mills | f821084 | 2017-10-23 13:08:38 -0500 | [diff] [blame] | 148 | rm -r "${scratch_dir}" |