Linksys 32X - "invalid firmware"

I've downloaded lede-17.01.4-mvebu-linksys-wrt3200acm-squashfs-factory.img and trying to install it on a Linksys 32X, but when clicking "upload" in the "Router Administration" page, the page returns "invalid firmware".

My understanding was the 32X was the same as the 3200. Is that really not so? Thoughts?

They are not the same...

https://wikidevi.com/wiki/Linksys_WRT3200ACM

https://wikidevi.com/wiki/Linksys_WRT32X

There are other threads about the 32X...

https://forum.openwrt.org/search?q=wrt32x

incorrect . hardware is the same, my understanding is the bootloader etc., is different. you cannot put the 3200acm img on the 32xx

I've produced a WRT32X sysupgrade image for Openwrt which the router will accept. However it then fails to boot. Power LED flashes slowly.
Not sure where to from here.

Semantics...especially if someone is a n00b.

Exactly. In regards to the firmware. The OP will need to load firmware compatible with their model. If LEDE does not produce one for that model, you will have to:

  • compile the firmware editing the correct positions in flash
  • or know how to edit the bootloader to match the other model (this may not be possible)
  • perhaps, solder chips that are exactly as in the other model (then, you have another model, or could buy one)

All are advanced tasks. Check to see if there is firmware pre-compiled for your model, first.

Keep in contact with @lantis1008, if he figures it out, you have your firmware.

My patch so far in the hopes that someone smarter than me can make it work properly.
Note that this is based on Openwrt Chaos Calmer

https://pastebin.com/JFGpXEUH

So it should be avoided....

Yes for now. Although fully recoverable by triple reboot recovery method.
I've done not much more than bring the GPL code across and attempt to make it work.

I'm not fantastic with new device support so i'm now out of my depth. The progress so far is posted in the hopes that some other pioneer takes it further.

Lede etc. on WRT32X is possible by manipulating some setenv’s in venom’s u-boot. You need to connect via USB2TTL/Serial and follow the instructions from intelliboy under the wrt3200 <> wrt32x thread (see below). My machine is up and I can deploy a WPA-EAP wifi network, which was the main purpose. For now I am using the lede-developers snapshot 12.12.2017 but I’ll flash mcdebian, as soon as have some more knowledge about their webgui.
I short: intelliboy explains the way back to stock wrt3200, so you take this u-boot commands and then serve lede via tftp. boot - baim!

Yes, but that is just changing it into a 3200 and then flashing a compatible image.
The preferred method would be a clean flashable image. That would make the barrier to entry low.

Yes, please. Lots of us would like low entry barrier.

Based on this new patch, I’m going to rebuild these and see what happens.

No dice. Still just a slow blinking power light. Going to need to serial to debug this further and i don't currently have the time.

Thanks for trying. It always comes down to time.

Hey there, nice to see someone working on it. Does anyone know how to make my manual edited env persistent? I boot into U-Boot, been connected via serial and a putty terminal. I hack in parameters, saveenv, and boot. Working till next shutdown/reboot...

Update: it turned out that my env did get saved, fw_printenv shows correct parameters, except that silent=yes was a bit confusing to me. "setenv silent" at the venom prompt deletes the entry and my charming wrt32x boots the latest wrt3200acm lede image.

Beginning to make ground on this.
Have successfully booted a non-oem firmware on a WRT32X (with serial intervention).

Unfortunately allowing it to boot on its own doesn't work, just hangs.

Possibly of interest

2 Likes

Thanks for the link. The preferred method is to get a web flashable image. Otherwise the device is useless to the beginner user.

1 Like

Moving forward finally.
Have produced a factory image which is flashable from the OEM Web Interface.

This successfully boots, but won't accept connections over LAN. Believe i've made a mistake with the switch by trying to enable DSA.
Will continue pushing onwards.

[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 4.14.27 (michael@michael-Virtual-Machine) (gcc version 7.3.0 (OpenWrt GCC 7.3.0 r6489-d11aa1d4af)) #0 SMP Sun Mar 18 13:06:00 2018
[    0.000000] CPU: ARMv7 Processor [414fc091] revision 1 (ARMv7), cr=10c5387d
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] OF: fdt: Machine model: Linksys WRT32X

