diff mbox series

[2/2] ramips: mt7621: Add support for ZyXEL LTE3301-Plus

Message ID 20210515001130.20654-3-avalentin@marcant.net
State Changes Requested
Headers show
Series Add support for ZyXEL LTE3301-Plus | expand

Commit Message

André Valentin May 15, 2021, 12:11 a.m. UTC
The ZyXEL LTE3301-Plus is an 4G indoor CPE with 2 external LTE antennas.

Specifications:

 - SoC: MediaTek MT7621AT
 - RAM: 256 MB
 - Flash: 128 MB MB NAND (MX30LF1G18AC)
 - WiFi: MediaTek MT7615E
 - Switch: 4 LAN ports (Gigabit)
 - LTE: Quectel EG506 connected by USB3 to SoC
 - SIM: 1 micro-SIM slot
 - USB: USB3 port
 - Buttons: Reset, WPS
 - LEDs: Multicolour power, internet, LTE, signal, Wifi, USB
 - Power: 12V, 1.5A

The device is built as an indoor ethernet to LTE bridge or router with Wifi.

UART Serial:

57600N1
Located on populated 5 pin header J5:

 [o] GND
 [ ] key - no pin
 [o] 3.3V Vcc
 [o] RX
 [o] TX

For more details about flashing see commit 2449a632084b29632605e5a79ce5d73028eb15dd .

Signed-off-by: André Valentin <avalentin@marcant.net>
---
 .../ramips/dts/mt7621_zyxel_lte3301-plus.dts  | 213 ++++++++++++++++++
 target/linux/ramips/image/mt7621.mk           |  16 ++
 .../mt7621/base-files/etc/board.d/01_leds     |   4 +
 .../mt7621/base-files/etc/board.d/02_network  |   3 +
 .../base-files/etc/board.d/03_gpio_switches   |   3 +
 .../mt7621/base-files/etc/init.d/bootcount    |   1 +
 .../mt7621/base-files/lib/upgrade/platform.sh |   1 +
 7 files changed, 241 insertions(+)
 create mode 100644 target/linux/ramips/dts/mt7621_zyxel_lte3301-plus.dts

Comments

Adrian Schmutzler May 15, 2021, 2:05 p.m. UTC | #1
Hi,

comments below.

> -----Original Message-----
> From: openwrt-devel [mailto:openwrt-devel-bounces@lists.openwrt.org]
> On Behalf Of André Valentin
> Sent: Samstag, 15. Mai 2021 02:12
> To: openwrt-devel@lists.openwrt.org
> Cc: avalentin@marcant.net
> Subject: [PATCH 2/2] ramips: mt7621: Add support for ZyXEL LTE3301-Plus
> 
> The ZyXEL LTE3301-Plus is an 4G indoor CPE with 2 external LTE antennas.
> 
> Specifications:
> 
>  - SoC: MediaTek MT7621AT
>  - RAM: 256 MB
>  - Flash: 128 MB MB NAND (MX30LF1G18AC)
>  - WiFi: MediaTek MT7615E
>  - Switch: 4 LAN ports (Gigabit)
>  - LTE: Quectel EG506 connected by USB3 to SoC
>  - SIM: 1 micro-SIM slot
>  - USB: USB3 port
>  - Buttons: Reset, WPS
>  - LEDs: Multicolour power, internet, LTE, signal, Wifi, USB
>  - Power: 12V, 1.5A
> 
> The device is built as an indoor ethernet to LTE bridge or router with Wifi.
> 
> UART Serial:
> 
> 57600N1
> Located on populated 5 pin header J5:
> 
>  [o] GND
>  [ ] key - no pin
>  [o] 3.3V Vcc
>  [o] RX
>  [o] TX
> 
> For more details about flashing see commit
> 2449a632084b29632605e5a79ce5d73028eb15dd .
> 
> Signed-off-by: André Valentin <avalentin@marcant.net>
> ---
>  .../ramips/dts/mt7621_zyxel_lte3301-plus.dts  | 213 ++++++++++++++++++
>  target/linux/ramips/image/mt7621.mk           |  16 ++
>  .../mt7621/base-files/etc/board.d/01_leds     |   4 +
>  .../mt7621/base-files/etc/board.d/02_network  |   3 +
>  .../base-files/etc/board.d/03_gpio_switches   |   3 +
>  .../mt7621/base-files/etc/init.d/bootcount    |   1 +
>  .../mt7621/base-files/lib/upgrade/platform.sh |   1 +
>  7 files changed, 241 insertions(+)
>  create mode 100644 target/linux/ramips/dts/mt7621_zyxel_lte3301-plus.dts
> 
> diff --git a/target/linux/ramips/dts/mt7621_zyxel_lte3301-plus.dts
> b/target/linux/ramips/dts/mt7621_zyxel_lte3301-plus.dts
> new file mode 100644
> index 0000000000..9f2939bb2b
> --- /dev/null
> +++ b/target/linux/ramips/dts/mt7621_zyxel_lte3301-plus.dts
> @@ -0,0 +1,213 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
> +
> +#include "mt7621.dtsi"
> +
> +#include <dt-bindings/gpio/gpio.h>
> +#include <dt-bindings/input/input.h>
> +
> +/ {
> +	compatible = "zyxel,lte3301-plus", "mediatek,mt7621-soc";
> +	model = "ZyXEL LTE3301-Plus";
> +
> +	aliases {
> +		label-mac-device = &gmac0;
> +		led-boot = &led_power;
> +		led-failsafe = &led_power;
> +		led-running = &led_power;
> +		led-upgrade = &led_power;
> +	};
> +
> +	chosen {
> +		bootargs = "console=ttyS0,57600";
> +	};

IIRC, this is already in the DTSI and can be dropped.

> +
> +	leds {
> +		compatible = "gpio-leds";
> +
> +		led_power: power {
> +			label = "lte3301-plus:white:power";

drop model from LED labels, keeping just "white:power" etc.

> +			gpios = <&gpio 5 GPIO_ACTIVE_HIGH>;
> +		};
> +
> +		wifi {
> +			label = "lte3301-plus:white:wifi";
> +			gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
> +		};
> +
> +		internet {
> +			label = "lte3301-plus:white:internet";
> +			gpios = <&gpio 23 GPIO_ACTIVE_LOW>;
> +		};
> +
> +		usb {
> +			label = "lte3301-plus:white:usb";
> +			gpios = <&gpio 24 GPIO_ACTIVE_LOW>;
> +		};
> +
> +		lte {
> +			label = "lte3301-plus:white:lte";
> +			gpios = <&gpio 26 GPIO_ACTIVE_LOW>;
> +		};
> +
> +		mobile_green {
> +			label = "lte3301-plus:green:mobile";
> +			gpios = <&gpio 31 GPIO_ACTIVE_LOW>;
> +		};
> +
> +		mobile_orange {
> +			label = "lte3301-plus:orange:mobile";
> +			gpios = <&gpio 22 GPIO_ACTIVE_LOW>;
> +		};

Missing empty line between nodes.

> +		mobile_red {
> +			label = "lte3301-plus:red:mobile";
> +			gpios = <&gpio 14 GPIO_ACTIVE_LOW>;
> +		};
> +	};
> +
> +	keys {
> +		compatible = "gpio-keys";
> +
> +		reset {
> +			label = "reset";
> +			gpios = <&gpio 18 GPIO_ACTIVE_LOW>;
> +			linux,code = <KEY_RESTART>;
> +		};
> +
> +		wps {
> +			label = "wps";
> +			gpios = <&gpio 6 GPIO_ACTIVE_LOW>;
> +			linux,code = <KEY_WPS_BUTTON>;
> +		};
> +	};
> +};
> +
> +&gpio {
> +	status = "okay";
> +
> +	lte_power {
> +		gpio-hog;
> +		gpios = <27 GPIO_ACTIVE_LOW>;
> +		output-high;
> +		line-name = "lte-power";
> +	};
> +
> +	usb_power {
> +		gpio-hog;
> +		gpios = <7 GPIO_ACTIVE_HIGH>;
> +		output-high;
> +		line-name = "usb-power";
> +	};
> +};
> +
> +&nand {
> +	status = "okay";
> +
> +	partitions {
> +		compatible = "fixed-partitions";
> +		#address-cells = <1>;
> +		#size-cells = <1>;
> +
> +		partition@0 {
> +			label = "Bootloader";
> +			reg = <0x0 0x80000>;
> +			read-only;
> +		};
> +
> +		partition@80000 {
> +			label = "Config";
> +			reg = <0x80000 0x80000>;
> +		};
> +
> +		factory: partition@100000 {
> +			label = "Factory";
> +			reg = <0x100000 0x40000>;
> +			read-only;
> +		};
> +
> +		partition@140000 {
> +			label = "Kernel";
> +			reg = <0x140000 0x1ec0000>;
> +		};

"ubi" is part of kernel?

> +
> +		partition@540000 {
> +			label = "ubi";
> +			reg = <0x540000 0x1ac0000>;
> +		};
> +
> +		partition@2140000 {
> +			label = "Kernel2";
> +			reg = <0x2140000 0x1ec0000>;
> +		};

What's in 0x2000000 to 0x2140000? Or did I miscalculate?

> +
> +		partition@4000000 {
> +			label = "wwan";
> +			reg = <0x4000000 0x100000>;
> +		};
> +
> +		partition@4100000 {
> +			label = "data";
> +			reg = <0x4100000 0x1000000>;
> +		};
> +
> +		partition@5100000 {
> +			label = "rom-d";
> +			reg = <0x5100000 0x100000>;
> +			read-only;
> +		};
> +
> +		partition@5200000 {
> +			label = "reserve";
> +			reg = <0x5200000 0x80000>;
> +		};
> +	};
> +};
> +
> +&pcie {
> +       status = "okay";
> +};
> +
> +&pcie0 {
> +       status = "okay";

Add empty line after status.

> +       mt7615d@1,0 {

wifi@1,0

> +               compatible = "pci14c3,7615";
> +               reg = <0x0000 0 0 0 0>;
> +               mediatek,firmware-eeprom = "mt7615e_eeprom.bin";
> +               mediatek,mtd-eeprom = <&factory 0x0000>;
> +               mtd-mac-address = <&factory 0xfe6e>;
> +	       mtd-mac-address-increment = <1>;

That's a very unusual location. Nothing in 0x4, 0x8004, 0x28, 0x2e, 0xe000 or 0xe006?

> +	};
> +};
> +
> +&gmac0 {
> +	mtd-mac-address = <&factory 0xfe6e>;
> +};
> +
> +&switch0 {
> +	ports {
> +		port@0 {
> +			status = "okay";
> +			label = "lan4";
> +		};
> +		port@1 {
> +			status = "okay";
> +			label = "lan3";
> +		};
> +		port@2 {
> +			status = "okay";
> +			label = "lan2";
> +		};
> +		port@3 {
> +			status = "okay";
> +			label = "lan1";
> +		};
> +	};
> +};
> +
> +

