[openwrt/openwrt] mvebu: add support for IIJ SA-W2

LEDE Commits lede-commits at lists.infradead.org
Tue Oct 31 06:03:01 PDT 2023


hauke pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/c441f9b2c591189187128e8beb4b20bea6dccd06

commit c441f9b2c591189187128e8beb4b20bea6dccd06
Author: INAGAKI Hiroshi <musashino.open at gmail.com>
AuthorDate: Sun Nov 13 17:22:26 2022 +0900

    mvebu: add support for IIJ SA-W2
    
    Internet Initiative Japan Inc. (IIJ) SA-W2 is a network appliance with
    11ac (Wi-Fi 5) wlan, based on 88F6810.
    
    Specification:
    
    - SoC         : Marvell Armada 380 88F6810
    - RAM         : DDR3 256 MiB (Micron MT41K64M16TW-107:J x2)
    - Flash       : SPI-NOR 32 MiB (Winbond W25Q256JVFIQ)
    - WLAN        : 2.4/5 GHz, Mini PCI-E
      - 2.4 GHz   : Silex SX-PCEGN (Atheros AR9287 (2T2R))
      - 5 GHz     : Silex SX-PCEAC (Qualcomm Atheros QCA9880 (3T3R))
    - Ethernet    : 10/100/1000 Mbps x5
      - Switch    : Marvell 88E6172
    - LEDs/Keys   : 12x/1x
    - UART        : "CONSOLE" port (RJ-45, RS-232C)
      - settings  : 115200n8
      - assignment: 1:NC,  2:NC,  3:TXD, 4:GND,
                    5:GND, 6:RXD, 7:NC,  8:NC
      - note      : compatible with Cisco console cable
    - Power       : DC Input or PoE
      - DC Input  : 12 VDC, 3 A
      - PoE       : 802.3af
        - module  : Silvertel Ag9712-2BR
        - note    : USB ports shouldn't be used when powered by PoE
    - Bootloader  : PMON2000 based
    - Stock       : NetBSD based
    
    Flash instruction using sysupgrade image:
    
    1. Prepare TFTP server with IP address 192.168.0.10 and put sysupgrade
       image to TFTP directory
    2. Connect PC to "GE0/PoE" port on SA-W2
    3. Power on SA-W2, interrupt count-down by Esc and enter to bootloader
       CLI
    4. Set IP address of the device
    
       address 192.168.0.1
    
    5. Download sysupgrade image and flash to storage
    
       tftpload 192.168.0.10 <image name>
       firmwrite
    
       example:
    
       #tftpload 192.168.0.10 openwrt-mvebu-cortexa9-iij_sa-w2-squashfs-sysupgrade.bin
       Loading openwrt-mvebu-cortexa9-iij_sa-w2-squashfs-sysupgrade.bin
       loaded 8127268 byte(s)
       #firmwrite
       Erasing FLASH block  32 Done 0x00200000.
       Erasing FLASH block  33 Done 0x00210000.
       ...
       Erasing FLASH block 155 Done 0x009b0000.
       Erasing FLASH block 156 Done 0x009c0000.
       Programming FLASH. Done.
       Verifying FLASH. No Errors found.
    
    6. Check the flashed firmware
    
       firmcheck
    
       example:
    
       #firmcheck
       [Normal firmware]
       ident: 'SEIL2015'
       copyright: 'ARM OpenWrt Linux-5.15.93'
       version format: 1
       version major: 9
       version minor: 99
       version release: 'r22060+36-5163bb5e54'
       body size: 3578524
       checksum: 0x8a083cb8
    
       [Rescue firmware]
       ident: 'SEIL2015'
       copyright: 'Copyright (c) 2017 Internet Initiative Japan Inc. All rights reserved.'
       version format: 1
       version major: 3
       version minor: 70
       version release: 'Release'
       body size: 10152458
       checksum: 0x8f9518c2
    
    7. Boot with the flashed firmware
    
       boot
    
    Note:
    
    - The bootloader on this device is not U-Boot and it's environment space
      ("bootloader-env") has no compatibility with U-Boot tools.
    
    - eth1 is connected to port6 of 88E6172 switch, but multi-cpu port can't
      be handled on Linux Kernel and not defined.
    
    - Powering by PoE hasn't been tested yet.
    
    - This device has 2x OS images on flash and they can be switched by
      setting "BOOTDEV" variable on bootloader CLI.
      That variable supports the following values:
    
      - "flash" : primary image on flash ("firmware")
      - "rescue": secondary image on flash ("rescue")
      - "usb"   : usb storage (broken?)
      - "lan0/1": network
    
      command to set:
    
      set BOOTDEV=<dev>
    
      example:
    
        set BOOTDEV=rescue
    
      This commit also supports booting from secondary partition.
    
    - To execute initramfs image on bootloader CLI, use "go" command.
      ("go" command is not listed on the output of "help", but available)
    
      example (download and execute):
    
        address 192.168.0.1
        tftpload 192.168.0.10 openwrt-mvebu-cortexa9-iij_sa-w2-initramfs-kernel.bin
        go
    
    MAC addresses:
    
    LAN    : 00:E0:4D:xx:xx:19 (none)
    WAN    : 00:E0:4D:xx:xx:18 (board_info, 0x6 (hex))
    2.4 GHz: 84:25:3F:xx:xx:xx (Mini PCI-E card)
    5 GHz  : 84:25:3F:xx:xx:xx (Mini PCI-E card)
    
    Signed-off-by: INAGAKI Hiroshi <musashino.open at gmail.com>
