ramips: add support for D-Link DWR-116-A1/2
authorPawel Dembicki <paweldembicki@gmail.com>
Sat, 20 Jan 2018 08:27:03 +0000 (09:27 +0100)
committerMathias Kresin <dev@kresin.me>
Sun, 18 Mar 2018 21:22:38 +0000 (22:22 +0100)
The DWR-116-A1/2 Wireless Router is based on the MT7620N SoC.

Specification:

  MediaTek MT7620N (580 Mhz)
  32 MB of RAM
  8 MB of FLASH
  802.11bgn radio
  5x 10/100 Mbps Ethernet (1 WAN and 4 LAN)
  2x external, non-detachable antennas
  UART (J1 in A1, JP1 in A2) header on PCB (57600 8n1)
  6x LED (GPIO-controlled), 2x button
  JBOOT bootloader

Known issues:
WAN LED is drived by uartl tx pin. I decide to use this pin as
uartlite tx pin.

Installation:
Apply factory image via http web-gui.

Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com>
target/linux/ramips/base-files/etc/board.d/01_leds
target/linux/ramips/base-files/etc/board.d/02_network
target/linux/ramips/base-files/etc/diag.sh
target/linux/ramips/base-files/etc/hotplug.d/firmware/10-rt2x00-eeprom
target/linux/ramips/base-files/lib/upgrade/platform.sh
target/linux/ramips/dts/DWR-116-A1.dts [new file with mode: 0644]
target/linux/ramips/image/Makefile
target/linux/ramips/image/mt7620.mk
target/linux/ramips/mt7620/config-4.14
target/linux/ramips/mt7620/config-4.9

index 0a870d9f6c04e0a7c18c24beb207843915f2b250..b068e62e87161dcdc6b28d3f2f6367f87cd440d8 100755 (executable)
@@ -158,6 +158,7 @@ dir-615-h1)
        set_wifi_led "rt2800pci-phy0::radio"
        ;;
 dir-620-d1|\
+dlink,dwr-116-a1|\
 mzk-ex300np)
        set_wifi_led "$boardname:green:wifi"
        ;;
index 20ecf1ab7643ba351edd5e535853720c9a010713..d20b0aa1aa0213bd08ec29d27257b6ad7beac17e 100755 (executable)
@@ -80,6 +80,7 @@ ramips_setup_interfaces()
        dir-320-b1|\
        dir-610-a1|\
        dir-615-h1|\
+       dlink,dwr-116-a1|\
        ew1200|\
        firewrt|\
        hc5661a|\
@@ -428,6 +429,10 @@ ramips_setup_macs()
                lan_mac=$(mtd_get_mac_ascii factory lanmac)
                wan_mac=$(mtd_get_mac_ascii factory wanmac)
                ;;
+       dlink,dwr-116-a1)
+               wan_mac=$(jboot_config_read -m -i $(find_mtd_part "config") -o 0xE000)
+               lan_mac=$(macaddr_add "$wan_mac" 1)
+               ;;
        e1700)
                wan_mac=$(mtd_get_mac_ascii config WAN_MAC_ADDR)
                ;;
