6d94a5384d64cd1f8a0a5351fdf0d340d5b72922
[openwrt/staging/rmilecki.git] / target / linux / cns3xxx / base-files / lib / upgrade / platform.sh
1 . /lib/cns3xxx.sh
2
3 RAMFS_COPY_DATA="/lib/cns3xxx.sh"
4
5 CI_BLKSZ=65536
6
7 platform_find_partitions() {
8 local first dev size erasesize name
9 while read dev size erasesize name; do
10 name=${name#'"'}; name=${name%'"'}
11 case "$name" in
12 vmlinux.bin.l7|kernel|linux|rootfs)
13 if [ -z "$first" ]; then
14 first="$name"
15 else
16 echo "$erasesize:$first:$name"
17 break
18 fi
19 ;;
20 esac
21 done < /proc/mtd
22 }
23
24 platform_find_kernelpart() {
25 local part
26 for part in "${1%:*}" "${1#*:}"; do
27 case "$part" in
28 vmlinux.bin.l7|kernel|linux)
29 echo "$part"
30 break
31 ;;
32 esac
33 done
34 }
35
36 platform_do_upgrade_combined() {
37 local partitions=$(platform_find_partitions)
38 local kernelpart=$(platform_find_kernelpart "${partitions#*:}")
39 local erase_size=$((0x${partitions%%:*})); partitions="${partitions#*:}"
40 local kern_length=0x$(dd if="$1" bs=2 skip=1 count=4 2>/dev/null)
41 local kern_blocks=$(($kern_length / $CI_BLKSZ))
42 local root_blocks=$((0x$(dd if="$1" bs=2 skip=5 count=4 2>/dev/null) / $CI_BLKSZ))
43
44 v "platform_do_upgrade_combined"
45 v "partitions=$partitions"
46 v "kernelpart=$kernelpart"
47 v "erase_size=$erase_size"
48 v "kern_blocks=$kern_blocks"
49 v "root_blocks=$root_blocks"
50
51 if [ -n "$partitions" ] && [ -n "$kernelpart" ] && \
52 [ ${kern_blocks:-0} -gt 0 ] && \
53 [ ${root_blocks:-0} -gt 0 ] && \
54 [ ${erase_size:-0} -gt 0 ];
55 then
56 local append=""
57 [ -f "$CONF_TAR" -a "$SAVE_CONFIG" -eq 1 ] && append="-j $CONF_TAR"
58
59 dd if="$1" bs=$CI_BLKSZ skip=1 count=$kern_blocks 2>/dev/null | mtd write - kernel
60 dd if="$1" bs=$CI_BLKSZ skip=$((1+$kern_blocks)) count=$root_blocks 2>/dev/null | \
61 mtd -r $append write - rootfs
62 else
63 echo "invalid image"
64 fi
65 }
66
67 platform_check_image() {
68 local board=$(cns3xxx_board_name)
69 local magic="$(get_magic_word "$1")"
70 local magic_long="$(get_magic_long "$1")"
71
72 [ "$#" -gt 1 ] && return 1
73
74 case "$board" in
75 laguna)
76 [ "$magic" != "4349" ] && {
77 echo "Invalid image. Use *-sysupgrade.bin files on this board"
78 return 1
79 }
80
81 local md5_img=$(dd if="$1" bs=2 skip=9 count=16 2>/dev/null)
82 local md5_chk=$(dd if="$1" bs=$CI_BLKSZ skip=1 2>/dev/null | md5sum -); md5_chk="${md5_chk%% *}"
83
84 if [ -n "$md5_img" -a -n "$md5_chk" ] && [ "$md5_img" = "$md5_chk" ]; then
85 return 0
86 else
87 echo "Invalid image. Contents do not match checksum (image:$md5_img calculated:$md5_chk)"
88 return 1
89 fi
90 return 0
91 ;;
92 esac
93
94 echo "Sysupgrade is not yet supported on $board."
95 return 1
96 }
97
98 platform_do_upgrade() {
99 local board=$(cns3xxx_board_name)
100
101 v "board=$board"
102 case "$board" in
103 laguna)
104 platform_do_upgrade_combined "$ARGV"
105 ;;
106 *)
107 default_do_upgrade "$ARGV"
108 ;;
109 esac
110 }
111
112 disable_watchdog() {
113 v "killing watchdog"
114 killall watchdog
115 ( ps | grep -v 'grep' | grep '/dev/watchdog' ) && {
116 echo 'Could not disable watchdog'
117 return 1
118 }
119 }
120
121 # CONFIG_WATCHDOG_NOWAYOUT=y - can't kill watchdog unless kernel cmdline has a mpcore_wdt.nowayout=0
122 #append sysupgrade_pre_upgrade disable_watchdog