ramips: add support for ALFA Network Quad-E4G
authorPiotr Dymacz <pepe2k@gmail.com>
Sun, 3 Nov 2019 11:12:44 +0000 (12:12 +0100)
committerPiotr Dymacz <pepe2k@gmail.com>
Thu, 14 Nov 2019 00:37:54 +0000 (01:37 +0100)
ALFA Network Quad-E4G is a universal Wi-Fi/4G platform, which offers
three miniPCIe (PCIe, USB 2.0, SIM) and a single M.2 B-key (dual-SIM,
USB 3.0) slots, RTC and five Gigabit Ethernet ports with PoE support.

Specification:

- MT7621A (880 MHz)
- 256/512 MB of RAM (DDR3)
- 16/32+ MB of FLASH (SPI NOR)
- optional second SPI flash (8-pin WSON/SOIC)
- 1x microSD (SDXC) flash card reader
- 5x 10/100/100 Mbps Ethernet, with passive PoE support (24 V) in LAN1
- optional 802.3at/af PoE module for WAN
- 3x miniPCIe slot (with PCIe and USB 2.0 buses, micro SIM and 5 V)
- 1x M.2/NGFF B-key 3042 (USB 3.0/2.0, mini + micro SIM)
- RTC (TI BQ32002, I2C bus) with backup battery (CR2032)
- external hardware watchdog (EM Microelectronic EM6324)
- 1x USB 2.0 Type-A
- 1x micro USB Type-B for system serial console (Holtek HT42B534)
- 11x LED (5 for Ethernet, 5 driven by GPIO, 1x power indicator)
- 3x button (reset, user1, user2)
- 1x I2C (4-pin, 2.54 mm pitch) header on PCB
- 4x SIM (6-pin, 2.00 mm pitch) headers on PCB
- 2x UART2/3 (4-pin, 2.54 mm pitch) headers on PCB
- 1x mechanical power switch
- 1x DC jack with lock (24 V)

Other:

- U-Boot selects default SIM slot, based on value of 'default_sim' env
  variable: '1' or unset -> SIM1 (mini), '2' -> SIM2 (micro). This board
  has additional logic circuit for M.2 SIM switching. The 'sim-select'
  will work only if both SIM slots are occupied. Otherwise, always slot
  with SIM inside is selected, no matter 'sim-select' value.
- U-Boot enables power in all three miniPCIe and M.2 slots before
  loading the kernel
- this board supports 'dual image' feature (controlled by 'dual_image'
  U-Boot environment variable)
- all three miniPCIe slots have additional 5 V supply on pins 47 and 49
- the board allows to install up to two oversized miniPCIe cards (vendor
  has dedicated MediaTek MT7615N/D cards for this board)
- this board has additional logic circuit controlling PERSTn pins inside
  miniPCIe slots. By default, PERSTn (GPIO19) is routed to all miniPCIe
  slots but setting GPIO22 to high allows PERSTn control per slot, using
  GPIO23-25 (value is inverted)

