ramips: add support for ipTIME AX2004M
authorSungbo Eo <mans0n@gorani.run>
Sat, 29 Jan 2022 14:25:32 +0000 (23:25 +0900)
committerSungbo Eo <mans0n@gorani.run>
Fri, 11 Feb 2022 13:30:04 +0000 (22:30 +0900)
ipTIME AX2004M is an 802.11ax (Wi-Fi 6) router, based on MediaTek
MT7621A.

Specifications:
* SoC: MT7621A
* RAM: 256 MiB
* Flash: NAND 128 MiB
* Wi-Fi:
  * MT7915D: 2.4/5 GHz (DBDC)
* Ethernet: 5x 1GbE
  * Switch: SoC built-in
* USB: 1x 3.0
* UART: J4 (115200 baud)
  * Pinout: [3V3] (TXD) (RXD) (GND)

MAC addresses:

| interface |    MAC address    |     source     | comment
|-----------|-------------------|----------------|---------
|       LAN | 58:xx:xx:00:xx:9B |                | [1]
|       WAN | 58:xx:xx:00:xx:99 |                |
|   WLAN 2G | 58:xx:xx:00:xx:98 | factory 0x4    |
|   WLAN 5G | 5A:xx:xx:40:xx:98 |                |
|           | 58:xx:xx:00:xx:98 | config ethaddr |

[1] Used in this patch as WLAN 5G MAC address with the local bit set

Load addresses:
* stock
  * 0x80010000: FIT image
  * 0x81001000: kernel image -> entry
* OpenWrt
  * 0x80010000: FIT image
  * 0x82000000: uncompressed kernel+relocate image
  * 0x80001000: relocated kernel image -> entry

Notes:
* This device has a dual-boot partition scheme, but this firmware works
  only on boot partition 1. The stock web interface will flash only on the
  inactive boot partition, but the recovery web page will always flash on
  boot partition 1.

Installation via recovery mode:
1.  Press reset button, power up the device, wait >10s for CPU LED
    to stop blinking.
2.  Upload recovery image through the recovery web page at 192.168.0.1.

Revert to stock firmware:
1.  Install stock image via recovery mode.

Signed-off-by: Sungbo Eo <mans0n@gorani.run>
include/image-commands.mk
target/linux/ramips/dts/mt7621_iptime_ax2004m.dts [new file with mode: 0644]
target/linux/ramips/image/mt7621.mk
target/linux/ramips/mt7621/base-files/etc/hotplug.d/ieee80211/10_fix_wifi_mac
target/linux/ramips/mt7621/base-files/lib/upgrade/platform.sh

index eda3fee94b2e031367a1b9b9712ee10fe5e74c99..485d870f050a83db2fa7a264f600b99e31d1eece 100644 (file)
@@ -295,6 +295,11 @@ define Build/install-dtb
        )
 endef
 
+define Build/iptime-crc32
+       $(STAGING_DIR_HOST)/bin/iptime-crc32 $(1) $@ $@.new
+       mv $@.new $@
+endef
+
 define Build/iptime-naspkg
        $(STAGING_DIR_HOST)/bin/iptime-naspkg $(1) $@ $@.new
        mv $@.new $@
