Skip to content

Commit

Permalink
ath79: add support for TP-Link Archer A9 v6
Browse files Browse the repository at this point in the history
TP-Link Archer A9 v6 (FCCID: TE7A9V6) is an AC1900 Wave-2 gigabit home
router based on a combination of Qualcomm QCN5502 (most likely a 4x4:4
version of the QCA9563 WiSOC), QCA9984 and QCA8337N.

The vendor's firmware content reveals that the same device might be
available on the US market under name 'Archer C90 v6'. Due to lack of
access to such hardware, support introduced in this commit was tested
only on the EU version (sold under 'Archer A9 v6' name).

Based on the information on the PL version of the vendor website, this
device has been already phased out and is no longer available.

Specifications:

- Qualcomm QCN5502 (775 MHz)
- 128 MB of RAM (DDR2)
- 16 MB of flash (SPI NOR)
- 5x Gbps Ethernet (Qualcomm QCA8337N over SGMII)
- Wi-Fi:
  - 802.11b/g/n on 2.4 GHz: Qualcomm QCN5502* in 4x4:4 mode
  - 802.11a/n/ac on 5 GHz: Qualcomm QCA9984 in 3x3:3 mode
  - 3x non-detachable, dual-band external antennas (~3.5 dBi for 5 GHz,
    ~2.2 dBi for 2.4 GHz, IPEX/U.FL connectors)
  - 1x internal PCB antenna for 2.4 GHz (~1.8 dBi)
- 1x USB 2.0 Type-A
- 11x LED (4x connected to QCA8337N, 7x connected to QCN5502)
- 2x button (reset, WPS)
- UART (4-pin, 2.54 mm pitch) header on PCB (not populated)
- 1x mechanical power switch
- 1x DC jack (12 V)

  *) unsupported due to missing support for QCN550x in ath9k

UART system serial console notice:

The RX signal of the main SOC's UART on this device is shared with the
WPS button's GPIO. The first-stage U-Boot by default disables the RX,
resulting in a non-functional UART input.
If you press and keep 'ENTER' on the serial console during early
boot-up, the first-stage U-Boot will enable RX input.

Vendor firmware allows password-less access to the system over serial.

Flash instruction (vendor GUI):

1. It is recommended to first upgrade vendor firmware to the latest
   version (1.1.1 Build 20210315 rel.40637 at the time of writing).
2. Use the 'factory' image directly in the vendor's GUI.

Flash instruction (TFTP based recovery in second-stage U-Boot):

1. Rename 'factory' image to 'ArcherA9v6_tp_recovery.bin'
2. Setup a TFTP server on your PC with IP 192.168.0.66/24.
3. Press and hold the reset button for ~5 sec while turning on power.
4. The device will download image, flash it and reboot.

Flash instruction (web based recovery in first-stage U-Boot):

1. Use 'CTRL+C' during power-up to enable CLI in first-stage U-Boot.
2. Connect a PC with IP set to 192.168.0.1 to one of the LAN ports.
3. Issue 'httpd' command and visit http://192.168.0.1 in browser.
4. Use the 'factory' image.

If you would like to restore vendor's firmware, follow one of the
recovery methods described above.

Signed-off-by: Piotr Dymacz <pepe2k@gmail.com>
  • Loading branch information
pepe2k committed Feb 27, 2022
1 parent 2d5b596 commit 9c335ac
Show file tree
Hide file tree
Showing 4 changed files with 265 additions and 0 deletions.
248 changes: 248 additions & 0 deletions target/linux/ath79/dts/qcn5502_tplink_archer-a9-v6.dts
@@ -0,0 +1,248 @@
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT

#include "qca956x.dtsi"

#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>

/ {
model = "TP-Link Archer A9 v6";
compatible = "tplink,archer-a9-v6", "qca,qcn5500", "qca,qca9560";

aliases {
label-mac-device = &eth0;
led-boot = &led_power;
led-failsafe = &led_power;
led-running = &led_power;
led-upgrade = &led_power;
};

keys {
compatible = "gpio-keys";

reset {
label = "reset";
linux,code = <KEY_RESTART>;
gpios = <&gpio 16 GPIO_ACTIVE_LOW>;
debounce-interval = <60>;
};

wps {
label = "wps";
linux,code = <KEY_WPS_BUTTON>;
gpios = <&gpio 18 GPIO_ACTIVE_LOW>;
debounce-interval = <60>;
};
};

leds {
compatible = "gpio-leds";

led_power: power {
label = "green:power";
gpios = <&gpio 17 GPIO_ACTIVE_LOW>;
default-state = "on";
};

usb {
label = "green:usb";
gpios = <&gpio 0 GPIO_ACTIVE_HIGH>;
trigger-sources = <&hub_port0>;
linux,default-trigger = "usbport";
};

wan {
label = "green:wan";
gpios = <&gpio 4 GPIO_ACTIVE_LOW>;
};

wan_orange {
label = "orange:wan";
gpios = <&gpio 3 GPIO_ACTIVE_LOW>;
};

wlan2g {
label = "green:wlan2g";
gpios = <&gpio 15 GPIO_ACTIVE_LOW>;
linux,default-trigger = "phy1tpt";
};

wlan5g {
label = "green:wlan5g";
gpios = <&gpio 20 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "phy0tpt";
};

wps {
label = "green:wps";
gpios = <&gpio 1 GPIO_ACTIVE_LOW>;
};
};
};

&eth0 {
status = "okay";

pll-data = <0x03000101 0x00000101 0x00001919>;

phy-mode = "sgmii";
phy-handle = <&phy0>;

nvmem-cells = <&macaddr_info_8>;
nvmem-cell-names = "mac-address";
};

