ipq40xx: Add support ZTE MF18A
authorMarcin Gajda <mgajda@o2.pl>
Wed, 28 Dec 2022 18:01:40 +0000 (19:01 +0100)
committerHauke Mehrtens <hauke@hauke-m.de>
Sat, 14 Jan 2023 18:19:36 +0000 (19:19 +0100)
Light and small router ( In Poland operators sells together with MC7010 outdoor modem to provide WIFI inside home).
Device specification

SoC Type: Qualcomm IPQ4019
RAM: 256 MiB
Flash: 128 MiB SPI NAND (Winbond W25N01GV)
ROM: 2MiB SPI Flash (GD25Q16)
Wireless 2.4 GHz (IP4019): b/g/n, 2x2
Wireless 5 GHz (QCA9982): a/n/ac, 3x3
Ethernet: 2xGbE (WAN/LAN1, LAN2)
USB ports: No
Button: 2 (Reset/WPS)
LEDs: 3 external leds: Power (blue) , WiFI (blue and red), SMARTHOME (blue and red) and 1 internal (blue) -- NOTE: Power controls all external led (if down ,all others also not lights even signal is up)
Power: 5VDC, 2,1A via USB-C socket
Bootloader: U-Boot
On board ZWave and Zigbee (EFR32 MG1P232GG..)  modules ( not supported by orginal software )
Installation

 1.Open MF18A case by ungluing rubber pad under the router and unscrew screws, and connect to serial console port,
   with the following pinout, starting from pin 1, which is the topmost pin when the board is upright (reset button on the bottom) :

    VCC (3.3V). Do not use unless you need to source power for the converer from it.
    TX
    RX
    GND

    Default port configuration in U-boot as well as in stock firmware is 115200-8-N-1.

 2.Place OpenWrt initramfs image for the device on a TFTP in the server's root. This example uses Server IP: 192.168.0.2

 3.Connect TFTP server to RJ-45 port (WAN/LAN1).

 4.Power on MF18A , stop in u-Boot (using ESC button) and run u-Boot commands:
    setenv serverip 192.168.0.2
    setenv ipaddr 192.168.0.1
    set fdt_high 0x85000000
    tftpboot 0x84000000 openwrt-ipq40xx-generic-zte_mf18a-initramfs-fit-zImage.itb
    bootm 0x84000000

 5.Please make backup of original partitions, if you think about revert to stock, specially mtd8 (Web UI) and mtd9 (rootFS). Use /tmp as temporary storage and do:

WEB PARITION

cat /dev/mtd8 > /tmp/mtd8.bin
scp /tmp/mtd8.bin root@YOURSERVERIP:/
rm /tmp/mtd8.bin
ROOT PARITION

cat /dev/mtd9 > /tmp/mtd9.bin
scp /tmp/mtd9.bin root@YOURSERVERIP:/
rm /tmp/mtd9.bin

If you are sure ,that you want to flash openwrt, from uBoot, before bootm, clean rootfs partition with command:
nand erase 0x1800000 0x1D00000

 6.Login via ssh or serial and remove stock partitions (default IP 192.168.1.1):
ubiattach -m 9 # it could return error if ubi was attached before or rootfs part was erased before
ubirmvol /dev/ubi0 -N ubi_rootfs # it could return error if rootfs part was erased before
ubirmvol /dev/ubi0 -N ubi_rootfs_data # some devices doesn't have it

 7. Install image via :
sysupgrade -n /tmp/openwrt-ipq40xx-generic-zte_mf18a-squashfs-sysupgrade.bin

previously wgeting bin. Sometimes it could print ubi attach error, but please ignore it if process goes forward.

Back to Stock (!!! need original dump taken from initramfs !!!) -------------

