diff mbox series

[OpenWrt-Devel,v2] ramips: Add support for Head Weblink HDRM200

Message ID 20190503145852.6125-1-kristian.evensen@gmail.com
State Changes Requested, archived
Delegated to: Petr Štetiar
Headers show
Series [OpenWrt-Devel,v2] ramips: Add support for Head Weblink HDRM200 | expand

Commit Message

Kristian Evensen May 3, 2019, 2:58 p.m. UTC
Head Weblink HDRM200 is a dual-sim router based on MT7620A. The detailed
specifications are:

- MT7620A (580MHz)
- 64MB RAM
- 16MB of flash (SPI NOR)
- 6x 10/100Mbps Ethernet (MT7620A built-in switch)
- 1x microSD slot
- 1x miniPCIe slot (only USB2.0 bus)
- 2x SIM slots (standard size)
- 1x USB2.0 port
- 1x 2.4GHz wifi (rt2800)
- 1x 5GHz wifi (mt7621)
- 1x reset button
- 1x WPS button
- 3x GPIO-controllable LEDs
- 1x 10 pin terminal block (RS232, RS485, 4 x GPIO)

Tested:
- Ethernet switch
- Wifi
- USB slot
- SD card slot
- miniPCIe-slot
- sysupgrade
- reset button

Installation instructions:

Installing OpenWRT for the first time requires a bit of work, as the
board does not ship with OpenWRT. In addition, the bootloader
automatically reboots when installing an image over tftp.

In order to install OpenWRT, you first need to compile an initramfs
(ramdisk)-image for the device. Once the image is ready, you need to do
the following:

* Copy the initramfs-image to your tftp-root (default filename is
test.bin) and configure networking accordingly (default server IP is
10.10.10.3, client 10.10.10.123). Start your tftp server.
* Open the board and connect to UART. The pins are exposed and clearly
marked.
* Boot the board and press 1.
* Either use the default filename and client/server IP-addresses, or
specify your own.

The image should now be loaded to memory and board boot. If the router
reboots while the image is loading, you need to try again. Once the
board has booted, copy the sysupgrade-image to the router and run
sysupgrade in order to install OpenWRT to the flash.

Notes:

- You control which SIM slot to use by writing 0/1 to
/sys/class/gpio/sim_switch/value. In order for the change to take
effect, you can either use AT-commands (AT+CFUN) or power-cycle the
modem (write 0/1 to /sys/class/gpio/power_mpcie/value).
- RS485 is available on /dev/ttyS0.
- RS232 is available on /dev/ttyS1.
- The name of the ioX-gpios map to the labels on the casing.

v1->v2:
* Add SPDX line to DTS (thanks Rafał Miłecki).

Signed-off-by: Kristian Evensen <kristian.evensen@gmail.com>
---
 .../ramips/base-files/etc/board.d/01_leds     |   3 +
 .../ramips/base-files/etc/board.d/02_network  |   1 +
 target/linux/ramips/base-files/lib/ramips.sh  |   3 +
 target/linux/ramips/dts/HDRM200.dts           | 227 ++++++++++++++++++
 target/linux/ramips/image/mt7620.mk           |   8 +
 5 files changed, 242 insertions(+)
 create mode 100644 target/linux/ramips/dts/HDRM200.dts

Comments

Petr Štetiar May 3, 2019, 4:32 p.m. UTC | #1
Kristian Evensen <kristian.evensen@gmail.com> [2019-05-03 16:58:52]:

Hi,

> In order to install OpenWRT, you first need to compile an initramfs
> (ramdisk)-image for the device.

if the ramdisk image is needed, then we probably should enable it for that
target and provide it, we shouldn't demand end users to build the ramdisk
images by themselves in order to be able to install OpenWrt, right?

This needs adding `ramdisk` in FEATURES in target.mk.

> * Copy the initramfs-image to your tftp-root (default filename is
> test.bin) and configure networking accordingly (default server IP is
> 10.10.10.3, client 10.10.10.123). Start your tftp server.
> * Open the board and connect to UART. The pins are exposed and clearly
> marked.
> * Boot the board and press 1.
> * Either use the default filename and client/server IP-addresses, or
> specify your own.
> 
> The image should now be loaded to memory and board boot. If the router
> reboots while the image is loading, you need to try again. 

Why does it reboot? Is there any kind of watchdog? Do you get any error in the
bootloader?

