Root/target/linux/ar71xx/base-files/lib/upgrade/platform.sh

1#
2# Copyright (C) 2011 OpenWrt.org
3#
4
5. /lib/ar71xx.sh
6
7PART_NAME=firmware
8RAMFS_COPY_DATA=/lib/ar71xx.sh
9
10CI_BLKSZ=65536
11CI_LDADR=0x80060000
12
13platform_find_partitions() {
14    local first dev size erasesize name
15    while read dev size erasesize name; do
16        name=${name#'"'}; name=${name%'"'}
17        case "$name" in
18            vmlinux.bin.l7|vmlinux|kernel|linux|rootfs)
19                if [ -z "$first" ]; then
20                    first="$name"
21                else
22                    echo "$erasesize:$first:$name"
23                    break
24                fi
25            ;;
26        esac
27    done < /proc/mtd
28}
29
30platform_find_kernelpart() {
31    local part
32    for part in "${1%:*}" "${1#*:}"; do
33        case "$part" in
34            vmlinux.bin.l7|vmlinux|kernel|linux)
35                echo "$part"
36                break
37            ;;
38        esac
39    done
40}
41
42platform_do_upgrade_combined() {
43    local partitions=$(platform_find_partitions)
44    local kernelpart=$(platform_find_kernelpart "${partitions#*:}")
45    local erase_size=$((0x${partitions%%:*})); partitions="${partitions#*:}"
46    local kern_length=0x$(dd if="$1" bs=2 skip=1 count=4 2>/dev/null)
47    local kern_blocks=$(($kern_length / $CI_BLKSZ))
48    local root_blocks=$((0x$(dd if="$1" bs=2 skip=5 count=4 2>/dev/null) / $CI_BLKSZ))
49
50    if [ -n "$partitions" ] && [ -n "$kernelpart" ] && \
51       [ ${kern_blocks:-0} -gt 0 ] && \
52       [ ${root_blocks:-0} -gt ${kern_blocks:-0} ] && \
53       [ ${erase_size:-0} -gt 0 ];
54    then
55        local append=""
56        [ -f "$CONF_TAR" -a "$SAVE_CONFIG" -eq 1 ] && append="-j $CONF_TAR"
57
58        ( dd if="$1" bs=$CI_BLKSZ skip=1 count=$kern_blocks 2>/dev/null; \
59          dd if="$1" bs=$CI_BLKSZ skip=$((1+$kern_blocks)) count=$root_blocks 2>/dev/null ) | \
60            mtd -r $append -F$kernelpart:$kern_length:$CI_LDADR,rootfs write - $partitions
61    fi
62}
63
64tplink_get_image_hwid() {
65    get_image "$@" | dd bs=4 count=1 skip=16 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"'
66}
67
68platform_check_image() {
69    local board=$(ar71xx_board_name)
70    local magic="$(get_magic_word "$1")"
71    local magic_long="$(get_magic_long "$1")"
72
73    [ "$ARGC" -gt 1 ] && return 1
74
75    case "$board" in
76    all0258n )
77        platform_check_image_all0258n "$1" && return 0
78        return 1
79        ;;
80    alfa-ap96 | \
81    alfa-nx | \
82    ap113 | \
83    ap121 | \
84    ap121-mini | \
85    ap96 | \
86    db120 | \
87    hornet-ub | \
88    zcn-1523h-2 | \
89    zcn-1523h-5)
90        [ "$magic_long" != "68737173" -a "$magic_long" != "19852003" ] && {
91            echo "Invalid image type."
92            return 1
93        }
94        return 0
95        ;;
96    ap81 | \
97    ap83 | \
98    dir-600-a1 | \
99    dir-615-c1 | \
100    dir-615-e4 | \
101    dir-825-b1 | \
102    mzk-w04nu | \
103    mzk-w300nh | \
104    tew-632brp | \
105    tew-673gru | \
106    wrt400n | \
107    airrouter | \
108    bullet-m | \
109    nanostation-m | \
110    rocket-m | \
111    rw2458n | \
112    wzr-hp-g300nh2 | \
113    wzr-hp-g300nh | \
114    wzr-hp-g450h | \
115    wzr-hp-ag300h | \
116    whr-g301n | \
117    whr-hp-g300n | \
118    whr-hp-gn | \
119    nbg460n_550n_550nh | \
120    unifi )
121        [ "$magic" != "2705" ] && {
122            echo "Invalid image type."
123            return 1
124        }
125        return 0
126        ;;
127    tl-mr11u | \
128    tl-mr3020 | \
129    tl-mr3220 | \
130    tl-mr3420 | \
131    tl-wa901nd | \
132    tl-wa901nd-v2 | \
133    tl-wr703n | \
134    tl-wr741nd | \
135    tl-wr741nd-v4 | \
136    tl-wr841n-v1 | \
137    tl-wr841n-v7 | \
138    tl-wr941nd | \
139    tl-wr1043nd | \
140    tl-wr2543n)
141        [ "$magic" != "0100" ] && {
142            echo "Invalid image type."
143            return 1
144        }
145
146        local hwid
147        local imageid
148
149        hwid=$(tplink_get_hwid)
150        imageid=$(tplink_get_image_hwid "$1")
151
152        [ "$hwid" != "$imageid" ] && {
153            echo "Invalid image, hardware ID mismatch, hw:$hwid image:$imageid."
154            return 1
155        }
156
157        return 0
158        ;;
159    wndr3700)
160        local hw_magic
161
162        hw_magic="$(ar71xx_get_mtd_part_magic firmware)"
163        [ "$magic_long" != "$hw_magic" ] && {
164            echo "Invalid image, hardware ID mismatch, hw:$hw_magic image:$magic_long."
165            return 1
166        }
167        return 0
168        ;;
169    wrt160nl)
170        [ "$magic" != "4e4c" ] && {
171            echo "Invalid image type."
172            return 1
173        }
174        return 0
175        ;;
176    routerstation | \
177    routerstation-pro | \
178    ls-sr71 | \
179    pb42 | \
180    pb44 | \
181    eap7660d | \
182    ja76pf )
183        [ "$magic" != "4349" ] && {
184            echo "Invalid image. Use *-sysupgrade.bin files on this board"
185            return 1
186        }
187
188        local md5_img=$(dd if="$1" bs=2 skip=9 count=16 2>/dev/null)
189        local md5_chk=$(dd if="$1" bs=$CI_BLKSZ skip=1 2>/dev/null | md5sum -); md5_chk="${md5_chk%% *}"
190
191        if [ -n "$md5_img" -a -n "$md5_chk" ] && [ "$md5_img" = "$md5_chk" ]; then
192            return 0
193        else
194            echo "Invalid image. Contents do not match checksum (image:$md5_img calculated:$md5_chk)"
195            return 1
196        fi
197        return 0
198        ;;
199    esac
200
201    echo "Sysupgrade is not yet supported on $board."
202    return 1
203}
204
205platform_do_upgrade() {
206    local board=$(ar71xx_board_name)
207
208    case "$board" in
209    routerstation | \
210    routerstation-pro | \
211    ls-sr71 | \
212    eap7660d | \
213    pb42 | \
214    pb44 | \
215    ja76pf)
216        platform_do_upgrade_combined "$ARGV"
217        ;;
218    all0258n )
219        platform_do_upgrade_all0258n "$ARGV"
220        ;;
221    *)
222        default_do_upgrade "$ARGV"
223        ;;
224    esac
225}
226
227disable_watchdog() {
228    killall watchdog
229    ( ps | grep -v 'grep' | grep '/dev/watchdog' ) && {
230        echo 'Could not disable watchdog'
231        return 1
232    }
233}
234
235append sysupgrade_pre_upgrade disable_watchdog
236

Archive Download this file



interactive