ar71xx: add support for TP-LINK CPE210/220/510/520

This adds support for the TP-LINK CPE210/220/510/520 (Pharos series). These
devices are very similar to the Ubiquiti NanoStations, but with better specs:
faster CPU, more RAM, 2x2 MIMO.

Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>

SVN-Revision: 43385
This commit is contained in:
John Crispin 2014-11-26 08:59:32 +00:00
parent f318ae995a
commit 47ab1cbf23
10 changed files with 256 additions and 7 deletions

View File

@ -43,6 +43,9 @@ get_status_led() {
cap4200ag) cap4200ag)
status_led="senao:green:pwr" status_led="senao:green:pwr"
;; ;;
cpe510)
status_led="tp-link:green:link4"
;;
db120) db120)
status_led="db120:green:status" status_led="db120:green:status"
;; ;;

View File

@ -62,6 +62,16 @@ carambola2)
ucidef_set_led_wlan "wlan" "WLAN" "carambola2:green:wlan" "phy0tpt" ucidef_set_led_wlan "wlan" "WLAN" "carambola2:green:wlan" "phy0tpt"
;; ;;
cpe510)
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" "40000" "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"
;;
db120) db120)
ucidef_set_led_usbdev "usb" "USB" "db120:green:usb" "1-1" ucidef_set_led_usbdev "usb" "USB" "db120:green:usb" "1-1"
;; ;;

View File

@ -63,6 +63,13 @@ tl-wdr4900-v2)
ucidef_add_switch_vlan "switch0" "2" "1 6" ucidef_add_switch_vlan "switch0" "2" "1 6"
;; ;;
cpe510)
ucidef_set_interfaces_lan_wan "eth0.1" "eth0.2"
ucidef_add_switch "switch0" "1" "1"
ucidef_add_switch_vlan "switch0" "1" "0t 5"
ucidef_add_switch_vlan "switch0" "2" "0t 4"
;;
db120 |\ db120 |\
rb-2011l | \ rb-2011l | \
rb-2011uas |\ rb-2011uas |\

View File

@ -229,6 +229,39 @@ tplink_board_detect() {
AR71XX_MODEL="$model $hwver" AR71XX_MODEL="$model $hwver"
} }
tplink_pharos_get_model_string() {
local part
part=$(find_mtd_part 'product-info')
[ -z "$part" ] && return 1
# The returned string will end with \r\n, but we don't remove it here
# to simplify matching against it in the sysupgrade image check
dd if=$part bs=1 skip=4360 2>/dev/null | head -n 1
}
tplink_pharos_board_detect() {
local model_string="$(tplink_pharos_get_model_string | tr -d '\r')"
local oIFS="$IFS"; IFS=":"; set -- $model_string; IFS="$oIFS"
local model
case "$1" in
'CPE210(TP-LINK|UN|N300-2)')
model='TP-Link CPE210'
;;
'CPE220(TP-LINK|UN|N300-2)')
model='TP-Link CPE220'
;;
'CPE510(TP-LINK|UN|N300-5)')
model='TP-Link CPE510'
;;
'CPE520(TP-LINK|UN|N300-5)')
model='TP-Link CPE520'
;;
esac
[ -n "$model" ] && AR71XX_MODEL="$model v$2"
}
ar71xx_board_detect() { ar71xx_board_detect() {
local machine local machine
local name local name
@ -302,6 +335,10 @@ ar71xx_board_detect() {
*CAP4200AG) *CAP4200AG)
name="cap4200ag" name="cap4200ag"
;; ;;
*"CPE210/220/510/520")
name="cpe510"
tplink_pharos_board_detect
;;
*"DB120 reference board") *"DB120 reference board")
name="db120" name="db120"
;; ;;
@ -775,7 +812,8 @@ ar71xx_board_detect() {
;; ;;
esac esac
[ "${machine:0:8}" = 'TP-LINK ' ] && tplink_board_detect "$machine" [ -z "$AR71XX_MODEL" ] && [ "${machine:0:8}" = 'TP-LINK ' ] && \
tplink_board_detect "$machine"
[ -z "$name" ] && name="unknown" [ -z "$name" ] && name="unknown"

View File

@ -70,6 +70,33 @@ tplink_get_image_boot_size() {
get_image "$@" | dd bs=4 count=1 skip=37 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"' get_image "$@" | dd bs=4 count=1 skip=37 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"'
} }
tplink_pharos_check_image() {
local magic_long="$(get_magic_long "$1")"
[ "$magic_long" != "7f454c46" ] && {
echo "Invalid image magic '$magic_long'"
return 1
}
local model_string="$(tplink_pharos_get_model_string)"
local line
# Here $1 is given to dd directly instead of get_image as otherwise the skip
# will take almost a second (as dd can't seek then)
#
# This will fail if the image isn't local, but that's fine: as the
# read loop won't be executed at all, it will return true, so the image
# is accepted (loading the first 1.5M of a remote image for this check seems
# a bit extreme)
dd if="$1" bs=1 skip=1511432 count=1024 2>/dev/null | while read line; do
[ "$line" == "$model_string" ] && break
done || {
echo "Unsupported image (model not in support-list)"
return 1
}
return 0
}
seama_get_type_magic() { seama_get_type_magic() {
get_image "$@" | dd bs=1 count=4 skip=53 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"' get_image "$@" | dd bs=1 count=4 skip=53 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"'
} }
@ -217,6 +244,11 @@ platform_check_image() {
return 0 return 0
;; ;;
cpe510)
tplink_pharos_check_image "$1" && return 0
return 1
;;
dir-825-b1 | \ dir-825-b1 | \
tew-673gru) tew-673gru)
dir825b_check_image "$1" && return 0 dir825b_check_image "$1" && return 0

