diff options
| author | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2012-10-17 22:03:46 +0000 | 
|---|---|---|
| committer | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2012-10-17 22:03:46 +0000 | 
| commit | dda0ebc3e243958a1826465dcbcc43af9e307c2d (patch) | |
| tree | 37f45c7515fc1ac56f858075a644b3671f2a81c2 /target | |
| parent | 287a1bf65ae5609467bf4f13a2641d56bddd04a1 (diff) | |
ixp4xx: add sysupgrade support
Signed-off-by: Tim Harvey <tharvey@gateworks.com>
 target/linux/ixp4xx/base-files/lib/ixp4xx.sh           |   25 ++
 target/linux/ixp4xx/base-files/lib/upgrade/platform.sh |  156 +++++++++++++++++
 target/linux/ixp4xx/image/Makefile                     |   11 +
 3 files changed, 192 insertions(+)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@33828 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target')
| -rw-r--r-- | target/linux/ixp4xx/base-files/lib/ixp4xx.sh | 25 | ||||
| -rw-r--r-- | target/linux/ixp4xx/base-files/lib/upgrade/platform.sh | 156 | ||||
| -rw-r--r-- | target/linux/ixp4xx/image/Makefile | 11 | 
3 files changed, 192 insertions, 0 deletions
diff --git a/target/linux/ixp4xx/base-files/lib/ixp4xx.sh b/target/linux/ixp4xx/base-files/lib/ixp4xx.sh new file mode 100644 index 000000000..f7a6b76ed --- /dev/null +++ b/target/linux/ixp4xx/base-files/lib/ixp4xx.sh @@ -0,0 +1,25 @@ +#!/bin/sh +# +# Copyright (C) 2012 OpenWrt.org +# + +ixp4xx_board_name() { +        local machine +        local name + +        machine=$(awk 'BEGIN{FS="[ \t]+:[ \t]"} /Hardware/ {print $2}' /proc/cpuinfo) + +        case "$machine" in +		"Gateworks Cambria"*) +			name="cambria" +			;; +		"Gateworks Avila"*) +			name="avila" +			;; +		*) +			name="generic"; +			;; +	esac + +	echo $name +} diff --git a/target/linux/ixp4xx/base-files/lib/upgrade/platform.sh b/target/linux/ixp4xx/base-files/lib/upgrade/platform.sh new file mode 100644 index 000000000..63be29315 --- /dev/null +++ b/target/linux/ixp4xx/base-files/lib/upgrade/platform.sh @@ -0,0 +1,156 @@ +. /lib/ixp4xx.sh + +RAMFS_COPY_DATA="/lib/ixp4xx.sh" + +# testing +RAMFS_COPY_BIN="/usr/bin/less /usr/bin/hexdump" + +CI_BLKSZ=65536 +CI_LDADR=0x00800000 + +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_find_part_size() { +	local first dev size erasesize name +	while read dev size erasesize name; do +		name=${name#'"'}; name=${name%'"'} +		[ "$name" = "$1" ] && { +			echo "$size" +			break +		} +	done < /proc/mtd +} + +platform_do_upgrade_combined() { +	local partitions=$(platform_find_partitions) +	local kernelpart=$(platform_find_kernelpart "${partitions#*:}") +	local erase_size=$((0x${partitions%%:*})); partitions="${partitions#*:}" +	local kern_part_size=0x$(platform_find_part_size "$kernelpart") +	local kern_part_blocks=$(($kern_part_size / $CI_BLKSZ)) +	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)) + +	v "platform_do_upgrade_combined" +	v "partitions=$partitions" +	v "kernelpart=$kernelpart" +	v "kernel_part_size=$kern_part_size" +	v "kernel_part_blocks=$kern_part_blocks" +	v "kern_length=$kern_length" +	v "erase_size=$erase_size"  +	v "kern_blocks=$kern_blocks" +	v "root_blocks=$root_blocks" +	v "kern_pad_blocks=$(($kern_part_blocks-$kern_blocks))" + +	if [ -n "$partitions" ] && [ -n "$kernelpart" ] && \ +	   [ ${kern_blocks:-0} -gt 0 ] && \ +	   [ ${root_blocks:-0} -gt 0 ] && \ +	   [ ${erase_size:-0} -gt 0 ]; +	then +		local append="" +		[ -f "$CONF_TAR" -a "$SAVE_CONFIG" -eq 1 ] && append="-j $CONF_TAR" + +		# write the kernel +		dd if="$1" bs=$CI_BLKSZ skip=1 count=$kern_blocks 2>/dev/null | \ +			mtd -F$kernelpart:$kern_part_size:$CI_LDADR write - $kernelpart +		# write the rootfs +		dd if="$1" bs=$CI_BLKSZ skip=$((1+$kern_blocks)) count=$root_blocks 2>/dev/null | \ +			mtd $append write - rootfs +	else +		echo "invalid image" +	fi +} + +platform_check_image() { +	local board=$(ixp4xx_board_name) +	local magic="$(get_magic_word "$1")" +	local partitions=$(platform_find_partitions) +	local kernelpart=$(platform_find_kernelpart "${partitions#*:}") +	local kern_part_size=0x$(platform_find_part_size "$kernelpart") +	local kern_length=0x$(dd if="$1" bs=2 skip=1 count=4 2>/dev/null) + +	[ "$ARGC" -gt 1 ] && return 1 + +	case "$board" in +	avila | cambria ) +		[ "$magic" != "4349" ] && { +			echo "Invalid image. Use *-sysupgrade.bin files on this board" +			return 1 +		} + +		kern_length_b=$(printf '%d' $kern_length) +		kern_part_size_b=$(printf '%d' $kern_part_size) +		if [ $kern_length_b -gt $kern_part_size_b ]; then +			echo "Invalid image. Kernel size ($kern_length) exceeds kernel partition ($kern_part_size)" +			return 1 +		fi  + +		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 +} + +platform_do_upgrade() { +	local board=$(ixp4xx_board_name) + +	v "board=$board" +	case "$board" in +	avila | cambria ) +		platform_do_upgrade_combined "$ARGV" +		;; +	*) +		default_do_upgrade "$ARGV" +		;; +	esac +} + +disable_watchdog() { +	v "killing watchdog" +	killall watchdog +	( ps | grep -v 'grep' | grep '/dev/watchdog' ) && { +		echo 'Could not disable watchdog' +		return 1 +	} +} + +# CONFIG_WATCHDOG_NOWAYOUT=y - can't kill watchdog unless kernel cmdline has a mpcore_wdt.nowayout=0 +#append sysupgrade_pre_upgrade disable_watchdog diff --git a/target/linux/ixp4xx/image/Makefile b/target/linux/ixp4xx/image/Makefile index 7a6999827..30e5b1249 100644 --- a/target/linux/ixp4xx/image/Makefile +++ b/target/linux/ixp4xx/image/Makefile @@ -40,8 +40,19 @@ define Image/BuildKernel  	BIN_DIR=$(BIN_DIR) IMG_PREFIX="$(IMG_PREFIX)" $(TOPDIR)/scripts/arm-magic.sh  endef +# Build sysupgrade image +define BuildFirmware/Generic +	dd if=$(KDIR)/zImage of=$(KDIR)/zImage.pad bs=64k conv=sync; \ +	dd if=$(KDIR)/root.$(1) of=$(KDIR)/root.$(1).pad bs=128k conv=sync; \ +	sh $(TOPDIR)/scripts/combined-image.sh \ +		$(KDIR)/zImage.pad \ +		$(KDIR)/root.$(1).pad \ +		$(BIN_DIR)/$(IMG_PREFIX)-$(patsubst jffs2-%,jffs2,$(patsubst squashfs-%,squashfs,$(1)))-sysupgrade.bin +endef +  define Image/Build  	$(call Image/Build/$(1),$(1)) +	$(call BuildFirmware/Generic,$(1))  endef  define Image/Build/jffs2-64k  | 
