ipq40xx: add support for ZTE MF286D
authorPawel Dembicki <paweldembicki@gmail.com>
Tue, 23 Nov 2021 08:10:14 +0000 (09:10 +0100)
committerChristian Lamparter <chunkeey@gmail.com>
Fri, 4 Feb 2022 23:44:35 +0000 (00:44 +0100)
ZTE MF286D is a LTE router with four gigabit ethernet ports
and integrated QMI mPCIE modem.

Hardware specification:

  - CPU: IPQ4019
  - RAM: 256MB
  - Flash: NAND 128MB + NOR 2MB
  - WLAN1:  Qualcomm Atheros QCA4019 2.4GHz 802.11bgn 2x2:2
  - WLAN2:  Qualcomm Atheros QCA4019 5GHz 802.11anac 2x2:2
  - LTE: mPCIe cat 12 card (Modem chipset MDM9250)
  - LAN: 4 Gigabit Ports
  - USB: 1x USB2.0 (regular port). 1x USB3.0 (mpcie - used by the modem)
  - Serial console: X8 connector 115200 8n1

Known issues:

  - Many LEDs are driven by the modem. Only internal LEDs and wifi LEDs
    are driven by cpu.
  - Wifi LED is triggered by phy0tpt only
  - No VoIP support
  - LAN1/WAN port is configured as WAN
  - ZTE gives only one MAC per device. Use +1/+2/+3 increment for WAN
    and WLAN0/1

Opening the case:

1. Take of battery lid (no battery support for this model, battery cage
   is dummy).
2. Unscrew screw placed behind battery lid.
3. Take off back cover. It attached with multiple plastic clamps.
4. Unscrew four more screws hidden behind back case.
5. Remove front panel from blue chassis. There are more plastic
   clamps.
6. Unscrew two boards, which secures the PCB in the chassis.
7. Extract board from blue chassis.

Console connection (X8 connector):

1. Parameters: 115200 8N1
2. Pin description: (from closest pin to X8 descriptor to farthest)
    - VCC (3.3V)
    - TX
    - RX
    - GND

Install Instructions:

Serial + initramfs:
1. Place OpenWrt initramfs image for the device on a TFTP in
   the server's root. This example uses Server IP: 192.168.1.3
2. Connect serial console (115200,8n1) to X8 connector.
3. Connect TFTP server to RJ-45 port.
4. Stop in u-Boot and run u-Boot commands:
setenv serverip 192.168.1.3
setenv ipaddr 192.168.1.72
set fdt_high 0x85000000
tftp openwrt-ipq40xx-generic-zte_mf286d-initramfs-fit-zImage.itb
bootm $loadaddr
5. Please make backup of original partitions, if you think about revert
   to stock.
6. Login via ssh or serial and remove stock partitions:
ubiattach -m 9
ubirmvol /dev/ubi0 -N ubi_rootfs
ubirmvol /dev/ubi0 -N ubi_rootfs_data
7. Install image via "sysupgrade -n".

Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com>
(cosmetic changes to the commit message)
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
package/firmware/ipq-wifi/Makefile
package/firmware/ipq-wifi/board-zte_mf286d.qca4019 [new file with mode: 0644]
target/linux/ipq40xx/base-files/etc/board.d/02_network
target/linux/ipq40xx/base-files/etc/board.d/03_gpio_switches
target/linux/ipq40xx/base-files/lib/upgrade/platform.sh
target/linux/ipq40xx/config-5.10
target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-mf286d.dts [new file with mode: 0644]
target/linux/ipq40xx/image/generic.mk
target/linux/ipq40xx/patches-5.10/901-arm-boot-add-dts-files.patch

index 8e1dcec20f0a8f2fa566e9e0304872c111b44dbb..9842725be29458c581b551f5f2e7460cc29b6818 100644 (file)
@@ -55,7 +55,8 @@ ALLWIFIBOARDS:= \
        plasmacloud_pa1200 \
        plasmacloud_pa2200 \
        qxwlan_e2600ac \
-       teltonika_rutx
+       teltonika_rutx \
+       zte_mf286d
 
 ALLWIFIPACKAGES:=$(foreach BOARD,$(ALLWIFIBOARDS),ipq-wifi-$(BOARD))
 
@@ -147,5 +148,6 @@ $(eval $(call generate-ipq-wifi-package,plasmacloud_pa1200,Plasma Cloud PA1200))
 $(eval $(call generate-ipq-wifi-package,plasmacloud_pa2200,Plasma Cloud PA2200))
 $(eval $(call generate-ipq-wifi-package,qxwlan_e2600ac,Qxwlan E2600AC))
 $(eval $(call generate-ipq-wifi-package,teltonika_rutx,Teltonika RUTX))
