ipq40xx: add support for devolo Magic 2 WiFi next
authorStefan Schake <stefan.schake@devolo.de>
Fri, 2 Oct 2020 12:32:55 +0000 (14:32 +0200)
committerPetr Štetiar <ynezz@true.cz>
Tue, 22 Dec 2020 19:55:40 +0000 (20:55 +0100)
SOC:     IPQ4018 / QCA Dakota
CPU:     Quad-Core ARMv7 Processor rev 5 (v71) Cortex-A7
DRAM:    256 MiB
NOR:     32 MiB
ETH:     Qualcomm Atheros QCA8075 (2 ports)
PLC:     MaxLinear G.hn 88LX5152
WLAN1:   Qualcomm Atheros QCA4018 2.4GHz 802.11bgn 2:2x2
WLAN2:   Qualcomm Atheros QCA4018 5GHz 802.11a/n/ac 2:2x2
INPUT:   RESET, WiFi, PLC Button
LEDS:    red/white home, white WiFi

To modify a retail device to run OpenWRT firmware:
1) Setup a TFTP server on IP address 192.168.0.100 and copy the OpenWRT
   initramfs (initramfs-fit-uImage.itb) to the TFTP root as 'uploadfile'.
2) Power on the device while pressing the recessed reset button next to
   the Ethernet ports. This causes the bootloader to retrieve and start
   the initramfs.
3) Once the initramfs is booted, the device will come up with IP
   192.168.1.1. You can then connect through SSH (allow some time for
   the first connection).
4) On the device shell, run 'fw_printenv' to show the U-boot environment.
   Backup this information since it contains device unique factory data.
5) Change the boot command to support booting OpenWRT:
   # fw_setenv bootcmd 'sf probe && sf read 0x84000000 0x180000 0x400000 && bootm'
6) Change directory to /tmp, download the sysupgrade (e.g. through wget)
   and install it with sysupgrade. The device will reboot into OpenWRT.

Notice that there is currently no support for booting the G.hn chip.
This requires userland software we lack the rights to share right now.

Signed-off-by: Stefan Schake <stefan.schake@devolo.de>
package/boot/uboot-envtools/files/ipq40xx
package/firmware/ipq-wifi/Makefile
package/firmware/ipq-wifi/board-devolo_magic-2-wifi-next.qca4019 [new file with mode: 0644]
target/linux/ipq40xx/base-files/etc/board.d/02_network
target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
target/linux/ipq40xx/base-files/lib/preinit/06_set_preinit_iface_ipq40xx.sh
target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4018-magic-2-wifi-next.dts [new file with mode: 0644]
target/linux/ipq40xx/image/Makefile
target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch

index bcb4c5c9623c5c64d969bc52e0fc24c6c9127e3f..34aea1b9993125246a1c6e36cf9dcb7039fe6912 100644 (file)
@@ -32,6 +32,7 @@ ubootenv_mtdinfo () {
 
 case "$board" in
 alfa-network,ap120c-ac |\
+devolo,magic-2-wifi-next |\
 edgecore,ecw5211 |\
 glinet,gl-b1300 |\
 luma,wrtq-329acn |\
index dfb9e0feb3d6e2357abb1fdeff9a7a16db937542..f1a0c1c474b12998a03e06338b670d7e8e0d7a7b 100644 (file)
@@ -30,6 +30,7 @@ ALLWIFIBOARDS:= \
        avm_fritzrepeater-1200 \
        buffalo_wtr-m2133hp \
        cellc_rtl30vw \
+       devolo_magic-2-wifi-next \
        dlink_dap2610 \
        edgecore_ecw5410 \
        edgecore_oap100 \
@@ -110,6 +111,7 @@ $(eval $(call generate-ipq-wifi-package,aruba_ap-303,Aruba AP-303))
 $(eval $(call generate-ipq-wifi-package,avm_fritzrepeater-1200,AVM FRITZRepeater 1200))
 $(eval $(call generate-ipq-wifi-package,buffalo_wtr-m2133hp,Buffalo WTR-M2133HP))
 $(eval $(call generate-ipq-wifi-package,cellc_rtl30vw, Cell C RTL30VW))
+$(eval $(call generate-ipq-wifi-package,devolo_magic-2-wifi-next,devolo Magic 2 WiFi next))
 $(eval $(call generate-ipq-wifi-package,dlink_dap2610,D-Link DAP-2610))
 $(eval $(call generate-ipq-wifi-package,edgecore_ecw5410,Edgecore ECW5410))
 $(eval $(call generate-ipq-wifi-package,edgecore_oap100,Edgecore OAP100))
diff --git a/package/firmware/ipq-wifi/board-devolo_magic-2-wifi-next.qca4019 b/package/firmware/ipq-wifi/board-devolo_magic-2-wifi-next.qca4019
new file mode 100644 (file)
index 0000000..cf86721
Binary files /dev/null and b/package/firmware/ipq-wifi/board-devolo_magic-2-wifi-next.qca4019 differ
index 4361b7c3951e8f26e842a25961fed994b1175890..07bacaf51bdff8a4c34509c98b0fb02367af5651 100755 (executable)
@@ -84,6 +84,9 @@ ipq40xx_setup_interfaces()
                ucidef_add_switch "switch0" \
                        "0u@eth0" "3:lan" "4:lan"
                ;;
+       devolo,magic-2-wifi-next)
+               ucidef_set_interface_lan "eth0 eth1 eth2"
+               ;;
        ezviz,cs-w3-wd1200g-eup)
                ucidef_set_interfaces_lan_wan "eth0" "eth1"
                ucidef_add_switch "switch0" \
