diff options
Diffstat (limited to 'target/linux/ar71xx/base-files/lib/upgrade')
-rw-r--r-- | target/linux/ar71xx/base-files/lib/upgrade/merakinand.sh | 137 | ||||
-rwxr-xr-x | target/linux/ar71xx/base-files/lib/upgrade/platform.sh | 7 |
2 files changed, 144 insertions, 0 deletions
diff --git a/target/linux/ar71xx/base-files/lib/upgrade/merakinand.sh b/target/linux/ar71xx/base-files/lib/upgrade/merakinand.sh new file mode 100644 index 0000000000..fe78e9ff96 --- /dev/null +++ b/target/linux/ar71xx/base-files/lib/upgrade/merakinand.sh @@ -0,0 +1,137 @@ +#!/bin/sh +# +# Copyright (C) 2015 Chris Blake <chrisrblake93@gmail.com> +# +# Custom upgrade script for Meraki NAND devices (ex. MR18) +# Based on dir825.sh and stock nand functions +# +. /lib/ar71xx.sh +. /lib/functions.sh +. /lib/upgrade/nand.sh + +get_magic_at() { + local mtddev=$1 + local pos=$2 + dd bs=1 count=2 skip=$pos if=$mtddev 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"' +} + +mr18_is_caldata_valid() { + local mtddev=$1 + local magic + + magic=$(get_magic_at $mtddev 4096) + [ "$magic" != "0202" ] && return 0 + + magic=$(get_magic_at $mtddev 20480) + [ "$magic" != "0202" ] && return 0 + + magic=$(get_magic_at $mtddev 36864) + [ "$magic" != "0202" ] && return 0 + + return 1 +} + +merakinand_copy_caldata() { + local cal_src=$1 + local cal_dst=$2 + local ubidev=$( nand_find_ubi $CI_UBIPART ) + local board_name="$(cat /tmp/sysinfo/board_name)" + local rootfs_size="$(ubinfo /dev/ubi0 -N rootfs_data | grep "Size" | awk '{ print $6 }')" + + # Setup partitions using board name, in case of future platforms + case "$board_name" in + "mr18") + # Src is MTD + mtd_src=$(find_mtd_chardev $cal_src) + [ -n "$mtd_src" ] || { + echo "no mtd device found for partition $cal_src" + exit 1 + } + + # Dest is UBI + # TODO: possibly add create (hard to do when rootfs_data is expanded & mounted) + # Would need to be done from ramdisk + mtd_dst="$(nand_find_volume $ubidev $cal_dst)" + [ -n "$mtd_dst" ] || { + echo "no ubi device found for partition $cal_dst" + exit 1 + } + + mr18_is_caldata_valid "$mtd_src" && { + echo "no valid calibration data found in $cal_src" + exit 1 + } + + mr18_is_caldata_valid "/dev/$mtd_dst" && { + echo "Copying calibration data from $cal_src to $cal_dst..." + dd if="$mtd_src" of=/tmp/caldata.tmp 2>/dev/null + ubiupdatevol "/dev/$mtd_dst" /tmp/caldata.tmp + rm /tmp/caldata.tmp + sync + } + return 0 + ;; + *) + echo "Unsupported device $board_name"; + return 1 + ;; + esac +} + +merakinand_do_kernel_check() { + local board_name="$1" + local tar_file="$2" + local image_magic_word=`(tar xf $tar_file sysupgrade-$board_name/kernel -O 2>/dev/null | dd bs=1 count=4 skip=0 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"')` + + # What is our kernel magic string? + case "$board_name" in + "mr18") + [ "$image_magic_word" == "8e73ed8a" ] && { + echo "pass" && return 0 + } + ;; + esac + + exit 1 +} + +merakinand_do_platform_check() { + local board_name="$1" + local tar_file="$2" + local control_length=`(tar xf $tar_file sysupgrade-$board_name/CONTROL -O | wc -c) 2> /dev/null` + local file_type="$(identify_tar $2 sysupgrade-$board_name/root)" + local kernel_magic="$(merakinand_do_kernel_check $1 $2)" + + case "$board_name" in + "mr18") + [ "$control_length" = 0 -o "$file_type" != "squashfs" -o "$kernel_magic" != "pass" ] && { + echo "Invalid sysupgrade file for $board_name" + return 1 + } + ;; + *) + echo "Unsupported device $board_name"; + return 1 + ;; + esac + + return 0 +} + +merakinand_do_upgrade() { + local tar_file="$1" + local board_name="$(cat /tmp/sysinfo/board_name)" + + # Do we need to do any platform tweaks? + case "$board_name" in + "mr18") + # Check and create UBI caldata if it's invalid + merakinand_copy_caldata "odm-caldata" "caldata" + nand_do_upgrade $1 + ;; + *) + echo "Unsupported device $board_name"; + exit 1 + ;; + esac +} diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh index 5ec4499b73..bb64ef81bc 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -434,6 +434,10 @@ platform_check_image() { } return 0 ;; + mr18) + merakinand_do_platform_check $board $1 + return $?; + ;; nbg6716 | \ r6100 | \ wndr3700v4 | \ @@ -494,6 +498,9 @@ platform_pre_upgrade() { wndr4300 ) nand_do_upgrade "$1" ;; + mr18) + merakinand_do_upgrade "$1" + ;; esac } |