---
 .../cortexa9/base-files/etc/board.d/02_network     |   3 +
 .../cortexa9/base-files/lib/upgrade/platform.sh    |  14 +
 .../arch/arm/boot/dts/armada-380-iij-sa-w2.dts     | 390 +++++++++++++++++++++
 target/linux/mvebu/image/cortexa9.mk               |  31 ++
 4 files changed, 438 insertions(+)

diff --git a/target/linux/mvebu/cortexa9/base-files/etc/board.d/02_network b/target/linux/mvebu/cortexa9/base-files/etc/board.d/02_network
index 147ae0b31f..5c176d4963 100644
--- a/target/linux/mvebu/cortexa9/base-files/etc/board.d/02_network
+++ b/target/linux/mvebu/cortexa9/base-files/etc/board.d/02_network
@@ -30,6 +30,9 @@ mvebu_setup_interfaces()
 	fortinet,fg-50e)
 		ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4 lan5" "eth1 eth2"
 		;;
+	iij,sa-w2)
+		ucidef_set_interfaces_lan_wan "ge1_0 ge1_1 ge1_2 ge1_3" "ge0"
+		;;
 	iptime,nas1dual)
 		ucidef_set_interface_lan "eth0 eth1" "dhcp"
 		;;
diff --git a/target/linux/mvebu/cortexa9/base-files/lib/upgrade/platform.sh b/target/linux/mvebu/cortexa9/base-files/lib/upgrade/platform.sh
index 8432fdbfc8..7f45aa8a91 100755
--- a/target/linux/mvebu/cortexa9/base-files/lib/upgrade/platform.sh
+++ b/target/linux/mvebu/cortexa9/base-files/lib/upgrade/platform.sh
@@ -56,6 +56,20 @@ platform_do_upgrade() {
 	fortinet,fg-50e)
 		fortinet_do_upgrade "$1"
 		;;
+	iij,sa-w2)
+		local envmtd=$(find_mtd_part "bootloader-env")
+		local bootdev=$(grep "BOOTDEV=" "$envmtd")
+		case "${bootdev#*=}" in
+		flash)  PART_NAME="firmware" ;;
+		rescue) PART_NAME="rescue"   ;;
+		*)
+			echo "invalid BOOTDEV is set (\"${bootdev#*=}\")"
+			umount -a
+			reboot -f
+			;;
+		esac
+		default_do_upgrade "$1"
+		;;
 	linksys,wrt1200ac|\
 	linksys,wrt1900ac-v1|\
 	linksys,wrt1900ac-v2|\
