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