Ath79: add support for Waveshare WS-431E (QCA9533 + LTE)

Waveshare WS-431E — OpenWrt Support (Discussion & Testing Thread)

Hi everyone,

I have submitted PR #20988 adding full OpenWrt support for the Waveshare WS-431E, an industrial LTE router based on the Qualcomm Atheros QCA9533 / AP143 platform.

Pull Request:

This thread is for discussion, testing, and hardware feedback.

Hardware Overview

Component Details
SoC Qualcomm Atheros QCA9533 @ 650 MHz
RAM 128 MiB
Flash 16 MiB SPI-NOR
WiFi 2.4 GHz 802.11b/g/n (ath9k)
Ethernet 1× WAN (eth1), 2× LAN
LTE Modem Internal Quectel USB modem (QMI), powered via GPIO 11
Buttons Reset (GPIO 17)
LEDs sys-red, sys-blue, 4g-low, 4g-high, wan, wlan, lan1, lan2
Serial 4-pin header on PCB
Modem Power GPIO-hog (output-high)

Hardware Photos

Front

Back

Installation (Serial + TFTP)

Interrupt U-Boot and run:

setenv ipaddr 192.168.1.1
setenv serverip 192.168.1.2
tftpboot 0x81000000 openwrt-ath79-generic-waveshare_ws431e-initramfs-kernel.bin
bootm 0x81000000

Notes

  • On the tested device, U-Boot’s kernel load address is 0x81000000.
    Verify with: printenv loadaddr
  • Vendor web-UI flashing is untested and may include signature checks.

Flash Layout (OKLI)

The vendor firmware splits kernel + rootfs.
OpenWrt uses an OKLI virtual firmware combining:

  • fwconcat0 @ 0x050000–0xE80000
  • fwconcat1 @ 0xE90000–0xFF0000

This enables normal sysupgrade support.

Runtime Testing (on hardware)

  • LTE/QMI modem, USB enumeration, power control
  • Reset button
  • All LEDs (SYS, LTE, WAN, LAN1/2, WLAN)
  • LAN/WAN + switch
  • WiFi (ath9k)
  • Sysupgrade OK
  • OKLI flash layout confirmed
  • DTS boots cleanly, no warnings

Please test and report:

  • boot logs
  • U-Boot environment (printenv)
  • modem detection
  • button/LED behavior
  • networking tests
  • additional samples to confirm load address consistency

dmesg Output