+$(eval $(call generate-ipq-wifi-package,zte_mf286d,ZTE MF286D))
 
 $(foreach PACKAGE,$(ALLWIFIPACKAGES),$(eval $(call BuildPackage,$(PACKAGE))))
diff --git a/package/firmware/ipq-wifi/board-zte_mf286d.qca4019 b/package/firmware/ipq-wifi/board-zte_mf286d.qca4019
new file mode 100644 (file)
index 0000000..348cf95
Binary files /dev/null and b/package/firmware/ipq-wifi/board-zte_mf286d.qca4019 differ
index c39890ecd935cc24c24ba926ef801820b5ef4e4d..11ebb2ef8378e342071ab58a529deb34ff2c3dd7 100644 (file)
@@ -140,6 +140,11 @@ ipq40xx_setup_interfaces()
                ucidef_add_switch "switch0" \
                        "0u@eth0" "1:lan" "2:lan" "3:lan" "4:lan" "0u@eth1" "5:wan"
                ;;
+       zte,mf286d)
+               ucidef_set_interfaces_lan_wan "eth0" "eth1"
+               ucidef_add_switch "switch0" \
+                       "0u@eth0" "2:lan:4" "3:lan:3" "4:lan:2" "0u@eth1" "5:wan"
+               ;;
        *)
                echo "Unsupported hardware. Network interfaces not initialized"
                ;;
index 5d39d37c080ea08e0f8e3c3f2970c444cfce0fa5..a52a33d2f4dcaf70a2ea79a2a2356fe6ce386fbe 100644 (file)
@@ -24,6 +24,9 @@ mikrotik,cap-ac)
 mikrotik,hap-ac3)
        ucidef_add_gpio_switch "poe_passtrough" "PoE Passthrough" "452" "0"
        ;;
+zte,mf286d)
+       ucidef_add_gpio_switch "power_btn_block" "Power button blocker" "421" "0"
+       ;;
 esac
 
 board_config_flush
index d0e9b5b0205c8bf960e9da3e2f93abfdd8cb862a..e8c94409a7cc08202bc5f397e232a6e5e87a097a 100644 (file)
@@ -21,6 +21,29 @@ to install the filesystem.
 You need to delete the jffs2 partition first:
 # ubirmvol /dev/ubi0 --name=jffs2
 
+Once this is done. Retry.
+EOF
+               return 1
+               ;;
+       zte,mf286d)
+               CI_UBIPART="rootfs"
+               local mtdnum="$( find_mtd_index $CI_UBIPART )"
+               [ ! "$mtdnum" ] && return 1
+               ubiattach -m "$mtdnum" || true
+               local ubidev="$( nand_find_ubi $CI_UBIPART )"
+               local ubi_rootfs=$(nand_find_volume $ubidev ubi_rootfs)
+               local ubi_rootfs_data=$(nand_find_volume $ubidev ubi_rootfs_data)
+
+               [ -n "$ubi_rootfs" ] || [ -n "$ubi_rootfs_data" ] || return 0
+
+               cat << EOF
+ubi_rootfs partition is still present.
+
+You need to delete the stock partition first:
+# ubirmvol /dev/ubi0 -N ubi_rootfs
+Please also delete ubi_rootfs_data, if exist:
+# ubirmvol /dev/ubi0 -N ubi_rootfs_data
+
 Once this is done. Retry.
 EOF
                return 1
@@ -161,7 +184,8 @@ platform_do_upgrade() {
                PART_NAME="inactive"
                platform_do_upgrade_dualboot_datachk "$1"
                ;;
-       teltonika,rutx10)
+       teltonika,rutx10 |\
+       zte,mf286d)
                CI_UBIPART="rootfs"
                nand_do_upgrade "$1"
                ;;
index b944c11d16f94aa2e0edc56c9eae0836549dfe34..3ebc7b3e1e9406fa42d4930d7ed1b388e56ac0cb 100644 (file)
@@ -365,6 +365,7 @@ CONFIG_PINCTRL_MSM=y
 CONFIG_PM_OPP=y
 CONFIG_POWER_RESET=y
 CONFIG_POWER_RESET_MSM=y
+CONFIG_POWER_RESET_GPIO_RESTART=y
 CONFIG_POWER_SUPPLY=y
 CONFIG_PPS=y
 CONFIG_PRINTK_TIME=y
