2020-02-20 12:40:55 +00:00
|
|
|
RAMFS_COPY_BIN='osafeloader oseama otrx truncate'
|
2017-06-10 14:14:54 +00:00
|
|
|
|
2014-12-15 15:43:46 +00:00
|
|
|
PART_NAME=firmware
|
|
|
|
|
2021-11-28 10:54:19 +00:00
|
|
|
BCM53XX_FW_FORMAT=
|
|
|
|
BCM53XX_FW_BOARD_ID=
|
|
|
|
BCM53XX_FW_INT_IMG_FORMAT=
|
|
|
|
BCM53XX_FW_INT_IMG_TRX_OFFSET=
|
|
|
|
BCM53XX_FW_INT_IMG_EXTRACT_CMD=
|
|
|
|
|
2019-09-12 17:14:19 +00:00
|
|
|
LXL_FLAGS_VENDOR_LUXUL=0x00000001
|
|
|
|
|
2014-12-15 15:43:46 +00:00
|
|
|
# $(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"'
|
|
|
|
}
|
|
|
|
|
2019-09-12 17:14:19 +00:00
|
|
|
# $(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"')))
|
|
|
|
}
|
|
|
|
|
2014-12-15 15:43:46 +00:00
|
|
|
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"
|
|
|
|
}
|
|
|
|
|
2015-04-07 14:13:56 +00:00
|
|
|
platform_expected_image() {
|
2017-05-12 20:36:07 +00:00
|
|
|
local machine=$(board_name)
|
2015-04-07 14:13:56 +00:00
|
|
|
|
|
|
|
case "$machine" in
|
2021-11-28 10:54:19 +00:00
|
|
|
"dlink,dir-885l") echo "seamaseal wrgac42_dlink.2015_dir885l"; return;;
|
2019-09-12 17:14:19 +00:00
|
|
|
"luxul,abr-4500-v1") echo "lxl ABR-4500"; return;;
|
|
|
|
"luxul,xap-810-v1") echo "lxl XAP-810"; return;;
|
|
|
|
"luxul,xap-1410v1") echo "lxl XAP-1410"; return;;
|
|
|
|
"luxul,xap-1440-v1") echo "lxl XAP-1440"; return;;
|
|
|
|
"luxul,xap-1510v1") echo "lxl XAP-1510"; return;;
|
|
|
|
"luxul,xap-1610-v1") echo "lxl XAP-1610"; return;;
|
|
|
|
"luxul,xbr-4500-v1") echo "lxl XBR-4500"; return;;
|
|
|
|
"luxul,xwc-1000") echo "lxl XWC-1000"; return;;
|
2019-10-04 09:40:06 +00:00
|
|
|
"luxul,xwc-2000-v1") echo "lxl XWC-2000"; return;;
|
2019-09-12 17:14:19 +00:00
|
|
|
"luxul,xwr-1200v1") echo "lxl XWR-1200"; return;;
|
|
|
|
"luxul,xwr-3100v1") echo "lxl XWR-3100"; return;;
|
|
|
|
"luxul,xwr-3150-v1") echo "lxl XWR-3150"; return;;
|
2015-04-07 14:13:56 +00:00
|
|
|
"netgear,r6250v1") echo "chk U12H245T00_NETGEAR"; return;;
|
|
|
|
"netgear,r6300v2") echo "chk U12H240T00_NETGEAR"; return;;
|
2015-08-26 15:21:14 +00:00
|
|
|
"netgear,r7000") echo "chk U12H270T00_NETGEAR"; return;;
|
2016-04-09 09:59:21 +00:00
|
|
|
"netgear,r7900") echo "chk U12H315T30_NETGEAR"; return;;
|
2015-04-07 14:13:56 +00:00
|
|
|
"netgear,r8000") echo "chk U12H315T00_NETGEAR"; return;;
|
2016-01-30 16:57:35 +00:00
|
|
|
"netgear,r8500") echo "chk U12H334T00_NETGEAR"; return;;
|
2016-11-19 06:58:26 +00:00
|
|
|
"tplink,archer-c9-v1") echo "safeloader"; return;;
|
2015-04-07 14:13:56 +00:00
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2014-12-15 15:43:46 +00:00
|
|
|
platform_identify() {
|
|
|
|
local magic
|
|
|
|
|
|
|
|
magic=$(get_magic_long "$1")
|
|
|
|
case "$magic" in
|
|
|
|
"48445230")
|
2021-11-28 10:54:19 +00:00
|
|
|
BCM53XX_FW_FORMAT="trx"
|
2014-12-15 15:43:46 +00:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
"2a23245e")
|
2021-11-28 10:54:19 +00:00
|
|
|
local header_len=$((0x$(get_magic_long_at "$1" 4)))
|
|
|
|
local board_id_len=$(($header_len - 40))
|
|
|
|
|
|
|
|
BCM53XX_FW_FORMAT="chk"
|
|
|
|
BCM53XX_FW_BOARD_ID=$(dd if="$1" skip=40 bs=1 count=$board_id_len 2>/dev/null | hexdump -v -e '1/1 "%c"')
|
|
|
|
BCM53XX_FW_INT_IMG_FORMAT="trx"
|
|
|
|
BCM53XX_FW_INT_IMG_TRX_OFFSET="$header_len"
|
|
|
|
BCM53XX_FW_INT_IMG_EXTRACT_CMD="dd skip=$header_len iflag=skip_bytes"
|
2014-12-15 15:43:46 +00:00
|
|
|
return
|
|
|
|
;;
|
2019-09-12 17:14:19 +00:00
|
|
|
"4c584c23")
|
2021-11-28 10:54:19 +00:00
|
|
|
local hdr_len=$(get_le_long_at "$1" 8)
|
|
|
|
local flags=$(get_le_long_at "$1" 12)
|
|
|
|
|
|
|
|
[ $((flags & LXL_FLAGS_VENDOR_LUXUL)) -gt 0 ] && notify_firmware_no_backup
|
|
|
|
|
|
|
|
BCM53XX_FW_FORMAT="lxl"
|
|
|
|
BCM53XX_FW_BOARD_ID=$(dd if="$1" skip=16 bs=1 count=16 2>/dev/null | hexdump -v -e '1/1 "%c"')
|
|
|
|
BCM53XX_FW_INT_IMG_FORMAT="trx"
|
|
|
|
BCM53XX_FW_INT_IMG_TRX_OFFSET="$hdr_len"
|
|
|
|
BCM53XX_FW_INT_IMG_EXTRACT_CMD="dd skip=$hdr_len iflag=skip_bytes"
|
|
|
|
|
2019-09-12 17:14:19 +00:00
|
|
|
return
|
|
|
|
;;
|
2016-01-27 10:40:58 +00:00
|
|
|
"5ea3a417")
|
2021-11-28 10:54:19 +00:00
|
|
|
BCM53XX_FW_FORMAT="seamaseal"
|
|
|
|
BCM53XX_FW_BOARD_ID=$(oseama info "$1" | grep "Meta entry:.*signature=" | sed "s/.*=//")
|
|
|
|
BCM53XX_FW_INT_IMG_EXTRACT_CMD="oseama extract - -e 0"
|
2016-01-27 10:40:58 +00:00
|
|
|
return
|
|
|
|
;;
|
2014-12-15 15:43:46 +00:00
|
|
|
esac
|
|
|
|
|
|
|
|
magic=$(get_magic_long_at "$1" 14)
|
|
|
|
[ "$magic" = "55324e44" ] && {
|
2021-11-28 10:54:19 +00:00
|
|
|
BCM53XX_FW_FORMAT="cybertan"
|
|
|
|
BCM53XX_FW_BOARD_ID=$(dd if="$1" bs=1 count=4 2>/dev/null | hexdump -v -e '1/1 "%c"')
|
|
|
|
BCM53XX_FW_INT_IMG_FORMAT="trx"
|
|
|
|
BCM53XX_FW_INT_IMG_TRX_OFFSET="32"
|
|
|
|
BCM53XX_FW_INT_IMG_EXTRACT_CMD="dd skip=32 iflag=skip_bytes"
|
2014-12-15 15:43:46 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2019-09-12 17:14:19 +00:00
|
|
|
magic=$(get_magic_long_at "$1" 60)
|
|
|
|
[ "$magic" = "4c584c23" ] && {
|
2021-11-28 10:54:19 +00:00
|
|
|
notify_firmware_no_backup
|
|
|
|
|
|
|
|
BCM53XX_FW_FORMAT="lxlold"
|
|
|
|
BCM53XX_FW_BOARD_ID=$(dd if="$1" skip=48 bs=1 count=12 2>/dev/null | hexdump -v -e '1/1 "%c"')
|
|
|
|
BCM53XX_FW_INT_IMG_FORMAT="trx"
|
|
|
|
BCM53XX_FW_INT_IMG_TRX_OFFSET="64"
|
|
|
|
BCM53XX_FW_INT_IMG_EXTRACT_CMD="dd skip=64 iflag=skip_bytes"
|
2019-09-12 17:14:19 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-01-30 10:46:08 +00:00
|
|
|
if osafeloader info "$1" > /dev/null 2>&1; then
|
2021-11-28 10:54:19 +00:00
|
|
|
BCM53XX_FW_FORMAT="safeloader"
|
2016-11-19 06:58:26 +00:00
|
|
|
return
|
|
|
|
fi
|
2014-12-15 15:43:46 +00:00
|
|
|
}
|
|
|
|
|
bcm53xx: add Cisco Meraki MR32
This patch adds support for Cisco Meraki MR32.
The unit was donated by Chris Blake. Thank you!
WARNING:
Only the 1x1:1 abgn Air Marshal WIPS wifi is currently supported by b43:
b43-phy2: Found PHY: Analog 9, Type 4 (N), Revision 16
b43-phy2: Found Radio: Manuf 0x17F, ID 0x2057, Revision 9, Version 1
b43-phy2: Loading firmware version 784.2 (2012-08-15 21:35:19)
and only as 802.11ABG!
while WIFI1 and WIFI2 (both BCM4352) are not:
b43-phy0: Broadcom 4352 WLAN found (core revision 42)
b43-phy0 ERROR: FOUND UNSUPPORTED PHY (Analog 12, Type 11 (AC), Revision 1)
Hardware Highlights:
SoC: Broadcom BCM53016A1 (1 GHz, 2 cores)
RAM: 128 MiB
NAND: 128 MiB Spansion S34ML01G2 (~114 MiB useable)
ETH: 1GBit Ethernet Port - PoE
WIFI1: Broadcom BCM43520 an+ac (2x2:2 - id: 0x4352)
WIFI2: Broadcom BCM43520 bgn (2x2:2 - id: 0x4352)
WIFI3: Broadcom BCM43428 abgn (1x1:1 - id: 43428)
BLE: Broadcom BCM20732 (ttyS1)
LEDS: 1 x Programmable RGB Status LED (driven by a PWM)
1 x White LED (GPIO)
1 x Orange LED Fault Indicator (GPIO)
2 x LAN Activity / Speed LEDs (On the RJ45 Port)
BUTTON: one Reset button
MISC: AT24C64 8KiB EEPROM (i2c - stores Ethernet MAC + Serial#!)
ina219 hardware monitor (i2c)
Kensington Lock
SERIAL:
WARNING: The serial port needs a TTL/RS-232 3V3 level converter!
The Serial setting is 115200-8-N-1. The board has a populated
right angle 1x4 0.1" pinheader.
The pinout is: VCC, RX, TX, GND. (Use a multimeter)
Flashing needs a serial adaptor (due to the lack of a working dropbear on
the original firmware).
This flashing procedure for the MR32 was tested with firmware:
"r23-149867:150252-aacharya".
0. Create a seperate Ethernet LAN which does not have access to the internet.
Ideally use 192.168.1.2 for your PC. Make sure to reserve 192.168.1.1 it
will be used later on by the OpenWrt firmware. The original Meraki firmware
will likely try to setup the network via DHCP Discovery, so make sure your
PC is running a DHCP-Server (i.e.: dnsmasq)
'# dnsmasq -i eth# -F 192.168.1.5,192.168.1.50
Furthermore, the PC needs a supported ssh/http/ftp server in order to
retrieve the initramfs + dtb file
1. Disassemble the MR32 device by removing all screws (4 screws are located
under the 4 rubber feets!) and prying open the plastic covers without
breaking the plastic retention clips. Once inside, remove all the screws
on the outer metal shielding to get to the PCB. It's not necessary to
remove the antennas!
2. Connect the serial cable to the serial header.
3. Partially reassemble the outer metal shielding to ensure that the SoC
has a proper heat sink.
4. Connect the Ethernet patch cable to the device and the power cable.
5. Wait for the device to boot and enter the root shell.
(rooting is not discussed in detail here please refer to
Chris Blake - "pwning the meraki mr18" blog post:
<https://servernetworktech.com/2016/02/pwning-the-meraki-mr18/>
(The same method works with the MR32's r23-149867:150252-aacharya)
Wait for the MR32 to enter the "<Meraki>" prompt and enter:
<Meraki> odm serial_num read
(Verify that it matches what's on the S/N Sticker on the back!)
<Meraki> odm serial_num write Q2XX-XXXX-XXXV
<Meraki> odm serial_num read
(Verify that the S/N has changed - and the LED start to flash)
now to flash the firmware:
<Meraki> odm firmware part.safe "http://192.168.1.2/mr32-initramfs.bin"
Once OpenWrt booted use sysupgrade to permanently install
OpenWrt. To do this: Download the latest sysupgrade.bin file
for the MR32 to the device and use sysupgrade *sysupgrade.bin
to install it.
WARNING: DO NOT DELETE the "storage" ubi volume!
To flash later MR32 Firmwares like r25-201804051805-G885d6d78-dhow-rel
requires in-circut-i2c tools to access the I2C EEPROM AT24C64 next to
the SoC. The idea is pretty much the same as from Step 5 from above:
Change the serial number to Q2XXXXXXXXXV (should be around 0x7c), then
attach a serial cable, ethernet (but make sure the device can't reach
the internet!) hit "s" (the small s!) during boot to enter the root-shell
and add the following commands to the /storage/config there:
serial_allow_odm true
serial_access_enabled true
serial_access_check false
valid_config true
and then hit exit to let it finish booting.
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
2020-08-29 21:48:00 +00:00
|
|
|
platform_other_check_image() {
|
2014-12-15 15:43:46 +00:00
|
|
|
[ "$#" -gt 1 ] && return 1
|
|
|
|
|
2015-04-07 14:14:02 +00:00
|
|
|
local error=0
|
2014-12-15 15:43:46 +00:00
|
|
|
|
2021-11-28 10:54:19 +00:00
|
|
|
platform_identify "$1"
|
|
|
|
[ -z "$BCM53XX_FW_FORMAT" ] && {
|
|
|
|
echo "Invalid image type. Please use firmware specific for this device."
|
|
|
|
notify_firmware_broken
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
echo "Found $BCM53XX_FW_FORMAT firmware for device $BCM53XX_FW_BOARD_ID"
|
2019-09-12 17:14:19 +00:00
|
|
|
|
2021-11-28 10:54:19 +00:00
|
|
|
local expected_image="$(platform_expected_image)"
|
|
|
|
[ -n "$expected_image" -a -n "$BCM53XX_FW_BOARD_ID" -a "$expected_image" != "$BCM53XX_FW_FORMAT $BCM53XX_FW_BOARD_ID" ] && {
|
|
|
|
echo "Firmware doesn't match device ($expected_image)"
|
|
|
|
error=1
|
|
|
|
}
|
2019-09-12 17:14:19 +00:00
|
|
|
|
2021-11-28 10:54:19 +00:00
|
|
|
case "$BCM53XX_FW_FORMAT" in
|
|
|
|
"seamaseal")
|
|
|
|
$(oseama info "$1" -e 0 | grep -q "Meta entry:.*type=firmware") || {
|
|
|
|
echo "Seama seal doesn't contain firmware entity"
|
2019-09-12 17:14:19 +00:00
|
|
|
error=1
|
|
|
|
}
|
2021-11-28 10:54:19 +00:00
|
|
|
;;
|
|
|
|
"trx")
|
|
|
|
if ! otrx check "$1"; then
|
|
|
|
echo "Failed to find a valid TRX in firmware"
|
2019-09-12 17:14:19 +00:00
|
|
|
notify_firmware_test_result "trx_valid" 0
|
|
|
|
error=1
|
|
|
|
else
|
|
|
|
notify_firmware_test_result "trx_valid" 1
|
|
|
|
fi
|
2016-01-28 22:38:37 +00:00
|
|
|
|
2021-11-28 10:54:19 +00:00
|
|
|
[ "$expected_image" == "safeloader" ] && {
|
2016-11-19 06:58:26 +00:00
|
|
|
echo "This device expects SafeLoader format and may not work with TRX"
|
|
|
|
error=1
|
|
|
|
}
|
2021-11-28 10:54:19 +00:00
|
|
|
;;
|
2014-12-15 15:43:46 +00:00
|
|
|
*)
|
2021-11-28 10:54:19 +00:00
|
|
|
case "$BCM53XX_FW_INT_IMG_FORMAT" in
|
|
|
|
"trx")
|
|
|
|
# Make sure that both ways of extracting TRX work.
|
|
|
|
# platform_do_upgrade() may use any of them.
|
|
|
|
if ! otrx check "$1" -o "$BCM53XX_FW_INT_IMG_TRX_OFFSET" || \
|
|
|
|
! $BCM53XX_FW_INT_IMG_EXTRACT_CMD < $1 | otrx check -; then
|
|
|
|
echo "Invalid (corrupted?) TRX firmware"
|
|
|
|
notify_firmware_test_result "trx_valid" 0
|
|
|
|
error=1
|
|
|
|
else
|
|
|
|
notify_firmware_test_result "trx_valid" 1
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
;;
|
2014-12-15 15:43:46 +00:00
|
|
|
esac
|
2015-04-07 14:14:02 +00:00
|
|
|
|
|
|
|
return $error
|
2014-12-15 15:43:46 +00:00
|
|
|
}
|
|
|
|
|
bcm53xx: add Cisco Meraki MR32
This patch adds support for Cisco Meraki MR32.
The unit was donated by Chris Blake. Thank you!
WARNING:
Only the 1x1:1 abgn Air Marshal WIPS wifi is currently supported by b43:
b43-phy2: Found PHY: Analog 9, Type 4 (N), Revision 16
b43-phy2: Found Radio: Manuf 0x17F, ID 0x2057, Revision 9, Version 1
b43-phy2: Loading firmware version 784.2 (2012-08-15 21:35:19)
and only as 802.11ABG!
while WIFI1 and WIFI2 (both BCM4352) are not:
b43-phy0: Broadcom 4352 WLAN found (core revision 42)
b43-phy0 ERROR: FOUND UNSUPPORTED PHY (Analog 12, Type 11 (AC), Revision 1)
Hardware Highlights:
SoC: Broadcom BCM53016A1 (1 GHz, 2 cores)
RAM: 128 MiB
NAND: 128 MiB Spansion S34ML01G2 (~114 MiB useable)
ETH: 1GBit Ethernet Port - PoE
WIFI1: Broadcom BCM43520 an+ac (2x2:2 - id: 0x4352)
WIFI2: Broadcom BCM43520 bgn (2x2:2 - id: 0x4352)
WIFI3: Broadcom BCM43428 abgn (1x1:1 - id: 43428)
BLE: Broadcom BCM20732 (ttyS1)
LEDS: 1 x Programmable RGB Status LED (driven by a PWM)
1 x White LED (GPIO)
1 x Orange LED Fault Indicator (GPIO)
2 x LAN Activity / Speed LEDs (On the RJ45 Port)
BUTTON: one Reset button
MISC: AT24C64 8KiB EEPROM (i2c - stores Ethernet MAC + Serial#!)
ina219 hardware monitor (i2c)
Kensington Lock
SERIAL:
WARNING: The serial port needs a TTL/RS-232 3V3 level converter!
The Serial setting is 115200-8-N-1. The board has a populated
right angle 1x4 0.1" pinheader.
The pinout is: VCC, RX, TX, GND. (Use a multimeter)
Flashing needs a serial adaptor (due to the lack of a working dropbear on
the original firmware).
This flashing procedure for the MR32 was tested with firmware:
"r23-149867:150252-aacharya".
0. Create a seperate Ethernet LAN which does not have access to the internet.
Ideally use 192.168.1.2 for your PC. Make sure to reserve 192.168.1.1 it
will be used later on by the OpenWrt firmware. The original Meraki firmware
will likely try to setup the network via DHCP Discovery, so make sure your
PC is running a DHCP-Server (i.e.: dnsmasq)
'# dnsmasq -i eth# -F 192.168.1.5,192.168.1.50
Furthermore, the PC needs a supported ssh/http/ftp server in order to
retrieve the initramfs + dtb file
1. Disassemble the MR32 device by removing all screws (4 screws are located
under the 4 rubber feets!) and prying open the plastic covers without
breaking the plastic retention clips. Once inside, remove all the screws
on the outer metal shielding to get to the PCB. It's not necessary to
remove the antennas!
2. Connect the serial cable to the serial header.
3. Partially reassemble the outer metal shielding to ensure that the SoC
has a proper heat sink.
4. Connect the Ethernet patch cable to the device and the power cable.
5. Wait for the device to boot and enter the root shell.
(rooting is not discussed in detail here please refer to
Chris Blake - "pwning the meraki mr18" blog post:
<https://servernetworktech.com/2016/02/pwning-the-meraki-mr18/>
(The same method works with the MR32's r23-149867:150252-aacharya)
Wait for the MR32 to enter the "<Meraki>" prompt and enter:
<Meraki> odm serial_num read
(Verify that it matches what's on the S/N Sticker on the back!)
<Meraki> odm serial_num write Q2XX-XXXX-XXXV
<Meraki> odm serial_num read
(Verify that the S/N has changed - and the LED start to flash)
now to flash the firmware:
<Meraki> odm firmware part.safe "http://192.168.1.2/mr32-initramfs.bin"
Once OpenWrt booted use sysupgrade to permanently install
OpenWrt. To do this: Download the latest sysupgrade.bin file
for the MR32 to the device and use sysupgrade *sysupgrade.bin
to install it.
WARNING: DO NOT DELETE the "storage" ubi volume!
To flash later MR32 Firmwares like r25-201804051805-G885d6d78-dhow-rel
requires in-circut-i2c tools to access the I2C EEPROM AT24C64 next to
the SoC. The idea is pretty much the same as from Step 5 from above:
Change the serial number to Q2XXXXXXXXXV (should be around 0x7c), then
attach a serial cable, ethernet (but make sure the device can't reach
the internet!) hit "s" (the small s!) during boot to enter the root-shell
and add the following commands to the /storage/config there:
serial_allow_odm true
serial_access_enabled true
serial_access_check false
valid_config true
and then hit exit to let it finish booting.
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
2020-08-29 21:48:00 +00:00
|
|
|
platform_check_image() {
|
|
|
|
case "$(board_name)" in
|
|
|
|
meraki,mr32)
|
|
|
|
# Ideally, REQUIRE_IMAGE_METADATA=1 would suffice
|
|
|
|
# but this would require converting all other
|
|
|
|
# devices too.
|
|
|
|
nand_do_platform_check meraki-mr32 "$1"
|
|
|
|
return $?
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
platform_other_check_image "$1"
|
|
|
|
return $?
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-11-28 10:54:19 +00:00
|
|
|
# $(1): TRX image or firmware containing TRX
|
|
|
|
# $(2): offset of TRX in firmware (optional)
|
2019-07-02 14:10:56 +00:00
|
|
|
platform_do_upgrade_nand_trx() {
|
2015-04-12 11:46:16 +00:00
|
|
|
local dir="/tmp/sysupgrade-bcm53xx"
|
|
|
|
local trx="$1"
|
2016-06-10 12:30:57 +00:00
|
|
|
local offset="$2"
|
2015-04-12 11:46:16 +00:00
|
|
|
|
|
|
|
# Extract partitions from trx
|
|
|
|
rm -fR $dir
|
|
|
|
mkdir -p $dir
|
2015-04-14 20:50:46 +00:00
|
|
|
otrx extract "$trx" \
|
2015-06-06 17:05:31 +00:00
|
|
|
${offset:+-o $offset} \
|
2015-04-12 11:46:16 +00:00
|
|
|
-1 $dir/kernel \
|
|
|
|
-2 $dir/root
|
2015-06-06 17:52:53 +00:00
|
|
|
[ $? -ne 0 ] && {
|
|
|
|
echo "Failed to extract TRX partitions."
|
|
|
|
return
|
|
|
|
}
|
2015-04-12 11:46:16 +00:00
|
|
|
|
|
|
|
# Firmwares without UBI image should be flashed "normally"
|
|
|
|
local root_type=$(identify $dir/root)
|
2015-04-21 11:04:38 +00:00
|
|
|
[ "$root_type" != "ubi" ] && {
|
|
|
|
echo "Provided firmware doesn't use UBI for rootfs."
|
|
|
|
return
|
|
|
|
}
|
2015-04-12 11:46:16 +00:00
|
|
|
|
2015-04-14 20:50:59 +00:00
|
|
|
# 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
|
|
|
|
}
|
2015-04-21 11:21:34 +00:00
|
|
|
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
|
|
|
|
}
|
2015-04-14 20:50:59 +00:00
|
|
|
rm -f /tmp/null.bin
|
|
|
|
rm -f /tmp/kernel.trx
|
|
|
|
touch /tmp/null.bin
|
|
|
|
otrx create /tmp/kernel.trx \
|
2015-04-21 11:21:34 +00:00
|
|
|
-f $dir/kernel -b $(($linux_length + 28)) \
|
2015-04-14 20:50:59 +00:00
|
|
|
-f /tmp/null.bin
|
2015-06-06 17:52:53 +00:00
|
|
|
[ $? -ne 0 ] && {
|
|
|
|
echo "Failed to create simple TRX with new kernel."
|
|
|
|
return
|
|
|
|
}
|
2015-04-14 20:50:59 +00:00
|
|
|
|
2015-04-21 08:20:06 +00:00
|
|
|
# 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
|
2020-02-20 12:40:55 +00:00
|
|
|
truncate -s $ubi_length $dir/root
|
2015-06-06 17:52:53 +00:00
|
|
|
[ $? -ne 0 ] && {
|
|
|
|
echo "Failed to prepare new UBI image."
|
|
|
|
return
|
|
|
|
}
|
2015-04-21 08:20:06 +00:00
|
|
|
|
2015-04-14 20:50:59 +00:00
|
|
|
# Flash
|
2018-06-18 11:46:04 +00:00
|
|
|
mtd write /tmp/kernel.trx firmware || exit 1
|
2020-02-20 12:40:55 +00:00
|
|
|
nand_do_upgrade $dir/root
|
2015-04-12 11:46:16 +00:00
|
|
|
}
|
|
|
|
|
2021-11-28 10:54:19 +00:00
|
|
|
platform_do_upgrade_nand_seamaseal() {
|
2016-06-10 23:50:34 +00:00
|
|
|
local dir="/tmp/sysupgrade-bcm53xx"
|
2021-11-28 10:54:19 +00:00
|
|
|
local seamaseal="$1"
|
2016-06-10 23:50:34 +00:00
|
|
|
local tmp
|
|
|
|
|
|
|
|
# Extract Seama entity from Seama seal
|
|
|
|
rm -fR $dir
|
|
|
|
mkdir -p $dir
|
2021-11-28 10:54:19 +00:00
|
|
|
oseama extract "$seamaseal" \
|
2016-06-10 23:50:34 +00:00
|
|
|
-e 0 \
|
|
|
|
-o $dir/seama.entity
|
|
|
|
[ $? -ne 0 ] && {
|
|
|
|
echo "Failed to extract Seama entity."
|
|
|
|
return
|
|
|
|
}
|
|
|
|
local entity_size=$(wc -c $dir/seama.entity | cut -d ' ' -f 1)
|
|
|
|
|
|
|
|
local ubi_offset=0
|
|
|
|
tmp=0
|
|
|
|
while [ 1 ]; do
|
|
|
|
[ $tmp -ge $entity_size ] && break
|
|
|
|
[ "$(dd if=$dir/seama.entity skip=$tmp bs=1 count=4 2>/dev/null)" = "UBI#" ] && {
|
|
|
|
ubi_offset=$tmp
|
|
|
|
break
|
|
|
|
}
|
|
|
|
tmp=$(($tmp + 131072))
|
|
|
|
done
|
|
|
|
[ $ubi_offset -eq 0 ] && {
|
|
|
|
echo "Failed to find UBI in Seama entity."
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
local ubi_length=0
|
|
|
|
while [ "$(dd if=$dir/seama.entity skip=$(($ubi_offset + $ubi_length)) bs=1 count=4 2>/dev/null)" = "UBI#" ]; do
|
|
|
|
ubi_length=$(($ubi_length + 131072))
|
|
|
|
done
|
|
|
|
|
|
|
|
dd if=$dir/seama.entity of=$dir/kernel.seama bs=131072 count=$(($ubi_offset / 131072)) 2>/dev/null
|
|
|
|
dd if=$dir/seama.entity of=$dir/root.ubi bs=131072 skip=$(($ubi_offset / 131072)) count=$(($ubi_length / 131072)) 2>/dev/null
|
|
|
|
|
|
|
|
# Flash
|
|
|
|
local kernel_size=$(sed -n 's/mtd[0-9]*: \([0-9a-f]*\).*"\(kernel\|linux\)".*/\1/p' /proc/mtd)
|
2018-06-18 11:46:04 +00:00
|
|
|
mtd write $dir/kernel.seama firmware || exit 1
|
2016-06-10 23:50:34 +00:00
|
|
|
mtd ${kernel_size:+-c 0x$kernel_size} fixseama firmware
|
|
|
|
nand_do_upgrade $dir/root.ubi
|
|
|
|
}
|
|
|
|
|
2016-11-19 06:58:26 +00:00
|
|
|
platform_img_from_safeloader() {
|
|
|
|
local dir="/tmp/sysupgrade-bcm53xx"
|
|
|
|
|
|
|
|
# Extract partitions from SafeLoader
|
|
|
|
rm -fR $dir
|
|
|
|
mkdir -p $dir
|
|
|
|
osafeloader extract "$1" \
|
|
|
|
-p "os-image" \
|
|
|
|
-o $dir/os-image
|
|
|
|
osafeloader extract "$1" \
|
|
|
|
-p "file-system" \
|
|
|
|
-o $dir/file-system
|
|
|
|
|
|
|
|
mtd write $dir/file-system rootfs
|
|
|
|
|
|
|
|
echo -n $dir/os-image
|
|
|
|
}
|
|
|
|
|
bcm53xx: add Cisco Meraki MR32
This patch adds support for Cisco Meraki MR32.
The unit was donated by Chris Blake. Thank you!
WARNING:
Only the 1x1:1 abgn Air Marshal WIPS wifi is currently supported by b43:
b43-phy2: Found PHY: Analog 9, Type 4 (N), Revision 16
b43-phy2: Found Radio: Manuf 0x17F, ID 0x2057, Revision 9, Version 1
b43-phy2: Loading firmware version 784.2 (2012-08-15 21:35:19)
and only as 802.11ABG!
while WIFI1 and WIFI2 (both BCM4352) are not:
b43-phy0: Broadcom 4352 WLAN found (core revision 42)
b43-phy0 ERROR: FOUND UNSUPPORTED PHY (Analog 12, Type 11 (AC), Revision 1)
Hardware Highlights:
SoC: Broadcom BCM53016A1 (1 GHz, 2 cores)
RAM: 128 MiB
NAND: 128 MiB Spansion S34ML01G2 (~114 MiB useable)
ETH: 1GBit Ethernet Port - PoE
WIFI1: Broadcom BCM43520 an+ac (2x2:2 - id: 0x4352)
WIFI2: Broadcom BCM43520 bgn (2x2:2 - id: 0x4352)
WIFI3: Broadcom BCM43428 abgn (1x1:1 - id: 43428)
BLE: Broadcom BCM20732 (ttyS1)
LEDS: 1 x Programmable RGB Status LED (driven by a PWM)
1 x White LED (GPIO)
1 x Orange LED Fault Indicator (GPIO)
2 x LAN Activity / Speed LEDs (On the RJ45 Port)
BUTTON: one Reset button
MISC: AT24C64 8KiB EEPROM (i2c - stores Ethernet MAC + Serial#!)
ina219 hardware monitor (i2c)
Kensington Lock
SERIAL:
WARNING: The serial port needs a TTL/RS-232 3V3 level converter!
The Serial setting is 115200-8-N-1. The board has a populated
right angle 1x4 0.1" pinheader.
The pinout is: VCC, RX, TX, GND. (Use a multimeter)
Flashing needs a serial adaptor (due to the lack of a working dropbear on
the original firmware).
This flashing procedure for the MR32 was tested with firmware:
"r23-149867:150252-aacharya".
0. Create a seperate Ethernet LAN which does not have access to the internet.
Ideally use 192.168.1.2 for your PC. Make sure to reserve 192.168.1.1 it
will be used later on by the OpenWrt firmware. The original Meraki firmware
will likely try to setup the network via DHCP Discovery, so make sure your
PC is running a DHCP-Server (i.e.: dnsmasq)
'# dnsmasq -i eth# -F 192.168.1.5,192.168.1.50
Furthermore, the PC needs a supported ssh/http/ftp server in order to
retrieve the initramfs + dtb file
1. Disassemble the MR32 device by removing all screws (4 screws are located
under the 4 rubber feets!) and prying open the plastic covers without
breaking the plastic retention clips. Once inside, remove all the screws
on the outer metal shielding to get to the PCB. It's not necessary to
remove the antennas!
2. Connect the serial cable to the serial header.
3. Partially reassemble the outer metal shielding to ensure that the SoC
has a proper heat sink.
4. Connect the Ethernet patch cable to the device and the power cable.
5. Wait for the device to boot and enter the root shell.
(rooting is not discussed in detail here please refer to
Chris Blake - "pwning the meraki mr18" blog post:
<https://servernetworktech.com/2016/02/pwning-the-meraki-mr18/>
(The same method works with the MR32's r23-149867:150252-aacharya)
Wait for the MR32 to enter the "<Meraki>" prompt and enter:
<Meraki> odm serial_num read
(Verify that it matches what's on the S/N Sticker on the back!)
<Meraki> odm serial_num write Q2XX-XXXX-XXXV
<Meraki> odm serial_num read
(Verify that the S/N has changed - and the LED start to flash)
now to flash the firmware:
<Meraki> odm firmware part.safe "http://192.168.1.2/mr32-initramfs.bin"
Once OpenWrt booted use sysupgrade to permanently install
OpenWrt. To do this: Download the latest sysupgrade.bin file
for the MR32 to the device and use sysupgrade *sysupgrade.bin
to install it.
WARNING: DO NOT DELETE the "storage" ubi volume!
To flash later MR32 Firmwares like r25-201804051805-G885d6d78-dhow-rel
requires in-circut-i2c tools to access the I2C EEPROM AT24C64 next to
the SoC. The idea is pretty much the same as from Step 5 from above:
Change the serial number to Q2XXXXXXXXXV (should be around 0x7c), then
attach a serial cable, ethernet (but make sure the device can't reach
the internet!) hit "s" (the small s!) during boot to enter the root-shell
and add the following commands to the /storage/config there:
serial_allow_odm true
serial_access_enabled true
serial_access_check false
valid_config true
and then hit exit to let it finish booting.
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
2020-08-29 21:48:00 +00:00
|
|
|
platform_other_do_upgrade() {
|
2021-11-28 10:54:19 +00:00
|
|
|
platform_identify "$1"
|
2015-04-12 10:42:27 +00:00
|
|
|
|
|
|
|
[ "$(platform_flash_type)" == "nand" ] && {
|
2021-11-28 10:54:19 +00:00
|
|
|
# Try NAND-aware upgrade
|
|
|
|
case "$BCM53XX_FW_FORMAT" in
|
|
|
|
"seamaseal")
|
|
|
|
platform_do_upgrade_nand_seamaseal "$1"
|
|
|
|
;;
|
|
|
|
"trx")
|
|
|
|
platform_do_upgrade_nand_trx "$1"
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
case "$BCM53XX_FW_INT_IMG_FORMAT" in
|
|
|
|
"trx")
|
|
|
|
platform_do_upgrade_nand_trx "$1" "$BCM53XX_FW_INT_IMG_TRX_OFFSET"
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
echo "NAND aware sysupgrade is unsupported for $BCM53XX_FW_FORMAT format"
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
;;
|
2019-07-02 14:10:56 +00:00
|
|
|
esac
|
|
|
|
|
|
|
|
# Above calls exit on success.
|
|
|
|
# If we got here something went wrong.
|
2015-04-21 11:04:38 +00:00
|
|
|
echo "Writing whole image to NAND flash. All erase counters will be lost."
|
2015-04-12 10:42:27 +00:00
|
|
|
}
|
2014-12-15 15:43:46 +00:00
|
|
|
|
2021-11-28 10:54:19 +00:00
|
|
|
case "$BCM53XX_FW_FORMAT" in
|
|
|
|
"safeloader")
|
|
|
|
PART_NAME=os-image
|
|
|
|
img=$(platform_img_from_safeloader "$1")
|
|
|
|
default_do_upgrade "$img"
|
|
|
|
;;
|
|
|
|
"seamaseal")
|
|
|
|
default_do_upgrade "$1" "$BCM53XX_FW_INT_IMG_EXTRACT_CMD"
|
|
|
|
;;
|
|
|
|
"trx")
|
|
|
|
default_do_upgrade "$1"
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
case "$BCM53XX_FW_INT_IMG_FORMAT" in
|
|
|
|
"trx")
|
|
|
|
default_do_upgrade "$1" "$BCM53XX_FW_INT_IMG_EXTRACT_CMD"
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
;;
|
2014-12-15 15:43:46 +00:00
|
|
|
esac
|
|
|
|
}
|
bcm53xx: add Cisco Meraki MR32
This patch adds support for Cisco Meraki MR32.
The unit was donated by Chris Blake. Thank you!
WARNING:
Only the 1x1:1 abgn Air Marshal WIPS wifi is currently supported by b43:
b43-phy2: Found PHY: Analog 9, Type 4 (N), Revision 16
b43-phy2: Found Radio: Manuf 0x17F, ID 0x2057, Revision 9, Version 1
b43-phy2: Loading firmware version 784.2 (2012-08-15 21:35:19)
and only as 802.11ABG!
while WIFI1 and WIFI2 (both BCM4352) are not:
b43-phy0: Broadcom 4352 WLAN found (core revision 42)
b43-phy0 ERROR: FOUND UNSUPPORTED PHY (Analog 12, Type 11 (AC), Revision 1)
Hardware Highlights:
SoC: Broadcom BCM53016A1 (1 GHz, 2 cores)
RAM: 128 MiB
NAND: 128 MiB Spansion S34ML01G2 (~114 MiB useable)
ETH: 1GBit Ethernet Port - PoE
WIFI1: Broadcom BCM43520 an+ac (2x2:2 - id: 0x4352)
WIFI2: Broadcom BCM43520 bgn (2x2:2 - id: 0x4352)
WIFI3: Broadcom BCM43428 abgn (1x1:1 - id: 43428)
BLE: Broadcom BCM20732 (ttyS1)
LEDS: 1 x Programmable RGB Status LED (driven by a PWM)
1 x White LED (GPIO)
1 x Orange LED Fault Indicator (GPIO)
2 x LAN Activity / Speed LEDs (On the RJ45 Port)
BUTTON: one Reset button
MISC: AT24C64 8KiB EEPROM (i2c - stores Ethernet MAC + Serial#!)
ina219 hardware monitor (i2c)
Kensington Lock
SERIAL:
WARNING: The serial port needs a TTL/RS-232 3V3 level converter!
The Serial setting is 115200-8-N-1. The board has a populated
right angle 1x4 0.1" pinheader.
The pinout is: VCC, RX, TX, GND. (Use a multimeter)
Flashing needs a serial adaptor (due to the lack of a working dropbear on
the original firmware).
This flashing procedure for the MR32 was tested with firmware:
"r23-149867:150252-aacharya".
0. Create a seperate Ethernet LAN which does not have access to the internet.
Ideally use 192.168.1.2 for your PC. Make sure to reserve 192.168.1.1 it
will be used later on by the OpenWrt firmware. The original Meraki firmware
will likely try to setup the network via DHCP Discovery, so make sure your
PC is running a DHCP-Server (i.e.: dnsmasq)
'# dnsmasq -i eth# -F 192.168.1.5,192.168.1.50
Furthermore, the PC needs a supported ssh/http/ftp server in order to
retrieve the initramfs + dtb file
1. Disassemble the MR32 device by removing all screws (4 screws are located
under the 4 rubber feets!) and prying open the plastic covers without
breaking the plastic retention clips. Once inside, remove all the screws
on the outer metal shielding to get to the PCB. It's not necessary to
remove the antennas!
2. Connect the serial cable to the serial header.
3. Partially reassemble the outer metal shielding to ensure that the SoC
has a proper heat sink.
4. Connect the Ethernet patch cable to the device and the power cable.
5. Wait for the device to boot and enter the root shell.
(rooting is not discussed in detail here please refer to
Chris Blake - "pwning the meraki mr18" blog post:
<https://servernetworktech.com/2016/02/pwning-the-meraki-mr18/>
(The same method works with the MR32's r23-149867:150252-aacharya)
Wait for the MR32 to enter the "<Meraki>" prompt and enter:
<Meraki> odm serial_num read
(Verify that it matches what's on the S/N Sticker on the back!)
<Meraki> odm serial_num write Q2XX-XXXX-XXXV
<Meraki> odm serial_num read
(Verify that the S/N has changed - and the LED start to flash)
now to flash the firmware:
<Meraki> odm firmware part.safe "http://192.168.1.2/mr32-initramfs.bin"
Once OpenWrt booted use sysupgrade to permanently install
OpenWrt. To do this: Download the latest sysupgrade.bin file
for the MR32 to the device and use sysupgrade *sysupgrade.bin
to install it.
WARNING: DO NOT DELETE the "storage" ubi volume!
To flash later MR32 Firmwares like r25-201804051805-G885d6d78-dhow-rel
requires in-circut-i2c tools to access the I2C EEPROM AT24C64 next to
the SoC. The idea is pretty much the same as from Step 5 from above:
Change the serial number to Q2XXXXXXXXXV (should be around 0x7c), then
attach a serial cable, ethernet (but make sure the device can't reach
the internet!) hit "s" (the small s!) during boot to enter the root-shell
and add the following commands to the /storage/config there:
serial_allow_odm true
serial_access_enabled true
serial_access_check false
valid_config true
and then hit exit to let it finish booting.
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
2020-08-29 21:48:00 +00:00
|
|
|
|
|
|
|
platform_do_upgrade() {
|
|
|
|
case "$(board_name)" in
|
|
|
|
meraki,mr32)
|
|
|
|
CI_KERNPART="part.safe"
|
|
|
|
nand_do_upgrade "$1"
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
platform_other_do_upgrade "$1"
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
|
|
|
platform_nand_pre_upgrade() {
|
|
|
|
case "$(board_name)" in
|
|
|
|
meraki,mr32)
|
|
|
|
CI_KERNPART="part.safe"
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|