You can use the 'sysupgrade' image directly in vendor firmware which is
based on OpenWrt (make sure to not preserve settings - use 'sysupgrade
-n -F ...' command). Alternatively, use web recovery mode in U-Boot:

1. Power the device with reset button pressed, the modem LED will start
   blinking slowly and after ~3 seconds, when it starts blinking faster,
   you can release the button.
2. Setup static IP 192.168.1.2/24 on your PC.
3. Go to 192.168.1.1 in browser and upload 'sysupgrade' image.

Signed-off-by: Piotr Dymacz <pepe2k@gmail.com>
target/linux/ramips/dts/mt7621_alfa-network_quad-e4g.dts [new file with mode: 0644]
target/linux/ramips/image/mt7621.mk
target/linux/ramips/mt7621/base-files/etc/board.d/02_network
target/linux/ramips/mt7621/base-files/etc/init.d/bootcount
target/linux/ramips/mt7621/base-files/lib/upgrade/platform.sh
target/linux/ramips/mt7621/config-4.14

diff --git a/target/linux/ramips/dts/mt7621_alfa-network_quad-e4g.dts b/target/linux/ramips/dts/mt7621_alfa-network_quad-e4g.dts
new file mode 100644 (file)
index 0000000..f3080c2
--- /dev/null
@@ -0,0 +1,232 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+/dts-v1/;
+
+#include "mt7621.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+       compatible = "alfa-network,quad-e4g", "mediatek,mt7621-soc";
+       model = "ALFA Network Quad-E4G";
+
+       aliases {
+               label-mac-device = &ethernet;
+               led-boot = &led_system;
+               led-failsafe = &led_system;
+               led-running = &led_system;
+               led-upgrade = &led_system;
+       };
+
+       chosen {
+               bootargs = "console=ttyS0,115200";
+       };
+
+       gpio-export {
+               compatible = "gpio-export";
+               #size-cells = <0>;
+
+               m2-enable {
+                       gpio-export,name = "m2-enable";
+                       gpio-export,output = <1>;
+                       gpios = <&gpio1 0 GPIO_ACTIVE_HIGH>;
+               };
+
+               minipcie0-enable {
+                       gpio-export,name = "minipcie0-enable";
+                       gpio-export,output = <1>;
+                       gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>;
+               };
+
+               minipcie0-reset {
+                       gpio-export,name = "minipcie0-reset";
+                       gpio-export,output = <0>;
+                       gpios = <&gpio0 23 GPIO_ACTIVE_HIGH>;
+               };
+
+               minipcie1-enable {
+                       gpio-export,name = "minipcie1-enable";
+                       gpio-export,output = <1>;
+                       gpios = <&gpio0 30 GPIO_ACTIVE_HIGH>;
+               };
+
+               minipcie1-reset {
+                       gpio-export,name = "minipcie1-reset";
+                       gpio-export,output = <0>;
+                       gpios = <&gpio0 24 GPIO_ACTIVE_HIGH>;
+               };
+
+               minipcie2-enable {
+                       gpio-export,name = "minipcie2-enable";
+                       gpio-export,output = <1>;
+                       gpios = <&gpio0 31 GPIO_ACTIVE_HIGH>;
+               };
+
+               minipcie2-reset {
+                       gpio-export,name = "minipcie2-reset";
+                       gpio-export,output = <0>;
+                       gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>;
+               };
+
+               pcie-perst-disable {
+                       gpio-export,name = "pcie-perst-enable";
+                       gpio-export,output = <0>;
+                       gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>;
+               };
+
+               sim-select {
+                       gpio-export,name = "sim-select";
+                       gpio-export,output = <1>;
+                       gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>;
+               };
+
+               watchdog-enable {
+                       gpio-export,name = "watchdog-enable";
+                       gpio-export,output = <1>;
+                       gpios = <&gpio0 17 GPIO_ACTIVE_HIGH>;
+               };
+       };
+
+       keys {
+               compatible = "gpio-keys";
+
+               reset {
+                       label = "reset";
+                       gpios = <&gpio0 14 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_RESTART>;
+               };
+
+               user1 {
+                       label = "user1";
+                       gpios = <&gpio0 15 GPIO_ACTIVE_LOW>;
+                       linux,code = <BTN_0>;
+               };
+
+               user2 {
+                       label = "user2";
+                       gpios = <&gpio0 16 GPIO_ACTIVE_LOW>;
+                       linux,code = <BTN_1>;
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               led_system: system {
+                       label = "quad-e4g:red:system";
+                       gpios = <&gpio0 13 GPIO_ACTIVE_LOW>;
+                       default-state = "keep";
+               };
+
+               m2 {
+                       label = "quad-e4g:orange:m2";
+                       gpios = <&gpio1 1 GPIO_ACTIVE_LOW>;
+               };
+
+               minipcie0 {
+                       label = "quad-e4g:orange:minipcie0";
+                       gpios = <&gpio0 26 GPIO_ACTIVE_LOW>;
+               };
+
+               minipcie1 {
+                       label = "quad-e4g:orange:minipcie1";
+                       gpios = <&gpio0 27 GPIO_ACTIVE_LOW>;
+               };
+
+               minipcie2 {
+                       label = "quad-e4g:orange:minipcie2";
+                       gpios = <&gpio0 28 GPIO_ACTIVE_LOW>;
+               };
+       };
+
+       watchdog {
+               compatible = "linux,wdt-gpio";
+               gpios = <&gpio0 18 GPIO_ACTIVE_HIGH>;
+               hw_algo = "toggle";
+               hw_margin_ms = <25000>;
+               always-running;
+       };
+};
+
+&ethernet {
+       mtd-mac-address = <&factory 0xe000>;
+};
+
+&i2c {
+       status = "okay";
+
+       rtc@68 {
+               compatible = "ti,bq32000";
+               reg = <0x68>;
+       };
+};
+
+&pcie {
+       status = "okay";
+};
+
+&pinctrl {
+       state_default: pinctrl0 {
+               gpio {
+                       ralink,group = "jtag", "rgmii2", "wdt";
+                       ralink,function = "gpio";
+               };
+       };
+};
+
+&sdhci {
+       status = "okay";
+};
+
+&spi0 {
+       status = "okay";
+
+       flash@0 {
+               compatible = "jedec,spi-nor";
+               reg = <0>;
+               spi-max-frequency = <50000000>;
+               m25p,fast-read;
+
+               partitions {
+                       compatible = "fixed-partitions";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       partition@0 {
+                               label = "u-boot";
+                               reg = <0x0 0x30000>;
+                       };
+
+                       partition@30000 {
+                               label = "u-boot-env";
+                               reg = <0x30000 0x1000>;
+                       };
+
+                       partition@31000 {
+                               label = "config";
+                               reg = <0x31000 0xf000>;
+                               read-only;
+                       };
+
+                       factory: partition@40000 {
+                               label = "factory";
+                               reg = <0x40000 0x10000>;
+                               read-only;
+                       };
+
+                       partition@50000 {
+                               compatible = "denx,uimage";
+                               label = "firmware";
+                               reg = <0x50000 0xfb0000>;
+                       };
+               };
+       };
+};
+
+&uartlite2 {
+       status = "okay";
+};
+
+&uartlite3 {
+       status = "okay";
+};
index a7c16b18eb97baa305f993fe7287a7b141997eee..66afe2962031d9d1b25f8ba56a26d4e2776e149d 100644 (file)
@@ -96,6 +96,16 @@ define Device/afoundry_ew1200
 endef
 TARGET_DEVICES += afoundry_ew1200
 
+define Device/alfa-network_quad-e4g
+  MTK_SOC := mt7621
+  IMAGE_SIZE := 16064k
+  DEVICE_VENDOR := ALFA Network
+  DEVICE_MODEL := Quad-E4G
+  DEVICE_PACKAGES := kmod-ata-core kmod-ata-ahci kmod-sdhci-mt7620 kmod-usb3 \
+       uboot-envtools
+endef
+TARGET_DEVICES += alfa-network_quad-e4g
+
 define Device/asiarf_ap7621-001
   MTK_SOC := mt7621
   IMAGE_SIZE := 16000k
index 0de3804cdb8bb63d8f59ba3acb26d2daa2d09d60..420780a1011852ae6a35456bfa643ddef7d49874 100755 (executable)
@@ -37,6 +37,18 @@ ramips_setup_interfaces()
                ucidef_add_switch "switch0" \
                        "0:lan" "1:lan" "2:lan" "3:lan" "4:wan" "6@eth0"
                ;;
+       alfa-network,quad-e4g|\
+       netgear,r6220|\
+       netgear,r6260|\
+       netgear,r6350|\
+       netgear,r6850|\
+       netgear,wndr3700-v5|\
+       netis,wf-2881|\
+       wevo,11acnas|\
+       wevo,w2914ns-v2)
+               ucidef_add_switch "switch0" \
+                       "0:lan:4" "1:lan:3" "2:lan:2" "3:lan:1" "4:wan" "6@eth0"
+               ;;
        asiarf,ap7621-001)
                ucidef_add_switch "switch0" "0:lan" "4:wan" "6@eth0"
                ;;