Place mtd8.bin and mtd9.bin initramfs image for the device on a TFTP in the server's root. This example uses Server IP: 192.168.0.2
Connect serial console (115200,8n1) to serial console connector .
Connect TFTP server to RJ-45 port (WAN/LAN1).
rename mtd8.bin to web.img and mtd9.bin to root_uImage_s
Stop in u-Boot (using ESC button) and run u-Boot commands:
This will erase Web and RootFS:
nand erase 0x1000000 0x800000
nand erase 0x1800000 0x1D00000

This will restore RootFS:
tftpboot 0x84000000 root_uImage_s
nand erase 0x1800000 0x1D00000
nand write 0x84000000 0x1800000 0x1D00000

This will restore Web Interface:
tftpboot 0x84000000 web.img
nand erase 0x1000000 0x800000
nand write 0x84000000 0x1000000 0x800000

After first boot on stock firwmare, do a factory reset. Push reset button for 5 seconds so all parameters will be reverted to the one printed on label on bottom of the router

As reference was taken MF289F support by Giammarco Marzano stich86@gmail.com and MF286D by Pawel Dembicki paweldembicki@gmail.com

Signed-off-by: Marcin Gajda <mgajda@o2.pl>
package/firmware/ipq-wifi/Makefile
package/firmware/ipq-wifi/board-zte_mf18a.qca4019 [new file with mode: 0644]
package/firmware/ipq-wifi/board-zte_mf18a.qca99x0 [new file with mode: 0644]
target/linux/ipq40xx/base-files/etc/board.d/02_network
target/linux/ipq40xx/base-files/lib/upgrade/platform.sh
target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-mf18a.dts [new file with mode: 0644]
target/linux/ipq40xx/image/generic.mk

index 2096b5f2d6be32e3b6786c822a7306fdd68b258e..8db2185f61b66edc703d75e355e2e3ae08374878 100644 (file)
@@ -40,6 +40,7 @@ ALLWIFIBOARDS:= \
        qxwlan_e2600ac-c2 \
        sony_ncp-hg100-cellular \
        teltonika_rutx \
+       zte_mf18a \
        zte_mf289f
 
 ALLWIFIPACKAGES:=$(foreach BOARD,$(ALLWIFIBOARDS),ipq-wifi-$(BOARD))
@@ -64,8 +65,10 @@ define ipq-wifi-install-one
     $(call ipq-wifi-install-one-to,$(1),$(2),QCA9888/hw2.0),\
   $(if $(filter $(suffix $(1)),.QCA9984 .qca9984),\
     $(call ipq-wifi-install-one-to,$(1),$(2),QCA9984/hw1.0),\
+  $(if $(filter $(suffix $(1)),.QCA99X0 .qca99x0),\
+    $(call ipq-wifi-install-one-to,$(1),$(2),QCA99X0/hw2.0),\
     $(error Unrecognized board-file suffix '$(suffix $(1))' for '$(1)')\
-  )))
+  ))))
 
 endef
 # Blank line required at end of above define due to foreach context
@@ -98,7 +101,7 @@ Do not install it for any other device!
 endef
 
 # Add board name to ALLWIFIBOARDS
-# Place files in this directory as board-<devicename>.<qca4019|qca9888|qca9984>
+# Place files in this directory as board-<devicename>.<qca4019|qca9888|qca9984|qca99x0>
 # Add $(eval $(call generate-ipq-wifi-package,<devicename>,<display name>))
 
 $(eval $(call generate-ipq-wifi-package,aruba_ap-365,Aruba AP-365))
@@ -116,6 +119,7 @@ $(eval $(call generate-ipq-wifi-package,qxwlan_e2600ac-c1,Qxwlan E2600AC C1))
 $(eval $(call generate-ipq-wifi-package,qxwlan_e2600ac-c2,Qxwlan E2600AC C2))
 $(eval $(call generate-ipq-wifi-package,sony_ncp-hg100-cellular,Sony NCP-HG100/Cellular))
 $(eval $(call generate-ipq-wifi-package,teltonika_rutx,Teltonika RUTX))
