blob: 511edcb7b19888bc20db26b1052bc5a6c37533be [file] [log] [blame]
Gunnar Mills6a3e4e42017-10-23 11:05:03 -05001#!/bin/bash
2set -eo pipefail
3
4help=$'Generate PNOR UBI image from a PNOR SquashFS Tarball
5
6Generates a UBI, Unsorted Block Images, PNOR image from a PNOR SquashFS Tarball.
7The PNOR SquashFS Tarball is generated from the generate-squashfs script.
8
9usage: generate-ubi [OPTION] <PNOR SquashFS Tarball>...
10
11Options:
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 Mills8f618672017-10-25 11:24:39 -050016 -s, --size <MiB> Specify the size of the PNOR UBI image in MiBs.
17 Defaults to 128.
Gunnar Mills6a3e4e42017-10-23 11:05:03 -050018 -h, --help Display this help text and exit.
19'
Gunnar Mills8f618672017-10-25 11:24:39 -050020# 128MiB is the default image size
21image_size="128"
Gunnar Mills6a3e4e42017-10-23 11:05:03 -050022
23while [[ $# -gt 0 ]]; do
24 key="$1"
25 case $key in
26 -f|--file)
27 outfile="$2"
28 shift 2
29 ;;
Gunnar Mills8f618672017-10-25 11:24:39 -050030 -s|--size)
31 image_size="$2"
32 shift 2
33 ;;
Gunnar Mills6a3e4e42017-10-23 11:05:03 -050034 -h|--help)
35 echo "$help"
36 exit
37 ;;
38 *)
39 tarball="$1"
40 shift 1
41 ;;
42 esac
43done
44
45if [ ! -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
50fi
51
52if [[ -z $outfile ]]; then
53 # Remove .squashfs.tar from end if present and add .ubi.mtd
54 outfile=`pwd`/${tarball%".squashfs.tar"}.ubi.mtd
55else
56 if [[ $outfile != /* ]]; then
57 outfile=`pwd`/$outfile
58 fi
59fi
60
Gunnar Millsf8210842017-10-23 13:08:38 -050061echo "Generating PNOR UBI image."
62
63squashfs_file_name="pnor.xz.squashfs"
Gunnar Mills927ac0f2017-10-23 16:11:09 -050064manifest_file_name="MANIFEST"
Gunnar Millsf8210842017-10-23 13:08:38 -050065
66# Scratch directory for untarring and config file
67scratch_dir=`mktemp -d`
68
Gunnar Mills927ac0f2017-10-23 16:11:09 -050069squashfs_file=${scratch_dir}/${squashfs_file_name}
70manifest_file=${scratch_dir}/${manifest_file_name}
Gunnar Millsf8210842017-10-23 13:08:38 -050071# Untar tarball
Gunnar Mills927ac0f2017-10-23 16:11:09 -050072tar -xvf ${tarball} -C ${scratch_dir} ${squashfs_file_name} ${manifest_file_name}
Gunnar Millsf8210842017-10-23 13:08:38 -050073
74# All valid PNOR SquashFS Tarballs have a file named "pnor.xz.squashfs"
Gunnar Mills927ac0f2017-10-23 16:11:09 -050075if [ ! -f "${squashfs_file}" ]; then
Gunnar Millsf8210842017-10-23 13:08:38 -050076 echo "No \"${squashfs_file_name}\" file in the tarball!"
77 rm -r "${scratch_dir}"
78 exit 1
79fi
80
Gunnar Mills927ac0f2017-10-23 16:11:09 -050081# Need the manifest file for calculating the version id
82if [ ! -f "${manifest_file}" ]; then
83 echo "No \"${manifest_file_name}\" file in the tarball!"
84 rm -r "${scratch_dir}"
85 exit 1
86fi
87
88# Flash page size in bytes
89FLASH_PAGE_SIZE="1"
90# kibibyte(KiB)
91FLASH_PEB_SIZE="64"
Gunnar Mills8f618672017-10-25 11:24:39 -050092
93# Convert image size from MiB to KiB
94image_size=$((${image_size} * 1024))
Gunnar Mills927ac0f2017-10-23 16:11:09 -050095
96# Create UBI volume
97add_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
120mk_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
128tmpfile=$(mktemp ${scratch_dir}/ubinized.XXXXXX)
129
130# Configuration file used to create UBI image
131config_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
135version_id=$(sed -ne '/version=/ {s/version=//;p}' ${manifest_file} | head -n1 | \
136 tr -d '\n' | sha512sum | cut -b 1-8)
137
138add_volume $config_file 0 static pnor-ro-${version_id} ${squashfs_file}
139add_volume $config_file 1 dynamic pnor-prsv "" 2MiB
140add_volume $config_file 2 dynamic pnor-rw-${version_id} "" 16MiB
141
142# Build the UBI image
143ubinize -p ${FLASH_PEB_SIZE}KiB -m ${FLASH_PAGE_SIZE} -o ${tmpfile} $config_file
Gunnar Mills8f618672017-10-25 11:24:39 -0500144mk_nor_image ${outfile} ${image_size}
Gunnar Mills927ac0f2017-10-23 16:11:09 -0500145dd bs=1k conv=notrunc seek=0 if=${tmpfile} of=${outfile}
146
147echo "PNOR UBI image at ${outfile}"
Gunnar Millsf8210842017-10-23 13:08:38 -0500148rm -r "${scratch_dir}"