diff --git a/target/linux/ramips/dts/mt7621_iptime_ax2004m.dts b/target/linux/ramips/dts/mt7621_iptime_ax2004m.dts
new file mode 100644 (file)
index 0000000..6da2236
--- /dev/null
@@ -0,0 +1,165 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+#include "mt7621.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+       compatible = "iptime,ax2004m", "mediatek,mt7621-soc";
+       model = "ipTIME AX2004M";
+
+       aliases {
+               led-boot = &led_cpu;
+               led-failsafe = &led_cpu;
+               led-running = &led_cpu;
+               led-upgrade = &led_cpu;
+       };
+
+       chosen {
+               bootargs = "console=ttyS0,115200";
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               led_cpu: cpu {
+                       label = "amber:cpu";
+                       gpios = <&gpio 18 GPIO_ACTIVE_LOW>;
+               };
+
+               wlan2g {
+                       label = "amber:wlan2g";
+                       gpios = <&gpio 17 GPIO_ACTIVE_LOW>;
+                       linux,default-trigger = "phy0radio";
+               };
+
+               wlan5g {
+                       label = "amber:wlan5g";
+                       gpios = <&gpio 14 GPIO_ACTIVE_LOW>;
+                       linux,default-trigger = "phy1radio";
+               };
+       };
+
+       keys {
+               compatible = "gpio-keys";
+
+               reset {
+                       label = "reset";
+                       gpios = <&gpio 4 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_RESTART>;
+               };
+       };
+};
+
+&nand {
+       status = "okay";
+
+       partitions {
+               compatible = "fixed-partitions";
+               #address-cells = <1>;
+               #size-cells = <1>;
+
+               partition@0 {
+                       label = "u-boot";
+                       reg = <0x0 0x80000>;
+                       read-only;
+               };
+
+               partition@80000 {
+                       label = "config";
+                       reg = <0x80000 0x80000>;
+                       read-only;
+               };
+
+               factory: partition@100000 {
+                       label = "factory";
+                       reg = <0x100000 0x80000>;
+                       read-only;
+
+                       compatible = "nvmem-cells";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       macaddr_factory_4: macaddr@4 {
+                               reg = <0x4 0x6>;
+                       };
+               };
+
+               partition@180000 {
+                       label = "firmware";
+                       reg = <0x180000 0x7680000>;
+
+                       compatible = "fixed-partitions";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       partition@0 {
+                               label = "kernel";
+                               reg = <0x0 0x400000>;
+                       };
+
+                       partition@400000 {
+                               label = "ubi";
+                               reg = <0x400000 0x7280000>;
+                       };
+               };
+       };
+};
+
+&state_default {
+       gpio {
+               groups = "i2c", "jtag", "wdt";
+               function = "gpio";
+       };
+};
+
+&gmac0 {
+       nvmem-cells = <&macaddr_factory_4>;
+       nvmem-cell-names = "mac-address";
+       mac-address-increment = <3>;
+};
+
+&switch0 {
+       ports {
+               port@0 {
+                       status = "okay";
+                       label = "wan";
+                       nvmem-cells = <&macaddr_factory_4>;
+                       nvmem-cell-names = "mac-address";
+                       mac-address-increment = <1>;
+               };
+
+               port@1 {
+                       status = "okay";
+                       label = "lan4";
+               };
+
+               port@2 {
+                       status = "okay";
+                       label = "lan3";
+               };
+
+               port@3 {
+                       status = "okay";
+                       label = "lan2";
+               };
+
+               port@4 {
+                       status = "okay";
+                       label = "lan1";
+               };
+       };
+};
+
+&pcie {
+       status = "okay";
+};
+
+&pcie1 {
+       wifi@0,0 {
+               compatible = "mediatek,mt76";
+               reg = <0x0000 0 0 0 0>;
+               mediatek,mtd-eeprom = <&factory 0x0>;
+       };
+};
index f229ec1fa795a4260a8805c86f8ef0fde52478d0..105f1f5b188f3f9319402674b990379d2a87b1e9 100644 (file)
@@ -817,6 +817,26 @@ define Device/iptime_a8004t
 endef
 TARGET_DEVICES += iptime_a8004t
 
+define Device/iptime_ax2004m
+  $(Device/dsa-migration)
+  BLOCKSIZE := 128k
+  PAGESIZE := 2048
+  KERNEL_SIZE := 4096k
+  IMAGE_SIZE := 121344k
+  UBINIZE_OPTS := -E 5
+  KERNEL_LOADADDR := 0x82000000
+  KERNEL := kernel-bin | relocate-kernel 0x80001000 | lzma | \
+       fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb
+  IMAGES += recovery.bin
+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
+  IMAGE/recovery.bin := append-kernel | pad-to $$(KERNEL_SIZE) | append-ubi | \
+       check-size | iptime-crc32 ax2004m
+  DEVICE_VENDOR := ipTIME
+  DEVICE_MODEL := AX2004M
+  DEVICE_PACKAGES := kmod-mt7915e kmod-usb3
+endef
+TARGET_DEVICES += iptime_ax2004m
+
 define Device/iptime_t5004
   $(Device/dsa-migration)
   BLOCKSIZE := 128k
index 242e1e6efeec66b0856b26b2f794b1f1746c59c2..c5e6b6c89b47370d2dc1b96d7c181c65332b60f6 100644 (file)
@@ -25,6 +25,12 @@ case "$board" in
                [ "$PHYNBR" = "1" ] && \
                        macaddr_add "$(mtd_get_mac_binary factory 0x4)" 1 > /sys${DEVPATH}/macaddress
                ;;
+       iptime,ax2004m)
+               if [ "$PHYNBR" = "1" ]; then
+                       hw_mac_addr="$(mtd_get_mac_binary factory 0x4)"
+                       macaddr_setbit_la "$(macaddr_add $hw_mac_addr 3)" > /sys${DEVPATH}/macaddress
+               fi
+               ;;
        jcg,q20)
                [ "$PHYNBR" = "1" ] && \
                        macaddr_setbit_la "$(mtd_get_mac_binary Factory 0x4)" > /sys${DEVPATH}/macaddress
index 9575ced1b95d1c6cfa533fb4f030d25119a60786..2052ae44466fc8a5ae93deb11a954bd024f42b78 100755 (executable)
@@ -59,6 +59,7 @@ platform_do_upgrade() {
        dlink,dir-853-a3|\
        hiwifi,hc5962|\
        iptime,a3004t|\
+       iptime,ax2004m|\
        iptime,t5004|\
        jcg,q20|\
        linksys,e5600|\