Remove second empty line.

> +&state_default {
> +	gpio {
> +		groups = "uart2", "uart3", "rgmii2", "jtag";

"wdt" instead of "uart2"?

> +		function = "gpio";
> +	};
> +

Remove empty line.

> +};
> diff --git a/target/linux/ramips/image/mt7621.mk
> b/target/linux/ramips/image/mt7621.mk
> index 48448c2ab1..e2c9d23eee 100644
> --- a/target/linux/ramips/image/mt7621.mk
> +++ b/target/linux/ramips/image/mt7621.mk
> @@ -1511,6 +1511,22 @@ define Device/zio_freezio  endef
> TARGET_DEVICES += zio_freezio
> 
> +define Device/zyxel_lte3301-plus
> +  $(Device/dsa-migration)
> +  BLOCKSIZE := 128k
> +  PAGESIZE := 2048
> +  UBINIZE_OPTS := -E 5
> +  DEVICE_VENDOR := ZyXEL
> +  DEVICE_MODEL := LTE3301-PLUS

Plus instead of PLUS?

> +  DEVICE_PACKAGES := kmod-mt7615e kmod-mt7615-firmware kmod-usb3
> +uboot-envtools kmod-usb-ledtrig-usbport kmod-usb-net-qmi-wwan
> +kmod-usb-serial-option uqmi

Please wrap lines after 74 chars.

> +  KERNEL := $(KERNEL_DTB) | uImage lzma | zytrx-header
> $$(DEVICE_MODEL)
> +$$(VERSION_DIST)-$$(REVISION)
> +  KERNEL_INITRAMFS := $(KERNEL_DTB) | uImage lzma | zytrx-header
> +$$(DEVICE_MODEL) 9.99(ABQU.1)$$(VERSION_DIST)-recovery
> +  KERNEL_INITRAMFS_SUFFIX := -recovery.bin
> +  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
> +  SUPPORTED_DEVICES += lte3301-plus

This line can be removed.

> +endef
> +TARGET_DEVICES += zyxel_lte3301-plus
> +
>  define Device/zyxel_nr7101
>    $(Device/dsa-migration)
>    BLOCKSIZE := 128k
> diff --git a/target/linux/ramips/mt7621/base-files/etc/board.d/01_leds
> b/target/linux/ramips/mt7621/base-files/etc/board.d/01_leds
> index 6743b7e6c3..65a808b885 100644
> --- a/target/linux/ramips/mt7621/base-files/etc/board.d/01_leds
> +++ b/target/linux/ramips/mt7621/base-files/etc/board.d/01_leds
> @@ -98,6 +98,10 @@ xiaomi,redmi-router-ac2100)
>  youhua,wr1200js)
>  	ucidef_set_led_netdev "internet" "INTERNET" "green:wan" "wan"
>  	;;
> +zyxel,lte3301-plus)
> +        ucidef_set_led_netdev "internet" "internet"
> "$boardname:white:internet" "wwan0" "link tx rx"

Wrong indent. Use tabs.

"link tx rx" should be standard and can be removed.

> +        ucidef_set_led_usbport "usb" "USB" "$boardname:white:usb" "usb1-
> port2"

This can probably replaced by a DT trigger.

> +        ;;
>  esac
> 
>  board_config_flush
> diff --git a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
> b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
> index cde3cba9bc..01a4faf3cc 100644
> --- a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
> +++ b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
> @@ -63,6 +63,9 @@ ramips_setup_interfaces()
>  	ubnt,edgerouter-x-sfp)
>  		ucidef_set_interfaces_lan_wan "eth1 eth2 eth3 eth4 eth5"
> "eth0"
>  		;;
> +        zyxel,lte3301-plus)
> +                ucidef_set_interface_lan "lan1 lan2 lan3 lan4"
> +		;;

This can be merged with linksys,re6500 etc. Note that indent is wrong here, too.

>  	zyxel,nr7101)
>  		ucidef_set_interfaces_lan_wan "lan" "wan"
>  		;;
> diff --git a/target/linux/ramips/mt7621/base-
> files/etc/board.d/03_gpio_switches b/target/linux/ramips/mt7621/base-
> files/etc/board.d/03_gpio_switches
> index ed728b07c4..1959d8c9d2 100644
> --- a/target/linux/ramips/mt7621/base-files/etc/board.d/03_gpio_switches
> +++ b/target/linux/ramips/mt7621/base-files/etc/board.d/03_gpio_switches
> @@ -22,6 +22,9 @@ ubnt,edgerouter-x-sfp)
>  	ucidef_add_gpio_switch "poe_power_port3" "PoE Power Port3"
> "403"
>  	ucidef_add_gpio_switch "poe_power_port4" "PoE Power Port4"
> "404"
>  	;;
> +zyxel,lte3301-plus)
> +	ucidef_add_gpio_switch "lte_power" "Power LTE modem" "507"
> +	;;

Is this redundant with the lte_power hog? If yes, please decide for one of the two settings.

Best

Adrian

