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!