index 2e326af0ed8fd64222162bbe451c17e9d3e2bc3c..2dcc75a019543dcf24bfdb6d3d65920de445a8d1 100644 (file)
@@ -93,6 +93,7 @@ get_status_led() {
        dir-620-a1|\
        dir-620-d1|\
        dwr-512-b|\
+       dlink,dwr-116-a1|\
        gb-pc1|\
        gnubee,gb-pc2|\
        hpm|\
index 1e25643cb75c3bf12a3bb17bc0773ac0e7529adc..67c05c9a461225dd847c6447c8123f088da01e30 100644 (file)
@@ -19,6 +19,19 @@ rt2x00_eeprom_extract() {
                rt2x00_eeprom_die "failed to extract from $mtd"
 }
 
+jboot_eeprom_extract() {
+       local part=$1
+       local offset=$2
+       local mtd
+
+       mtd=$(find_mtd_part $part)
+       [ -n "$mtd" ] || \
+               rt2x00_eeprom_die "no mtd device found for partition $part"
+
+       jboot_config_read -i $mtd -o $offset -e /lib/firmware/$FIRMWARE  2>/dev/null || \
+               rt2x00_eeprom_die "failed to extract from $mtd"
+}
+
 rt2x00_eeprom_set_macaddr() {
        local macaddr=$1
 
@@ -41,6 +54,12 @@ board=$(board_name)
 case "$FIRMWARE" in
 "soc_wmac.eeprom")
        case $board in
+       dlink,dwr-116-a1)
+               wan_mac=$(jboot_config_read -m -i $(find_mtd_part "config") -o 0xE000)
+               wifi_mac=$(macaddr_add "$wan_mac" 1)
+               jboot_eeprom_extract "config" 0xE000
+               rt2x00_eeprom_set_macaddr $wifi_mac
+               ;;
        tiny-ac)
                wifi_mac=$(mtd_get_mac_ascii u-boot-env INIC_MAC_ADDR)
                rt2x00_eeprom_extract "factory" 0 512
index d2bd860cb1285d06414fd77072bad2e896a64132..e6489a2b5802d9b2298edb7e9a89423e4cfdf7e8 100755 (executable)
@@ -270,6 +270,13 @@ platform_check_image() {
                }
                return 0
                ;;
+       dlink,dwr-116-a1)
+               [ "$magic" != "0404242b" ] && {
+                       echo "Invalid image type."
+                       return 1
+               }
+               return 0
+               ;;
        hc5962|\
        mir3g|\
        r6220|\
diff --git a/target/linux/ramips/dts/DWR-116-A1.dts b/target/linux/ramips/dts/DWR-116-A1.dts
new file mode 100644 (file)
index 0000000..928e34e
--- /dev/null
@@ -0,0 +1,104 @@
+/dts-v1/;
+
+#include "mt7620n.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+       compatible = "dlink,dwr-116-a1", "ralink,mt7620n-soc";
+       model = "D-Link DWR-116 A1/A2";
+
+       gpio-keys-polled {
+               compatible = "gpio-keys-polled";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               poll-interval = <20>;
+
+               wps {
+                       label = "wps";
+                       gpios = <&gpio0 2 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_WPS_BUTTON>;
+               };
+
+               reset {
+                       label = "reset";
+                       gpios = <&gpio0 1 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_RESTART>;
+               };
+       };
+
+       gpio-leds {
+               compatible = "gpio-leds";
+
+               status {
+                       label = "dwr-116-a1:green:status";
+                       gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>;
+               };
+
+               wifi {
+                       label = "dwr-116-a1:green:wifi";
+                       gpios = <&gpio3 0 GPIO_ACTIVE_LOW>;
+               };
+       };
+};
+
+&gpio1 {
+       status = "okay";
+};
+
+&gpio3 {
+       status = "okay";
+};
+
+&spi0 {
+       status = "okay";
+
+       m25p80@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "jedec,spi-nor";
+               reg = <0>;
+               spi-max-frequency = <50000000>;
+
+               partition@0 {
+                       label = "jboot";
+                       reg = <0x0 0x10000>;
+                       read-only;
+               };
+
+               partition@10000 {
+                       label = "firmware";
+                       reg = <0x10000 0x7e0000>;
+               };
+
+               config: partition@7f0000 {
+                       label = "config";
+                       reg = <0x7f0000 0x10000>;
+                       read-only;
+               };
+       };
+};
+
+&ehci {
+       status = "okay";
+};
+
+&ohci {
+       status = "okay";
+};
+
+&pinctrl {
+       state_default: pinctrl0 {
+               default {
+                       ralink,group = "i2c", "wled";
+                       ralink,function = "gpio";
+               };
+       };
+};
+
+&ethernet {
+       mediatek,portmap = "llllw";
+       pinctrl-names = "default";
+       pinctrl-0 = <&ephy_pins>;
+};
index abcff036299bde0d70fcd95609be39efcb5e8a59..13934c5b060ea5f949c4581cc2fd33bcb6f4b76f 100644 (file)
@@ -111,6 +111,26 @@ define Build/wrg-header
        mv $@.new $@
 endef
 
