ath79: GL-AR750S: provide NAND support; increase kernel to 4 MB
authorJeff Kletsky <git-commits@allycomm.com>
Sun, 2 Jun 2019 15:18:34 +0000 (08:18 -0700)
committerChuanhong Guo <gch981213@gmail.com>
Thu, 14 Nov 2019 06:38:58 +0000 (14:38 +0800)
The GL.iNet GL-AR750S has been supported by the ar71xx and ath79
platforms with access to its 16 MB NOR flash, but not its 128 MB
SPI NAND flash.

This commit provides support for the NAND through the upstream
SPI-NAND framework.

At this time, the OEM U-Boot appears to only support loading the
kernel from NOR. This configuration is preserved as this time,
with the glinet,gl-ar750s-nand name reserved for a potential,
future, NAND-only boot.

The family of GL-AR750S devices on the ath79 platform now includes:

  * glinet,gl-ar750m-nor-nand   "nand" target
  * glinet,gl-ar750m-nor        "nand" target (NAND-aware)

NB: This commit increases the kernel size from 2 MB to 4 MB

"Force-less" sysupgrade is presently supported from the current
versions of following NOR-based firmwre images to the version of
glinet,gl-ar750s-nor firmware produced by this commit:

  * glinet,gl-ar750s     -- OpenWrt 19.07 ar71xx
  * glinet,gl-ar750s     -- OpenWrt 19.07 ath79

Users who have sucessfully upgraded to glinet,gl-ar750m-nor may then
flash glinet,gl-ar750m-nor-nand with sysupgrade to transtion to the
NAND-based variant.

Other upgrades to these images, including directly to the NAND-based
glinet,gl-ar750s-nor-nand firmware, can be accomplished through U-Boot.

NB: See "ath79: restrict GL-AR750S kernel build-size to 2 MB" which
enables flashing of NAND factory.img with the current GL-iNet U-Boot,
"U-Boot 1.1.4-gcf378d80-dirty (Aug 16 2018 - 07:51:15)"

The GL-AR750S OEM U-Boot allows upload and flashing of either NOR
firmware (sysupgrade.bin) or NAND firmware (factory.img) through its
HTTP-based GUI. Serial connectivity is not required.

The glinet,gl-ar750s-nor and glinet,gl-ar750s-nor-nand images
generated after this commit flash each other directly.

This commit changes the control of the USB VBUS to gpio-hog from
regulator-fixed introduced by commit 0f6b944c92. This reduces the
compressed kernel size by ~14 kB, with no apparent loss of
functionality. No other ath79-nand boards are using regulator-fixed
at this time.

Note: mtd_get_mac_binary art 0x5006 does not return the proper MAC
and the GL.iNet source indicates that only the 0x0 offset is valid

The ar71xx targets are unmodified.

Cc: Alexander Wördekemper <alexwoerde@web.de>
Signed-off-by: Jeff Kletsky <git-commits@allycomm.com>
12 files changed:
package/boot/uboot-envtools/files/ath79
target/linux/ath79/dts/qca9563_glinet_gl-ar750s-nor-nand.dts [new file with mode: 0644]
target/linux/ath79/dts/qca9563_glinet_gl-ar750s-nor.dts [new file with mode: 0644]
target/linux/ath79/dts/qca9563_glinet_gl-ar750s.dts [deleted file]
target/linux/ath79/dts/qca9563_glinet_gl-ar750s.dtsi [new file with mode: 0644]
target/linux/ath79/generic/base-files/etc/board.d/02_network
target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
target/linux/ath79/image/generic.mk
target/linux/ath79/image/nand.mk
target/linux/ath79/nand/base-files/etc/board.d/02_network
target/linux/ath79/nand/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
target/linux/ath79/nand/base-files/lib/upgrade/platform.sh

index d34469cbf4d24ad719980438f7f72aec04016800..e31100877ed6a1b8cc93ab90f290489a43ff91b8 100644 (file)
@@ -20,6 +20,8 @@ glinet,gl-ar300m-lite|\
 glinet,gl-ar300m-nand|\
 glinet,gl-ar300m-nor|\
 glinet,gl-ar300m16|\
+glinet,gl-ar750s-nor|\
+glinet,gl-ar750s-nor-nand|\
 librerouter,librerouter-v1|\
 netgear,ex6400|\
 netgear,ex7300|\
