flasher: revise kernel flashing to be OE friendly
[pandora-misc.git] / flasher / rootfs / etc / updater.sh
1 #/bin/sh
2 #
3 # on-target updater script for Pandora
4 # Copyright (c) 2010,2012 GraÅžvydas Ignotas
5
6 set -e -x
7
8 . /etc/updater_funcs.sh
9
10 status_uboot="missing"
11 status_uboot_env="already empty"
12 status_uimage="missing"
13 status_rootfs="missing"
14
15 cleanup()
16 {
17         cd /tmp
18         if [ -n "$finalize_mpoint" ]
19         then
20                 umount $finalize_mpoint 2> /dev/null || true
21         fi
22         if [ -n "$rootfs_mpoint" ]
23         then
24                 umount $rootfs_mpoint 2> /dev/null || true
25         fi
26 }
27
28 wait_for_file()
29 {
30         for a in `seq 10`
31         do
32                 if test -e "$1"
33                 then
34                         return 0
35                 fi
36                 sleep .5
37         done
38         return 1
39 }
40
41
42 mkdir /mnt/ubifs 2> /dev/null || true
43
44 if [ ! -e /dev/mmcblk0p1 ]
45 then
46         # hmh what's up with the SD card?
47         log "Can't access SD card, please reinsert and press enter"
48         read a < /dev/tty3
49         test -e /dev/mmcblk0p1
50 fi
51
52 mdevs="/dev/mmcblk0p1 /dev/mmcblk0p2"
53 bootfiles="bootf.tgz bootfiles.tar.gz uimage.tar.gz"
54
55 cd /tmp
56
57 for md in $mdevs
58 do
59         mpoint="/mnt/`basename $md`"
60         keep_mpoint="no"
61         mkdir $mpoint 2> /dev/null || true
62         if ! mount $md $mpoint
63         then
64                 continue;
65         fi
66
67         if [ -x $mpoint/initialize.sh ]
68         then
69                 log ""
70                 log "running init script.."
71                 cd $mpoint
72                 if ! ./initialize.sh
73                 then
74                         log "initialize.sh failed."
75                         cleanup
76                         false
77                 fi
78                 log "done."
79                 cd /tmp
80         fi
81
82         for bf in $bootfiles
83         do
84                 if [ -e $mpoint/$bf ]
85                 then
86                         tar xzvf $mpoint/$bf
87                 fi
88         done
89
90         if [ -x $mpoint/finalize.sh ]
91         then
92                 finalize_mpoint=$mpoint
93                 keep_mpoint="yes"
94         fi
95
96         if [ -e $mpoint/rootfs.img -a -e $mpoint/rootfs.md5 -a -z "$rootfs_file" ]
97         then
98                 rootfs_file=$mpoint/rootfs.img
99                 rootfs_md5=`head -n 1 $mpoint/rootfs.md5 | cut -c 1-32`
100                 rootfs_mpoint=$mpoint
101                 keep_mpoint="yes"
102         fi
103
104         if [ "$keep_mpoint" != "yes" ]
105         then
106                 umount $mpoint
107         fi
108 done
109
110 if [ -e u-boot.bin ]
111 then
112         size=`stat -c %s u-boot.bin`
113         nanddump --omitoob --omitbad -q -l $size -f u-boot.bin.flashed /dev/mtd1ro
114         if ! cmp u-boot.bin u-boot.bin.flashed
115         then
116                 flash_eraseall /dev/mtd1
117                 nandwrite -p /dev/mtd1 u-boot.bin
118                 log "u-boot.bin flashed."
119                 status_uboot="flashed"
120         else
121                 log "u-boot.bin already flashed, skipped."
122                 status_uboot="already there"
123         fi
124 else
125         log "u-boot is missing, skipped."
126 fi
127
128 nanddump --omitoob --omitbad -q -f mtd2dump /dev/mtd2ro
129 if ! cmp mtd2dump /usr/local/erasednandblk
130 then
131         flash_eraseall /dev/mtd2
132         status_uboot_env="cleared"
133         log "u-boot environment cleared."
134 fi
135
136 # make sure ubifs boot partition is in order
137 format_boot()
138 {
139         log "formatting boot partition.."
140         umount /mnt/ubifs  2> /dev/null || true
141         ubidetach /dev/ubi_ctrl -d 0  2> /dev/null || true
142         ubiformat /dev/mtd3 -s 512 -y       || return 1
143         ubiattach /dev/ubi_ctrl -m 3        || return 1
144         wait_for_file /dev/ubi0             || return 1
145         ubimkvol /dev/ubi0 -m -N boot       || return 1
146         wait_for_file /dev/ubi0_0           || return 1
147         mount -t ubifs ubi0:boot /mnt/ubifs || return 1
148 }
149
150 handle_kernels()
151 {
152         kernels=`ls uImage*  2> /dev/null || true`
153         if [ -z "$kernels" ]
154         then
155                 return 0
156         fi
157
158         # presence of uImage* is a sign that we can wipe whole boot partition,
159         # but first get rid of potentially bad autoboot.txt
160         rm -f /mnt/ubifs/autoboot.txt
161
162         for kernel in $kernels
163         do
164                 if ! cmp $kernel /mnt/ubifs/$kernel  2> /dev/null
165                 then
166                         log "flashing $kernel .."
167                         cp -a $kernel /mnt/ubifs/$kernel || return 1
168                         status_uimage="flashed"
169                         log "done"
170                 else
171                         log "$kernel already flashed, skipped."
172                         status_uimage="already there"
173                 fi
174         done
175         if [ -e bootmenu.txt ]
176         then
177                 if ! cmp bootmenu.txt /mnt/ubifs/bootmenu.txt  2> /dev/null
178                 then
179                         log "updating bootmenu.txt"
180                         cp -a bootmenu.txt /mnt/ubifs/bootmenu.txt || return 1
181                 fi
182         fi
183 }
184
185 ubiattach /dev/ubi_ctrl -m 3 || true
186 if ! mount -t ubifs ubi0:boot /mnt/ubifs  2> /dev/null
187 then
188         format_boot
189 fi
190
191 if ! handle_kernels
192 then
193         log "kernel flashing failed, retrying.."
194         format_boot
195         handle_kernels
196 fi
197
198 umount /mnt/ubifs
199 ubidetach /dev/ubi_ctrl -d 0
200
201 if [ -n "$rootfs_file" ]
202 then
203         log "Calculating checksum, this might take a few minutes.."
204         real_md5=`md5sum $rootfs_file | cut -c 1-32`
205         if [ "$real_md5" = "$rootfs_md5" ]
206         then
207                 log $real_md5
208         else
209                 log "INCORRECT"
210                 cleanup
211                 false
212         fi
213
214         # be destructive here, too hard to validate rootfs to bother
215         log "formatting.."
216         ubiformat /dev/mtd4 -s 512 -y
217         ubiattach /dev/ubi_ctrl -m 4
218         wait_for_file /dev/ubi0
219         ubimkvol /dev/ubi0 -m -N rootfs
220         wait_for_file /dev/ubi0_0
221         log "done."
222         log "Writing rootfs, please wait. This may take up to 15 minutes.."
223         ubiupdatevol /dev/ubi0_0 $rootfs_file
224         ubidetach /dev/ubi_ctrl -d 0
225         status_rootfs="flashed"
226         log "done."
227 else
228         log "root filesystem is missing, skipped."
229 fi
230
231 log "======================="
232 log "results:"
233 log "u-boot:     $status_uboot"
234 log "u-boot-env: $status_uboot_env"
235 log "kernel:     $status_uimage"
236 log "rootfs:     $status_rootfs $rootfs_file"
237
238 if [ -n "$finalize_mpoint" ]
239 then
240         log ""
241         log "running finalize script.."
242         cd $finalize_mpoint
243         if ! ./finalize.sh
244         then
245                 log "finalize.sh failed."
246                 cleanup
247                 false
248         fi
249         log "done."
250 fi
251
252 cleanup
253
254 exit 0