+# combine kernel and rootfs into one image
+# mkdlinkfw <type> <optional extra arguments to mkdlinkfw binary>
+
+define Build/mkdlinkfw
+       -$(STAGING_DIR_HOST)/bin/mkdlinkfw \
+               -k $(IMAGE_KERNEL) \
+               -r $(IMAGE_ROOTFS) \
+               -o $@ \
+               -s $(DLINK_FIRMWARE_SIZE)
+endef
+
+define Build/mkdlinkfw-factory
+       -$(STAGING_DIR_HOST)/bin/mkdlinkfw \
+               -m $(DLINK_ROM_ID) -f $(DLINK_FAMILY_MEMBER) \
+               -F $@ \
+               -o $@.new \
+               -s $(DLINK_FIRMWARE_SIZE)
+       mv $@.new $@
+endef
+
 #
 # The real magic happens inside these templates
 #
index d4c4e719b7489ef3813d30a9ff8cba30cf670bb1..b352c5408dc9b99e20133890d56d5d61139d2b1a 100644 (file)
@@ -2,7 +2,8 @@
 # MT7620A Profiles
 #
 
-DEVICE_VARS += TPLINK_FLASHLAYOUT TPLINK_HWID TPLINK_HWREV TPLINK_HWREVADD TPLINK_HVERSION
+DEVICE_VARS += TPLINK_FLASHLAYOUT TPLINK_HWID TPLINK_HWREV TPLINK_HWREVADD TPLINK_HVERSION \
+       DLINK_ROM_ID DLINK_FAMILY_MEMBER DLINK_FIRMWARE_SIZE
 
 define Build/elecom-header
        cp $@ $(KDIR)/v_0.0.0.bin
@@ -147,6 +148,20 @@ define Device/dir-810l
 endef
 TARGET_DEVICES += dir-810l
 
+define Device/dlink_dwr-116-a1
+  DTS := DWR-116-A1
+  DEVICE_TITLE := D-Link DWR-116 A1/A2
+  DEVICE_PACKAGES := kmod-usb2 jboot-tools
+  DLINK_ROM_ID := DLK6E3803001
+  DLINK_FAMILY_MEMBER := 0x6E38
+  DLINK_FIRMWARE_SIZE := 0x7E0000
+  KERNEL := $(KERNEL_DTB)
+  IMAGES += factory.bin
+  IMAGE/sysupgrade.bin := mkdlinkfw | pad-rootfs | append-metadata
+  IMAGE/factory.bin := mkdlinkfw | pad-rootfs | mkdlinkfw-factory
+endef
+TARGET_DEVICES += dlink_dwr-116-a1
+
 define Device/e1700
   DTS := E1700
   IMAGES += factory.bin
index a65fdba29efd0c4901606fd1e64d7b5742f93192..3e006e2ef80c0d60d7b66468ed6d184acd0692a5 100644 (file)
@@ -164,6 +164,7 @@ CONFIG_MTD_SPI_NOR=y
 CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y
 CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT=16384
 CONFIG_MTD_SPLIT_FIRMWARE=y
+CONFIG_MTD_SPLIT_JIMAGE_FW=y
 CONFIG_MTD_SPLIT_SEAMA_FW=y
 CONFIG_MTD_SPLIT_TPLINK_FW=y
 CONFIG_MTD_SPLIT_UIMAGE_FW=y
index 4f8c68629ee57c3eb7676be932b940ed0930b689..24c007c6c8bfdce01f43c0713232f32475c5fe38 100644 (file)
@@ -143,6 +143,7 @@ CONFIG_MTD_SPI_NOR=y
 CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y
 CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT=16384
 CONFIG_MTD_SPLIT_FIRMWARE=y
+CONFIG_MTD_SPLIT_JIMAGE_FW=y
 CONFIG_MTD_SPLIT_SEAMA_FW=y
 CONFIG_MTD_SPLIT_TPLINK_FW=y
 CONFIG_MTD_SPLIT_UIMAGE_FW=y