ipq40xx: add support for P&W R619AC (aka G-DOCK 2.0)
authorRichard Yu <yurichard3839@gmail.com>
Fri, 12 Nov 2021 03:16:21 +0000 (11:16 +0800)
committerChristian Lamparter <chunkeey@gmail.com>
Sun, 14 Nov 2021 13:28:34 +0000 (14:28 +0100)
P&W R619AC is a IPQ4019 Dual-Band AC1200 router.
It is made by P&W (p2w-tech.com) known as P&W R619AC
but marketed and sold more popularly as G-DOCK 2.0.

Specification:

* SOC: Qualcomm Atheros IPQ4019 (717 MHz)
* RAM: 512 MiB
* Flash: 16 MiB (NOR) + 128 MiB (NAND)
* Ethernet: 5 x 10/100/1000 (4 x LAN, 1 x WAN)
* Wireless:
  - 2.4 GHz b/g/n Qualcomm Atheros IPQ4019
  - 5 GHz a/n/ac Qualcomm Atheros IPQ4019
* USB: 1 x USB 3.0
* LED: 4 x LAN, 1 x WAN, 2 x WiFi, 1 x Power (All Blue LED)
* Input: 1 x reset
* 1 x MicroSD card slot
* Serial console: 115200bps, pinheader J2 on PCB
* Power: DC 12V 2A
* 1 x Unpopulated mPCIe Slot (see below how to connect it)
* 1 x Unpopulated Sim Card Slot

Installation:
1. Access to tty console via UART serial
2. Enter failsafe mode and mount rootfs
   <https://openwrt.org/docs/guide-user/troubleshooting/failsafe_and_factory_reset>
3. Edit inittab to enable shell on tty console
   `sed -i 's/#ttyM/ttyM/' /etc/inittab`
4. Reboot and upload `-nand-factory.bin` to the router (using wget)
5. Use `sysupgrade` command to install

Another installation method is to hijack the upgrade server domain
of stock firmware, because it's using insecure http.

This commit is based on @LGA1150(at GitHub)'s work
<https://github.com/LGA1150/openwrt/commit/a4932c8d5a275d1fb4297bd20ec03f9270a45d1c>
With some changes:
1. Added `qpic_bam` node in dts. I don't know much about this,
   but I observed other dtses have this node.
2. Removed `ldo` node under `sd_0_pinmux`, because `ldo` cause SD card not
   working. This fix is from
   <https://github.com/coolsnowwolf/lede/commit/51143b4c7571f717afe071db60bbb4db1532cbf2>
3. Removed the 32MB NOR variant.
4. Removed `cd-gpios` in `sdhci` node, because it's reported that it makes
   wlan2g led light up.
5. Added ethphy led config in dts.
6. Changed nand partition label from `rootfs` to `ubi`.

About the 128MiB variant: The stock bootloader sets size of nand to 64MiB.
But most of this devices have 128MiB nand. If you want to use all 128MiB,
you need to modify the `MIBIB` data of bootloader. More details can be
found on github:
<https://github.com/openwrt/openwrt/pull/3691#issuecomment-818770060>
For instructions on how to flash the MIBIB partition from u-boot console:
<https://github.com/openwrt/openwrt/pull/3691#issuecomment-819138232>

About the Mini PCIe slot: (from "ygleg")
"The REFCLK signals on the Mini PCIe slot is not connected on
this board out of the box. If you want to use the Mini PCIe slot
on the board, you need to (preferably) solder two 0402 resistors:
R436 (REFCLK+) and R444 (REFCLK-)..."
This and much more information is provoided in the github comment:
<https://github.com/openwrt/openwrt/pull/3691#issuecomment-968054670>