>  zyxel,nr7101)
>  	ucidef_add_gpio_switch "lte_reset" "Reset LTE/5G modem" "483"
>  	;;
> diff --git a/target/linux/ramips/mt7621/base-files/etc/init.d/bootcount
> b/target/linux/ramips/mt7621/base-files/etc/init.d/bootcount
> index a155458d3f..03c6d8eea7 100755
> --- a/target/linux/ramips/mt7621/base-files/etc/init.d/bootcount
> +++ b/target/linux/ramips/mt7621/base-files/etc/init.d/bootcount
> @@ -16,6 +16,7 @@ boot() {
>  	samknows,whitebox-v8)
>  		fw_setenv bootcount 0
>  		;;
> +	zyxel,lte3301-plus|\
>  	zyxel,nr7101)
>  		[ $(printf %d $(fw_printenv -n DebugFlag)) -gt 0 ] ||
> fw_setenv DebugFlag 0x1
>  		[ $(printf %d $(fw_printenv -n Image1Stable)) -gt 0 ] ||
> fw_setenv Image1Stable 1 diff --git a/target/linux/ramips/mt7621/base-
> files/lib/upgrade/platform.sh b/target/linux/ramips/mt7621/base-
> files/lib/upgrade/platform.sh
> index d30bc3db2e..88a92cf624 100755
> --- a/target/linux/ramips/mt7621/base-files/lib/upgrade/platform.sh
> +++ b/target/linux/ramips/mt7621/base-files/lib/upgrade/platform.sh
> @@ -82,6 +82,7 @@ platform_do_upgrade() {
>  	ubnt,edgerouter-x-sfp)
>  		platform_upgrade_ubnt_erx "$1"
>  		;;
> +	zyxel,lte3301-plus|\
>  	zyxel,nr7101)
>  		fw_setenv CheckBypass 0
>  		fw_setenv Image1Stable 0
> --
> 2.20.1
> 
> 
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel@lists.openwrt.org
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel
Bjørn Mork May 15, 2021, 4:08 p.m. UTC | #2
[ answering some comments which also apply to the NR7101 ]

"Adrian Schmutzler" <mail@adrianschmutzler.de> writes:

>> +		partition@140000 {
>> +			label = "Kernel";
>> +			reg = <0x140000 0x1ec0000>;
>> +		};
>
> "ubi" is part of kernel?

The operator specific firmware I have for the NR7101 does not use any
rootfs partition at all.  The stock images are huge initramfs
images. Any retained config is stored separately as a json blob in the
ubifs formatted "data" partition.

I assume the same is true for the LTE3301-Plus?
 
The writable "data" partition isn't suitable for a rootfs IMHO.  It's
tiny, and it's already full of stock/operator specific data which we
want to retain in case of a revert to stock.

So I split out part of the "Kernel" partition for our rootfs..

I still kept the original "Kernel" partition intact so that it is
possible to revert to stock without having to jump trough hoops.  The
stock images are much, much larger than we want to reserve for the
kernel, Typically 14-15 MB.

>> +
>> +		partition@540000 {
>> +			label = "ubi";
>> +			reg = <0x540000 0x1ac0000>;
>> +		};
>> +
>> +		partition@2140000 {
>> +			label = "Kernel2";
>> +			reg = <0x2140000 0x1ec0000>;
>> +		};
>
> What's in 0x2000000 to 0x2140000? Or did I miscalculate?

No you didn't.  This is a hole in the stock firmware.  I was a bit
unsure what to do about it. I left it alone to maintain the 1-to-1
mapping with bootloader and stock firmware partitions, not wanting to
risk that either secretly used the hole for something.

Funny thing is that there was a JFFS2 file system with UCI config files
at 0x2100000 on the NR7101.  This was not mapped as a partition by the
stock firmware, and obviously not mounted.  The contents was quite
useful as it contained a file with gpio mappings among other stuff.
Which was another reason I decided not to take this hole in use - the
factory data in there could be useful.




Bjørn
André Valentin May 17, 2021, 9:08 a.m. UTC | #3
Hi Adrian!

Please see comments below!

