ramips: mt7621: Add DNA Valokuitu Plus EX400
authorMauri Sandberg <maukka@ext.kapsi.fi>
Mon, 31 Jul 2023 12:35:46 +0000 (15:35 +0300)
committerRafał Miłecki <rafal@milecki.pl>
Mon, 16 Sep 2024 06:52:55 +0000 (08:52 +0200)
Specifications:
- Device: DNA Valokuitu Plus EX400
- SoC: MT7621A
- Flash: 256MB NAND
- RAM: 256MB
- Ethernet: Built-in, 2 x 1GbE
- Wifi: MT7603 2.4 GHz, MT7615 5 GHz (4x internal antennas)
- USB: 1x 3.0
- LED: 1x green/red, 1x green
- Buttons: Reset

MAC addresses:
- LAN:     u-boot 'ethaddr' (label)
- WAN:     label + 1
- 2.4 GHz: label + 6
- 5 GHz:   label + 7

Serial:
 There is a black block connector next to the red ethernet connector. It
 is accessible also through holes in the casing.

Pinout (TTL 3.3V)
 +---+---+
 |Tx |Rx |
 +---+---+
 |Vcc|Gnd|
 +---+---+

Firmware:
 The vendor firmware is a fork of OpenWrt (Reboot) with a kernel version
 4.4.93. The flash is arranged as below and there is a dual boot
 mechanism alternating between rootfs_0 and rootfs_1.

 +-------+------+------+-----------+-----------+
 |       | env1 | env2 | rootfs_0  |  rootfs_1 |
 |       +------+------+-----------+-----------+
 |       |         UBI volumes                 |
 +-------+-------------------------------------+
 |U-Boot |             UBI                     |
 +-------+-------------------------------------+
 |mtd0   |             mtd1                    |
 +-------+-------------------------------------+
 |                     NAND                    |
 +---------------------------------------------+

 In OpenWrt rootfs_0 will be used as a boot partition that will contain the
 kernel and the dtb. The squashfs rootfs and overlay are standard OpenWrt
 behaviour.

 +-------+------+------+-----------+--------+------------+
 |       | env1 | env2 | rootfs_0  | rootfs | rootfs_data|
 |       +------+------+-----------+--------+------------+
 |       |         UBI volumes                           |
 +-------+-----------------------------------------------+
 |U-Boot |             UBI                               |
 +-------+-----------------------------------------------+
 |mtd0   |             mtd1                              |
 +-------+-----------------------------------------------+
 |                     NAND                              |
 +-------------------------------------------------------+

U-boot:
 With proper serial access booting can be halted to U-boot by pressing any
 key. TFTP and flash writes are available, but only the first one has been
 tested.

 NOTE: Recovery mode can be accessed by holding down the reset button while
 powering on the device. The led 'Update' will show a solid green light
 once ready. A web server will be running at 192.168.1.1:80 and it will
 allow flashing a firmware package. You can cycle between rootfs_0 and
 rootfs_1 by pressing the reset button once.

Root password:
 With the vendor web UI create a backup of your settings and download the
 archive to your computer. Within the archive in the file
 /etc/shadow replace the password hash for root with that of a password you
 know. Restore the configuration with the vendor web UI and you will have
 changed the root password.

SSH access:
 You might need to enable the SSH service for LAN interface as by default
 it's enabled for WAN only.

Installing OpenWrt:
 With the vendor web UI install the OpenWrt factory image. Alternatively,
 ssh to the device and use sysupgrade -n from cli.

 Finalize by installing the OpenWrt sysupgrade image to get a fully
 functioning system.

Reverting to the vendor firmware:

 Boot with OpenWrt initramfs image
  - Remove volumes rootfs_0, rootfs and rootfs_data and create vendor
    volumes.

    ubirmvol /dev/ubi0 -n 2
    ubirmvol /dev/ubi0 -n 3
    ubirmvol /dev/ubi0 -n 4
    ubimkvol /dev/ubi0 -N rootfs_0 -S 990
    ubimkvol /dev/ubi0 -N rootfs_1 -S 990

 Power off and enter to the U-boot recovery to install the vendor
 firmware.