@@ -106,17 +118,6 @@ ramips_setup_interfaces()
                ucidef_add_switch "switch0" \
                        "0:lan" "6@eth0"
                ;;
-       netgear,r6220|\
-       netgear,r6260|\
-       netgear,r6350|\
-       netgear,r6850|\
-       netgear,wndr3700-v5|\
-       netis,wf-2881|\
-       wevo,11acnas|\
-       wevo,w2914ns-v2)
-               ucidef_add_switch "switch0" \
-                       "0:lan:4" "1:lan:3" "2:lan:2" "3:lan:1" "4:wan" "6@eth0"
-               ;;
        xiaomi,mir3g)
                ucidef_add_switch "switch0" \
                        "2:lan:2" "3:lan:1" "1:wan" "6t@eth0"
@@ -169,6 +170,7 @@ ramips_setup_macs()
        zbtlink,zbt-wg2626)
                wan_mac=$(macaddr_add "$(cat /sys/class/net/eth0/address)" 1)
                ;;
+       alfa-network,quad-e4g|\
        asus,rt-ac57u|\
        d-team,newifi-d2|\
        d-team,pbr-m1|\
index 807801a34faf53ec16f81096bc8afd1ac1195547..b4d72abafc60ebf80b930536da95dea6aebc9348 100755 (executable)
@@ -4,6 +4,10 @@ START=99
 
 boot() {
        case $(board_name) in
+       alfa-network,quad-e4g)
+               [ -n "$(fw_printenv bootcount bootchanged 2>/dev/null)" ] &&\
+                       echo -e "bootcount\nbootchanged\n" | /usr/sbin/fw_setenv -s -
+               ;;
        samknows,whitebox-v8)
                fw_setenv bootcount 0
                ;;
