octeon: add support for Ubiquiti UniFi Security Gateway
authorClemens Hopfer <openwrt@wireloss.net>
Sat, 28 May 2022 19:34:48 +0000 (21:34 +0200)
committerChristian Lamparter <chunkeey@gmail.com>
Fri, 24 Jun 2022 21:59:14 +0000 (23:59 +0200)
Ubiquiti UniFi Security Gateway (USG) is largely identical to
the EdgeRouter Lite (ERLite-3) apart from a different board ID
and two dome leds.

Device data (from WikiDev):
  CPU: Cavium Octeon Plus CN5020 @500MHz 2-cores
  Ethernet: 3x Atheros AR8035-A GbE PHY's
  Flash: On-board 4MB Flash
  Storage: Internal 3.8GB USB Flash (Kingston ID) drive
    w/ 1.5GB free for use occupies single internal USB port.
  Serial: 1x RJ45 port on front panel. 115200, 8N1
  Buttons: 1x Reset

Flash instructions are identical to EdgeRouter Lite.

Signed-off-by: Clemens Hopfer <openwrt@wireloss.net>
target/linux/octeon/base-files/etc/board.d/01_network
target/linux/octeon/base-files/lib/preinit/01_sysinfo
target/linux/octeon/base-files/lib/preinit/79_move_config
target/linux/octeon/base-files/lib/upgrade/platform.sh
target/linux/octeon/files/arch/mips/boot/dts/cavium-octeon/cn5020_ubnt_usg.dts [new file with mode: 0644]
target/linux/octeon/image/Makefile
target/linux/octeon/patches-5.10/150-ubnt_usg_support.patch [new file with mode: 0644]
target/linux/octeon/patches-5.15/150-ubnt_usg_support.patch [new file with mode: 0644]

index 194faeaad961ff12e7b80e9e2bb2e30abd0b5d39..906e838a6f43110b2205c981f37dd41a520745d5 100644 (file)
@@ -7,7 +7,8 @@
 board_config_update
 
 case "$(board_name)" in
-itus,shield-router)
+itus,shield-router|\
+ubnt,usg)
        ucidef_set_interfaces_lan_wan "eth1 eth2" "eth0"
        ;;
 ubnt,edgerouter-4)
index d66618b0cfdaaffc5f410e55cf53f22a2efa797f..b3246eab41444a2bf5c0f4847f3b74071da653a9 100644 (file)
@@ -17,7 +17,8 @@ do_sysinfo_octeon() {
                name="erpro"
                ;;
 
-       "UBNT_E300"*)
+       "UBNT_E300"*|\
+       "UBNT_USG"*)
                # let generic 02_sysinfo handle it since device has its own device tree
                return 0
                ;;
index ae155a3c5cbaabf52bb28c418461878ff011a0be..01491500a03ee7563ce3020367fbd1faa81f90f9 100644 (file)
@@ -15,7 +15,8 @@ octeon_move_config() {
        . /lib/functions.sh
 
        case "$(board_name)" in
-               erlite)
+               erlite|\
+               ubnt,usg)
                        move_config "/dev/sda1"
                        ;;
                itus,shield-router)
index 84533d642a1c472dfdcc66cf0f014c3dc1d1e714..14b3eefe7e68851a3651f21c3a6702659343c7bb 100755 (executable)
@@ -27,7 +27,8 @@ platform_copy_config_helper() {
 
 platform_copy_config() {
        case "$(board_name)" in
-       erlite)
+       erlite|\
+       ubnt,usg)
                platform_copy_config_helper /dev/sda1
                ;;
        itus,shield-router)
@@ -91,7 +92,8 @@ platform_do_upgrade() {
        ubnt,edgerouter-6p)
                kernel=mmcblk0p1
                ;;
-       erlite)
+       erlite|\
+       ubnt,usg)
                kernel=sda1
                ;;
        itus,shield-router)
