[openwrt/openwrt] ath79: add support for Linksys EA4500 v3
LEDE Commits
lede-commits at lists.infradead.org
Sat Nov 12 10:33:26 PST 2022
hauke pushed a commit to openwrt/openwrt.git, branch openwrt-22.03:
https://git.openwrt.org/8122aa92fdfcc8d79ba42752a0f24798d1d509ce
commit 8122aa92fdfcc8d79ba42752a0f24798d1d509ce
Author: Edward Chow <equu at openmail.cc>
AuthorDate: Wed Sep 14 08:15:58 2022 +0800
ath79: add support for Linksys EA4500 v3
Add support for the Linksys EA4500 v3 wireless router
Hardware
--------
SoC: Qualcomm Atheros QCA9558
RAM: 128M DDR2 (Winbond W971GG6KB-25)
FLASH: 128M SPI-NAND (Spansion S34ML01G100TFI00)
WLAN: QCA9558 3T3R 802.11 bgn
QCA9580 3T3R 802.11 an
ETH: Qualcomm Atheros QCA8337
UART: 115200 8n1, same as ea4500 v2
USB: 1 single USB 2.0 host port
BUTTON: Reset - WPS
LED: 1x system-LED
LEDs besides the ethernet ports are controlled
by the ethernet switch
MAC Address:
use address(sample 1) source
label 94:10:3e:xx:xx:6f caldata at cal_macaddr
lan 94:10:3e:xx:xx:6f $label
wan 94:10:3e:xx:xx:6f $label
WiFi4_2G 94:10:3e:xx:xx:70 caldata at cal_ath9k_soc
WiFi4_5G 94:10:3e:xx:xx:71 caldata at cal_ath9k_pci
Installation from Serial Console
------------
1. Connect to the serial console. Power up the device and interrupt
autoboot when prompted
2. Connect a TFTP server reachable at 192.168.1.0/24
(e.g. 192.168.1.66) to the ethernet port. Serve the OpenWrt
initramfs image as "openwrt.bin"
3. To test OpenWrt only, go to step 4 and never execute step 5;
To install, auto_recovery should be disabled first, and boot_part
should be set to 1 if its current value is not.
ath> setenv auto_recovery no
ath> setenv boot_part 1
ath> saveenv
4. Boot the initramfs image using U-Boot
ath> setenv serverip 192.168.1.66
ath> tftpboot 0x84000000 openwrt.bin
ath> bootm
5. Copy the OpenWrt sysupgrade image to the device using scp and
install it like a normal upgrade (with no need to keeping config
since no config from "previous OpenWRT installation" could be kept
at all)
# sysupgrade -n /path/to/openwrt/sysupgrade.bin
Note: Like many other routers produced by Linksys, it has a dual
firmware flash layout, but because I do not know how to handle
it, I decide to disable it for more usable space. (That is why
the "auto_recovery" above should be disabled before installing
OpenWRT.) If someone is interested in generating factory
firmware image capable to flash from stock firmware, as well as
restoring the dual firmware layout, commented-out layout for the
original secondary partitions left in the device tree may be a
useful hint.
Installation from Web Interface
------------
1. Login to the router via its web interface (default password: admin)
2. Find the firmware update interface under "Connectivity/Basic"
3. Choose the OpenWrt factory image and click "Start"
4. If the router still boots into the stock firmware, it means that
the OpenWrt factory image has been installed to the secondary
partitions and failed to boot (since OpenWrt on EA4500 v3 does not
support dual boot yet), and the router switched back to the stock
firmware on the primary partitions. You have to install a stock
firmware (e.g. 3.1.6.172023, downloadable from
https://www.linksys.com/support-article?articleNum=148385 ) first
(to the secondary partitions) , and after that, install OpenWrt
factory image (to the primary partitions). After successful
installation of OpenWrt, auto_recovery will be automatically
disabled and router will only boot from the primary partitions.
Signed-off-by: Edward Chow <equu at openmail.cc>
(cherry picked from commit 50f727b7737d118f7d44986181e305af0624c41d)
---
package/boot/uboot-envtools/files/ath79 | 3 +-
.../linux/ath79/dts/qca9558_linksys_ea4500-v3.dts | 211 +++++++++++++++++++++
target/linux/ath79/image/nand.mk | 19 ++
.../ath79/nand/base-files/etc/board.d/02_network | 4 +
.../ath79/nand/base-files/etc/init.d/bootcount | 4 +
5 files changed, 240 insertions(+), 1 deletion(-)
diff --git a/package/boot/uboot-envtools/files/ath79 b/package/boot/uboot-envtools/files/ath79
index 2bd8ad6d80..8aa82ee66f 100644
--- a/package/boot/uboot-envtools/files/ath79
+++ b/package/boot/uboot-envtools/files/ath79
@@ -80,7 +80,8 @@ buffalo,wzr-hp-ag300h)
ubootenv_add_uci_config "/dev/mtd3" "0x0" "0x10000" "0x10000"
;;
buffalo,wzr-hp-g300nh-rb|\
-buffalo,wzr-hp-g300nh-s)
+buffalo,wzr-hp-g300nh-s|\
+linksys,ea4500-v3)
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000" "0x20000"
;;
domywifi,dw33d)
diff --git a/target/linux/ath79/dts/qca9558_linksys_ea4500-v3.dts b/target/linux/ath79/dts/qca9558_linksys_ea4500-v3.dts
new file mode 100644
index 0000000000..000dbce8e1
--- /dev/null
+++ b/target/linux/ath79/dts/qca9558_linksys_ea4500-v3.dts
@@ -0,0 +1,211 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+#include "qca955x.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+ compatible = "linksys,ea4500-v3", "qca,qca9558";
+ model = "Linksys EA4500 v3";
+
+ aliases {
+ led-boot = &led_system;
+ led-failsafe = &led_system;
+ led-running = &led_system;
+ led-upgrade = &led_system;
+ label-mac-device = ð1;
+ };
+
+ leds {
+ compatible = "gpio-leds";
+
+ led_system: system {
+ label = "green:system";
+ gpios = <&gpio 21 GPIO_ACTIVE_HIGH>;
+ default-state = "on";
+ };
+ };
+
+ keys {
+ compatible = "gpio-keys";
+
+ reset {
+ label = "reset";
+ linux,code = <KEY_RESTART>;
+ gpios = <&gpio 17 GPIO_ACTIVE_LOW>;
+ debounce-interval = <60>;
+ };
+
+ wps {
+ label = "wps";
+ linux,code = <KEY_WPS_BUTTON>;
+ gpios = <&gpio 16 GPIO_ACTIVE_LOW>;
+ debounce-interval = <60>;
+ };
+ };
+};
+
+&pcie0 {
+ status = "okay";
+
+ wifi at 0,0 {
+ compatible = "pci168c,0033";
+ reg = <0x0000 0 0 0 0>;
+ nvmem-cells = <&cal_ath9k_pci>;
+ nvmem-cell-names = "calibration";
+ };
+};
+
+&usb_phy0 {
+ status = "okay";
+};
+
+&usb0 {
+ status = "okay";
+};
+
+&nand {
+ status = "okay";
+
+ partitions {
+ compatible = "fixed-partitions";
+
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ partition at 0 {
+ label = "uboot";
+ reg = <0x0 0x100000>;
+ read-only;
+ };
+
+ partition at 100000 {
+ label = "u_env";
+ reg = <0x100000 0x40000>;
+ };
+
+ partition at 140000 {
+ label = "caldata";
+ reg = <0x140000 0x40000>;
+ read-only;
+
+ compatible = "nvmem-cells";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ cal_macaddr: macaddr at 0 {
+ reg = <0x6 0x6>;
+ };
+
+ cal_ath9k_soc: cal_ath9k at 1000 {
+ reg = <0x1000 0x440>;
+ };
+
+ cal_ath9k_pci: cal_ath9k at 5000 {
+ reg = <0x5000 0x440>;
+ };
+ };
+
+ partition at 180000 {
+ label = "s_env";
+ reg = <0x180000 0x40000>;
+ read-only;
+ };
+
+ partition at 1c0000 {
+ label = "devinfo";
+ reg = <0x1c0000 0x100000>;
+ read-only;
+ };
+
+ partition at 2c0000 {
+ label = "firmware";
+ reg = <0x2c0000 0x5000000>;
+
+ compatible = "fixed-partitions";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ partition at 0 {
+ label = "kernel";
+ reg = <0x0 0x400000>;
+ };
+
+ partition at 400000 {
+ label = "ubi";
+ reg = <0x400000 0x4c00000>;
+ };
+
+ /* Original layout for secondary partitions */
+ /* partition at 2800000 {
+ label = "kernel2";
+ reg = <0x2800000 0x400000>;
+ };
+
+ partition at 2c00000 {
+ label = "ubi2";
+ reg = <0x2c00000 0x2400000>;
+ }; */
+ };
+
+ partition at 52c0000 {
+ label = "syscfg";
+ reg = <0x52c0000 0x2d40000>;
+ read-only;
+ };
+ };
+};
+
+&mdio0 {
+ status = "okay";
+
+ phy0: ethernet-phy at 0 {
+ reg = <0>;
+
+ qca,ar8327-initvals = <
+ 0x04 0x07600000 /* PORT0 PAD MODE CTRL: RGMII, to eth0 */
+ 0x0c 0x00000080 /* PORT6 PAD MODE CTRL: SGMII, to eth1 */
+ 0x50 0xc833c833 /* LED_CTRL0: orange, blinking with act */
+ 0x54 0xcf85cf85 /* LED_CTRL1: green, on with link */
+ 0x58 0x00000000 /* LED_CTRL2: unpopulated */
+ 0x5c 0x00f3cf00 /* LED_CTRL3: enable led 0 and 1 */
+ 0x7c 0x0000007e /* PORT0_STATUS */
+ 0x94 0x0000007e /* PORT6 STATUS */
+ >;
+ };
+};
+
+ð0 {
+ status = "okay";
+
+ nvmem-cells = <&cal_macaddr>;
+ nvmem-cell-names = "mac-address";
+ phy-handle = <&phy0>;
+ pll-data = <0x96000000 0x00000101 0x00001616>;
+
+ gmac-config {
+ device = <&gmac>;
+ rgmii-enabled = <1>;
+ };
+};
+
+ð1 {
+ status = "okay";
+
+ nvmem-cells = <&cal_macaddr>;
+ nvmem-cell-names = "mac-address";
+ pll-data = <0x03000101 0x00000101 0x00001616>;
+
+ fixed-link {
+ speed = <1000>;
+ full-duplex;
+ };
+};
+
+&wmac {
+ status = "okay";
+
+ nvmem-cells = <&cal_ath9k_soc>;
+ nvmem-cell-names = "calibration";
+};
diff --git a/target/linux/ath79/image/nand.mk b/target/linux/ath79/image/nand.mk
index 1d086b1918..1bf7227017 100644
--- a/target/linux/ath79/image/nand.mk
+++ b/target/linux/ath79/image/nand.mk
@@ -211,6 +211,25 @@ define Device/glinet_gl-xe300
endef
TARGET_DEVICES += glinet_gl-xe300
+define Device/linksys_ea4500-v3
+ SOC := qca9558
+ DEVICE_VENDOR := Linksys
+ DEVICE_MODEL := EA4500
+ DEVICE_VARIANT := v3
+ DEVICE_PACKAGES := kmod-usb2
+ BLOCKSIZE := 128k
+ PAGESIZE := 2048
+ KERNEL_SIZE := 4096k
+ IMAGE_SIZE := 81920k
+ IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
+ LINKSYS_HWNAME := EA4500V3
+ IMAGES += factory.img
+ IMAGE/factory.img := append-kernel | pad-to $$$$(KERNEL_SIZE) | \
+ append-ubi | check-size | linksys-image type=$$$$(LINKSYS_HWNAME)
+ UBINIZE_OPTS := -E 5
+endef
+TARGET_DEVICES += linksys_ea4500-v3
+
# fake rootfs is mandatory, pad-offset 129 equals (2 * uimage_header + 0xff)
define Device/netgear_ath79_nand
DEVICE_VENDOR := NETGEAR
diff --git a/target/linux/ath79/nand/base-files/etc/board.d/02_network b/target/linux/ath79/nand/base-files/etc/board.d/02_network
index b533e5be6c..3c5627e2a4 100644
--- a/target/linux/ath79/nand/base-files/etc/board.d/02_network
+++ b/target/linux/ath79/nand/base-files/etc/board.d/02_network
@@ -30,6 +30,10 @@ ath79_setup_interfaces()
ucidef_add_switch "switch0" \
"0 at eth0" "4:lan"
;;
+ linksys,ea4500-v3)
+ ucidef_add_switch "switch0" \
+ "6 at eth1" "1:lan" "2:lan" "3:lan" "4:lan" "5:wan" "0 at eth0"
+ ;;
netgear,r6100)
ucidef_set_interface_wan "eth1"
ucidef_add_switch "switch0" \
diff --git a/target/linux/ath79/nand/base-files/etc/init.d/bootcount b/target/linux/ath79/nand/base-files/etc/init.d/bootcount
index 87654ba095..4d7a814f05 100755
--- a/target/linux/ath79/nand/base-files/etc/init.d/bootcount
+++ b/target/linux/ath79/nand/base-files/etc/init.d/bootcount
@@ -8,5 +8,9 @@ boot() {
glinet,gl-ar300m-nand)
fw_setenv bootcount 0
;;
+ linksys,ea4500-v3)
+ [ $(fw_printenv -n auto_recovery) = yes ] && \
+ fw_setenv auto_recovery no
+ ;;
esac
}
More information about the lede-commits
mailing list