&mdio0 {
status = "okay";

phy-mask = <0>;

phy0: ethernet-phy@0 {
reg = <0>;
phy-mode = "sgmii";
qca,mib-poll-interval = <500>;

qca,ar8327-initvals = <
0x04 0x80080080 /* PORT0 PAD MODE CTRL */
0x08 0x00000000 /* PORT5 PAD MODE CTRL */
0x0c 0x00000000 /* PORT6 PAD MODE CTRL */
0x10 0x00000080 /* POWER_ON_STRAP */
0x7c 0x0000007e /* PORT0_STATUS */
0x94 0x00000200 /* PORT6_STATUS */
>;
};
};

&pcie {
status = "okay";

wifi@0,0 {
compatible = "pci168c,0046";
reg = <0 0 0 0 0>;

nvmem-cells = <&macaddr_info_8>, <&precal_art_5000>;
nvmem-cell-names = "mac-address", "pre-calibration";

mac-address-increment = <(-1)>;
};
};

&spi {
status = "okay";

flash@0 {
compatible = "jedec,spi-nor";
reg = <0>;
spi-max-frequency = <25000000>;
m25p,fast-read;

mtdparts: partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;

partition@0 {
label = "factory-uboot";
reg = <0x000000 0x020000>;
read-only;
};

partition@20000 {
label = "u-boot";
reg = <0x020000 0x020000>;
read-only;
};

partition@40000 {
label = "partition-table";
reg = <0x040000 0x010000>;
read-only;
};

partition@50000 {
label = "art";
reg = <0x050000 0x010000>;
read-only;

compatible = "nvmem-cells";
#address-cells = <1>;
#size-cells = <1>;

cal_art_1000: cal@1000 {
reg = <0x1000 0x440>;
};

precal_art_5000: precal@5000 {
reg = <0x5000 0x2f20>;
};
};

partition@60000 {
label = "info";
reg = <0x060000 0x020000>;
read-only;

compatible = "nvmem-cells";
#address-cells = <1>;
#size-cells = <1>;

macaddr_info_8: macaddr@8 {
reg = <0x8 0x6>;
};
};

partition@80000 {
label = "user-config";
reg = <0x080000 0x040000>;
read-only;
};

partition@c0000 {
compatible = "denx,uimage";
label = "firmware";
reg = <0x0c0000 0xf00000>;
};

partition@fc0000 {
label = "log";
reg = <0xfc0000 0x020000>;
read-only;
};

partition@fe0000 {
label = "certificate";
reg = <0xfe0000 0x010000>;
read-only;
};

partition@ff0000 {
label = "default-config";
reg = <0xff0000 0x010000>;
read-only;
};
};
};
};

&usb_phy0 {
status = "okay";
};

&usb0 {
#address-cells = <1>;
#size-cells = <0>;
status = "okay";

hub_port0: port@1 {
reg = <1>;
#trigger-source-cells = <0>;
};
};

&wmac {
/* TODO: missing support in ath9k */
status = "disabled";

nvmem-cells = <&cal_art_1000>, <&macaddr_info_8>;
nvmem-cell-names = "calibration", "mac-address";
};
3 changes: 3 additions & 0 deletions target/linux/ath79/generic/base-files/etc/board.d/01_leds
Expand Up @@ -325,6 +325,9 @@ tplink,archer-c7-v5)
ucidef_set_led_switch "lan3" "LAN3" "green:lan3" "switch0" "0x10"
ucidef_set_led_switch "lan4" "LAN4" "green:lan4" "switch0" "0x20"
;;
tplink,archer-a9-v6)
ucidef_set_led_switch "wan" "WAN" "green:wan" "switch0" "0x02"
;;
tplink,archer-c2-v3|\
tplink,tl-wr1043nd-v4|\
tplink,tl-wr1043n-v5)
Expand Down
2 changes: 2 additions & 0 deletions target/linux/ath79/generic/base-files/etc/board.d/02_network
Expand Up @@ -337,6 +337,7 @@ ath79_setup_interfaces()
;;
mercury,mw4530r-v1|\
tplink,archer-a7-v5|\
tplink,archer-a9-v6|\
tplink,archer-c6-v2|\
tplink,archer-c6-v2-us|\
tplink,archer-c7-v4|\
Expand Down Expand Up @@ -691,6 +692,7 @@ ath79_setup_macs()
label_mac=$lan_mac
;;
tplink,archer-a7-v5|\
tplink,archer-a9-v6|\
tplink,archer-c7-v4|\
tplink,archer-c7-v5|\
tplink,tl-wr1043nd-v4|\
Expand Down
12 changes: 12 additions & 0 deletions target/linux/ath79/image/generic-tp-link.mk
Expand Up @@ -12,6 +12,18 @@ define Device/tplink_archer-a7-v5
endef
TARGET_DEVICES += tplink_archer-a7-v5

define Device/tplink_archer-a9-v6
$(Device/tplink-safeloader-uimage)
SOC := qcn5502
IMAGE_SIZE := 15360k
DEVICE_MODEL := Archer A9
DEVICE_VARIANT := v6
DEVICE_PACKAGES := kmod-usb2 kmod-usb-ledtrig-usbport kmod-ath10k-ct \
ath10k-firmware-qca9984-ct
TPLINK_BOARD_ID := ARCHER-A9-V6
endef
TARGET_DEVICES += tplink_archer-a9-v6

define Device/tplink_archer-c2-v3
$(Device/tplink-safeloader-uimage)
SOC := qca9563
Expand Down

0 comments on commit 9c335ac

Please sign in to comment.