@@ -119,7 +121,8 @@ platform_check_image() {
        erlite | \
        itus,shield-router | \
        ubnt,edgerouter-4 | \
-       ubnt,edgerouter-6p)
+       ubnt,edgerouter-6p | \
+       ubnt,usg)
                local kernel_length=$(tar xf $tar_file $board_dir/kernel -O | wc -c 2> /dev/null)
                local rootfs_length=$(tar xf $tar_file $board_dir/root -O | wc -c 2> /dev/null)
                [ "$kernel_length" = 0 -o "$rootfs_length" = 0 ] && {
diff --git a/target/linux/octeon/files/arch/mips/boot/dts/cavium-octeon/cn5020_ubnt_usg.dts b/target/linux/octeon/files/arch/mips/boot/dts/cavium-octeon/cn5020_ubnt_usg.dts
new file mode 100644 (file)
index 0000000..24d8abe
--- /dev/null
@@ -0,0 +1,97 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Device tree source for Ubiquity UniFi Security Gateway.
+ *
+ * Written for EdgeRouter Lite by: Aaro Koskinen <aaro.koskinen@iki.fi>
+ * Adapted for USG by: Clemens Hopfer <openwrt@wireloss.net>
+ */
+
+/include/ "octeon_3xxx.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+       compatible = "ubnt,usg";
+       model = "Ubiquiti UniFi Security Gateway";
+
+       soc@0 {
+               smi0: mdio@1180000001800 {
+                       phy5: ethernet-phy@5 {
+                               reg = <5>;
+                               compatible = "ethernet-phy-ieee802.3-c22";
+                       };
+                       phy6: ethernet-phy@6 {
+                               reg = <6>;
+                               compatible = "ethernet-phy-ieee802.3-c22";
+                       };
+                       phy7: ethernet-phy@7 {
+                               reg = <7>;
+                               compatible = "ethernet-phy-ieee802.3-c22";
+                       };
+               };
+
+               pip: pip@11800a0000000 {
+                       interface@0 {
+                               ethernet@0 {
+                                       phy-handle = <&phy7>;
+                                       rx-delay = <0>;
+                                       tx-delay = <0x10>;
+                               };
+                               ethernet@1 {
+                                       phy-handle = <&phy6>;
+                                       rx-delay = <0>;
+                                       tx-delay = <0x10>;
+                               };
+                               ethernet@2 {
+                                       phy-handle = <&phy5>;
+                                       rx-delay = <0>;
+                                       tx-delay = <0x10>;
+                               };
+                       };
+               };
+
+               uart0: serial@1180000000800 {
+                       clock-frequency = <500000000>;
+               };
+
+               usbn: usbn@1180068000000 {
+                       refclk-frequency = <12000000>;
+                       refclk-type = "crystal";
+               };
+
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               led_dome_white: led-0 {
+                       label = "white:dome";
+                       gpios = <&gpio 0 GPIO_ACTIVE_HIGH>;
+               };
+
+               led_dome_blue: led-1 {
+                       label = "blue:dome";
+                       gpios = <&gpio 1 GPIO_ACTIVE_HIGH>;
+               };
+       };
+
+       keys {
+               compatible = "gpio-keys-polled";
+               poll-interval = <20>;
+
+               key-restart {
+                       label = "reset";
+                       linux,code = <KEY_RESTART>;
+                       gpios = <&gpio 11 GPIO_ACTIVE_LOW>;
+                       debounce-interval = <60>;
+               };
+       };
+
+       aliases {
+               pip = &pip;
+               led-boot = &led_dome_white;
+               led-failsafe = &led_dome_blue;
+               led-running = &led_dome_blue;
+               led-upgrade = &led_dome_blue;
+       };
+};
index 23adb884f8eabfbca41d04b24014120e5d766bfa..fa845a249910fd495ade89f1b7c0f9a1eb595082 100644 (file)
@@ -84,4 +84,14 @@ define Device/ubnt_edgerouter-lite
 endef
 TARGET_DEVICES += ubnt_edgerouter-lite
 
+define Device/ubnt_unifi-usg
+  $(Device/ubnt_edgerouter-lite)
+  DEVICE_MODEL := UniFi Security Gateway
+  BOARD_NAME := ubnt,usg
+  DEVICE_PACKAGES += kmod-gpio-button-hotplug kmod-leds-gpio
+  DEVICE_DTS := cn5020_ubnt_usg
+  KERNEL += | append-dtb-to-elf
+endef
+TARGET_DEVICES += ubnt_unifi-usg
+
 $(eval $(call BuildImage))
