[openwrt/openwrt] ath79: Add support for Plasma Cloud PA300

LEDE Commits lede-commits at lists.infradead.org
Tue Dec 22 13:13:45 EST 2020


ynezz pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/5fc28ef47959c1256f2553d507224bb481b08494

commit 5fc28ef47959c1256f2553d507224bb481b08494
Author: Sven Eckelmann <sven at narfation.org>
AuthorDate: Mon Nov 23 13:41:34 2020 +0100

    ath79: Add support for Plasma Cloud PA300
    
    Device specifications:
    
    * Qualcomm/Atheros QCA9533 v2
    * 650/600/217 MHz (CPU/DDR/AHB)
    * 64 MB of RAM
    * 16 MB of SPI NOR flash (mx25l12805d)
      - 2x 7 MB available; but one of the 7 MB regions is the recovery image
    * 2x 10/100 Mbps Ethernet
    * 2T2R 2.4 GHz Wi-Fi
    * multi-color LED (controlled via red/green/blue GPIOs)
    * 1x GPIO-button (reset)
    * external h/w watchdog (enabled by default)
    * TTL pins are on board (arrow points to VCC, then follows: GND, TX, RX)
    * 2x fast ethernet
      - eth0
        + Label: Ethernet 1
        + 24V passive POE (mode B)
        + used as WAN interface
      - eth1
        + Label: Ethernet 2
        + 802.3af POE
        + builtin switch port 2
        + used as LAN interface
    * 12-24V 1A DC
    * internal antennas
    
    Flashing instructions:
    
    The tool ap51-flash (https://github.com/ap51-flash/ap51-flash) should be
    used to transfer the factory image to the u-boot when the device boots up.
    
    Signed-off-by: Sven Eckelmann <sven at narfation.org>
---
 package/boot/uboot-envtools/files/ath79            |   3 +
 scripts/om-fwupgradecfg-gen.sh                     |   3 +-
 .../linux/ath79/dts/qca9533_plasmacloud_pa300.dts  |   8 ++
 .../linux/ath79/dts/qca9533_plasmacloud_pa300.dtsi | 140 +++++++++++++++++++++
 .../generic/base-files/etc/board.d/02_network      |   1 +
 .../base-files/lib/upgrade/dualboot_datachk.sh     | 104 +++++++++++++++
 .../generic/base-files/lib/upgrade/platform.sh     |   7 ++
 target/linux/ath79/image/generic.mk                |  18 +++
 8 files changed, 283 insertions(+), 1 deletion(-)

diff --git a/package/boot/uboot-envtools/files/ath79 b/package/boot/uboot-envtools/files/ath79
index 39400a33a6..40fbc96a07 100644
--- a/package/boot/uboot-envtools/files/ath79
+++ b/package/boot/uboot-envtools/files/ath79
@@ -81,6 +81,9 @@ netgear,wndr4300tn|\
 netgear,wndr4300sw)
 	ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x40000" "0x20000"
 	;;
+plasmacloud,pa300)
+	ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x40000" "0x40000"
+	;;
 qihoo,c301)
 	ubootenv_add_uci_config "/dev/mtd9" "0x0" "0x10000" "0x10000"
 	;;
diff --git a/scripts/om-fwupgradecfg-gen.sh b/scripts/om-fwupgradecfg-gen.sh
index ce33454a24..98464c631b 100755
--- a/scripts/om-fwupgradecfg-gen.sh
+++ b/scripts/om-fwupgradecfg-gen.sh
@@ -7,7 +7,7 @@
 #
 
 usage() {
-	echo "Usage: $0 <OM2P|OM5P|OM5PAC|MR600|MR900|MR1750|A60|A42|A62> <out file path> <kernel path> <rootfs path>"
+	echo "Usage: $0 <OM2P|OM5P|OM5PAC|MR600|MR900|MR1750|A60|A42|A62|PA300> <out file path> <kernel path> <rootfs path>"
 	rm -f $CFG_OUT
 	exit 1
 }
@@ -20,6 +20,7 @@ KERNEL_PATH=$3
 ROOTFS_PATH=$4
 
 case $CE_TYPE in
+	PA300|\
 	OM2P)
 		MAX_PART_SIZE=7168
 		KERNEL_FLASH_ADDR=0x1c0000