> diff --git a/target/linux/ramips/base-files/etc/board.d/01_leds b/target/linux/ramips/base-files/etc/board.d/01_leds
> index fa20ab0714..f9ca5c47b8 100755
> --- a/target/linux/ramips/base-files/etc/board.d/01_leds
> +++ b/target/linux/ramips/base-files/etc/board.d/01_leds
> @@ -184,6 +184,9 @@ hc5861)
>  	ucidef_set_led_netdev "wifi5g" "wifi5g" "$boardname:blue:wlan5g" "wlan0"
>  	ucidef_set_led_netdev "wifi2g" "wifi2g" "$boardname:blue:wlan2g" "wlan1"
>  	;;
> +hdrm200)

this should match device from the DT compatible property and use generic
board/model detection as introduced in commit b3d699bdd3caa3d ("base-files:
add generic preinit script to extract board/model info from device-tree").

> +	set_wifi_led "$boardname:green:wifi"
> +	;;
>  hg255d)
>  	set_wifi_led "$boardname:green:wlan"
>  	ucidef_set_led_netdev "internet" "internet" "$boardname:green:internet" "eth0.2"
> diff --git a/target/linux/ramips/base-files/etc/board.d/02_network b/target/linux/ramips/base-files/etc/board.d/02_network
> index c2646876a2..8ae41ae59e 100755
> --- a/target/linux/ramips/base-files/etc/board.d/02_network
> +++ b/target/linux/ramips/base-files/etc/board.d/02_network
> @@ -314,6 +314,7 @@ ramips_setup_interfaces()
>  			"1:lan" "2:lan" "3:lan" "4:lan" "0:wan" "6@eth0"
>  		;;
>  	hc5661|\
> +	hdrm200|\

ditto here.

>  	y1s)
>  		ucidef_add_switch "switch0" \
>  			"1:lan" "2:lan" "3:lan" "4:lan" "5:lan" "0:wan" "6@eth0"
> diff --git a/target/linux/ramips/base-files/lib/ramips.sh b/target/linux/ramips/base-files/lib/ramips.sh
> index 093303892c..6d5a9cc391 100755
> --- a/target/linux/ramips/base-files/lib/ramips.sh
> +++ b/target/linux/ramips/base-files/lib/ramips.sh
> @@ -229,6 +229,9 @@ ramips_board_detect() {
>  	*"HC5962")
>  		name="hc5962"
>  		;;
> +	*"HDRM200")
> +		name="hdrm200"
> +		;;

so this is not necessary anymore and you can drop it.

> diff --git a/target/linux/ramips/dts/HDRM200.dts b/target/linux/ramips/dts/HDRM200.dts
> new file mode 100644
> index 0000000000..05e0b1a6dc
> --- /dev/null
> +++ b/target/linux/ramips/dts/HDRM200.dts

...

> +	gpio-export {
> +		compatible = "gpio-export";
> +		#size-cells = <0>;
> +
> +		sim_switch {
> +			gpio-export,name = "sim_switch";
> +			gpio-export,output = <1>;
> +			gpios = <&gpio0 0 GPIO_ACTIVE_LOW>;
> +		};
> +
> +		io1 {
> +			gpio-export,name = "io1";
> +			gpio-export,output = <1>;
> +			gpios = <&gpio0 1 GPIO_ACTIVE_LOW>;
> +		};
> +
> +		io2 {
> +			gpio-export,name = "io2";
> +			gpio-export,output = <1>;
> +			gpios = <&gpio0 2 GPIO_ACTIVE_LOW>;
> +		};
> +
> +		io3 {
> +			gpio-export,name = "io3";
> +			gpio-export,output = <1>;
> +			gpios = <&gpio0 11 GPIO_ACTIVE_LOW>;
> +		};
> +
> +		io4 {
> +			gpio-export,name = "io4";
> +			gpio-export,output = <1>;
> +			gpios = <&gpio0 14 GPIO_ACTIVE_LOW>;
> +		};
> +
> +		power_mpcie {
> +			gpio-export,name = "power_mpcie";
> +			gpio-export,output = <1>;
> +			gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>;
> +		};
> +	};

We're trying to get rid of the `gpio-export` functionality as it's hack for
missing kernel functionality, which was rejected in upstream kernel long time
ago, for details see this email
http://lists.infradead.org/pipermail/openwrt-devel/2019-February/015772.html,
discussion in #1366 or
https://github.com/openwrt/openwrt/pull/1814#issuecomment-462942022.

