aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm47xx/base-files
diff options
context:
space:
mode:
authorAdrian Schmutzler <freifunk@adrianschmutzler.de>2020-02-07 15:42:54 +0100
committerAdrian Schmutzler <freifunk@adrianschmutzler.de>2020-02-14 14:10:51 +0100
commit8fe5ad5d3373cebed4fbc55a7b779721971ce427 (patch)
tree5d9106ede800508dde24c21dda7f90b8b1b8af5b /target/linux/bcm47xx/base-files
parent8590e70fab64172700c21bc5e658eba17a1eae70 (diff)
downloadupstream-8fe5ad5d3373cebed4fbc55a7b779721971ce427.tar.gz
upstream-8fe5ad5d3373cebed4fbc55a7b779721971ce427.tar.bz2
upstream-8fe5ad5d3373cebed4fbc55a7b779721971ce427.zip
brcm47xx: rename target to bcm47xx
This change makes the names of Broadcom targets consistent by using the common notation based on SoC/CPU ID (which is used internally anyway), bcmXXXX instead of brcmXXXX. This is even used for target TITLE in make menuconfig already, only the short target name used brcm so far. Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
Diffstat (limited to 'target/linux/bcm47xx/base-files')
-rwxr-xr-xtarget/linux/bcm47xx/base-files/etc/board.d/01_network206
-rw-r--r--target/linux/bcm47xx/base-files/etc/diag.sh33
-rwxr-xr-xtarget/linux/bcm47xx/base-files/etc/init.d/wmacfixup33
-rw-r--r--target/linux/bcm47xx/base-files/etc/uci-defaults/03_network_migration29
-rw-r--r--target/linux/bcm47xx/base-files/etc/uci-defaults/09_fix_crc7
-rw-r--r--target/linux/bcm47xx/base-files/lib/preinit/01_sysinfo16
-rw-r--r--target/linux/bcm47xx/base-files/lib/upgrade/platform.sh247
7 files changed, 571 insertions, 0 deletions
diff --git a/target/linux/bcm47xx/base-files/etc/board.d/01_network b/target/linux/bcm47xx/base-files/etc/board.d/01_network
new file mode 100755
index 0000000000..e6311d8139
--- /dev/null
+++ b/target/linux/bcm47xx/base-files/etc/board.d/01_network
@@ -0,0 +1,206 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2006-2015 OpenWrt.org
+
+. /lib/functions/system.sh
+. /lib/functions/uci-defaults.sh
+
+configure_by_vlanports() {
+ local vlan0ports="$(nvram get vlan0ports)"
+ local vlan1ports="$(nvram get vlan1ports)"
+ local vlan2ports="$(nvram get vlan2ports)"
+ local cpuport="$(swconfig dev switch0 help 2>/dev/null | sed -ne "s|.*cpu @ \([0-9]*\).*|\1|p")"
+
+ if [ "${vlan0ports:0:9}" = "0 1 2 3 8" -a "${vlan1ports:0:3}" = "4 8" -a ${cpuport:-0} -eq 8 ] || \
+ [ "${vlan1ports:0:9}" = "0 1 2 3 8" -a "${vlan2ports:0:3}" = "4 8" -a ${cpuport:-0} -eq 8 ] || \
+ [ "${vlan2ports:0:9}" = "0 1 2 3 8" -a "${vlan1ports:0:3}" = "4 8" -a ${cpuport:-0} -eq 8 ];
+ then
+ ucidef_add_switch "switch0" \
+ "0:lan" "1:lan" "2:lan" "3:lan" "4:wan" "8@eth0"
+
+ elif [ "${vlan0ports:0:9}" = "1 2 3 4 8" -a "${vlan1ports:0:3}" = "0 8" -a ${cpuport:-0} -eq 8 ] || \
+ [ "${vlan1ports:0:9}" = "1 2 3 4 8" -a "${vlan2ports:0:3}" = "0 8" -a ${cpuport:-0} -eq 8 ] || \
+ [ "${vlan2ports:0:9}" = "1 2 3 4 8" -a "${vlan1ports:0:3}" = "0 8" -a ${cpuport:-0} -eq 8 ];
+ then
+ ucidef_add_switch "switch0" \
+ "1:lan" "2:lan" "3:lan" "4:lan" "0:wan" "8@eth0"
+
+ elif [ "${vlan0ports:0:9}" = "0 1 2 3 5" -a "${vlan1ports:0:3}" = "4 5" -a ${cpuport:-0} -eq 5 ] || \
+ [ "${vlan1ports:0:9}" = "0 1 2 3 5" -a "${vlan2ports:0:3}" = "4 5" -a ${cpuport:-0} -eq 5 ] || \
+ [ "${vlan2ports:0:9}" = "0 1 2 3 5" -a "${vlan1ports:0:3}" = "4 5" -a ${cpuport:-0} -eq 5 ];
+ then
+ ucidef_add_switch "switch0" \
+ "0:lan" "1:lan" "2:lan" "3:lan" "4:wan" "5@eth0"
+
+ elif [ "${vlan0ports:0:9}" = "1 2 3 4 5" -a "${vlan1ports:0:3}" = "0 5" -a ${cpuport:-0} -eq 5 ] || \
+ [ "${vlan1ports:0:9}" = "1 2 3 4 5" -a "${vlan2ports:0:3}" = "0 5" -a ${cpuport:-0} -eq 5 ] || \
+ [ "${vlan2ports:0:9}" = "1 2 3 4 5" -a "${vlan1ports:0:3}" = "0 5" -a ${cpuport:-0} -eq 5 ];
+ then
+ ucidef_add_switch "switch0" \
+ "1:lan" "2:lan" "3:lan" "4:lan" "0:wan" "5@eth0"
+
+ else
+ logger -t "01_network" "Unable to determine network configuration"
+ ucidef_set_interface_lan "eth0"
+ fi
+}
+
+configure_by_boardnum() {
+ local boardnum="$1"
+
+ case "$boardnum" in
+ # WAP54G, Sitecom WL-105b
+ "2" | \
+ "1024")
+ ucidef_set_interface_lan "eth0"
+ ;;
+
+ # Generic detection fallback
+ *)
+ configure_by_vlanports
+ ;;
+ esac
+}
+
+configure_by_boardtype() {
+ local boardtype="$1"
+ local boardnum="$2"
+
+ case "$boardtype" in
+ "bcm94710r4")
+ ucidef_set_interfaces_lan_wan "eth0" "eth1"
+ ;;
+
+ "0x0467")
+ ucidef_add_switch "switch0" \
+ "0:lan" "1:lan" "2:lan" "3:lan" "4:wan" "5@eth0"
+ ;;
+
+ "0x042f" | \
+ "0x0472")
+ # WL-500gP
+ if [ "$boardnum" = "45" ]; then
+ ucidef_add_switch "switch0" \
+ "0:wan" "1:lan" "2:lan" "3:lan" "4:lan" "5@eth0"
+
+ # Generic BCM94704
+ else
+ ucidef_set_interface_wan "eth1"
+ ucidef_add_switch "switch0" \
+ "0:lan" "1:lan" "2:lan" "3:lan" "4:lan" "5@eth0"
+
+ # MAC addresses on 4704 tend to be screwed up. Add a workaround here
+ local mac="$(nvram get et0macaddr)"
+ local pat="[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]"
+ pat="$pat:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]"
+ pat="$pat:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]"
+
+ case "$mac" in
+ $pat)
+ ucidef_set_interface_macaddr "lan" "$mac"
+ ucidef_set_interface_macaddr "wan" "$(macaddr_add "$mac" 1)"
+ ;;
+ esac
+ fi
+ ;;
+
+ # Buffalo WBR-B11 and Buffalo WBR-G54
+ "bcm94710ap")
+ ucidef_set_interface_wan "eth1"
+ ucidef_add_switch "switch0" \
+ "0:lan" "1:lan" "2:lan" "3:lan" "4:lan" "5@eth0"
+ ;;
+
+ *)
+ configure_by_boardnum "$boardnum"
+ ;;
+ esac
+}
+
+configure_by_model() {
+ local model="$1"
+ local boardtype="$2"
+ local boardnum="$3"
+
+ # Netgear WGT634U exception
+ if grep -sqE 'mtd0: 000(6|a)0000' /proc/mtd; then
+ ucidef_add_switch "switch0" \
+ "0:lan" "1:lan" "2:lan" "3:lan" "4:wan" "5@eth0"
+ return
+ fi
+
+ case "$model" in
+ "Asus WLHDD" | \
+ "Asus WL300G")
+ ucidef_set_interface_lan "eth1"
+ ;;
+
+ "Asus WL330GE")
+ ucidef_add_switch "switch0" "4:lan" "5t@eth0"
+ ;;
+
+ "Asus WL500G" | \
+ "Microsoft MN-700")
+ ucidef_set_interfaces_lan_wan "eth0" "eth1"
+ ;;
+
+ "Asus WL500GP V2")
+ ucidef_add_switch "switch0" \
+ "0:lan:4" "1:lan:3" "2:lan:2" "3:lan:1" "4:wan" "5@eth0"
+ ;;
+
+ "Asus RT-N12"* | \
+ "Buffalo WHR-G125" | \
+ "D-Link DIR-330" | \
+ "Motorola WR850G" | \
+ "Siemens SE505 V2")
+ ucidef_add_switch "switch0" \
+ "0:lan" "1:lan" "2:lan" "3:lan" "4:wan" "5@eth0"
+ ;;
+
+ "Asus WL700")
+ ucidef_add_switch "switch0" \
+ "0:wan" "1:lan" "2:lan" "3:lan" "4:lan" "5@eth0"
+ ;;
+
+ "Asus WL500W" | \
+ "Dell TrueMobile 2300")
+ ucidef_set_interface_wan "eth1"
+ ucidef_add_switch "switch0" \
+ "0:lan" "1:lan" "2:lan" "3:lan" "5@eth0"
+ ;;
+
+ "Asus RT-N16"* | \
+ "Linksys E3000 V1" | \
+ "Netgear WNR3500 V2" | \
+ "Netgear WNR3500L")
+ ucidef_add_switch "switch0" \
+ "0:wan" "1:lan:4" "2:lan:3" "3:lan:2" "4:lan:1" "8@eth0"
+ ;;
+
+ "Netgear WN2500RP V1")
+ ucidef_add_switch "switch0" \
+ "0:lan:4" "1:lan:3" "2:lan:2" "3:lan:1" "5@eth0"
+ ;;
+
+ *)
+ configure_by_boardtype "$boardtype" "$boardnum"
+ ;;
+ esac
+}
+
+
+model="$(cat /tmp/sysinfo/model)"
+boardtype="$(board_name)"
+
+case "$boardtype" in
+ *:*)
+ boardnum="${boardtype##*:}"
+ boardtype="${boardtype%:*}"
+ ;;
+esac
+
+board_config_update
+
+configure_by_model "$model" "$boardtype" "$boardnum"
+
+board_config_flush
diff --git a/target/linux/bcm47xx/base-files/etc/diag.sh b/target/linux/bcm47xx/base-files/etc/diag.sh
new file mode 100644
index 0000000000..91cf4bdf4b
--- /dev/null
+++ b/target/linux/bcm47xx/base-files/etc/diag.sh
@@ -0,0 +1,33 @@
+#!/bin/sh
+# Copyright (C) 2006 OpenWrt.org
+
+. /lib/functions/leds.sh
+
+get_status_led() {
+ for led in dmz power diag wps; do
+ status_led_file=$(find /sys/class/leds/ -name "*${led}*" | head -n1)
+ if [ ! -f $status_led_file ]; then
+ status_led=$(basename $status_led_file)
+ return
+ fi;
+ done
+}
+
+set_state() {
+ get_status_led
+
+ 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/bcm47xx/base-files/etc/init.d/wmacfixup b/target/linux/bcm47xx/base-files/etc/init.d/wmacfixup
new file mode 100755
index 0000000000..ee1b752201
--- /dev/null
+++ b/target/linux/bcm47xx/base-files/etc/init.d/wmacfixup
@@ -0,0 +1,33 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2010 OpenWrt.org
+
+START=41
+
+boot() {
+ [ -d /sys/class/ieee80211 ] || exit
+
+ commit=0
+
+ fixup_wmac() {
+ local cfg="$1"
+ local cfmac
+
+ config_get cfmac "$cfg" macaddr
+
+ [ "$cfmac" != "00:90:4c:5f:00:2a" ] || {
+ local nvmac="$(nvram get il0macaddr 2>/dev/null)"
+ [ -n "$nvmac" ] && [ "$nvmac != "$cfmac ] && {
+ uci set wireless.$cfg.macaddr="$nvmac"
+ commit=1
+ }
+ }
+ }
+
+ config_load wireless
+ config_foreach fixup_wmac wifi-device
+
+ [ "$commit" = 1 ] && uci commit wireless
+}
+
+start() { :; }
+stop() { :; }
diff --git a/target/linux/bcm47xx/base-files/etc/uci-defaults/03_network_migration b/target/linux/bcm47xx/base-files/etc/uci-defaults/03_network_migration
new file mode 100644
index 0000000000..e430b41d48
--- /dev/null
+++ b/target/linux/bcm47xx/base-files/etc/uci-defaults/03_network_migration
@@ -0,0 +1,29 @@
+#!/bin/sh
+#
+# Copyright (C) 2014-2015 OpenWrt.org
+#
+
+uci show network | grep "\.vlan=0"
+[ $? -ne 0 ] && exit 0
+
+logger -t network "network config is invalid, creating new one"
+
+lan_proto="$(uci -q get network.lan.proto)"
+lan_ipaddr="$(uci -q get network.lan.ipaddr)"
+lan_netmask="$(uci -q get network.lan.netmask)"
+wan_proto="$(uci -q get network.wan.proto)"
+wan_ipaddr="$(uci -q get network.wan.ipaddr)"
+wan_netmask="$(uci -q get network.wan.netmask)"
+
+echo "" > /etc/config/network
+config_generate
+
+uci set network.lan.proto=$lan_proto
+uci set network.lan.ipaddr=$lan_ipaddr
+uci set network.lan.netmask=$lan_netmask
+uci set network.wan.proto=$wan_proto
+uci set network.wan.ipaddr=$wan_ipaddr
+uci set network.wan.netmask=$wan_netmask
+uci commit network
+
+exit 0
diff --git a/target/linux/bcm47xx/base-files/etc/uci-defaults/09_fix_crc b/target/linux/bcm47xx/base-files/etc/uci-defaults/09_fix_crc
new file mode 100644
index 0000000000..346a532998
--- /dev/null
+++ b/target/linux/bcm47xx/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/bcm47xx/base-files/lib/preinit/01_sysinfo b/target/linux/bcm47xx/base-files/lib/preinit/01_sysinfo
new file mode 100644
index 0000000000..8c7bd399da
--- /dev/null
+++ b/target/linux/bcm47xx/base-files/lib/preinit/01_sysinfo
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+do_sysinfo_bcm47xx() {
+ local boardtype="$(nvram get boardtype)"
+ local boardnum="$(nvram get boardnum)"
+ local model="$(sed -ne 's/^machine[ \t]*: //p' /proc/cpuinfo)"
+
+ [ -z "$model" ] && model="unknown"
+ [ -z "$boardtype" ] && boardtype="unknown"
+
+ [ -e "/tmp/sysinfo/" ] || mkdir -p "/tmp/sysinfo/"
+ echo "$boardtype${boardnum:+:$boardnum}" > /tmp/sysinfo/board_name
+ echo "$model" > /tmp/sysinfo/model
+}
+
+boot_hook_add preinit_main do_sysinfo_bcm47xx
diff --git a/target/linux/bcm47xx/base-files/lib/upgrade/platform.sh b/target/linux/bcm47xx/base-files/lib/upgrade/platform.sh
new file mode 100644
index 0000000000..45815d9fe2
--- /dev/null
+++ b/target/linux/bcm47xx/base-files/lib/upgrade/platform.sh
@@ -0,0 +1,247 @@
+PART_NAME=firmware
+
+LXL_FLAGS_VENDOR_LUXUL=0x00000001
+
+# $(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 -n 4 -e '1/1 "%02x"'
+}
+
+# $(1): file to read LE long number from
+# $(2): offset in bytes
+get_le_long_at() {
+ echo $((0x$(dd if="$1" skip=$2 bs=1 count=4 2>/dev/null | hexdump -v -e '1/4 "%02x"')))
+}
+
+platform_expected_image() {
+ local model="$(cat /tmp/sysinfo/model)"
+
+ case "$model" in
+ "Netgear WGR614 V8") echo "chk U12H072T00_NETGEAR"; return;;
+ "Netgear WGR614 V9") echo "chk U12H094T00_NETGEAR"; return;;
+ "Netgear WGR614 V10") echo "chk U12H139T01_NETGEAR"; return;;
+ "Netgear WN2500RP V1") echo "chk U12H197T00_NETGEAR"; return;;
+ "Netgear WN2500RP V2") echo "chk U12H294T00_NETGEAR"; return;;
+ "Netgear WNDR3300") echo "chk U12H093T00_NETGEAR"; return;;
+ "Netgear WNDR3400 V1") echo "chk U12H155T00_NETGEAR"; return;;
+ "Netgear WNDR3400 V2") echo "chk U12H187T00_NETGEAR"; return;;
+ "Netgear WNDR3400 V3") echo "chk U12H208T00_NETGEAR"; return;;
+ "Netgear WNDR3400 Vcna") echo "chk U12H155T01_NETGEAR"; return;;
+ "Netgear WNDR3700 V3") echo "chk U12H194T00_NETGEAR"; return;;
+ "Netgear WNDR4000") echo "chk U12H181T00_NETGEAR"; return;;
+ "Netgear WNDR4500 V1") echo "chk U12H189T00_NETGEAR"; return;;
+ "Netgear WNDR4500 V2") echo "chk U12H224T00_NETGEAR"; return;;
+ "Netgear WNR2000 V2") echo "chk U12H114T00_NETGEAR"; return;;
+ "Netgear WNR3500L") echo "chk U12H136T99_NETGEAR"; return;;
+ "Netgear WNR3500U") echo "chk U12H136T00_NETGEAR"; return;;
+ "Netgear WNR3500 V2") echo "chk U12H127T00_NETGEAR"; return;;
+ "Netgear WNR3500 V2vc") echo "chk U12H127T70_NETGEAR"; return;;
+ "Netgear WNR834B V2") echo "chk U12H081T00_NETGEAR"; return;;
+ "Linksys E900 V1") echo "cybertan E900"; return;;
+ "Linksys E1000 V1") echo "cybertan E100"; return;;
+ "Linksys E1000 V2") echo "cybertan E100"; return;;
+ "Linksys E1000 V2.1") echo "cybertan E100"; return;;
+ "Linksys E1200 V2") echo "cybertan E122"; return;;
+ "Linksys E2000 V1") echo "cybertan 32XN"; return;;
+ "Linksys E3000 V1") echo "cybertan 61XN"; return;;
+ "Linksys E3200 V1") echo "cybertan 3200"; return;;
+ "Linksys E4200 V1") echo "cybertan 4200"; return;;
+ "Linksys WRT150N V1.1") echo "cybertan N150"; return;;
+ "Linksys WRT150N V1") echo "cybertan N150"; return;;
+ "Linksys WRT160N V1") echo "cybertan N150"; return;;
+ "Linksys WRT160N V3") echo "cybertan N150"; return;;
+ "Linksys WRT300N V1") echo "cybertan EWCB"; return;;
+ "Linksys WRT300N V1.1") echo "cybertan EWC2"; return;;
+ "Linksys WRT310N V1") echo "cybertan 310N"; return;;
+ "Linksys WRT310N V2") echo "cybertan 310N"; return;;
+ "Linksys WRT610N V1") echo "cybertan 610N"; return;;
+ "Linksys WRT610N V2") echo "cybertan 610N"; return;;
+ "Luxul XAP-310 V1") echo "lxl XAP-310"; return;;
+ "Luxul XAP-1210 V1") echo "lxl XAP-1210"; return;;
+ "Luxul XAP-1230 V1") echo "lxl XAP-1230"; return;;
+ "Luxul XAP-1240 V1") echo "lxl XAP-1240"; return;;
+ "Luxul XAP-1500 V1") echo "lxl XAP-1500"; return;;
+ "Luxul ABR-4400 V1") echo "lxl ABR-4400"; return;;
+ "Luxul XBR-4400 V1") echo "lxl XBR-4400"; return;;
+ "Luxul XVW-P30 V1") echo "lxl XVW-P30"; return;;
+ "Luxul XWR-600 V1") echo "lxl XWR-600"; return;;
+ "Luxul XWR-1750 V1") echo "lxl XWR-1750"; return;;
+ esac
+}
+
+bcm47xx_identify() {
+ local magic
+
+ magic=$(get_magic_long "$1")
+ case "$magic" in
+ "48445230")
+ echo "trx"
+ return
+ ;;
+ "2a23245e")
+ echo "chk"
+ return
+ ;;
+ "4c584c23")
+ echo "lxl"
+ return
+ ;;
+ esac
+
+ magic=$(get_magic_long_at "$1" 14)
+ [ "$magic" = "55324e44" ] && {
+ echo "cybertan"
+ return
+ }
+
+ magic=$(get_magic_long_at "$1" 60)
+ [ "$magic" = "4c584c23" ] && {
+ echo "lxlold"
+ return
+ }
+
+ echo "unknown"
+}
+
+platform_check_image() {
+ [ "$#" -gt 1 ] && return 1
+
+ local file_type=$(bcm47xx_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"
+ notify_firmware_test_result "trx_valid" 0
+ error=1
+ else
+ notify_firmware_test_result "trx_valid" 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"
+ notify_firmware_test_result "trx_valid" 0
+ error=1
+ else
+ notify_firmware_test_result "trx_valid" 1
+ fi
+ ;;
+ "lxl")
+ local hdr_len=$(get_le_long_at "$1" 8)
+ local flags=$(get_le_long_at "$1" 12)
+ local board=$(dd if="$1" skip=16 bs=1 count=16 2>/dev/null | hexdump -v -e '1/1 "%c"')
+ local dev_board=$(platform_expected_image)
+ echo "Found Luxul image for board $board"
+
+ [ -n "$dev_board" -a "lxl $board" != "$dev_board" ] && {
+ echo "Firmware ($board) doesn't match device ($dev_board)"
+ error=1
+ }
+
+ [ $((flags & LXL_FLAGS_VENDOR_LUXUL)) -gt 0 ] && notify_firmware_no_backup
+
+ if ! otrx check "$1" -o "$hdr_len"; then
+ echo "No valid TRX firmware in the Luxul image"
+ notify_firmware_test_result "trx_valid" 0
+ error=1
+ else
+ notify_firmware_test_result "trx_valid" 1
+ fi
+ ;;
+ "lxlold")
+ local board_id=$(dd if="$1" skip=48 bs=1 count=12 2>/dev/null | hexdump -v -e '1/1 "%c"')
+ local dev_board_id=$(platform_expected_image)
+ echo "Found Luxul image with device board_id $board_id"
+
+ [ -n "$dev_board_id" -a "lxl $board_id" != "$dev_board_id" ] && {
+ echo "Firmware board_id doesn't match device board_id ($dev_board_id)"
+ error=1
+ }
+
+ notify_firmware_no_backup
+
+ if ! otrx check "$1" -o 64; then
+ echo "No valid TRX firmware in the Luxul image"
+ notify_firmware_test_result "trx_valid" 0
+ error=1
+ else
+ notify_firmware_test_result "trx_valid" 1
+ fi
+ ;;
+ "trx")
+ if ! otrx check "$1"; then
+ echo "Invalid (corrupted?) TRX firmware"
+ notify_firmware_test_result "trx_valid" 0
+ error=1
+ else
+ notify_firmware_test_result "trx_valid" 1
+ fi
+ ;;
+ *)
+ echo "Invalid image type. Please use firmware specific for this device."
+ notify_firmware_broken
+ error=1
+ ;;
+ esac
+
+ return $error
+}
+
+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_trx_from_lxl_cmd() {
+ local hdr_len=$(get_le_long_at "$1" 8)
+
+ echo -n dd skip=$hdr_len iflag=skip_bytes
+}
+
+platform_trx_from_lxlold_cmd() {
+ echo -n dd bs=64 skip=1
+}
+
+platform_do_upgrade() {
+ local file_type=$(bcm47xx_identify "$1")
+ local trx="$1"
+ local cmd=""
+
+ case "$file_type" in
+ "chk") cmd=$(platform_trx_from_chk_cmd "$trx");;
+ "cybertan") cmd=$(platform_trx_from_cybertan_cmd "$trx");;
+ "lxl") cmd=$(platform_trx_from_lxl_cmd "$trx");;
+ "lxlold") cmd=$(platform_trx_from_lxlold_cmd "$trx");;
+ esac
+
+ default_do_upgrade "$trx" "$cmd"
+}