Add support for TP-Link Archer AX23 v2

New here, 1st post.

I have baught a second TP-Link Archer AX23, hoping it was a V1. Unfortunately it’s a V2. I want OpenWRT in it so I started exploring. Cracked it open and went to probe the UART port and a bunch of SMDs are missing, the scope says no data on the TX/RX pins. Looking at the circuit it’s definately a level shifter. Found the 1.8v TX/RX, 1.8v, 3.3v and GND traces. Soldered in a lvl shifter, and WE ARE IN! Stopped autoboot and got the wanted 5018# UBoot command prompt. Aparently, TP-Link did not think we would get into UBoot. I’ve never seen one with so many utilities.

The router has a IPQ0509 and QCN6102 chip combo with a RTL8367S switch

no picture of the switch chip, it has heatsink on it, but in the console a normal boot i get:

[ 15.713942] rtl8367_gpio_reset[3618]:INFO:GPIO33 reset switch done

and on a autostopped boot i get:

Set RTL8367S SGMII 2.5Gbps

Next step, decompressing the OEM Firmware... found out:

It is running OpenWRT 12.09-rc1

SupportList:

{product_name:Archer AX23,product_ver:2.0.0,special_id:55530000}

{product_name:Archer AX23,product_ver:2.0.0,special_id:45550000}

{product_name:Archer AX23,product_ver:2.0.0,special_id:43410000}

{product_name:Archer AX23,product_ver:2.0.0,special_id:54570000}

{product_name:Archer AX23,product_ver:2.0.0,special_id:53470000}

{product_name:Archer AX23,product_ver:2.0.0,special_id:45470000}

{product_name:Archer AX1800,product_ver:2.0.0,special_id:45550000}

{product_name:Archer AX1800,product_ver:5.0.0,special_id:55530000}

{product_name:Archer AX21,product_ver:5.0.0,special_id:55530000}

{product_name:Archer AX20,product_ver:5.0.0,special_id:55530000}
./ini/QCA6290.ini

./ini/QCA8074.ini

./ini/QCA9984.ini

./ini/QCA5018.ini

./ini/internal/QCA9984_i.ini

./ini/internal/QCA6018_i.ini

./ini/internal/QCA5018_i.ini

./ini/internal/QCA6290_i.ini

./ini/internal/QCA9888_i.ini

./ini/internal/QCA8074_i.ini

./ini/internal/QCA8074V2_i.ini

./ini/QCA6018.ini


./ini/internal/QCN9000_i.ini

./ini/internal/QCN6122_i.ini

./ini/QCN6122.ini

./ini/QCN9000.ini


./ini/internal/IPQ4019_i.ini

./CA/default/lib/firmware/IPQ5018

./CA/00000002/lib/firmware/IPQ5018

./CA/00000001/lib/firmware/IPQ5018

So I’m thinking we can build a hole device tree for AX23 v2, AX1800 v2 & v5, AX20 and AX21, way past my ability. But this is about the AX23 v2 so: IPQ5018 for the IPQ0509 SoC, QCN6122 for the QCN6102 5ghz radio and RTL8367 5 port switch right?

Compiled a custom OpenWRT image with ‘what I think I need’ and it ‘boots’ into console. But nothing much is working probably because I don’t have a custom target profile for this router and havent red/applied the calibration data. I’ve tried the MX2000 MX5500, doesn’t even reach console, the CMCC MR300D-CI does boot up to the console, but not much is working. The original OEM firmware is running target profile qcom-ipq50xx-mpxx device tree blob, it is not listed.

And this is where I’m at. I am still going to dig this rabbit hole deeper. Right now I’m thinking I need to create a custom target profile for this device. I have a hole bunch of firmware configurations, partition configurations, package configurations in the OEM firmware. GPIOs I can test once it boots and works. Got to RTFM add new platform & device, an other day...

I could use some pointers on what direction to take. I don’t see a way I can post my OpenWRT .config and kernel .config here. Maby pastebin if somebody would like to see it.

what's the amount of RAM shipping with this thing ?

According to the datasheet listed in WikiDevi.RU :

IPQ5018 is WiFi-6 compatible but IPQ0509 / IPQ0518 is WiFi-6E compatible. Maybe the latter is a minor variant to the former.

more than the TP-Link AX23 v1

Archer AX23 V1.0

root@TP-Link-V1:~# free -m
total used free shared buff/cache available
Mem: 118784 46612 44380 1792 27792 32804
Swap: 0 0 0

Archer AX23 V2.0

root@TP-Link-V2:~# free -m
total used free shared buff/cache available
Mem: 184108 36172 114264 28876 33672 92088
Swap: 0 0 0