diff --git a/target/linux/ath79/dts/qca9563_glinet_gl-ar750s-nor-nand.dts b/target/linux/ath79/dts/qca9563_glinet_gl-ar750s-nor-nand.dts
new file mode 100644 (file)
index 0000000..92d1fb9
--- /dev/null
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+/dts-v1/;
+
+#include "qca9563_glinet_gl-ar750s.dtsi"
+
+/ {
+       compatible = "glinet,gl-ar750s-nor-nand", "qca,qca9563";
+       model = "GL.iNet GL-AR750S (NOR/NAND)";
+};
+
+&nor_kernel {
+       label = "kernel";
+};
+
+&nand_ubi {
+       label = "ubi";
+};
diff --git a/target/linux/ath79/dts/qca9563_glinet_gl-ar750s-nor.dts b/target/linux/ath79/dts/qca9563_glinet_gl-ar750s-nor.dts
new file mode 100644 (file)
index 0000000..bb33abd
--- /dev/null
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+/dts-v1/;
+
+#include "qca9563_glinet_gl-ar750s.dtsi"
+
+/ {
+       compatible = "glinet,gl-ar750s-nor", "qca,qca9563";
+       model = "GL.iNet GL-AR750S (NOR)";
+};
+
+/delete-node/ &nor_kernel;
+/delete-node/ &nor_reserved;
+
+&nor_firmware {
+       compatible = "denx,uimage";
+       label = "firmware";
+};
diff --git a/target/linux/ath79/dts/qca9563_glinet_gl-ar750s.dts b/target/linux/ath79/dts/qca9563_glinet_gl-ar750s.dts
deleted file mode 100644 (file)
index 3f9a091..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-// 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 "qca956x.dtsi"
-
-/ {
-       compatible = "glinet,gl-ar750s", "qca,qca9563";
-       model = "GL.iNet GL-AR750S";
-
-       chosen {
-               bootargs = "console=ttyS0,115200n8";
-       };
-
-       aliases {
-               led-boot = &led_power;
-               led-failsafe = &led_power;
-               led-running = &led_power;
-               led-upgrade = &led_power;
-       };
-
-       keys {
-               compatible = "gpio-keys";
-
-               pinctrl-names = "default";
-               pinctrl-0 = <&jtag_disable_pins>;
-
-               reset {
-                       label = "reset";
-                       linux,code = <KEY_RESTART>;
-                       gpios = <&gpio 2 GPIO_ACTIVE_LOW>;
-               };
-
-               mode {
-                       label = "mode";
-                       linux,code = <BTN_0>;
-                       linux,input-type = <EV_SW>;
-                       gpios = <&gpio 8 GPIO_ACTIVE_LOW>;
-               };
-       };
-
-       leds {
-               compatible = "gpio-leds";
-
-               led_power: power {
-                       label = "gl-ar750s:green:power";
-                       gpios = <&gpio 1 GPIO_ACTIVE_LOW>;
-                       default-state = "keep";
-               };
-
-               wlan2g {
-                       label = "gl-ar750s:green:wlan2g";
-                       gpios = <&gpio 19 GPIO_ACTIVE_LOW>;
-                       linux,default-trigger = "phy1tpt";
-               };
-
-               wlan5g {
-                       label = "gl-ar750s:green:wlan5g";
-                       gpios = <&gpio 20 GPIO_ACTIVE_HIGH>;
-                       linux,default-trigger = "phy0tpt";
-               };
-       };
-
-       i2c: i2c {
-               compatible = "i2c-gpio";
-
-               sda-gpios = <&gpio  5 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>;
-               scl-gpios = <&gpio 21 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>;
-       };
-
-       usb_vbus: regulator-usb-vbus {
-               compatible = "regulator-fixed";
-
-               regulator-name = "USB_VBUS";
-
-               regulator-min-microvolt = <5000000>;
-               regulator-max-microvolt = <5000000>;
-               regulator-always-on;
-
-               gpio = <&gpio 7 GPIO_ACTIVE_HIGH>;
-               enable-active-high;
-       };
-};
-
-&spi {
-       status = "okay";
-
-       num-cs = <0>;
-
-       flash@0 {
-               compatible = "jedec,spi-nor";
-               reg = <0>;
-               spi-max-frequency = <25000000>;
-
-               partitions {
-                       compatible = "fixed-partitions";
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-
-                       partition@0 {
-                               label = "u-boot";
-                               reg = <0x000000 0x040000>;
-                               read-only;
-                       };
-
-                       partition@40000 {
-                               label = "u-boot-env";
-                               reg = <0x040000 0x010000>;
-                       };
-
-                       art: partition@50000 {
-                               label = "art";
-                               reg = <0x050000 0x010000>;
-                               read-only;
-                       };
-
-                       partition@60000 {
-                               compatible = "denx,uimage";
-                               label = "firmware";
-                               reg = <0x060000 0xfa0000>;
-                       };
-               };
-       };
-};
-
-&pcie {
-       status = "okay";
-};
-
-&uart {
-       status = "okay";
-};
-
-&usb0 {
-       status = "okay";
-       vbus-supply = <&usb_vbus>;
-};
-
-&usb_phy0 {
-       status = "okay";
-};
-
-&usb1 {
-       status = "okay";
-};
-
-&usb_phy1 {
-       status = "okay";
-};
-
-&mdio0 {
-       status = "okay";
-
-       phy-mask = <0>;
-
-       phy0: ethernet-phy@0 {
-               reg = <0>;
-               phy-mode = "sgmii";
-               qca,ar8327-initvals = <
-                       0x04 0x00080080 /* PORT0 PAD MODE CTRL */
-                       0x7c 0x0000007e /* PORT0_STATUS */
-               >;
-       };
-};
-
-&eth0 {
-       status = "okay";
-
-       mtd-mac-address = <&art 0x0>;
-       phy-handle = <&phy0>;
-};
-
-&wmac {
-       status = "okay";
-
-       mtd-cal-data = <&art 0x1000>;
-};
diff --git a/target/linux/ath79/dts/qca9563_glinet_gl-ar750s.dtsi b/target/linux/ath79/dts/qca9563_glinet_gl-ar750s.dtsi
new file mode 100644 (file)
index 0000000..8250db5
--- /dev/null
@@ -0,0 +1,203 @@
+// 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 "qca956x.dtsi"
+
+/ {
+       compatible = "glinet,gl-ar750s", "qca,qca9563";
+       model = "GL.iNet GL-AR750S";
+
+       chosen {
+               bootargs = "console=ttyS0,115200n8";
+       };
+
+       aliases {
+               led-boot = &led_power;
+               led-failsafe = &led_power;
+               led-running = &led_power;
+               led-upgrade = &led_power;
+               label-mac-device = &eth0;
+       };
+
+       keys {
+               compatible = "gpio-keys";
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&jtag_disable_pins>;
+
+               reset {
+                       label = "reset";
+                       linux,code = <KEY_RESTART>;
+                       gpios = <&gpio 2 GPIO_ACTIVE_LOW>;
+               };
+
+               mode {
+                       label = "mode";
+                       linux,code = <BTN_0>;
+                       linux,input-type = <EV_SW>;
+                       gpios = <&gpio 8 GPIO_ACTIVE_LOW>;
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               led_power: power {
+                       label = "gl-ar750s:green:power";
+                       gpios = <&gpio 1 GPIO_ACTIVE_LOW>;
+                       default-state = "keep";
+               };
+
+               led_wlan2g: wlan2g {
+                       label = "gl-ar750s:green:wlan2g";
+                       gpios = <&gpio 19 GPIO_ACTIVE_LOW>;
+                       linux,default-trigger = "phy1tpt";
+               };
+
+               led_wlan5g: wlan5g {
+                       label = "gl-ar750s:green:wlan5g";
+                       gpios = <&gpio 20 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "phy0tpt";
+               };
+       };
+
+       i2c: i2c {
+               compatible = "i2c-gpio";
+
+               sda-gpios = <&gpio  5 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>;
+               scl-gpios = <&gpio 21 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>;
+       };
+};
+
+&spi {
+       status = "okay";
+
+       num-cs = <2>;
+       cs-gpios = <0>, <0>;
+
+       flash_nor: flash@0 {
+               compatible = "jedec,spi-nor";
+               reg = <0>;
+               spi-max-frequency = <25000000>;
+
+               nor_partitions: partitions {
+                       compatible = "fixed-partitions";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       partition@0 {
+                               label = "u-boot";
+                               reg = <0x000000 0x040000>;
+                               read-only;
+                       };
+
+                       partition@40000 {
+                               label = "u-boot-env";
+                               reg = <0x040000 0x010000>;
+                       };
+
+                       art: partition@50000 {
+                               label = "art";
+                               reg = <0x050000 0x010000>;
+                               read-only;
+                       };
+
+                       nor_firmware: partition@60000 {
+                               label = "nor_firmware";
+                               reg = <0x060000 0xfa0000>;
+                       };
+
+                       nor_kernel: partition_alt@60000 {
+                               label = "nor_kernel";
+                               reg = <0x060000 0x400000>;
+                       };
+
+                       nor_reserved: parition_alt@460000 {
+                               label = "nor_reserved";
+                               reg = <0x460000 0xba0000>;
+                       };
+               };
+       };
+
+       flash_nand: flash@1 {
+               compatible = "spi-nand";
+               reg = <1>;
+               spi-max-frequency = <25000000>;
+
+               nand_partitions: partitions {
+                       compatible = "fixed-partitions";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       nand_ubi: partition@0 {
+                               label = "nand_ubi";
+                               reg = <0x000000 0x8000000>;
+                       };
+               };
+       };
+};
+
+&eth0 {
+       status = "okay";
+
+       phy-handle = <&phy0>;
+       mtd-mac-address = <&art 0x0>;
+};
+
+&gpio {
+       usb_vbus {
+               gpio-hog;
+               gpios = <7 GPIO_ACTIVE_HIGH>;
+               output-high;
+               line-name = "usb-vbus";
+       };
+};
+
+&mdio0 {
+       status = "okay";
+
+       phy-mask = <0>;
+
+       phy0: ethernet-phy@0 {
+               reg = <0>;
+               phy-mode = "sgmii";
+               qca,ar8327-initvals = <
+                       0x04 0x00080080 /* PORT0 PAD MODE CTRL */
+                       0x7c 0x0000007e /* PORT0_STATUS */
+               >;
+       };
+};
+
+&pcie {
+       status = "okay";
+};
+
+&uart {
+       status = "okay";
+};
+
+&usb0 {
+       status = "okay";
+};
+
+&usb1 {
+       status = "okay";
+};
+
+&usb_phy0 {
+       status = "okay";
+};
+
+&usb_phy1 {
+       status = "okay";
+};
+
+&wmac {
+       status = "okay";
+
+       mtd-cal-data = <&art 0x1000>;
+};
index 3a896b55b0ce84cbfed30174f230c97c92a5aa2e..07f3c4e83c51ecd40e5cf0529270a0ee41bbeb29 100755 (executable)
@@ -144,10 +144,6 @@ ath79_setup_interfaces()
                ucidef_add_switch "switch0" \
                        "0@eth0" "1:lan" "2:lan"
                ;;
-       glinet,gl-ar750s)
-               ucidef_add_switch "switch0" \
-                       "0@eth0" "2:lan:2" "3:lan:1" "1:wan"
-               ;;
        iodata,etg3-r|\
        iodata,wn-ac1167dgr|\
        iodata,wn-ac1600dgr|\
