[PATCH 3/3] realtek: add support for Panasonic Switch-M8eG PN28080K

Sander Vanheule sander at svanheule.net
Fri Nov 12 14:46:24 PST 2021


Hi Hiroshi,

On Sun, 2021-10-03 at 15:53 +0900, INAGAKI Hiroshi wrote:
> Panasonic M8eG PN28080K is a 8 + 1 port gigabit switch, based on
> RTL8380M.
> 
> Specification:
> 
> - SoC           : Realtek RTL8380M
> - RAM           : DDR3 128 MiB (Winbond W631GG8KB-15)
> - Flash         : SPI-NOR 32 MiB (Macronix MX25L25635FMI-10G)
> - Ethernet      : 10/100/1000 Mbps x8 + 1
>   - port 1-8    : TP, RTL8218B (SoC)
>   - port 9      : SFP, RTL8380M (SoC)
> - LEDs/Keys     : 7x / 1x
> - UART          : RS-232 port on the front panel (connector: RJ-45)
>   - 3:TX, 4:GND, 5:GND, 6:RX (pin number: RJ-45)
>   - 9600n8
> - Power         : 100-240 VAC, 50/60 Hz, 0.5 A
>   - Plug        : IEC 60320-C13
> - Stock OS      : VxWorks based
> 
> Flash instruction using initramfs image:

Looks quite convoluted. Kudos on working this out!

> 
> 1.  Prepare the TFTP server with the IP address 192.168.1.111
> 2.  Rename the OpenWrt initramfs image to "0101A8C0.img" and place it to
>     the TFTP directory
> 3.  Download the official upgrading firmware (ex: pn28080k_v30000.rom)
>     and place it to the TFTP directory
> 4.  Boot M8eG and interrupt the U-Boot with Ctrl + C keys
> 5.  Execute the following commands and boot with the OpenWrt initramfs
>     image
> 
>     rtk network on
>     tftpboot 0x81000000
>     bootm
> 
> 6.  Backup mtdblock files to the computer by scp or anything and reboot
> 7.  Interrupt the U-Boot and execute the following commands to re-create
>     filesystem in the flash
> 
>     ffsmount c:/
>     ffsfmt c:/
> 
>     this step takes a long time, about ~ 4 mins
> 
> 8.  Execute the following commands to put the official images to the
>     filesystem
> 
>     updatert <official image>
> 
>     example:
> 
>       updatert pn28080k_v30000.rom
> 
>     this step takes about ~ 40 secs
> 
> 9.  Set the environment variables of the U-Boot by the following commands
> 
>     setenv loadaddr 0xb4e00000
>     setenv bootcmd bootm
>     saveenv
> 
> 10: Download the OpenWrt initramfs image and boot with it
> 
>     tftpboot 0x81000000 0101A8C0.img
>     bootm
> 
> 11: On the initramfs image, download the sysupgrade image and perform
>     sysupgrade with it
> 
>     sysupgrade <imagename>
> 
> 12: Wait ~ 120 seconds to complete flashing
> 
> Note:
> 
> - "Switch-M8eG" is a model name, and "PN28080K" is a model number.
>   Switch-M8eG has an another (old) model number ("PN28080"), it's not a
>   Realtek based hardware.
> 
> - Switch-M8eG has a "POWER" LED (Green), but it's not connected to any
>   GPIO pin.
> 
> - The U-Boot checks the runtime images in the flash when booting and
>   fails to execute anything in "bootcmd" variable if the images are not
>   exsisting.
> 
> - A filesystem is formed in the flash (0x100000-0x1DFFFFF) on the stock
>   firmware and it includes the stock images, configuration files and
>   checksum files. It's unknown format, can't be managed on the OpenWrt.
>   To get the enough space for OpenWrt, move the filesystem to the head
>   of "fs_reserved" partition by execution of "ffsfmt" and "updatert".
> 
> Back to the stock firmware:
> 
> 1. Delete "loadaddr" variable and set "bootcmd" to the original value
> 
>    on U-Boot:
> 
>      setenv loadaddr
>      setenv bootcmd 'bootm 0x81000000'
> 
>    on OpenWrt:
> 
>      fw_setenv loadaddr
>      fw_setenv bootcmd 'bootm 0x81000000'
> 
> 2. Perform reset or reboot
> 
>   on U-Boot:
> 
>     reset
> 
>   on OpenWrt:
> 
>     reboot
> 
> Signed-off-by: INAGAKI Hiroshi <musashino.open at gmail.com>
> ---

[...]