So I'm wondering if it would be possible to replace the `gpio-export`
construct with the userspace gpio-switch alternative, for example
https://github.com/openwrt/openwrt/blob/master/target/linux/layerscape/base-files/etc/board.d/03_gpio_switches#L20-L22

> +&spi0 {
> +	status = "okay";
> +
> +	w25q128@0 {

Can you please change the node name to more generic name `flash@0` and try if
it boots for you?

> +&ethernet {
> +	status = "okay";

I would add newline here in order to separate the `status` property from the
rest.

> +&pinctrl {
> +	state_default: pinctrl0 {
> +		default {
> +			ralink,group = "i2c", "uartf", "pa", "spi refclk", "wled";
> +			ralink,function = "gpio";
> +		};
> +	};
> +};

...

> --- a/target/linux/ramips/image/mt7620.mk
> +++ b/target/linux/ramips/image/mt7620.mk
> @@ -358,6 +358,14 @@ define Device/hc5861
>  endef
>  TARGET_DEVICES += hc5861
>  
> +define Device/hdrm200

this should be set to `Device/head-weblink_hdrm200` in order to add
SUPPORTED_DEVICES variable with the proper value, matching the one in the DT
compatible.

> +  DTS := HDRM200
> +  IMAGE_SIZE := $(ralink_default_fw_size_16M)
> +  DEVICE_TITLE := Head Weblink HDRM2000
> +  DEVICE_PACKAGES := kmod-mt76x2 kmod-usb2 kmod-usb-ohci kmod-sdhci-mt7620
> +endef
> +TARGET_DEVICES += hdrm200

TARGET_DEVICES += head-weblink_hdrm200

-- ynezz
Kristian Evensen May 4, 2019, 10:07 a.m. UTC | #2
Hi Petr,

Thanks a lot for your feedback. I have implemented most of it and the
board seems to work fine, but I have some questions.

On Fri, May 3, 2019 at 6:32 PM Petr Štetiar <ynezz@true.cz> wrote:
> > In order to install OpenWRT, you first need to compile an initramfs
> > (ramdisk)-image for the device.
>
> if the ramdisk image is needed, then we probably should enable it for that
> target and provide it, we shouldn't demand end users to build the ramdisk
> images by themselves in order to be able to install OpenWrt, right?
>
> This needs adding `ramdisk` in FEATURES in target.mk.

I agree, building a ramdisk-image by default would be preferable.
However, wont adding ramdisk to FEATURES build a ramdisk image for all
mt7620-boards? Do you know any way to avoid that?

Also, I am having some issues getting a ramdisk image to be built by
default. After adding ramdisk to FEATURES, I still need to manually
choose to build a ramdisk image. I have spent some time looking into
the different mk-files to try to figure out what could be wrong, but
without any luck. Do you have any pointers?

> > The image should now be loaded to memory and board boot. If the router
> > reboots while the image is loading, you need to try again.
>
> Why does it reboot? Is there any kind of watchdog? Do you get any error in the
> bootloader?

Why the board reboots is a good question. I tried to ask the
manufacturer, but got no answer. There are no errors  as the board
just suddenly reboots, but I do suspect that there is some kind of
watchdog triggering the reboots. The reboot seems to occur after
roughly the same time, but something needs to happen for the reboot to
be triggered. For example, I can idle on the bootloader command line
for as long as I want. However, if I wait sufficiently long before
pressing enter, then the board reboots.

> > +&pinctrl {
> > +     state_default: pinctrl0 {
> > +             default {
> > +                     ralink,group = "i2c", "uartf", "pa", "spi refclk", "wled";
> > +                     ralink,function = "gpio";
> > +             };
> > +     };
> > +};
>
> ...

I have to admit that I don't understand what you are refering to there
(unless it is the too long "ralink,group"-line) :)

Thanks again for your comments!

BR,
Kristian
Kristian Evensen May 5, 2019, 10:41 a.m. UTC | #3
Hello again,

On Sat, May 4, 2019 at 12:07 PM Kristian Evensen
<kristian.evensen@gmail.com> wrote:
> Also, I am having some issues getting a ramdisk image to be built by
> default. After adding ramdisk to FEATURES, I still need to manually
> choose to build a ramdisk image. I have spent some time looking into
> the different mk-files to try to figure out what could be wrong, but
> without any luck. Do you have any pointers?

I made a second attempt here and turns out I had made a stupid mistake
- I had forgot to remove my old config. After starting from a clean
build dir, ramdisk is correctly enabled after selecting mt7620. I
still wonder if there is a way to only enable ramdisk for the HDRM200
though.

BR,
Kristian
Tom Psyborg May 5, 2019, 10:53 a.m. UTC | #4
On 03/05/2019, Kristian Evensen <kristian.evensen@gmail.com> wrote:
> Head Weblink HDRM200 is a dual-sim router based on MT7620A. The detailed
> specifications are:
>
> - MT7620A (580MHz)
> - 64MB RAM
> - 16MB of flash (SPI NOR)
> - 6x 10/100Mbps Ethernet (MT7620A built-in switch)
> - 1x microSD slot
> - 1x miniPCIe slot (only USB2.0 bus)
> - 2x SIM slots (standard size)
> - 1x USB2.0 port
> - 1x 2.4GHz wifi (rt2800)
> - 1x 5GHz wifi (mt7621)

Hi

mt7621 is not wifi chip, you should update the description or just
leave mt76 if you intention is to specify supporting driver.
Kristian Evensen May 5, 2019, 11:05 a.m. UTC | #5
Hi,

On Sun, May 5, 2019 at 12:53 PM Tom Psyborg <pozega.tomislav@gmail.com> wrote:
> > - 1x 5GHz wifi (mt7621)
>
> mt7621 is not wifi chip, you should update the description or just
> leave mt76 if you intention is to specify supporting driver.

Thanks for spotting this typo. I know very well that mt7621 is not a
wifi chip, it should have said mt7612.

BR,
Kristian
Petr Štetiar May 5, 2019, 8:26 p.m. UTC | #6
Kristian Evensen <kristian.evensen@gmail.com> [2019-05-04 12:07:33]:

Hi,

> On Fri, May 3, 2019 at 6:32 PM Petr Štetiar <ynezz@true.cz> wrote:
> > > In order to install OpenWRT, you first need to compile an initramfs
> > > (ramdisk)-image for the device.
> >
> > if the ramdisk image is needed, then we probably should enable it for that
> > target and provide it, we shouldn't demand end users to build the ramdisk
> > images by themselves in order to be able to install OpenWrt, right?
> >
> > This needs adding `ramdisk` in FEATURES in target.mk.
> 
> I agree, building a ramdisk-image by default would be preferable.
> However, wont adding ramdisk to FEATURES build a ramdisk image for all
> mt7620-boards? Do you know any way to avoid that?

Unfortunately no, but I've just proposed[1] some temporary workaround, so
let's see how this pans out. Until it's accepted, I would simply go with that
proposed `FEATURES += ramdisk` based solution.

1. http://lists.infradead.org/pipermail/openwrt-devel/2019-May/016931.html

> > > +&pinctrl {
> > > +     state_default: pinctrl0 {
> > > +             default {
> > > +                     ralink,group = "i2c", "uartf", "pa", "spi refclk", "wled";
> > > +                     ralink,function = "gpio";
> > > +             };
> > > +     };
> > > +};
> >
> > ...
> 
> I have to admit that I don't understand what you are refering to there
> (unless it is the too long "ralink,group"-line) :)

It's just a poor-man's replacement for a picture of scissors, meaning, that
I've simply removed some text around this `...` line.

BTW, I haven't had time to check correctness of this pinctrl yet, but I'll do
so.

-- ynezz
Kristian Evensen May 6, 2019, 8:14 a.m. UTC | #7
Hi Petr,

On Sun, May 5, 2019 at 10:26 PM Petr Štetiar <ynezz@true.cz> wrote:
> Unfortunately no, but I've just proposed[1] some temporary workaround, so
> let's see how this pans out. Until it's accepted, I would simply go with that
> proposed `FEATURES += ramdisk` based solution.
>
> 1. http://lists.infradead.org/pipermail/openwrt-devel/2019-May/016931.html

Thanks. I have tested the selective-ramdisk approach with HDRM200 and
it works fine, but since it is not merged then my current
v3-submission sets the ramdisk feature.

> It's just a poor-man's replacement for a picture of scissors, meaning, that
> I've simply removed some text around this `...` line.

Aha, I see :)

