[openwrt/openwrt] ath79: add support for Huawei AP6010DN
LEDE Commits
lede-commits at lists.infradead.org
Sat Nov 23 14:25:06 PST 2024
hauke pushed a commit to openwrt/openwrt.git, branch openwrt-23.05:
https://git.openwrt.org/769253775c6fedc7ed9e4f2ebd01a24459502530
commit 769253775c6fedc7ed9e4f2ebd01a24459502530
Author: Marco von Rosenberg <marcovr at selfnet.de>
AuthorDate: Sun Sep 15 19:05:36 2024 +0200
ath79: add support for Huawei AP6010DN
Huawei AP6010DN is a dual-band, dual-radio 802.11a/b/g/n 2x2 MIMO
enterprise access point with one Gigabit Ethernet port and PoE
support.
Hardware highlights:
- CPU: AR9344 SoC at 480MHz
- RAM: 128MB DDR2
- Flash: 32MB SPI-NOR
- Wi-Fi 2.4GHz: AR9344-internal radio
- Wi-Fi 5GHz: AR9580 PCIe WLAN SoC
- Ethernet: 10/100/1000 Mbps Ethernet through Atheros AR8035 PHY
- PoE: yes
- Standalone 12V/2A power input
- Serial console externally available through RJ45 port
- External watchdog: CAT706SVI (1.6s timeout)
Serial console:
9600n8 (9600 baud, no stop bits, no parity, 8 data bits)
MAC addresses:
Each device has 32 consecutive MAC addresses allocated by
the vendor, which don't overlap between devices.
This was confirmed with multiple devices with consecutive
serial numbers.
The MAC address range starts with the address on the label.
To be able to distinguish between the interfaces,
the following MAC address scheme is used:
- eth0 = label MAC
- radio0 (Wi-Fi 2.4GHz) = label MAC + 1
- radio1 (Wi-Fi 5GHz) = label MAC + 2
Installation:
0. Connect some sort of RJ45-to-USB adapter to "Console" port of the AP
1. Power up the AP
2. At prompt "Press f or F to stop Auto-Boot in 3 seconds",
do what they say.
Log in with default admin password "admin at huawei.com".
3. Boot the OpenWrt initramfs from TFTP using the hidden script "run ramboot".
Replace IP address as needed:
> setenv serverip 192.168.1.10
> setenv ipaddr 192.168.1.1
> setenv rambootfile openwrt-ath79-generic-huawei_ap6010dn-initramfs-kernel.bin
> saveenv
> run ramboot
4. Optional but recommended as the factory firmware cannot be downloaded publicly:
Back up contents of "firmware" partition using the web interface or ssh:
$ ssh root at 192.168.1.1 cat /dev/mtd11 > huawei_ap6010dn_fw_backup.bin
5. Run sysupgrade using sysupgrade image. OpenWrt
shall boot from flash afterwards.
Return to factory firmware (using firmware upgrade package downloaded from non-public Huawei website):
1. Start a TFTP server in the directory where
the firmware upgrade package is located
2. Boot to u-boot as described above
3. Install firmware upgrade package and format the config partitions:
> update system FatAP6X10XN_SOMEVERSION.bin
> format_fs
Return to factory firmware (from previously created backup):
1. Copy over the firmware partition backup to /tmp,
for example using scp
2. Use sysupgrade with force to restore the backup:
sysupgrade -F huawei_ap6010dn_fw_backup.bin
3. Boot AP to U-Boot as described above
Quirks and known issues:
- The stock firmware has a semi dual boot concept where the primary
kernel uses a squashfs as root partition and the secondary kernel uses
an initramfs. This dual boot concept is circumvented on purpose to gain
more flash space and since the stock firmware's flash layout isn't
compatible with mtdsplit.
- The external watchdog's timeout of 1.6s is very hard to satisfy
during bootup. This is why the GPIO15 pin connected to the watchdog input
is configured directly in the LZMA loader to output the AHB_CLK/2 signal
which keeps the watchdog happy until the wdt-gpio kernel driver takes
over. Because it would also take too long to read the whole kernel image
from flash, the uImage header only includes the loader which then reads
the kernel image from flash after GPIO15 is configured.
Signed-off-by: Marco von Rosenberg <marcovr at selfnet.de>
(cherry picked from commit f84a9f7dc095967e41ced96e1ea5f9b2b9f40af6)
Link: https://github.com/openwrt/openwrt/pull/16978
Signed-off-by: Hauke Mehrtens <hauke at hauke-m.de>
---
package/boot/uboot-envtools/files/ath79 | 3 +-
target/linux/ath79/dts/ar9344_huawei_ap6010dn.dts | 243 +++++++++++++++++++++
.../generic/base-files/etc/board.d/02_network | 4 +-
.../generic/base-files/lib/upgrade/platform.sh | 3 +-
target/linux/ath79/image/generic.mk | 15 ++
.../ath79/image/lzma-loader/src/ar71xx_regs.h | 1 +
target/linux/ath79/image/lzma-loader/src/board.c | 22 +-
7 files changed, 280 insertions(+), 11 deletions(-)
diff --git a/package/boot/uboot-envtools/files/ath79 b/package/boot/uboot-envtools/files/ath79
index bf9adc9e5d..cdaa575fbe 100644
--- a/package/boot/uboot-envtools/files/ath79
+++ b/package/boot/uboot-envtools/files/ath79
@@ -119,7 +119,8 @@ domywifi,dw33d)
glinet,gl-ar150)
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x8000" "0x10000"
;;
-huawei,ap5030dn)
+huawei,ap5030dn|\
+huawei,ap6010dn)
ubootenv_add_uci_config "/dev/mtd3" "0x0" "0x20000" "0x20000"
;;
netgear,wndr3700|\
diff --git a/target/linux/ath79/dts/ar9344_huawei_ap6010dn.dts b/target/linux/ath79/dts/ar9344_huawei_ap6010dn.dts
new file mode 100644
index 0000000000..2f2e6e2331
--- /dev/null
+++ b/target/linux/ath79/dts/ar9344_huawei_ap6010dn.dts
@@ -0,0 +1,243 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+#include "ar9344.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/leds/common.h>
+
+/ {
+ model = "Huawei AP6010DN";
+ compatible = "huawei,ap6010dn", "qca,ar9344";
+
+ chosen {
+ bootargs = "console=ttyS0,9600n8";
+ };
+
+ aliases {
+ led-boot = &led_function_green;
+ led-failsafe = &led_function_red;
+ led-running = &led_function_green;
+ led-upgrade = &led_function_red;
+ label-mac-device = ð0;
+ };
+
+ leds {
+ compatible = "gpio-leds";
+
+ led_function_green: led-status-green {
+ function = LED_FUNCTION_STATUS;
+ color = <LED_COLOR_ID_GREEN>;
+ gpios = <&gpio 13 GPIO_ACTIVE_HIGH>;
+ };
+
+ led_function_red: led-status-red {
+ function = LED_FUNCTION_STATUS;
+ color = <LED_COLOR_ID_RED>;
+ gpios = <&gpio 14 GPIO_ACTIVE_HIGH>;
+ };
+
+ };
+
+ keys {
+ compatible = "gpio-keys";
+
+ restart {
+ label = "reset";
+ linux,code = <KEY_RESTART>;
+ gpios = <&gpio 21 GPIO_ACTIVE_LOW>;
+ debounce-interval = <60>;
+ };
+ };
+
+ watchdog {
+ pinctrl-names = "default";
+ pinctrl-0 = <&wdt_gpio15>;
+
+ compatible = "linux,wdt-gpio";
+ gpios = <&gpio 15 GPIO_ACTIVE_HIGH>;
+ hw_algo = "toggle";
+ hw_margin_ms = <100>;
+ always-running;
+ };
+
+ virtual_flash {
+ compatible = "mtd-concat";
+ devices = <&fwconcat0 &fwconcat1>;
+
+ partitions {
+ compatible = "fixed-partitions";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ partition at 0 {
+ label = "firmware";
+ reg = <0x0 0x1e00000>;
+ compatible = "openwrt,uimage", "denx,uimage";
+ };
+ };
+ };
+};
+
+&spi {
+ status = "okay";
+
+ flash at 0 {
+ compatible = "jedec,spi-nor";
+ reg = <0>;
+ spi-max-frequency = <25000000>;
+
+ partitions {
+ compatible = "fixed-partitions";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ partition at 0 {
+ label = "u-boot-a";
+ reg = <0x0 0x80000>;
+ read-only;
+ };
+
+ partition at 80000 {
+ label = "BootupA";
+ reg = <0x80000 0x20000>;
+ };
+
+ partition at a0000 {
+ label = "BootupB";
+ reg = <0xa0000 0x20000>;
+ };
+
+ partition at c0000 {
+ label = "u-boot-env";
+ reg = <0xc0000 0x20000>;
+ read-only;
+ };
+
+ partition at e0000 {
+ label = "BoardData";
+ reg = <0xe0000 0x20000>;
+ read-only;
+ };
+
+ // In the vendor layout, there are the "SysImageA" (12 MiB)
+ // and the "ConfigA" (3 MiB) partitions here.
+ fwconcat0: partition at 100000 {
+ label = "fwconcat0";
+ reg = <0x100000 0xf00000>;
+ };
+
+ partition at 1000000 {
+ label = "u-boot-b";
+ reg = <0x1000000 0x80000>;
+ read-only;
+ };
+
+ partition at 1080000 {
+ label = "ResultA";
+ reg = <0x1080000 0x20000>;
+ read-only;
+ };
+
+ partition at 10a0000 {
+ label = "ResultB";
+ reg = <0x10a0000 0x20000>;
+ read-only;
+ };
+
+ // In the vendor layout, there are the "SysImageB" (12 MiB)
+ // and the "ConfigB" (3 MiB) partitions here.
+ fwconcat1: partition at 10c0000 {
+ label = "fwconcat1";
+ reg = <0x10c0000 0xf00000>;
+ };
+
+ art: partition at 1fc0000 {
+ label = "art";
+ reg = <0x1fc0000 0x40000>;
+ read-only;
+
+ nvmem-layout {
+ compatible = "fixed-layout";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ macaddr_art_2005b: macaddr at 2005b {
+ compatible = "mac-base";
+ reg = <0x2005b 0x6>;
+ #nvmem-cell-cells = <1>;
+ };
+
+ cal_art_1000: cal at 1000 {
+ reg = <0x1000 0x440>;
+ };
+
+ cal_art_5000: cal at 5000 {
+ reg = <0x5000 0x844>;
+ };
+ };
+ };
+ };
+ };
+};
+
+&wmac {
+ status = "okay";
+
+ nvmem-cells = <&macaddr_art_2005b 1>, <&cal_art_1000>;
+ nvmem-cell-names = "mac-address", "calibration";
+};
+
+&pcie {
+ status = "okay";
+
+ ath9k: wifi at 0,0 {
+ compatible = "pci168c,0033";
+ reg = <0x0000 0 0 0 0>;
+ gpio-controller;
+ #gpio-cells = <2>;
+
+ nvmem-cells = <&macaddr_art_2005b 2>, <&cal_art_5000>;
+ nvmem-cell-names = "mac-address", "calibration";
+ };
+};
+
+&ref {
+ clock-frequency = <40000000>;
+};
+
+ð0 {
+ status = "okay";
+
+ nvmem-cells = <&macaddr_art_2005b 0>;
+ nvmem-cell-names = "mac-address";
+
+ pll-data = <0x06000000 0x04000101 0x0c001313>;
+ phy-mode = "rgmii-id";
+ phy-handle = <&phy>;
+
+ gmac-config {
+ device = <&gmac>;
+ rgmii-gmac0 = <1>;
+ rxdv-delay = <3>;
+ rxd-delay = <3>;
+ };
+};
+
+&mdio0 {
+ status = "okay";
+
+ phy: ethernet-phy at 18 {
+ reg = <0x4>;
+ };
+};
+
+&pinmux {
+ wdt_gpio15: pinmux_wdt_gpio15 {
+ pinctrl-single,bits = <0xc 0x0 0xFF000000>;
+ };
+};
+
+&wdt {
+ status = "disabled";
+};
diff --git a/target/linux/ath79/generic/base-files/etc/board.d/02_network b/target/linux/ath79/generic/base-files/etc/board.d/02_network
index 191138f521..0907b630d2 100644
--- a/target/linux/ath79/generic/base-files/etc/board.d/02_network
+++ b/target/linux/ath79/generic/base-files/etc/board.d/02_network
@@ -50,6 +50,7 @@ ath79_setup_interfaces()
glinet,gl-ar300m-lite|\
glinet,gl-usb150|\
hak5,wifi-pineapple-nano|\
+ huawei,ap6010dn|\
meraki,mr16|\
netgear,ex7300|\
netgear,ex7300-v2|\
@@ -710,7 +711,8 @@ ath79_setup_macs()
hak5,packet-squirrel)
label_mac=$(mtd_get_mac_binary u-boot 0x1fc00)
;;
- huawei,ap5030dn)
+ huawei,ap5030dn|\
+ huawei,ap6010dn)
label_mac=$(mtd_get_mac_binary art 0x2005b)
;;
iodata,etg3-r)
diff --git a/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh b/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh
index e845057f42..48a3fe6c62 100644
--- a/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh
@@ -66,7 +66,8 @@ platform_do_upgrade() {
ROOTFS_FILE="root.squashfs"
platform_do_upgrade_failsafe_datachk "$1"
;;
- huawei,ap5030dn)
+ huawei,ap5030dn|\
+ huawei,ap6010dn)
# Store beginning address of the "firmware" partition
# as KernelA address and KernelB address, each to BootupA & BootupB
# This is the address from which the bootloader will try to load the kernel.
diff --git a/target/linux/ath79/image/generic.mk b/target/linux/ath79/image/generic.mk
index f264c14314..637788c73e 100644
--- a/target/linux/ath79/image/generic.mk
+++ b/target/linux/ath79/image/generic.mk
@@ -1643,6 +1643,21 @@ define Device/huawei_ap5030dn
endef
TARGET_DEVICES += huawei_ap5030dn
+define Device/huawei_ap6010dn
+ SOC := ar9344
+ DEVICE_VENDOR := Huawei
+ DEVICE_MODEL := AP6010DN
+ LOADER_TYPE := bin
+ LOADER_FLASH_OFFS := 0x111DC0
+ KERNEL_SIZE := 15360k
+ IMAGE_SIZE := 30720k
+ COMPILE := loader-$(1).bin
+ COMPILE/loader-$(1).bin := loader-okli-compile | pad-to 64k | uImage none
+ KERNEL := kernel-bin | append-dtb | lzma | uImage lzma -M 0x4f4b4c49 | loader-okli $(1) 8128
+ KERNEL_INITRAMFS := kernel-bin | append-dtb | lzma | loader-kernel | uImage none
+endef
+TARGET_DEVICES += huawei_ap6010dn
+
define Device/iodata_etg3-r
SOC := ar9342
DEVICE_VENDOR := I-O DATA
diff --git a/target/linux/ath79/image/lzma-loader/src/ar71xx_regs.h b/target/linux/ath79/image/lzma-loader/src/ar71xx_regs.h
index e7d7683973..9dc7c0f817 100644
--- a/target/linux/ath79/image/lzma-loader/src/ar71xx_regs.h
+++ b/target/linux/ath79/image/lzma-loader/src/ar71xx_regs.h
@@ -670,6 +670,7 @@
#define AR934X_GPIO_FUNC_SPI_CS_0_EN BIT(13)
#define AR934X_GPIO_OUT_GPIO 0x00
+#define AR934X_GPIO_OUTSEL_CLK_OBS4 0x14
#define QCA955X_GPIO_OUTSEL_CLK_OBS5 0x54
diff --git a/target/linux/ath79/image/lzma-loader/src/board.c b/target/linux/ath79/image/lzma-loader/src/board.c
index 13926e9b1e..04aa348b1f 100644
--- a/target/linux/ath79/image/lzma-loader/src/board.c
+++ b/target/linux/ath79/image/lzma-loader/src/board.c
@@ -182,34 +182,40 @@ static inline void mr18_init(void)
static inline void mr18_init(void) { }
#endif
-#ifdef CONFIG_BOARD_HUAWEI_AP5030DN
-static inline void ap5030dn_init(void)
+#if defined(CONFIG_BOARD_HUAWEI_AP5030DN) || defined(CONFIG_BOARD_HUAWEI_AP6010DN)
+static inline void huawei_ap_init(void)
{
- const unsigned int ap5030dn_watchdog_gpio = 15;
+ const unsigned int watchdog_gpio = 15;
unsigned int gpiobase, reg;
gpiobase = KSEG1ADDR(AR71XX_GPIO_BASE);
- printf("Huawei AP5030DN\n");
+ printf("Huawei AP\n");
reg = READREG(gpiobase + AR71XX_GPIO_REG_OE);
WRITEREG(gpiobase + AR71XX_GPIO_REG_OE,
- reg & ~(1 << ap5030dn_watchdog_gpio));
+ reg & ~(1 << watchdog_gpio));
/* Set GPIO15 MUX to output CLK_OBS5 (= CPU_CLK/4)
- * to keep the watchdog happy until wdt-gpio takes over
+ * or CLK_OBS4 (= AHB_CLK/2) to keep the watchdog happy
+ * until wdt-gpio takes over
*/
reg = READREG(gpiobase + AR934X_GPIO_REG_OUT_FUNC3);
+#if defined(CONFIG_BOARD_HUAWEI_AP5030DN)
WRITEREG(gpiobase + AR934X_GPIO_REG_OUT_FUNC3,
reg | (QCA955X_GPIO_OUTSEL_CLK_OBS5 << 24));
+#else if defined(CONFIG_BOARD_HUAWEI_AP6010DN)
+ WRITEREG(gpiobase + AR934X_GPIO_REG_OUT_FUNC3,
+ reg | (AR934X_GPIO_OUTSEL_CLK_OBS4 << 24));
+#endif
}
#else
-static inline void ap5030dn_init(void) { }
+static inline void huawei_ap_init(void) {}
#endif
void board_init(void)
{
tlwr1043nd_init();
mr18_init();
- ap5030dn_init();
+ huawei_ap_init();
}
More information about the lede-commits
mailing list