Am 15.05.21 um 16:05 schrieb Adrian Schmutzler:
> Hi,
> 
> comments below.
> 
>> -----Original Message-----
>> From: openwrt-devel [mailto:openwrt-devel-bounces@lists.openwrt.org]
>> On Behalf Of André Valentin
>> Sent: Samstag, 15. Mai 2021 02:12
>> To: openwrt-devel@lists.openwrt.org
>> Cc: avalentin@marcant.net
>> Subject: [PATCH 2/2] ramips: mt7621: Add support for ZyXEL LTE3301-Plus
>>
>> The ZyXEL LTE3301-Plus is an 4G indoor CPE with 2 external LTE antennas.
>>
>> Specifications:
>>
>>  - SoC: MediaTek MT7621AT
>>  - RAM: 256 MB
>>  - Flash: 128 MB MB NAND (MX30LF1G18AC)
>>  - WiFi: MediaTek MT7615E
>>  - Switch: 4 LAN ports (Gigabit)
>>  - LTE: Quectel EG506 connected by USB3 to SoC
>>  - SIM: 1 micro-SIM slot
>>  - USB: USB3 port
>>  - Buttons: Reset, WPS
>>  - LEDs: Multicolour power, internet, LTE, signal, Wifi, USB
>>  - Power: 12V, 1.5A
>>
>> The device is built as an indoor ethernet to LTE bridge or router with Wifi.
>>
>> UART Serial:
>>
>> 57600N1
>> Located on populated 5 pin header J5:
>>
>>  [o] GND
>>  [ ] key - no pin
>>  [o] 3.3V Vcc
>>  [o] RX
>>  [o] TX
>>
>> For more details about flashing see commit
>> 2449a632084b29632605e5a79ce5d73028eb15dd .
>>
>> Signed-off-by: André Valentin <avalentin@marcant.net>
>> ---
>>  .../ramips/dts/mt7621_zyxel_lte3301-plus.dts  | 213 ++++++++++++++++++
>>  target/linux/ramips/image/mt7621.mk           |  16 ++
>>  .../mt7621/base-files/etc/board.d/01_leds     |   4 +
>>  .../mt7621/base-files/etc/board.d/02_network  |   3 +
>>  .../base-files/etc/board.d/03_gpio_switches   |   3 +
>>  .../mt7621/base-files/etc/init.d/bootcount    |   1 +
>>  .../mt7621/base-files/lib/upgrade/platform.sh |   1 +
>>  7 files changed, 241 insertions(+)
>>  create mode 100644 target/linux/ramips/dts/mt7621_zyxel_lte3301-plus.dts
>>
>> diff --git a/target/linux/ramips/dts/mt7621_zyxel_lte3301-plus.dts
>> b/target/linux/ramips/dts/mt7621_zyxel_lte3301-plus.dts
>> new file mode 100644
>> index 0000000000..9f2939bb2b
>> --- /dev/null
>> +++ b/target/linux/ramips/dts/mt7621_zyxel_lte3301-plus.dts
>> @@ -0,0 +1,213 @@
>> +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
>> +
>> +#include "mt7621.dtsi"
>> +
>> +#include <dt-bindings/gpio/gpio.h>
>> +#include <dt-bindings/input/input.h>
>> +
>> +/ {
>> +	compatible = "zyxel,lte3301-plus", "mediatek,mt7621-soc";
>> +	model = "ZyXEL LTE3301-Plus";
>> +
>> +	aliases {
>> +		label-mac-device = &gmac0;
>> +		led-boot = &led_power;
>> +		led-failsafe = &led_power;
>> +		led-running = &led_power;
>> +		led-upgrade = &led_power;
>> +	};
>> +
>> +	chosen {
>> +		bootargs = "console=ttyS0,57600";
>> +	};
> 
> IIRC, this is already in the DTSI and can be dropped.
> 
>> +
>> +	leds {
>> +		compatible = "gpio-leds";
>> +
>> +		led_power: power {
>> +			label = "lte3301-plus:white:power";
> > drop model from LED labels, keeping just "white:power" etc.

Thanks, fixed!
> 
>> +			gpios = <&gpio 5 GPIO_ACTIVE_HIGH>;
>> +		};
>> +
>> +		wifi {
>> +			label = "lte3301-plus:white:wifi";
>> +			gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
>> +		};
>> +
>> +		internet {
>> +			label = "lte3301-plus:white:internet";
>> +			gpios = <&gpio 23 GPIO_ACTIVE_LOW>;
>> +		};
>> +
>> +		usb {
>> +			label = "lte3301-plus:white:usb";
>> +			gpios = <&gpio 24 GPIO_ACTIVE_LOW>;
>> +		};
>> +
>> +		lte {
>> +			label = "lte3301-plus:white:lte";
>> +			gpios = <&gpio 26 GPIO_ACTIVE_LOW>;
>> +		};
>> +
>> +		mobile_green {
>> +			label = "lte3301-plus:green:mobile";
>> +			gpios = <&gpio 31 GPIO_ACTIVE_LOW>;
>> +		};
>> +
>> +		mobile_orange {
>> +			label = "lte3301-plus:orange:mobile";
>> +			gpios = <&gpio 22 GPIO_ACTIVE_LOW>;
>> +		};
> 
> Missing empty line between nodes.
Thanks, fixed!
> 
>> +		mobile_red {
>> +			label = "lte3301-plus:red:mobile";
>> +			gpios = <&gpio 14 GPIO_ACTIVE_LOW>;
>> +		};
>> +	};
>> +
>> +	keys {
>> +		compatible = "gpio-keys";
>> +
>> +		reset {
>> +			label = "reset";
>> +			gpios = <&gpio 18 GPIO_ACTIVE_LOW>;
>> +			linux,code = <KEY_RESTART>;
>> +		};
>> +
>> +		wps {
>> +			label = "wps";
>> +			gpios = <&gpio 6 GPIO_ACTIVE_LOW>;
>> +			linux,code = <KEY_WPS_BUTTON>;
>> +		};
>> +	};
>> +};
>> +
>> +&gpio {
>> +	status = "okay";
>> +
>> +	lte_power {
>> +		gpio-hog;
>> +		gpios = <27 GPIO_ACTIVE_LOW>;
>> +		output-high;
>> +		line-name = "lte-power";
>> +	};
>> +
>> +	usb_power {
>> +		gpio-hog;
>> +		gpios = <7 GPIO_ACTIVE_HIGH>;
>> +		output-high;
>> +		line-name = "usb-power";
>> +	};
>> +};
>> +
>> +&nand {
>> +	status = "okay";
>> +
>> +	partitions {
>> +		compatible = "fixed-partitions";
>> +		#address-cells = <1>;
>> +		#size-cells = <1>;
>> +
>> +		partition@0 {
>> +			label = "Bootloader";
>> +			reg = <0x0 0x80000>;
>> +			read-only;
>> +		};
>> +
>> +		partition@80000 {
>> +			label = "Config";
>> +			reg = <0x80000 0x80000>;
>> +		};
>> +
>> +		factory: partition@100000 {
>> +			label = "Factory";
>> +			reg = <0x100000 0x40000>;
>> +			read-only;
>> +		};
>> +
>> +		partition@140000 {
>> +			label = "Kernel";
>> +			reg = <0x140000 0x1ec0000>;
>> +		};
> 
> "ubi" is part of kernel?
see below
> 
>> +
>> +		partition@540000 {
>> +			label = "ubi";
>> +			reg = <0x540000 0x1ac0000>;
>> +		};
>> +
>> +		partition@2140000 {
>> +			label = "Kernel2";
>> +			reg = <0x2140000 0x1ec0000>;
>> +		};
> 
> What's in 0x2000000 to 0x2140000? Or did I miscalculate?

No, no miscalculation. This was taken from factory.

But please wait, I'm working on an alternative!
> 
>> +
>> +		partition@4000000 {
>> +			label = "wwan";
>> +			reg = <0x4000000 0x100000>;
>> +		};
>> +
>> +		partition@4100000 {
>> +			label = "data";
>> +			reg = <0x4100000 0x1000000>;
>> +		};
>> +
>> +		partition@5100000 {
>> +			label = "rom-d";
>> +			reg = <0x5100000 0x100000>;
>> +			read-only;
>> +		};
>> +
>> +		partition@5200000 {
>> +			label = "reserve";
>> +			reg = <0x5200000 0x80000>;
>> +		};
>> +	};
>> +};
>> +
>> +&pcie {
>> +       status = "okay";
>> +};
>> +
>> +&pcie0 {
>> +       status = "okay";
> 
> Add empty line after status.
Thanks, fixed!

> 
>> +       mt7615d@1,0 {
> 
> wifi@1,0
> 
>> +               compatible = "pci14c3,7615";
>> +               reg = <0x0000 0 0 0 0>;
>> +               mediatek,firmware-eeprom = "mt7615e_eeprom.bin";
>> +               mediatek,mtd-eeprom = <&factory 0x0000>;
>> +               mtd-mac-address = <&factory 0xfe6e>;
>> +	       mtd-mac-address-increment = <1>;
> 
> That's a very unusual location. Nothing in 0x4, 0x8004, 0x28, 0x2e, 0xe000 or 0xe006?
Yepp. I verified it before. But it's correct.
> 
>> +	};
>> +};
>> +
>> +&gmac0 {
>> +	mtd-mac-address = <&factory 0xfe6e>;
>> +};
>> +
>> +&switch0 {
>> +	ports {
>> +		port@0 {
>> +			status = "okay";
>> +			label = "lan4";
>> +		};
>> +		port@1 {
>> +			status = "okay";
>> +			label = "lan3";
>> +		};
>> +		port@2 {
>> +			status = "okay";
>> +			label = "lan2";
>> +		};
>> +		port@3 {
>> +			status = "okay";
>> +			label = "lan1";
>> +		};
>> +	};
>> +};
>> +
>> +
> 
> Remove second empty line.
Thanks, fixed!
> 
>> +&state_default {
>> +	gpio {
>> +		groups = "uart2", "uart3", "rgmii2", "jtag";
> 
> "wdt" instead of "uart2"?
Thanks, fixed!
> 
>> +		function = "gpio";
>> +	};
>> +
> 
> Remove empty line.
Thanks, fixed!
> 
>> +};
>> diff --git a/target/linux/ramips/image/mt7621.mk
>> b/target/linux/ramips/image/mt7621.mk
>> index 48448c2ab1..e2c9d23eee 100644
>> --- a/target/linux/ramips/image/mt7621.mk
>> +++ b/target/linux/ramips/image/mt7621.mk
>> @@ -1511,6 +1511,22 @@ define Device/zio_freezio  endef
>> TARGET_DEVICES += zio_freezio
>>
>> +define Device/zyxel_lte3301-plus
>> +  $(Device/dsa-migration)
>> +  BLOCKSIZE := 128k
>> +  PAGESIZE := 2048
>> +  UBINIZE_OPTS := -E 5
>> +  DEVICE_VENDOR := ZyXEL
>> +  DEVICE_MODEL := LTE3301-PLUS
> 
> Plus instead of PLUS?
Thanks, changed all to LTE3301-PLUS
> 
>> +  DEVICE_PACKAGES := kmod-mt7615e kmod-mt7615-firmware kmod-usb3
>> +uboot-envtools kmod-usb-ledtrig-usbport kmod-usb-net-qmi-wwan
>> +kmod-usb-serial-option uqmi
> 
> Please wrap lines after 74 chars.
Thanks, fixed!
> 
>> +  KERNEL := $(KERNEL_DTB) | uImage lzma | zytrx-header
>> $$(DEVICE_MODEL)
>> +$$(VERSION_DIST)-$$(REVISION)
>> +  KERNEL_INITRAMFS := $(KERNEL_DTB) | uImage lzma | zytrx-header
>> +$$(DEVICE_MODEL) 9.99(ABQU.1)$$(VERSION_DIST)-recovery
>> +  KERNEL_INITRAMFS_SUFFIX := -recovery.bin
>> +  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
>> +  SUPPORTED_DEVICES += lte3301-plus
> 
> This line can be removed.
Thanks, fixed!
> 
>> +endef
>> +TARGET_DEVICES += zyxel_lte3301-plus
>> +
>>  define Device/zyxel_nr7101
>>    $(Device/dsa-migration)
>>    BLOCKSIZE := 128k
>> diff --git a/target/linux/ramips/mt7621/base-files/etc/board.d/01_leds
>> b/target/linux/ramips/mt7621/base-files/etc/board.d/01_leds
>> index 6743b7e6c3..65a808b885 100644
>> --- a/target/linux/ramips/mt7621/base-files/etc/board.d/01_leds
>> +++ b/target/linux/ramips/mt7621/base-files/etc/board.d/01_leds
>> @@ -98,6 +98,10 @@ xiaomi,redmi-router-ac2100)
>>  youhua,wr1200js)
>>  	ucidef_set_led_netdev "internet" "INTERNET" "green:wan" "wan"
>>  	;;
>> +zyxel,lte3301-plus)
>> +        ucidef_set_led_netdev "internet" "internet"
>> "$boardname:white:internet" "wwan0" "link tx rx"
> 
> Wrong indent. Use tabs.
Thanks, fixed!
> 
> "link tx rx" should be standard and can be removed.
Thanks, fixed!
> 
>> +        ucidef_set_led_usbport "usb" "USB" "$boardname:white:usb" "usb1-
>> port2"
> 
> This can probably replaced by a DT trigger.
You you give me a hint?
> 
>> +        ;;
>>  esac
>>
>>  board_config_flush
>> diff --git a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
>> b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
>> index cde3cba9bc..01a4faf3cc 100644
>> --- a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
>> +++ b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
>> @@ -63,6 +63,9 @@ ramips_setup_interfaces()
>>  	ubnt,edgerouter-x-sfp)
>>  		ucidef_set_interfaces_lan_wan "eth1 eth2 eth3 eth4 eth5"
>> "eth0"
>>  		;;
>> +        zyxel,lte3301-plus)
>> +                ucidef_set_interface_lan "lan1 lan2 lan3 lan4"
>> +		;;
> 
> This can be merged with linksys,re6500 etc. Note that indent is wrong here, too.
Thanks, fixed!
> 
>>  	zyxel,nr7101)
>>  		ucidef_set_interfaces_lan_wan "lan" "wan"
>>  		;;
>> diff --git a/target/linux/ramips/mt7621/base-
>> files/etc/board.d/03_gpio_switches b/target/linux/ramips/mt7621/base-
>> files/etc/board.d/03_gpio_switches
>> index ed728b07c4..1959d8c9d2 100644
>> --- a/target/linux/ramips/mt7621/base-files/etc/board.d/03_gpio_switches
>> +++ b/target/linux/ramips/mt7621/base-files/etc/board.d/03_gpio_switches
>> @@ -22,6 +22,9 @@ ubnt,edgerouter-x-sfp)
>>  	ucidef_add_gpio_switch "poe_power_port3" "PoE Power Port3"
>> "403"
>>  	ucidef_add_gpio_switch "poe_power_port4" "PoE Power Port4"
>> "404"
>>  	;;
>> +zyxel,lte3301-plus)
>> +	ucidef_add_gpio_switch "lte_power" "Power LTE modem" "507"
>> +	;;
> 
> Is this redundant with the lte_power hog? If yes, please decide for one of the two settings.
I've got some questions here.
Personnally I use a special scripts for this modem, taking use of the lte_power line.
I.E., reset the modem if it does not work anymore.