> BTW, I haven't had time to check correctness of this pinctrl yet, but I'll do
> so.

Ok, I will wait with submitting a v3 until you are done with this.

BR,
Kristian
diff mbox series

Patch

diff --git a/target/linux/ramips/base-files/etc/board.d/01_leds b/target/linux/ramips/base-files/etc/board.d/01_leds
index fa20ab0714..f9ca5c47b8 100755
--- a/target/linux/ramips/base-files/etc/board.d/01_leds
+++ b/target/linux/ramips/base-files/etc/board.d/01_leds
@@ -184,6 +184,9 @@  hc5861)
 	ucidef_set_led_netdev "wifi5g" "wifi5g" "$boardname:blue:wlan5g" "wlan0"
 	ucidef_set_led_netdev "wifi2g" "wifi2g" "$boardname:blue:wlan2g" "wlan1"
 	;;
+hdrm200)
+	set_wifi_led "$boardname:green:wifi"
+	;;
 hg255d)
 	set_wifi_led "$boardname:green:wlan"
 	ucidef_set_led_netdev "internet" "internet" "$boardname:green:internet" "eth0.2"
diff --git a/target/linux/ramips/base-files/etc/board.d/02_network b/target/linux/ramips/base-files/etc/board.d/02_network
index c2646876a2..8ae41ae59e 100755
--- a/target/linux/ramips/base-files/etc/board.d/02_network
+++ b/target/linux/ramips/base-files/etc/board.d/02_network
@@ -314,6 +314,7 @@  ramips_setup_interfaces()
 			"1:lan" "2:lan" "3:lan" "4:lan" "0:wan" "6@eth0"
 		;;
 	hc5661|\