diff --git a/target/linux/mvebu/files/arch/arm/boot/dts/armada-380-iij-sa-w2.dts b/target/linux/mvebu/files/arch/arm/boot/dts/armada-380-iij-sa-w2.dts
new file mode 100644
index 0000000000..d2483611ae
--- /dev/null
+++ b/target/linux/mvebu/files/arch/arm/boot/dts/armada-380-iij-sa-w2.dts
@@ -0,0 +1,390 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+/dts-v1/;
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/leds/common.h>
+#include "armada-380.dtsi"
+
+/ {
+	model = "IIJ SA-W2";
+	compatible = "iij,sa-w2", "marvell,armada380";
+
+	aliases {
+		led-boot = &led_power_green;
+		led-failsafe = &led_power_red;
+		led-running = &led_power_green;
+		led-upgrade = &led_power_green;
+		label-mac-device = &ge0;
+	};
+
+	chosen {
+		stdout-path = "serial0:115200n8";
+	};
+
+	memory at 0 {
+		device_type = "memory";
+		reg = <0x00000000 0x10000000>; /* 256MB */
+	};
+
+	soc {
+		ranges = <MBUS_ID(0xf0, 0x01) 0 0xd0000000 0x100000
+			  MBUS_ID(0x01, 0x1d) 0 0xfff00000 0x100000
+			  MBUS_ID(0x09, 0x19) 0 0xf1100000 0x10000
+			  MBUS_ID(0x09, 0x15) 0 0xf1110000 0x10000
+			  MBUS_ID(0x0c, 0x04) 0 0xf1200000 0x100000>;
+
+		pcie {
+			status = "okay";
+
+			pcie at 1,0 {
+				status = "okay";
+			};
+
+			pcie at 3,0 {
+				status = "okay";
+			};
+		};
+	};
+
+	keys {
+		compatible = "gpio-keys";
+		pinctrl-names = "default";
+		pinctrl-0 = <&pmx_keys_pins>;
+
+		button-init {
+			label = "init";
+			linux,code = <KEY_RESTART>;
+			gpios = <&gpio0 18 GPIO_ACTIVE_LOW>;
+		};
+	};
+
+	leds {
+		compatible = "gpio-leds";
+		pinctrl-names = "default";
+		pinctrl-0 = <&pmx_leds_pins>;
+
+		led-0 {
+			label = "green:wlan5g";
+			gpios = <&gpio0 19 GPIO_ACTIVE_HIGH>;
+			color = <LED_COLOR_ID_GREEN>;
+			linux,default-trigger = "phy0tpt";
+		};
+
+		led-1 {
+			label = "red:wlan5g";
+			gpios = <&gpio0 20 GPIO_ACTIVE_HIGH>;
+			color = <LED_COLOR_ID_RED>;
+		};
+
+		led-2 {
+			label = "green:status";
+			gpios = <&gpio1 1 GPIO_ACTIVE_HIGH>;
+			color = <LED_COLOR_ID_GREEN>;
+			function = LED_FUNCTION_STATUS;
+		};
+
+		led-3 {
+			label = "red:status";
+			gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
+			color = <LED_COLOR_ID_RED>;
+			function = LED_FUNCTION_STATUS;
+		};
+
+		led-4 {
+			label = "green:mobile";
+			gpios = <&gpio1 3 GPIO_ACTIVE_HIGH>;
+			color = <LED_COLOR_ID_GREEN>;
+		};
+
+		led-5 {
+			label = "red:mobile";
+			gpios = <&gpio1 4 GPIO_ACTIVE_HIGH>;
+			color = <LED_COLOR_ID_RED>;
+		};
+
+		led-6 {
+			label = "green:wlan2g";
+			gpios = <&gpio1 12 GPIO_ACTIVE_HIGH>;
+			color = <LED_COLOR_ID_GREEN>;
+			linux,default-trigger = "phy1tpt";
+		};
+
+		led-7 {
+			label = "red:wlan2g";
+			gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>;
+			color = <LED_COLOR_ID_RED>;
+		};
+
+		led_power_green: led-8 {
+			label = "green:power";
+			gpios = <&gpio1 14 GPIO_ACTIVE_LOW>;
+			color = <LED_COLOR_ID_GREEN>;
+		};
+
+		led_power_red: led-9 {
+			label = "red:power";
+			gpios = <&gpio1 15 GPIO_ACTIVE_HIGH>;
+			color = <LED_COLOR_ID_RED>;
+		};
+
+		led-10 {
+			label = "green:usb1";
+			gpios = <&gpio1 22 GPIO_ACTIVE_LOW>;
+			color = <LED_COLOR_ID_GREEN>;
+			linux,default-trigger = "usbport";
+			trigger-sources = <&hub_port2>;
+		};
+
+		led-11 {
+			label = "green:usb0";
+			gpios = <&gpio1 23 GPIO_ACTIVE_LOW>;
+			color = <LED_COLOR_ID_GREEN>;
+			linux,default-trigger = "usbport";
+			trigger-sources = <&hub_port1>;
+		};
+	};
+
+	regulator-vbus-usb0 {
+		compatible = "regulator-fixed";
+		regulator-name = "vbus-usb0";
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+		gpio = <&gpio1 20 GPIO_ACTIVE_HIGH>;
+		enable-active-high;
+		regulator-always-on;
+	};
+
+	regulator-vbus-usb1 {
+		compatible = "regulator-fixed";
+		regulator-name = "vbus-usb1";
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+		gpio = <&gpio1 21 GPIO_ACTIVE_HIGH>;
+		enable-active-high;
+		regulator-always-on;
+	};
+};
+
+&uart0 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&uart0_pins>;
+	status = "okay";
+};
+
+&pinctrl {
+	pmx_usb_pins: usb-pins {
+		marvell,pins = "mpp2",		 /* smsc usb2514b reset */
+			       "mpp48", "mpp49", /* port over current */
+			       "mpp52", "mpp53"; /* port vbus */
+		marvell,function = "gpio";
+	};
+
+	pmx_keys_pins: keys-pins {
+		marvell,pins = "mpp18";
+		marvell,function = "gpio";
+	};
+
+	pmx_leds_pins: leds-pins {
+		marvell,pins = "mpp19", "mpp20", "mpp33", "mpp34", "mpp35",
+			       "mpp36", "mpp44", "mpp45", "mpp46", "mpp47",
+			       "mpp54", "mpp55";
+		marvell,function = "gpio";
+	};
+};
+
+&gpio0 {
+	usb-hub-reset {
+		gpio-hog;
+		gpios = <2 GPIO_ACTIVE_HIGH>;
+		output-high;
+	};
+};
+
+&usb0 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&pmx_usb_pins>;
+	status = "okay";
+	#address-cells = <1>;
+	#size-cells = <0>;
+
+	/* SMSC USB2514B on PCB */
+	hub at 1 {
+		compatible = "usb424,2514";
+		reg = <1>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		hub_port1: port at 1 {
+			reg = <1>;
+			#trigger-source-cells = <0>;
+		};
+
+		hub_port2: port at 2 {
+			reg = <2>;
+			#trigger-source-cells = <0>;
+		};
+	};
+};
+
+&bm {
+	status = "okay";
+};
+
+&bm_bppi {
+	status = "okay";
+};
+
+&eth1 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&ge1_rgmii_pins>;
+	status = "okay";
+
+	phy-connection-type = "rgmii-id";
+	buffer-manager = <&bm>;
+	bm,pool-long = <2>;
+	bm,pool-short = <3>;
+
+	nvmem-cells = <&macaddr_bdinfo_6 1>;
+	nvmem-cell-names = "mac-address";
+
+	fixed-link {
+		speed = <1000>;
+		full-duplex;
+	};
+};
+
+&mdio {
+	pinctrl-names = "default";
+	pinctrl-0 = <&mdio_pins>;
+	status = "okay";
+
+	/* Marvell 88E6172 */
+	switch at 0 {
+		compatible = "marvell,mv88e6085";
+		reg = <0x0>;
+		interrupt-controller;
+		#interrupt-cells = <2>;
+		interrupt-parent = <&gpio1>;
+		interrupts = <10 IRQ_TYPE_LEVEL_LOW>;
+
+		ports {
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			port at 0 {
+				reg = <0>;
+				label = "ge1_0";
+			};
+
+			port at 1 {
+				reg = <1>;
+				label = "ge1_1";
+			};
+
+			port at 2 {
+				reg = <2>;
+				label = "ge1_2";
+			};
+
+			port at 3 {
+				reg = <3>;
+				label = "ge1_3";
+			};
+
+			ge0: port at 4 {
+				reg = <4>;
+				label = "ge0";
+				nvmem-cells = <&macaddr_bdinfo_6 0>;
+				nvmem-cell-names = "mac-address";
+			};
+
+			/*
+			 * eth0 is connected to port5 for WAN connection
+			 * on port4 ("GE0")
+			 */
+
+			port at 6 {
+				reg = <6>;
+				label = "cpu";
+				ethernet = <&eth1>;
+				phy-connection-type = "rgmii-id";
+
+				fixed-link {
+					speed = <1000>;
+					full-duplex;
+				};
+			};
+		};
+	};
+};
+
+&rtc {
+	status = "disabled";
+};
+
+&spi1 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&spi1_pins>;
+	status = "okay";
+
+	flash at 0 {
+		compatible = "jedec,spi-nor";
+		reg = <0>;
+		spi-max-frequency = <40000000>;
+
+		partitions {
+			compatible = "fixed-partitions";
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			partition at 0 {
+				reg = <0x0 0x100000>;
+				label = "bootloader";
+				read-only;
+			};
+
+			partition at 100000 {
+				reg = <0x100000 0x10000>;
+				label = "bootloader-env";
+				read-only;
+			};
+
+			partition at 110000 {
+				compatible = "nvmem-cells";
+				reg = <0x110000 0xf0000>;
+				label = "board_info";
+				read-only;
+
+				nvmem-layout {
+					compatible = "fixed-layout";
+					#address-cells = <1>;
+					#size-cells = <1>;
+
+					macaddr_bdinfo_6: macaddr at 6 {
+						compatible = "mac-base";
+						reg = <0x6 0x6>;
+						#nvmem-cell-cells = <1>;
+					};
+				};
+			};
+
+			partition at 200000 {
+				compatible = "iij,seil-firmware";
+				reg = <0x200000 0xf00000>;
+				label = "firmware";
+				iij,bootdev-name = "flash";
+				iij,seil-id = <0x5345494c 0x32303135>;
+			};
+
+			partition at 1100000 {
+				compatible = "iij,seil-firmware";
+				reg = <0x1100000 0xf00000>;
+				label = "rescue";
+				iij,bootdev-name = "rescue";
+				iij,seil-id = <0x5345494c 0x32303135>;
+			};
+		};
+	};
+};
diff --git a/target/linux/mvebu/image/cortexa9.mk b/target/linux/mvebu/image/cortexa9.mk
index 27f41c58a8..3234d62cd9 100644
--- a/target/linux/mvebu/image/cortexa9.mk
+++ b/target/linux/mvebu/image/cortexa9.mk
@@ -16,6 +16,23 @@ define Build/fortigate-header
   mv $@.new $@
 endef
 