So I do not want to set the GPIO alway to on. It should default to on, but be changable from userspace.
What would be the correct implementation?


> 
> Best
> 
> Adrian
> 
>>  zyxel,nr7101)
>>  	ucidef_add_gpio_switch "lte_reset" "Reset LTE/5G modem" "483"
>>  	;;
>> diff --git a/target/linux/ramips/mt7621/base-files/etc/init.d/bootcount
>> b/target/linux/ramips/mt7621/base-files/etc/init.d/bootcount
>> index a155458d3f..03c6d8eea7 100755
>> --- a/target/linux/ramips/mt7621/base-files/etc/init.d/bootcount
>> +++ b/target/linux/ramips/mt7621/base-files/etc/init.d/bootcount
>> @@ -16,6 +16,7 @@ boot() {
>>  	samknows,whitebox-v8)
>>  		fw_setenv bootcount 0
>>  		;;
>> +	zyxel,lte3301-plus|\
>>  	zyxel,nr7101)
>>  		[ $(printf %d $(fw_printenv -n DebugFlag)) -gt 0 ] ||
>> fw_setenv DebugFlag 0x1
>>  		[ $(printf %d $(fw_printenv -n Image1Stable)) -gt 0 ] ||
>> fw_setenv Image1Stable 1 diff --git a/target/linux/ramips/mt7621/base-
>> files/lib/upgrade/platform.sh b/target/linux/ramips/mt7621/base-
>> files/lib/upgrade/platform.sh
>> index d30bc3db2e..88a92cf624 100755
>> --- a/target/linux/ramips/mt7621/base-files/lib/upgrade/platform.sh
>> +++ b/target/linux/ramips/mt7621/base-files/lib/upgrade/platform.sh
>> @@ -82,6 +82,7 @@ platform_do_upgrade() {
>>  	ubnt,edgerouter-x-sfp)
>>  		platform_upgrade_ubnt_erx

Thank you very much for taking a look at this.

Kind regards,

André
André Valentin May 17, 2021, 9:38 a.m. UTC | #4
Hi !


Am 15.05.21 um 18:08 schrieb Bjørn Mork:
> [ answering some comments which also apply to the NR7101 ]
> 
> "Adrian Schmutzler" <mail@adrianschmutzler.de> writes:
> 
>>> +		partition@140000 {
>>> +			label = "Kernel";
>>> +			reg = <0x140000 0x1ec0000>;
>>> +		};
>>
>> "ubi" is part of kernel?
> 
> The operator specific firmware I have for the NR7101 does not use any
> rootfs partition at all.  The stock images are huge initramfs
> images. Any retained config is stored separately as a json blob in the
> ubifs formatted "data" partition.
> 
> I assume the same is true for the LTE3301-Plus?
It is!
>  
> The writable "data" partition isn't suitable for a rootfs IMHO.  It's
> tiny, and it's already full of stock/operator specific data which we
> want to retain in case of a revert to stock.
> 
> So I split out part of the "Kernel" partition for our rootfs..
> 
> I still kept the original "Kernel" partition intact so that it is
> possible to revert to stock without having to jump trough hoops.  The
> stock images are much, much larger than we want to reserve for the
> kernel, Typically 14-15 MB.
> 
>>> +
>>> +		partition@540000 {
>>> +			label = "ubi";
>>> +			reg = <0x540000 0x1ac0000>;
>>> +		};
>>> +
>>> +		partition@2140000 {
>>> +			label = "Kernel2";
>>> +			reg = <0x2140000 0x1ec0000>;
>>> +		};
>>
>> What's in 0x2000000 to 0x2140000? Or did I miscalculate?
> 
> No you didn't.  This is a hole in the stock firmware.  I was a bit
> unsure what to do about it. I left it alone to maintain the 1-to-1
> mapping with bootloader and stock firmware partitions, not wanting to
> risk that either secretly used the hole for something.
> 
> Funny thing is that there was a JFFS2 file system with UCI config files
> at 0x2100000 on the NR7101.  This was not mapped as a partition by the
> stock firmware, and obviously not mounted.  The contents was quite
> useful as it contained a file with gpio mappings among other stuff.
> Which was another reason I decided not to take this hole in use - the
> factory data in there could be useful.

Didn't notice that. Funny.
> 
> 
> 
Please let us talk about the flash layout:

Original:
                partition@0 {
                        label = "uboot";
                        reg = <0x00000 0x80000>; /* 64 KB */
                };
                partition@80000 {
                        label = "uboot_env";
                        reg = <0x80000 0x80000>; /* 64 KB */
                };
                factory: partition@100000 {
                        label = "factory";
                        reg = <0x100000 0x40000>;
                };
                partition@140000 {
                        label = "Kernel";
                        reg = <0x140000 0x1ec0000>;
                };
                partition@2140000 {
                        label = "Kernel2";
                        reg = <0x2140000 0x1ec0000>;
                };
                partition@4000000 {
                        label = "wwan";
                        reg = <0x4000000 0x100000>;
                };

                partition@4100000 {
                        label = "data";
                        reg = <0x4100000 0x1000000>;
                };
                partition@5100000 {
                        label = "rom-d";
                        reg = <0x5100000 0x100000>;
                };
                partition@5200000 {
                        label = "reserve";
                        reg = <0x5200000 0x80000>;
                };


| uboot | uboot_env | factory | Kernel | Kernel 2 | wwan | data | rom.d | reserve

There are gaps between the partitions. I can only imagine that this is because of bad block handling in the bootloader.
It seems it uses the end of the flash for reserve and also has holes betwee partitions for this.

Manufacturer implementation:
He uses an initramfs image which is stored on Kernel and on Kernel2. Data is stored on data partition.

1st implementation by Björn:
Kernel partition is used for kernel, ubi (rootfs, rootfs_data)
-ubi image has to be uploaded separateley.
-installation via initramfs image needed
-sysupgrade working

2nd implemtation:
Kernel partition is used for kernel, rootfs and ubi (rootfs_data)
-rootfs is always included
-not initramfs installation needed.
-sysupgraded working

I would prefer the 2nd solution, because it give us a working system after the initial flash.

Modifications needed for 2nd implementation:
-mtdsplit_squashfs.c
-device specific upgrade flow

Bootup processes with 2nd implementation:
The image has been flashed with the bootloader.
1. Device boots up kernel.
2. mtdsplit_uimage.c splits the image into parition kernel and rootfs
3. mtdsplit_squashfs.c splits the rootfs parition into rootfs and ubi (see patch)
4. ubi is initialized and formated if needed
5. system is up

What do you think? Use first or second implementation?


Kind regards,

André
Bjørn Mork May 17, 2021, 9:54 a.m. UTC | #5
Andre Valentin <avalentin@marcant.net> writes:

