From 716ca530e1c4515d8683c9d5be3d56b301758b66 Mon Sep 17 00:00:00 2001 From: James <> Date: Wed, 4 Nov 2015 11:49:21 +0000 Subject: trunk-47381 --- .../bcm53xx/base-files/etc/board.d/02_network | 70 +++++++ target/linux/bcm53xx/base-files/etc/diag.sh | 43 +++++ .../bcm53xx/base-files/etc/uci-defaults/09_fix_crc | 7 + .../lib/preinit/05_set_preinit_iface_bcm53xx | 7 + .../bcm53xx/base-files/lib/upgrade/platform.sh | 210 +++++++++++++++++++++ 5 files changed, 337 insertions(+) create mode 100755 target/linux/bcm53xx/base-files/etc/board.d/02_network create mode 100644 target/linux/bcm53xx/base-files/etc/diag.sh create mode 100644 target/linux/bcm53xx/base-files/etc/uci-defaults/09_fix_crc create mode 100644 target/linux/bcm53xx/base-files/lib/preinit/05_set_preinit_iface_bcm53xx create mode 100644 target/linux/bcm53xx/base-files/lib/upgrade/platform.sh (limited to 'target/linux/bcm53xx/base-files') diff --git a/target/linux/bcm53xx/base-files/etc/board.d/02_network b/target/linux/bcm53xx/base-files/etc/board.d/02_network new file mode 100755 index 0000000..a164251 --- /dev/null +++ b/target/linux/bcm53xx/base-files/etc/board.d/02_network @@ -0,0 +1,70 @@ +#!/bin/sh +# +# Copyright (C) 2011 OpenWrt.org +# + +. /lib/functions/uci-defaults-new.sh + +board_config_update + +board=$(cat /proc/device-tree/compatible | tr '\0' '\t' | cut -f 1) +case "$board" in +asus,rt-ac87u) + ifname=eth1 + ;; +netgear,r8000) + ifname=eth2 + ;; +*) + ifname=eth0 + ;; +esac + +# Workaround for devices using eth2 +case "$board" in +netgear,r8000) + ifname=eth0 + ;; +esac + +ucidef_set_interface_loopback +ucidef_set_interfaces_lan_wan "$ifname.1" "$ifname.2" +ucidef_add_switch "switch0" "1" "1" + +# Workaround for devices using CPU port 8 (connected to eth2) +case "$board" in +netgear,r8000) + ucidef_add_switch_vlan "switch0" "1" "0 1 2 3 5t" + ucidef_add_switch_vlan "switch0" "2" "4 5t" + board_config_flush + exit 0 + ;; +esac + +# NVRAM entries may contain unsorted ports, e.g. Netgear R6250 uses +# vlan1ports=3 2 1 0 5* +# vlan2ports=4 5u +# and early Netgear R8000 was using +# vlan1ports=3 2 1 0 5 7 8* +vlan1ports="$(echo $(nvram get vlan1ports | tr " " "\n" | sort))" +vlan2ports="$(echo $(nvram get vlan2ports | tr " " "\n" | sort))" +if echo "$vlan1ports" | egrep -q "^1 2 3 4 5" && \ + echo "$vlan2ports" | egrep -q "^0 5"; then + ucidef_add_switch_vlan "switch0" "1" "1 2 3 4 5t" + ucidef_add_switch_vlan "switch0" "2" "0 5t" +elif echo "$vlan1ports" | egrep -q "^1 2 3 5 7" && \ + echo "$vlan2ports" | egrep -q "^0 7"; then + ucidef_add_switch_vlan "switch0" "1" "1 2 3 5 7t" + ucidef_add_switch_vlan "switch0" "2" "0 7t" +elif echo "$vlan1ports" | egrep -q "^0 1 2 3 5 7 8" && \ + echo "$vlan2ports" | egrep -q "^4 8"; then + ucidef_add_switch_vlan "switch0" "1" "0 1 2 3 5 7 8t" + ucidef_add_switch_vlan "switch0" "2" "4 8t" +else + ucidef_add_switch_vlan "switch0" "1" "0 1 2 3 5t" + ucidef_add_switch_vlan "switch0" "2" "4 5t" +fi + +board_config_flush + +exit 0 diff --git a/target/linux/bcm53xx/base-files/etc/diag.sh b/target/linux/bcm53xx/base-files/etc/diag.sh new file mode 100644 index 0000000..0a8c5fb --- /dev/null +++ b/target/linux/bcm53xx/base-files/etc/diag.sh @@ -0,0 +1,43 @@ +#!/bin/sh +# Copyright (C) 2014 OpenWrt.org + +. /lib/functions/leds.sh + +get_status_led() { + local status_led_file + + # There may be more than one color of power LED, try to avoid amber/red + status_led_file=$(find /sys/class/leds/ -name "*:power" -a ! -name "*:amber:*" -a ! -name "*:red:*" | head -n1) + if [ -d "$status_led_file" ]; then + status_led=$(basename $status_led_file) + return + fi; + + # Now just pick any power LED + status_led_file=$(find /sys/class/leds/ -name "*:power:*" | head -n1) + if [ -d "$status_led_file" ]; then + status_led=$(basename $status_led_file) + return + fi; +} + +set_state() { + get_status_led + + [ -z "$status_led" ] && return + + case "$1" in + preinit) + status_led_blink_preinit + ;; + failsafe) + status_led_blink_failsafe + ;; + preinit_regular) + status_led_blink_preinit_regular + ;; + done) + status_led_on + ;; + esac +} diff --git a/target/linux/bcm53xx/base-files/etc/uci-defaults/09_fix_crc b/target/linux/bcm53xx/base-files/etc/uci-defaults/09_fix_crc new file mode 100644 index 0000000..346a532 --- /dev/null +++ b/target/linux/bcm53xx/base-files/etc/uci-defaults/09_fix_crc @@ -0,0 +1,7 @@ +#!/bin/sh +# +# Copyright (C) 2007 OpenWrt.org +# +# + +mtd fixtrx firmware diff --git a/target/linux/bcm53xx/base-files/lib/preinit/05_set_preinit_iface_bcm53xx b/target/linux/bcm53xx/base-files/lib/preinit/05_set_preinit_iface_bcm53xx new file mode 100644 index 0000000..0539b82 --- /dev/null +++ b/target/linux/bcm53xx/base-files/lib/preinit/05_set_preinit_iface_bcm53xx @@ -0,0 +1,7 @@ +#!/bin/sh + +set_preinit_iface() { + ifname=eth0 +} + +boot_hook_add preinit_main set_preinit_iface diff --git a/target/linux/bcm53xx/base-files/lib/upgrade/platform.sh b/target/linux/bcm53xx/base-files/lib/upgrade/platform.sh new file mode 100644 index 0000000..eff7aff --- /dev/null +++ b/target/linux/bcm53xx/base-files/lib/upgrade/platform.sh @@ -0,0 +1,210 @@ +PART_NAME=firmware + +# $(1): file to read magic from +# $(2): offset in bytes +get_magic_long_at() { + dd if="$1" skip=$2 bs=1 count=4 2>/dev/null | hexdump -v -e '1/1 "%02x"' +} + +platform_machine() { + cat /proc/device-tree/compatible | tr '\0' '\t' | cut -f 1 +} + +platform_flash_type() { + # On NAND devices "rootfs" is UBI volume, so won't be find in /proc/mtd + grep -q "\"rootfs\"" /proc/mtd && { + echo "serial" + return + } + + echo "nand" +} + +platform_expected_image() { + local machine=$(platform_machine) + + case "$machine" in + "netgear,r6250v1") echo "chk U12H245T00_NETGEAR"; return;; + "netgear,r6300v2") echo "chk U12H240T00_NETGEAR"; return;; + "netgear,r7000") echo "chk U12H270T00_NETGEAR"; return;; + "netgear,r8000") echo "chk U12H315T00_NETGEAR"; return;; + esac +} + +platform_identify() { + local magic + + magic=$(get_magic_long "$1") + case "$magic" in + "48445230") + echo "trx" + return + ;; + "2a23245e") + echo "chk" + return + ;; + esac + + magic=$(get_magic_long_at "$1" 14) + [ "$magic" = "55324e44" ] && { + echo "cybertan" + return + } + + echo "unknown" +} + +platform_check_image() { + [ "$#" -gt 1 ] && return 1 + + local file_type=$(platform_identify "$1") + local magic + local error=0 + + case "$file_type" in + "chk") + local header_len=$((0x$(get_magic_long_at "$1" 4))) + local board_id_len=$(($header_len - 40)) + local board_id=$(dd if="$1" skip=40 bs=1 count=$board_id_len 2>/dev/null | hexdump -v -e '1/1 "%c"') + local dev_board_id=$(platform_expected_image) + echo "Found CHK image with device board_id $board_id" + + [ -n "$dev_board_id" -a "chk $board_id" != "$dev_board_id" ] && { + echo "Firmware board_id doesn't match device board_id ($dev_board_id)" + error=1 + } + + if ! otrx check "$1" -o "$header_len"; then + echo "No valid TRX firmware in the CHK image" + error=1 + fi + ;; + "cybertan") + local pattern=$(dd if="$1" bs=1 count=4 2>/dev/null | hexdump -v -e '1/1 "%c"') + local dev_pattern=$(platform_expected_image) + echo "Found CyberTAN image with device pattern: $pattern" + + [ -n "$dev_pattern" -a "cybertan $pattern" != "$dev_pattern" ] && { + echo "Firmware pattern doesn't match device pattern ($dev_pattern)" + error=1 + } + + if ! otrx check "$1" -o 32; then + echo "No valid TRX firmware in the CyberTAN image" + error=1 + fi + ;; + "trx") + if ! otrx check "$1"; then + echo "Invalid (corrupted?) TRX firmware" + error=1 + fi + ;; + *) + echo "Invalid image type. Please use only .trx files" + error=1 + ;; + esac + + return $error +} + +platform_pre_upgrade() { + local file_type=$(platform_identify "$1") + local dir="/tmp/sysupgrade-bcm53xx" + local trx="$1" + local offset + + [ "$(platform_flash_type)" != "nand" ] && return + + # Find trx offset + case "$file_type" in + "chk") offset=$((0x$(get_magic_long_at "$1" 4)));; + "cybertan") offset=32;; + esac + + # Extract partitions from trx + rm -fR $dir + mkdir -p $dir + otrx extract "$trx" \ + ${offset:+-o $offset} \ + -1 $dir/kernel \ + -2 $dir/root + [ $? -ne 0 ] && { + echo "Failed to extract TRX partitions." + return + } + + # Firmwares without UBI image should be flashed "normally" + local root_type=$(identify $dir/root) + [ "$root_type" != "ubi" ] && { + echo "Provided firmware doesn't use UBI for rootfs." + return + } + + # Prepare TRX file with just a kernel that will replace current one + local linux_length=$(grep "\"linux\"" /proc/mtd | sed "s/mtd[0-9]*:[ \t]*\([^ \t]*\).*/\1/") + [ -z "$linux_length" ] && { + echo "Unable to find \"linux\" partition size" + exit 1 + } + linux_length=$((0x$linux_length)) + local kernel_length=$(wc -c $dir/kernel | cut -d ' ' -f 1) + [ $kernel_length -gt $linux_length ] && { + echo "New kernel doesn't fit \"linux\" partition." + return + } + rm -f /tmp/null.bin + rm -f /tmp/kernel.trx + touch /tmp/null.bin + otrx create /tmp/kernel.trx \ + -f $dir/kernel -b $(($linux_length + 28)) \ + -f /tmp/null.bin + [ $? -ne 0 ] && { + echo "Failed to create simple TRX with new kernel." + return + } + + # Prepare UBI image (drop unwanted extra blocks) + local ubi_length=0 + while [ "$(dd if=$dir/root skip=$ubi_length bs=1 count=4 2>/dev/null)" = "UBI#" ]; do + ubi_length=$(($ubi_length + 131072)) + done + dd if=$dir/root of=/tmp/root.ubi bs=131072 count=$((ubi_length / 131072)) 2>/dev/null + [ $? -ne 0 ] && { + echo "Failed to prepare new UBI image." + return + } + + # Flash + mtd write /tmp/kernel.trx firmware + nand_do_upgrade /tmp/root.ubi +} + +platform_trx_from_chk_cmd() { + local header_len=$((0x$(get_magic_long_at "$1" 4))) + + echo -n dd bs=$header_len skip=1 +} + +platform_trx_from_cybertan_cmd() { + echo -n dd bs=32 skip=1 +} + +platform_do_upgrade() { + local file_type=$(platform_identify "$1") + local trx="$1" + local cmd= + + [ "$(platform_flash_type)" == "nand" ] && { + echo "Writing whole image to NAND flash. All erase counters will be lost." + } + + case "$file_type" in + "chk") cmd=$(platform_trx_from_chk_cmd "$trx");; + "cybertan") cmd=$(platform_trx_from_cybertan_cmd "$trx");; + esac + + default_do_upgrade "$trx" "$cmd" +} -- cgit v1.2.3