From 71469caa0ab4e4ff1d606759656a960bbb2b038d Mon Sep 17 00:00:00 2001 From: Piotr Dymacz Date: Sun, 3 Nov 2019 12:12:44 +0100 Subject: [PATCH] ramips: add support for ALFA Network Quad-E4G 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/1000 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) Flash instructions: 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 (backported from commit e68539aca43a560077364de27eb220f1d85ca3ef) --- .../ramips/base-files/etc/board.d/02_network | 28 ++- .../ramips/base-files/etc/init.d/bootcount | 1 + .../ramips/base-files/lib/upgrade/platform.sh | 1 + target/linux/ramips/dts/QUAD-E4G.dts | 236 ++++++++++++++++++ target/linux/ramips/image/mt7621.mk | 9 + target/linux/ramips/mt7621/config-4.14 | 3 + 6 files changed, 265 insertions(+), 13 deletions(-) create mode 100644 target/linux/ramips/dts/QUAD-E4G.dts diff --git a/target/linux/ramips/base-files/etc/board.d/02_network b/target/linux/ramips/base-files/etc/board.d/02_network index f91a8248e5..0ffd5d6560 100755 --- a/target/linux/ramips/base-files/etc/board.d/02_network +++ b/target/linux/ramips/base-files/etc/board.d/02_network @@ -171,6 +171,14 @@ ramips_setup_interfaces() wrh-300cr) ucidef_set_interface_lan "eth0" ;; + alfa-network,quad-e4g|\ + netgear,r6120|\ + r6220|\ + netgear,r6350|\ + wndr3700v5) + ucidef_add_switch "switch0" \ + "0:lan:4" "1:lan:3" "2:lan:2" "3:lan:1" "4:wan" "6@eth0" + ;; alfa-network,r36m-e4g|\ wcr-1166ds) ucidef_add_switch "switch0" \ @@ -356,13 +364,6 @@ ramips_setup_interfaces() "0:lan" "1:lan" "2:lan" "3:lan" "6t@eth0" ucidef_set_interface_wan "usb0" ;; - netgear,r6120|\ - r6220|\ - netgear,r6350|\ - wndr3700v5) - ucidef_add_switch "switch0" \ - "0:lan:4" "1:lan:3" "2:lan:2" "3:lan:1" "4:wan" "6@eth0" - ;; hc5761) ucidef_add_switch "switch0" \ "1:lan" "4:lan" "0:wan" "6@eth0" @@ -501,6 +502,13 @@ ramips_setup_macs() lan_mac=$(mtd_get_mac_binary factory 57344) wan_mac=$(mtd_get_mac_binary factory 57350) ;; + alfa-network,quad-e4g|\ + elecom,wrc-1167ghbk2-s|\ + elecom,wrc-2533gst|\ + elecom,wrc-1900gst|\ + sk-wb8) + wan_mac=$(mtd_get_mac_binary factory 57350) + ;; alfa-network,r36m-e4g|\ carambola|\ freestation5|\ @@ -564,12 +572,6 @@ ramips_setup_macs() lan_mac=$(cat /sys/class/net/eth0/address) wan_mac=$(macaddr_add "$lan_mac" 2) ;; - elecom,wrc-1167ghbk2-s|\ - elecom,wrc-2533gst|\ - elecom,wrc-1900gst|\ - sk-wb8) - wan_mac=$(mtd_get_mac_binary factory 57350) - ;; gl-mt300n-v2|\ whr-g300n) wan_mac=$(mtd_get_mac_binary factory 4) diff --git a/target/linux/ramips/base-files/etc/init.d/bootcount b/target/linux/ramips/base-files/etc/init.d/bootcount index 251d8ddf65..dd7cf1aed9 100755 --- a/target/linux/ramips/base-files/etc/init.d/bootcount +++ b/target/linux/ramips/base-files/etc/init.d/bootcount @@ -8,6 +8,7 @@ start() { case $(board_name) in alfa-network,ac1200rm|\ alfa-network,awusfree1|\ + alfa-network,quad-e4g|\ alfa-network,r36m-e4g|\ alfa-network,tube-e4g) [ -n "$(fw_printenv bootcount bootchanged 2>/dev/null)" ] &&\ diff --git a/target/linux/ramips/base-files/lib/upgrade/platform.sh b/target/linux/ramips/base-files/lib/upgrade/platform.sh index b2214e0113..3b967aac87 100755 --- a/target/linux/ramips/base-files/lib/upgrade/platform.sh +++ b/target/linux/ramips/base-files/lib/upgrade/platform.sh @@ -41,6 +41,7 @@ platform_do_upgrade() { case "$board" in alfa-network,ac1200rm|\ alfa-network,awusfree1|\ + alfa-network,quad-e4g|\ alfa-network,r36m-e4g|\ alfa-network,tube-e4g) [ "$(fw_printenv -n dual_image 2>/dev/null)" = "1" ] &&\ diff --git a/target/linux/ramips/dts/QUAD-E4G.dts b/target/linux/ramips/dts/QUAD-E4G.dts new file mode 100644 index 0000000000..3826f69872 --- /dev/null +++ b/target/linux/ramips/dts/QUAD-E4G.dts @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT +/dts-v1/; + +#include "mt7621.dtsi" + +#include +#include + +/ { + compatible = "alfa-network,quad-e4g", "mediatek,mt7621-soc"; + model = "ALFA Network Quad-E4G"; + + aliases { + 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 = ; + }; + + user1 { + label = "user1"; + gpios = <&gpio0 15 GPIO_ACTIVE_LOW>; + linux,code = ; + }; + + user2 { + label = "user2"; + gpios = <&gpio0 16 GPIO_ACTIVE_LOW>; + linux,code = ; + }; + }; + + 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>; + }; + }; + + memory@0 { + device_type = "memory"; + reg = <0x0 0x10000000>; + }; + + watchdog { + compatible = "linux,wdt-gpio"; + gpios = <&gpio0 18 GPIO_ACTIVE_HIGH>; + hw_algo = "toggle"; + hw_margin_ms = <25000>; + always-running; + }; +}; + +ðernet { + 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"; +}; diff --git a/target/linux/ramips/image/mt7621.mk b/target/linux/ramips/image/mt7621.mk index fa222f7a89..7eb59188fb 100644 --- a/target/linux/ramips/image/mt7621.mk +++ b/target/linux/ramips/image/mt7621.mk @@ -93,6 +93,15 @@ define Device/11acnas endef TARGET_DEVICES += 11acnas +define Device/alfa-network_quad-e4g + DTS := QUAD-E4G + IMAGE_SIZE := 16064k + DEVICE_TITLE := ALFA Network 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/asus_rt-ac57u DTS := RT-AC57U DEVICE_TITLE := ASUS RT-AC57U diff --git a/target/linux/ramips/mt7621/config-4.14 b/target/linux/ramips/mt7621/config-4.14 index a7276a301d..4112cad780 100644 --- a/target/linux/ramips/mt7621/config-4.14 +++ b/target/linux/ramips/mt7621/config-4.14 @@ -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