From a5bd8de0bd80b83e43ce90ddc6623890344ad33d Mon Sep 17 00:00:00 2001 From: Pawel Dembicki Date: Sat, 20 Jan 2018 09:27:03 +0100 Subject: [PATCH] ramips: add support for D-Link DWR-116-A1/2 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 --- .../ramips/base-files/etc/board.d/01_leds | 1 + .../ramips/base-files/etc/board.d/02_network | 5 + target/linux/ramips/base-files/etc/diag.sh | 1 + .../etc/hotplug.d/firmware/10-rt2x00-eeprom | 19 ++++ .../ramips/base-files/lib/upgrade/platform.sh | 7 ++ target/linux/ramips/dts/DWR-116-A1.dts | 104 ++++++++++++++++++ target/linux/ramips/image/Makefile | 20 ++++ target/linux/ramips/image/mt7620.mk | 17 ++- target/linux/ramips/mt7620/config-4.14 | 1 + target/linux/ramips/mt7620/config-4.9 | 1 + 10 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 target/linux/ramips/dts/DWR-116-A1.dts 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 0a870d9f6c..b068e62e87 100755 --- a/target/linux/ramips/base-files/etc/board.d/01_leds +++ b/target/linux/ramips/base-files/etc/board.d/01_leds @@ -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" ;; 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 20ecf1ab76..d20b0aa1aa 100755 --- a/target/linux/ramips/base-files/etc/board.d/02_network +++ b/target/linux/ramips/base-files/etc/board.d/02_network @@ -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) ;; diff --git a/target/linux/ramips/base-files/etc/diag.sh b/target/linux/ramips/base-files/etc/diag.sh index 2e326af0ed..2dcc75a019 100644 --- a/target/linux/ramips/base-files/etc/diag.sh +++ b/target/linux/ramips/base-files/etc/diag.sh @@ -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|\ diff --git a/target/linux/ramips/base-files/etc/hotplug.d/firmware/10-rt2x00-eeprom b/target/linux/ramips/base-files/etc/hotplug.d/firmware/10-rt2x00-eeprom index 1e25643cb7..67c05c9a46 100644 --- a/target/linux/ramips/base-files/etc/hotplug.d/firmware/10-rt2x00-eeprom +++ b/target/linux/ramips/base-files/etc/hotplug.d/firmware/10-rt2x00-eeprom @@ -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 diff --git a/target/linux/ramips/base-files/lib/upgrade/platform.sh b/target/linux/ramips/base-files/lib/upgrade/platform.sh index d2bd860cb1..e6489a2b58 100755 --- a/target/linux/ramips/base-files/lib/upgrade/platform.sh +++ b/target/linux/ramips/base-files/lib/upgrade/platform.sh @@ -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 index 0000000000..928e34ea4d --- /dev/null +++ b/target/linux/ramips/dts/DWR-116-A1.dts @@ -0,0 +1,104 @@ +/dts-v1/; + +#include "mt7620n.dtsi" + +#include +#include + +/ { + 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 = ; + }; + + reset { + label = "reset"; + gpios = <&gpio0 1 GPIO_ACTIVE_LOW>; + linux,code = ; + }; + }; + + 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"; + }; + }; +}; + +ðernet { + mediatek,portmap = "llllw"; + pinctrl-names = "default"; + pinctrl-0 = <&ephy_pins>; +}; diff --git a/target/linux/ramips/image/Makefile b/target/linux/ramips/image/Makefile index abcff03629..13934c5b06 100644 --- a/target/linux/ramips/image/Makefile +++ b/target/linux/ramips/image/Makefile @@ -111,6 +111,26 @@ define Build/wrg-header mv $@.new $@ endef +# combine kernel and rootfs into one image +# mkdlinkfw + +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 # diff --git a/target/linux/ramips/image/mt7620.mk b/target/linux/ramips/image/mt7620.mk index d4c4e719b7..b352c5408d 100644 --- a/target/linux/ramips/image/mt7620.mk +++ b/target/linux/ramips/image/mt7620.mk @@ -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 diff --git a/target/linux/ramips/mt7620/config-4.14 b/target/linux/ramips/mt7620/config-4.14 index a65fdba29e..3e006e2ef8 100644 --- a/target/linux/ramips/mt7620/config-4.14 +++ b/target/linux/ramips/mt7620/config-4.14 @@ -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 diff --git a/target/linux/ramips/mt7620/config-4.9 b/target/linux/ramips/mt7620/config-4.9 index 4f8c68629e..24c007c6c8 100644 --- a/target/linux/ramips/mt7620/config-4.9 +++ b/target/linux/ramips/mt7620/config-4.9 @@ -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 -- 2.25.1