diff mbox

[LEDE-DEV,v3,1/2] ar71xx: Add support for TP-Link MR6400

Message ID 20170305170320.GA29725@moc6.cz
State Superseded
Delegated to: Piotr Dymacz
Headers show

Commit Message

Filip Moc March 5, 2017, 5:03 p.m. UTC
You can flash via u-boot tftp (serve factory image as /mr6400_tp_recovery.bin
on 192.168.0.66/24, connect to any ethernet port and power on device while
holding the reset button).

Signed-off-by: Filip Moc <lede@moc6.cz>
---

Notes:
    v1->v2:
     - Fixed DEVICE_TITLE
     - Defined flash type as "w25q64" (but it's still being misdetected as
       "s25fl064k")
    
    v2->v3:
     - Removed enablemodem
     - Changed license of mach-tl-mr6400.c
    
    not yet fixed:
     - ordering in base-files/etc/diag.sh
     - ordering in base-files/lib/ar71xx.sh
     (I did not get any response to <20170211091924.GA23983@moc6.cz>)

 target/linux/ar71xx/base-files/etc/board.d/01_leds |   6 +
 .../linux/ar71xx/base-files/etc/board.d/02_network |   5 +
 target/linux/ar71xx/base-files/etc/diag.sh         |   3 +
 target/linux/ar71xx/base-files/lib/ar71xx.sh       |   6 +
 .../ar71xx/base-files/lib/upgrade/platform.sh      |   1 +
 target/linux/ar71xx/config-4.4                     |   1 +
 .../ar71xx/files/arch/mips/ath79/Kconfig.openwrt   |  10 ++
 target/linux/ar71xx/files/arch/mips/ath79/Makefile |   1 +
 .../ar71xx/files/arch/mips/ath79/mach-tl-mr6400.c  | 151 +++++++++++++++++++++
 .../linux/ar71xx/files/arch/mips/ath79/machtypes.h |   1 +
 target/linux/ar71xx/image/tp-link.mk               |  11 ++
 11 files changed, 196 insertions(+)
 create mode 100644 target/linux/ar71xx/files/arch/mips/ath79/mach-tl-mr6400.c

Comments

Piotr Dymacz March 7, 2017, 8:21 p.m. UTC | #1
Hello Filip,

On 05.03.2017 18:03, Filip Moc wrote:
> You can flash via u-boot tftp (serve factory image as /mr6400_tp_recovery.bin
> on 192.168.0.66/24, connect to any ethernet port and power on device while
> holding the reset button).

[...]

Is there any problem with upgrade under vendor gui on this device?

Could you please also include more information about the device in 
commit message, like e.g. in [1], [2], [3].

There is no strict format or requirements (at least for now) how it 
should look like or what should be included, feel free to follow any of 
the examples below.

These information could be then used by people working on the Wiki or 
just as reference.

[1] 
https://github.com/lede-project/source/commit/f9278337cf4b9c699a41dfc1e4c448213be53e61
[2] 
https://github.com/lede-project/source/commit/edae3479e64e93275dce4a928ea70279282eef9d
[3] 
https://github.com/lede-project/source/commit/9b35815f0f0e10125d144c82595bbccbc83d6812

--
Cheers,
Piotr
Filip Moc March 9, 2017, 8:54 p.m. UTC | #2
Hi Piotr,


> Is there any problem with upgrade under vendor gui on this device?

Yes, web-ui rejects factory firmware with the following message:
-
Error code: 18005
Upgrade unsuccessfully because the version of the upgraded file was incorrect.
Please check the file name.
-

If you unpack any firmware provided by TP-Link[1] you can see there is ~50MiB
.bin file. This file contains not just firmware for main SoC (QCA9531) but
there is also firmware for embedded LTE module.
I guess OEM web-ui won't accept firmware without this attached firmware.