Signed-off-by: Richard Yu <yurichard3839@gmail.com>
Signed-off-by: DENG Qingfang <dqfext@gmail.com>
[Added comment about MIBIB+128 MiB variant. Added commit
message section about pcie slot. Renamed gpio-leds' subnodes
and added color, function+enum properties.]
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
package/firmware/ipq-wifi/Makefile
package/firmware/ipq-wifi/board-p2w_r619ac.qca4019 [new file with mode: 0644]
target/linux/ipq40xx/base-files/etc/board.d/02_network
target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
target/linux/ipq40xx/base-files/lib/upgrade/platform.sh
target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-r619ac-128m.dts [new file with mode: 0644]
target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-r619ac-64m.dts [new file with mode: 0644]
target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-r619ac.dtsi [new file with mode: 0644]
target/linux/ipq40xx/image/generic.mk
target/linux/ipq40xx/patches-5.10/901-arm-boot-add-dts-files.patch

index e3b25bb556658ef9399b6e6399f9f218870be996..da0949b887bc0487b65ca35f0d55823f826d9da0 100644 (file)
@@ -47,6 +47,7 @@ ALLWIFIBOARDS:= \
        mikrotik_sxtsq-5-ac \
        mobipromo_cm520-79f \
        nec_wg2600hp3 \
+       p2w_r619ac \
        plasmacloud_pa1200 \
        plasmacloud_pa2200 \
        qxwlan_e2600ac
@@ -132,6 +133,7 @@ $(eval $(call generate-ipq-wifi-package,mikrotik_hap-ac2,Mikrotik hAP ac2))
 $(eval $(call generate-ipq-wifi-package,mikrotik_sxtsq-5-ac,MikroTik SXTsq 5 ac))
 $(eval $(call generate-ipq-wifi-package,mobipromo_cm520-79f,MobiPromo CM520-79F))
 $(eval $(call generate-ipq-wifi-package,nec_wg2600hp3,NEC Platforms WG2600HP3))
+$(eval $(call generate-ipq-wifi-package,p2w_r619ac,P&W R619AC))
 $(eval $(call generate-ipq-wifi-package,plasmacloud_pa1200,Plasma Cloud PA1200))
 $(eval $(call generate-ipq-wifi-package,plasmacloud_pa2200,Plasma Cloud PA2200))
 $(eval $(call generate-ipq-wifi-package,qxwlan_e2600ac,Qxwlan E2600AC))
diff --git a/package/firmware/ipq-wifi/board-p2w_r619ac.qca4019 b/package/firmware/ipq-wifi/board-p2w_r619ac.qca4019
new file mode 100644 (file)
index 0000000..0ebe285
Binary files /dev/null and b/package/firmware/ipq-wifi/board-p2w_r619ac.qca4019 differ
index 50b460e441033dc38ecda2dfcccb2a81227080f2..5d123109a2f88c9049a239e364a767c4f475aac8 100644 (file)
@@ -50,6 +50,8 @@ ipq40xx_setup_interfaces()
                ;;
        asus,rt-ac58u|\
        mikrotik,hap-ac2|\
+       p2w,r619ac-64m|\
+       p2w,r619ac-128m|\
        zyxel,nbg6617)
                ucidef_set_interfaces_lan_wan "eth0" "eth1"
                ucidef_add_switch "switch0" \
index 505182bb65d4f4eee0f4ff052dfad2afff756919..35862ce3bcf24361fc1f5fd50f2508a49aac4d04 100644 (file)
@@ -67,6 +67,8 @@ case "$FIRMWARE" in
        glinet,gl-s1300 |\
        linksys,ea6350v3 |\
        mobipromo,cm520-79f |\
+       p2w,r619ac-64m |\
+       p2w,r619ac-128m |\
        qcom,ap-dk01.1-c1)
                caldata_extract "ART" 0x1000 0x2f20
                ;;
@@ -187,6 +189,8 @@ case "$FIRMWARE" in
        glinet,gl-s1300 |\
        linksys,ea6350v3 |\
        mobipromo,cm520-79f |\
+       p2w,r619ac-64m |\
+       p2w,r619ac-128m |\
        qcom,ap-dk01.1-c1)
                caldata_extract "ART" 0x5000 0x2f20
                ;;
index e3919766060f21422c3f416ae0db2d8e355ef375..605b1e78819e1c0aaa21b6d3996871ca9d758f80 100644 (file)
@@ -73,6 +73,8 @@ platform_do_upgrade() {
        luma,wrtq-329acn |\
        mobipromo,cm520-79f |\
        netgear,wac510 |\
+       p2w,r619ac-64m |\
+       p2w,r619ac-128m |\
        qxwlan,e2600ac-c2)
                nand_do_upgrade "$1"
                ;;
