ipq806x: add support for TP-Link Talon AD7200
authorGary Cooper <gaco@bitmessage.de>
Mon, 4 Jan 2021 17:27:50 +0000 (20:27 +0300)
committerDaniel Golle <daniel@makrotopia.org>
Tue, 5 Jan 2021 02:16:24 +0000 (02:16 +0000)
Device hardware: https://deviwiki.com/wiki/TP-LINK_AD7200_(Talon)

The Talon AD7200 is basically an Archer C2600 with a third PCIe lane
and an 802.11ad radio. It looks like the Archers C2600/5400 but the
housing is slightly larger.

Specifications
--------------

  - IPQ8064 dual-core 1400MHz
  - QCA9988 2.4GHz WiFi
  - QCA9990 5GHz WiFi
  - QCA9500 60GHz WiFi
  - 32MB SPI Flash
  - 512MiB RAM
  - 5 GBit Ports (QCA8337)

Installation
------------

Installation is possible from the OEM web interface.
Sysupgrade is possible.
TFTP recovery is possible.
  - Image: AD7200_1.0_tp_recovery.bin

Notes
  - This will be the first 802.11ad device supported by mainline.

Signed-off-by: Gary Cooper <gaco@bitmessage.de>
target/linux/ipq806x/base-files/etc/board.d/01_leds
target/linux/ipq806x/base-files/etc/board.d/02_network
target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
target/linux/ipq806x/base-files/lib/upgrade/platform.sh
target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8064-ad7200.dts [new file with mode: 0644]
target/linux/ipq806x/image/Makefile
tools/firmware-utils/src/tplink-safeloader.c

index fed821663ab5fa8805821c6b722ee0e91d3f0af7..a03a056d8398088fb30ce6bb50f1c726b9e8de1e 100755 (executable)
@@ -39,6 +39,15 @@ netgear,r7800)
        ucidef_set_led_switch "wan" "WAN" "white:wan" "switch0" "0x20"
        ucidef_set_led_ide "esata" "eSATA" "white:esata"
        ;;
+tplink,ad7200)
+       ucidef_set_led_usbport "usb1" "USB 1" "blue:usb_1" "usb1-port1" "usb2-port1"
+       ucidef_set_led_usbport "usb2" "USB 2" "blue:usb_3" "usb3-port1" "usb4-port1"
+       ucidef_set_led_switch "wan" "wan" "blue:wan" "switch0" "0x02"
+       ucidef_set_led_switch "lan" "lan" "blue:lan" "switch0" "0x3c"
+       ucidef_set_led_wlan "wlan2g" "wlan2g" "blue:wlan2g" "phy2tpt"
+       ucidef_set_led_wlan "wlan5g" "wlan5g" "blue:wlan5g" "phy1tpt"
+       ucidef_set_led_netdev "wlan60g" "wlan60g" "blue:wlan60g" "wlan0"
+       ;;
 tplink,c2600)
        ucidef_set_led_usbport "usb1" "USB 1" "white:usb_2" "usb1-port1" "usb2-port1"
        ucidef_set_led_usbport "usb2" "USB 2" "white:usb_4" "usb3-port1" "usb4-port1"
index 10b2ec01483df8712ef69a5fdaf16812839d12a1..fbf56c5e0ce98e41eb17cacd263922aff7fd0d9e 100755 (executable)
@@ -51,6 +51,7 @@ nec,wg2600hp3)
                "2:lan" "3:lan" "4:lan" "5:lan" "0@eth1" "1:wan" "6@eth0"
        ;;
 netgear,r7800 |\
+tplink,ad7200 |\
 tplink,c2600)
        ucidef_add_switch "switch0" \
                "1:lan:4" "2:lan:3" "3:lan:2" "4:lan:1" "6@eth1" "5:wan" "0@eth0"
index 8788fc92f6e5819edd6b674556298b3d77a5801d..3befc40630c988d7f84c940bf4cff4d0b2c4cfc4 100644 (file)
@@ -35,6 +35,7 @@ case "$FIRMWARE" in
                caldata_extract "art" 0x1000 0x2f20
                ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary art 0x6) +1)
                ;;
