summaryrefslogtreecommitdiffstats
path: root/target/linux/ar71xx/base-files/lib/upgrade/merakinand.sh
blob: cc7a86c93d74181d8218fe3fbe0de8cef675b4c5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/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

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
}