@@ -137,6 +140,10 @@ ipq40xx_setup_macs()
        cilab,meshpoint-one)
                label_mac=$(mtd_get_mac_binary "ART" 0x1006)
                ;;
+       devolo,magic-2-wifi-next)
+               lan_mac=$(mtd_get_mac_ascii APPSBLENV MacAddress0)
+               label_mac=$lan_mac
+               ;;
        dlink,dap-2610)
                lan_mac=$(mtd_get_mac_ascii bdcfg lanmac)
                label_mac=$lan_mac
index e50732586a458a2cb9029f1c8994e5bc41e4065d..7293438dfa00b2fdb6bb86ca853503178badf232 100644 (file)
@@ -109,6 +109,10 @@ case "$FIRMWARE" in
        unielec,u4019-32m)
                caldata_extract "0:ART" 0x1000 0x2f20
                ;;
+       devolo,magic-2-wifi-next)
+               caldata_extract "ART" 0x1000 0x2f20
+               ath10k_patch_mac $(mtd_get_mac_ascii APPSBLENV WiFiMacAddress0)
+               ;;
        dlink,dap-2610)
                caldata_extract "ART" 0x1000 0x2f20
                ath10k_patch_mac $(mtd_get_mac_ascii bdcfg wlanmac)
@@ -208,6 +212,10 @@ case "$FIRMWARE" in
        unielec,u4019-32m)
                caldata_extract "0:ART" 0x5000 0x2f20
                ;;
+       devolo,magic-2-wifi-next)
+               caldata_extract "ART" 0x5000 0x2f20
+               ath10k_patch_mac $(mtd_get_mac_ascii APPSBLENV WiFiMacAddress1)
+               ;;
        dlink,dap-2610)
                caldata_extract "ART" 0x5000 0x2f20
                ath10k_patch_mac $(mtd_get_mac_ascii bdcfg wlanmac_a)
index 0311922f08834d03ebf8448bcc73715e423cfecb..e97133f1055e221e6f8a9c4b3c7c78a4911da6f0 100644 (file)
@@ -13,6 +13,9 @@ set_preinit_iface() {
        zyxel,nbg6617)
                ifname=eth0
                ;;
+       devolo,magic-2-wifi-next)
+               ifname=eth1
+               ;;
        esac
 }
 