diff --git a/target/linux/ath79/dts/qca9533_plasmacloud_pa300.dts b/target/linux/ath79/dts/qca9533_plasmacloud_pa300.dts
new file mode 100644
index 0000000000..8de89292ea
--- /dev/null
+++ b/target/linux/ath79/dts/qca9533_plasmacloud_pa300.dts
@@ -0,0 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+#include "qca9533_plasmacloud_pa300.dtsi"
+
+/ {
+	compatible = "plasmacloud,pa300", "qca,qca9533";
+	model = "Plasma Cloud PA300";
+};
diff --git a/target/linux/ath79/dts/qca9533_plasmacloud_pa300.dtsi b/target/linux/ath79/dts/qca9533_plasmacloud_pa300.dtsi
new file mode 100644
index 0000000000..0bc6d4fa28
--- /dev/null
+++ b/target/linux/ath79/dts/qca9533_plasmacloud_pa300.dtsi
@@ -0,0 +1,140 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+#include "qca953x.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+	chosen {
+		/delete-property/ bootargs;
+	};
+
+	aliases {
+		led-boot = &led_status_green;
+		led-failsafe = &led_status_green;
+		led-running = &led_status_green;
+		led-upgrade = &led_status_green;
+		label-mac-device = &eth0;
+	};
+
+	keys {
+		compatible = "gpio-keys";
+
+		pinctrl-names = "default";
+
+		reset {
+			label = "reset";
+			linux,code = <KEY_RESTART>;
+			gpios = <&gpio 1 GPIO_ACTIVE_LOW>;
+		};
+	};
+
+	leds {
+		compatible = "gpio-leds";
+
+		status_red {
+			label = "red:status";
+			gpios = <&gpio 0 GPIO_ACTIVE_HIGH>;
+		};
+
+		led_status_green: status_green {
+			label = "green:status";
+			gpios = <&gpio 2 GPIO_ACTIVE_HIGH>;
+		};
+
+		status_blue {
+			label = "blue:status";
+			gpios = <&gpio 3 GPIO_ACTIVE_HIGH>;
+		};
+	};
+
+	watchdog {
+		compatible = "linux,wdt-gpio";
+		gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
+		hw_algo = "toggle";
+		/* hw_margin_ms is actually 300s but driver limits it to 60s */
+		hw_margin_ms = <60000>;
+		always-running;
+	};
+};
+
+&uart {
+	status = "okay";
+};
+
+&spi {
+	status = "okay";
+
+	flash at 0 {
+		compatible = "jedec,spi-nor";
+		reg = <0>;
+		spi-max-frequency = <25000000>;
+
+		/* partitions are passed via bootloader */
+		partitions {
+			compatible = "fixed-partitions";
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			partition at 0 {
+				label = "u-boot";
+				reg = <0x000000 0x040000>;
+				read-only;
+			};
+
+			partition at 40000 {
+				label = "u-boot-env";
+				reg = <0x040000 0x040000>;
+			};
+
+			partition at 80000 {
+				label = "custom";
+				reg = <0x080000 0x140000>;
+				read-only;
+			};
+
+			partition at 1c0000 {
+				label = "inactive";
+				reg = <0x1c0000 0x700000>;
+			};
+
+			partition at 8c0000 {
+				label = "inactive2";
+				reg = <0x8c0000 0x700000>;
+			};
+
+			art: partition at fc0000 {
+				label = "ART";
+				reg = <0xfc0000 0x040000>;
+				read-only;
+			};
+		};
+	};
+};
+
+&eth0 {
+	status = "okay";
+
+	phy-handle = <&swphy4>;
+
+	mtd-mac-address = <&art 0x0>;
+};
+
+&eth1 {
+	/* Workaround: keep the Ethernet interfaces order/mapping correct
+	 * (GMAC0 -> eth0, GMAC1 -> eth1, same as in old ar71xx target)
+	 */
+	compatible = "qca,qca9530-eth", "syscon", "simple-mfd";
+
+	mtd-mac-address = <&art 0x0>;
+	mtd-mac-address-increment = <1>;
+};
+
+&wmac {
+	status = "okay";
+
+	mtd-cal-data = <&art 0x1000>;
+	mtd-mac-address = <&art 0x0>;
+	mtd-mac-address-increment = <2>;
+};
diff --git a/target/linux/ath79/generic/base-files/etc/board.d/02_network b/target/linux/ath79/generic/base-files/etc/board.d/02_network
index 766c0d0712..f868d8dc94 100755
--- a/target/linux/ath79/generic/base-files/etc/board.d/02_network
+++ b/target/linux/ath79/generic/base-files/etc/board.d/02_network
@@ -149,6 +149,7 @@ ath79_setup_interfaces()
 	comfast,cf-e120a-v3|\
 	comfast,cf-e314n-v2|\
 	compex,wpj531-16m|\
