realtek: add support for TP-Link SG2008P
authorAlexandru Gagniuc <mr.nuke.me@gmail.com>
Tue, 19 Jul 2022 17:01:11 +0000 (12:01 -0500)
committerSander Vanheule <sander@svanheule.net>
Sat, 13 Aug 2022 17:59:47 +0000 (19:59 +0200)
Add support for the TP-Link SG2008P switch. This is an RTL8380 based
switch with 802.3af one the first four ports.

Specifications:
---------------
 * SoC:       Realtek RTL8380M
 * Flash:     32 MiB SPI flash (Vendor varies)
 * RAM:       256 MiB (Vendor varies)
 * Ethernet:  8x 10/100/1000 Mbps with PoE on 4 ports
 * Buttons:   1x "Reset" button on front panel
 * Power:     53.5V DC barrel jack
 * UART:      1x serial header, unpopulated
 * PoE:       1x TI TPS23861 I2C PoE controller

Works:
------
  - (8) RJ-45 ethernet ports
  - Switch functions
  - System LED

Not yet enabled:
----------------
  - Power-over-Ethernet (driver works, but doesn't enable "auto" mode)
  - PoE, Link/Act, PoE max and System LEDs

Install via web interface:
-------------------------

Not supported at this time.

Install via serial console/tftp:
--------------------------------

The footprints R27 (0201) and R28 (0402) are not populated. To enable
serial console, 50 ohm resistors should be soldered -- any value from
0 ohm to 50 ohm will work. R27 can be replaced by a solder bridge.

The u-boot firmware drops to a TP-Link specific "BOOTUTIL" shell at
38400 baud. There is no known way to exit out of this shell, and no
way to do anything useful.

Ideally, one would trick the bootloader into flashing the sysupgrade
image first. However, if the image exceeds 6MiB in size, it will not
work. The sysupgrade image can also be flashed. To install OpenWRT:

Prepare a tftp server with:
 1. server address: 192.168.0.146
 2. the image as: "uImage.img"

Power on device, and stop boot by pressing any key.
Once the shell is active:
 1. Ground out the CLK (pin 16) of the ROM (U7)
 2. Select option "3. Start"
 3. Bootloader notes that "The kernel has been damaged!"
 4. Release CLK as sson as bootloader thinks image is corrupted.
 5. Bootloader enters automatic recovery -- details printed on console
 6. Watch as the bootloader flashes and boots OpenWRT.

Blind install via tftp:
-----------------------

This method works when it's not feasible to install a serial header.

Prepare a tftp server with:
 1. server address: 192.168.0.146
 2. the image as: "uImage.img"
 3. Watch network traffic (tcpdump or wireshark works)
 4. Power on the device.
 5. Wait 1-2 seconds then ground out the CLK (pin 16) of the ROM (U7)
 6. When 192.168.0.30 makes tftp requests, release pin 16
 7. Wait 2-3 minutes for device to auto-flash and boot OpenWRT

Signed-off-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
package/boot/uboot-envtools/files/realtek
target/linux/realtek/base-files/etc/board.d/02_network
target/linux/realtek/base-files/lib/upgrade/platform.sh
target/linux/realtek/dts-5.10/rtl8380_tplink_sg2008p-v1.dts [new file with mode: 0644]
target/linux/realtek/image/rtl838x.mk
target/linux/realtek/rtl838x/config-5.10

index 93cccfdc3e9a5ff6fa9794cf89acefe7c736a251..39be783ea3e53c47b13478e2d94b967c47d1e899 100644 (file)
@@ -28,6 +28,11 @@ zyxel,gs1900-24hp-v2)
        [ -n "$idx2" ] && \
                ubootenv_add_uci_sys_config "/dev/mtd$idx2" "0x0" "0x1000" "0x10000"
        ;;
+tplink,sg2008p-v1)
+       idx="$(find_mtd_index u-boot-env)"
+       [ -n "$idx" ] && \
+               ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x20000" "0x10000"
+       ;;
 iodata,bsh-g24mb)
        idx="$(find_mtd_index u-boot-env)"
        [ -n "$idx" ] && \