+       tplink,ad7200 |\
        tplink,c2600)
                caldata_extract "radio" 0x1000 0x2f20
                ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary default-mac 0x8) -1)
@@ -74,6 +75,7 @@ case "$FIRMWARE" in
                caldata_extract "art" 0x5000 0x2f20
                ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary art 0x6) +2)
                ;;
+       tplink,ad7200 |\
        tplink,c2600)
                caldata_extract "radio" 0x5000 0x2f20
                ath10k_patch_mac $(mtd_get_mac_binary default-mac 0x8)
index f5d6c5d55d66e52ada80c75d57d922fc518f5f09..4dc612492cd34b9a502db10a8bf74c89ff18be1e 100644 (file)
@@ -43,6 +43,7 @@ platform_do_upgrade() {
        linksys,ea8500)
                platform_do_upgrade_linksys "$1"
                ;;
+       tplink,ad7200 |\
        tplink,c2600)
                PART_NAME="os-image:rootfs"
                MTD_CONFIG_ARGS="-s 0x200000"
diff --git a/target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8064-ad7200.dts b/target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8064-ad7200.dts
new file mode 100644 (file)
index 0000000..e5bdc32
--- /dev/null
@@ -0,0 +1,440 @@
+//SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+#include "qcom-ipq8064-v2.0.dtsi"
+
+#include <dt-bindings/input/input.h>
+
+/ {
+       model = "TP-Link Talon AD7200";
+       compatible = "tplink,ad7200", "qcom,ipq8064";
+
+       memory@0 {
+               reg = <0x42000000 0x1e000000>;
+               device_type = "memory";
+       };
+
+       aliases {
+               mdio-gpio0 = &mdio0;
+
+               led-boot = &power;
+               led-failsafe = &power;
+               led-running = &power;
+               led-upgrade = &power;
+               label-mac-device = &gmac2;
+       };
+
+       keys {
+               compatible = "gpio-keys";
+               pinctrl-0 = <&button_pins>;
+               pinctrl-names = "default";
+
+               wifi {
+                       label = "wifi";
+                       gpios = <&qcom_pinmux 54 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_RFKILL>;
+               };
+
+               reset {
+                       label = "reset";
+                       gpios = <&qcom_pinmux 7 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_RESTART>;
+               };
+
+               wps {
+                       label = "wps";
+                       gpios = <&qcom_pinmux 67 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_WPS_BUTTON>;
+               };
+
+               ledgeneral {
+                       label = "ledswitch";
+                       gpios = <&qcom_pinmux 53 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_LIGHTS_TOGGLE>;
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+               pinctrl-0 = <&led_pins>;
+               pinctrl-names = "default";
+
+               lan {
+                       label = "blue:lan";
+                       gpios = <&qcom_pinmux 2 GPIO_ACTIVE_HIGH>;
+               };
+
+               usb1 {
+                       label = "blue:usb_1";
+                       gpios = <&qcom_pinmux 8 GPIO_ACTIVE_HIGH>;
+               };
+
+               usb3 {
+                       label = "blue:usb_3";
+                       gpios = <&qcom_pinmux 16 GPIO_ACTIVE_HIGH>;
+               };
+
+               wps {
+                       label = "blue:wps";
+                       gpios = <&qcom_pinmux 55 GPIO_ACTIVE_HIGH>;
+               };
+
+               wan_orange {
+                       label = "orange:wan";
+                       gpios = <&qcom_pinmux 26 GPIO_ACTIVE_LOW>;
+               };
+
+               wan_blue {
+                       label = "blue:wan";
+                       gpios = <&qcom_pinmux 33 GPIO_ACTIVE_LOW>;
+               };
+
+               power: status {
+                       label = "blue:status";
+                       gpios = <&qcom_pinmux 66 GPIO_ACTIVE_HIGH>;
+               };
+
+               wlan2g {
+                       label = "blue:wlan2g";
+                       gpios = <&qcom_pinmux 17 GPIO_ACTIVE_HIGH>;
+
+               };
+
+               wlan5g {
+                       label = "blue:wlan5g";
+                       gpios = <&qcom_pinmux 15 GPIO_ACTIVE_HIGH>;
+
+               };
+
+               wlan60g {
+                       label = "blue:wlan60g";
+                       gpios = <&qcom_pinmux 56 GPIO_ACTIVE_HIGH>;
+               };
+       };
+};
+
+&qcom_pinmux {
+       button_pins: button_pins {
+               mux {
+                       pins = "gpio53", "gpio54", "gpio67";
+                       function = "gpio";
+                       drive-strength = <2>;
+                       bias-pull-up;
+               };
+       };
+
+       led_pins: led_pins {
+               mux {
+                       pins = "gpio2", "gpio8", "gpio15", "gpio16", "gpio17", "gpio26",
+                                       "gpio33", "gpio55", "gpio56", "gpio66";
+                       function = "gpio";
+                       drive-strength = <2>;
+                       bias-pull-up;
+               };
+       };
+
+       spi_pins: spi_pins {
+               mux {
+                       pins = "gpio18", "gpio19", "gpio21";
+                       function = "gsbi5";
+                       bias-pull-down;
+               };
+
+               data {
+                       pins = "gpio18", "gpio19";
+                       drive-strength = <10>;
+               };
+
+               cs {
+                       pins = "gpio20";
+                       function = "gpio";
+                       drive-strength = <10>;
+                       bias-pull-up;
+               };
+
+               clk {
+                       pins = "gpio21";
+                       drive-strength = <12>;
+               };
+       };
+
+       usb0_pwr_en_pin: usb0_pwr_en_pin {
+               mux {
+                       pins = "gpio25";
+                       function = "gpio";
+                       drive-strength = <10>;
+                       bias-pull-up;
+                       output-high;
+               };
+       };
+
+       usb1_pwr_en_pin: usb1_pwr_en_pin {
+               mux {
+                       pins = "gpio23";
+                       function = "gpio";
+                       drive-strength = <10>;
+                       bias-pull-up;
+                       output-high;
+               };
+       };
+};
+
+&gsbi5 {
+       qcom,mode = <GSBI_PROT_SPI>;
+       status = "okay";
+
+       spi4: spi@1a280000 {
+               status = "okay";
+
+               pinctrl-0 = <&spi_pins>;
+               pinctrl-names = "default";
+
+               cs-gpios = <&qcom_pinmux 20 GPIO_ACTIVE_HIGH>;
+
+               m25p80@0 {
+                       compatible = "jedec,spi-nor";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       spi-max-frequency = <50000000>;
+                       reg = <0>;
+
+                       SBL1@0 {
+                               label = "SBL1";
+                               reg = <0x0 0x20000>;
+                               read-only;
+                       };
+
+                       MIBIB@20000 {
+                               label = "MIBIB";
+                               reg = <0x20000 0x20000>;
+                               read-only;
+                       };
+
+                       SBL2@40000 {
+                               label = "SBL2";
+                               reg = <0x40000 0x20000>;
+                               read-only;
+                       };
+
+                       SBL3@60000 {
+                               label = "SBL3";
+                               reg = <0x60000 0x30000>;
+                               read-only;
+                       };
+
+                       DDRCONFIG@90000 {
+                               label = "DDRCONFIG";
+                               reg = <0x90000 0x10000>;
+                               read-only;
+                       };
+
+                       SSD@a0000 {
+                               label = "SSD";
+                               reg = <0xa0000 0x10000>;
+                               read-only;
+                       };
+
+                       TZ@b0000 {
+                               label = "TZ";
+                               reg = <0xb0000 0x30000>;
+                               read-only;
+                       };
+
+                       RPM@e0000 {
+                               label = "RPM";
+                               reg = <0xe0000 0x20000>;
+                               read-only;
+                       };
+
+                       fs-uboot@100000 {
+                               label = "fs-uboot";
+                               reg = <0x100000 0x70000>;
+                               read-only;
+                       };
+
+                       uboot-env@170000 {
+                               label = "uboot-env";
+                               reg = <0x170000 0x40000>;
+                               read-only;
+                       };
+
+                       radio@1b0000 {
+                               label = "radio";
+                               reg = <0x1b0000 0x40000>;
+                               read-only;
+                       };
+
+                       os-image@1f0000 {
+                               label = "os-image";
+                               reg = <0x1f0000 0x400000>;
+                       };
+
+                       rootfs@5f0000 {
+                               label = "rootfs";
+                               reg = <0x5f0000 0x1900000>;
+                       };
+
+                       defaultmac: default-mac@1ef0000 {
+                               label = "default-mac";
+                               reg = <0x1ef0000 0x00200>;
+                               read-only;
+                       };
+
+                       pin@1ef0200 {
+                               label = "pin";
+                               reg = <0x1ef0200 0x00200>;
+                               read-only;
+                       };
+
+                       device-id@1ef0400 {
+                               label = "device-id";
+                               reg = <0x1ef0400 0x00200>;
+                               read-only;
+                       };
+
+                       product-info@1ef0600 {
+                               label = "product-info";
+                               reg = <0x1ef0600 0x0fa00>;
+                               read-only;
+                       };
+
+                       partition-table@1f00000 {
+                               label = "partition-table";
+                               reg = <0x1f00000 0x10000>;
+                               read-only;
+                       };
+
+                       soft-version@1f10000 {
+                               label = "soft-version";
+                               reg = <0x1f10000 0x10000>;
+                               read-only;
+                       };
+
+                       support-list@1f20000 {
+                               label = "support-list";
+                               reg = <0x1f20000 0x10000>;
+                               read-only;
+                       };
+
+                       profile@1f30000 {
+                               label = "profile";
+                               reg = <0x1f30000 0x10000>;
+                               read-only;
+                       };
+
+                       default-config@1f40000 {
+                               label = "default-config";
+                               reg = <0x1f40000 0x10000>;
+                               read-only;
+                       };
+
+                       user-config@1f50000 {
+                               label = "user-config";
+                               reg = <0x1f50000 0x40000>;
+                               read-only;
+                       };
+
+                       qos-db@1f90000 {
+                               label = "qos-db";
+                               reg = <0x1f90000 0x40000>;
+                               read-only;
+                       };
+
+                       usb-config@1fd0000 {
+                               label = "usb-config";
+                               reg = <0x1fd0000 0x10000>;
+                               read-only;
+                       };
+
+                       log@1fe0000 {
+                               label = "log";
+                               reg = <0x1fe0000 0x20000>;
+                               read-only;
+                       };
+               };
+       };
+};
+
+&usb3_0 {
+       status = "okay";
+
+       pinctrl-0 = <&usb0_pwr_en_pin>;
+       pinctrl-names = "default";
+};
+
+&usb3_1 {
+       status = "okay";
+
+       pinctrl-0 = <&usb1_pwr_en_pin>;
+       pinctrl-names = "default";
+};
+
+&pcie0 {
+       status = "okay";
+};
+
+&pcie1 {
+       status = "okay";
+       max-link-speed = <1>;
+};
+
+&pcie2 {
+       status = "okay";
+       max-link-speed = <1>;
+};
+
+&mdio0 {
+       status = "okay";
+
+       pinctrl-0 = <&mdio0_pins>;
+       pinctrl-names = "default";
+
+       phy0: ethernet-phy@0 {
+               reg = <0>;
+               qca,ar8327-initvals = <
+                       0x00004 0x7600000   /* PAD0_MODE */
+                       0x00008 0x1000000   /* PAD5_MODE */
+                       0x0000c 0x80        /* PAD6_MODE */
+                       0x000e4 0x6a545     /* MAC_POWER_SEL */
+                       0x000e0 0xc74164de  /* SGMII_CTRL */
+                       0x0007c 0x4e        /* PORT0_STATUS */
+                       0x00094 0x4e        /* PORT6_STATUS */
+                       >;
+       };
+
+       phy4: ethernet-phy@4 {
+               reg = <4>;
+       };
+};
+
+&gmac1 {
+       status = "okay";
+       phy-mode = "rgmii";
+       qcom,id = <1>;
+
+       pinctrl-0 = <&rgmii2_pins>;
+       pinctrl-names = "default";
+
+       mtd-mac-address = <&defaultmac 0x8>;
+       mtd-mac-address-increment = <1>;
+
+       fixed-link {
+               speed = <1000>;
+               full-duplex;
+       };
+};
+
+&gmac2 {
+       status = "okay";
+       phy-mode = "sgmii";
+       qcom,id = <2>;
+
+       mtd-mac-address = <&defaultmac 0x8>;
+
+       fixed-link {
+               speed = <1000>;
+               full-duplex;
+       };
+};
+
+&adm_dma {
+       status = "okay";
+};
index 80bfec5ad9198a69c7fdd8251f8d35285eb4a216..876f337bba8fa006e4a98d8899c2ee3b62fb2fef 100644 (file)
@@ -333,6 +333,21 @@ define Device/qcom_ipq8064-db149
 endef
 TARGET_DEVICES += qcom_ipq8064-db149
 
+define Device/tplink_ad7200
+       $(call Device/TpSafeImage)
+       DEVICE_VENDOR := TP-Link
+       DEVICE_MODEL := Talon AD7200
+       DEVICE_VARIANT := v1
+       SOC := qcom-ipq8064
+       BLOCKSIZE := 128k
+       PAGESIZE := 2048
+       BOARD_NAME := ad7200
+       SUPPORTED_DEVICES += ad7200
+       TPLINK_BOARD_ID := AD7200
+       DEVICE_PACKAGES := ath10k-firmware-qca99x0-ct kmod-wil6210
+endef
+TARGET_DEVICES += tplink_ad7200
+
 define Device/tplink_c2600
        $(call Device/TpSafeImage)
        DEVICE_VENDOR := TP-Link
index deba84c6d1c143f07ff4a27682131c9ee2a4dc0a..785ff396425ec8b8f03a787a4e86a0ece454f485 100644 (file)
@@ -668,6 +668,50 @@ static struct device_info boards[] = {
                .last_sysupgrade_partition = "support-list",
        },
 
+       /** Firmware layout for the AD7200 */
+       {
+               .id = "AD7200",
+               .vendor = "",
+               .support_list =
+                       "SupportList:\r\n"
+                       "{product_name:Talon AD7200,product_ver:1.0.0,special_id:00000000}\r\n",
+               .part_trail = 0x00,
+               .soft_ver = NULL,
+
+               .partitions = {
+                       {"SBL1", 0x00000, 0x20000},
+                       {"MIBIB", 0x20000, 0x20000},
+                       {"SBL2", 0x40000, 0x20000},
+                       {"SBL3", 0x60000, 0x30000},
+                       {"DDRCONFIG", 0x90000, 0x10000},
+                       {"SSD", 0xa0000, 0x10000},
+                       {"TZ", 0xb0000, 0x30000},
+                       {"RPM", 0xe0000, 0x20000},
+                       {"fs-uboot", 0x100000, 0x70000},
+                       {"uboot-env", 0x170000, 0x40000},
+                       {"radio", 0x1b0000, 0x40000},
+                       {"os-image", 0x1f0000, 0x400000},
+                       {"file-system", 0x5f0000, 0x1900000},
+                       {"default-mac", 0x1ef0000, 0x00200},
+                       {"pin", 0x1ef0200, 0x00200},
+                       {"device-id", 0x1ef0400, 0x00200},
+                       {"product-info", 0x1ef0600, 0x0fa00},
+                       {"partition-table", 0x1f00000, 0x10000},
+                       {"soft-version", 0x1f10000, 0x10000},
+                       {"support-list", 0x1f20000, 0x10000},
+                       {"profile", 0x1f30000, 0x10000},
+                       {"default-config", 0x1f40000, 0x10000},
+                       {"user-config", 0x1f50000, 0x40000},
+                       {"qos-db", 0x1f90000, 0x40000},
+                       {"usb-config", 0x1fd0000, 0x10000},
+                       {"log", 0x1fe0000, 0x20000},
+                       {NULL, 0, 0}
+               },
+
+               .first_sysupgrade_partition = "os-image",
+               .last_sysupgrade_partition = "file-system"
+       },
+
        /** Firmware layout for the C2600 */
        {
                .id     = "C2600",