index b2ec803a72a315465e365b83c3de6e75a0475599..f128e8759fc9ab885f3eeb1f66cf799de4b17acc 100644 (file)
@@ -46,8 +46,7 @@ case "$FIRMWARE" in
                caldata_extract "art" 0x5000 0x844
                ath10k_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +1)
                ;;
-       glinet,gl-ar750|\
-       glinet,gl-ar750s)
+       glinet,gl-ar750)
                caldata_extract "art" 0x5000 0x844
                ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary art 0x0) +1)
                ;;
index 6fc51ec64752398876246dd2ff777f4c3283b353..f2c228926ebdc1574c0805f443f99f5e853f87cb 100644 (file)
@@ -578,16 +578,6 @@ define Device/glinet_gl-ar750
 endef
 TARGET_DEVICES += glinet_gl-ar750
 
-define Device/glinet_gl-ar750s
-  ATH_SOC := qca9563
-  DEVICE_VENDOR := GL.iNet
-  DEVICE_MODEL := GL-AR750S
-  DEVICE_PACKAGES := kmod-usb2 kmod-ath10k-ct ath10k-firmware-qca9887-ct block-mount
-  IMAGE_SIZE := 16000k
-  SUPPORTED_DEVICES += gl-ar750s
-endef
-TARGET_DEVICES += glinet_gl-ar750s
-
 define Device/glinet_gl-x750
   ATH_SOC := qca9531
   DEVICE_VENDOR := GL.iNet