+$(eval $(call generate-ipq-wifi-package,zte_mf18a,ZTE MF18A))
 $(eval $(call generate-ipq-wifi-package,zte_mf289f,ZTE MF289F))
 
 $(foreach PACKAGE,$(ALLWIFIPACKAGES),$(eval $(call BuildPackage,$(PACKAGE))))
diff --git a/package/firmware/ipq-wifi/board-zte_mf18a.qca4019 b/package/firmware/ipq-wifi/board-zte_mf18a.qca4019
new file mode 100644 (file)
index 0000000..bc9ebc4
Binary files /dev/null and b/package/firmware/ipq-wifi/board-zte_mf18a.qca4019 differ
diff --git a/package/firmware/ipq-wifi/board-zte_mf18a.qca99x0 b/package/firmware/ipq-wifi/board-zte_mf18a.qca99x0
new file mode 100644 (file)
index 0000000..10625d8
Binary files /dev/null and b/package/firmware/ipq-wifi/board-zte_mf18a.qca99x0 differ
index 7a4cac868cb78e4fde81a834b3032ec142efd365..00e78d0526f99cb47314439fed325136881c25f7 100644 (file)
@@ -38,6 +38,7 @@ ipq40xx_setup_interfaces()
        mikrotik,cap-ac|\
        netgear,wac510|\
        sony,ncp-hg100-cellular|\
+       zte,mf18a|\
        zte,mf289f)
                ucidef_set_interfaces_lan_wan "lan" "wan"
                ;;
index 73feefb3eadf42352833f15eac52799f154afa48..96071959d4001906c5f0704dc2e53dd660fcb1fe 100644 (file)
@@ -25,6 +25,7 @@ Once this is done. Retry.
 EOF
                return 1
                ;;
+       zte,mf18a |\
        zte,mf286d |\
        zte,mf289f)
                CI_UBIPART="rootfs"
@@ -203,6 +204,7 @@ platform_do_upgrade() {
                sony_emmc_do_upgrade "$1"
                ;;
        teltonika,rutx10 |\
+       zte,mf18a |\
        zte,mf286d |\
        zte,mf289f)
                CI_UBIPART="rootfs"
