OpenWrt – Blame information for rev 4
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
4 | office | 1 | # The U-Boot loader of the OpenMesh devices requires image sizes and |
2 | # checksums to be provided in the U-Boot environment. |
||
3 | # The OpenMesh devices come with 2 main partitions - while one is active |
||
4 | # sysupgrade will flash the other. The boot order is changed to boot the |
||
5 | # newly flashed partition. If the new partition can't be booted due to |
||
6 | # upgrade failures the previously used partition is loaded. |
||
7 | |||
8 | trim() |
||
9 | { |
||
10 | echo $1 |
||
11 | } |
||
12 | |||
13 | cfg_value_get() |
||
14 | { |
||
15 | local cfg=$1 cfg_opt |
||
16 | local section=$2 our_section=0 |
||
17 | local param=$3 our_param= |
||
18 | |||
19 | for cfg_opt in $cfg |
||
20 | do |
||
21 | [ "$cfg_opt" = "[$section]" ] && our_section=1 && continue |
||
22 | [ "$our_section" = "1" ] || continue |
||
23 | |||
24 | our_param=$(echo ${cfg_opt%%=*}) |
||
25 | [ "$param" = "$our_param" ] && echo ${cfg_opt##*=} && break |
||
26 | done |
||
27 | } |
||
28 | |||
29 | # make sure we got uboot-envtools and fw_env.config copied over to the ramfs |
||
30 | # create /var/lock for the lock "fw_setenv.lock" of fw_setenv |
||
31 | platform_add_ramfs_ubootenv() |
||
32 | { |
||
33 | [ -e /usr/sbin/fw_printenv ] && install_bin /usr/sbin/fw_printenv /usr/sbin/fw_setenv |
||
34 | [ -e /etc/fw_env.config ] && install_file /etc/fw_env.config |
||
35 | mkdir -p $RAM_ROOT/var/lock |
||
36 | } |
||
37 | append sysupgrade_pre_upgrade platform_add_ramfs_ubootenv |
||
38 | |||
39 | platform_check_image_target_openmesh() |
||
40 | { |
||
41 | img_board_target="$1" |
||
42 | |||
43 | case "$img_board_target" in |
||
44 | A60) |
||
45 | [ "$board" = "a40" ] && return 0 |
||
46 | [ "$board" = "a60" ] && return 0 |
||
47 | echo "Invalid image board target ($img_board_target) for this platform: $board. Use the correct image for this platform" |
||
48 | return 1 |
||
49 | ;; |
||
50 | OM2P) |
||
51 | [ "$board" = "om2p" ] && return 0 |
||
52 | [ "$board" = "om2pv2" ] && return 0 |
||
53 | [ "$board" = "om2pv4" ] && return 0 |
||
54 | [ "$board" = "om2p-lc" ] && return 0 |
||
55 | [ "$board" = "om2p-hs" ] && return 0 |
||
56 | [ "$board" = "om2p-hsv2" ] && return 0 |
||
57 | [ "$board" = "om2p-hsv3" ] && return 0 |
||
58 | [ "$board" = "om2p-hsv4" ] && return 0 |
||
59 | echo "Invalid image board target ($img_board_target) for this platform: $board. Use the correct image for this platform" |
||
60 | return 1 |
||
61 | ;; |
||
62 | OM5P) |
||
63 | [ "$board" = "om5p" ] && return 0 |
||
64 | [ "$board" = "om5p-an" ] && return 0 |
||
65 | echo "Invalid image board target ($img_board_target) for this platform: $board. Use the correct image for this platform" |
||
66 | return 1 |
||
67 | ;; |
||
68 | OM5PAC) |
||
69 | [ "$board" = "om5p-ac" ] && return 0 |
||
70 | [ "$board" = "om5p-acv2" ] && return 0 |
||
71 | echo "Invalid image board target ($img_board_target) for this platform: $board. Use the correct image for this platform" |
||
72 | return 1 |
||
73 | ;; |
||
74 | MR1750) |
||
75 | [ "$board" = "mr1750" ] && return 0 |
||
76 | [ "$board" = "mr1750v2" ] && return 0 |
||
77 | echo "Invalid image board target ($img_board_target) for this platform: $board. Use the correct image for this platform" |
||
78 | return 1 |
||
79 | ;; |
||
80 | MR600) |
||
81 | [ "$board" = "mr600" ] && return 0 |
||
82 | [ "$board" = "mr600v2" ] && return 0 |
||
83 | echo "Invalid image board target ($img_board_target) for this platform: $board. Use the correct image for this platform" |
||
84 | return 1 |
||
85 | ;; |
||
86 | MR900) |
||
87 | [ "$board" = "mr900" ] && return 0 |
||
88 | [ "$board" = "mr900v2" ] && return 0 |
||
89 | echo "Invalid image board target ($img_board_target) for this platform: $board. Use the correct image for this platform" |
||
90 | return 1 |
||
91 | ;; |
||
92 | *) |
||
93 | echo "Invalid board target ($img_board_target). Use the correct image for this platform" |
||
94 | return 1 |
||
95 | ;; |
||
96 | esac |
||
97 | } |
||
98 | |||
99 | platform_check_image_openmesh() |
||
100 | { |
||
101 | local img_magic=$1 |
||
102 | local img_path=$2 |
||
103 | local fw_printenv=/usr/sbin/fw_printenv |
||
104 | local img_board_target= img_num_files= i=0 |
||
105 | local cfg_name= kernel_name= rootfs_name= |
||
106 | |||
107 | case "$img_magic" in |
||
108 | # Combined Extended Image v1 |
||
109 | 43453031) |
||
110 | img_board_target=$(trim $(dd if="$img_path" bs=4 skip=1 count=8 2>/dev/null)) |
||
111 | img_num_files=$(trim $(dd if="$img_path" bs=2 skip=18 count=1 2>/dev/null)) |
||
112 | ;; |
||
113 | *) |
||
114 | echo "Invalid image ($img_magic). Use combined extended images on this platform" |
||
115 | return 1 |
||
116 | ;; |
||
117 | esac |
||
118 | |||
119 | platform_check_image_target_openmesh "$img_board_target" || return 1 |
||
120 | |||
121 | [ $img_num_files -lt 3 ] && { |
||
122 | echo "Invalid number of embedded images ($img_num_files). Use the correct image for this platform" |
||
123 | return 1 |
||
124 | } |
||
125 | |||
126 | cfg_name=$(trim $(dd if="$img_path" bs=2 skip=19 count=16 2>/dev/null)) |
||
127 | |||
128 | [ "$cfg_name" != "fwupgrade.cfg" ] && { |
||
129 | echo "Invalid embedded config file ($cfg_name). Use the correct image for this platform" |
||
130 | return 1 |
||
131 | } |
||
132 | |||
133 | kernel_name=$(trim $(dd if="$img_path" bs=2 skip=55 count=16 2>/dev/null)) |
||
134 | |||
135 | [ "$kernel_name" != "kernel" ] && { |
||
136 | echo "Invalid embedded kernel file ($kernel_name). Use the correct image for this platform" |
||
137 | return 1 |
||
138 | } |
||
139 | |||
140 | rootfs_name=$(trim $(dd if="$img_path" bs=2 skip=91 count=16 2>/dev/null)) |
||
141 | |||
142 | [ "$rootfs_name" != "rootfs" ] && { |
||
143 | echo "Invalid embedded kernel file ($rootfs_name). Use the correct image for this platform" |
||
144 | return 1 |
||
145 | } |
||
146 | |||
147 | [ ! -x "$fw_printenv" ] && { |
||
148 | echo "Please install uboot-envtools!" |
||
149 | return 1 |
||
150 | } |
||
151 | |||
152 | [ ! -r "/etc/fw_env.config" ] && { |
||
153 | echo "/etc/fw_env.config is missing" |
||
154 | return 1 |
||
155 | } |
||
156 | |||
157 | return 0 |
||
158 | } |
||
159 | |||
160 | platform_do_upgrade_openmesh() |
||
161 | { |
||
162 | local img_path=$1 img_board_target= |
||
163 | local kernel_start_addr= kernel_start_addr1= kernel_start_addr2= |
||
164 | local kernel_size= kernel_md5= |
||
165 | local rootfs_size= rootfs_checksize= rootfs_md5= |
||
166 | local kernel_bsize= total_size= |
||
167 | local data_offset=$((64 * 1024)) block_size= offset= |
||
168 | local uboot_env_upgrade="/tmp/fw_env_upgrade" |
||
169 | local cfg_size= kernel_size= rootfs_size= |
||
170 | local append="" |
||
171 | |||
172 | [ -f "$CONF_TAR" -a "$SAVE_CONFIG" -eq 1 ] && append="-j $CONF_TAR" |
||
173 | |||
174 | cfg_size=$(dd if="$img_path" bs=2 skip=35 count=4 2>/dev/null) |
||
175 | kernel_size=$(dd if="$img_path" bs=2 skip=71 count=4 2>/dev/null) |
||
176 | rootfs_size=$(dd if="$img_path" bs=2 skip=107 count=4 2>/dev/null) |
||
177 | |||
178 | img_board_target=$(trim $(dd if="$img_path" bs=4 skip=1 count=8 2>/dev/null)) |
||
179 | cfg_content=$(dd if="$img_path" bs=1 skip=$data_offset count=$(echo $((0x$cfg_size))) 2>/dev/null) |
||
180 | |||
181 | case $img_board_target in |
||
182 | OM2P) |
||
183 | block_size=$((256 * 1024)) |
||
184 | total_size=7340032 |
||
185 | kernel_start_addr1=0x9f1c0000 |
||
186 | kernel_start_addr2=0x9f8c0000 |
||
187 | ;; |
||
188 | OM5P|OM5PAC|MR600|MR900|MR1750|A60) |
||
189 | block_size=$((64 * 1024)) |
||
190 | total_size=7995392 |
||
191 | kernel_start_addr1=0x9f0b0000 |
||
192 | kernel_start_addr2=0x9f850000 |
||
193 | ;; |
||
194 | esac |
||
195 | |||
196 | kernel_md5=$(cfg_value_get "$cfg_content" "vmlinux" "md5sum") |
||
197 | rootfs_md5=$(cfg_value_get "$cfg_content" "rootfs" "md5sum") |
||
198 | rootfs_checksize=$(cfg_value_get "$cfg_content" "rootfs" "checksize") |
||
199 | |||
200 | if [ "$((0x$kernel_size % $block_size))" = "0" ] |
||
201 | then |
||
202 | kernel_bsize=$(echo $((0x$kernel_size))) |
||
203 | else |
||
204 | kernel_bsize=$((0x$kernel_size + ($block_size - (0x$kernel_size % $block_size)))) |
||
205 | fi |
||
206 | |||
207 | mtd -q erase inactive |
||
208 | |||
209 | offset=$(echo $(($data_offset + 0x$cfg_size + 0x$kernel_size))) |
||
210 | dd if="$img_path" bs=1 skip=$offset count=$(echo $((0x$rootfs_size))) 2>&- | mtd -n -p $kernel_bsize $append write - "inactive" |
||
211 | |||
212 | offset=$(echo $(($data_offset + 0x$cfg_size))) |
||
213 | dd if="$img_path" bs=1 skip=$offset count=$(echo $((0x$kernel_size))) 2>&- | mtd -n write - "inactive" |
||
214 | |||
215 | rm $uboot_env_upgrade 2>&- |
||
216 | |||
217 | if [ "$(grep 'mtd3:.*inactive' /proc/mtd)" ] |
||
218 | then |
||
219 | printf "kernel_size_1 %u\n" $(($kernel_bsize / 1024)) >> $uboot_env_upgrade |
||
220 | printf "rootfs_size_1 %u\n" $((($total_size - $kernel_bsize) / 1024)) >> $uboot_env_upgrade |
||
221 | printf "bootseq 1,2\n" >> $uboot_env_upgrade |
||
222 | kernel_start_addr=$kernel_start_addr1 |
||
223 | else |
||
224 | printf "kernel_size_2 %u\n" $(($kernel_bsize / 1024)) >> $uboot_env_upgrade |
||
225 | printf "rootfs_size_2 %u\n" $((($total_size - $kernel_bsize) / 1024)) >> $uboot_env_upgrade |
||
226 | printf "bootseq 2,1\n" >> $uboot_env_upgrade |
||
227 | kernel_start_addr=$kernel_start_addr2 |
||
228 | fi |
||
229 | |||
230 | printf "vmlinux_start_addr %s\n" $kernel_start_addr >> $uboot_env_upgrade |
||
231 | printf "vmlinux_size 0x%s\n" $kernel_size >> $uboot_env_upgrade |
||
232 | printf "vmlinux_checksum %s\n" $kernel_md5 >> $uboot_env_upgrade |
||
233 | printf "rootfs_start_addr 0x%x\n" $(($kernel_start_addr + $kernel_bsize)) >> $uboot_env_upgrade |
||
234 | printf "rootfs_size %s\n" $rootfs_checksize >> $uboot_env_upgrade |
||
235 | printf "rootfs_checksum %s\n" $rootfs_md5 >> $uboot_env_upgrade |
||
236 | |||
237 | fw_setenv -s $uboot_env_upgrade || { |
||
238 | echo "failed to update U-Boot environment" |
||
239 | return 1 |
||
240 | } |
||
241 | } |