diff options
Diffstat (limited to 'target/linux')
| -rwxr-xr-x | target/linux/ar71xx/base-files/lib/upgrade/platform.sh | 84 | ||||
| -rw-r--r-- | target/linux/ar71xx/image/Makefile | 11 | 
2 files changed, 93 insertions, 2 deletions
| diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh index c4c56afdd..ef84e8469 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -7,6 +7,60 @@  PART_NAME=firmware  RAMFS_COPY_DATA=/lib/ar71xx.sh +CI_BLKSZ=65536 +CI_LDADR=0x80060000 + +platform_find_partitions() { +	local first dev size erasesize name +	while read dev size erasesize name; do +		name=${name#'"'}; name=${name%'"'} +		case "$name" in +			vmlinux.bin.l7|kernel|linux|rootfs) +				if [ -z "$first" ]; then +					first="$name" +				else +					echo "$erasesize:$first:$name" +					break +				fi +			;; +		esac +	done < /proc/mtd +} + +platform_find_kernelpart() { +	local part +	for part in "${1%:*}" "${1#*:}"; do +		case "$part" in +			vmlinux.bin.l7|kernel|linux) +				echo "$part" +				break +			;; +		esac +	done +} + +platform_do_upgrade_combined() { +	local partitions=$(platform_find_partitions) +	local kernelpart=$(platform_find_kernelpart "${partitions#*:}") +	local erase_size=$((0x${partitions%%:*})); partitions="${partitions#*:}" +	local kern_length=0x$(dd if="$1" bs=2 skip=1 count=4 2>/dev/null) +	local kern_blocks=$(($kern_length / $CI_BLKSZ)) +	local root_blocks=$((0x$(dd if="$1" bs=2 skip=5 count=4 2>/dev/null) / $CI_BLKSZ)) + +	if [ -n "$partitions" ] && [ -n "$kernelpart" ] && \ +	   [ ${kern_blocks:-0} -gt 0 ] && \ +	   [ ${root_blocks:-0} -gt ${kern_blocks:-0} ] && \ +	   [ ${erase_size:-0} -gt 0 ]; +	then +		local append="" +		[ -f "$CONF_TAR" -a "$SAVE_CONFIG" -eq 1 ] && append="-j $CONF_TAR" + +		( dd if="$1" bs=$CI_BLKSZ skip=1 count=$kern_blocks 2>/dev/null; \ +		  dd if="$1" bs=$CI_BLKSZ skip=$((1+$kern_blocks)) count=$root_blocks 2>/dev/null ) | \ +			mtd -r $append -F$kernelpart:$kern_length:$CI_LDADR,rootfs write - $partitions +	fi +} +  platform_check_image() {  	local board=$(ar71xx_board_name)  	local magic="$(get_magic_word "$1")" @@ -35,13 +89,41 @@ platform_check_image() {  		}  		return 0  		;; +	routerstation | routerstation-pro | ls-sr71) +		[ "$magic" != "4349" ] && { +			echo "Invalid image. Use *-sysupgrade.bin files on this board" +			return 1 +		} + +		local md5_img=$(dd if="$1" bs=2 skip=9 count=16 2>/dev/null) +		local md5_chk=$(dd if="$1" bs=$CI_BLKSZ skip=1 2>/dev/null | md5sum -); md5_chk="${md5_chk%% *}" + +		if [ -n "$md5_img" -a -n "$md5_chk" ] && [ "$md5_img" = "$md5_chk" ]; then +			return 0 +		else +			echo "Invalid image. Contents do not match checksum (image:$md5_img calculated:$md5_chk)" +			return 1 +		fi +		return 0 +		;;  	esac  	echo "Sysupgrade is not yet supported on $board."  	return 1  } -# use default for platform_do_upgrade() +platform_do_upgrade() { +	local board=$(ar71xx_board_name) + +	case "$board" in +	routerstation | routerstation-pro) +		platform_do_upgrade_combined "$ARGV" +		;; +	*) +		default_do_upgrade "$ARGV" +		;; +	esac +}  disable_watchdog() {  	killall watchdog diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile index 24b1fa36a..30663f12c 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -161,7 +161,11 @@ define Image/Build/UBNT  		-B $(4) -v $(5).$(6).OpenWrt.$(REVISION) \  		-k $(KDIR)/vmlinux-$(2).lzma \  		-r $(BIN_DIR)/openwrt-$(BOARD)-root.$(1) \ -		-o $(call imgname,$(1),$(2)).bin +		-o $(call imgname,$(1),$(2))-factory.bin +	-sh $(TOPDIR)/scripts/combined-image.sh \ +		"$(KDIR)/vmlinux-$(2).lzma" \ +		"$(BIN_DIR)/openwrt-$(BOARD)-root.$(1)" \ +		$(call imgname,$(1),$(2))-sysupgrade.bin  endef  define Image/Build/Planex @@ -431,6 +435,11 @@ endef  define Image/Build/squashfs  	$(call prepare_generic_squashfs,$(KDIR)/root.squashfs) +	dd if=$(KDIR)/root.squashfs of=$(KDIR)/root.squashfs-4k.tmp0 bs=4k conv=sync +	$(call add_jffs2_mark,$(KDIR)/root.squashfs-4k.tmp0) +	dd if=$(KDIR)/root.squashfs-4k.tmp0 of=$(IMGNAME)-root.squashfs-4k bs=4k conv=sync +	$(call add_jffs2_mark,$(IMGNAME)-root.squashfs-4k) +	rm -f $(KDIR)/root.squashfs-4k.tmp0  endef  define Image/Build | 