diff --git a/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-mf18a.dts b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-mf18a.dts
new file mode 100644 (file)
index 0000000..c1832ee
--- /dev/null
@@ -0,0 +1,482 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+// Copyright (c) 2022, Pawel Dembicki <paweldembicki@gmail.com>.
+// Copyright (c) 2022, Marcin Gajda <mgajda@o2.pl>.
+
+
+#include "qcom-ipq4019.dtsi"
+#include <dt-bindings/soc/qcom,tcsr.h>
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/leds/common.h>
+
+/ {
+       model = "ZTE MF18A";
+       compatible = "zte,mf18a";
+
+       aliases {
+               led-boot = &led_power;
+               led-failsafe = &led_power;
+               led-running = &led_power;
+               led-upgrade = &led_power;
+       };
+
+       chosen {
+               /*
+                * bootargs forced by u-boot bootipq command:
+                * 'ubi.mtd=rootfs root=mtd:ubi_rootfs rootfstype=squashfs rootwait'
+                */
+               bootargs-append = " root=/dev/ubiblock0_1";
+       };
+
+       gpio-restart {
+               compatible = "gpio-restart";
+               gpios = <&tlmm 8 GPIO_ACTIVE_HIGH>;
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               led_internal: led-0 {
+                       label = "blue:internal";
+                       gpios = <&tlmm 10 GPIO_ACTIVE_LOW>;
+                       default-state = "keep";
+               };
+
+               led_power: led-1 {
+                       label = "blue:power";
+                       gpios = <&tlmm 48 GPIO_ACTIVE_HIGH>;
+                       default-state = "keep";
+               };
+
+               led-2 {
+                       function = LED_FUNCTION_WLAN;
+                       label = "blue:wlan";
+                       gpios = <&tlmm 23 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "phy0tpt";
+               };
+               
+               led-3 {
+                       label = "red:wlan";
+                       gpios = <&tlmm 26 GPIO_ACTIVE_HIGH>;
+               };
+
+               led-4 {
+                       function = LED_FUNCTION_WLAN;
+                       label = "blue:smart";
+                       gpios = <&tlmm 22 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "phy1tpt";
+               };
+
+               led-5 {
+                       label = "red:smart";
+                       gpios = <&tlmm 25 GPIO_ACTIVE_HIGH>;
+               };
+
+               resetzwave {
+                       label = "resetzwave";
+                       gpios = <&tlmm 11 GPIO_ACTIVE_HIGH>;
+               };
+       };
+
+       keys {
+               compatible = "gpio-keys";
+
+               reset {
+                       label = "reset";
+                       linux,code = <KEY_RESTART>;
+                       gpios = <&tlmm 18 GPIO_ACTIVE_LOW>;
+               };
+
+               wps {
+                       label = "wps";
+                       linux,code = <KEY_WPS_BUTTON>;
+                       gpios = <&tlmm 68 GPIO_ACTIVE_LOW>;
+               };
+       };
+
+       soc {
+               rng@22000 {
+                       status = "okay";
+               };
+
+               mdio@90000 {
+                       status = "okay";
+                       pinctrl-0 = <&mdio_pins>;
+                       pinctrl-names = "default";
+                       reset-gpios = <&tlmm 47 GPIO_ACTIVE_LOW>;
+                       reset-delay-us = <2000>;
+               };
+
+               tcsr@1949000 {
+                       compatible = "qcom,tcsr";
+                       reg = <0x1949000 0x100>;
+                       qcom,wifi_glb_cfg = <TCSR_WIFI_GLB_CFG>;
+               };
+
+               tcsr@194b000 {
+                       /* select hostmode */
+                       compatible = "qcom,tcsr";
+                       reg = <0x194b000 0x100>;
+                       qcom,usb-hsphy-mode-select = <TCSR_USB_HSPHY_HOST_MODE>;
+                       status = "okay";
+               };
+
+               ess_tcsr@1953000 {
+                       compatible = "qcom,tcsr";
+                       reg = <0x1953000 0x1000>;
+                       qcom,ess-interface-select = <TCSR_ESS_PSGMII>;
+               };
+
+               tcsr@1957000 {
+                       compatible = "qcom,tcsr";
+                       reg = <0x1957000 0x100>;
+                       qcom,wifi_noc_memtype_m0_m2 = <TCSR_WIFI_NOC_MEMTYPE_M0_M2>;
+               };
+
+               usb2@60f8800 {
+                       status = "okay";
+               };
+
+               usb3@8af8800 {
+                       status = "okay";
+               };
+
+               crypto@8e3a000 {
+                       status = "okay";
+               };
+
+               watchdog@b017000 {
+                       status = "okay";
+               };
+       };
+};
+
+&blsp_dma {
+       status = "okay";
+};
+
+&blsp1_spi1 {
+       pinctrl-0 = <&spi_0_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+       cs-gpios = <&tlmm 12 GPIO_ACTIVE_HIGH>;
+
+       flash@0 {
+               /* u-boot is looking for "n25q128a11" property */
+               compatible = "jedec,spi-nor", "n25q128a11";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0>;
+               spi-max-frequency = <24000000>;
+
+               partitions {
+                       compatible = "fixed-partitions";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       partition@0 {
+                               label = "0:SBL1";
+                               reg = <0x0 0x40000>;
+                               read-only;
+                       };
+
+                       partition@40000 {
+                               label = "0:MIBIB";
+                               reg = <0x40000 0x20000>;
+                               read-only;
+                       };
+
+                       partition@60000 {
+                               label = "0:QSEE";
+                               reg = <0x60000 0x60000>;
+                               read-only;
+                               };
+
+                       partition@c0000 {
+                               label = "0:CDT";
+                               reg = <0xc0000 0x10000>;
+                               read-only;
+                       };
+
+                       partition@d0000 {
+                               label = "0:DDRPARAMS";
+                               reg = <0xd0000 0x10000>;
+                               read-only;
+                       };
+
+                       partition@e0000 {
+                               label = "0:APPSBLENV";
+                               reg = <0xe0000 0x10000>;
+                               read-only;
+                       };
+
+                       partition@f0000 {
+                               label = "0:APPSBL";
+                               reg = <0xf0000 0xc0000>;
+                               read-only;
+                       };
+
+                       partition@1b0000 {
+                               label = "0:reserved1";
+                               reg = <0x1b0000 0x50000>;
+                               read-only;
+                       };
+               };
+       };
+};
+
+&blsp1_uart1 {
+       pinctrl-0 = <&serial_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+};
+
+&cryptobam {
+       status = "okay";
+};
+
+&gmac {
+       status = "okay";
+       nvmem-cell-names = "mac-address";
+       nvmem-cells = <&macaddr_config_0>;
+};
+
+&switch {
+       status = "okay";
+};
+
+&swport2 {
+       status = "okay";
+
+       label = "wan";
+
+       nvmem-cell-names = "mac-address";
+       nvmem-cells = <&macaddr_config_0>;
+       mac-address-increment = <1>;
+};
+
+&swport3 {
+       status = "okay";
+
+       label = "lan";
+};
+
+&nand {
+       pinctrl-0 = <&nand_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+
+       nand@0 {
+               partitions {
+                       compatible = "fixed-partitions";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       partition@0 {
+                               label = "fota-flag";
+                               reg = <0x0 0xa0000>;
+                               read-only;
+                       };
+
+                       partition@a0000 {
+                               label = "ART";
+                               reg = <0xa0000 0x80000>;
+                               read-only;
+                               compatible = "nvmem-cells";
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+
+                               precal_art_1000: precal@1000 {
+                                       reg = <0x1000 0x2f20>;
+                               };
+
+                               precal_art_9000: precal@9000 {
+                                       reg = <0x9000 0x2f20>;
+                               };
+                       };
+
+                       partition@120000 {
+                               label = "mac";
+                               reg = <0x120000 0x80000>;
+                               read-only;
+                               compatible = "nvmem-cells";
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+
+                               macaddr_config_0: macaddr@0 {
+                                       reg = <0x0 0x6>;
+                               };
+                       };
+
+                       partition@1a0000 {
+                               label = "reserved2";
+                               reg = <0x1a0000 0xc0000>;
+                               read-only;
+                       };
+
+                       partition@260000 {
+                               label = "cfg-param";
+                               reg = <0x260000 0x400000>;
+                               read-only;
+                       };
+
+                       partition@660000 {
+                               label = "log";
+                               reg = <0x660000 0x400000>;
+                       };
+
+                       partition@a60000 {
+                               label = "oops";
+                               reg = <0xa60000 0xa0000>;
+                       };
+
+                       partition@b00000 {
+                               label = "reserved3";
+                               reg = <0xb00000 0x500000>;
+                               read-only;
+                       };
+
+                       partition@1000000 {
+                               label = "web";
+                               reg = <0x1000000 0x800000>;
+                       };
+
+                       partition@1800000 {
+                               label = "rootfs";
+                               reg = <0x1800000 0x1d00000>;
+                       };
+
+                       partition@3500000 {
+                               label = "data";
+                               reg = <0x3500000 0x1900000>;
+                       };
+
+                       partition@4e00000 {
+                               label = "fota";
+                               reg = <0x4e00000 0x2800000>;
+
+                       };
+                       partition@7600000 {
+                               label = "iot-db";
+                               reg = <0x7600000 0xa00000>;
+                       };
+               };
+       };
+};
+
+&qpic_bam {
+       status = "okay";
+};
+
+&tlmm {
+       i2c_0_pins: i2c_0_pinmux {
+               mux {
+                       pins = "gpio20", "gpio21";
+                       function = "blsp_i2c0";
+                       bias-disable;
+               };
+       };
+
+       mdio_pins: mdio_pinmux {
+               mux_1 {
+                       pins = "gpio6";
+                       function = "mdio";
+                       bias-pull-up;
+               };
+
+               mux_2 {
+                       pins = "gpio7";
+                       function = "mdc";
+                       bias-pull-up;
+               };
+       };
+
+       nand_pins: nand_pins {
+               pullups {
+                       pins =  "gpio52", "gpio53", "gpio58",
+                               "gpio59";
+                       function = "qpic";
+                       bias-pull-up;
+               };
+
+               pulldowns {
+                       pins =  "gpio54", "gpio55", "gpio56",
+                               "gpio57", "gpio60",
+                               "gpio62", "gpio63", "gpio64",
+                               "gpio65", "gpio66", "gpio67",
+                               "gpio69";
+                       function = "qpic";
+                       bias-pull-down;
+               };
+       };
+
+       serial_pins: serial_pinmux {
+               mux {
+                       pins = "gpio16", "gpio17";
+                       function = "blsp_uart0";
+                       bias-disable;
+               };
+       };
+
+       spi_0_pins: spi_0_pinmux {
+               pinmux {
+                       function = "blsp_spi0";
+                       pins = "gpio13", "gpio14", "gpio15";
+                       drive-strength = <12>;
+                       bias-disable;
+               };
+
+               pinmux_cs {
+                       function = "gpio";
+                       pins = "gpio12";
+                       drive-strength = <2>;
+                       bias-disable;
+                       output-high;
+               };
+       };
+};
+
+&usb2_hs_phy {
+       status = "okay";
+};
+
+&usb3_ss_phy {
+       status = "okay";
+};
+
+&usb3_hs_phy {
+       status = "okay";
+};
+
+&wifi0 {
+       status = "okay";
+       nvmem-cell-names = "pre-calibration", "mac-address";
+       nvmem-cells = <&precal_art_1000>, <&macaddr_config_0>;
+       mac-address-increment = <2>;
+       qcom,ath10k-calibration-variant = "zte,mf18a";
+};
+
+//* This node is used for 5Ghz on QCA9982 */
+&pcie0 {
+       status = "okay";
+       perst-gpio = <&tlmm 38 GPIO_ACTIVE_LOW>;
+       wake-gpio = <&tlmm 40 GPIO_ACTIVE_LOW>;
+       clkreq-gpio = <&tlmm 39 GPIO_ACTIVE_LOW>;
+
+       bridge@0,0 {
+               reg = <0x00000000 0 0 0 0>;
+               #address-cells = <3>;
+               #size-cells = <2>;
+               ranges;
+
+               wifi2: wifi@1,0 {
+                       compatible = "pci168c,0040";
+                       nvmem-cell-names = "pre-calibration", "mac-address";
+                       nvmem-cells = <&precal_art_9000>, <&macaddr_config_0>;
+                       mac-address-increment = <3>;
+                       reg = <0x00010000 0 0 0 0>;
+               };
+       };
+};
+
+
index f92e11c797127344c6e14d6292956eeca8f048eb..aa013e8e61a9e98da919f53aea56035ebb66c3a7 100644 (file)
@@ -1106,6 +1106,19 @@ endef
 # Missing DSA Setup
 #TARGET_DEVICES += unielec_u4019-32m
 
+define Device/zte_mf18a
+       $(call Device/FitImage)
+       DEVICE_VENDOR := ZTE
+       DEVICE_MODEL := MF18A
+       SOC := qcom-ipq4019
+       DEVICE_DTS_CONFIG := config@ap.dk04.1-c1
+       BLOCKSIZE := 128k
+       PAGESIZE := 2048
+       KERNEL_IN_UBI := 1
+       DEVICE_PACKAGES := ath10k-firmware-qca99x0-ct ipq-wifi-zte_mf18a
+endef
+TARGET_DEVICES += zte_mf18a
+
 define Device/zte_mf28x_common
        $(call Device/FitzImage)
        DEVICE_VENDOR := ZTE