> diff --git a/target/linux/realtek/dts-5.10/rtl83xx_panasonic_mxxeg-pn28xx0k.dtsi
> b/target/linux/realtek/dts-5.10/rtl83xx_panasonic_mxxeg-pn28xx0k.dtsi
> new file mode 100644
> index 0000000000..d41213f1fd
> --- /dev/null
> +++ b/target/linux/realtek/dts-5.10/rtl83xx_panasonic_mxxeg-pn28xx0k.dtsi
> @@ -0,0 +1,216 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
> +
> +#include <dt-bindings/input/input.h>
> +#include <dt-bindings/gpio/gpio.h>
> +
> +/ {
> +       chosen {
> +               bootargs = "console=ttyS0,9600";
> +       };
> +
> +       memory at 0 {
> +               device_type = "memory";
> +               reg = <0x0 0x8000000>;
> +       };
> +
> +       leds: leds {
> +               compatible = "gpio-leds";
> +
> +               any_collision {
> +                       label = "amber:any_col";

Should we start using 'function' and 'color' on 5.10 instead of (or in addition to)
'label'? The functions are non-standard, but the #DEFINE-s in led-common.h are only
strings anyway.

Speaking of following the dt-bindings... I'm aware that you've already discussed the node
names with Adrian, but leds-gpio.yaml currently specifies that child node names shall
match "(^led-[0-9a-f]$|led)". Adrian, what do you think about following the spec?

> +                       gpios = <&gpio2 0 GPIO_ACTIVE_LOW>;
> +               };
> +
> +               giga {
> +                       label = "green:giga";
> +                       gpios = <&gpio2 8 GPIO_ACTIVE_LOW>;
> +               };
> +
> +               100m {
> +                       label = "green:100m";
> +                       gpios = <&gpio2 9 GPIO_ACTIVE_LOW>;
> +               };
> +
> +               full_duplex {
> +                       label = "green:full";
> +                       gpios = <&gpio2 10 GPIO_ACTIVE_LOW>;
> +               };
> +
> +               loop_history {
> +                       label = "green:loop_history";
> +                       gpios = <&gpio2 11 GPIO_ACTIVE_LOW>;
> +               };
> +       };
> +
> +       keys {
> +               compatible = "gpio-keys-polled";
> +               poll-interval = <20>;
> +
> +               led_mode {
> +                       label = "led-mode";
> +                       gpios = <&gpio2 15 GPIO_ACTIVE_LOW>;
> +                       linux,code = <BTN_0>;
> +               };
> +       };
> +
> +       gpio-restart {
> +               compatible = "gpio-restart";
> +               gpios = <&gpio2 3 GPIO_ACTIVE_HIGH>;
> +               active-delay = <100>;
> +               inactive-delay = <100>;
> +               wait-delay = <3000>;
> +       };

As noted in my other mail, this currently only has the effect of grabbing the GPIO pin.
Once _machine_restart is removed, you may have to increase the priority beyond the default
of 128, otherwise it's not guaranteed this reboot method will be used.


> +
> +       /* Switch-M*eG PN28xx0K has no RTL8231 chip */
> +       /delete-node/ rtl8231-gpio;
> +
> +       i2c_gpio_0: i2c-gpio-0 {
> +               compatible = "i2c-gpio";
> +               i2c-gpio,delay-us = <2>;
> +               #address-cells = <1>;
> +               #size-cells = <0>;
> +
> +               gpio1: gpio at 20 {
> +                       compatible = "nxp,pca9555";
> +                       reg = <0x20>;
> +                       gpio-controller;
> +                       #gpio-cells = <2>;
> +               };
> +
> +               gpio2: gpio at 75 {
> +                       compatible = "nxp,pca9539";

The #INT pin of this chip doens't happen to be wired up? If it is, I would expect you
could cascade the interrupts through &gpio0.

> +                       reg = <0x75>;
> +                       gpio-controller;
> +                       #gpio-cells = <2>;
> +
> +                       /*
> +                        * GPIO14 (IO1_6): Shift Register RESET (port LED)
> +                        * - Switch-M8eG  PN28080K:  3x 74HC164
> +                        * - Switch-M24eG PN28240K:  6x 74HC164
> +                        * - Switch-M48eG PN28480K: 12x 74HC164
> +                        */
> +                       portled_sregister_reset {
> +                               gpio-hog;
> +                               gpios = <14 GPIO_ACTIVE_HIGH>;
> +                               output-high;
> +                               line-name = "portled-sregister-reset";
> +                       };
> +               };
> +       };

[...]

> +&spi0 {
> +       status = "okay";
> +
> +       flash at 0 {
> +               compatible = "jedec,spi-nor";
> +               reg = <0>;
> +               spi-max-frequency = <10000000>;
> +
> +               partitions {
> +                       compatible = "fixed-partitions";
> +                       #address-cells = <1>;
> +                       #size-cells = <1>;
> +
> +                       partition at 0 {
> +                               label = "u-boot";
> +                               reg = <0x0 0x80000>;
> +                               read-only;
> +                       };
> +
> +                       partition at 80000 {
> +                               label = "u-boot-env";
> +                               reg = <0x80000 0x10000>;
> +                       };
> +
> +                       partition at 90000 {
> +                               label = "u-boot-env2";
> +                               reg = <0x90000 0x10000>;
> +                       };
> +
> +                       partition at a0000 {
> +                               label = "sysinfo";
> +                               reg = <0xa0000 0x60000>;
> +                               read-only;
> +                       };
> +
> +                       /*
> +                        * 0x100000 - 0x1DFFFFF
> +                        * Filesystem area for runtime images and
> +                        * configuration files in stock firmware
> +                        */
> +
> +                       /*
> +                        * re-created filesystem area, 2x stock images
> +                        * are included with checksum files
> +                        */

Can you merge both comments? Now it first seemed to me that you were describing a missing
area first, followed by some partitions.

> +                       partition at 100000 {
> +                               label = "fs_reserved";
> +                               reg = <0x100000 0xd00000>;
> +                       };
> +
> +                       /* free area for OpenWrt */

You can drop this comments as far as I'm concerned. The label and compatible should be
enough for an OpenWrt developer to recognise it for what it is.

> +                       partition at e00000 {
> +                               compatible = "denx,uimage";
> +                               label = "firmware";
> +                               reg = <0xe00000 0x1000000>;
> +                       };

Best,
Sander



More information about the openwrt-devel mailing list