Known issues:
 - MACs for wifi are stored in currently unknown place but it seems
   to persist over power-off. They might be stored on the chip.

Signed-off-by: Mauri Sandberg <maukka@ext.kapsi.fi>
[rmilecki: try NVMEM for MACs]
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
package/boot/uboot-envtools/files/ramips
target/linux/ramips/dts/mt7621_dna_valokuitu-plus-ex400.dts [new file with mode: 0644]
target/linux/ramips/image/mt7621.mk
target/linux/ramips/mt7621/base-files/etc/board.d/02_network
target/linux/ramips/mt7621/base-files/etc/init.d/bootcount
target/linux/ramips/mt7621/base-files/lib/upgrade/dna.sh [new file with mode: 0644]
target/linux/ramips/mt7621/base-files/lib/upgrade/platform.sh

index cca394a03b01bddfa96c701afe95a5ebc723cea1..97e9fc2b1c0f75e1cab1b367bebc1957984356cf 100644 (file)
@@ -146,6 +146,10 @@ xiaomi,mi-router-cr6608|\
 xiaomi,mi-router-cr6609)
        ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x10000" "0x20000"
        ;;
+dna,valokuitu-plus-ex400)
+       ubootenv_add_uci_config "/dev/ubi0_0" "0x0" "0x1f000" "0x1f000" "1"
+       ubootenv_add_uci_config "/dev/ubi0_1" "0x0" "0x1f000" "0x1f000" "1"
+       ;;
 netgear,wax214v2)
        ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000" "0x20000"
        ubootenv_add_uci_sys_config "/dev/mtd1" "0x20000" "0x8000" "0x20000"