View File

@ -40,6 +40,7 @@ CONFIG_ATH79_MACH_AW_NR580=y
CONFIG_ATH79_MACH_BHU_BXU2000N2_A=y CONFIG_ATH79_MACH_BHU_BXU2000N2_A=y
CONFIG_ATH79_MACH_CAP4200AG=y CONFIG_ATH79_MACH_CAP4200AG=y
CONFIG_ATH79_MACH_CARAMBOLA2=y CONFIG_ATH79_MACH_CARAMBOLA2=y
CONFIG_ATH79_MACH_CPE510=y
CONFIG_ATH79_MACH_DB120=y CONFIG_ATH79_MACH_DB120=y
CONFIG_ATH79_MACH_DHP_1565_A1=y CONFIG_ATH79_MACH_DHP_1565_A1=y
CONFIG_ATH79_MACH_DIR_505_A1=y CONFIG_ATH79_MACH_DIR_505_A1=y

View File

@ -0,0 +1,107 @@
/*
* TP-LINK CPE210/220/510/520 board support
*
* Copyright (C) 2014 Matthias Schiffer <mschiffer@universe-factory.net>
*
* 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
* by the Free Software Foundation.
*/
#include <linux/gpio.h>
#include <linux/platform_device.h>
#include <asm/mach-ath79/ath79.h>
#include <asm/mach-ath79/ar71xx_regs.h>
#include "common.h"
#include "dev-eth.h"
#include "dev-gpio-buttons.h"
#include "dev-leds-gpio.h"
#include "dev-m25p80.h"
#include "dev-wmac.h"
#include "machtypes.h"
#define CPE510_GPIO_LED_LAN0 11
#define CPE510_GPIO_LED_LAN1 12
#define CPE510_GPIO_LED_L1 13
#define CPE510_GPIO_LED_L2 14
#define CPE510_GPIO_LED_L3 15
#define CPE510_GPIO_LED_L4 16
#define CPE510_GPIO_BTN_RESET 4
#define CPE510_KEYS_POLL_INTERVAL 20 /* msecs */
#define CPE510_KEYS_DEBOUNCE_INTERVAL (3 * CPE510_KEYS_POLL_INTERVAL)
static struct gpio_led cpe510_leds_gpio[] __initdata = {
{
.name = "tp-link:green:lan0",
.gpio = CPE510_GPIO_LED_LAN0,
.active_low = 1,
}, {
.name = "tp-link:green:lan1",
.gpio = CPE510_GPIO_LED_LAN1,
.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",
.type = EV_KEY,
.code = KEY_RESTART,
.debounce_interval = CPE510_KEYS_DEBOUNCE_INTERVAL,
.gpio = CPE510_GPIO_BTN_RESET,
.active_low = 1,
}
};
static void __init cpe510_setup(void)
{
u8 *mac = (u8 *) KSEG1ADDR(0x1f830008);
u8 *ee = (u8 *) KSEG1ADDR(0x1fff1000);
/* Disable JTAG, enabling GPIOs 0-3 */
/* Configure OBS4 line, for GPIO 4*/
ath79_gpio_function_setup(AR934X_GPIO_FUNC_JTAG_DISABLE,
AR934X_GPIO_FUNC_CLK_OBS4_EN);
ath79_register_leds_gpio(-1, ARRAY_SIZE(cpe510_leds_gpio),
cpe510_leds_gpio);
ath79_register_gpio_keys_polled(1, CPE510_KEYS_POLL_INTERVAL,
ARRAY_SIZE(cpe510_gpio_keys),
cpe510_gpio_keys);
ath79_register_m25p80(NULL);
ath79_register_mdio(1, 0);
ath79_init_mac(ath79_eth1_data.mac_addr, mac, 0);
ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII;
ath79_register_eth(1);
ath79_register_wmac(ee, mac);
}
MIPS_MACHINE(ATH79_MACH_CPE510, "CPE510", "TP-LINK CPE210/220/510/520",
cpe510_setup);