Patch to add Venom support to Openwrt

--- a/dev/null
+++ b/target/linux/mvebu/patches-4.14/230-armada-385-add-venom.patch
@@ -0,0 +1,214 @@
+--- a/dev/null
++++ b/arch/arm/boot/dts/armada-385-linksys-venom.dts
+@@ -0,0 +1,204 @@
++/*
++ * Device Tree file for the Linksys WRT32X (Venom)
++ *
++ * Copyright (C) 2017 Imre Kaloz <kaloz@openwrt.org>
++ *
++ *
++ * This file is dual-licensed: you can use it either under the terms
++ * of the GPL or the X11 license, at your option. Note that this dual
++ * licensing only applies to this file, and not this project as a
++ * whole.
++ *
++ *  a) This file is licensed under the terms of the GNU General Public
++ *     License version 2.  This program is licensed "as is" without
++ *     any warranty of any kind, whether express or implied.
++ *
++ * Or, alternatively,
++ *
++ *  b) Permission is hereby granted, free of charge, to any person
++ *     obtaining a copy of this software and associated documentation
++ *     files (the "Software"), to deal in the Software without
++ *     restriction, including without limitation the rights to use,
++ *     copy, modify, merge, publish, distribute, sublicense, and/or
++ *     sell copies of the Software, and to permit persons to whom the
++ *     Software is furnished to do so, subject to the following
++ *     conditions:
++ *
++ *     The above copyright notice and this permission notice shall be
++ *     included in all copies or substantial portions of the Software.
++ *
++ *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
++ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
++ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
++ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
++ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
++ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
++ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++ *     OTHER DEALINGS IN THE SOFTWARE.
++ */
++
++/dts-v1/;
++#include <dt-bindings/gpio/gpio.h>
++#include <dt-bindings/input/input.h>
++#include "armada-385-linksys.dtsi"
++
++/ {
++	model = "Linksys WRT32X";
++	compatible = "linksys,venom", "linksys,armada385", "marvell,armada385",
++		     "marvell,armada380";
++	};
++
++	&expander0 {
++			wan_amber@0 {
++				label = "venom:amber:wan";
++				reg = <0x0>;
++			};
++
++			wan_blue@1 {
++				label = "venom:blue:wan";
++				reg = <0x1>;
++			};
++
++			usb2@5 {
++				label = "venom:blue:usb2";
++				reg = <0x5>;
++			};
++
++			usb3_1@6 {
++				label = "venom:blue:usb3_1";
++				reg = <0x6>;
++			};
++
++			usb3_2@7 {
++				label = "venom:blue:usb3_2";
++				reg = <0x7>;
++			};
++
++			wps_blue@8 {
++				label = "venom:blue:wps";
++				reg = <0x8>;
++			};
++
++			wps_amber@9 {
++				label = "venom:amber:wps";
++				reg = <0x9>;
++			};
++	};
++
++	&gpio_leds {
++			power {
++				gpios = <&gpio1 24 GPIO_ACTIVE_HIGH>;
++				label = "venom:blue:power";
++			};
++
++			sata {
++				gpios = <&gpio1 21 GPIO_ACTIVE_LOW>;
++				label = "venom:blue:sata";
++			};
++
++			wlan_2g {
++				gpios = <&gpio1 13 GPIO_ACTIVE_LOW>;
++				label = "venom:blue:wlan_2g";
++			};
++
++			wlan_5g {
++				gpios = <&gpio1 14 GPIO_ACTIVE_LOW>;
++				label = "venom:blue:wlan_5g";
++			};
++	};
++
++	&gpio_leds_pins {
++			marvell,pins = "mpp21", "mpp45", "mpp46", "mpp56";
++	};
++
++	&nand {
++			/* Spansion S34ML02G2 256MiB, OEM Layout */
++			partition@0 {
++				label = "u-boot";
++				reg = <0x0000000 0x200000>;  /* 2MB */
++				/* read-only; */
++			};
++
++			partition@200000 {
++				label = "u_env";
++				reg = <0x200000 0x20000>;    /* 128KB */
++			};
++
++			partition@220000 {
++				label = "s_env";
++				reg = <0x220000 0x40000>;    /* 256KB */
++			};
++
++			partition@180000 {
++				label = "unused_area";
++				reg = <0x260000 0x5c0000>;   /* 5.75MB */
++			};
++
++			partition@7e0000 {
++				label = "devinfo";
++				reg = <0x7e0000 0x40000>;   /* 256KB */
++				read-only;
++			};
++
++			/* kernel1 overlaps with rootfs1 by design */
++			partition@900000 {
++				label = "kernel1";
++				reg = <0x900000 0x7b00000>;  /* 123MB */
++			};
++
++			partition@c00000 {
++				label = "rootfs1";
++				reg = <0xc00000 0x7800000>;  /* 120MB */
++			};
++
++			/* kernel2 overlaps with rootfs2 by design */
++			partition@8400000 {
++				label = "kernel2";
++				reg = <0x8400000 0x7b00000>; /* 123MB */
++			};
++
++			partition@8700000 {
++				label = "rootfs2";
++				reg = <0x8700000 0x7800000>;  /* 120MB */
++			};
++
++			/* last MB is for the BBT, not writable */
++			partition@ff00000 {
++				label = "BBT";
++				reg = <0xff00000 0x100000>;
++			};
++	};
++
++
++	&pcie1 {
++			mwlwifi {
++				marvell,chainmask = <4 4>;
++			};
++	};
++
++	&pcie2 {
++			mwlwifi {
++				marvell,chainmask = <4 4>;
++			};
++	};
++
++	&sdhci {
++		pinctrl-names = "default";
++		pinctrl-0 = <&sdhci_pins>;
++		no-1-8-v;
++		non-removable;
++		wp-inverted;
++		bus-width = <8>;
++		status = "okay";
++	};
++
++	&usb3_1_vbus {
++		gpio = <&gpio1 12 GPIO_ACTIVE_HIGH>;
++	};
++
++	&usb3_1_vbus_pins {
++		marvell,pins = "mpp44";
++	};
+--- a/arch/arm/boot/dts/Makefile
++++ b/arch/arm/boot/dts/Makefile
+@@ -1027,6 +1027,7 @@ dtb-$(CONFIG_MACH_ARMADA_38X) += \
+ 	armada-385-linksys-cobra.dtb \
+ 	armada-385-linksys-rango.dtb \
+ 	armada-385-linksys-shelby.dtb \
++	armada-385-linksys-venom.dtb \
+ 	armada-385-synology-ds116.dtb \
+ 	armada-385-turris-omnia.dtb \
+ 	armada-388-clearfog.dtb \
--- a/target/linux/mvebu/image/cortex-a9.mk
+++ b/target/linux/mvebu/image/cortex-a9.mk
@@ -51,6 +51,17 @@ define Device/linksys-wrt1900acs
 endef
 TARGET_DEVICES += linksys-wrt1900acs
 