diff --git a/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4018-magic-2-wifi-next.dts b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4018-magic-2-wifi-next.dts
new file mode 100644 (file)
index 0000000..2709aef
--- /dev/null
@@ -0,0 +1,268 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+#include "qcom-ipq4019.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+       model = "devolo Magic 2 WiFi next";
+       compatible = "devolo,magic-2-wifi-next";
+
+       memory {
+               device_type = "memory";
+               reg = <0x80000000 0x10000000>;
+       };
+
+       soc {
+               rng@22000 {
+                       status = "okay";
+               };
+
+               mdio@90000 {
+                       status = "okay";
+                       pinctrl-0 = <&mdio_pins>;
+                       pinctrl-names = "default";
+                       reset-gpios = <&tlmm 59 GPIO_ACTIVE_LOW>;
+                       reset-delay-us = <2000>;
+
+                       /delete-node/ ethernet-phy@0;
+                       /delete-node/ ethernet-phy@1;
+               };
+
+               ess-psgmii@98000 {
+                       status = "okay";
+               };
+
+               crypto@8e3a000 {
+                       status = "okay";
+               };
+
+               watchdog@b017000 {
+                       status = "okay";
+               };
+
+               ess-switch@c000000 {
+                       status = "okay";
+                       switch_lan_bmp = <0x3e>;
+                       switch_wan_bmp = <0x0>;
+               };
+
+               edma@c080000 {
+                       status = "okay";
+                       qcom,num_gmac = <3>;
+
+                       gmac0 {
+                               qcom,phy_mdio_addr = <3>;
+                               qcom,poll_required = <1>;
+                               /delete-property/ qcom,forced_speed;
+                               /delete-property/ qcom,forced_duplex;
+                               vlan_tag = <1 0x10>;
+                       };
+
+                       gmac1 {
+                               qcom,phy_mdio_addr = <2>;
+                               qcom,poll_required = <1>;
+                               /delete-property/ qcom,forced_speed;
+                               /delete-property/ qcom,forced_duplex;
+                               vlan_tag = <1 0x08>;
+                       };
+
+                       gmac2 {
+                               local-mac-address = [00 00 00 00 00 00];
+                               qcom,phy_mdio_addr = <4>;
+                               qcom,poll_required = <1>;
+                               /delete-property/ qcom,forced_speed;
+                               /delete-property/ qcom,forced_duplex;
+                               vlan_tag = <1 0x20>;
+                       };
+               };
+
+               gpio_export {
+                       compatible = "gpio-export";
+                       #size-cells = <0>;
+
+                       plc {
+                               gpio-export,name = "plc-enable";
+                               gpio-export,output = <1>;
+                               gpios = <&tlmm 63 GPIO_ACTIVE_HIGH>;
+                       };
+               };
+
+       };
+
+       keys {
+               compatible = "gpio-keys";
+
+               wlan {
+                       label = "WLAN";
+                       gpios = <&tlmm 5 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_WPS_BUTTON>;
+               };
+
+               reset {
+                       label = "Reset";
+                       gpios = <&tlmm 0 GPIO_ACTIVE_HIGH>;
+                       linux,code = <KEY_RESTART>;
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               status_dlan {
+                       label = "white:dlan";
+                       gpios = <&tlmm 4 GPIO_ACTIVE_LOW>;
+                       default-state = "keep";
+               };
+
+               status_wlan {
+                       label = "white:wlan";
+                       gpios = <&tlmm 58 GPIO_ACTIVE_LOW>;
+                       default-state = "keep";
+               };
+
+               error_dlan {
+                       label = "red:dlan";
+                       gpios = <&tlmm 3 GPIO_ACTIVE_HIGH>;
+                       default-state = "keep";
+               };
+       };
+};
+
+&tlmm {
+       spi_0_pins: spi_0_pinmux {
+               mux {
+                       function = "blsp_spi0";
+                       pins = "gpio55", "gpio56", "gpio57";
+                       drive-strength = <12>;
+                       bias-disable;
+               };
+
+               mux_cs {
+                       function = "gpio";
+                       pins = "gpio54";
+                       drive-strength = <2>;
+                       bias-disable;
+                       output-high;
+               };
+       };
+
+       mdio_pins: mdio_pinmux {
+               mux_1 {
+                       pins = "gpio53";
+                       function = "mdio";
+                       bias-pull-up;
+               };
+               mux_2 {
+                       pins = "gpio52";
+                       function = "mdc";
+                       bias-pull-up;
+               };
+       };
+
+       serial_pins: serial_pinmux {
+               mux {
+                       pins = "gpio61", "gpio60";
+                       function = "blsp_uart0";
+                       bias-disable;
+               };
+       };
+
+       button_pins: button_pinmux {
+               mux {
+                       function = "gpio";
+                       pins = "gpio0", "gpio5";
+                       bias-disable;
+                       input;
+               };
+       };
+};
+
+&cryptobam {
+       status = "okay";
+};
+
+&blsp_dma {
+       status = "okay";
+};
+
+&blsp1_uart1 {
+       pinctrl-0 = <&serial_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+};
+
+&wifi0 {
+       status = "okay";
+       qcom,ath10k-calibration-variant = "devolo,magic-2-wifi-next";
+};
+
+&wifi1 {
+       status = "okay";
+       qcom,ath10k-calibration-variant = "devolo,magic-2-wifi-next";
+};
+
+&blsp1_spi1 {
+       pinctrl-0 = <&spi_0_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+       cs-gpios = <&tlmm 54 GPIO_ACTIVE_HIGH>;
+
+       flash@0 {
+               compatible = "jedec,spi-nor";
+               reg = <0>;
+               linux,modalias = "n25q128a11";
+               spi-max-frequency = <24000000>;
+
+               partitions {
+                       compatible = "fixed-partitions";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       partition@0 {
+                               label = "SBL1";
+                               reg = <0x00000000 0x00040000>;
+                               read-only;
+                       };
+                       partition@40000 {
+                               label = "MIBIB";
+                               reg = <0x00040000 0x00020000>;
+                               read-only;
+                       };
+                       partition@60000 {
+                               label = "QSEE";
+                               reg = <0x00060000 0x00060000>;
+                               read-only;
+                       };
+                       partition@c0000 {
+                               label = "CDT";
+                               reg = <0x000c0000 0x00010000>;
+                               read-only;
+                       };
+                       partition@d0000 {
+                               label = "DDRPARAMS";
+                               reg = <0x000d0000 0x00010000>;
+                               read-only;
+                       };
+                       partition@e0000 {
+                               label = "APPSBLENV"; /* uboot env*/
+                               reg = <0x000e0000 0x00010000>;
+                       };
+                       partition@f0000 {
+                               label = "APPSBL"; /* uboot */
+                               reg = <0x000f0000 0x00080000>;
+                               read-only;
+                       };
+                       partition@170000 {
+                               label = "ART";
+                               reg = <0x00170000 0x00010000>;
+                               read-only;
+                       };
+                       firmware@180000 {
+                               compatible = "denx,fit";
+                               label = "firmware";
+                               reg = <0x00180000 0x01a80000>;
+                       };
+               };
+       };
+};
index 86bf5a2ccb32cc8971bb7b3689f2df0d57b48713..487f3b5638a68b3b453b5fb303216d6b3c61fdfb 100644 (file)
@@ -317,6 +317,25 @@ define Device/compex_wpj428
 endef
 TARGET_DEVICES += compex_wpj428
 