index f8aa0373a073b35b06aa06d6e86187d54e940f83..d74aba3bfe8023d58872ab34b7ac9d5d00a991dc 100755 (executable)
@@ -5,6 +5,9 @@
 PART_NAME=firmware
 REQUIRE_IMAGE_METADATA=1
 
+RAMFS_COPY_BIN='fw_printenv fw_setenv'
+RAMFS_COPY_DATA='/etc/fw_env.config /var/lock/fw_printenv.lock'
+
 platform_check_image() {
        return 0
 }
@@ -13,6 +16,17 @@ platform_do_upgrade() {
        local board=$(board_name)
 
        case "$board" in
+       alfa-network,quad-e4g)
+               [ "$(fw_printenv -n dual_image 2>/dev/null)" = "1" ] &&\
+               [ -n "$(find_mtd_part backup)" ] && {
+                       PART_NAME=backup
+                       if [ "$(fw_printenv -n bootactive 2>/dev/null)" = "1" ]; then
+                               fw_setenv bootactive 2 || exit 1
+                       else
+                               fw_setenv bootactive 1 || exit 1
+                       fi
+               }
+               ;;
        mikrotik,rb750gr3|\
        mikrotik,rbm11g|\
        mikrotik,rbm33g)
index a7276a301d53a1e78f77821f216de2e5a1e9f255..4112cad7809a0e6df7366a730283cc14c35b6972 100644 (file)
@@ -89,6 +89,8 @@ CONFIG_GPIOLIB=y
 CONFIG_GPIO_MT7621=y
 # CONFIG_GPIO_RALINK is not set
 CONFIG_GPIO_SYSFS=y
+CONFIG_GPIO_WATCHDOG=y
+# CONFIG_GPIO_WATCHDOG_ARCH_INITCALL is not set
 # CONFIG_GRO_CELLS is not set
 CONFIG_HANDLE_DOMAIN_IRQ=y
 CONFIG_HARDWARE_WATCHPOINTS=y
@@ -253,6 +255,7 @@ CONFIG_RESET_CONTROLLER=y
 CONFIG_RFS_ACCEL=y
 CONFIG_RPS=y
 CONFIG_RTC_CLASS=y
+CONFIG_RTC_DRV_BQ32K=y
 CONFIG_RTC_DRV_PCF8563=y
 CONFIG_RTC_I2C_AND_SPI=y
 CONFIG_RTC_MC146818_LIB=y