But flashing via U-Boot's TFTP recovery seems to be safe. It checks for product
id and won't let you flash wrong firmware. Also U-Boot does not overwrite
itself during the process so even if you brick the device (e.g. due to power
loss) you can retry as many times as you need.


> Could you please also include more information about the device in commit
> message, [...]

Ok, I'll resend 1/2 with updated commit message.


[1] http://www.tp-link.com/download/TL-MR6400.html


Filip
diff mbox

Patch

diff --git a/target/linux/ar71xx/base-files/etc/board.d/01_leds b/target/linux/ar71xx/base-files/etc/board.d/01_leds
index 4dc4bfd..4d6c5c9 100755
--- a/target/linux/ar71xx/base-files/etc/board.d/01_leds
+++ b/target/linux/ar71xx/base-files/etc/board.d/01_leds
@@ -576,6 +576,12 @@  tl-wr941nd-v5)
 		;;
 	esac
 	;;
+tl-mr6400)
+	ucidef_set_led_netdev "lan" "LAN" "tp-link:white:lan" "eth0"
+	ucidef_set_led_netdev "wan" "WAN" "tp-link:white:wan" "eth1"
+	ucidef_set_led_netdev "4g" "4G" "tp-link:white:4g" "usb0"
+	ucidef_set_led_wlan "wlan" "WLAN" "tp-link:white:wlan" "phy0tpt"
+	;;
 tl-wa7210n-v2)
 	ucidef_set_led_netdev "lan" "LAN" "tp-link:green:lan" "eth0"
 	ucidef_set_rssimon "wlan0" "200000" "1"
diff --git a/target/linux/ar71xx/base-files/etc/board.d/02_network b/target/linux/ar71xx/base-files/etc/board.d/02_network
index e08d7dd..e2489aa 100755
--- a/target/linux/ar71xx/base-files/etc/board.d/02_network
+++ b/target/linux/ar71xx/base-files/etc/board.d/02_network
@@ -307,6 +307,11 @@  ar71xx_setup_interfaces()
 		ucidef_add_switch "switch0" \
 			"0@eth1" "1:lan:1" "2:lan:2" "3:lan:3" "4:lan:4"
 		;;
+	tl-mr6400)
+		ucidef_set_interfaces_lan_wan "eth0 eth1" "usb0"
+		ucidef_add_switch "switch0" \
+			"0@eth0" "1:lan" "2:lan" "3:lan"
+		;;
 	dir-825-b1|\
 	nbg460n_550n_550nh|\
 	tew-673gru|\
diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh
index 1064641..0916fa0 100644
--- a/target/linux/ar71xx/base-files/etc/diag.sh
+++ b/target/linux/ar71xx/base-files/etc/diag.sh
@@ -354,6 +354,9 @@  get_status_led() {
 	tl-wa860re)
 		status_led="tp-link:green:power"
 		;;
+	tl-mr6400)
+		status_led="tp-link:white:power"
+		;;
 	tl-mr3220|\
 	tl-mr3220-v2|\
 	tl-mr3420|\
diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh
index ae0189d..4ce6918 100755
--- a/target/linux/ar71xx/base-files/lib/ar71xx.sh
+++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh
@@ -298,6 +298,9 @@  tplink_board_detect() {
 	"342000"*)
 		model="TP-Link TL-MR3420"
 		;;
+	"640000"*)
+		model="TP-Link TL-MR6400"
+		;;
 	"332000"*)
 		model="TP-Link TL-WDR3320"
 		;;
@@ -1002,6 +1005,9 @@  ar71xx_board_detect() {
 	*"TL-MR3420 v2")
 		name="tl-mr3420-v2"
 		;;
+	*TL-MR6400)
+		name="tl-mr6400"
+		;;
 	*"TL-WA701ND v2")
 		name="tl-wa701nd-v2"
 		;;
diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
index 576ff6c..6134604 100755
--- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
@@ -394,6 +394,7 @@  platform_check_image() {
 	tl-mr3220|\
 	tl-mr3420-v2|\
 	tl-mr3420|\
+	tl-mr6400|\
 	tl-wa701nd-v2|\
 	tl-wa7210n-v2|\
 	tl-wa750re|\
diff --git a/target/linux/ar71xx/config-4.4 b/target/linux/ar71xx/config-4.4
index 206ace6..6c70091 100644
--- a/target/linux/ar71xx/config-4.4
+++ b/target/linux/ar71xx/config-4.4
@@ -169,6 +169,7 @@  CONFIG_ATH79_MACH_TL_MR11U=y
 CONFIG_ATH79_MACH_TL_MR13U=y
 CONFIG_ATH79_MACH_TL_MR3020=y
 CONFIG_ATH79_MACH_TL_MR3X20=y
+CONFIG_ATH79_MACH_TL_MR6400=y
 CONFIG_ATH79_MACH_TL_WA701ND_V2=y
 CONFIG_ATH79_MACH_TL_WA7210N_V2=y
 CONFIG_ATH79_MACH_TL_WA801ND_V3=y
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
index 514d05d..aaec03c 100644
--- a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
+++ b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
@@ -1358,6 +1358,16 @@  config ATH79_MACH_TL_MR3X20
 	select ATH79_DEV_M25P80
 	select ATH79_DEV_USB
 
+config ATH79_MACH_TL_MR6400
+	bool "TP-LINK TL-MR6400 support"
+	select SOC_QCA953X
+	select ATH79_DEV_ETH
+	select ATH79_DEV_GPIO_BUTTONS
+	select ATH79_DEV_LEDS_GPIO
+	select ATH79_DEV_M25P80
+	select ATH79_DEV_USB
+	select ATH79_DEV_WMAC
+
 config ATH79_MACH_TL_WAX50RE
 	bool "TP-LINK TL-WA750/850RE support"
 	select SOC_AR934X
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Makefile b/target/linux/ar71xx/files/arch/mips/ath79/Makefile
index 6475259..ef2dc40 100644
--- a/target/linux/ar71xx/files/arch/mips/ath79/Makefile
+++ b/target/linux/ar71xx/files/arch/mips/ath79/Makefile
@@ -174,6 +174,7 @@  obj-$(CONFIG_ATH79_MACH_TL_MR11U)		+= mach-tl-mr11u.o
 obj-$(CONFIG_ATH79_MACH_TL_MR13U)		+= mach-tl-mr13u.o
 obj-$(CONFIG_ATH79_MACH_TL_MR3020)		+= mach-tl-mr3020.o
 obj-$(CONFIG_ATH79_MACH_TL_MR3X20)		+= mach-tl-mr3x20.o
+obj-$(CONFIG_ATH79_MACH_TL_MR6400)		+= mach-tl-mr6400.o
 obj-$(CONFIG_ATH79_MACH_TL_WA701ND_V2)		+= mach-tl-wa701nd-v2.o
 obj-$(CONFIG_ATH79_MACH_TL_WA7210N_V2)		+= mach-tl-wa7210n-v2.o
 obj-$(CONFIG_ATH79_MACH_TL_WA801ND_V3)		+= mach-tl-wa801nd-v3.o
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-mr6400.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-mr6400.c
new file mode 100644
index 0000000..be49c89
--- /dev/null
+++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-mr6400.c
@@ -0,0 +1,151 @@ 
+/*
+ * TP-LINK TL-MR6400 board support
+ *
+ *  Copyright (C) 2017 Filip Moc <lede@moc6.cz>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * The name of the author may not be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE.
+ */
+
+#include <linux/gpio.h>
+#include <linux/platform_device.h>
+
+#include <asm/mach-ath79/ar71xx_regs.h>
+
+#include "common.h"
+#include "dev-gpio-buttons.h"
+#include "dev-eth.h"
+#include "dev-leds-gpio.h"
+#include "dev-m25p80.h"
+#include "dev-usb.h"
+#include "dev-wmac.h"
+#include "machtypes.h"
+
+#define TL_MR6400_GPIO_LTE_POWER	4
+#define TL_MR6400_GPIO_BTN_RESET	12	/* SW2 */
+#define TL_MR6400_GPIO_BTN_RFKILL	14	/* SW3 */
+#define TL_MR6400_GPIO_LED_WAN		0	/* D12 */
+#define TL_MR6400_GPIO_LED_4G		1	/* D11 */
+#define TL_MR6400_GPIO_LED_WPS		3	/* D5  */
+#define TL_MR6400_GPIO_LED_WLAN		11	/* D3  */
+#define TL_MR6400_GPIO_LED_POWER	13	/* D2  */
+#define TL_MR6400_GPIO_LED_LAN		16	/* D4  */
+
+#define TL_MR6400_KEYS_POLL_INTERVAL	20 /* msecs */
+#define TL_MR6400_KEYS_DEBOUNCE_INTERVAL (3 * TL_MR6400_KEYS_POLL_INTERVAL)
+
+#define TL_MR6400_WMAC_CALDATA_OFFSET	0x1000
+
+static const char *tl_mr6400_part_probes[] = {
+	"tp-link",
+	NULL,
+};
+
+static struct flash_platform_data tl_mr6400_flash_data = {
+	.part_probes	= tl_mr6400_part_probes,
+	.type		= "w25q64",
+};
+
+static struct gpio_led tl_mr6400_leds_gpio[] __initdata = {
+	{
+		.name		= "tp-link:white:wan",
+		.gpio		= TL_MR6400_GPIO_LED_WAN,
+		.active_low	= 0,
+	},
+	{
+		.name		= "tp-link:white:4g",
+		.gpio		= TL_MR6400_GPIO_LED_4G,
+		.active_low	= 0,
+	},
+	{
+		.name		= "tp-link:white:wps",
+		.gpio		= TL_MR6400_GPIO_LED_WPS,
+		.active_low	= 0,
+	},
+	{
+		.name		= "tp-link:white:wlan",
+		.gpio		= TL_MR6400_GPIO_LED_WLAN,
+		.active_low	= 0,
+	},
+	{
+		.name		= "tp-link:white:power",
+		.gpio		= TL_MR6400_GPIO_LED_POWER,
+		.active_low	= 0,
+	},
+	{
+		.name		= "tp-link:white:lan",
+		.gpio		= TL_MR6400_GPIO_LED_LAN,
+		.active_low	= 0,
+	},
+};
+
+static struct gpio_keys_button tl_mr6400_gpio_keys[] __initdata = {
+	{
+		.desc		= "reset",
+		.type		= EV_KEY,
+		.code		= KEY_RESTART,
+		.debounce_interval = TL_MR6400_KEYS_DEBOUNCE_INTERVAL,
+		.gpio		= TL_MR6400_GPIO_BTN_RESET,
+		.active_low	= 1,
+	},
+	{
+		.desc		= "rfkill",
+		.type		= EV_KEY,
+		.code		= KEY_RFKILL,
+		.debounce_interval = TL_MR6400_KEYS_DEBOUNCE_INTERVAL,
+		.gpio		= TL_MR6400_GPIO_BTN_RFKILL,
+		.active_low	= 1,
+	},
+};
+
+static void __init tl_mr6400_setup(void)
+{
+	u8 *mac = (u8 *) KSEG1ADDR(0x1f01fc00);
+	u8 *art = (u8 *) KSEG1ADDR(0x1fff0000);
+
+	ath79_register_m25p80(&tl_mr6400_flash_data);
+
+	ath79_register_mdio(0, 0x0);
+
+	/* LAN1, LAN2, LAN3 */
+	ath79_switch_data.phy4_mii_en = 1;
+	ath79_switch_data.phy_poll_mask |= BIT(0);
+	ath79_eth1_data.duplex = DUPLEX_FULL;
+	ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII;
+	ath79_eth1_data.speed = SPEED_1000;
+	ath79_init_mac(ath79_eth1_data.mac_addr, mac, -1);
+	ath79_register_eth(1);
+
+	/* LAN4 / WAN */
+	ath79_eth0_data.phy_mask = BIT(0);
+	ath79_eth0_data.duplex = DUPLEX_FULL;
+	ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
+	ath79_eth0_data.speed = SPEED_100;
+	ath79_init_mac(ath79_eth0_data.mac_addr, mac, 1);
+	ath79_register_eth(0);
+
+	ath79_register_wmac(art + TL_MR6400_WMAC_CALDATA_OFFSET, mac);
+
+	ath79_register_leds_gpio(-1,
+				 ARRAY_SIZE(tl_mr6400_leds_gpio),
+				 tl_mr6400_leds_gpio);
+
+	ath79_register_gpio_keys_polled(-1,
+					TL_MR6400_KEYS_POLL_INTERVAL,
+					ARRAY_SIZE(tl_mr6400_gpio_keys),
+					tl_mr6400_gpio_keys);
+
+	gpio_request_one(TL_MR6400_GPIO_LTE_POWER,
+			 GPIOF_OUT_INIT_LOW | GPIOF_EXPORT_DIR_FIXED | GPIOF_ACTIVE_LOW,
+			 "LTE power");
+	ath79_register_usb();
+}
+
+MIPS_MACHINE(ATH79_MACH_TL_MR6400, "TL-MR6400", "TP-LINK TL-MR6400",
+	     tl_mr6400_setup);
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
index 4cad628..e89ece1 100644
--- a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
+++ b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
@@ -206,6 +206,7 @@  enum ath79_mach_type {
 	ATH79_MACH_TL_MR3220_V2,		/* TP-LINK TL-MR3220 v2 */
 	ATH79_MACH_TL_MR3420,			/* TP-LINK TL-MR3420 */
 	ATH79_MACH_TL_MR3420_V2,		/* TP-LINK TL-MR3420 v2 */
+	ATH79_MACH_TL_MR6400,			/* TP-LINK TL-MR6400 */
 	ATH79_MACH_TL_WA701ND_V2,		/* TP-LINK TL-WA701ND v2 */
 	ATH79_MACH_TL_WA7210N_V2,		/* TP-LINK TL-WA7210N v2 */
 	ATH79_MACH_TL_WA750RE,			/* TP-LINK TL-WA750RE */
diff --git a/target/linux/ar71xx/image/tp-link.mk b/target/linux/ar71xx/image/tp-link.mk
index b251135..2a0b06a 100644
--- a/target/linux/ar71xx/image/tp-link.mk
+++ b/target/linux/ar71xx/image/tp-link.mk
@@ -452,6 +452,17 @@  define Device/tl-mr3420-v2
 endef
 TARGET_DEVICES += tl-mr3020-v1 tl-mr3040-v1 tl-mr3040-v2 tl-mr3220-v1 tl-mr3220-v2 tl-mr3420-v1 tl-mr3420-v2
 
+define Device/tl-mr6400-v1
+    $(Device/tplink-8mlzma)
+    DEVICE_TITLE := TP-LINK TL-MR6400 v1
+    DEVICE_PACKAGES := kmod-usb-core kmod-usb2 kmod-usb-net kmod-usb-net-rndis kmod-usb-serial kmod-usb-serial-option adb
+    BOARDNAME := TL-MR6400
+    DEVICE_PROFILE := TLMR6400
+    TPLINK_HWID := 0x64000001
+endef
+TARGET_DEVICES += tl-mr6400-v1
+
+
 define Device/tl-wpa8630
     $(Device/tplink-8mlzma)
     DEVICE_TITLE := TP-LINK TL-WPA8630