+define Device/linksys-wrt32x
+$(call Device/linksys,WRT32X (Venom))
+  DEVICE_DTS := armada-385-linksys-venom
+  DEVICE_PACKAGES += kmod-btmrvl kmod-mwifiex-sdio mwlwifi-firmware-88w8964
+  $(Device/NAND-128K)
+  $(Device/UBI-factory)
+  KERNEL_SIZE := 3072k
+  KERNEL := kernel-bin | append-dtb
+endef
+TARGET_DEVICES += linksys-wrt32x
+
 define Device/linksys-wrt1900ac
   $(call Device/linksys,WRT1900AC (Mamba))
   DEVICE_DTS := armada-xp-linksys-mamba
--- a/target/linux/mvebu/base-files/etc/diag.sh
+++ b/target/linux/mvebu/base-files/etc/diag.sh
@@ -19,6 +19,9 @@ get_status_led() {
 	armada-385-linksys-shelby)
 		status_led="shelby:white:power"
 		;;
+	armada-385-linksys-venom)
+		status_led="venom:blue:power"
+		;;
 	armada-xp-linksys-mamba)
 		status_led="mamba:white:power"
 		;;
--- a/target/linux/mvebu/base-files/etc/board.d/01_leds
+++ b/target/linux/mvebu/base-files/etc/board.d/01_leds
@@ -35,6 +35,12 @@ armada-385-linksys-shelby)
 	ucidef_set_led_usbport "usb2" "USB 2" "pca963x:shelby:white:usb3_1" "usb2-port1" "usb3-port1"
 	ucidef_set_led_usbport "usb2_ss" "USB 2 SS" "pca963x:shelby:white:usb3_2" "usb3-port1"
 	;;