+define Device/devolo_magic-2-wifi-next
+       $(call Device/FitImage)
+       DEVICE_VENDOR := devolo
+       DEVICE_MODEL := Magic 2 WiFi next
+       SOC := qcom-ipq4018
+       KERNEL_SIZE := 4096k
+
+       # If the bootloader sees 0xDEADC0DE and this trailer at the 64k boundary of a TFTP image
+       # it will bootm it, just like we want for the initramfs.
+       KERNEL_INITRAMFS := kernel-bin | gzip | fit gzip $$(DTS_DIR)/$$(DEVICE_DTS).dtb | pad-to 64k |\
+               append-string -e '\xDE\xAD\xC0\xDE{"fl_initramfs":""}\x00'
+
+       IMAGE_SIZE := 26624k
+       IMAGES := sysupgrade.bin
+       IMAGE/sysupgrade.bin := append-kernel | append-rootfs | pad-rootfs | append-metadata
+       DEVICE_PACKAGES := ipq-wifi-devolo_magic-2-wifi-next uboot-envtools
+endef
+TARGET_DEVICES += devolo_magic-2-wifi-next
+
 define Device/dlink_dap-2610
        $(call Device/FitImageLzma)
        DEVICE_VENDOR := D-Link
index c4502aa3f79b8b07b036f5ab3a2454af70db2d0e..d470bb720462bf40a90ebfcd0432d00bdcc79baa 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
-@@ -837,11 +837,56 @@ dtb-$(CONFIG_ARCH_QCOM) += \
+@@ -837,11 +837,57 @@ dtb-$(CONFIG_ARCH_QCOM) += \
        qcom-apq8074-dragonboard.dtb \
        qcom-apq8084-ifc6540.dtb \
        qcom-apq8084-mtp.dtb \
@@ -18,6 +18,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
 +      qcom-ipq4018-ap120c-ac.dtb \
 +      qcom-ipq4018-dap-2610.dtb \
 +      qcom-ipq4018-cs-w3-wd1200g-eup.dtb \
++      qcom-ipq4018-magic-2-wifi-next.dtb \
 +      qcom-ipq4018-ea6350v3.dtb \
 +      qcom-ipq4018-eap1300.dtb \
 +      qcom-ipq4018-ecw5211.dtb \