>>> diff --git a/target/linux/ramips/mt7621/base-
>>> files/etc/board.d/03_gpio_switches b/target/linux/ramips/mt7621/base-
>>> files/etc/board.d/03_gpio_switches
>>> index ed728b07c4..1959d8c9d2 100644
>>> --- a/target/linux/ramips/mt7621/base-files/etc/board.d/03_gpio_switches
>>> +++ b/target/linux/ramips/mt7621/base-files/etc/board.d/03_gpio_switches
>>> @@ -22,6 +22,9 @@ ubnt,edgerouter-x-sfp)
>>>  	ucidef_add_gpio_switch "poe_power_port3" "PoE Power Port3"
>>> "403"
>>>  	ucidef_add_gpio_switch "poe_power_port4" "PoE Power Port4"
>>> "404"
>>>  	;;
>>> +zyxel,lte3301-plus)
>>> +	ucidef_add_gpio_switch "lte_power" "Power LTE modem" "507"
>>> +	;;
>> 
>> Is this redundant with the lte_power hog? If yes, please decide for one of the two settings.
> I've got some questions here.
> Personnally I use a special scripts for this modem, taking use of the lte_power line.
> I.E., reset the modem if it does not work anymore.
>
> So I do not want to set the GPIO alway to on. It should default to on, but be changable from userspace.
> What would be the correct implementation?

Does the LTE3301-PLUS only have this single GPIO for hard reset of the
modem?  If so, then I fully agree - it should be a userspace switch.
Drop the hog then.

The NR7101 had no less than 3 GPIOs controlling power and reset to the
modem, named "lte_pwrkey", "lte_power" and "lte_reset" in the gpio
config file I found in the jffs2 filesystem hidden in the flash hole.  I
didn't know what to make out of that, but saw no reason to leave all 3
for userspace.  So I make "lte_reset" a userspace switch and the other 2
gpio-hogs.  Somewhat arbitrary choice.



Bjørn
Bjørn Mork May 17, 2021, 10:54 a.m. UTC | #6
Andre Valentin <avalentin@marcant.net> writes:

> There are gaps between the partitions. I can only imagine that this is because of bad block handling in the bootloader.
> It seems it uses the end of the flash for reserve and also has holes betwee partitions for this.

Yes, that makes sense.


> Manufacturer implementation:
> He uses an initramfs image which is stored on Kernel and on Kernel2. Data is stored on data partition.
>
> 1st implementation by Björn:
> Kernel partition is used for kernel, ubi (rootfs, rootfs_data)
> -ubi image has to be uploaded separateley.
> -installation via initramfs image needed
> -sysupgrade working
>
> 2nd implemtation:
> Kernel partition is used for kernel, rootfs and ubi (rootfs_data)
> -rootfs is always included
> -not initramfs installation needed.
> -sysupgraded working
>
> I would prefer the 2nd solution, because it give us a working system after the initial flash.
>
> Modifications needed for 2nd implementation:
> -mtdsplit_squashfs.c
> -device specific upgrade flow
>
> Bootup processes with 2nd implementation:
> The image has been flashed with the bootloader.
> 1. Device boots up kernel.
> 2. mtdsplit_uimage.c splits the image into parition kernel and rootfs
> 3. mtdsplit_squashfs.c splits the rootfs parition into rootfs and ubi (see patch)
> 4. ubi is initialized and formated if needed
> 5. system is up
>
> What do you think? Use first or second implementation?

I don't think we can move the ubi partition around.  It needs to
preserve the wear levelling metadata, or it becomes pointless.  And I
don't think we want a writable rootfs without wear levelling.

We could have used the first part of your idea, havinng a dynamic split
between kernel and the read-only rootfs, with a fixed ubi rootfs_data
partition.  But it would be hard to place that fixed split to suit
everyone.  The total size to play with isn't that much, with the
recovery image abusing half the flash.  So we would end up with a rootfs
and a rootfs_data which are both too small to be useful.

There are also some other possible schemes taking advantage of the flash
reserved for the recovery image.  But they will add some risk of the
bootloader messing up the rootfs, which I don't think we should expose
unsuspecting users to.  It's more like something we can do for our own
personal images.

All in all, the current scheme was the best I could come up with.

It would still be possible to do a one-step initial install by creating
a "factory" image with kernel+rootfs concatenated, like we do for many
devices.  In fact, I created such an image at first.  And dropped it
after it softbricked my test device, due to a bad block in the beginning
of the "Kernel" partition. This caused the "ubi" data to end up at
unexpected offset, and therefore not found where the kernel was looking
for it.

This is not a problem specific to these devices though.  But I think
that users are better served by clear two-step installation instructions
than a one-step solution known to brick some devices.

The NR7101 is the first device I've bought with a bad block in such an
"unlucky" spot.  It's obviously not common. Still not something we can
just disregard.
André Valentin May 17, 2021, 12:01 p.m. UTC | #7
Hi!

Am 17.05.21 um 12:54 schrieb Bjørn Mork:
> Andre Valentin <avalentin@marcant.net> writes:
> 
>> There are gaps between the partitions. I can only imagine that this is because of bad block handling in the bootloader.
>> It seems it uses the end of the flash for reserve and also has holes betwee partitions for this.
> 
> Yes, that makes sense.
> 
> 
>> Manufacturer implementation:
>> He uses an initramfs image which is stored on Kernel and on Kernel2. Data is stored on data partition.
>>
>> 1st implementation by Björn:
>> Kernel partition is used for kernel, ubi (rootfs, rootfs_data)
>> -ubi image has to be uploaded separateley.
>> -installation via initramfs image needed
>> -sysupgrade working
>>
>> 2nd implemtation:
>> Kernel partition is used for kernel, rootfs and ubi (rootfs_data)
>> -rootfs is always included
>> -not initramfs installation needed.
>> -sysupgraded working
>>
>> I would prefer the 2nd solution, because it give us a working system after the initial flash.
>>
>> Modifications needed for 2nd implementation:
>> -mtdsplit_squashfs.c
>> -device specific upgrade flow
>>
>> Bootup processes with 2nd implementation:
>> The image has been flashed with the bootloader.
>> 1. Device boots up kernel.
>> 2. mtdsplit_uimage.c splits the image into parition kernel and rootfs
>> 3. mtdsplit_squashfs.c splits the rootfs parition into rootfs and ubi (see patch)
>> 4. ubi is initialized and formated if needed
>> 5. system is up
>>
>> What do you think? Use first or second implementation?
> 
> I don't think we can move the ubi partition around.  It needs to
> preserve the wear levelling metadata, or it becomes pointless.  And I
> don't think we want a writable rootfs without wear levelling.

Perhaps you misunterstood me, rootfs is always concatenated to the kernel.
The free space after the rootfs will be used for the UBI partition and only rootfs_data.
You're right, metadata will be lost. But is it so important?
> 
> We could have used the first part of your idea, havinng a dynamic split
> between kernel and the read-only rootfs, with a fixed ubi rootfs_data
> partition.  But it would be hard to place that fixed split to suit
> everyone.  The total size to play with isn't that much, with the
> recovery image abusing half the flash.  So we would end up with a rootfs
> and a rootfs_data which are both too small to be useful.

Absolutely!
> 
> There are also some other possible schemes taking advantage of the flash
> reserved for the recovery image.  But they will add some risk of the
> bootloader messing up the rootfs, which I don't think we should expose
> unsuspecting users to.  It's more like something we can do for our own
> personal images.

I tried that before. UBI on the space after rom partition. But after weeks of usage, I got funny errors (xz cannot decompress).
ubi never showed any errors in that case.. And I leaf at least 4 eraseblocks free at the end.
> 
> All in all, the current scheme was the best I could come up with.
> 
> It would still be possible to do a one-step initial install by creating
> a "factory" image with kernel+rootfs concatenated, like we do for many
> devices.  In fact, I created such an image at first.  And dropped it
> after it softbricked my test device, due to a bad block in the beginning
> of the "Kernel" partition. This caused the "ubi" data to end up at
> unexpected offset, and therefore not found where the kernel was looking
> for it.
Damn, correct. That could happen. I haven't testet it.
> 
> This is not a problem specific to these devices though.  But I think
> that users are better served by clear two-step installation instructions
> than a one-step solution known to brick some devices.
> 
> The NR7101 is the first device I've bought with a bad block in such an
> "unlucky" spot.  It's obviously not common. Still not something we can
> just disregard.
> 

I think the best way would be if we had an initramfs which is able to save config on a separate filesystem.
But it wouldn't be supported be the imagebuilder and needs more work.