View File

@ -16,6 +16,17 @@ endef
$(eval $(call Profile,ARCHERC7)) $(eval $(call Profile,ARCHERC7))
define Profile/CPE510
NAME:=TP-LINK CPE210/220/510/520
PACKAGES:=rssileds
endef
define Profile/CPE510/Description
Package set optimized for the TP-LINK CPE210/220/510/520.
endef
$(eval $(call Profile,CPE510))
define Profile/TLMR10U define Profile/TLMR10U
NAME:=TP-LINK TL-MR10U NAME:=TP-LINK TL-MR10U
PACKAGES:=kmod-usb-core kmod-usb2 PACKAGES:=kmod-usb-core kmod-usb2

View File

@ -276,6 +276,7 @@ cameo_ap121_mtdlayout_8M=mtdparts=spi0.0:64k(u-boot)ro,64k(art)ro,64k(mac)ro,64k
cameo_db120_mtdlayout=mtdparts=spi0.0:64k(uboot)ro,64k(nvram)ro,15936k(firmware),192k(lang)ro,64k(mac)ro,64k(art)ro cameo_db120_mtdlayout=mtdparts=spi0.0:64k(uboot)ro,64k(nvram)ro,15936k(firmware),192k(lang)ro,64k(mac)ro,64k(art)ro
cameo_db120_mtdlayout_8M=mtdparts=spi0.0:64k(uboot)ro,64k(nvram)ro,7872k(firmware),128k(lang)ro,64k(art)ro cameo_db120_mtdlayout_8M=mtdparts=spi0.0:64k(uboot)ro,64k(nvram)ro,7872k(firmware),128k(lang)ro,64k(art)ro
cap4200ag_mtdlayout=mtdparts=spi0.0:256k(u-boot),64k(u-boot-env),320k(custom)ro,1536k(kernel),12096k(rootfs),2048k(failsafe),64k(art),13632k@0xa0000(firmware) cap4200ag_mtdlayout=mtdparts=spi0.0:256k(u-boot),64k(u-boot-env),320k(custom)ro,1536k(kernel),12096k(rootfs),2048k(failsafe),64k(art),13632k@0xa0000(firmware)
cpe510_mtdlayout=mtdparts=spi0.0:128k(u-boot)ro,64k(pation-table)ro,64k(product-info)ro,1536k(kernel),6144k(rootfs),192k(config)ro,64k(ART)ro,7680k@0x40000(firmware)
eap300v2_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env),320k(custom),13632k(firmware),2048k(failsafe),64k(art)ro eap300v2_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env),320k(custom),13632k(firmware),2048k(failsafe),64k(art)ro
db120_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,6336k(rootfs),1408k(kernel),64k(nvram),64k(art)ro,7744k@0x50000(firmware) db120_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,6336k(rootfs),1408k(kernel),64k(nvram),64k(art)ro,7744k@0x50000(firmware)
cameo_ap94_mtdlayout=mtdparts=spi0.0:256k(uboot)ro,64k(config)ro,6208k(firmware),64k(caldata)ro,1600k(unknown)ro,64k@0x7f0000(caldata_copy) cameo_ap94_mtdlayout=mtdparts=spi0.0:256k(uboot)ro,64k(config)ro,6208k(firmware),64k(caldata)ro,1600k(unknown)ro,64k@0x7f0000(caldata_copy)
@ -831,6 +832,32 @@ define Image/Build/TPLINK-LZMA/initramfs
endef endef
Image/Build/TPLINK-SAFELOADER/buildkernel=$(call PatchKernelLzma,$(2),$(3) $(4))
define Image/Build/TPLINK-SAFELOADER
-rm -rf $(KDIR)/lzma-loader
$(LOADER_MAKE) LOADER=loader-$(2).elf\
LZMA_TEXT_START=0x80a00000 LOADADDR=0x80060000 \
LOADER_DATA="$(KDIR_TMP)/vmlinux-$(2).bin.lzma" BOARD="$(2)" \
compile loader.elf
-$(STAGING_DIR_HOST)/bin/tplink-safeloader \
-B $(5) \
-k $(KDIR)/loader-$(2).elf \
-r $(KDIR)/root.$(1) \
-V $(REVISION) \
-j \
-o $(call factoryname,$(1),$(2))
-$(STAGING_DIR_HOST)/bin/tplink-safeloader \
-B $(5) \
-k $(KDIR)/loader-$(2).elf \
-r $(KDIR)/root.$(1) \
-V $(REVISION) \
-j -S \
-o $(call sysupname,$(1),$(2))
endef
define Image/Build/CyberTAN define Image/Build/CyberTAN
echo -n '' > $(KDIR_TMP)/empty.bin echo -n '' > $(KDIR_TMP)/empty.bin
$(STAGING_DIR_HOST)/bin/trx -o $(KDIR)/image.tmp \ $(STAGING_DIR_HOST)/bin/trx -o $(KDIR)/image.tmp \
@ -1264,6 +1291,8 @@ $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWDR4310V1,tl-wdr4310-v1,TL-WDR4
$(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWDR4900V2,tl-wdr4900-v2,TL-WDR4900-v2,ttyS0,115200,0x49000002,1,8Mlzma)) $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWDR4900V2,tl-wdr4900-v2,TL-WDR4900-v2,ttyS0,115200,0x49000002,1,8Mlzma))
$(eval $(call SingleProfile,TPLINK-LZMA,64kraw,MW4530RV1,mw4530r-v1,TL-WDR4300,ttyS0,115200,0x45300001,1,8Mlzma)) $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,MW4530RV1,mw4530r-v1,TL-WDR4300,ttyS0,115200,0x45300001,1,8Mlzma))
$(eval $(call SingleProfile,TPLINK-SAFELOADER,64kraw,CPE510,cpe210-220-510-520,CPE510,ttyS0,115200,$$(cpe510_mtdlayout),CPE510))
$(eval $(call SingleProfile,TPLINK-LZMA,64kraw,SMART-300,smart-300,SMART-300,ttyS0,115200,0x93410001,1,8Mlzma)) $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,SMART-300,smart-300,SMART-300,ttyS0,115200,0x93410001,1,8Mlzma))
$(eval $(call SingleProfile,TPLINK-LZMA,64kraw,OOLITE,oolite,GS-OOLITE,ttyATH0,115200,0x3C000101,1,16Mlzma)) $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,OOLITE,oolite,GS-OOLITE,ttyATH0,115200,0x3C000101,1,16Mlzma))

