diff mbox series

[v2] ramips: mt76x8: add support for TP-Link RE365 v1

Message ID 20231222104421.1823-1-tmn505@terefe.re
State Changes Requested
Delegated to: Sander Vanheule
Headers show
Series [v2] ramips: mt76x8: add support for TP-Link RE365 v1 | expand

Commit Message

Tomasz Maciej Nowak Dec. 22, 2023, 10:36 a.m. UTC
From: Tomasz Maciej Nowak <tmn505@gmail.com>

TP-Link RE365 is a wireless range extender, hardware-wise resembles
RE305 with slight changes regarding buttons and LEDs.

Specification
SoC: MediaTek MT7628AN
RAM: 64 MiB DDR2
Flash: 8 MiB SPI NOR
WiFi: 2.4 GHz 2T2R integrated
      5 GHz 2T2R MediaTek MT7612EN conncted to PCIe lanes
Ethernet: 1x 10/100 Mbps integrated
LEDs: 6x GPIO controlled
Buttons: 4x GPIO controlled
UART: row of 4 holes marked on PCB as J1, starting count from white
      triangle
      1. VCC (3.3V), 2. GND, 3. RX, 4. TX
      baud: 57600, parity: none, flow control: none

Installation
1. Open web management interface.
2. Go to Settings > System Tools > Firmware upgrade.
3. Select "Browse" and select the OpenWrt image with factory.bin suffix.
4. After selecting "Upgrade" firmware writing process will start.
5. Wait till device reboots, power LED should stay solid when it's fully
   booted, then it's ready for configuration through LAN port.

Additional information
With how device manufacturer patrtitioned the flash memory, it's possible
that with default packages set, initial factory.bin image won't be
created. In such case, try to reduce packages amount or use older release
for initial conversion to OpenWrt. Later You can use sysupgrade.bin
image with full set of packages, because OpenWrt uses unpartitioned flash
memory space unused by vendor firmware.

Reverting to vendor firmware involves converting firmware using
tplink-safeloader with -z option (can be found in ImageBuilder or SDK)
and forcibly applying converted firmware as sysupgrade.

Known issues
WARNING: after removing casing of the device one is exposed to high
voltage and is in a risk of being electrocuted.

Caution when interfacing whith bootloader, saving its environment either
by issuing "saveenv" or selecting option "1: Load system code to SDRAM
via TFTP." in boot menu, one of those will lead to overwriting part of
kernel. This will lead to need of firmware recovery. The cause of this
issue is bootloader having environment offset on flash at 0x40000 while
kernel starts from 0x20000.

Signed-off-by: Tomasz Maciej Nowak <tmn505@gmail.com>
---
v1 -> v2
correct commit message, obviously "2: Load system code then write to
Flash via TFTP." will overwrite kernel, so replace it with intended
content "1: Load system code to SDRAM via TFTP."

 .../ramips/dts/mt7628an_tplink_re365-v1.dts   | 213 ++++++++++++++++++
 target/linux/ramips/image/mt76x8.mk           |  11 +
 .../mt76x8/base-files/etc/board.d/01_leds     |   3 +
 .../mt76x8/base-files/etc/board.d/02_network  |   1 +
 4 files changed, 228 insertions(+)
 create mode 100644 target/linux/ramips/dts/mt7628an_tplink_re365-v1.dts

Comments

Sander Vanheule Jan. 7, 2024, 1:06 p.m. UTC | #1
Hi Tomasz,

On Fri, 2023-12-22 at 11:36 +0100, Tomasz Maciej Nowak wrote:
> From: Tomasz Maciej Nowak <tmn505@gmail.com>
> 
> TP-Link RE365 is a wireless range extender, hardware-wise resembles
> RE305 with slight changes regarding buttons and LEDs.
> 
> Specification
> SoC: MediaTek MT7628AN
> RAM: 64 MiB DDR2
> Flash: 8 MiB SPI NOR

Ouch.