+armada-385-linksys-venom)
+	ucidef_set_led_netdev "wan" "WAN" "pca963x:venom:blue:wan" "eth1"
+	ucidef_set_led_usbport "usb1" "USB 1" "pca963x:venom:blue:usb2" "usb1-port1"
+	ucidef_set_led_usbport "usb2" "USB 2" "pca963x:venom:blue:usb3_1" "usb2-port1" "usb3-port1"
+	ucidef_set_led_usbport "usb2_ss" "USB 2 SS" "pca963x:venom:blue:usb3_2" "usb3-port1"
+	;;
 armada-xp-linksys-mamba)
 	ucidef_set_led_netdev "wan" "WAN" "mamba:white:wan" "eth1"
 	ucidef_set_led_usbport "usb1" "USB 1" "mamba:white:usb2" "usb1-port1"
--- a/target/linux/mvebu/base-files/etc/board.d/02_network
+++ b/target/linux/mvebu/base-files/etc/board.d/02_network
@@ -18,6 +18,7 @@ armada-385-linksys-caiman|\
 armada-385-linksys-cobra|\
 armada-385-linksys-rango|\
 armada-385-linksys-shelby|\
+armada-385-linksys-venom|\
 armada-xp-linksys-mamba)
 	ucidef_set_interfaces_lan_wan "eth0.1" "eth1.2"
 	ucidef_add_switch "switch0" \
--- a/target/linux/mvebu/base-files/etc/init.d/linksys_recovery
+++ b/target/linux/mvebu/base-files/etc/init.d/linksys_recovery
@@ -7,7 +7,7 @@ boot() {
 . /lib/functions.sh
 
 case $(board_name) in
-	armada-385-linksys-caiman|armada-385-linksys-cobra|armada-385-linksys-rango|armada-385-linksys-shelby|armada-xp-linksys-mamba)
+	armada-385-linksys-caiman|armada-385-linksys-cobra|armada-385-linksys-rango|armada-385-linksys-shelby|armada-385-linksys-venom|armada-xp-linksys-mamba)
 		# make sure auto_recovery in uboot is always on
 		AUTO_RECOVERY_ENA="`fw_printenv -n auto_recovery`"
 		if [ "$AUTO_RECOVERY_ENA" != "yes" ] ; then
--- a/target/linux/mvebu/base-files/etc/uci-defaults/03_wireless
+++ b/target/linux/mvebu/base-files/etc/uci-defaults/03_wireless
@@ -11,7 +11,7 @@
 board=$(board_name)
 
 case "$board" in
-armada-385-linksys-caiman|armada-385-linksys-cobra|armada-385-linksys-shelby|armada-xp-linksys-mamba)
+armada-385-linksys-caiman|armada-385-linksys-cobra|armada-385-linksys-shelby|armada-385-linksys-venom|armada-xp-linksys-mamba)
 	SKU=$(strings /dev/mtd3|sed -ne 's/^cert_region=//p')
 	WIFIMAC2G=$(macaddr_add $(cat /sys/class/net/eth0/address) +1)
 	WIFIMAC5G=$(macaddr_add $WIFIMAC2G +1)
--- a/target/linux/mvebu/base-files/lib/mvebu.sh
+++ b/target/linux/mvebu/base-files/lib/mvebu.sh
@@ -50,6 +50,9 @@ mvebu_board_detect() {
 	*"Linksys WRT3200ACM")
 		name="armada-385-linksys-rango"
 		;;
+	*"Linksys WRT32X")
+		name="armada-385-linksys-venom"
+		;;
 	*"Marvell Armada 385 Access Point Development Board")
 		name="armada-385-db-ap"
 		;;