diff --git a/target/linux/ramips/dts/mt7621_dna_valokuitu-plus-ex400.dts b/target/linux/ramips/dts/mt7621_dna_valokuitu-plus-ex400.dts
new file mode 100644 (file)
index 0000000..98b2bbf
--- /dev/null
@@ -0,0 +1,130 @@
+// 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>
+#include <dt-bindings/leds/common.h>
+
+/ {
+       compatible = "dna,valokuitu-plus-ex400", "mediatek,mt7621-soc";
+       model = "DNA Valokuitu Plus EX400";
+
+       aliases {
+               ethernet0 = &gmac0;
+               label-mac-device = &gmac0;
+               led-boot = &led_status_red;
+               led-failsafe = &led_status_red;
+               led-running = &led_status_green;
+               led-upgrade = &led_update_green;
+       };
+
+       chosen {
+               bootargs-override = "console=ttyS0,115200 rootfstype=squashfs,jffs2";
+       };
+
+       keys {
+               compatible = "gpio-keys";
+
+               reset {
+                       label = "reset";
+                       gpios = <&gpio 18 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_RESTART>;
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               led_status_green: led-0 {
+                       color = <LED_COLOR_ID_GREEN>;
+                       function = LED_FUNCTION_STATUS;
+                       gpios = <&gpio 8 GPIO_ACTIVE_LOW>;
+               };
+
+               led_status_red: led-1 {
+                       color = <LED_COLOR_ID_RED>;
+                       function = LED_FUNCTION_STATUS;
+                       gpios = <&gpio 11 GPIO_ACTIVE_HIGH>;
+               };
+
+               led_update_green: led-2 {
+                       color = <LED_COLOR_ID_GREEN>;
+                       function = LED_FUNCTION_PROGRAMMING;
+                       gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
+               };
+       };
+};
+
+&pcie {
+       status = "okay";
+};
+
+&nand {
+       status = "okay";
+
+       partitions {
+               compatible = "fixed-partitions";
+               #address-cells = <1>;
+               #size-cells = <1>;
+
+               partition@0 {
+                       reg = <0x00 0x100000>;
+                       label = "uboot";
+                       read-only;
+               };
+
+               partition@100000 {
+                       reg = <0x100000 0xff00000>;
+                       label = "ubi";
+
+                       volumes {
+                               ubi-volume-env1 {
+                                       volname = "env1";
+
+                                       nvmem-layout {
+                                               compatible = "u-boot,env";
+
+                                               ethaddr: ethaddr {
+                                                       #nvmem-cell-cells = <1>;
+                                               };
+                                       };
+                               };
+                       };
+               };
+       };
+};
+
+&gmac1 {
+       label = "wan";
+       phy-handle = <&ethphy0>;
+       nvmem-cells = <&ethaddr 1>;
+       nvmem-cell-names = "mac-address";
+       status = "okay";
+};
+
+&i2c {
+       status = "okay";
+};
+
+&ethphy0 {
+       /delete-property/ interrupts;
+};
+
+&state_default {
+       gpio {
+               groups = "uart2", "uart3";
+               function = "gpio";
+       };
+};
+
+&switch0 {
+       ports {
+               port@1 {
+                       label = "lan";
+                       nvmem-cells = <&ethaddr 0>;
+                       nvmem-cell-names = "mac-address";
+                       status = "okay";
+               };
+       };
+};
index 18dbbcadf31d7b6268dd7c23eb72fe8645ef23b7..bf700674ef53b00c04b92730c3d334fcff6494af 100644 (file)
@@ -36,6 +36,68 @@ define Build/arcadyan-trx
        rm $@.hsqs $@.tail
 endef
 
+define Build/dna-header
+       BC='$(STAGING_DIR_HOST)/bin/bc' ;\
+       ubifsofs="1024" ;\
+       ubifs="$$(stat -c%s $@)" ;\
+       pkginfoofs="$$(echo $${ubifsofs} + $${ubifs} | $${BC})" ;\
+       pkginfo="0" ;\
+       scrofs="$$(echo $${pkginfoofs} + $${pkginfo} | $${BC})" ;\
+       scr="0" ;\
+       sigofs="$$(echo $${scrofs} + $${scr} | $${BC})" ;\
+       sig="0" ;\
+       md5ofs="$$(echo $${sigofs} + $${sig} | $${BC})" ;\
+       md5="32" ;\
+       size="$$(echo $${md5ofs} + $${md5} | $${BC})" ;\
+       echo "IntenoIopY" > $@.tmp ;\
+       echo "version 5" >> $@.tmp ;\
+       echo "integrity MD5SUM" >> $@.tmp ;\
+       echo "board EX400" >> $@.tmp ;\
+       echo "chip 7621" >> $@.tmp ;\
+       echo "arch all mipsel_1004kc" >> $@.tmp ;\
+       echo "model EX400" >> $@.tmp ;\
+       echo "release EX400-X-DNA-4.3.6.100-R-210518_0935" >> $@.tmp ;\
+       echo "customer DNA" >> $@.tmp ;\
+       echo "ubifsofs $${ubifsofs}" >> $@.tmp ;\
+       echo "ubifs $${ubifs}" >> $@.tmp ;\
+       echo "pkginfoofs $${pkginfoofs}" >> $@.tmp ;\
+       echo "pkginfo $${pkginfo}" >> $@.tmp ;\
+       echo "scrofs $${scrofs}" >> $@.tmp ;\
+       echo "scr $${scr}" >> $@.tmp ;\
+       echo "sigofs $${sigofs}" >> $@.tmp ;\
+       echo "sig $${sig}" >> $@.tmp ;\
+       echo "md5ofs $${md5ofs}" >> $@.tmp ;\
+       echo "md5 $${md5}" >> $@.tmp ;\
+       echo "size $${size}" >> $@.tmp
+
+       dd if=$@.tmp of=$@.tmp2 bs=1024 count=1 conv=sync
+       cat $@.tmp2 $@ > $@.tmp
+       rm $@.tmp2
+       mv $@.tmp $@
+endef
+
+define Build/dna-bootfs
+       mkdir -p $@.ubifs-dir/boot
+
+       # populate the boot fs with the dtb and with either initramfs kernel or
+       # the normal kernel
+       $(CP) $(KDIR)/image-$(firstword $(DEVICE_DTS)).dtb $@.ubifs-dir/boot/dtb
+
+       $(if $(findstring with-initrd,$(word 1,$(1))),\
+               ( \
+                       $(CP) $@ $@.ubifs-dir/boot/uImage \
+               ) , \
+               ( \
+                       $(CP) $(IMAGE_KERNEL) $@.ubifs-dir/boot/uImage \
+               ) \
+       )
+
+       # create ubifs
+       $(STAGING_DIR_HOST)/bin/mkfs.ubifs ${MKUBIFS_OPTS} -r $@.ubifs-dir/ -o $@.new
+       rm -rf $@.ubifs-dir
+       mv $@.new $@
+endef
+
 define Build/gemtek-trailer
        printf "%s%08X" ".GEMTEK." "$$(cksum $@ | cut -d ' ' -f1)" >> $@
 endef
@@ -103,6 +165,10 @@ define Build/iodata-mstc-header2
        mv $@.new $@
 endef
 
+define Build/kernel-initramfs-bin
+       $(CP) $(KDIR)/vmlinux-initramfs $@
+endef
+
 define Build/znet-header
        $(eval version=$(word 1,$(1)))
        $(eval magic=$(if $(word 2,$(1)),$(word 2,$(1)),ZNET))
@@ -988,6 +1054,27 @@ define Device/d-team_pbr-m1
 endef
 TARGET_DEVICES += d-team_pbr-m1
 
+define Device/dna_valokuitu-plus-ex400
+  $(Device/dsa-migration)
+  IMAGE_SIZE := 117m
+  PAGESIZE := 2048
+  MKUBIFS_OPTS := --min-io-size=$$(PAGESIZE) --leb-size=124KiB --max-leb-cnt=96 \
+                 --log-lebs=2 --space-fixup --squash-uids
+  DEVICE_VENDOR := DNA
+  DEVICE_MODEL := Valokuitu Plus EX400
+  KERNEL := kernel-bin | lzma | uImage lzma
+  KERNEL_INITRAMFS := kernel-bin | append-dtb | lzma | uImage lzma
+  IMAGES := factory.bin sysupgrade.tar
+  IMAGE/factory.bin := kernel-initramfs-bin | lzma | uImage lzma | \
+                       dna-bootfs with-initrd | dna-header | \
+                       append-md5sum-ascii-salted
+  IMAGE/sysupgrade.tar := dna-bootfs | sysupgrade-tar kernel=$$$$@ | check-size | \
+                         append-metadata
+  DEVICE_IMG_NAME = $$(DEVICE_IMG_PREFIX)-$$(2)
+  DEVICE_PACKAGES := kmod-mt7603 kmod-mt7615-firmware kmod-usb3
+endef
+TARGET_DEVICES += dna_valokuitu-plus-ex400
+
 define Device/edimax_ra21s
   $(Device/dsa-migration)
   $(Device/uimage-lzma-loader)
index b7e3a49b43bfa15d68454440545de9a1a7467a85..f251daddd5efea7a6944b2551e9184aa5ff0f38e 100644 (file)
@@ -67,6 +67,7 @@ ramips_setup_interfaces()
                ucidef_set_interface_lan "lan"
                ;;
        asiarf,ap7621-001|\
+       dna,valokuitu-plus-ex400|\
        humax,e10|\
        keenetic,kn-3510|\
        openfi,5pro|\
index 06846cd4ca40fc1fcb9502f7dc9f132402c3c465..b83223e7ddd7571e385750444d7be1e8ebec5449 100755 (executable)
@@ -32,6 +32,10 @@ boot() {
        samknows,whitebox-v8)
                fw_setenv bootcount 0
                ;;
+       dna,valokuitu-plus-ex400)
+               fw_setenv boot_cnt_primary 0
+               fw_setenv boot_cnt_alt 0
+               ;;
        zyxel,lte3301-plus)
                [ $(printf %d $(fw_printenv -n DebugFlag)) -gt 0 ] || fw_setenv DebugFlag 1
                [ $(printf %d $(fw_printenv -n Image1Stable)) -gt 0 ] || fw_setenv Image1Stable 1