+	hdrm200|\
 	y1s)
 		ucidef_add_switch "switch0" \
 			"1:lan" "2:lan" "3:lan" "4:lan" "5:lan" "0:wan" "6@eth0"
diff --git a/target/linux/ramips/base-files/lib/ramips.sh b/target/linux/ramips/base-files/lib/ramips.sh
index 093303892c..6d5a9cc391 100755
--- a/target/linux/ramips/base-files/lib/ramips.sh
+++ b/target/linux/ramips/base-files/lib/ramips.sh
@@ -229,6 +229,9 @@  ramips_board_detect() {
 	*"HC5962")
 		name="hc5962"
 		;;
+	*"HDRM200")
+		name="hdrm200"
+		;;
 	*"HG255D")
 		name="hg255d"
 		;;
diff --git a/target/linux/ramips/dts/HDRM200.dts b/target/linux/ramips/dts/HDRM200.dts
new file mode 100644
index 0000000000..05e0b1a6dc
--- /dev/null
+++ b/target/linux/ramips/dts/HDRM200.dts
@@ -0,0 +1,227 @@ 
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+/dts-v1/;
+
+#include "mt7620a.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+	compatible = "head-weblink,hdrm200", "ralink,mt7620a-soc";
+	model = "Head Weblink HDRM200";
+
+	aliases {
+		led-boot = &led_system;
+		led-failsafe = &led_system;
+		led-running = &led_system;
+		led-upgrade = &led_system;
+	};
+
+	chosen {
+		bootargs = "console=ttyS1,57600";
+	};
+
+	gpio-export {
+		compatible = "gpio-export";
+		#size-cells = <0>;
+
+		sim_switch {
+			gpio-export,name = "sim_switch";
+			gpio-export,output = <1>;
+			gpios = <&gpio0 0 GPIO_ACTIVE_LOW>;
+		};
+
+		io1 {
+			gpio-export,name = "io1";
+			gpio-export,output = <1>;
+			gpios = <&gpio0 1 GPIO_ACTIVE_LOW>;
+		};
+
+		io2 {
+			gpio-export,name = "io2";
+			gpio-export,output = <1>;
+			gpios = <&gpio0 2 GPIO_ACTIVE_LOW>;
+		};
+
+		io3 {
+			gpio-export,name = "io3";
+			gpio-export,output = <1>;
+			gpios = <&gpio0 11 GPIO_ACTIVE_LOW>;
+		};
+
+		io4 {
+			gpio-export,name = "io4";
+			gpio-export,output = <1>;
+			gpios = <&gpio0 14 GPIO_ACTIVE_LOW>;
+		};
+
+		power_mpcie {
+			gpio-export,name = "power_mpcie";
+			gpio-export,output = <1>;
+			gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>;
+		};
+	};
+
+	leds {
+		compatible = "gpio-leds";
+
+		rssi {
+			label = "hdrm200:red:rssi";
+			gpios = <&gpio0 19 GPIO_ACTIVE_LOW>;
+		};
+
+		led_system: system {
+			label = "hdrm200:green:system";
+			gpios = <&gpio1 14 GPIO_ACTIVE_HIGH>;
+		};
+
+		air {
+			label = "hdrm200:green:wifi";
+			gpios = <&gpio3 0 GPIO_ACTIVE_LOW>;
+		};
+	};
+
+	keys {
+		compatible = "gpio-keys-polled";
+		poll-interval = <20>;
+
+		wps {
+			label = "wps";
+			gpios = <&gpio0 12 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_WPS_BUTTON>;
+		};
+
+		reset {
+			label = "reset";
+			gpios = <&gpio0 13 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_RESTART>;
+		};
+	};
+};
+
+&spi0 {
+	status = "okay";
+
+	w25q128@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 0x30000>;
+				read-only;
+			};
+
+			partition@30000 {
+				label = "u-boot-env";
+				reg = <0x30000 0x10000>;
+				read-only;
+			};
+
+			factory: partition@40000 {
+				label = "factory";
+				reg = <0x40000 0x10000>;
+				read-only;
+			};
+
+			firmware: partition@50000 {
+				compatible = "denx,uimage";
+				label = "firmware";
+				reg = <0x50000 0xfb0000>;
+			};
+		};
+	};
+};
+
+&gpio0 {
+	status = "okay";
+};
+
+&gpio1 {
+	status = "okay";
+};
+
+&gpio3 {
+	status = "okay";
+};
+
+&sdhci {
+	status = "okay";
+};
+
+&ehci {
+	status = "okay";
+};
+
+&ohci {
+	status = "okay";
+};
+
+&ethernet {
+	status = "okay";
+	mtd-mac-address = <&factory 0x4>;
+	pinctrl-names = "default";
+	pinctrl-0 = <&rgmii1_pins &rgmii2_pins &mdio_pins>;
+
+	port@4 {
+		status = "okay";
+		phy-handle = <&phy4>;
+		phy-mode = "rgmii";
+	};
+
+	port@5 {
+		status = "okay";
+		phy-handle = <&phy5>;
+		phy-mode = "rgmii";
+	};
+
+	mdio-bus {
+		status = "okay";
+
+		phy4: ethernet-phy@4 {
+			reg = <4>;
+			phy-mode = "rgmii";
+		};
+
+		phy5: ethernet-phy@5 {
+			reg = <5>;
+			phy-mode = "rgmii";
+		};
+	};
+};
+
+&wmac {
+	ralink,mtd-eeprom = <&factory 0>;
+};
+
+&pinctrl {
+	state_default: pinctrl0 {
+		default {
+			ralink,group = "i2c", "uartf", "pa", "spi refclk", "wled";
+			ralink,function = "gpio";
+		};
+	};
+};
+
+&pcie {
+	status = "okay";
+};
+
+&pcie0 {
+	wifi@0,0 {
+		compatible = "mediatek,mt76";
+		reg = <0x0000 0 0 0 0>;
+		mediatek,mtd-eeprom = <&factory 0x8000>;
+		ieee80211-freq-limit = <5000000 6000000>;
+	};
+};
+
+&uart {
+    status = "okay";
+};
diff --git a/target/linux/ramips/image/mt7620.mk b/target/linux/ramips/image/mt7620.mk
index da90568df0..f420c932e6 100644
--- a/target/linux/ramips/image/mt7620.mk
+++ b/target/linux/ramips/image/mt7620.mk
@@ -358,6 +358,14 @@  define Device/hc5861
 endef
 TARGET_DEVICES += hc5861
 
+define Device/hdrm200
+  DTS := HDRM200
+  IMAGE_SIZE := $(ralink_default_fw_size_16M)
+  DEVICE_TITLE := Head Weblink HDRM2000
+  DEVICE_PACKAGES := kmod-mt76x2 kmod-usb2 kmod-usb-ohci kmod-sdhci-mt7620
+endef
+TARGET_DEVICES += hdrm200
+
 define Device/iodata_wn-ac1167gr
   DTS := WN-AC1167GR
   DEVICE_TITLE := I-O DATA WN-AC1167GR