diff --git a/target/linux/octeon/patches-5.10/150-ubnt_usg_support.patch b/target/linux/octeon/patches-5.10/150-ubnt_usg_support.patch
new file mode 100644 (file)
index 0000000..721f657
--- /dev/null
@@ -0,0 +1,46 @@
+--- a/arch/mips/include/asm/octeon/cvmx-bootinfo.h
++++ b/arch/mips/include/asm/octeon/cvmx-bootinfo.h
+@@ -296,6 +296,7 @@ enum cvmx_board_types_enum {
+       CVMX_BOARD_TYPE_CUST_PRIVATE_MIN = 20001,
+       CVMX_BOARD_TYPE_UBNT_E100 = 20002,
+       CVMX_BOARD_TYPE_UBNT_E200 = 20003,
++      CVMX_BOARD_TYPE_UBNT_USG = 20004,
+       CVMX_BOARD_TYPE_UBNT_E220 = 20005,
+       CVMX_BOARD_TYPE_ITUS_SHIELD = 20006,
+       CVMX_BOARD_TYPE_UBNT_E300 = 20300,
+@@ -399,6 +400,7 @@ static inline const char *cvmx_board_typ
+                   /* Customer private range */
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_PRIVATE_MIN)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_UBNT_E100)
++              ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_UBNT_USG)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_UBNT_E200)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_UBNT_E220)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_ITUS_SHIELD)
+--- a/arch/mips/cavium-octeon/octeon-platform.c
++++ b/arch/mips/cavium-octeon/octeon-platform.c
+@@ -634,6 +634,7 @@ static void __init octeon_rx_tx_delay(in
+               }
+               break;
+       case CVMX_BOARD_TYPE_UBNT_E100:
++      case CVMX_BOARD_TYPE_UBNT_USG:
+               if (iface == 0 && port <= 2) {
+                       _octeon_rx_tx_delay(eth, 0x0, 0x10);
+                       return;
+--- a/arch/mips/cavium-octeon/executive/cvmx-helper-board.c
++++ b/arch/mips/cavium-octeon/executive/cvmx-helper-board.c
+@@ -170,6 +170,7 @@ int cvmx_helper_board_get_mii_address(in
+               else
+                       return -1;
+       case CVMX_BOARD_TYPE_UBNT_E100:
++      case CVMX_BOARD_TYPE_UBNT_USG:
+               if (ipd_port >= 0 && ipd_port <= 2)
+                       return 7 - ipd_port;
+               else
+@@ -337,6 +338,7 @@ enum cvmx_helper_board_usb_clock_types _
+       case CVMX_BOARD_TYPE_LANAI2_G:
+       case CVMX_BOARD_TYPE_NIC10E_66:
+       case CVMX_BOARD_TYPE_UBNT_E100:
++      case CVMX_BOARD_TYPE_UBNT_USG:
+               return USB_CLOCK_TYPE_CRYSTAL_12;
+       case CVMX_BOARD_TYPE_NIC10E:
+               return USB_CLOCK_TYPE_REF_12;
diff --git a/target/linux/octeon/patches-5.15/150-ubnt_usg_support.patch b/target/linux/octeon/patches-5.15/150-ubnt_usg_support.patch
new file mode 100644 (file)
index 0000000..721f657
--- /dev/null
@@ -0,0 +1,46 @@
+--- a/arch/mips/include/asm/octeon/cvmx-bootinfo.h
++++ b/arch/mips/include/asm/octeon/cvmx-bootinfo.h
+@@ -296,6 +296,7 @@ enum cvmx_board_types_enum {
+       CVMX_BOARD_TYPE_CUST_PRIVATE_MIN = 20001,
+       CVMX_BOARD_TYPE_UBNT_E100 = 20002,
+       CVMX_BOARD_TYPE_UBNT_E200 = 20003,
++      CVMX_BOARD_TYPE_UBNT_USG = 20004,
+       CVMX_BOARD_TYPE_UBNT_E220 = 20005,
+       CVMX_BOARD_TYPE_ITUS_SHIELD = 20006,
+       CVMX_BOARD_TYPE_UBNT_E300 = 20300,
+@@ -399,6 +400,7 @@ static inline const char *cvmx_board_typ
+                   /* Customer private range */
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_PRIVATE_MIN)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_UBNT_E100)
++              ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_UBNT_USG)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_UBNT_E200)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_UBNT_E220)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_ITUS_SHIELD)
+--- a/arch/mips/cavium-octeon/octeon-platform.c
++++ b/arch/mips/cavium-octeon/octeon-platform.c
+@@ -634,6 +634,7 @@ static void __init octeon_rx_tx_delay(in
+               }
+               break;
+       case CVMX_BOARD_TYPE_UBNT_E100:
++      case CVMX_BOARD_TYPE_UBNT_USG:
+               if (iface == 0 && port <= 2) {
+                       _octeon_rx_tx_delay(eth, 0x0, 0x10);
+                       return;
+--- a/arch/mips/cavium-octeon/executive/cvmx-helper-board.c
++++ b/arch/mips/cavium-octeon/executive/cvmx-helper-board.c
+@@ -170,6 +170,7 @@ int cvmx_helper_board_get_mii_address(in
+               else
+                       return -1;
+       case CVMX_BOARD_TYPE_UBNT_E100:
++      case CVMX_BOARD_TYPE_UBNT_USG:
+               if (ipd_port >= 0 && ipd_port <= 2)
+                       return 7 - ipd_port;
+               else
+@@ -337,6 +338,7 @@ enum cvmx_helper_board_usb_clock_types _
+       case CVMX_BOARD_TYPE_LANAI2_G:
+       case CVMX_BOARD_TYPE_NIC10E_66:
+       case CVMX_BOARD_TYPE_UBNT_E100:
++      case CVMX_BOARD_TYPE_UBNT_USG:
+               return USB_CLOCK_TYPE_CRYSTAL_12;
+       case CVMX_BOARD_TYPE_NIC10E:
+               return USB_CLOCK_TYPE_REF_12;