aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ramips/base-files/lib
diff options
context:
space:
mode:
authorJohn Crispin <john@openwrt.org>2015-12-12 07:38:06 +0000
committerJohn Crispin <john@openwrt.org>2015-12-12 07:38:06 +0000
commit4e31b2e8697c21f9bd6493bb3d78a4a41c6a9a52 (patch)
tree1ef1d0d138704432e687b6b71c617ab8da3ca094 /target/linux/ramips/base-files/lib
parent1c6c9549d633f2e0b435c3689d15f44140975bd0 (diff)
downloadupstream-4e31b2e8697c21f9bd6493bb3d78a4a41c6a9a52.tar.gz
upstream-4e31b2e8697c21f9bd6493bb3d78a4a41c6a9a52.tar.bz2
upstream-4e31b2e8697c21f9bd6493bb3d78a4a41c6a9a52.zip
ramips: add support for Ubiquiti EdgeRouter X (UBNT-ERX)
This router is based on MT7621 SoC, no wifi, no usb, nand. Works: * Boots. * Ethernet. * Switch. * Button (reset). * Flashing OpenWrt from stock firmware. * Upgrading OpenWrt. Doesn't work: * No GPIO leds. All leds are controlled by switch, but stock firmware was able to control them. * SoC has crypto engine but no open driver. * SoC has nat acceleration, but no open driver. * This router has 2MB spi flash soldered in but MT nand/spi drivers do not support pin sharing, so it is not accessable and disabled. Stock firmware could read it and it was empty. * PoE out. Router has serial pins populated. If looking at the top of the router, then counting from Eth sockets pins go as: 'GND, RX, TX, GND'. 3.3v, 57600. U-boot bootloader supports tftpboot, controlled from serial. This router has two kernel partitions: 'live' and 'backup'. They are swapped during flashing (on both stock and OpenWrt). Active partition is controlled by a flag in a factory partition. U-boot has custom command to switch active kernel partition. Kernel partitions are 'bare flash' 3MB. Stock bootloader has no UBI support. Stock rootfs is UBIFS. Flashing procedure. Stock firmware uses custom kernel patch to mount squashfs from a file that is located on UBIFS volume. This makes wiping out this volume from within stock firmware difficult. Instead this patch builds image that is flashable by stock firmware and contains initrams image (with minimal set of packages to fit into kernel partition). Once this is flashed one can reboot into initramfs OpenWrt and use sysupgrade to flash OpenWrt including rootfs into nand. Note: factory image is only built if initramfs image is enabled. Signed-off-by: Nikolay Martynov <mar.kolya@gmail.com> SVN-Revision: 47881
Diffstat (limited to 'target/linux/ramips/base-files/lib')
-rwxr-xr-xtarget/linux/ramips/base-files/lib/ramips.sh5
-rwxr-xr-xtarget/linux/ramips/base-files/lib/upgrade/platform.sh24
-rw-r--r--target/linux/ramips/base-files/lib/upgrade/ubnt.sh76
3 files changed, 104 insertions, 1 deletions
diff --git a/target/linux/ramips/base-files/lib/ramips.sh b/target/linux/ramips/base-files/lib/ramips.sh
index c002b975d7..62be04540e 100755
--- a/target/linux/ramips/base-files/lib/ramips.sh
+++ b/target/linux/ramips/base-files/lib/ramips.sh
@@ -349,6 +349,9 @@ ramips_board_detect() {
*"TEW-692GR")
name="tew-692gr"
;;
+ *"UBNT-ERX")
+ name="ubnt-erx"
+ ;;
*"UR-326N4G")
name="ur-326n4g"
;;
@@ -399,7 +402,7 @@ ramips_board_detect() {
;;
*"WizFi630A")
name="wizfi630a"
- ;;
+ ;;
*"WL-330N")
name="wl-330n"
;;
diff --git a/target/linux/ramips/base-files/lib/upgrade/platform.sh b/target/linux/ramips/base-files/lib/upgrade/platform.sh
index 4ec3008b3e..f8073d19fe 100755
--- a/target/linux/ramips/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ramips/base-files/lib/upgrade/platform.sh
@@ -182,12 +182,36 @@ platform_check_image() {
}
return 0
;;
+ ubnt-erx)
+ nand_do_platform_check "$board" "$1"
+ return $?;
+ ;;
esac
echo "Sysupgrade is not yet supported on $board."
return 1
}
+platform_nand_pre_upgrade() {
+ local board=$(ramips_board_name)
+
+ case "$board" in
+ ubnt-erx)
+ platform_upgrade_ubnt_erx "$ARGV"
+ ;;
+ esac
+}
+
+platform_pre_upgrade() {
+ local board=$(ramips_board_name)
+
+ case "$board" in
+ ubnt-erx)
+ nand_do_upgrade "$ARGV"
+ ;;
+ esac
+}
+
platform_do_upgrade() {
local board=$(ramips_board_name)
diff --git a/target/linux/ramips/base-files/lib/upgrade/ubnt.sh b/target/linux/ramips/base-files/lib/upgrade/ubnt.sh
new file mode 100644
index 0000000000..316a70444f
--- /dev/null
+++ b/target/linux/ramips/base-files/lib/upgrade/ubnt.sh
@@ -0,0 +1,76 @@
+#
+# Copyright (C) 2015 OpenWrt.org
+#
+
+. /lib/functions.sh
+#Note: this code also uses some functions from nand.sh, but it is expected to be run by nand.sh, so we are not
+#sourcing it explicitly here
+
+UBNT_ERX_KERNEL_INDEX_OFFSET=160
+
+ubnt_get_target_kernel() {
+ local factory_mtd=$1
+ local current_kernel_index=$(hexdump -s $UBNT_ERX_KERNEL_INDEX_OFFSET -n 1 -e '/1 "%X "' ${factory_mtd})
+
+ if [ $current_kernel_index == "0" ]; then
+ echo 'kernel2'
+ elif [ $current_kernel_index == "1" ]; then
+ echo 'kernel1'
+ fi
+}
+
+ubnt_update_target_kernel() {
+ local factory_mtd=$1
+ local kernel_part=$2
+
+ local new_kernel_index
+ if [ $kernel_part == "kernel1" ]; then
+ new_kernel_index="\x00"
+ elif [ $kernel_part == "kernel2" ]; then
+ new_kernel_index="\x01"
+ else
+ echo 'Unknown kernel image index' >&2
+ return 1
+ fi
+
+ if ! (echo -e $new_kernel_index | dd of=${factory_mtd} bs=1 count=1 seek=$UBNT_ERX_KERNEL_INDEX_OFFSET); then
+ echo 'Failed to update kernel bootup index' >&2
+ return 1
+ fi
+}
+
+platform_upgrade_ubnt_erx() {
+ local factory_mtd=$(find_mtd_part factory)
+ if [ -z "$factory_mtd" ]; then
+ echo "cannot find factory partition" >&2
+ exit 1
+ fi
+
+ local kernel_part="$(ubnt_get_target_kernel ${factory_mtd})"
+ if [ -z "$kernel_part" ]; then
+ echo "cannot find factory partition" >&2
+ exit 1
+ fi
+
+ # This is a global defined in nand.sh, sets partition kernel will be flashed into
+ CI_KERNPART=${kernel_part}
+
+ #Remove volume possibly left over from stock firmware
+ local ubidev="$( nand_find_ubi "$CI_UBIPART" )"
+ if [ -z "$ubidev" ]; then
+ local mtdnum="$( find_mtd_index "$CI_UBIPART" )"
+ if [ -z "$mtdnum" ]; then
+ echo "cannot find ubi mtd partition $CI_UBIPART" >&2
+ exit 1
+ fi
+ ubiattach -m "$mtdnum"
+ sync
+ ubidev="$( nand_find_ubi "$CI_UBIPART" )"
+ fi
+ if [ -n "$ubidev" ]; then
+ local troot_ubivol="$( nand_find_volume $ubidev troot )"
+ [ -n "$troot_ubivol" ] && ubirmvol /dev/$ubidev -N troot || true
+ fi
+
+ ubnt_update_target_kernel ${factory_mtd} ${kernel_part} || exit 1
+}