2019-01-24 03:20:55 +00:00
|
|
|
linksys_get_target_firmware() {
|
mtd: base-files: Unify dual-firmware devices (Linksys)
Consistently handle boot-count reset and upgrade across
ipq40xx, ipq806x, kirkwood, mvebu
Dual-firmware devices often utilize a specific MTD partition
to record the number of times the boot loader has initiated boot.
Most of these devices are NAND, typically with a 2k erase size.
When this code was ported to the ipq40xx platform, the device in hand
used NOR for this partition, with a 16-byte "record" size. As the
implementation of `mtd resetbc` is by-platform, the hard-coded nature
of this change prevented proper operation of a NAND-based device.
* Unified the "NOR" variant with the rest of the Linksys variants
* Added logging to indicate success and failure
* Provided a meaningful return value for scripting
* "Protected" the use of `mtd resetbc` in start-up scripts so that
failure does not end the boot sequence
* Moved Linksys-specific actions into common `/etc/init.d/bootcount`
For upgrade, these devices need to determine which partition to flash,
as well as set certain U-Boot envirnment variables to change the next
boot to the newly flashed version.
* Moved upgrade-related environment changes out of bootcount
* Combined multiple flashes of environment into single one
* Current-partition detection now handles absence of `boot_part`
Runtime-tested: Linksys EA8300
Signed-off-by: Jeff Kletsky <git-commits@allycomm.com>
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
[checkpatch.pl fixes, traded split strings for 80+ chars per line]
2019-04-10 15:28:01 +00:00
|
|
|
local cur_boot_part mtd_ubi0
|
|
|
|
|
2019-06-15 21:40:56 +00:00
|
|
|
cur_boot_part="$(/usr/sbin/fw_printenv -n boot_part)"
|
|
|
|
if [ -z "${cur_boot_part}" ]; then
|
2023-02-15 03:06:05 +00:00
|
|
|
mtd_ubi0=$(cat /sys/class/ubi/ubi0/mtd_num)
|
2019-06-15 21:40:56 +00:00
|
|
|
case "$(grep -E "^mtd${mtd_ubi0}:" /proc/mtd | cut -d '"' -f 2)" in
|
mtd: base-files: Unify dual-firmware devices (Linksys)
Consistently handle boot-count reset and upgrade across
ipq40xx, ipq806x, kirkwood, mvebu
Dual-firmware devices often utilize a specific MTD partition
to record the number of times the boot loader has initiated boot.
Most of these devices are NAND, typically with a 2k erase size.
When this code was ported to the ipq40xx platform, the device in hand
used NOR for this partition, with a 16-byte "record" size. As the
implementation of `mtd resetbc` is by-platform, the hard-coded nature
of this change prevented proper operation of a NAND-based device.
* Unified the "NOR" variant with the rest of the Linksys variants
* Added logging to indicate success and failure
* Provided a meaningful return value for scripting
* "Protected" the use of `mtd resetbc` in start-up scripts so that
failure does not end the boot sequence
* Moved Linksys-specific actions into common `/etc/init.d/bootcount`
For upgrade, these devices need to determine which partition to flash,
as well as set certain U-Boot envirnment variables to change the next
boot to the newly flashed version.
* Moved upgrade-related environment changes out of bootcount
* Combined multiple flashes of environment into single one
* Current-partition detection now handles absence of `boot_part`
Runtime-tested: Linksys EA8300
Signed-off-by: Jeff Kletsky <git-commits@allycomm.com>
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
[checkpatch.pl fixes, traded split strings for 80+ chars per line]
2019-04-10 15:28:01 +00:00
|
|
|
kernel|rootfs)
|
|
|
|
cur_boot_part=1
|
|
|
|
;;
|
|
|
|
alt_kernel|alt_rootfs)
|
|
|
|
cur_boot_part=2
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
>&2 printf "Current boot_part='%s' selected from ubi0/mtd_num='%s'" \
|
|
|
|
"${cur_boot_part}" "${mtd_ubi0}"
|
2019-01-24 03:20:55 +00:00
|
|
|
fi
|
|
|
|
|
2020-09-09 22:45:02 +00:00
|
|
|
# OEM U-Boot for EA6350v3, EA8300 and MR8300; bootcmd=
|
mtd: base-files: Unify dual-firmware devices (Linksys)
Consistently handle boot-count reset and upgrade across
ipq40xx, ipq806x, kirkwood, mvebu
Dual-firmware devices often utilize a specific MTD partition
to record the number of times the boot loader has initiated boot.
Most of these devices are NAND, typically with a 2k erase size.
When this code was ported to the ipq40xx platform, the device in hand
used NOR for this partition, with a 16-byte "record" size. As the
implementation of `mtd resetbc` is by-platform, the hard-coded nature
of this change prevented proper operation of a NAND-based device.
* Unified the "NOR" variant with the rest of the Linksys variants
* Added logging to indicate success and failure
* Provided a meaningful return value for scripting
* "Protected" the use of `mtd resetbc` in start-up scripts so that
failure does not end the boot sequence
* Moved Linksys-specific actions into common `/etc/init.d/bootcount`
For upgrade, these devices need to determine which partition to flash,
as well as set certain U-Boot envirnment variables to change the next
boot to the newly flashed version.
* Moved upgrade-related environment changes out of bootcount
* Combined multiple flashes of environment into single one
* Current-partition detection now handles absence of `boot_part`
Runtime-tested: Linksys EA8300
Signed-off-by: Jeff Kletsky <git-commits@allycomm.com>
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
[checkpatch.pl fixes, traded split strings for 80+ chars per line]
2019-04-10 15:28:01 +00:00
|
|
|
# if test $auto_recovery = no;
|
|
|
|
# then bootipq;
|
|
|
|
# elif test $boot_part = 1;
|
|
|
|
# then run bootpart1;
|
|
|
|
# else run bootpart2;
|
|
|
|
# fi
|
2019-01-24 03:20:55 +00:00
|
|
|
|
2019-06-15 21:40:56 +00:00
|
|
|
case "$cur_boot_part" in
|
mtd: base-files: Unify dual-firmware devices (Linksys)
Consistently handle boot-count reset and upgrade across
ipq40xx, ipq806x, kirkwood, mvebu
Dual-firmware devices often utilize a specific MTD partition
to record the number of times the boot loader has initiated boot.
Most of these devices are NAND, typically with a 2k erase size.
When this code was ported to the ipq40xx platform, the device in hand
used NOR for this partition, with a 16-byte "record" size. As the
implementation of `mtd resetbc` is by-platform, the hard-coded nature
of this change prevented proper operation of a NAND-based device.
* Unified the "NOR" variant with the rest of the Linksys variants
* Added logging to indicate success and failure
* Provided a meaningful return value for scripting
* "Protected" the use of `mtd resetbc` in start-up scripts so that
failure does not end the boot sequence
* Moved Linksys-specific actions into common `/etc/init.d/bootcount`
For upgrade, these devices need to determine which partition to flash,
as well as set certain U-Boot envirnment variables to change the next
boot to the newly flashed version.
* Moved upgrade-related environment changes out of bootcount
* Combined multiple flashes of environment into single one
* Current-partition detection now handles absence of `boot_part`
Runtime-tested: Linksys EA8300
Signed-off-by: Jeff Kletsky <git-commits@allycomm.com>
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
[checkpatch.pl fixes, traded split strings for 80+ chars per line]
2019-04-10 15:28:01 +00:00
|
|
|
1)
|
|
|
|
fw_setenv -s - <<-EOF
|
|
|
|
boot_part 2
|
|
|
|
auto_recovery yes
|
|
|
|
EOF
|
|
|
|
printf "alt_kernel"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
2)
|
|
|
|
fw_setenv -s - <<-EOF
|
|
|
|
boot_part 1
|
|
|
|
auto_recovery yes
|
|
|
|
EOF
|
|
|
|
printf "kernel"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
2019-01-24 03:20:55 +00:00
|
|
|
}
|
|
|
|
|
2022-12-02 02:00:30 +00:00
|
|
|
linksys_is_factory_image() {
|
|
|
|
local board=$(board_name)
|
|
|
|
board=${board##*,}
|
|
|
|
|
|
|
|
# check matching footer signature
|
|
|
|
tail -c 256 $1 | grep -q -i "\.LINKSYS\.........${board}"
|
|
|
|
}
|
|
|
|
|
2019-01-24 03:20:55 +00:00
|
|
|
platform_do_upgrade_linksys() {
|
|
|
|
local magic_long="$(get_magic_long "$1")"
|
|
|
|
|
2019-06-15 21:40:56 +00:00
|
|
|
local rm_oem_fw_vols="squashfs ubifs" # from OEM [alt_]rootfs UBI
|
|
|
|
local vol
|
|
|
|
|
2019-01-24 03:20:55 +00:00
|
|
|
mkdir -p /var/lock
|
|
|
|
local part_label="$(linksys_get_target_firmware)"
|
|
|
|
touch /var/lock/fw_printenv.lock
|
|
|
|
|
2019-06-15 21:40:56 +00:00
|
|
|
if [ -z "$part_label" ]; then
|
2019-01-24 03:20:55 +00:00
|
|
|
echo "cannot find target partition"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
2019-06-15 21:40:56 +00:00
|
|
|
local target_mtd=$(find_mtd_part "$part_label")
|
2019-01-24 03:20:55 +00:00
|
|
|
|
|
|
|
[ "$magic_long" = "73797375" ] && {
|
|
|
|
CI_KERNPART="$part_label"
|
|
|
|
if [ "$part_label" = "kernel" ]; then
|
|
|
|
CI_UBIPART="rootfs"
|
|
|
|
else
|
|
|
|
CI_UBIPART="alt_rootfs"
|
|
|
|
fi
|
|
|
|
|
2019-06-15 21:40:56 +00:00
|
|
|
local mtdnum="$(find_mtd_index "$CI_UBIPART")"
|
2019-01-24 03:20:55 +00:00
|
|
|
if [ ! "$mtdnum" ]; then
|
|
|
|
echo "cannot find ubi mtd partition $CI_UBIPART"
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
|
2019-06-15 21:40:56 +00:00
|
|
|
local ubidev="$(nand_find_ubi "$CI_UBIPART")"
|
2019-01-24 03:20:55 +00:00
|
|
|
if [ ! "$ubidev" ]; then
|
|
|
|
ubiattach -m "$mtdnum"
|
|
|
|
sync
|
2019-06-15 21:40:56 +00:00
|
|
|
ubidev="$(nand_find_ubi "$CI_UBIPART")"
|
2019-01-24 03:20:55 +00:00
|
|
|
fi
|
|
|
|
|
|
|
|
if [ "$ubidev" ]; then
|
2019-06-15 21:40:56 +00:00
|
|
|
for vol in $rm_oem_fw_vols; do
|
|
|
|
ubirmvol "/dev/$ubidev" -N "$vol" 2>/dev/null
|
|
|
|
done
|
2019-01-24 03:20:55 +00:00
|
|
|
fi
|
|
|
|
|
|
|
|
# complete std upgrade
|
2023-01-04 07:17:03 +00:00
|
|
|
if nand_upgrade_tar "$1" ; then
|
|
|
|
nand_do_upgrade_success
|
|
|
|
else
|
2023-04-07 13:10:29 +00:00
|
|
|
nand_do_upgrade_failed
|
2023-01-04 07:17:03 +00:00
|
|
|
fi
|
|
|
|
|
2019-01-24 03:20:55 +00:00
|
|
|
}
|
2019-06-15 21:40:56 +00:00
|
|
|
|
2019-01-24 03:20:55 +00:00
|
|
|
[ "$magic_long" = "27051956" ] && {
|
2021-03-20 10:48:27 +00:00
|
|
|
echo "writing \"$1\" image to \"$part_label\""
|
|
|
|
get_image "$1" | mtd write - "$part_label"
|
2019-01-24 03:20:55 +00:00
|
|
|
}
|
2022-12-02 02:00:30 +00:00
|
|
|
|
|
|
|
[ "$magic_long" = "d00dfeed" ] && {
|
|
|
|
if ! linksys_is_factory_image "$1"; then
|
|
|
|
echo "factory image doesn't match device"
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo "writing \"$1\" factory image to \"$part_label\""
|
|
|
|
get_image "$1" | mtd -e "$part_label" write - "$part_label"
|
|
|
|
}
|
2019-01-24 03:20:55 +00:00
|
|
|
}
|
ipq40xx: add support for Linksys WHW03 V1
Hardware:
=========
SOC: Qualcomm IPQ4019
WiFi 1: QCA4019 IEEE 802.11b/g/n
WiFi 2: QCA4019 IEEE 802.11a/n/ac
WiFi 3: QCA9886 IEEE 802.11a/n/ac
Bluetooth: Qualcomm CSR8510 (A10)
Zigbee: Silicon Labs EM3581 NCP + Skyworks SE2432L
Ethernet: Qualcomm Atheros QCA8072 (2-port)
Flash: Samsung KLM4G1FEPD (4GB eMMC)
RAM (NAND): 512MB
LED Controller: NXP PCA9633 (I2C)
Buttons: Single reset button (GPIO).
Ethernet:
=========
The device has 2 ethernet ports, configured as follows by default:
- left port: WAN
- right port: LAN
Wifi:
=====
The Wifi radios are turned off by default. To configure the router,
you will need to connect your computer to the LAN port of the device.
Bluetooth and Zigbee:
=====================
Configuration included but not tested.
Storage:
========
For compatibility with stock firmware, all of OpenWrt runs in a 136 MiB
eMMC partition (of which there are two copies, see below). You can also
use partition /dev/mmcblk0p19 "syscfg" (3.4 GiB) any way you see fit.
During very limited tests, stock firmware did not mount this partition.
However, backing up its stock content before use is recommended anyway.
Firmware:
=========
The device uses a dual firmware mechanism: it automatically reverts to
the previous firmware after 3 failed boot attempts.
You can switch to the inactive firmware copy by changing the "boot_part"
U-Boot environment variable. You can also do it by turning on the device
for a couple of seconds and then back off, 3 times in a row.
Installation:
=============
OpenWrt's "factory" image can be installed via the stock web UI:
1. Login to the UI. (The default password is printed on the label.)
2. Enter support mode by clicking on the "CA" link at the bottom.
3. Click "Connectivity", "Choose file", "Start", and ignore warnings.
This port is based on work done by flipy (https://github.com/flipy).
Signed-off-by: Rodrigo Balerdi <lanchon@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/15345
Signed-off-by: Robert Marko <robimarko@gmail.com>
2024-04-11 15:14:19 +00:00
|
|
|
|
|
|
|
linksys_get_cmdline_rootfs_device() {
|
|
|
|
if read cmdline < /proc/cmdline; then
|
|
|
|
case "$cmdline" in
|
|
|
|
*root=*)
|
|
|
|
local str="${cmdline##*root=}"
|
|
|
|
echo "${str%% *}"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
fi
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
|
|
|
linksys_get_current_boot_part_emmc() {
|
|
|
|
local boot_part="$(fw_printenv -n boot_part)"
|
|
|
|
if [ "$boot_part" = 1 ] || [ "$boot_part" = 2 ]; then
|
|
|
|
v "Current boot_part=$boot_part selected from bootloader environment"
|
|
|
|
else
|
|
|
|
local rootfs_device="$(linksys_get_cmdline_rootfs_device)"
|
|
|
|
if [ "$rootfs_device" = "$(find_mmc_part "rootfs")" ]; then
|
|
|
|
boot_part=1
|
|
|
|
elif [ "$rootfs_device" = "$(find_mmc_part "alt_rootfs")" ]; then
|
|
|
|
boot_part=2
|
|
|
|
else
|
|
|
|
v "Could not determine current boot_part"
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
v "Current boot_part=$boot_part selected from cmdline rootfs=$rootfs_device"
|
|
|
|
fi
|
|
|
|
echo $boot_part
|
|
|
|
}
|
|
|
|
|
|
|
|
linksys_set_target_partitions_emmc() {
|
|
|
|
local current_boot_part="$1"
|
|
|
|
|
|
|
|
if [ "$current_boot_part" = 1 ]; then
|
|
|
|
CI_KERNPART="alt_kernel"
|
|
|
|
CI_ROOTPART="alt_rootfs"
|
|
|
|
fw_setenv -s - <<-EOF
|
|
|
|
boot_part 2
|
|
|
|
auto_recovery yes
|
|
|
|
EOF
|
|
|
|
elif [ "$current_boot_part" = 2 ]; then
|
|
|
|
CI_KERNPART="kernel"
|
|
|
|
CI_ROOTPART="rootfs"
|
|
|
|
fw_setenv -s - <<-EOF
|
|
|
|
boot_part 1
|
|
|
|
auto_recovery yes
|
|
|
|
EOF
|
|
|
|
else
|
|
|
|
v "Could not set target eMMC partitions"
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
v "Target eMMC partitions: $CI_KERNPART, $CI_ROOTPART"
|
|
|
|
}
|
|
|
|
|
|
|
|
platform_do_upgrade_linksys_emmc() {
|
|
|
|
local file="$1"
|
|
|
|
|
|
|
|
mkdir -p /var/lock
|
|
|
|
local current_boot_part="$(linksys_get_current_boot_part_emmc)"
|
|
|
|
linksys_set_target_partitions_emmc "$current_boot_part" || exit 1
|
|
|
|
touch /var/lock/fw_printenv.lock
|
|
|
|
|
|
|
|
emmc_do_upgrade "$file"
|
|
|
|
}
|