aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ipq806x/base-files/lib/upgrade/asrock.sh
blob: 8be737d2dad915bb5b1f5502de6e05b9fb5b91e8 (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
. /lib/functions.sh

asrock_bootconfig_mangle() {
	local mtdnum="$(find_mtd_index 0:bootconfig)"
	# XXX: drop upper case after kernel v5.4 is gone (qcom-smem)
	[ -n "$mtdnum" ] || mtdnum="$(find_mtd_index 0:BOOTCONFIG)"

	if [ -z "$mtdnum" ]; then
		echo "cannot find bootconfig mtd partition"
		return 1
	fi
	dd if=/dev/mtd$mtdnum of=/tmp/mtd$mtdnum bs=1k

	local partition_byte="$(dd if=/tmp/mtd$mtdnum bs=1 skip=52 count=1)"
	local upgrade_byte="$(dd if=/tmp/mtd$mtdnum bs=1 skip=4 count=1)"

	if [ $1 = "bootcheck" ]; then
		if [ ! -s $upgrade_byte ]; then
			dd if=/dev/mtd$mtdnum of=/tmp/mtd$mtdnum bs=1k
			printf '\x00' | dd of=/tmp/mtd$mtdnum conv=notrunc bs=1 seek=4
			printf '\x00' | dd of=/tmp/mtd$mtdnum conv=notrunc bs=1 seek=56
		else
			return 1
		fi
	elif [ $1 = "sysupgrade" ]; then
		printf '\x01' | dd of=/tmp/mtd$mtdnum conv=notrunc bs=1 seek=4
		printf '\x01' | dd of=/tmp/mtd$mtdnum conv=notrunc bs=1 seek=56
	fi

	if [ -s $partition_byte ]; then
		printf '\x01' | dd of=/tmp/mtd$mtdnum conv=notrunc bs=1 seek=52
	else
		printf '\x00' | dd of=/tmp/mtd$mtdnum conv=notrunc bs=1 seek=52
	fi

	mtd write /tmp/mtd$mtdnum /dev/mtd$mtdnum
	return 0
}

asrock_upgrade_prepare() {
	local ubidev="$( nand_find_ubi ubi )"

	#Set upgrade flag. If something goes wrong, router will boot with
	#factory firmware.
	asrock_bootconfig_mangle 'sysupgrade'

	if [ $? -ne 0 ]; then
		echo "cannot find bootconfig mtd partition"
		exit 1
	fi

	# Just delete these partitions if present and use
	# OpenWrt's standard names for those.
	ubirmvol /dev/$ubidev -N ubi_rootfs &> /dev/null || true
	ubirmvol /dev/$ubidev -N ubi_rootfs_data &> /dev/null || true
}