diff --git a/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-r619ac-128m.dts b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-r619ac-128m.dts
new file mode 100644 (file)
index 0000000..0896374
--- /dev/null
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+#include "qcom-ipq4019-r619ac.dtsi"
+
+/ {
+       model = "P&W R619AC 128M";
+       compatible = "p2w,r619ac-128m";
+};
+
+&nand_rootfs {
+       /*
+        * Watch out: stock MIBIB is set up for a 64MiB chip.
+        * If a 128MiB flash chip is used, make sure to have
+        * the right values in MIBIB or the device might not
+        * boot.
+        */
+       reg = <0x0 0x8000000>;
+};
diff --git a/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-r619ac-64m.dts b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-r619ac-64m.dts
new file mode 100644 (file)
index 0000000..6c8821a
--- /dev/null
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+#include "qcom-ipq4019-r619ac.dtsi"
+
+/ {
+       model = "P&W R619AC 64M";
+       compatible = "p2w,r619ac-64m";
+};
+
+&nand_rootfs {
+       reg = <0x0 0x4000000>;
+};
diff --git a/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-r619ac.dtsi b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-r619ac.dtsi
new file mode 100644 (file)
index 0000000..ff0486c
--- /dev/null
@@ -0,0 +1,348 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+#include "qcom-ipq4019.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/soc/qcom,tcsr.h>
+
+/ {
+       chosen {
+               bootargs-append = " ubi.mtd=ubi root=/dev/ubiblock0_1";
+       };
+
+       aliases {
+               led-boot = &led_sys;
+               led-failsafe = &led_sys;
+               led-running = &led_sys;
+               led-upgrade = &led_sys;
+               label-mac-device = &gmac0;
+       };
+
+       soc {
+               rng@22000 {
+                       status = "okay";
+               };
+
+               mdio@90000 {
+                       status = "okay";
+                       pinctrl-0 = <&mdio_pins>;
+                       pinctrl-names = "default";
+               };
+
+               ess-psgmii@98000 {
+                       status = "okay";
+               };
+
+               tcsr@1949000 {
+                       compatible = "qcom,tcsr";
+                       reg = <0x1949000 0x100>;
+                       qcom,wifi_glb_cfg = <TCSR_WIFI_GLB_CFG>;
+               };
+
+               tcsr@194b000 {
+                       compatible = "qcom,tcsr";
+                       reg = <0x194b000 0x100>;
+                       qcom,usb-hsphy-mode-select = <TCSR_USB_HSPHY_HOST_MODE>;
+               };
+
+               ess_tcsr@1953000 {
+                       compatible = "qcom,tcsr";
+                       reg = <0x1953000 0x1000>;
+                       qcom,ess-interface-select = <TCSR_ESS_PSGMII>;
+               };
+
+               tcsr@1957000 {
+                       compatible = "qcom,tcsr";
+                       reg = <0x1957000 0x100>;
+                       qcom,wifi_noc_memtype_m0_m2 = <TCSR_WIFI_NOC_MEMTYPE_M0_M2>;
+               };
+
+               usb2@60f8800 {
+                       status = "okay";
+               };
+
+               usb3@8af8800 {
+                       status = "okay";
+               };
+
+               crypto@8e3a000 {
+                       status = "okay";
+               };
+
+               watchdog@b017000 {
+                       status = "okay";
+               };
+
+               ess-switch@c000000 {
+                       status = "okay";
+               };
+
+               edma@c080000 {
+                       status = "okay";
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               led_sys: led-0 {
+                       label = "blue:sys";
+                       gpios = <&tlmm 39 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_BLUE>;
+                       function = LED_FUNCTION_POWER;
+               };
+
+               led-1 {
+                       label = "blue:wlan2g";
+                       gpios = <&tlmm 32 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "phy0tpt";
+                       color = <LED_COLOR_ID_BLUE>;
+                       function = LED_FUNCTION_WLAN;
+                       function-enumerator = <0>;
+               };
+
+               led-2 {
+                       label = "blue:wlan5g";
+                       gpios = <&tlmm 50 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "phy1tpt";
+                       color = <LED_COLOR_ID_BLUE>;
+                       function = LED_FUNCTION_WLAN;
+                       function-enumerator = <1>;
+               };
+       };
+
+       keys {
+               compatible = "gpio-keys";
+
+               reset {
+                       label = "reset";
+                       gpios = <&tlmm 18 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_RESTART>;
+               };
+       };
+};
+
+&blsp_dma {
+       status = "okay";
+};
+
+&blsp1_spi1 {
+       status = "okay";
+
+       flash@0 {
+               reg = <0>;
+               compatible = "jedec,spi-nor";
+               spi-max-frequency = <24000000>;
+
+               partitions {
+                       compatible = "fixed-partitions";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       partition@0 {
+                               label = "SBL1";
+                               reg = <0x0 0x40000>;
+                               read-only;
+                       };
+
+                       partition@40000 {
+                               label = "MIBIB";
+                               reg = <0x40000 0x20000>;
+                               read-only;
+                       };
+
+                       partition@60000 {
+                               label = "QSEE";
+                               reg = <0x60000 0x60000>;
+                               read-only;
+                       };
+
+                       partition@c0000 {
+                               label = "CDT";
+                               reg = <0xc0000 0x10000>;
+                               read-only;
+                       };
+
+                       partition@d0000 {
+                               label = "DDRPARAMS";
+                               reg = <0xd0000 0x10000>;
+                               read-only;
+                       };
+
+                       partition@e0000 {
+                               label = "APPSBLENV";
+                               reg = <0xe0000 0x10000>;
+                               read-only;
+                       };
+
+                       partition@f0000 {
+                               label = "APPSBL";
+                               reg = <0xf0000 0x80000>;
+                               read-only;
+                       };
+
+                       partition@170000 {
+                               label = "ART";
+                               reg = <0x170000 0x10000>;
+                               read-only;
+                       };
+               };
+       };
+};
+
+&nand {
+       status = "okay";
+
+       nand@0 {
+               partitions {
+                       compatible = "fixed-partitions";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       nand_rootfs: partition@0 {
+                               label = "ubi";
+                               /* reg defined in 64M/128M variant dts. */
+                       };
+               };
+       };
+};
+
+&blsp1_uart1 {
+       pinctrl-0 = <&serial_0_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+};
+
+&cryptobam {
+       status = "okay";
+};
+
+&pcie0 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pcie_pins>;
+       perst-gpio = <&tlmm 4 GPIO_ACTIVE_LOW>;
+       wake-gpio = <&tlmm 40 GPIO_ACTIVE_HIGH>;
+
+       /* Free slot for use */
+       bridge@0,0 {
+               reg = <0x00000000 0 0 0 0>;
+               #address-cells = <3>;
+               #size-cells = <2>;
+               ranges;
+       };
+};
+
+&qpic_bam {
+       status = "okay";
+};
+
+&sdhci {
+       pinctrl-0 = <&sd_0_pins>;
+       pinctrl-names = "default";
+       vqmmc-supply = <&vqmmc>;
+       status = "okay";
+};
+
+&tlmm {
+       pcie_pins: pcie_pinmux {
+               mux {
+                       pins = "gpio2";
+                       function = "gpio";
+                       output-low;
+                       bias-pull-down;
+               };
+       };
+
+       mdio_pins: mdio_pinmux {
+               mux_1 {
+                       pins = "gpio6";
+                       function = "mdio";
+                       bias-pull-up;
+               };
+
+               mux_2 {
+                       pins = "gpio7";
+                       function = "mdc";
+                       bias-pull-up;
+               };
+       };
+
+       sd_0_pins: sd_0_pinmux {
+               mux_1 {
+                       pins = "gpio23", "gpio24", "gpio25", "gpio26", "gpio28";
+                       function = "sdio";
+                       drive-strength = <10>;
+               };
+
+               mux_2 {
+                       pins = "gpio27";
+                       function = "sdio";
+                       drive-strength = <16>;
+               };
+       };
+
+       serial_0_pins: serial0-pinmux {
+               mux {
+                       pins = "gpio16", "gpio17";
+                       function = "blsp_uart0";
+                       bias-disable;
+               };
+       };
+};
+
+&ethphy0 {
+       qcom,single-led-1000;
+       qcom,single-led-100;
+       qcom,single-led-10;
+};
+
+&ethphy1 {
+       qcom,single-led-1000;
+       qcom,single-led-100;
+       qcom,single-led-10;
+};
+
+&ethphy2 {
+       qcom,single-led-1000;
+       qcom,single-led-100;
+       qcom,single-led-10;
+};
+
+&ethphy3 {
+       qcom,single-led-1000;
+       qcom,single-led-100;
+       qcom,single-led-10;
+};
+
+&ethphy4 {
+       qcom,single-led-1000;
+       qcom,single-led-100;
+       qcom,single-led-10;
+};
+
+&usb3_ss_phy {
+       status = "okay";
+};
+
+&usb3_hs_phy {
+       status = "okay";
+};
+
+&usb2_hs_phy {
+       status = "okay";
+};
+
+&vqmmc {
+       status = "okay";
+};
+
+&wifi0 {
+       status = "okay";
+       qcom,ath10k-calibration-variant = "P&W R619AC";
+};
+
+&wifi1 {
+       status = "okay";
+       qcom,ath10k-calibration-variant = "P&W R619AC";
+};
index e2ccafd162908bd856d86069a5a3b324bb2b94e1..6956679e37735ad987a8f31d3be5a5d211593dd2 100644 (file)
@@ -753,6 +753,32 @@ define Device/openmesh_a62
 endef
 TARGET_DEVICES += openmesh_a62
 