index 87d772cf84029ba80b6855c49beb445d33817535..d797960faffd7ccaa63d6d199d5ed58f977a90a2 100644 (file)
@@ -39,6 +39,10 @@ hpe,1920-24g)
        lan_mac_start=$(macaddr_add $lan_mac 2)
        lan_mac_end=$(macaddr_add $lan_mac $((mac_count2-mac_count1)))
        ;;
+tplink,sg2008p-v1)
+       label_mac=$(mtd_get_mac_binary para 0xfdff4)
+       lan_mac="$label_mac"
+       ;;
 *)
        lan_mac=$(mtd_get_mac_ascii u-boot-env2 mac_start)
        lan_mac_end=$(mtd_get_mac_ascii u-boot-env2 mac_end)
index 927aadbe311eb7171fe9c38ed78588981ac0e887..b39b33206310d3a2ff4a8fd2bfaa130890bbb3a2 100644 (file)
@@ -4,6 +4,21 @@ REQUIRE_IMAGE_METADATA=1
 RAMFS_COPY_BIN='fw_printenv fw_setenv'
 RAMFS_COPY_DATA='/etc/fw_env.config /var/lock/fw_printenv.lock'
 
+# The TP-Link bootloader gets its flash layout from "bootargs".
+# Use this to our advantage, and:
+#  1. Disable the second rootfs (usrimg2)
+#  2. Extend the first rootfs (usrimg1) to include more space
+#  3. Increase the baudrate to the expected 115200
+tplink_sg2xxx_fix_mtdparts() {
+       local args
+       args="bootargs mtdparts=spi_flash:896K(boot),128K(env),6144K(sys)"
+       args="$args,20480K(usrimg1@main),0K(usrimg2)"
+       args="$args,4096K(usrappfs),1024K(para)\n"
+       args="$args baudrate 115200"
+
+       echo -e "$args" | fw_setenv --script -
+}
+
 platform_check_image() {
        return 0
 }
@@ -12,6 +27,10 @@ platform_do_upgrade() {
        local board=$(board_name)
 
        case "$board" in
+       tplink,sg2008p-v1)
+               tplink_sg2xxx_fix_mtdparts
+               default_do_upgrade "$1"
+               ;;
        *)
                default_do_upgrade "$1"
                ;;