256MB on QCA is a dead end, don't bother, move on.

I'll add the info to the v1 page.

Ok so I dug the hole a little bit deeper. The router is unsupported because we don’t have the DTS files. It’s not a hardware driver issue. The device tree blob that the OEM firmware is built on is qcom-ipq50xx-mpxx, that is a part of the Qualcomm’s QSDK kit that we won’t get our hands on without a name like Linksys or Cisco…

I did find dtb_combined.bin in the APPSBL partition of the router, but dtc says it’s got a bad magic number and can’t decompile it

According to UBoot the router is based off the MP02.1 demo board from Qualcomm (8040000)

I did not give up hope yet, but without that dts file i’m uncertain we can get it working…

this applies to 99% of the devices supported by OpenWRT, it's the primary "add support" part.

with 256MB RAM, you should.

I use my routers as Dumb APs, i bearly need 40 megs of ram… i have a server runing dhcp/dns hole/….

cool, too bad it's mainly the wifi driver eating the RAM.

your old post contradicts you.

any of those devices actually qualcommax with 256MB RAM ?

don’t know about the 256mb

v1 says used 46mb
v2 says used 36mb

minus buff/cache they're not using that much

we do - Add support for Xiaomi AX1800 Wifi 6 router - #508 by slh.

if you're lucky, the small buffers PR (same thread, two posts later) will get merged, then 256MB devices might become supportable.

oh, just for the info. during tftpboot i see:

RTL8367sc port0 not link!!!

the switch chip is probably a RTL8367SC not ‘S” as I previously posted

confirming the 256mb ram:
DRAM: smem ram ptable found: ver: 1 len: 4
256 MiB

I pulled this out of the firmware, posting it just for the information, lots of others for the other models supported by this firmware.

/dts-v1/;