index f9961840f0daf9faffbb9dc3c194a0da4418abb6..614a693285fe4adf1d0c203c73f1f6c357b9c55e 100644 (file)
@@ -75,6 +75,37 @@ define Device/glinet_gl-ar300m-nor
 endef
 TARGET_DEVICES += glinet_gl-ar300m-nor
 
+define Device/glinet_gl-ar750s-common
+  ATH_SOC := qca9563
+  DEVICE_VENDOR := GL.iNet
+  DEVICE_MODEL := GL-AR750S
+  DEVICE_PACKAGES := kmod-ath10k-ct ath10k-firmware-qca9887-ct \
+                       kmod-usb2 kmod-usb-storage block-mount
+  KERNEL_SIZE := 4096k
+  IMAGE_SIZE := 16000k
+  PAGESIZE := 2048
+  VID_HDR_OFFSET := 2048
+endef
+
+define Device/glinet_gl-ar750s-nor-nand
+  $(Device/glinet_gl-ar750s-common)
+  DEVICE_VARIANT := NOR/NAND
+  BLOCKSIZE := 128k
+  IMAGES += factory.img
+  IMAGE/factory.img := append-kernel | pad-to $$$$(KERNEL_SIZE) | append-ubi
+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
+  SUPPORTED_DEVICES += glinet,gl-ar750s-nor
+endef
+TARGET_DEVICES += glinet_gl-ar750s-nor-nand
+
+define Device/glinet_gl-ar750s-nor
+  $(Device/glinet_gl-ar750s-common)
+  DEVICE_VARIANT := NOR
+  BLOCKSIZE := 64k
+  SUPPORTED_DEVICES += gl-ar750s glinet,gl-ar750s glinet,gl-ar750s-nor-nand
+endef
+TARGET_DEVICES += glinet_gl-ar750s-nor
+
 # fake rootfs is mandatory, pad-offset 129 equals (2 * uimage_header + 0xff)
 define Device/netgear_ath79_nand
   DEVICE_VENDOR := NETGEAR