+	plasmacloud,pa300|\
 	tplink,cpe210-v1|\
 	tplink,cpe220-v2|\
 	tplink,cpe220-v3|\
diff --git a/target/linux/ath79/generic/base-files/lib/upgrade/dualboot_datachk.sh b/target/linux/ath79/generic/base-files/lib/upgrade/dualboot_datachk.sh
new file mode 100644
index 0000000000..68733ccf15
--- /dev/null
+++ b/target/linux/ath79/generic/base-files/lib/upgrade/dualboot_datachk.sh
@@ -0,0 +1,104 @@
+# The U-Boot loader with the datachk patchset for dualbooting requires image
+# sizes and checksums to be provided in the U-Boot environment.
+# The devices come with 2 main partitions - while one is active
+# sysupgrade will flash the other. The boot order is changed to boot the
+# newly flashed partition. If the new partition can't be booted due to
+# upgrade failures the previously used partition is loaded.
+
+platform_do_upgrade_dualboot_datachk() {
+	local tar_file="$1"
+	local restore_backup
+	local primary_kernel_mtd
+
+	local setenv_script="/tmp/fw_env_upgrade"
+
+	local inactive_mtd="$(find_mtd_index $PART_NAME)"
+	local inactive_offset="$(cat /sys/class/mtd/mtd${inactive_mtd}/offset)"
+	local total_size="$(cat /sys/class/mtd/mtd${inactive_mtd}/size)"
+	local flash_start_mem=0x9f000000
+
+	# detect to which flash region the new image is written to.
+	#
+	# 1. check what is the mtd index for the first flash region on this
+	#    device
+	# 2. check if the target partition ("inactive") has the mtd index of
+	#    the first flash region
+	#
+	#    - when it is: the new bootseq will be 1,2 and the first region is
+	#      modified
+	#    - when it isnt: bootseq will be 2,1 and the second region is
+	#      modified
+	#
+	# The detection has to be done via the hardcoded mtd partition because
+	# the current boot might be done with the fallback region. Let us
+	# assume that the current bootseq is 1,2. The bootloader detected that
+	# the image in flash region 1 is corrupt and thus switches to flash
+	# region 2. The bootseq in the u-boot-env is now still the same and
+	# the sysupgrade code can now only rely on the actual mtd indexes and
+	# not the bootseq variable to detect the currently booted flash
+	# region/image.
+	#
+	# In the above example, an implementation which uses bootseq ("1,2") to
+	# detect the currently booted image would assume that region 1 is booted
+	# and then overwrite the variables for the wrong flash region (aka the
+	# one which isn't modified). This could result in a device which doesn't
+	# boot anymore to Linux until it was reflashed with ap51-flash.
+	local next_boot_part="1"
+	case "$(board_name)" in
+	plasmacloud,pa300)
+		primary_kernel_mtd=3
+		;;
+	*)
+		echo "failed to detect primary kernel mtd partition for board"
+		return 1
+		;;
+	esac
+	[ "$inactive_mtd" = "$primary_kernel_mtd" ] || next_boot_part="2"
+
+	local board_dir=$(tar tf $tar_file | grep -m 1 '^sysupgrade-.*/$')
+	board_dir=${board_dir%/}
+
+	local kernel_length=$(tar xf $tar_file ${board_dir}/kernel -O | wc -c)
+	local rootfs_length=$(tar xf $tar_file ${board_dir}/root -O | wc -c)
+	# rootfs without EOF marker
+	rootfs_length=$((rootfs_length-4))
+
+	local kernel_md5=$(tar xf $tar_file ${board_dir}/kernel -O | md5sum); kernel_md5="${kernel_md5%% *}"
+	# md5 checksum of rootfs with EOF marker
+	local rootfs_md5=$(tar xf $tar_file ${board_dir}/root -O | dd bs=1 count=$rootfs_length | md5sum); rootfs_md5="${rootfs_md5%% *}"
+
+	#
+	# add tar support to get_image() to use default_do_upgrade() instead?
+	#
+
+	# take care of restoring a saved config
+	[ -n "$UPGRADE_BACKUP" ] && restore_backup="${MTD_CONFIG_ARGS} -j ${UPGRADE_BACKUP}"
+
+	mtd -q erase inactive
+	tar xf $tar_file ${board_dir}/root -O | mtd -n -p $kernel_length $restore_backup write - $PART_NAME
+	tar xf $tar_file ${board_dir}/kernel -O | mtd -n write - $PART_NAME
+
+	# prepare new u-boot env
+	if [ "$next_boot_part" = "1" ]; then
+		echo "bootseq 1,2" > $setenv_script
+	else
+		echo "bootseq 2,1" > $setenv_script
+	fi
+
+	printf "kernel_size_%i %i\n" $next_boot_part $((kernel_length / 1024)) >> $setenv_script
+	printf "vmlinux_start_addr 0x%08x\n" $((flash_start_mem + inactive_offset)) >> $setenv_script
+	printf "vmlinux_size 0x%08x\n" ${kernel_length} >> $setenv_script
+	printf "vmlinux_checksum %s\n" ${kernel_md5} >> $setenv_script
+
+	printf "rootfs_size_%i %i\n" $next_boot_part $(((total_size-kernel_length) / 1024)) >> $setenv_script
+	printf "rootfs_start_addr 0x%08x\n" $((flash_start_mem+inactive_offset+kernel_length)) >> $setenv_script
+	printf "rootfs_size 0x%08x\n" ${rootfs_length} >> $setenv_script
+	printf "rootfs_checksum %s\n" ${rootfs_md5} >> $setenv_script
+
+	# store u-boot env changes
+	mkdir -p /var/lock
+	fw_setenv -s $setenv_script || {
+		echo "failed to update U-Boot environment"
+		return 1
+	}
+}
diff --git a/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh b/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh
index f4fca06384..3ce273990f 100644
--- a/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh
@@ -5,6 +5,9 @@
 PART_NAME=firmware
 REQUIRE_IMAGE_METADATA=1
 