Summary
[    0.000000] Linux version 6.12.58 (andreas@debian) (mips-openwrt-linux-musl-gcc (OpenWrt GCC 14.3.0 r31983-dd8307e61f) 14.3.0, GNU ld (GNU Binutils) 2.44) #0 Sun Nov 23 20:14:29 2025
[    0.000000] printk: legacy bootconsole [early0] enabled
[    0.000000] CPU0 revision is: 00019374 (MIPS 24Kc)
[    0.000000] MIPS: machine is Waveshare WS-431E
[    0.000000] SoC: Qualcomm Atheros QCA9533 ver 2 rev 0
[    0.000000] Initrd not found or empty - disabling initrd
[    0.000000] OF: reserved mem: Reserved memory: No reserved-memory node in the DT
[    0.000000] Primary instruction cache 64kB, VIPT, 4-way, linesize 32 bytes.
[    0.000000] Primary data cache 32kB, 4-way, VIPT, cache aliases, linesize 32 bytes
[    0.000000] Zone ranges:
[    0.000000]   Normal   [mem 0x0000000000000000-0x0000000007ffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000000000000-0x0000000007ffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x0000000007ffffff]
[    0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
[    0.000000] pcpu-alloc: [0] 0
[    0.000000] Kernel command line: console=ttyS0,115200n8 rootfstype=squashfs,jffs2
[    0.000000] Dentry cache hash table entries: 16384 (order: 4, 65536 bytes, linear)
[    0.000000] Inode-cache hash table entries: 8192 (order: 3, 32768 bytes, linear)
[    0.000000] Writing ErrCtl register=00000000
[    0.000000] Readback ErrCtl register=00000000
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 32768
[    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[    0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] RCU Tasks Trace: Setting shift to 0 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=1.
[    0.000000] NR_IRQS: 51
[    0.000000] CPU clock: 650.000 MHz
[    0.000000] clocksource: MIPS: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 5880801374 ns
[    0.000002] sched_clock: 32 bits at 325MHz, resolution 3ns, wraps every 6607641598ns
[    0.008284] Calibrating delay loop... 432.53 BogoMIPS (lpj=2162688)
[    0.074883] pid_max: default: 32768 minimum: 301
[    0.091753] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.099478] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.119033] Memory: 118844K/131072K available (6749K kernel code, 597K rwdata, 1524K rodata, 1232K init, 229K bss, 11680K reserved, 0K cma-reserved)
[    0.137217] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.147672] futex hash table entries: 256 (order: -1, 3072 bytes, linear)
[    0.163301] pinctrl core: initialized pinctrl subsystem
[    0.172892] NET: Registered PF_NETLINK/PF_ROUTE protocol family
[    0.197009] clocksource: Switched to clocksource MIPS
[    0.215701] NET: Registered PF_INET protocol family
[    0.221191] IP idents hash table entries: 2048 (order: 2, 16384 bytes, linear)
[    0.229791] tcp_listen_portaddr_hash hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.238799] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
[    0.248217] TCP established hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.256323] TCP bind hash table entries: 1024 (order: 1, 8192 bytes, linear)
[    0.263818] TCP: Hash tables configured (established 1024 bind 1024)
[    0.271346] MPTCP token hash table entries: 512 (order: 0, 6144 bytes, linear)
[    0.279345] UDP hash table entries: 256 (order: 0, 4096 bytes, linear)
[    0.286262] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes, linear)
[    0.294592] NET: Registered PF_UNIX/PF_LOCAL protocol family
[    0.300689] PCI: CLS 0 bytes, default 32
[    0.309391] workingset: timestamp_bits=14 max_order=15 bucket_order=1
[    0.318037] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[    0.324206] jffs2: version 2.2 (NAND) (SUMMARY) (LZMA) (RTIME) (CMODE_PRIORITY) (c) 2001-2006 Red Hat, Inc.
[    0.342783] pinctrl-single 1804002c.pinmux: 576 pins, size 72
[    0.360036] Serial: 8250/16550 driver, 1 ports, IRQ sharing disabled
[    0.368012] printk: legacy console [ttyS0] disabled
[    0.373861] 18020000.uart: ttyS0 at MMIO 0x18020000 (irq = 10, base_baud = 1562500) is a 16550A
[    0.383165] printk: legacy console [ttyS0] enabled
[    0.393569] printk: legacy bootconsole [early0] disabled
[    0.417256] 6 fixed-partitions partitions found on MTD device spi0.0
[    0.423864] Creating 6 MTD partitions on "spi0.0":
[    0.428856] 0x000000000000-0x000000040000 : "u-boot"
[    0.436485] 0x000000040000-0x000000050000 : "u-boot-env"
[    0.443698] 0x000000050000-0x000000e80000 : "fwconcat0"
[    0.450811] 0x000000e80000-0x000000e90000 : "loader"
[    0.457657] 0x000000e90000-0x000000ff0000 : "fwconcat1"
[    0.464621] 0x000000ff0000-0x000001000000 : "art"
[    0.471409] OF: Bad cell count for /ahb/spi@1f000000/flash@0/partitions
[    0.808121] ag71xx-legacy 19000000.eth: Could not connect to PHY device. Deferring probe.
[    1.476808] switch0: Atheros AR8229 rev. 1 switch registered on mdio.0
[    1.520983] ag71xx-legacy 1a000000.eth: connected to PHY at fixed-0:00 [uid=00000000, driver=Generic PHY]
[    1.531773] eth0: Atheros AG71xx at 0xba000000, irq 5, mode: gmii
[    1.538637] i2c_dev: i2c /dev entries driver
[    1.545317] NET: Registered PF_INET6 protocol family
[    1.557143] Segment Routing with IPv6
[    1.561071] In-situ OAM (IOAM) with IPv6
[    1.565262] NET: Registered PF_PACKET protocol family
[    1.570589] 8021q: 802.1Q VLAN Support v1.8
[    1.596091] Concatenating MTD devices:
[    1.600049] (0): "fwconcat0"
[    1.603025] (1): "fwconcat1"
[    1.606000] into device "virtual_flash"
[    1.610008] 1 fixed-partitions partitions found on MTD device virtual_flash
[    1.617540] Creating 1 MTD partitions on "virtual_flash":
[    1.623200] 0x000000000000-0x000000f90000 : "firmware"
[    1.637394] 2 uimage-fw partitions found on MTD device firmware
[    1.643549] Creating 2 MTD partitions on "firmware":
[    1.648732] 0x000000000000-0x0000002a449b : "kernel"
[    1.653865] mtd: partition "kernel" doesn't end on an erase/write block -- force read-only
[    1.663988] 0x0000002a449b-0x000000f90000 : "rootfs"
[    1.669217] mtd: partition "rootfs" doesn't start on an erase/write block boundary -- force read-only
[    1.680140] mtd: setting mtd8 (rootfs) as root device
[    1.685470] 1 squashfs-split partitions found on MTD device rootfs
[    1.691924] 0x000000770000-0x000000f90000 : "rootfs_data"
[    2.088315] ag71xx-legacy 19000000.eth: connected to PHY at mdio.0:1f:04 [uid=004dd042, driver=Qualcomm Atheros QCA9561 built-in PHY]
[    2.101890] eth1: Atheros AG71xx at 0xb9000000, irq 4, mode: mii
[    2.110020] clk: Disabling unused clocks
[    2.124216] VFS: Mounted root (squashfs filesystem) readonly on device 31:8.
[    2.138088] Freeing unused kernel image (initmem) memory: 1232K
[    2.144219] This architecture does not have kernel memory protection.
[    2.150912] Run /sbin/init as init process
[    2.155140]   with arguments:
[    2.155147]     /sbin/init
[    2.155155]   with environment:
[    2.155162]     HOME=/
[    2.155170]     TERM=linux
[    2.910553] init: Console is alive
[    2.914540] init: - watchdog -
[    4.479785] kmodloader: loading kernel modules from /etc/modules-boot.d/*
[    4.583804] usbcore: registered new interface driver usbfs
[    4.589726] usbcore: registered new interface driver hub
[    4.595324] usbcore: registered new device driver usb
[    4.609943] gpio_button_hotplug: loading out-of-tree module taints kernel.
[    4.629498] ehci-platform 1b000000.usb: EHCI Host Controller
[    4.635403] ehci-platform 1b000000.usb: new USB bus registered, assigned bus number 1
[    4.643771] ehci-platform 1b000000.usb: irq 3, io mem 0x1b000000
[    4.667030] ehci-platform 1b000000.usb: USB 2.0 started, EHCI 1.00
[    4.674889] hub 1-0:1.0: USB hub found
[    4.679299] hub 1-0:1.0: 1 port detected
[    4.695150] kmodloader: done loading kernel modules from /etc/modules-boot.d/*
[    4.713346] init: - preinit -
[    5.058627] usb 1-1: new high-speed USB device number 2 using ehci-platform
[    7.487052] random: crng init done
[    9.045773] eth0: link up (1000Mbps/Full duplex)
[   13.400955] jffs2: notice: (551) jffs2_build_xattr_subsystem: complete building xattr subsystem, 10 of xdatum (0 unchecked, 2 orphan) and 11 of xref (2 dead, 0 orphan) found.
[   13.421554] mount_root: switching to jffs2 overlay
[   13.430721] overlayfs: upper fs does not support tmpfile.
[   13.445973] urandom-seed: Seeding with /etc/urandom.seed
[   13.599914] eth0: link down
[   13.620474] procd: - early -
[   13.623834] procd: - watchdog -
[   14.395196] procd: - watchdog -
[   14.400038] procd: - ubus -
[   14.566842] procd: - init -
[   16.264845] kmodloader: loading kernel modules from /etc/modules.d/*
[   17.940689] usbcore: registered new interface driver cdc_wdm
[   17.960132] Loading modules backported from Linux version v6.16-0-g038d61fd6422
[   17.967775] Backport generated by backports.git v6.1.145-1-47-g6194bf852a3e
[   18.044968] usbcore: registered new interface driver usbserial_generic
[   18.051920] usbserial: USB Serial support registered for generic
[   18.757893] PPP generic driver version 2.4.2
[   18.766229] NET: Registered PF_PPPOX protocol family
[   18.807269] qmi_wwan 1-1:1.4: cdc-wdm0: USB WDM device
[   18.828064] qmi_wwan 1-1:1.4 wwan0: register 'qmi_wwan' at usb-1b000000.usb-1, WWAN/QMI device, ea:d4:ec:8b:20:da
[   18.838988] usbcore: registered new interface driver qmi_wwan
[   19.133666] usbcore: registered new interface driver option
[   19.139608] usbserial: USB Serial support registered for GSM modem (1-port)
[   19.147252] option 1-1:1.0: GSM modem (1-port) converter detected
[   19.153866] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0
[   19.161300] option 1-1:1.1: GSM modem (1-port) converter detected
[   19.167982] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB1
[   19.175342] option 1-1:1.2: GSM modem (1-port) converter detected
[   19.182002] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB2
[   19.189422] option 1-1:1.3: GSM modem (1-port) converter detected
[   19.196032] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB3
[   19.505178] ath: EEPROM regdomain: 0x0
[   19.505213] ath: EEPROM indicates default country code should be used
[   19.505221] ath: doing EEPROM country->regdmn map search
[   19.505240] ath: country maps to regdmn code: 0x3a
[   19.505251] ath: Country alpha2 being used: US
[   19.505260] ath: Regpair used: 0x3a
[   19.517150] ieee80211 phy0: Selected rate control algorithm 'minstrel_ht'
[   19.518267] ieee80211 phy0: Atheros AR9531 Rev:2 mem=0xec6ee1e1, irq=11
[   19.617545] kmodloader: done loading kernel modules from /etc/modules.d/*
[   19.750950] urngd: v1.0.2 started.
[   43.113843] eth0: link up (1000Mbps/Full duplex)
[   43.127539] br-lan: port 1(eth0) entered blocking state
[   43.132980] br-lan: port 1(eth0) entered disabled state
[   43.138502] ag71xx-legacy 1a000000.eth eth0: entered allmulticast mode
[   43.145551] ag71xx-legacy 1a000000.eth eth0: entered promiscuous mode
[   43.253583] br-lan: port 1(eth0) entered blocking state
[   43.259086] br-lan: port 1(eth0) entered forwarding state
[   47.668941] br-lan: port 2(phy0-ap0) entered blocking state
[   47.674873] br-lan: port 2(phy0-ap0) entered disabled state
[   47.680761] ath9k 18100000.wmac phy0-ap0: entered allmulticast mode
[   47.687727] ath9k 18100000.wmac phy0-ap0: entered promiscuous mode
[   48.173772] br-lan: port 2(phy0-ap0) entered blocking state
[   48.179630] br-lan: port 2(phy0-ap0) entered forwarding state

Thanks

Thanks for your help testing and reviewing this device!

It would be great if you could specify the exact model.

My bad the exact model is the Quectel EC25-EUX LTE modem (USB VID:PID 2c7c:0125).

1 Like