View File

@ -1,6 +1,6 @@
--- a/arch/mips/ath79/machtypes.h --- a/arch/mips/ath79/machtypes.h
+++ b/arch/mips/ath79/machtypes.h +++ b/arch/mips/ath79/machtypes.h
@@ -16,22 +16,144 @@ @@ -16,22 +16,145 @@
enum ath79_mach_type { enum ath79_mach_type {
ATH79_MACH_GENERIC = 0, ATH79_MACH_GENERIC = 0,
@ -24,6 +24,7 @@
+ ATH79_MACH_BHU_BXU2000N2_A1, /* BHU BXU2000n-2 A1 */ + ATH79_MACH_BHU_BXU2000N2_A1, /* BHU BXU2000n-2 A1 */
+ ATH79_MACH_CAP4200AG, /* Senao CAP4200AG */ + ATH79_MACH_CAP4200AG, /* Senao CAP4200AG */
+ ATH79_MACH_CARAMBOLA2, /* 8devices Carambola2 */ + ATH79_MACH_CARAMBOLA2, /* 8devices Carambola2 */
+ ATH79_MACH_CPE510, /* TP-LINK CPE510 */
ATH79_MACH_DB120, /* Atheros DB120 reference board */ ATH79_MACH_DB120, /* Atheros DB120 reference board */
ATH79_MACH_PB44, /* Atheros PB44 reference board */ ATH79_MACH_PB44, /* Atheros PB44 reference board */
+ ATH79_MACH_DIR_505_A1, /* D-Link DIR-505 rev. A1 */ + ATH79_MACH_DIR_505_A1, /* D-Link DIR-505 rev. A1 */
@ -209,7 +210,7 @@
config ATH79_MACH_AP121 config ATH79_MACH_AP121
bool "Atheros AP121 reference board" bool "Atheros AP121 reference board"
select SOC_AR933X select SOC_AR933X
@@ -11,62 +66,734 @@ config ATH79_MACH_AP121 @@ -11,62 +66,743 @@ config ATH79_MACH_AP121
select ATH79_DEV_M25P80 select ATH79_DEV_M25P80
select ATH79_DEV_USB select ATH79_DEV_USB
select ATH79_DEV_WMAC select ATH79_DEV_WMAC
@ -698,6 +699,15 @@
+ select ATH79_DEV_USB + select ATH79_DEV_USB
+ select ATH79_DEV_WMAC + select ATH79_DEV_WMAC
+ +
+config ATH79_MACH_CPE510
+ bool "TP-LINK CPE510 support"
+ select SOC_AR934X
+ select ATH79_DEV_ETH
+ select ATH79_DEV_GPIO_BUTTONS
+ select ATH79_DEV_LEDS_GPIO
+ select ATH79_DEV_M25P80
+ select ATH79_DEV_WMAC
+
+config ATH79_MACH_TL_MR11U +config ATH79_MACH_TL_MR11U
+ bool "TP-LINK TL-MR11U/TL-MR3040 support" + bool "TP-LINK TL-MR11U/TL-MR3040 support"
+ select SOC_AR933X + select SOC_AR933X
@ -972,7 +982,7 @@
config ATH79_MACH_UBNT_XM config ATH79_MACH_UBNT_XM
bool "Ubiquiti Networks XM/UniFi boards" bool "Ubiquiti Networks XM/UniFi boards"
@@ -83,6 +810,65 @@ config ATH79_MACH_UBNT_XM @@ -83,6 +819,65 @@ config ATH79_MACH_UBNT_XM
Say 'Y' here if you want your kernel to support the Say 'Y' here if you want your kernel to support the
Ubiquiti Networks XM (rev 1.0) board. Ubiquiti Networks XM (rev 1.0) board.
@ -1038,7 +1048,7 @@
endmenu endmenu
config SOC_AR71XX config SOC_AR71XX
@@ -132,7 +918,10 @@ config ATH79_DEV_DSA @@ -132,7 +927,10 @@ config ATH79_DEV_DSA
config ATH79_DEV_ETH config ATH79_DEV_ETH
def_bool n def_bool n
@ -1050,7 +1060,7 @@
def_bool n def_bool n
config ATH79_DEV_GPIO_BUTTONS config ATH79_DEV_GPIO_BUTTONS
@@ -164,4 +953,7 @@ config ATH79_PCI_ATH9K_FIXUP @@ -164,4 +962,7 @@ config ATH79_PCI_ATH9K_FIXUP
config ATH79_ROUTERBOOT config ATH79_ROUTERBOOT
def_bool n def_bool n
@ -1060,7 +1070,7 @@
endif endif
--- a/arch/mips/ath79/Makefile --- a/arch/mips/ath79/Makefile
+++ b/arch/mips/ath79/Makefile +++ b/arch/mips/ath79/Makefile
@@ -38,9 +38,90 @@ obj-$(CONFIG_ATH79_ROUTERBOOT) += route @@ -38,9 +38,91 @@ obj-$(CONFIG_ATH79_ROUTERBOOT) += route
# #
# Machines # Machines
# #
@ -1079,6 +1089,7 @@
+obj-$(CONFIG_ATH79_MACH_AW_NR580) += mach-aw-nr580.o +obj-$(CONFIG_ATH79_MACH_AW_NR580) += mach-aw-nr580.o
+obj-$(CONFIG_ATH79_MACH_BHU_BXU2000N2_A)+= mach-bhu-bxu2000n2-a.o +obj-$(CONFIG_ATH79_MACH_BHU_BXU2000N2_A)+= mach-bhu-bxu2000n2-a.o
+obj-$(CONFIG_ATH79_MACH_CAP4200AG) += mach-cap4200ag.o +obj-$(CONFIG_ATH79_MACH_CAP4200AG) += mach-cap4200ag.o
+obj-$(CONFIG_ATH79_MACH_CPE510) += mach-cpe510.o
obj-$(CONFIG_ATH79_MACH_DB120) += mach-db120.o obj-$(CONFIG_ATH79_MACH_DB120) += mach-db120.o
+obj-$(CONFIG_ATH79_MACH_DIR_505_A1) += mach-dir-505-a1.o +obj-$(CONFIG_ATH79_MACH_DIR_505_A1) += mach-dir-505-a1.o
+obj-$(CONFIG_ATH79_MACH_DIR_600_A1) += mach-dir-600-a1.o +obj-$(CONFIG_ATH79_MACH_DIR_600_A1) += mach-dir-600-a1.o