+RAMFS_COPY_BIN='fw_printenv fw_setenv'
+RAMFS_COPY_DATA='/etc/fw_env.config /var/lock/fw_printenv.lock'
+
 redboot_fis_do_upgrade() {
 	local append
 	local sysup_file="$1"
@@ -47,6 +50,10 @@ platform_do_upgrade() {
 	jjplus,ja76pf2)
 		redboot_fis_do_upgrade "$1" linux
 		;;
+	plasmacloud,pa300)
+		PART_NAME="inactive"
+		platform_do_upgrade_dualboot_datachk "$1"
+		;;
 	ubnt,routerstation|\
 	ubnt,routerstation-pro)
 		redboot_fis_do_upgrade "$1" kernel
diff --git a/target/linux/ath79/image/generic.mk b/target/linux/ath79/image/generic.mk
index 333420c827..935dee75d7 100644
--- a/target/linux/ath79/image/generic.mk
+++ b/target/linux/ath79/image/generic.mk
@@ -1579,6 +1579,24 @@ define Device/pisen_wmm003n
 endef
 TARGET_DEVICES += pisen_wmm003n
 
+define Device/plasmacloud_pa300-common
+  SOC := qca9533
+  DEVICE_VENDOR := Plasma Cloud
+  DEVICE_PACKAGES := uboot-envtools
+  IMAGE_SIZE := 7168k
+  BLOCKSIZE := 64k
+  IMAGES += factory.bin
+  KERNEL := kernel-bin | append-dtb | lzma | uImage lzma | pad-to $$(BLOCKSIZE)
+  IMAGE/factory.bin := append-rootfs | pad-rootfs | openmesh-image ce_type=PA300
+  IMAGE/sysupgrade.bin/squashfs := append-rootfs | pad-rootfs | sysupgrade-tar rootfs=$$$$@ | append-metadata
+endef
+
+define Device/plasmacloud_pa300
+  $(Device/plasmacloud_pa300-common)
+  DEVICE_MODEL := PA300
+endef
+TARGET_DEVICES += plasmacloud_pa300
+
 define Device/qihoo_c301
   $(Device/seama)
   SOC := ar9344



More information about the lede-commits mailing list