diff --git a/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-mf286d.dts b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-mf286d.dts
new file mode 100644 (file)
index 0000000..8d1505c
--- /dev/null
@@ -0,0 +1,435 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+// Copyright (c) 2022, Pawel Dembicki <paweldembicki@gmail.com>.
+
+#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 MF286D";
+       compatible = "zte,mf286d";
+
+       aliases {
+               led-boot = &led_internal;
+               led-failsafe = &led_internal;
+               led-running = &led_internal;
+               led-upgrade = &led_internal;
+       };
+
+       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 {
+                       function = LED_FUNCTION_STATUS;
+                       color = <LED_COLOR_ID_BLUE>;
+                       gpios = <&tlmm 10 GPIO_ACTIVE_LOW>;
+                       label = "blue:internal_led";
+                       default-state = "keep";
+               };
+
+               led-1 {
+                       function = LED_FUNCTION_WLAN;
+                       color = <LED_COLOR_ID_BLUE>;
+                       gpios = <&tlmm 61 GPIO_ACTIVE_LOW>;
+                       linux,default-trigger = "phy0tpt";
+               };
+       };
+
+       keys {
+               compatible = "gpio-keys";
+
+               wifi {
+                       label = "wifi";
+                       linux,code = <KEY_RFKILL>;
+                       gpios = <&tlmm 11 GPIO_ACTIVE_LOW>;
+               };
+
+               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>;
+               };
+
+               ess-psgmii@98000 {
+                       status = "okay";
+               };
+
+               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";
+               };
+
+               ess-switch@c000000 {
+                       status = "okay";
+               };
+
+               edma@c080000 {
+                       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";
+};
+
+&gmac0 {
+       nvmem-cell-names = "mac-address";
+       nvmem-cells = <&macaddr_config_0>;
+};
+
+&gmac1 {
+       nvmem-cell-names = "mac-address";
+       nvmem-cells = <&macaddr_config_0>;
+       mac-address-increment = <1>;
+};
+
+&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_5000: precal@5000 {
+                                       reg = <0x5000 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 0x3200000>;
+                       };
+               };
+       };
+};
+
+&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,mf286d";
+};
+
+&wifi1 {
+       status = "okay";
+       nvmem-cell-names = "pre-calibration", "mac-address";
+       nvmem-cells = <&precal_art_5000>, <&macaddr_config_0>;
+       mac-address-increment = <3>;
+       qcom,ath10k-calibration-variant = "zte,mf286d";
+};
index b22d261d659a73bb8503a370ca43fa53a77077d5..15e9a24544b0589a9ff62c57393d22208049756f 100644 (file)
@@ -977,6 +977,19 @@ define Device/unielec_u4019-32m
 endef
 TARGET_DEVICES += unielec_u4019-32m
 
+define Device/zte_mf286d
+       $(call Device/FitzImage)
+       DEVICE_VENDOR := ZTE
+       DEVICE_MODEL := MF286D
+       SOC := qcom-ipq4019
+       DEVICE_DTS_CONFIG := config@ap.dk04.1-c1
+       BLOCKSIZE := 128k
+       PAGESIZE := 2048
+       KERNEL_IN_UBI := 1
+       DEVICE_PACKAGES := ipq-wifi-zte_mf286d kmod-usb-net-qmi-wwan kmod-usb-serial-option uqmi
+endef
+TARGET_DEVICES += zte_mf286d
+
 define Device/zyxel_nbg6617
        $(call Device/FitImageLzma)
        DEVICE_VENDOR := ZyXEL
index 09ea4efddde690ae94a13cdc81a54a2fabb25227..c8229f28d738ae70e0e5910e67560403b05dec91 100644 (file)
@@ -10,7 +10,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
 
 --- a/arch/arm/boot/dts/Makefile
 +++ b/arch/arm/boot/dts/Makefile
-@@ -902,11 +902,73 @@ dtb-$(CONFIG_ARCH_QCOM) += \
+@@ -902,11 +902,74 @@ dtb-$(CONFIG_ARCH_QCOM) += \
        qcom-apq8074-dragonboard.dtb \
        qcom-apq8084-ifc6540.dtb \
        qcom-apq8084-mtp.dtb \
@@ -60,6 +60,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
 +      qcom-ipq4019-hap-ac3.dtb \
 +      qcom-ipq4019-map-ac2200.dtb \
 +      qcom-ipq4019-lhgg-60ad.dtb \
++      qcom-ipq4019-mf286d.dtb \
 +      qcom-ipq4019-mr8300.dtb \
 +      qcom-ipq4019-pa2200.dtb \
 +      qcom-ipq4019-r619ac-64m.dtb \