Not easy..

Kind regards,

André
Adrian Schmutzler May 17, 2021, 8:43 p.m. UTC | #8
Hi,

> >
> > What's in 0x2000000 to 0x2140000? Or did I miscalculate?
> 
> No, no miscalculation. This was taken from factory.
> 
> But please wait, I'm working on an alternative!

If this stays empty please just add a brief comment about that fact into the DTS.

> > That's a very unusual location. Nothing in 0x4, 0x8004, 0x28, 0x2e, 0xe000 or
> 0xe006?
> Yepp. I verified it before. But it's correct.

Please provide details about mac assignment in the commit message...

> > Wrong indent. Use tabs.
> Thanks, fixed!
> >
> > "link tx rx" should be standard and can be removed.
> Thanks, fixed!
> >
> >> +        ucidef_set_led_usbport "usb" "USB" "$boardname:white:usb"
> >> + "usb1-
> >> port2"
> >
> > This can probably replaced by a DT trigger.
> You you give me a hint?

https://github.com/openwrt/openwrt/blob/master/target/linux/ramips/dts/mt7621_netgear_sercomm_ayx.dtsi#L52

> >
> >> +        ;;
> >>  esac
> >>
> >>  board_config_flush
> >> diff --git
> >> a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
> >> b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
> >> index cde3cba9bc..01a4faf3cc 100644
> >> --- a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
> >> +++ b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
> >> @@ -63,6 +63,9 @@ ramips_setup_interfaces()
> >>  	ubnt,edgerouter-x-sfp)
> >>  		ucidef_set_interfaces_lan_wan "eth1 eth2 eth3 eth4 eth5"
> >> "eth0"
> >>  		;;
> >> +        zyxel,lte3301-plus)
> >> +                ucidef_set_interface_lan "lan1 lan2 lan3 lan4"
> >> +		;;
> >
> > This can be merged with linksys,re6500 etc. Note that indent is wrong here,
> too.
> Thanks, fixed!
> >
> >>  	zyxel,nr7101)
> >>  		ucidef_set_interfaces_lan_wan "lan" "wan"
> >>  		;;
> >> diff --git a/target/linux/ramips/mt7621/base-
> >> files/etc/board.d/03_gpio_switches b/target/linux/ramips/mt7621/base-
> >> files/etc/board.d/03_gpio_switches
> >> index ed728b07c4..1959d8c9d2 100644
> >> ---
> >> a/target/linux/ramips/mt7621/base-files/etc/board.d/03_gpio_switches
> >> +++ b/target/linux/ramips/mt7621/base-files/etc/board.d/03_gpio_switc
> >> +++ hes
> >> @@ -22,6 +22,9 @@ ubnt,edgerouter-x-sfp)
> >>  	ucidef_add_gpio_switch "poe_power_port3" "PoE Power Port3"
> >> "403"
> >>  	ucidef_add_gpio_switch "poe_power_port4" "PoE Power Port4"
> >> "404"
> >>  	;;
> >> +zyxel,lte3301-plus)
> >> +	ucidef_add_gpio_switch "lte_power" "Power LTE modem" "507"
> >> +	;;
> >
> > Is this redundant with the lte_power hog? If yes, please decide for one of
> the two settings.
> I've got some questions here.
> Personnally I use a special scripts for this modem, taking use of the
> lte_power line.
> I.E., reset the modem if it does not work anymore.
> 
> So I do not want to set the GPIO alway to on. It should default to on, but be
> changable from userspace.
> What would be the correct implementation?

gpio-hogs cannot be changed be the user.

Other options are gpio-export (in DTS) and 03_gpio_switches. If you want to set the default value, just add a fourth parameter:

ucidef_add_gpio_switch "lte_power" "Power LTE modem" "507" "1"

There is not an obvious best choice, so you have some kind of liberty here. But you should not use more than one for the same parameter.

Best

Adrian

> 
> 
> >
> > Best
> >
> > Adrian
> >
> >>  zyxel,nr7101)
> >>  	ucidef_add_gpio_switch "lte_reset" "Reset LTE/5G modem" "483"
> >>  	;;
> >> diff --git
> >> a/target/linux/ramips/mt7621/base-files/etc/init.d/bootcount
> >> b/target/linux/ramips/mt7621/base-files/etc/init.d/bootcount
> >> index a155458d3f..03c6d8eea7 100755
> >> --- a/target/linux/ramips/mt7621/base-files/etc/init.d/bootcount
> >> +++ b/target/linux/ramips/mt7621/base-files/etc/init.d/bootcount
> >> @@ -16,6 +16,7 @@ boot() {
> >>  	samknows,whitebox-v8)
> >>  		fw_setenv bootcount 0
> >>  		;;
> >> +	zyxel,lte3301-plus|\
> >>  	zyxel,nr7101)
> >>  		[ $(printf %d $(fw_printenv -n DebugFlag)) -gt 0 ] ||
> fw_setenv
> >> DebugFlag 0x1
> >>  		[ $(printf %d $(fw_printenv -n Image1Stable)) -gt 0 ] ||
> fw_setenv
> >> Image1Stable 1 diff --git a/target/linux/ramips/mt7621/base-
> >> files/lib/upgrade/platform.sh b/target/linux/ramips/mt7621/base-
> >> files/lib/upgrade/platform.sh
> >> index d30bc3db2e..88a92cf624 100755
> >> --- a/target/linux/ramips/mt7621/base-files/lib/upgrade/platform.sh
> >> +++ b/target/linux/ramips/mt7621/base-files/lib/upgrade/platform.sh
> >> @@ -82,6 +82,7 @@ platform_do_upgrade() {
> >>  	ubnt,edgerouter-x-sfp)
> >>  		platform_upgrade_ubnt_erx
> 
> Thank you very much for taking a look at this.
> 
> Kind regards,
> 
> André
>
diff mbox series

Patch

