diff --git a/docs/index.rst b/docs/index.rst index c745c1bc..c125cf70 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -176,7 +176,7 @@ ar71xx-generic - Archer C5 (v1) [#ath10k]_ - Archer C59 (v1) [#80211s]_ - Archer C7 (v2, v4) [#ath10k]_ - - CPE210 (v1.0, v1.1) + - CPE210 (v1.0, v1.1, v2.0) - CPE220 (v1.1) - CPE510 (v1.0, v1.1) - CPE520 (v1.1) diff --git a/package/gluon-core/luasrc/lib/gluon/upgrade/020-interfaces b/package/gluon-core/luasrc/lib/gluon/upgrade/020-interfaces index 47757699..d108ce41 100755 --- a/package/gluon-core/luasrc/lib/gluon/upgrade/020-interfaces +++ b/package/gluon-core/luasrc/lib/gluon/upgrade/020-interfaces @@ -32,6 +32,7 @@ local wan_ifname = iface_exists(uci:get('network', 'wan', 'ifname')) if platform.match('ar71xx', 'generic', { 'cpe210', + 'cpe210v2', 'cpe510', 'wbs210', 'wbs510', diff --git a/package/gluon-setup-mode/luasrc/lib/gluon/upgrade/320-setup-ifname b/package/gluon-setup-mode/luasrc/lib/gluon/upgrade/320-setup-ifname index 7f0ca7b8..ac198239 100755 --- a/package/gluon-setup-mode/luasrc/lib/gluon/upgrade/320-setup-ifname +++ b/package/gluon-setup-mode/luasrc/lib/gluon/upgrade/320-setup-ifname @@ -10,6 +10,7 @@ end if platform.match('ar71xx', 'generic', { 'cpe210', + 'cpe210v2', 'cpe510', 'wbs210', 'wbs510', diff --git a/patches/lede/0086-ar71xx-add-support-for-cpe210-v2.patch b/patches/lede/0086-ar71xx-add-support-for-cpe210-v2.patch new file mode 100644 index 00000000..a4337def --- /dev/null +++ b/patches/lede/0086-ar71xx-add-support-for-cpe210-v2.patch @@ -0,0 +1,394 @@ +From 20d587fabce8469141a87b42ce5ff4d93f9ac036 Mon Sep 17 00:00:00 2001 +From: Robert Marko +Date: Fri, 19 Jan 2018 12:58:40 +0100 +Subject: [PATCH 1/2] ar71xx: Add TP-Link Pharos v2 board detection + +Add support for detecting TP-Link Pharos v2 boards. +They use different format in product-info partition than v1 boards. + +Code was written mostly by Alexander Couzens + +Signed-off-by: Robert Marko +Signed-off-by: Adrian Schmutzler +--- + target/linux/ar71xx/base-files/lib/ar71xx.sh | 22 ++++++++++++++++------ + .../ar71xx/base-files/lib/upgrade/platform.sh | 23 +++++++++++++-------- + 2 files changed, 32 insertions(+), 13 deletions(-) + +diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh +index 7249cb61513..760a25f2ad7 100755 +--- a/target/linux/ar71xx/base-files/lib/ar71xx.sh ++++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh +@@ -354,7 +354,7 @@ tplink_pharos_get_model_string() { + } + + tplink_pharos_board_detect() { +- local model_string="$(tplink_pharos_get_model_string | tr -d '\r')" ++ local model_string="$1" + local oIFS="$IFS"; IFS=":"; set -- $model_string; IFS="$oIFS" + + local model="${1%%\(*}" +@@ -362,6 +362,14 @@ tplink_pharos_board_detect() { + AR71XX_MODEL="TP-Link $model v$2" + } + ++tplink_pharos_v2_get_model_string() { ++ local part ++ part=$(find_mtd_part 'product-info') ++ [ -z "$part" ] && return 1 ++ ++ dd if=$part bs=1 skip=4360 count=64 2>/dev/null | tr -d '\r\0' | head -n 1 ++} ++ + gl_inet_board_detect() { + local size="$(mtd_get_part_size 'firmware')" + +@@ -525,25 +525,29 @@ ar71xx_board_detect() { + ;; + *"CPE210/220") + name="cpe210" +- tplink_pharos_board_detect ++ tplink_pharos_board_detect "$(tplink_pharos_get_model_string | tr -d '\r')" ++ ;; ++ *"CPE210 v2") ++ name="cpe210-v2" ++ tplink_pharos_board_detect "$(tplink_pharos_v2_get_model_string)" + ;; + *"CPE510/520") + name="cpe510" +- tplink_pharos_board_detect ++ tplink_pharos_board_detect "$(tplink_pharos_get_model_string | tr -d '\r')" + ;; + *CPE830) + name="cpe830" + ;; + *CPE870) + name="cpe870" + ;; + *WBS210) + name="wbs210" +- tplink_pharos_board_detect ++ tplink_pharos_board_detect "$(tplink_pharos_get_model_string | tr -d '\r')" + ;; + *WBS510) + name="wbs510" +- tplink_pharos_board_detect ++ tplink_pharos_board_detect "$(tplink_pharos_get_model_string | tr -d '\r')" + ;; + *CR3000) + name="cr3000" +diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +index 376984a14a1..244fc9ac0d8 100755 +--- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh ++++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +@@ -575,7 +578,11 @@ platform_check_image() { + eap120|\ + wbs210|\ + wbs510) +- tplink_pharos_check_image "$1" && return 0 ++ tplink_pharos_check_image "$1" "7f454c46" "$(tplink_pharos_get_model_string)" '' && return 0 ++ return 1 ++ ;; ++ cpe210-v2) ++ tplink_pharos_v2_check_image "$1" "01000000" "$(tplink_pharos_v2_get_model_string)" '\0\xff\r' && return 0 + return 1 + ;; + a40|\ + +From ff408bd018f08b417fca2a2b046ce41c25d53499 Mon Sep 17 00:00:00 2001 +From: Robert Marko +Date: Fri, 19 Jan 2018 14:45:42 +0100 +Subject: [PATCH 2/2] ar71xx: Add support for TP-Link CPE210 v2 + +This PR adds support for a popular low-cost 2.4GHz N based AP + +Specifications: + - SoC: Qualcomm Atheros QCA9533 (650MHz) + - RAM: 64MB + - Storage: 8 MB SPI NOR + - Wireless: 2.4GHz N based built into SoC 2x2 + - Ethernet: 1x 100/10 Mbps, integrated into SoC, 24V POE IN + +Installation: +Flash factory image through stock firmware WEB UI +or through TFTP +To get to TFTP recovery just hold reset button while powering on for +around 4-5 seconds and release. +Rename factory image to recovery.bin +Stock TFTP server IP:192.168.0.100 +Stock device TFTP adress:192.168.0.254 + +Notes: +TP-Link does not use bootstrap registers so without this patch reference +clock detects as 40MHz while it is actually 25MHz. +This is due to messed up bootstrap resistor configuration on the PCB. +Provided GPL code just forces 25MHz reference clock. +That causes booting with completely wrong clocks, for example, CPU tries +to boot at 1040MHz while the stock is 650MHz. +So this PR depends on PR #672 to remove 40MHz reference clock. +Thanks to Sven Eckelmann for properly patching that. + +Signed-off-by: Robert Marko +Signed-off-by: Adrian Schmutzler +--- + target/linux/ar71xx/base-files/etc/board.d/01_leds | 13 ++++- + .../linux/ar71xx/base-files/etc/board.d/02_network | 1 + + .../ar71xx/files/arch/mips/ath79/Kconfig.openwrt | 1 + + .../ar71xx/files/arch/mips/ath79/mach-cpe510.c | 64 +++++++++++++++++++++- + .../linux/ar71xx/files/arch/mips/ath79/machtypes.h | 3 +- + target/linux/ar71xx/image/tp-link.mk | 12 ++++ + tools/firmware-utils/src/tplink-safeloader.c | 42 ++++++++++++++ + 7 files changed, 132 insertions(+), 4 deletions(-) + +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 cf24e465a3a..80ffabf57aa 100755 +--- a/target/linux/ar71xx/base-files/etc/board.d/01_leds ++++ b/target/linux/ar71xx/base-files/etc/board.d/01_leds +@@ -235,16 +235,25 @@ cf-e530n) + ucidef_set_led_netdev "wan" "WAN" "$board:blue:wan" "eth1" + ;; + cpe210|\ ++cpe210-v2|\ + cpe510|\ + wbs210|\ + wbs510) +- ucidef_set_led_switch "lan0" "LAN0" "tp-link:green:lan0" "switch0" "0x20" +- ucidef_set_led_switch "lan1" "LAN1" "tp-link:green:lan1" "switch0" "0x10" + ucidef_set_rssimon "wlan0" "200000" "1" + ucidef_set_led_rssi "rssilow" "RSSILOW" "tp-link:green:link1" "wlan0" "1" "100" "0" "13" + ucidef_set_led_rssi "rssimediumlow" "RSSIMEDIUMLOW" "tp-link:green:link2" "wlan0" "26" "100" "-25" "13" + ucidef_set_led_rssi "rssimediumhigh" "RSSIMEDIUMHIGH" "tp-link:green:link3" "wlan0" "51" "100" "-50" "13" + ucidef_set_led_rssi "rssihigh" "RSSIHIGH" "tp-link:green:link4" "wlan0" "76" "100" "-75" "13" ++ ++ case "$board" in ++ cpe210-v2) ++ ucidef_set_led_netdev "lan" "LAN" "tp-link:green:lan0" "eth0" ++ ;; ++ *) ++ ucidef_set_led_switch "lan0" "LAN0" "tp-link:green:lan0" "switch0" "0x20" ++ ucidef_set_led_switch "lan1" "LAN1" "tp-link:green:lan1" "switch0" "0x10" ++ ;; ++ esac + ;; + cr3000) + ucidef_set_led_netdev "wan" "WAN" "pcs:blue:wan" "eth1" +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 dfe97e8133c..127a8f2b88d 100755 +--- a/target/linux/ar71xx/base-files/etc/board.d/02_network ++++ b/target/linux/ar71xx/base-files/etc/board.d/02_network +@@ -74,6 +74,7 @@ ar71xx_setup_interfaces() + cap4200ag|\ + cf-e380ac-v1|\ + cf-e380ac-v2|\ ++ cpe210-v2|\ + eap120|\ + eap300v2|\ + eap7660d|\ +diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt +index 4a032f60216..0f4aec4afdf 100644 +--- a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt ++++ b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt +@@ -1563,6 +1563,7 @@ config ATH79_MACH_CPE505N + config ATH79_MACH_CPE510 + bool "TP-LINK CPE510 support" + select SOC_AR934X ++ select SOC_QCA953X + select ATH79_DEV_ETH + select ATH79_DEV_GPIO_BUTTONS + select ATH79_DEV_LEDS_GPIO +diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-cpe510.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-cpe510.c +index d2dbed1fe28..ceb1769ddd5 100644 +--- a/target/linux/ar71xx/files/arch/mips/ath79/mach-cpe510.c ++++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-cpe510.c +@@ -1,7 +1,8 @@ + /* +- * TP-LINK CPE210/220/510/520 board support ++ * TP-LINK CPE210/210 v2/220/510/520 board support + * + * Copyright (C) 2014 Matthias Schiffer ++ * Copyright (C) 2017 Robert Marko + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published +@@ -41,6 +42,8 @@ + #define CPE510_KEYS_POLL_INTERVAL 20 /* msecs */ + #define CPE510_KEYS_DEBOUNCE_INTERVAL (3 * CPE510_KEYS_POLL_INTERVAL) + ++/* CPE210 v2 reset GPIO */ ++#define CPE210_V2_GPIO_BTN_RESET 17 + + static struct gpio_led cpe510_leds_gpio[] __initdata = { + { +@@ -98,6 +101,30 @@ static struct gpio_led wbs510_leds_gpio[] __initdata = { + }, + }; + ++static struct gpio_led cpe210_v2_leds_gpio[] __initdata = { ++ { ++ .name = "tp-link:green:lan0", ++ .gpio = CPE510_GPIO_LED_LAN0, ++ .active_low = 1, ++ }, { ++ .name = "tp-link:green:link1", ++ .gpio = CPE510_GPIO_LED_L1, ++ .active_low = 1, ++ }, { ++ .name = "tp-link:green:link2", ++ .gpio = CPE510_GPIO_LED_L2, ++ .active_low = 1, ++ }, { ++ .name = "tp-link:green:link3", ++ .gpio = CPE510_GPIO_LED_L3, ++ .active_low = 1, ++ }, { ++ .name = "tp-link:green:link4", ++ .gpio = CPE510_GPIO_LED_L4, ++ .active_low = 1, ++ }, ++}; ++ + static struct gpio_keys_button cpe510_gpio_keys[] __initdata = { + { + .desc = "Reset button", +@@ -109,6 +136,17 @@ static struct gpio_keys_button cpe510_gpio_keys[] __initdata = { + } + }; + ++static struct gpio_keys_button cpe210_v2_gpio_keys[] __initdata = { ++ { ++ .desc = "Reset button", ++ .type = EV_KEY, ++ .code = KEY_RESTART, ++ .debounce_interval = CPE510_KEYS_DEBOUNCE_INTERVAL, ++ .gpio = CPE210_V2_GPIO_BTN_RESET, ++ .active_low = 1, ++ } ++}; ++ + static void __init cpe_setup(u8 *mac) + { + /* Disable JTAG, enabling GPIOs 0-3 */ +@@ -171,9 +209,33 @@ static void __init wbs_setup(void) + ath79_register_wmac(ee, mac); + } + ++static void __init cpe210_v2_setup(void) ++{ ++ u8 *mac = (u8 *) KSEG1ADDR(0x1f830008); ++ u8 *ee = (u8 *) KSEG1ADDR(0x1fff1000); ++ ++ ath79_register_leds_gpio(-1, ARRAY_SIZE(cpe210_v2_leds_gpio), ++ cpe210_v2_leds_gpio); ++ ath79_register_gpio_keys_polled(-1, CPE510_KEYS_POLL_INTERVAL, ++ ARRAY_SIZE(cpe210_v2_gpio_keys), ++ cpe210_v2_gpio_keys); ++ ath79_register_m25p80(NULL); ++ ath79_register_mdio(0, 0x0); ++ ath79_init_mac(ath79_eth0_data.mac_addr, mac, 0); ++ ath79_eth0_data.duplex = DUPLEX_FULL; ++ ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII; ++ ath79_eth0_data.speed = SPEED_100; ++ ath79_eth0_data.phy_mask = BIT(4); ++ ath79_register_eth(0); ++ ath79_register_wmac(ee, mac); ++} ++ + MIPS_MACHINE(ATH79_MACH_CPE210, "CPE210", "TP-LINK CPE210/220", + cpe210_setup); + ++MIPS_MACHINE(ATH79_MACH_CPE210_V2, "CPE210V2", "TP-LINK CPE210 v2", ++ cpe210_v2_setup); ++ + MIPS_MACHINE(ATH79_MACH_CPE510, "CPE510", "TP-LINK CPE510/520", + cpe510_setup); + +diff --git a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h +index b61ed7abcdf..81575b79164 100644 +--- a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h ++++ b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h +@@ -72,7 +72,8 @@ enum ath79_mach_type { + ATH79_MACH_CF_E380AC_V2, /* COMFAST CF-E380AC v2 */ + ATH79_MACH_CF_E520N, /* COMFAST CF-E520N */ + ATH79_MACH_CF_E530N, /* COMFAST CF-E530N */ +- ATH79_MACH_CPE210, /* TP-LINK CPE210 */ ++ ATH79_MACH_CPE210, /* TP-LINK CPE210 v1 */ ++ ATH79_MACH_CPE210_V2, /* TP-LINK CPE210 v2 */ + ATH79_MACH_CPE510, /* TP-LINK CPE510 */ + ATH79_MACH_CPE830, /* YunCore CPE830 */ + ATH79_MACH_CPE870, /* YunCore CPE870 */ +diff --git a/target/linux/ar71xx/image/tp-link.mk b/target/linux/ar71xx/image/tp-link.mk +index b3b5fdf1901..ac44f2bc9fe 100644 +--- a/target/linux/ar71xx/image/tp-link.mk ++++ b/target/linux/ar71xx/image/tp-link.mk +@@ -165,6 +165,18 @@ define Device/cpe210-220 + TPLINK_BOARD_NAME := CPE210 + endef + ++define Device/cpe210-v2 ++$(Device/cpe510-520) ++ DEVICE_TITLE := TP-LINK CPE210 v2 ++ BOARDNAME := CPE210V2 ++ TPLINK_BOARD_ID := CPE210V2 ++ KERNEL := kernel-bin | patch-cmdline | lzma | tplink-v1-header ++ TPLINK_HWID := 0x0 ++ TPLINK_HWREV := 0 ++ TPLINK_HEADER_VERSION := 1 ++endef ++TARGET_DEVICES += cpe210-v2 ++ + define Device/wbs210 + $(Device/cpe510-520) + DEVICE_TITLE := TP-LINK WBS210 +diff --git a/tools/firmware-utils/src/tplink-safeloader.c b/tools/firmware-utils/src/tplink-safeloader.c +index 53205353b75..12cb858a67a 100644 +--- a/tools/firmware-utils/src/tplink-safeloader.c ++++ b/tools/firmware-utils/src/tplink-safeloader.c +@@ -154,6 +154,48 @@ static struct device_info boards[] = { + .last_sysupgrade_partition = "support-list", + }, + ++ /** Firmware layout for the CPE210 V2 */ ++ { ++ .id = "CPE210V2", ++ .vendor = "CPE210(TP-LINK|UN|N300-2|00000000):2.0\r\n", ++ .support_list = ++ "SupportList:\r\n" ++ "CPE210(TP-LINK|EU|N300-2|00000000):2.0\r\n" ++ "CPE210(TP-LINK|EU|N300-2|45550000):2.0\r\n" ++ "CPE210(TP-LINK|EU|N300-2|55530000):2.0\r\n" ++ "CPE210(TP-LINK|UN|N300-2|00000000):2.0\r\n" ++ "CPE210(TP-LINK|UN|N300-2|45550000):2.0\r\n" ++ "CPE210(TP-LINK|UN|N300-2|55530000):2.0\r\n" ++ "CPE210(TP-LINK|US|N300-2|55530000):2.0\r\n" ++ "CPE210(TP-LINK|UN|N300-2):2.0\r\n" ++ "CPE210(TP-LINK|EU|N300-2):2.0\r\n" ++ "CPE210(TP-LINK|US|N300-2):2.0\r\n", ++ .support_trail = '\xff', ++ .soft_ver = NULL, ++ ++ .partitions = { ++ {"fs-uboot", 0x00000, 0x20000}, ++ {"partition-table", 0x20000, 0x02000}, ++ {"default-mac", 0x30000, 0x00020}, ++ {"product-info", 0x31100, 0x00100}, ++ {"device-info", 0x31400, 0x00400}, ++ {"signature", 0x32000, 0x00400}, ++ {"device-id", 0x33000, 0x00100}, ++ {"os-image", 0x40000, 0x1c0000}, ++ {"file-system", 0x200000, 0x5b0000}, ++ {"soft-version", 0x7b0000, 0x00100}, ++ {"support-list", 0x7b1000, 0x01000}, ++ {"user-config", 0x7c0000, 0x10000}, ++ {"default-config", 0x7d0000, 0x10000}, ++ {"log", 0x7e0000, 0x10000}, ++ {"radio", 0x7f0000, 0x10000}, ++ {NULL, 0, 0} ++ }, ++ ++ .first_sysupgrade_partition = "os-image", ++ .last_sysupgrade_partition = "support-list", ++ }, ++ + /** Firmware layout for the CPE510/520 */ + { + .id = "CPE510", diff --git a/targets/ar71xx-generic b/targets/ar71xx-generic index 2aa206b7..a16511d4 100644 --- a/targets/ar71xx-generic +++ b/targets/ar71xx-generic @@ -148,6 +148,8 @@ device tp-link-cpe210-v1.0 cpe210-220 alias tp-link-cpe210-v1.1 alias tp-link-cpe220-v1.1 +device tp-link-cpe210-v2.0 cpe210v2 + device tp-link-cpe510-v1.0 cpe510-520 alias tp-link-cpe510-v1.1 alias tp-link-cpe520-v1.1