diff --git a/target/linux/realtek/dts-5.10/rtl8380_tplink_sg2008p-v1.dts b/target/linux/realtek/dts-5.10/rtl8380_tplink_sg2008p-v1.dts
new file mode 100644 (file)
index 0000000..2cce03b
--- /dev/null
@@ -0,0 +1,184 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "rtl838x.dtsi"
+
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/gpio/gpio.h>
+
+/ {
+       compatible = "tplink,sg2008p-v1", "realtek,rtl838x-soc";
+       model = "TP-Link SG2008P v1";
+
+       aliases {
+               led-boot = &led_power;
+               led-failsafe = &led_power;
+               led-running = &led_power;
+               led-upgrade = &led_power;
+       };
+
+       memory@0 {
+               device_type = "memory";
+               reg = <0x0 0x10000000>;
+       };
+
+       keys {
+               compatible = "gpio-keys";
+
+               reset {
+                       label = "reset";
+                       gpios = <&gpio0 2 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_RESTART>;
+               };
+       };
+
+       gpio-restart {
+               compatible = "gpio-restart";
+               gpios = <&gpio0 3 GPIO_ACTIVE_LOW>;
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               led_power: led-0 {
+                       label = "green:power";
+                       gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>;
+               };
+       };
+
+       i2c1: i2c-gpio-1 {
+               compatible = "i2c-gpio";
+               scl-gpios = <&gpio0 0 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+               sda-gpios = <&gpio0 1 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+               i2c-gpio,delay-us = <2>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               tps23861@30 {
+                       compatible = "ti,tps23861";
+                       reg = <0x30>;
+                       shunt-resistor-micro-ohms = <255000>;
+               };
+       };
+
+       watchdog {
+               compatible = "linux,wdt-gpio";
+               gpios = <&gpio0 11 GPIO_ACTIVE_HIGH>;
+               hw_algo = "toggle";
+               /* SGM706 specs: typical 1.6s, but minimum 1.0s. */
+               hw_margin_ms = <1000>;
+       };
+
+       virtual_flash {
+               compatible = "mtd-concat";
+
+               devices = <&syspart &usrpart>;
+
+               partitions {
+                       compatible = "fixed-partitions";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       partition@0 {
+                               compatible = "denx,uimage";
+                               label = "firmware";
+                               reg = <0x0 0x1a00000>;
+                       };
+               };
+       };
+};
+
+&gpio0 {
+       watchdog-enable {
+               gpio-hog;
+               gpios = <14 GPIO_ACTIVE_LOW>;
+               output-low;
+               line-name = "watchdog-enable";
+       };
+};
+
+&spi0 {
+       status = "okay";
+
+       flash@0 {
+               compatible = "jedec,spi-nor";
+               reg = <0>;
+               spi-max-frequency = <10000000>;
+
+               partitions {
+                       compatible = "fixed-partitions";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       partition@0 {
+                               label = "u-boot";
+                               reg = <0x0 0xe0000>;
+                               read-only;
+                       };
+                       partition@e0000 {
+                               label = "u-boot-env";
+                               reg = <0xe0000 0x20000>;
+                       };
+                       syspart: partition@100000 {
+                               label = "sys";
+                               reg = <0x100000 0x600000>;
+                       };
+                       usrpart: partition@700000 {
+                               label = "usrimg1";
+                               reg = <0x700000 0x1400000>;
+                       };
+                       partition@1b00000 {
+                               label = "usrappfs";
+                               reg = <0x1b00000 0x400000>;
+                       };
+                       partition@1f00000 {
+                               label = "para";
+                               reg = <0x1f00000 0x100000>;
+                               read-only;
+                       };
+               };
+       };
+};
+
+&ethernet0 {
+       mdio: mdio-bus {
+               compatible = "realtek,rtl838x-mdio";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               INTERNAL_PHY(8)
+               INTERNAL_PHY(9)
+               INTERNAL_PHY(10)
+               INTERNAL_PHY(11)
+               INTERNAL_PHY(12)
+               INTERNAL_PHY(13)
+               INTERNAL_PHY(14)
+               INTERNAL_PHY(15)
+       };
+};
+
+&switch0 {
+       ports {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               SWITCH_PORT(8, 1, internal)
+               SWITCH_PORT(9, 2, internal)
+               SWITCH_PORT(10, 3, internal)
+               SWITCH_PORT(11, 4, internal)
+               SWITCH_PORT(12, 5, internal)
+               SWITCH_PORT(13, 6, internal)
+               SWITCH_PORT(14, 7, internal)
+               SWITCH_PORT(15, 8, internal)
+
+               port@28 {
+                       ethernet = <&ethernet0>;
+                       reg = <28>;
+                       phy-mode = "internal";
+
+                       fixed-link {
+                               speed = <1000>;
+                               full-duplex;
+                       };
+               };
+       };
+};
index 9e1dd0308df3c4c22e1fcb37b70588444f836711..e748d414bcc0cc3e139351c529e3741d1d5e386b 100644 (file)
@@ -168,6 +168,17 @@ define Device/panasonic_m8eg-pn28080k
 endef
 TARGET_DEVICES += panasonic_m8eg-pn28080k
 
+define Device/tplink_sg2008p-v1
+  SOC := rtl8380
+  KERNEL_SIZE := 6m
+  IMAGE_SIZE := 26m
+  DEVICE_VENDOR := TP-Link
+  DEVICE_MODEL := SG2008P
+  DEVICE_VARIANT := v1
+  DEVICE_PACKAGES := kmod-hwmon-tps23861
+endef
+TARGET_DEVICES += tplink_sg2008p-v1
+
 define Device/zyxel_gs1900
   SOC := rtl8380
   IMAGE_SIZE := 6976k
index d046c7daeb276a97605b6c3b9dde08be52625951..6b90b280c9dc5bce8130fcca406f25b902ad950d 100644 (file)
@@ -138,6 +138,7 @@ CONFIG_MTD_SPLIT_FIRMWARE=y
 CONFIG_MTD_SPLIT_H3C_VFS=y
 CONFIG_MTD_SPLIT_TPLINK_FW=y
 CONFIG_MTD_SPLIT_UIMAGE_FW=y
+CONFIG_MTD_VIRT_CONCAT=y
 CONFIG_NEED_DMA_MAP_STATE=y
 CONFIG_NEED_PER_CPU_KM=y
 CONFIG_NET_DEVLINK=y