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|filesystem)
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    all0315n | \
77    all0258n )
78        platform_check_image_allnet "$1" && return 0
79        return 1
80        ;;
81    alfa-ap96 | \
82    alfa-nx | \
83    ap113 | \
84    ap121 | \
85    ap121-mini | \
86    ap136 | \
87    ap96 | \
88    db120 | \
89    hornet-ub | \
90    zcn-1523h-2 | \
91    zcn-1523h-5)
92        [ "$magic_long" != "68737173" -a "$magic_long" != "19852003" ] && {
93            echo "Invalid image type."
94            return 1
95        }
96        return 0
97        ;;
98    ap81 | \
99    ap83 | \
100    dir-600-a1 | \
101    dir-615-c1 | \
102    dir-615-e4 | \
103    ew-dorin | \
104    ew-dorin-router | \
105    mzk-w04nu | \
106    mzk-w300nh | \
107    tew-632brp | \
108    tew-712br | \
109    wrt400n | \
110    airrouter | \
111    bullet-m | \
112    nanostation-m | \
113    rocket-m | \
114    rw2458n | \
115    wzr-hp-g300nh2 | \
116    wzr-hp-g300nh | \
117    wzr-hp-g450h | \
118    wzr-hp-ag300h | \
119    whr-g301n | \
120    whr-hp-g300n | \
121    whr-hp-gn | \
122    wlae-ag300n | \
123    nbg460n_550n_550nh | \
124    unifi )
125        [ "$magic" != "2705" ] && {
126            echo "Invalid image type."
127            return 1
128        }
129        return 0
130        ;;
131
132    dir-825-b1 | \
133    tew-673gru)
134        dir825b_check_image "$1" && return 0
135        ;;
136
137    om2p | \
138    om2p-lc)
139        platform_check_image_om2p "$magic_long" "$1" && return 0
140        return 1
141        ;;
142    tl-mr11u | \
143    tl-mr3020 | \
144    tl-mr3040 | \
145    tl-mr3220 | \
146    tl-mr3420 | \
147    tl-wa901nd | \
148    tl-wa901nd-v2 | \
149    tl-wdr4300 | \
150    tl-wr703n | \
151    tl-wr741nd | \
152    tl-wr741nd-v4 | \
153    tl-wr841n-v1 | \
154    tl-wr841n-v7 | \
155    tl-wr841n-v8 | \
156    tl-wr941nd | \
157    tl-wr1041n-v2 | \
158    tl-wr1043nd | \
159    tl-wr2543n)
160        [ "$magic" != "0100" ] && {
161            echo "Invalid image type."
162            return 1
163        }
164
165        local hwid
166        local imageid
167
168        hwid=$(tplink_get_hwid)
169        imageid=$(tplink_get_image_hwid "$1")
170
171        [ "$hwid" != "$imageid" ] && {
172            echo "Invalid image, hardware ID mismatch, hw:$hwid image:$imageid."
173            return 1
174        }
175
176        return 0
177        ;;
178    wndr3700)
179        local hw_magic
180
181        hw_magic="$(ar71xx_get_mtd_part_magic firmware)"
182        [ "$magic_long" != "$hw_magic" ] && {
183            echo "Invalid image, hardware ID mismatch, hw:$hw_magic image:$magic_long."
184            return 1
185        }
186        return 0
187        ;;
188    wrt160nl)
189        [ "$magic" != "4e4c" ] && {
190            echo "Invalid image type."
191            return 1
192        }
193        return 0
194        ;;
195    routerstation | \
196    routerstation-pro | \
197    ls-sr71 | \
198    pb42 | \
199    pb44 | \
200    all0305 | \
201    eap7660d | \
202    ja76pf | \
203    ja76pf2)
204        [ "$magic" != "4349" ] && {
205            echo "Invalid image. Use *-sysupgrade.bin files on this board"
206            return 1
207        }
208
209        local md5_img=$(dd if="$1" bs=2 skip=9 count=16 2>/dev/null)
210        local md5_chk=$(dd if="$1" bs=$CI_BLKSZ skip=1 2>/dev/null | md5sum -); md5_chk="${md5_chk%% *}"
211
212        if [ -n "$md5_img" -a -n "$md5_chk" ] && [ "$md5_img" = "$md5_chk" ]; then
213            return 0
214        else
215            echo "Invalid image. Contents do not match checksum (image:$md5_img calculated:$md5_chk)"
216            return 1
217        fi
218        return 0
219        ;;
220    esac
221
222    echo "Sysupgrade is not yet supported on $board."
223    return 1
224}
225
226platform_do_upgrade() {
227    local board=$(ar71xx_board_name)
228
229    case "$board" in
230    routerstation | \
231    routerstation-pro | \
232    ls-sr71 | \
233    all0305 | \
234    eap7660d | \
235    pb42 | \
236    pb44 | \
237    ja76pf | \
238    ja76pf2)
239        platform_do_upgrade_combined "$ARGV"
240        ;;
241    all0258n )
242        platform_do_upgrade_allnet "0x9f050000" "$ARGV"
243        ;;
244    all0315n )
245        platform_do_upgrade_allnet "0x9f080000" "$ARGV"
246        ;;
247    dir-825-b1 |\
248    tew-673gru)
249        platform_do_upgrade_dir825b "$ARGV"
250        ;;
251    om2p | \
252    om2p-lc)
253        platform_do_upgrade_om2p "$ARGV"
254        ;;
255    *)
256        default_do_upgrade "$ARGV"
257        ;;
258    esac
259}
260
261disable_watchdog() {
262    killall watchdog
263    ( ps | grep -v 'grep' | grep '/dev/watchdog' ) && {
264        echo 'Could not disable watchdog'
265        return 1
266    }
267}
268
269append sysupgrade_pre_upgrade disable_watchdog
270

Archive Download this file



interactive