--- a/target/linux/mvebu/base-files/lib/preinit/06_set_iface_mac
+++ b/target/linux/mvebu/base-files/lib/preinit/06_set_iface_mac
@@ -14,7 +14,7 @@ preinit_set_mac_address() {
 		ip link set dev eth0 address $mac 2>/dev/null
 		ip link set dev eth1 address $mac 2>/dev/null
 		;;
-	armada-385-linksys-caiman|armada-385-linksys-cobra|armada-385-linksys-rango|armada-385-linksys-shelby)
+	armada-385-linksys-caiman|armada-385-linksys-cobra|armada-385-linksys-rango|armada-385-linksys-shelby|armada-385-linksys-venom)
 		# rename interfaces back to the way they were with 4.4
 		case "$(readlink /sys/class/net/eth0)" in
 			*f1070000*)
--- a/target/linux/mvebu/base-files/lib/preinit/81_linksys_syscfg
+++ b/target/linux/mvebu/base-files/lib/preinit/81_linksys_syscfg
@@ -8,7 +8,7 @@ preinit_mount_syscfg() {
 	. /lib/functions.sh
 
 	case $(board_name) in
-	armada-385-linksys-caiman|armada-385-linksys-cobra|armada-385-linksys-rango|armada-385-linksys-shelby|armada-xp-linksys-mamba)
+	armada-385-linksys-caiman|armada-385-linksys-cobra|armada-385-linksys-rango|armada-385-linksys-shelby|armada-385-linksys-venom|armada-xp-linksys-mamba)
 		needs_recovery=0
 		syscfg_part=$(grep syscfg /proc/mtd |cut -c4)
 		ubiattach -m $syscfg_part || needs_recovery=1
--- a/target/linux/mvebu/base-files/lib/upgrade/linksys.sh
+++ btarget/linux/mvebu/base-files/lib/upgrade/linksys.sh
@@ -55,7 +55,7 @@ platform_do_upgrade_linksys() {
 
 		nand_upgrade_tar "$1"
 	}
-	[ "$magic_long" = "27051956" ] && {
+	[ "$magic_long" = "27051956" -o "$magic_long" = "0000a0e1" ] && {
 		# check firmwares' rootfs types
 		local target_mtd=$(find_mtd_part $part_label)
 		local oldroot="$(linksys_get_root_magic $target_mtd)"
--- a/target/linux/mvebu/base-files/lib/upgrade/platform.sh
+++ b/target/linux/mvebu/base-files/lib/upgrade/platform.sh
@@ -13,7 +13,7 @@ platform_check_image() {
 
 platform_do_upgrade() {
 	case "$(board_name)" in
-	armada-385-linksys-caiman|armada-385-linksys-cobra|armada-385-linksys-rango|armada-385-linksys-shelby|armada-xp-linksys-mamba)
+	armada-385-linksys-caiman|armada-385-linksys-cobra|armada-385-linksys-rango|armada-385-linksys-shelby|armada-385-linksys-venom|armada-xp-linksys-mamba)
 		platform_do_upgrade_linksys "$ARGV"
 		;;
 	armada-385-turris-omnia|armada-388-clearfog-base|armada-388-clearfog-pro|globalscale,espressobin)
@@ -26,7 +26,7 @@ platform_do_upgrade() {
 }
 platform_copy_config() {
 	case "$(board_name)" in
-	armada-385-linksys-caiman|armada-385-linksys-cobra|armada-385-linksys-rango|armada-385-linksys-shelby|armada-xp-linksys-mamba)
+	armada-385-linksys-caiman|armada-385-linksys-cobra|armada-385-linksys-rango|armada-385-linksys-shelby|armada-385-linksys-venom|armada-xp-linksys-mamba)
 		platform_copy_config_linksys
 		;;
 	armada-385-turris-omnia|armada-388-clearfog-base|armada-388-clearfog-pro|globalscale,espressobin)

I have tested flashing from OEM to Openwrt, rebooting, triple reboot flipping back to alternate flash, LAN and WIFI (including 160MHz :wink:) .
Forgot to test Failsafe (that is probably a good idea)

I'm sure i've made lots of mistakes in this and there's things that probably don't work.
Someone smarter than me should pick it up and run with it.

Go forth and be merry.
If someone wants to push this to mailing list be my guest.

EDIT: needs ubootenv mods. See mailing list for latest patch. Sysupgrade won’t work without it

1 Like