blob: c895f3d2f858421a35194a473524e4d97ed0c274 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
#!/bin/bash
# Copyright (C) 2015 "IoT.bzh"
# Authors: Jose Bollo, Stephane Desneux, Yannick Gicquel
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
set -e
usage() {
echo "Usage: $0 <image.rootfs.tar.*> [output_file_or_dir [size_in_GB]]" >&2
echo "<image tarball> is usually located in \$builddir/tmp/deploy/images" >&2
exit 1
}
IMGTAR=$1
[[ ! -f $IMGTAR ]] && { echo "Image file not found." >&2; usage; }
if [[ $IMGTAR =~ ^.*\.(rootfs.tar\..*)$ ]]; then
ext=${BASH_REMATCH[1]}
IMGBASE=$(basename $IMGTAR .$ext)
else
echo "Invalid image archive (not a tarball?)" >&2; usage;
fi
OUTPUT=${2:-.}
if [[ -z $OUTPUT ]]; then
echo "Invalid output file/dir." >&2
usage
elif [[ -d $OUTPUT ]]; then
# output is a dir, use input file for name
OUTPUT=$OUTPUT/$IMGBASE.raw
fi
SIZE=${3:-2} # size in giga
initdisk() {
local size=$1 file=$2 ; #size is in giga
{
head -c 446 /dev/zero
printf '\x00\x00\x00\x00\x83\x00\x00\x00\x01\x00\x00\x00'
printf $(printf %08x $(( ( (size * 1073741824) - 1) / 512 )) |
sed 's:\(..\)\(..\)\(..\)\(..\):\\x\4\\x\3\\x\2\\x\1:')
head -c 48 /dev/zero
printf '\x55\xAA'
} > $file
dd if=/dev/zero of=$file bs=1 count=0 seek=${size}G
}
make_image() {
local imgtar=$1
local ydir=$(dirname $imgtar)
local machine=$(cd $ydir && basename $(pwd -P))
local image=$2
local size=$3
local tmpd=/tmp/dir$$
echo
echo
echo "Creating the image $image ..."
[[ -f $image ]] && rm $image
[[ -f $image.tar.xz ]] && rm $image.tar.xz
initdisk $size $image
[[ ! -e /dev/loop-control ]] && sudo mknod /dev/loop-control c 10 237
for i in $(seq 0 9); do
[[ ! -b /dev/loop$i ]] && sudo mknod /dev/loop$i b 7 $i
done
local loop=$(sudo losetup -f)
sudo losetup -o 512 $loop $image
sudo mke2fs -t ext3 $loop
sudo mkdir $tmpd
sudo mount $loop $tmpd
echo "Extracting image tarball..."
sudo tar pxf $imgtar -C $tmpd --xattrs-include='*'
echo "Detected machine $machine"
case $machine in
porter)
sudo cp -v $ydir/uImage+dtb $tmpd/boot
;;
m3ulcb|h3ulcb)
sudo cp -v $ydir/Image-*-$machine.dtb $tmpd/boot
;;
*)
echo "Unknown machine '$machine': don't know how to handle kernel ..." >&2
;;
esac
sudo umount $loop
sudo losetup -d $loop
sudo rmdir $tmpd
if which bmaptool &>/dev/null; then
echo "Creating bitmap file..."
bmaptool create -o $image.bmap $image
fi
# echo "Creating compressed image $image.bz2 ..."
# BZIP2=$(which pbzip2 2>/dev/null || which bzip2 2>/dev/null)
# $BZIP2 -f -c $image >$image.bz2
echo "Creating compressed image $image.xz..."
xz -0 -T 0 -f -c $image >$image.xz
rm $image
echo "done"
echo
echo
echo
echo
echo
echo "Image $image created!"
echo
echo "On Porter board, this image can be booted with the following uboot environment:"
cat <<'EOF'
---
setenv bootargs_console 'console=ttySC6,38400 ignore_loglevel'
setenv bootargs_video 'vmalloc=384M video=HDMI-A-1:1920x1080-32@60'
setenv bootargs_root 'root=/dev/mmcblk0p1 rootdelay=3 rw rootfstype=ext3 rootwait'
setenv bootmmc '1:1'
setenv bootcmd_sd 'ext4load mmc ${bootmmc} 0x40007fc0 boot/uImage+dtb'
setenv bootcmd 'setenv bootargs ${bootargs_console} ${bootargs_video} ${bootargs_root}; run bootcmd_sd; bootm 0x40007fc0'
saveenv
---
EOF
echo
echo "NB: replace bootmmc value '1:1' with '0:1' or '2:1' to access the good slot"
echo " use 'ext4ls mmc XXX:1' to test access"
}
make_image $IMGTAR $OUTPUT $SIZE
|