/ {
	#address-cells = <0x01>;
	#size-cells = <0x01>;
	model = "QCA, IPQ5018-MP02.1";
	compatible = "qca,ipq5018", "qca,ipq5018-mp02.1";
	machid = <0x8040000>;
	config_name = "config@mp02.1";

	chosen {
	};

	aliases {
		console = "/serial@78AF000";
		gmac_gpio = "/gmac_gpio";
		nand = "/nand-controller@79B0000";
		gengeric_gpio = "/gengeric_gpio";
	};

	memory {
		device_type = "memory";
		reg = <0x00 0x00>;
	};

	serial@78AF000 {
		compatible = "qca,ipq-uartdm";
		reg = <0x78af000 0x200>;
		m_value = <0x24>;
		n_value = <0xc31a>;
		d_value = <0xc2f6>;
		bit_rate = <0xff>;
		status = "ok";

		serial_gpio {

			blsp0_mux_uart_rx {
				gpio = <0x14>;
				func = <0x00>;
				pull = <0x01>;
				drvstr = <0x03>;
				od_en = <0x00>;
			};

			blsp0_mux_uart_tx {
				gpio = <0x15>;
				func = <0x00>;
				pull = <0x01>;
				drvstr = <0x03>;
				od_en = <0x00>;
			};

			blsp0_uart_rx {
				gpio = <0x1c>;
				func = <0x03>;
				pull = <0x00>;
				drvstr = <0x03>;
				od_en = <0x00>;
			};

			blsp0_uart_tx {
				gpio = <0x1d>;
				func = <0x03>;
				pull = <0x00>;
				drvstr = <0x03>;
				od_en = <0x00>;
			};
		};
	};

	timer {
		gcnt_cntcv_lo = "", "J ";
		gcnt_cntcv_hi = <0x4a2004>;
		gpt_freq_hz = <0x16e3600>;
		timer_load_val = <0xffffff 0xffffffff>;
	};

	spi {
		compatible = "qcom,spi-qup-v2.7.0";
		wr_pipe_0 = <0x04>;
		rd_pipe_0 = <0x05>;
		status = "ok";

		spi_gpio {

			blsp0_spi_clk {
				gpio = <0x0a>;
				func = <0x01>;
				pull = <0x00>;
				oe = <0x01>;
				drvstr = <0x00>;
			};

			blsp0_spi_mosi {
				gpio = <0x0b>;
				func = <0x01>;
				pull = <0x00>;
				oe = <0x01>;
				drvstr = <0x00>;
			};

			blsp0_spi_miso {
				gpio = <0x0c>;
				func = <0x01>;
				pull = <0x00>;
				drvstr = <0x00>;
			};
		};
	};

	nand-controller@79B0000 {
		#address-cells = <0x01>;
		#size-cells = <0x00>;
		compatible = "qcom,qpic-nand-v2.1.1";
		reg = <0x79b0000 0x10000>;
		status = "okay";

		nand_gpio {

			qspi_dat3 {
				gpio = <0x04>;
				func = <0x02>;
				od_en = <0x00>;
				drvstr = <0x03>;
			};

			qspi_dat2 {
				gpio = <0x05>;
				func = <0x02>;
				od_en = <0x00>;
				drvstr = <0x03>;
			};

			qspi_dat1 {
				gpio = <0x06>;
				func = <0x02>;
				od_en = <0x00>;
				drvstr = <0x03>;
			};

			qspi_dat0 {
				gpio = <0x07>;
				func = <0x02>;
				od_en = <0x00>;
				drvstr = <0x03>;
			};

			qspi_cs_n {
				gpio = <0x08>;
				func = <0x02>;
				od_en = <0x00>;
				drvstr = <0x03>;
			};

			qspi_clk {
				gpio = <0x09>;
				func = <0x02>;
				od_en = <0x00>;
				drvstr = <0x03>;
			};
		};
	};

	i2c@78b7000 {
		compatible = "qcom,qup-i2c";
		#address-cells = <0x01>;
		#size-cells = <0x00>;
		reg = <0x78b7000 0x600>;
		clock-frequency = <0x61a80>;

		i2c_gpio {

			i2c_scl {
				gpio = <0x19>;
				func = <0x03>;
				pull = <0x00>;
				drvstr = <0x03>;
			};

			i2c_sda {
				gpio = <0x1a>;
				func = <0x03>;
				pull = <0x00>;
				drvstr = <0x03>;
			};
		};
	};

	xhci@8a00000 {
		compatible = "qca,dwc3-ipq";
		#address-cells = <0x01>;
		#size-cells = <0x01>;
		reg = <0x8a00000 0xe000>;
	};

	pci@80000000 {
		compatible = "qcom,ipq5018-pcie";
		#address-cells = <0x01>;
		#size-cells = <0x01>;
		reg = <0x80000000 0xf1d 0x78000 0x3000 0x80000f20 0xa8 0x80001000 0x1000 0x80300000 0xd00000 0x80100000 0x100000 0x1875004 0x40 0x7e000 0x800>;
		reg-names = "pci_dbi", "parf", "elbi", "dm_iatu", "axi_bars", "axi_conf", "pci_rst", "pci_phy";
		gen3 = <0x01>;
		lane = <0x01>;
		status = "disabled";
		skip_phy_int = <0x01>;
	};

	pci@a0000000 {
		compatible = "qcom,ipq5018-pcie";
		#address-cells = <0x01>;
		#size-cells = <0x01>;
		reg = <0xa0000000 0xf1d 0x80000 0x3000 0xa0000f20 0xa8 0xa0001000 0x1000 0xa0300000 0xd00000 0xa0100000 0x100000 0x1876004 0x40 0x86000 0x1000>;
		reg-names = "pci_dbi", "parf", "elbi", "dm_iatu", "axi_bars", "axi_conf", "pci_rst", "pci_phy";
		gen3 = <0x01>;
		lane = <0x02>;
		status = "disabled";
		skip_phy_int = <0x01>;
	};

	gmac_cfg {
		ext_mdio_gpio = <0x24 0x25>;
		gephy_led = <0x1e>;

		gmac1_cfg {
			unit = <0x00>;
			base = <0x39c00000>;
			phy_address = <0x07>;
		};

		gmac2_cfg {
			unit = <0x01>;
			base = <0x39d00000>;
			rtl_switch_enable = <0x01>;
			switch_port_count = <0x04>;
			switch_phy_address = <0x00 0x01 0x02 0x03>;
		};
	};

	gengeric_gpio {

		led_gpio {

			wan_orange {
				gpio = <0x0c>;
				func = <0x00>;
				out = <0x00>;
				pull = <0x00>;
				drvstr = <0x00>;
				oe = <0x01>;
				od_en = <0x00>;
				pu_res = <0x02>;
			};

			5g {
				gpio = <0x0b>;
				func = <0x00>;
				out = <0x00>;
				pull = <0x00>;
				drvstr = <0x00>;
				oe = <0x01>;
				od_en = <0x00>;
				pu_res = <0x02>;
			};

			lan {
				gpio = <0x20>;
				func = <0x00>;
				out = <0x00>;
				pull = <0x00>;
				drvstr = <0x00>;
				oe = <0x01>;
				od_en = <0x00>;
				pu_res = <0x02>;
			};

			wps {
				gpio = <0x16>;
				func = <0x00>;
				out = <0x00>;
				pull = <0x00>;
				drvstr = <0x00>;
				oe = <0x01>;
				od_en = <0x00>;
				pu_res = <0x02>;
			};

			wan {
				gpio = <0x0d>;
				func = <0x00>;
				out = <0x00>;
				pull = <0x00>;
				drvstr = <0x00>;
				oe = <0x01>;
				od_en = <0x00>;
				pu_res = <0x02>;
			};

			power {
				gpio = <0x0a>;
				func = <0x00>;
				out = <0x00>;
				pull = <0x00>;
				drvstr = <0x00>;
				oe = <0x01>;
				od_en = <0x00>;
				pu_res = <0x02>;
			};

			2g {
				gpio = <0x21>;
				func = <0x00>;
				out = <0x00>;
				pull = <0x00>;
				drvstr = <0x00>;
				oe = <0x01>;
				od_en = <0x00>;
				pu_res = <0x02>;
			};
		};

		button_gpio {

			reset {
				gpio = <0x0e>;
				func = <0x00>;
			};
		};
	};
};