diff --git a/target/linux/ramips/mt7621/base-files/lib/upgrade/dna.sh b/target/linux/ramips/mt7621/base-files/lib/upgrade/dna.sh
new file mode 100644 (file)
index 0000000..d699516
--- /dev/null
@@ -0,0 +1,44 @@
+#
+# Copyright (C) 2023 Mauri Sandberg
+#
+
+# The vendor UBI is split in volumes 0-3. Volumes 0 and 1 contain U-Boot
+# environments env1 and env2, respectively. The vendor root file systems
+# are in volumes 2 (rootfs_0) and 3 (rootfs_1). Drop the two roots and
+# explicitly use rootfs_0 as a boot partition that contains the dtb and the
+# OpenWrt kernel. This is because the vendor U-Boot expects to find them there.
+# Then continue upgrade with the default method - a SquashFS rootfs will be
+# installed and the rest of UBI will be used as an overlay.
+
+# The 'kernel' inside the sysupgrage.tar is an UBIFS image that contains
+# /boot/dtb and /boot/kernel. The 'root' is an OpenWrt SquashFS root
+
+. /lib/functions.sh
+. /lib/upgrade/nand.sh
+
+dna_do_upgrade () {
+       tar -xaf $1
+
+       # get the size of the new bootfs
+       local _bootfs_size=$(wc -c < ./sysupgrade-dna_valokuitu-plus-ex400/kernel)
+       [ -n "$_bootfs_size" -a "$_bootfs_size" -gt "0" ] || nand_do_upgrade_failed
+
+       # remove existing rootfses and recreate rootfs_0
+       ubirmvol /dev/ubi0 --name=rootfs_0 > /dev/null 2>&1
+       ubirmvol /dev/ubi0 --name=rootfs_1 > /dev/null 2>&1
+       ubirmvol /dev/ubi0 --name=rootfs > /dev/null 2>&1
+       ubirmvol /dev/ubi0 --name=rootfs_data > /dev/null 2>&1
+       ubimkvol /dev/ubi0 --type=static --size=${_bootfs_size} --name=rootfs_0
+
+       # update the rootfs_0 contents
+       local _kern_ubivol=$( nand_find_volume "ubi0" "rootfs_0" )
+       ubiupdatevol /dev/${_kern_ubivol} sysupgrade-dna_valokuitu-plus-ex400/kernel
+
+       fw_setenv root_vol rootfs_0
+       fw_setenv boot_cnt_primary 0
+       fw_setenv boot_cnt_alt 0
+
+       # proceed to upgrade the default way
+       CI_KERNPART=none
+       nand_do_upgrade "$1"
+}
index bad7e30ca65ebfa87ef31e62121edaf27cb92bb7..f0d41b0914051595ccdc24632002d66016677437 100755 (executable)
@@ -150,6 +150,9 @@ platform_do_upgrade() {
        buffalo,wsr-2533dhpls)
                buffalo_do_upgrade "$1"
                ;;
+       dna,valokuitu-plus-ex400)
+               dna_do_upgrade "$1"
+               ;;
        elecom,wrc-x1800gs)
                [ "$(fw_printenv -n bootmenu_delay)" != "0" ] || \
                        fw_setenv bootmenu_delay 3