index 9d7a19c2eb41ad066793792e44831bb367f09a85..36ddb5e83a438c6747c97c28af955e204914966d 100755 (executable)
@@ -11,6 +11,11 @@ ath79_setup_interfaces()
        aerohive,hiveap-121)
                ucidef_set_interface_lan "eth0"
                ;;
+       glinet,gl-ar750s-nor|\
+       glinet,gl-ar750s-nor-nand)
+               ucidef_add_switch "switch0" \
+                       "0@eth0" "2:lan:2" "3:lan:1" "1:wan"
+               ;;
        netgear,wndr4300)
                ucidef_add_switch "switch0" \
                        "0@eth0" "1:lan:4" "2:lan:3" "3:lan:2" "4:lan:1" "5:wan"
index 433d6475ddb315223289ef1751de919276d42bee..9305f061fee6ef0bb272ac813b33fda30b0cb916 100644 (file)
@@ -9,6 +9,11 @@ board=$(board_name)
 case "$FIRMWARE" in
 "ath10k/cal-pci-0000:00:00.0.bin")
        case $board in
+       glinet,gl-ar750s-nor|\
+       glinet,gl-ar750s-nor-nand)
+               caldata_extract "art" 0x5000 0x844
+               ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary art 0x0) +1)
+               ;;
        zyxel,nbg6716)
                caldata_extract "art" 0x5000 0x844
                ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii u-boot-env ethaddr) +1)
index 69105b166825f40de770e0045211c4a29b085923..15d88a361ec10aa864920a849d5e60951d0f7077 100644 (file)
@@ -18,6 +18,10 @@ platform_do_upgrade() {
        glinet,gl-ar300m-nor)
                glinet_nand_nor_do_upgrade "$1"
                ;;
+       glinet,gl-ar750s-nor|\
+       glinet,gl-ar750s-nor-nand)
+               nand_nor_do_upgrade "$1"
+               ;;
        *)
                nand_do_upgrade "$1"
                ;;