blob: a6e6d6869def6d47152a851b324db559a7764615 (
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
|
#!/bin/bash
dofile=/var/volatile/do_flash_upgrade
dofactoryreset=0
id=$(id -u)
function usage {
echo "Usage: $0 -f upgrade.bin"
echo " \"-f\" factory reset"
echo " \"-h\" help"
exit 1
}
if (($(id -u) != 0)) ; then
echo "You must be root to do a flash upgrade"
exit 1
fi
while getopts "hf" arg; do
case $arg in
h)
usage
exit 1
;;
f)
mtd=$(cat /proc/mtd)
if ! [[ $mtd =~ at91bootstrap ]] ; then
echo Factory reset option is only supported on Atmel devices
exit 1
fi
dofactoryreset=1
;;
*)
usage
;;
esac
done
shift $((OPTIND-1))
if [ $# != 1 ]; then
usage
fi
set -e
upgrade=$1
mkdir -p /var/volatile
cd /var/volatile
# make sure firmware is for this device
hw_version=$(cat /sys/devices/platform/mts-io/hw-version)
firmware_model=$(tar -xO -f $upgrade model)
shopt -s nocasematch
if [[ ! "$hw_version" =~ ^$firmware_model- ]]; then
logger -s -t firmware_upgrade "Wrong firmware for this hardware"
logger -s -t firmware_upgrade "hw version: $hw_version"
logger -s -t firmware_upgrade "firmware model: $firmware_model"
exit 1
fi
files=(bstrap.bin uboot.bin uImage.bin config.jffs2 oem.jffs2 rootfs.jffs2 install.sh)
tobeflashed=0
# verify all MD5 sums
for (( i = 0; i < ${#files[@]}; i++ )); do
file=${files[i]}
# if the file is in the tar, md5sum it
if tar -t -f $upgrade | grep -F -q "$file"; then
logger -s -t firmware_upgrade "Checking MD5 for $file..."
if ! tar -x -f $upgrade $file.md5; then
logger -s -t firmware_upgrade "MD5 is not found for the $file, upgrade aborted"
exit 1
fi
if ! tar -xO -f $upgrade $file | md5sum -c $file.md5; then
logger -s -t firmware_upgrade "MD5 check failed, upgrade aborted"
exit 1
fi
tobeflashed=1
fi
done
if (( $tobeflashed )); then
if ((dofactoryreset == 1)) ; then
for name in "u-Boot Config" "u-Boot Redundant Config" ; do
part=$(echo "$mtd" | grep "$name" | sed 's/:.*//')
if [[ $part =~ ^mtd[0-9] ]] ; then
flash_erase /dev/${part} 0 0
fi
done
fuser -mk /var/config || true
for name in "User data" "Config" ; do
part=$(echo "$mtd" | grep "\"$name\"" | sed 's/:.*//')
num=$(echo "$part" | sed 's/mtd//')
if [[ $part =~ ^mtd[0-9] ]] ; then
umount -l /dev/mtdblock${num} || true
flash_erase -j /dev/${part} 0 0
fi
done
fi
mkdir -p /var/volatile/flash-upgrade
mv -f $upgrade /var/volatile/flash-upgrade/upgrade.bin
touch "${dofile}"
chown "root:root" "${dofile}" || true
uid=$(stat -c %u "${dofile}") || true
result=$?
if ((result != 0)) ; then
logger -s -t firmware_upgrade "Cannot create ${dofile}"
exit 1
fi
if ((uid != 0)) ; then
logger -s -t firmware_upgrade "Cannot set ownership of ${dofile} to root"
exit 1
fi
if ((dofactoryreset == 1)) ; then
logger -s -t firmware_upgrade "Power Off"
sleep 1
poweroff
else
logger -s -t firmware_upgrade "Rebooting"
sleep 1
reboot
fi
# NOTREACHED
exit 0
else
logger -s -t firmware_upgrade "Nothing to be flashed!"
exit 1
fi
|