> WiFi: 2.4 GHz 2T2R integrated
>       5 GHz 2T2R MediaTek MT7612EN conncted to PCIe lanes
> Ethernet: 1x 10/100 Mbps integrated
> LEDs: 6x GPIO controlled
> Buttons: 4x GPIO controlled
> UART: row of 4 holes marked on PCB as J1, starting count from white
>       triangle
>       1. VCC (3.3V), 2. GND, 3. RX, 4. TX
>       baud: 57600, parity: none, flow control: none
> 
> Installation
> 1. Open web management interface.
> 2. Go to Settings > System Tools > Firmware upgrade.
> 3. Select "Browse" and select the OpenWrt image with factory.bin suffix.
> 4. After selecting "Upgrade" firmware writing process will start.
> 5. Wait till device reboots, power LED should stay solid when it's fully
>    booted, then it's ready for configuration through LAN port.

[...]

> +
> +	virtual_flash {
> +		compatible = "mtd-concat";
> +		devices = <&fwconcat0 &fwconcat1>;

Both have the same representation in the resulting DTB, but this is a list, so:
	devices = <&fwconcat0>, <&fwconcat1>;

[...]

> +&spi0 {
> +	status = "okay";
> +
> +	flash@0 {
> +		compatible = "jedec,spi-nor";
> +		reg = <0>;
> +		spi-max-frequency = <10000000>;
> +
> +		partitions {
> +			compatible = "fixed-partitions";
> +			#address-cells = <1>;
> +			#size-cells = <1>;
> +
> +			partition@0 {
> +				label = "u-boot";
> +				reg = <0x0 0x20000>;
> +				read-only;
> +			};
> +
> +			fwconcat0: partition@20000 {
> +				label = "fwconcat0";
> +				reg = <0x20000 0x5e0000>;
> +			};

Since this is where the bootloader is going to look for a kernel, I'm pretty sure the
kernel will need to be contained entirely in this partition (or you need a kernel loader).
That would mean it must fit inside 6016 kiB.

[...]

> +define Device/tplink_re365-v1
> +  $(Device/tplink-safeloader)
> +  DEVICE_MODEL := RE365
> +  DEVICE_VARIANT := v1
> +  DEVICE_PACKAGES := kmod-mt76x2
> +  IMAGE/sysupgrade.bin := append-kernel | append-rootfs | pad-rootfs | check-size |
> append-metadata
> +  IMAGE_SIZE := 7680k

So you will probably need two check-size calls here:

	IMAGE/sysupgrade.bin := append-kernel | check-size 6016k | \
		append-rootfs | pad-rootfs | check-size | append-metadata


Side note: You're definitely not the only one with flash constraints on mt76x8, so I
wonder if a small-flash configuration/package selection would make sense.



Best,
Sander
Tomasz Maciej Nowak Jan. 7, 2024, 3:49 p.m. UTC | #2
W dniu 7.01.2024 o 14:06, Sander Vanheule pisze:
> Hi Tomasz,
> 
> On Fri, 2023-12-22 at 11:36 +0100, Tomasz Maciej Nowak wrote:
>> From: Tomasz Maciej Nowak <tmn505@gmail.com>
>>
>> TP-Link RE365 is a wireless range extender, hardware-wise resembles
>> RE305 with slight changes regarding buttons and LEDs.
>>
>> Specification
>> SoC: MediaTek MT7628AN
>> RAM: 64 MiB DDR2
>> Flash: 8 MiB SPI NOR
> 
> Ouch.

Indeed

> 
>> WiFi: 2.4 GHz 2T2R integrated
>>       5 GHz 2T2R MediaTek MT7612EN conncted to PCIe lanes
>> Ethernet: 1x 10/100 Mbps integrated
>> LEDs: 6x GPIO controlled
>> Buttons: 4x GPIO controlled
>> UART: row of 4 holes marked on PCB as J1, starting count from white
>>       triangle
>>       1. VCC (3.3V), 2. GND, 3. RX, 4. TX
>>       baud: 57600, parity: none, flow control: none
>>
>> Installation
>> 1. Open web management interface.
>> 2. Go to Settings > System Tools > Firmware upgrade.
>> 3. Select "Browse" and select the OpenWrt image with factory.bin suffix.
>> 4. After selecting "Upgrade" firmware writing process will start.
>> 5. Wait till device reboots, power LED should stay solid when it's fully
>>    booted, then it's ready for configuration through LAN port.
> 
> [...]
> 
>> +
>> +	virtual_flash {
>> +		compatible = "mtd-concat";
>> +		devices = <&fwconcat0 &fwconcat1>;
> 
> Both have the same representation in the resulting DTB, but this is a list, so:
> 	devices = <&fwconcat0>, <&fwconcat1>;

ACK.

> 
> [...]
> 
>> +&spi0 {
>> +	status = "okay";
>> +
>> +	flash@0 {
>> +		compatible = "jedec,spi-nor";
>> +		reg = <0>;
>> +		spi-max-frequency = <10000000>;
>> +
>> +		partitions {
>> +			compatible = "fixed-partitions";
>> +			#address-cells = <1>;
>> +			#size-cells = <1>;
>> +
>> +			partition@0 {
>> +				label = "u-boot";
>> +				reg = <0x0 0x20000>;
>> +				read-only;
>> +			};
>> +
>> +			fwconcat0: partition@20000 {
>> +				label = "fwconcat0";
>> +				reg = <0x20000 0x5e0000>;
>> +			};
> 
> Since this is where the bootloader is going to look for a kernel, I'm pretty sure the
> kernel will need to be contained entirely in this partition (or you need a kernel loader).
> That would mean it must fit inside 6016 kiB.

Yes, I forgot to limit the kernel size. TBF I don't think our kernel loader has 
support for split kerne chunks.

> 
> [...]
> 
>> +define Device/tplink_re365-v1
>> +  $(Device/tplink-safeloader)
>> +  DEVICE_MODEL := RE365
>> +  DEVICE_VARIANT := v1
>> +  DEVICE_PACKAGES := kmod-mt76x2
>> +  IMAGE/sysupgrade.bin := append-kernel | append-rootfs | pad-rootfs | check-size |
>> append-metadata
>> +  IMAGE_SIZE := 7680k
> 
> So you will probably need two check-size calls here:
> 
> 	IMAGE/sysupgrade.bin := append-kernel | check-size 6016k | \
> 		append-rootfs | pad-rootfs | check-size | append-metadata

I'll add KERNEL_SIZE, should be sufficient. Will need to check if it'll work
as I think it does, or I did miss something.

> Side note: You're definitely not the only one with flash constraints on mt76x8, so I
> wonder if a small-flash configuration/package selection would make sense.

Yes, that is really needed. There is already a report for RE305[1] which has same
vendor partition layout, where overlay is too small. If I add LuCI to current
master, factory image isn't created for RE365 (I'll need to backport this patch
to 23.05, so there will be a permanent factory image for initial installation).

1. https://github.com/openwrt/openwrt/issues/14215

> 
> Best,
> Sander

Thank for the review. I'll send v3 after testing and will check how much we gain
when small flash is set.
diff mbox series

Patch

diff --git a/target/linux/ramips/dts/mt7628an_tplink_re365-v1.dts b/target/linux/ramips/dts/mt7628an_tplink_re365-v1.dts
new file mode 100644
index 000000000000..50999ab6b229
--- /dev/null
+++ b/target/linux/ramips/dts/mt7628an_tplink_re365-v1.dts
@@ -0,0 +1,213 @@ 
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+#include "mt7628an.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/leds/common.h>
+
+/ {
+	model = "TP-Link RE365 v1";
+	compatible = "tplink,re365-v1", "mediatek,mt7628an-soc";
+
+	aliases {
+		led-boot = &led_power;
+		led-failsafe = &led_power;
+		led-running = &led_power;
+		led-upgrade = &led_power;
+		label-mac-device = &ethernet;
+	};
+
+	keys {
+		compatible = "gpio-keys";
+
+		button-led {
+			label = "led";
+			gpios = <&gpio 44 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_LIGHTS_TOGGLE>;
+		};
+
+		button-power {
+			label = "power";
+			gpios = <&gpio 11 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_POWER>;
+		};
+
+		button-reset {
+			label = "reset";
+			gpios = <&gpio 37 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_RESTART>;
+		};
+
+		button-wps {
+			label = "wps";
+			gpios = <&gpio 38 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_WPS_BUTTON>;
+		};
+	};
+
+	leds {
+		compatible = "gpio-leds";
+
+		led-lan {
+			color = <LED_COLOR_ID_BLUE>;
+			function = LED_FUNCTION_LAN;
+			gpios = <&gpio 4 GPIO_ACTIVE_LOW>;
+		};
+
+		led_power: led-power {
+			color = <LED_COLOR_ID_BLUE>;
+			function = LED_FUNCTION_POWER;
+			gpios = <&gpio 39 GPIO_ACTIVE_LOW>;
+			panic-indicator;
+		};
+
+		led-rssi-bad {
+			color = <LED_COLOR_ID_RED>;
+			function = LED_FUNCTION_INDICATOR;
+			gpios = <&gpio 43 GPIO_ACTIVE_HIGH>;
+		};
+
+		led-rssi-good {
+			color = <LED_COLOR_ID_BLUE>;
+			function = LED_FUNCTION_INDICATOR;
+			gpios = <&gpio 42 GPIO_ACTIVE_HIGH>;
+		};
+
+		led-wlan2g {
+			color = <LED_COLOR_ID_BLUE>;
+			function = LED_FUNCTION_WLAN;
+			function-enumerator = <2>;
+			gpios = <&gpio 41 GPIO_ACTIVE_LOW>;
+			linux,default-trigger = "phy0tpt";
+		};
+
+		led-wlan5g {
+			color = <LED_COLOR_ID_BLUE>;
+			function = LED_FUNCTION_WLAN;
+			function-enumerator = <5>;
+			gpios = <&gpio 40 GPIO_ACTIVE_LOW>;
+			linux,default-trigger = "phy1tpt";
+		};
+	};
+
+	virtual_flash {
+		compatible = "mtd-concat";
+		devices = <&fwconcat0 &fwconcat1>;
+
+		partitions {
+			compatible = "fixed-partitions";
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			partition@0 {
+				compatible = "tplink,firmware";
+				label = "firmware";
+				reg = <0x0 0x0>;
+			};
+		};
+	};
+};
+
+&ethernet {
+	nvmem-cells = <&macaddr_config_10008 0>;
+	nvmem-cell-names = "mac-address";
+};
+
+&pcie {
+	status = "okay";
+};
+
+&pcie0 {
+	mt76@0,0 {
+		compatible = "mediatek,mt76";
+		reg = <0x0000 0 0 0 0>;
+		ieee80211-freq-limit = <5000000 6000000>;
+		nvmem-cells = <&eeprom_radio_8000>, <&macaddr_config_10008 2>;
+		nvmem-cell-names = "eeprom", "mac-address";
+	};
+};
+
+&spi0 {
+	status = "okay";
+
+	flash@0 {
+		compatible = "jedec,spi-nor";
+		reg = <0>;
+		spi-max-frequency = <10000000>;
+
+		partitions {
+			compatible = "fixed-partitions";
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			partition@0 {
+				label = "u-boot";
+				reg = <0x0 0x20000>;
+				read-only;
+			};
+
+			fwconcat0: partition@20000 {
+				label = "fwconcat0";
+				reg = <0x20000 0x5e0000>;
+			};
+
+			partition@600000 {
+				label = "config";
+				reg = <0x600000 0x50000>;
+				read-only;
+
+				nvmem-layout {
+					compatible = "fixed-layout";
+					#address-cells = <1>;
+					#size-cells = <1>;
+
+					macaddr_config_10008: macaddr@10008 {
+						compatible = "mac-base";
+						reg = <0x10008 0x6>;
+						#nvmem-cell-cells = <1>;
+					};
+				};
+			};
+
+			fwconcat1: partition@650000 {
+				label = "fwconcat1";
+				reg = <0x650000 0x1a0000>;
+			};
+
+			partition@7f0000 {
+				label = "radio";
+				reg = <0x7f0000 0x10000>;
+				read-only;
+
+				nvmem-layout {
+					compatible = "fixed-layout";
+					#address-cells = <1>;
+					#size-cells = <1>;
+
+					eeprom_radio_0: eeprom@0 {
+						reg = <0x0 0x400>;
+					};
+
+					eeprom_radio_8000: eeprom@8000 {
+						reg = <0x8000 0x200>;
+					};
+				};
+			};
+		};
+	};
+};
+
+&state_default {
+	gpio {
+		groups = "refclk", "wdt", "p0led_an", "p1led_an", "p2led_an", "p3led_an", "p4led_an";
+		function = "gpio";
+	};
+};
+
+&wmac {
+	status = "okay";
+
+	nvmem-cells = <&eeprom_radio_0>, <&macaddr_config_10008 1>;
+	nvmem-cell-names = "eeprom", "mac-address";
+};
diff --git a/target/linux/ramips/image/mt76x8.mk b/target/linux/ramips/image/mt76x8.mk
index 8a6bccfba63b..db03e7720c64 100644
--- a/target/linux/ramips/image/mt76x8.mk
+++ b/target/linux/ramips/image/mt76x8.mk
@@ -666,6 +666,17 @@  define Device/tplink_re305-v3
 endef
 TARGET_DEVICES += tplink_re305-v3
 
+define Device/tplink_re365-v1
+  $(Device/tplink-safeloader)
+  DEVICE_MODEL := RE365
+  DEVICE_VARIANT := v1
+  DEVICE_PACKAGES := kmod-mt76x2
+  IMAGE/sysupgrade.bin := append-kernel | append-rootfs | pad-rootfs | check-size | append-metadata
+  IMAGE_SIZE := 7680k
+  TPLINK_BOARD_ID := RE365
+endef
+TARGET_DEVICES += tplink_re365-v1
+
 define Device/tplink_tl-mr3020-v3
   $(Device/tplink-v2)
   IMAGE_SIZE := 7808k
diff --git a/target/linux/ramips/mt76x8/base-files/etc/board.d/01_leds b/target/linux/ramips/mt76x8/base-files/etc/board.d/01_leds
index c4301737b28b..5a0e0ab2148e 100644
--- a/target/linux/ramips/mt76x8/base-files/etc/board.d/01_leds
+++ b/target/linux/ramips/mt76x8/base-files/etc/board.d/01_leds
@@ -91,6 +91,9 @@  tplink,tl-mr3020-v3|\
 tplink,tl-wa801nd-v5)
 	ucidef_set_led_netdev "lan" "lan" "green:lan" "eth0"
 	;;
+tplink,re365-v1)
+	ucidef_set_led_netdev "lan" "lan" "blue:lan" "eth0"
+	;;
 tplink,tl-mr3420-v5|\
 tplink,tl-wr840n-v4|\
 tplink,tl-wr842n-v5)
diff --git a/target/linux/ramips/mt76x8/base-files/etc/board.d/02_network b/target/linux/ramips/mt76x8/base-files/etc/board.d/02_network
index fe3ac9193ff9..63abb14d1391 100644
--- a/target/linux/ramips/mt76x8/base-files/etc/board.d/02_network
+++ b/target/linux/ramips/mt76x8/base-files/etc/board.d/02_network
@@ -27,6 +27,7 @@  ramips_setup_interfaces()
 	tplink,re220-v2|\
 	tplink,re305-v1|\
 	tplink,re305-v3|\
+	tplink,re365-v1|\
 	tplink,tl-wr802n-v4|\
 	tplink,tl-wa801nd-v5|\
 	tplink,tl-wr902ac-v4|\