+define Device/p2w_r619ac
+       $(call Device/FitzImage)
+       $(call Device/UbiFit)
+       DEVICE_VENDOR := P&W
+       DEVICE_MODEL := R619AC
+       SOC := qcom-ipq4019
+       DEVICE_DTS_CONFIG := config@10
+       BLOCKSIZE := 128k
+       PAGESIZE := 2048
+       DEVICE_PACKAGES := ipq-wifi-p2w_r619ac
+endef
+
+define Device/p2w_r619ac-64m
+       $(call Device/p2w_r619ac)
+       DEVICE_VARIANT := 64M NAND
+       IMAGES += nand-factory.bin
+       IMAGE/nand-factory.bin := append-ubi | qsdk-ipq-factory-nand
+endef
+TARGET_DEVICES += p2w_r619ac-64m
+
+define Device/p2w_r619ac-128m
+       $(call Device/p2w_r619ac)
+       DEVICE_VARIANT := 128M NAND
+endef
+TARGET_DEVICES += p2w_r619ac-128m
+
 define Device/plasmacloud_pa1200
        $(call Device/FitImageLzma)
        DEVICE_VENDOR := Plasma Cloud
index 471fcd649863d9d6ab6165cf078fafe8b926e9a9..436f5a74f55d718f97a6b4ad8c5612ce84416a25 100644 (file)
@@ -10,7 +10,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
 
 --- a/arch/arm/boot/dts/Makefile
 +++ b/arch/arm/boot/dts/Makefile
-@@ -902,11 +902,65 @@ dtb-$(CONFIG_ARCH_QCOM) += \
+@@ -902,11 +902,67 @@ dtb-$(CONFIG_ARCH_QCOM) += \
        qcom-apq8074-dragonboard.dtb \
        qcom-apq8084-ifc6540.dtb \
        qcom-apq8084-mtp.dtb \
@@ -58,6 +58,8 @@ Signed-off-by: John Crispin <john@phrozen.org>
 +      qcom-ipq4019-map-ac2200.dtb \
 +      qcom-ipq4019-mr8300.dtb \
 +      qcom-ipq4019-pa2200.dtb \
++      qcom-ipq4019-r619ac-64m.dtb \
++      qcom-ipq4019-r619ac-128m.dtb \
 +      qcom-ipq4019-rbr50.dtb \
 +      qcom-ipq4019-rbs50.dtb \
 +      qcom-ipq4019-rtl30vw.dtb \