+define Build/seil-header
+  ( \
+    data_size_crc="$$(gzip -c $@ | tail -c8 | \
+        od -An -tx8 --endian little | tr -d ' \n')"; \
+    printf "SEIL2015"; \
+    printf "$(call toupper,$(LINUX_KARCH)) $(VERSION_DIST) Linux-$(LINUX_VERSION)" | \
+        dd bs=80 count=1 conv=sync 2>/dev/null; \
+    printf "$$(echo $${data_size_crc:8:8} | sed 's/../\\x&/g')"; \
+    printf "\x00\x00\x00\x01\x00\x00\x00\x09\x00\x00\x00\x63"; \
+    printf "$(REVISION)" | dd bs=32 count=1 conv=sync 2>/dev/null; \
+    printf "\x00\x00\x00\x00"; \
+    printf "$$(echo $${data_size_crc:0:8} | sed 's/../\\x&/g')"; \
+    cat $@; \
+  ) > $@.new
+  mv $@.new $@
+endef
+
 define Device/dsa-migration
   DEVICE_COMPAT_VERSION := 1.1
   DEVICE_COMPAT_MESSAGE := Config cannot be migrated from swconfig to DSA
@@ -134,6 +151,20 @@ define Device/globalscale_mirabox
 endef
 TARGET_DEVICES += globalscale_mirabox
 
+define Device/iij_sa-w2
+  DEVICE_VENDOR := IIJ
+  DEVICE_MODEL := SA-W2
+  SOC := armada-380
+  KERNEL := kernel-bin | append-dtb | seil-header
+  DEVICE_DTS := armada-380-iij-sa-w2
+  IMAGE_SIZE := 15360k
+  IMAGE/sysupgrade.bin := append-kernel | pad-to 64k | \
+    append-rootfs | pad-rootfs | check-size | append-metadata
+  DEVICE_PACKAGES := kmod-ath9k kmod-ath10k-ct ath10k-firmware-qca988x-ct \
+    wpad-basic-mbedtls
+endef
+TARGET_DEVICES += iij_sa-w2
+
 define Device/iptime_nas1dual
   DEVICE_VENDOR := ipTIME
   DEVICE_MODEL := NAS1dual




More information about the lede-commits mailing list