diff --git a/target/linux/ramips/dts/mt7621_zyxel_lte3301-plus.dts b/target/linux/ramips/dts/mt7621_zyxel_lte3301-plus.dts
new file mode 100644
index 0000000000..9f2939bb2b
--- /dev/null
+++ b/target/linux/ramips/dts/mt7621_zyxel_lte3301-plus.dts
@@ -0,0 +1,213 @@ 
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+#include "mt7621.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+	compatible = "zyxel,lte3301-plus", "mediatek,mt7621-soc";
+	model = "ZyXEL LTE3301-Plus";
+
+	aliases {
+		label-mac-device = &gmac0;
+		led-boot = &led_power;
+		led-failsafe = &led_power;
+		led-running = &led_power;
+		led-upgrade = &led_power;
+	};
+
+	chosen {
+		bootargs = "console=ttyS0,57600";
+	};
+
+	leds {
+		compatible = "gpio-leds";
+
+		led_power: power {
+			label = "lte3301-plus:white:power";
+			gpios = <&gpio 5 GPIO_ACTIVE_HIGH>;
+		};
+
+		wifi {
+			label = "lte3301-plus:white:wifi";
+			gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
+		};
+
+		internet {
+			label = "lte3301-plus:white:internet";
+			gpios = <&gpio 23 GPIO_ACTIVE_LOW>;
+		};
+
+		usb {
+			label = "lte3301-plus:white:usb";
+			gpios = <&gpio 24 GPIO_ACTIVE_LOW>;
+		};
+
+		lte {
+			label = "lte3301-plus:white:lte";
+			gpios = <&gpio 26 GPIO_ACTIVE_LOW>;
+		};
+
+		mobile_green {
+			label = "lte3301-plus:green:mobile";
+			gpios = <&gpio 31 GPIO_ACTIVE_LOW>;
+		};
+
+		mobile_orange {
+			label = "lte3301-plus:orange:mobile";
+			gpios = <&gpio 22 GPIO_ACTIVE_LOW>;
+		};
+		mobile_red {
+			label = "lte3301-plus:red:mobile";
+			gpios = <&gpio 14 GPIO_ACTIVE_LOW>;
+		};
+	};
+
+	keys {
+		compatible = "gpio-keys";
+
+		reset {
+			label = "reset";
+			gpios = <&gpio 18 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_RESTART>;
+		};
+
+		wps {
+			label = "wps";
+			gpios = <&gpio 6 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_WPS_BUTTON>;
+		};
+	};
+};
+
+&gpio {
+	status = "okay";
+
+	lte_power {
+		gpio-hog;
+		gpios = <27 GPIO_ACTIVE_LOW>;
+		output-high;
+		line-name = "lte-power";
+	};
+
+	usb_power {
+		gpio-hog;
+		gpios = <7 GPIO_ACTIVE_HIGH>;
+		output-high;
+		line-name = "usb-power";
+	};
+};
+
+&nand {
+	status = "okay";
+
+	partitions {
+		compatible = "fixed-partitions";
+		#address-cells = <1>;
+		#size-cells = <1>;
+
+		partition@0 {
+			label = "Bootloader";
+			reg = <0x0 0x80000>;
+			read-only;
+		};
+
+		partition@80000 {
+			label = "Config";
+			reg = <0x80000 0x80000>;
+		};
+
+		factory: partition@100000 {
+			label = "Factory";
+			reg = <0x100000 0x40000>;
+			read-only;
+		};
+
+		partition@140000 {
+			label = "Kernel";
+			reg = <0x140000 0x1ec0000>;
+		};
+
+		partition@540000 {
+			label = "ubi";
+			reg = <0x540000 0x1ac0000>;
+		};
+
+		partition@2140000 {
+			label = "Kernel2";
+			reg = <0x2140000 0x1ec0000>;
+		};
+
+		partition@4000000 {
+			label = "wwan";
+			reg = <0x4000000 0x100000>;
+		};
+
+		partition@4100000 {
+			label = "data";
+			reg = <0x4100000 0x1000000>;
+		};
+
+		partition@5100000 {
+			label = "rom-d";
+			reg = <0x5100000 0x100000>;
+			read-only;
+		};
+
+		partition@5200000 {
+			label = "reserve";
+			reg = <0x5200000 0x80000>;
+		};
+	};
+};
+
+&pcie {
+       status = "okay";
+};
+
+&pcie0 {
+       status = "okay";
+       mt7615d@1,0 {
+               compatible = "pci14c3,7615";
+               reg = <0x0000 0 0 0 0>;
+               mediatek,firmware-eeprom = "mt7615e_eeprom.bin";
+               mediatek,mtd-eeprom = <&factory 0x0000>;
+               mtd-mac-address = <&factory 0xfe6e>;
+	       mtd-mac-address-increment = <1>;
+	};
+};
+
+&gmac0 {
+	mtd-mac-address = <&factory 0xfe6e>;
+};
+
+&switch0 {
+	ports {
+		port@0 {
+			status = "okay";
+			label = "lan4";
+		};
+		port@1 {
+			status = "okay";
+			label = "lan3";
+		};
+		port@2 {
+			status = "okay";
+			label = "lan2";
+		};
+		port@3 {
+			status = "okay";
+			label = "lan1";
+		};
+	};
+};
+
+
+&state_default {
+	gpio {
+		groups = "uart2", "uart3", "rgmii2", "jtag";
+		function = "gpio";
+	};
+
+};
diff --git a/target/linux/ramips/image/mt7621.mk b/target/linux/ramips/image/mt7621.mk
index 48448c2ab1..e2c9d23eee 100644
--- a/target/linux/ramips/image/mt7621.mk
+++ b/target/linux/ramips/image/mt7621.mk
@@ -1511,6 +1511,22 @@  define Device/zio_freezio
 endef
 TARGET_DEVICES += zio_freezio
 
+define Device/zyxel_lte3301-plus
+  $(Device/dsa-migration)
+  BLOCKSIZE := 128k
+  PAGESIZE := 2048
+  UBINIZE_OPTS := -E 5
+  DEVICE_VENDOR := ZyXEL
+  DEVICE_MODEL := LTE3301-PLUS
+  DEVICE_PACKAGES := kmod-mt7615e kmod-mt7615-firmware kmod-usb3 uboot-envtools kmod-usb-ledtrig-usbport kmod-usb-net-qmi-wwan kmod-usb-serial-option uqmi
+  KERNEL := $(KERNEL_DTB) | uImage lzma | zytrx-header $$(DEVICE_MODEL) $$(VERSION_DIST)-$$(REVISION)
+  KERNEL_INITRAMFS := $(KERNEL_DTB) | uImage lzma | zytrx-header $$(DEVICE_MODEL) 9.99(ABQU.1)$$(VERSION_DIST)-recovery
+  KERNEL_INITRAMFS_SUFFIX := -recovery.bin
+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
+  SUPPORTED_DEVICES += lte3301-plus
+endef
+TARGET_DEVICES += zyxel_lte3301-plus
+
 define Device/zyxel_nr7101
   $(Device/dsa-migration)
   BLOCKSIZE := 128k
diff --git a/target/linux/ramips/mt7621/base-files/etc/board.d/01_leds b/target/linux/ramips/mt7621/base-files/etc/board.d/01_leds
index 6743b7e6c3..65a808b885 100644
--- a/target/linux/ramips/mt7621/base-files/etc/board.d/01_leds
+++ b/target/linux/ramips/mt7621/base-files/etc/board.d/01_leds
@@ -98,6 +98,10 @@  xiaomi,redmi-router-ac2100)
 youhua,wr1200js)
 	ucidef_set_led_netdev "internet" "INTERNET" "green:wan" "wan"
 	;;
+zyxel,lte3301-plus)
+        ucidef_set_led_netdev "internet" "internet" "$boardname:white:internet" "wwan0" "link tx rx"
+        ucidef_set_led_usbport "usb" "USB" "$boardname:white:usb" "usb1-port2"
+        ;;
 esac
 
 board_config_flush
diff --git a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
index cde3cba9bc..01a4faf3cc 100644
--- a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
+++ b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
@@ -63,6 +63,9 @@  ramips_setup_interfaces()
 	ubnt,edgerouter-x-sfp)
 		ucidef_set_interfaces_lan_wan "eth1 eth2 eth3 eth4 eth5" "eth0"
 		;;
+        zyxel,lte3301-plus)
+                ucidef_set_interface_lan "lan1 lan2 lan3 lan4"
+		;;
 	zyxel,nr7101)
 		ucidef_set_interfaces_lan_wan "lan" "wan"
 		;;
diff --git a/target/linux/ramips/mt7621/base-files/etc/board.d/03_gpio_switches b/target/linux/ramips/mt7621/base-files/etc/board.d/03_gpio_switches
index ed728b07c4..1959d8c9d2 100644
--- a/target/linux/ramips/mt7621/base-files/etc/board.d/03_gpio_switches
+++ b/target/linux/ramips/mt7621/base-files/etc/board.d/03_gpio_switches
@@ -22,6 +22,9 @@  ubnt,edgerouter-x-sfp)
 	ucidef_add_gpio_switch "poe_power_port3" "PoE Power Port3" "403"
 	ucidef_add_gpio_switch "poe_power_port4" "PoE Power Port4" "404"
 	;;
+zyxel,lte3301-plus)
+	ucidef_add_gpio_switch "lte_power" "Power LTE modem" "507"
+	;;
 zyxel,nr7101)
 	ucidef_add_gpio_switch "lte_reset" "Reset LTE/5G modem" "483"
 	;;
diff --git a/target/linux/ramips/mt7621/base-files/etc/init.d/bootcount b/target/linux/ramips/mt7621/base-files/etc/init.d/bootcount
index a155458d3f..03c6d8eea7 100755
--- a/target/linux/ramips/mt7621/base-files/etc/init.d/bootcount
+++ b/target/linux/ramips/mt7621/base-files/etc/init.d/bootcount
@@ -16,6 +16,7 @@  boot() {
 	samknows,whitebox-v8)
 		fw_setenv bootcount 0
 		;;
+	zyxel,lte3301-plus|\
 	zyxel,nr7101)
 		[ $(printf %d $(fw_printenv -n DebugFlag)) -gt 0 ] || fw_setenv DebugFlag 0x1
 		[ $(printf %d $(fw_printenv -n Image1Stable)) -gt 0 ] || fw_setenv Image1Stable 1
diff --git a/target/linux/ramips/mt7621/base-files/lib/upgrade/platform.sh b/target/linux/ramips/mt7621/base-files/lib/upgrade/platform.sh
index d30bc3db2e..88a92cf624 100755
--- a/target/linux/ramips/mt7621/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ramips/mt7621/base-files/lib/upgrade/platform.sh
@@ -82,6 +82,7 @@  platform_do_upgrade() {
 	ubnt,edgerouter-x-sfp)
 		platform_upgrade_ubnt_erx "$1"
 		;;
+	zyxel,lte3301-plus|\
 	zyxel,nr7101)
 		fw_setenv CheckBypass 0
 		fw_setenv Image1Stable 0