Missing the partitions, and probably some renaming to match OpenWRT but it’s a ‘base’ incase 256mb devices become usable.

Here’s the partition info while i’m at it:

ubi0: detaching mtd1
ubi0: mtd1 is detached
ubi0: attaching mtd1
ubi0: scanning is finished
ubi0: attached mtd1 (name "mtd=0", size 53 MiB)
ubi0: PEB size: 131072 bytes (128 KiB), LEB size: 126976 bytes
ubi0: min./max. I/O unit sizes: 2048/2048, sub-page size 2048
ubi0: VID header offset: 2048 (aligned 2048), data offset: 4096
ubi0: good PEBs: 428, bad PEBs: 0, corrupted PEBs: 0
ubi0: user volume: 2, internal volumes: 1, max. volumes count: 128
ubi0: max/mean erase counter: 1/0, WL threshold: 4096, image sequence number: 746207177
ubi0: available PEBs: 200, total reserved PEBs: 228, PEBs reserved for bad PEB handling: 20
flash_type:             0xb
flash_index:            0x0
flash_chip_select:      0x0
flash_block_size:       0x20000
flash_density:          0x80000
partition table offset  0x0
No.: Name             Attributes            Start             Size
  0: 0:SBL1           0x0000ffff              0x0          0x80000
  1: 0:MIBIB          0x0000ffff          0x80000          0x80000
  2: 0:BOOTCONFIG     0x0000ffff         0x100000          0x40000
  3: 0:BOOTCONFIG1    0x0000ffff         0x140000          0x40000
  4: 0:QSEE           0x0000ffff         0x180000         0x100000
  5: 0:DEVCFG         0x0000ffff         0x280000          0x40000
  6: 0:CDT            0x0000ffff         0x2c0000          0x40000
  7: 0:APPSBLENV      0x0000ffff         0x300000          0x80000
  8: 0:APPSBL         0x0000ffff         0x380000         0x140000
  9: 0:ART            0x0000ffff         0x4c0000         0x100000
 10: 0:TRAINING       0x0000ffff         0x5c0000          0x80000
 11: rootfs           0x0000ffff         0x640000        0x3580000
        ubi vol 0 kernel
        ubi vol 1 ubi_rootfs
 12: rootfs_1         0x0000ffff        0x3bc0000        0x3580000
 13: tp_data          0x0000ffff        0x7140000         0x840000
 14: radio            0x0000ffff        0x7980000         0x440000
 15: data             0x0000ffff        0x7dc0000          0x80000

Hi everyone,

I recently acquired an Archer AX23 V2.0 and I've been following this thread with great interest.

I noticed the hardware differences compared to the V1 (Qualcomm IPQ5018 vs MediaTek), especially the 256MB of RAM which seems like a significant upgrade.

My goal is to eventually run OpenWrt on this device. I am not in a hurry to flash it immediately, but I would like to know from your experience: should I keep this V2 or try to find a V1? I prefer the better specs of the V2, but only if OpenWrt support is likely to happen in the foreseeable future.

Also, if there is anything I can do to help the development—such as providing logs, testing experimental builds, or confirming hardware details—please let me know. I'm comfortable with the CLI and I'd be happy to contribute to getting this version supported.

Thanks to vram for sharing the DTS and partition info!

ipq50xx && 256 MB RAM is a hard disqualification.

small buffers! :folded_hands:

I don't see that to fly, even less to actually work long term.

Don’t get your hopes up yet but latest version of the patch is in this PR comment.

I also ordered AX23, but got v2 instead of v1.

Anybody have started porting OpenWRT to this device? I can help you with testing and fixing bugs, can compile from sources and do tests.

The only this (bad) is that I do not have 1.8v UART module, so I can’t solder to UART. It wil take ~2-3 weeks to get it from Aliexpress. :frowning: