ar71xx: add support for TP-Link Archer C25 v1
authorLudwig Thomeczek <ledesrc@wxorx.net>
Sat, 22 Apr 2017 16:21:47 +0000 (18:21 +0200)
committerPiotr Dymacz <pepe2k@gmail.com>
Sun, 11 Jun 2017 19:32:18 +0000 (21:32 +0200)
The TP-Link Archer C25 is a low-cost dual-band router.

Specification:

- CPU: Atheros QCA9561 775 MHz
- RAM: 64 MB
- Flash: 8 MB
- Wifi: 3x3 2.4 GHz (integrated), 1x1 5 GHz QCA9887
- NET: 5x 10/100 Mbps Ethernet

Some LEDs are controlled by an additional 74HC595 chip.

Signed-off-by: Ludwig Thomeczek <ledesrc@wxorx.net>
[minor code style fixes, boards alphabetical order fixes,
reworked commit message]
Signed-off-by: Piotr Dymacz <pepe2k@gmail.com>
14 files changed:
target/linux/ar71xx/base-files/etc/board.d/01_leds
target/linux/ar71xx/base-files/etc/board.d/02_network
target/linux/ar71xx/base-files/etc/diag.sh
target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
target/linux/ar71xx/base-files/lib/ar71xx.sh
target/linux/ar71xx/base-files/lib/upgrade/platform.sh
target/linux/ar71xx/config-4.4
target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
target/linux/ar71xx/files/arch/mips/ath79/Makefile
target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c [new file with mode: 0644]
target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
target/linux/ar71xx/image/tp-link.mk
target/linux/ar71xx/mikrotik/config-default
target/linux/ar71xx/nand/config-default

index be6dfcc9688d2c231d4f5dbaf3b7587a1dc33417..87f99ea9d88993b318b38b9d4a89e5e99238ac21 100755 (executable)
@@ -54,6 +54,15 @@ sc1750|\
 sc450)
        ucidef_set_led_wlan "wlan" "WLAN" "$board:green:wlan" "phy0tpt"
        ;;
+archer-c25-v1)
+       ucidef_set_led_netdev "wan" "WAN" "$board:green:wan" "eth0"
+       ucidef_set_led_wlan "wlan" "WLAN" "$board:green:wlan2g" "phy1tpt"
+       ucidef_set_led_wlan "wlan5g" "WLAN5G" "$board:green:wlan5g" "phy0tpt"
+       ucidef_set_led_switch "lan1" "LAN1" "$board:green:lan1" "switch0" "0x10"
+       ucidef_set_led_switch "lan2" "LAN2" "$board:green:lan2" "switch0" "0x08"
+       ucidef_set_led_switch "lan3" "LAN3" "$board:green:lan3" "switch0" "0x04"
+       ucidef_set_led_switch "lan4" "LAN4" "$board:green:lan4" "switch0" "0x02"
+       ;;
 archer-c59-v1|\
 archer-c60-v1)
        ucidef_set_led_switch "lan" "LAN" "$board:green:lan" "switch0" "0x1E"
index b805487977698b9ddf0d4ee69f9a50969c28d20f..80355d616046f46665d7360cb13d96ec480b7426 100755 (executable)
@@ -133,6 +133,7 @@ ar71xx_setup_interfaces()
        a60|\
        alfa-ap96|\
        alfa-nx|\
+       archer-c25-v1|\
        dr344|\
        gl-ar150|\
        gl-ar300m|\
index 369abde9d49e84f616363d19bc2496ca04ccf07a..dce5d8e3cff852f19b218288677c02811fbe3cf8 100644 (file)
@@ -51,6 +51,7 @@ get_status_led() {
        ap135-020)
                status_led="ap135:green:status"
                ;;
+       archer-c25-v1|\
        archer-c59-v1|\
        archer-c60-v1|\
        mr12|\
index d4afbbcc25592278a85378cd9e11327f41486f99..6c83a2fba24c0b1ebd1139d132e2331d0d96af69 100644 (file)
@@ -92,6 +92,7 @@ case "$FIRMWARE" in
                ath10kcal_extract "art" 20480 2116
                ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) -2)
                ;;
+       archer-c25-v1|\
        archer-c59-v1|\
        archer-c60-v1|\
        tl-wdr6500-v2)
index 5660d3eaa910b32c381a2fcb79a9a25e239ffc59..a1abfa047de3c01fc38b73f20929bf8ccf7787cd 100755 (executable)
@@ -440,6 +440,9 @@ ar71xx_board_detect() {
        *"AP90Q")
                name="ap90q"
                ;;
+       *"Archer C25 v1")
+               name="archer-c25-v1"
+               ;;
        *"Archer C5")
                name="archer-c5"
                ;;
index e14f8f3e49e53853bb722b20b50bfd232a7b8169..4ee467180d883fee1ca19c780e5d8e59a018a3ce 100755 (executable)
@@ -206,6 +206,7 @@ platform_check_image() {
        ap132|\
        ap531b0|\
        ap90q|\
+       archer-c25-v1|\
        archer-c59-v1|\
        archer-c60-v1|\
        bullet-m|\
index df1108d9046c62b65d29e4f36a5f621496193e32..6ac3a9ede3012883a7bb4f8fcc2933af48c08249 100644 (file)
@@ -51,6 +51,7 @@ CONFIG_ATH79_MACH_AP531B0=y
 # CONFIG_ATH79_MACH_AP81 is not set
 CONFIG_ATH79_MACH_AP90Q=y
 CONFIG_ATH79_MACH_AP96=y
+CONFIG_ATH79_MACH_ARCHER_C25_V1=y
 CONFIG_ATH79_MACH_ARCHER_C59_V1=y
 CONFIG_ATH79_MACH_ARCHER_C60_V1=y
 CONFIG_ATH79_MACH_ARCHER_C7=y
index ae64c6e92eaf8b7b203ac4b9d5bacb776dac4cd0..6182a6f47f3b4f4cfc47cf699d1a61fc6cdf5864 100644 (file)
@@ -1318,6 +1318,16 @@ config ATH79_MACH_BSB
        select ATH79_DEV_USB
        select ATH79_DEV_WMAC
 
+config ATH79_MACH_ARCHER_C25_V1
+       bool "TP-LINK Archer C25 v1 support"
+       select SOC_QCA956X
+       select ATH79_DEV_AP9X_PCI if PCI
+       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_ARCHER_C59_V1
        bool "TP-LINK Archer C59 v1 support"
        select SOC_QCA956X
index bf5515b4f346d537aba7b44121c5670b5a90cb60..5c22fafe511b2c817a43cb295ec4df6a6a378e65 100644 (file)
@@ -56,6 +56,7 @@ obj-$(CONFIG_ATH79_MACH_AP152)                        += mach-ap152.o
 obj-$(CONFIG_ATH79_MACH_AP531B0)               += mach-ap531b0.o
 obj-$(CONFIG_ATH79_MACH_AP90Q)                 += mach-ap90q.o
 obj-$(CONFIG_ATH79_MACH_AP96)                  += mach-ap96.o
+obj-$(CONFIG_ATH79_MACH_ARCHER_C25_V1)         += mach-archer-c25-v1.o
 obj-$(CONFIG_ATH79_MACH_ARCHER_C59_V1)         += mach-archer-c59-v1.o
 obj-$(CONFIG_ATH79_MACH_ARCHER_C60_V1)         += mach-archer-c60-v1.o
 obj-$(CONFIG_ATH79_MACH_ARCHER_C7)             += mach-archer-c7.o
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c
new file mode 100644 (file)
index 0000000..a0f001c
--- /dev/null
@@ -0,0 +1,227 @@
+/*
+ *  TP-Link Archer C25 v1 board support
+ *
+ *  Copyright (C) 2017 Ludwig Thomeczek <ledesrc@wxorx.net>
+ *  based on mach-archer-c60/C59-v1.c
+ *  Copyright (C) 2016 Henryk Heisig <hyniu@o2.pl>
+ *
+ *  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/platform_device.h>
+#include <linux/ath9k_platform.h>
+#include <linux/ar8216_platform.h>
+#include <asm/mach-ath79/ar71xx_regs.h>
+#include <linux/gpio.h>
+
+#include "common.h"
+#include "dev-m25p80.h"
+#include "machtypes.h"
+#include "pci.h"
+#include "dev-ap9x-pci.h"
+#include "dev-eth.h"
+#include "dev-gpio-buttons.h"
+#include "dev-leds-gpio.h"
+#include "dev-spi.h"
+#include "dev-usb.h"
+#include "dev-wmac.h"
+#include <linux/spi/spi_gpio.h>
+#include <linux/spi/74x164.h>
+
+#define ARCHER_C25_GPIO_SHIFT_OE       21 /* OE,   Output Enable */
+#define ARCHER_C25_GPIO_SHIFT_SER      14 /* DS,   Data Serial Input */
+#define ARCHER_C25_GPIO_SHIFT_SRCLK    15 /* SHCP, Shift Reg Clock Input */
+#define ARCHER_C25_GPIO_SHIFT_SRCLR    19 /* MR,   Master Reset */
+#define ARCHER_C25_GPIO_SHIFT_RCLK     16 /* STCP, Storage Reg Clock Input */
+
+#define ARCHER_C25_74HC_GPIO_BASE              QCA956X_GPIO_COUNT
+#define ARCHER_C25_74HC_GPIO_LED_WAN_AMBER     27
+#define ARCHER_C25_74HC_GPIO_LED_WAN_GREEN     28
+#define ARCHER_C25_74HC_GPIO_LED_WLAN2         29
+#define ARCHER_C25_74HC_GPIO_LED_WLAN5         30
+#define ARCHER_C25_74HC_GPIO_LED_LAN1          23
+#define ARCHER_C25_74HC_GPIO_LED_LAN2          24
+#define ARCHER_C25_74HC_GPIO_LED_LAN3          25
+#define ARCHER_C25_74HC_GPIO_LED_LAN4          26
+
+#define ARCHER_C25_V1_SSR_BIT_0                        0
+#define ARCHER_C25_V1_SSR_BIT_1                        1
+#define ARCHER_C25_V1_SSR_BIT_2                        2
+#define ARCHER_C25_V1_SSR_BIT_3                        3
+#define ARCHER_C25_V1_SSR_BIT_4                        4
+#define ARCHER_C25_V1_SSR_BIT_5                        5
+#define ARCHER_C25_V1_SSR_BIT_6                        6
+#define ARCHER_C25_V1_SSR_BIT_7                        7
+
+
+#define ARCHER_C25_V1_KEYS_POLL_INTERVAL       20
+#define ARCHER_C25_V1_KEYS_DEBOUNCE_INTERVAL   \
+                                       (3 * ARCHER_C25_V1_KEYS_POLL_INTERVAL)
+
+#define ARCHER_C25_V1_GPIO_BTN_RESET           1
+#define ARCHER_C25_V1_GPIO_BTN_RFKILL          22
+
+#define ARCHER_C25_V1_GPIO_LED_POWER           17
+#define ARCHER_C25_V1_GPIO_LED_WPS             2
+
+#define ARCHER_C25_V1_WMAC_CALDATA_OFFSET      0x1000
+
+static struct spi_gpio_platform_data archer_c25_v1_spi_data = {
+       .sck            = ARCHER_C25_GPIO_SHIFT_SRCLK,
+       .miso           = SPI_GPIO_NO_MISO,
+       .mosi           = ARCHER_C25_GPIO_SHIFT_SER,
+       .num_chipselect = 1,
+};
+
+static u8 archer_c25_v1_ssr_initdata[] __initdata = {
+       BIT(ARCHER_C25_V1_SSR_BIT_7) |
+       BIT(ARCHER_C25_V1_SSR_BIT_6) |
+       BIT(ARCHER_C25_V1_SSR_BIT_5) |
+       BIT(ARCHER_C25_V1_SSR_BIT_4) |
+       BIT(ARCHER_C25_V1_SSR_BIT_3) |
+       BIT(ARCHER_C25_V1_SSR_BIT_2) |
+       BIT(ARCHER_C25_V1_SSR_BIT_1)
+};
+
+static struct gen_74x164_chip_platform_data archer_c25_v1_ssr_data = {
+       .base = ARCHER_C25_74HC_GPIO_BASE,
+       .num_registers = ARRAY_SIZE(archer_c25_v1_ssr_initdata),
+       .init_data = archer_c25_v1_ssr_initdata,
+};
+
+static struct platform_device archer_c25_v1_spi_device = {
+       .name           = "spi_gpio",
+       .id             = 1,
+       .dev = {
+               .platform_data = &archer_c25_v1_spi_data,
+       },
+};
+
+static struct spi_board_info archer_c25_v1_spi_info[] = {
+       {
+               .bus_num                = 1,
+               .chip_select            = 0,
+               .max_speed_hz           = 10000000,
+               .modalias               = "74x164",
+               .platform_data          = &archer_c25_v1_ssr_data,
+               .controller_data        = (void *) ARCHER_C25_GPIO_SHIFT_RCLK,
+       },
+};
+
+static struct gpio_led archer_c25_v1_leds_gpio[] __initdata = {
+       {
+               .name           = "archer-c25-v1:green:power",
+               .gpio           = ARCHER_C25_V1_GPIO_LED_POWER,
+               .active_low     = 1,
+       }, {
+               .name           = "archer-c25-v1:green:wps",
+               .gpio           = ARCHER_C25_V1_GPIO_LED_WPS,
+               .active_low     = 1,
+       }, {
+               .name           = "archer-c25-v1:green:wlan2g",
+               .gpio           = ARCHER_C25_74HC_GPIO_LED_WLAN2,
+               .active_low     = 1,
+       }, {
+               .name           = "archer-c25-v1:green:wlan5g",
+               .gpio           = ARCHER_C25_74HC_GPIO_LED_WLAN5,
+               .active_low     = 1,
+       }, {
+               .name           = "archer-c25-v1:green:lan1",
+               .gpio           = ARCHER_C25_74HC_GPIO_LED_LAN1,
+               .active_low     = 1,
+       }, {
+               .name           = "archer-c25-v1:green:lan2",
+               .gpio           = ARCHER_C25_74HC_GPIO_LED_LAN2,
+               .active_low     = 1,
+       }, {
+               .name           = "archer-c25-v1:green:lan3",
+               .gpio           = ARCHER_C25_74HC_GPIO_LED_LAN3,
+               .active_low     = 1,
+       }, {
+               .name           = "archer-c25-v1:green:lan4",
+               .gpio           = ARCHER_C25_74HC_GPIO_LED_LAN4,
+               .active_low     = 1,
+       }, {
+               .name           = "archer-c25-v1:green:wan",
+               .gpio           =  ARCHER_C25_74HC_GPIO_LED_WAN_GREEN,
+               .active_low     = 1,
+       }, {
+               .name           = "archer-c25-v1:amber:wan",
+               .gpio           =  ARCHER_C25_74HC_GPIO_LED_WAN_AMBER,
+               .active_low     = 1,
+       },
+};
+
+static struct gpio_keys_button archer_c25_v1_gpio_keys[] __initdata = {
+       {
+               .desc                   = "Reset button",
+               .type                   = EV_KEY,
+               .code                   = KEY_RESTART,
+               .debounce_interval      = ARCHER_C25_V1_KEYS_DEBOUNCE_INTERVAL,
+               .gpio                   = ARCHER_C25_V1_GPIO_BTN_RESET,
+               .active_low             = 1,
+       }, {
+               .desc                   = "RFKILL button",
+               .type                   = EV_KEY,
+               .code                   = KEY_RFKILL,
+               .debounce_interval      = ARCHER_C25_V1_KEYS_DEBOUNCE_INTERVAL,
+               .gpio                   = ARCHER_C25_V1_GPIO_BTN_RFKILL,
+               .active_low             = 1,
+       },
+};
+
+static void __init archer_c25_v1_setup(void)
+{
+       u8 *mac = (u8 *) KSEG1ADDR(0x1f7e0008);
+       u8 *art = (u8 *) KSEG1ADDR(0x1f7f0000);
+
+       ath79_register_m25p80(NULL);
+
+       spi_register_board_info(archer_c25_v1_spi_info,
+                               ARRAY_SIZE(archer_c25_v1_spi_info));
+
+       platform_device_register(&archer_c25_v1_spi_device);
+
+       gpio_request_one(ARCHER_C25_GPIO_SHIFT_OE,
+                        GPIOF_OUT_INIT_LOW | GPIOF_EXPORT_DIR_FIXED,
+                        "LED control");
+
+       gpio_request_one(ARCHER_C25_GPIO_SHIFT_SRCLR,
+                        GPIOF_OUT_INIT_HIGH | GPIOF_EXPORT_DIR_FIXED,
+                        "LED reset");
+
+       ath79_register_leds_gpio(-1, ARRAY_SIZE(archer_c25_v1_leds_gpio),
+                                archer_c25_v1_leds_gpio);
+
+       ath79_register_gpio_keys_polled(-1, ARCHER_C25_V1_KEYS_POLL_INTERVAL,
+                                       ARRAY_SIZE(archer_c25_v1_gpio_keys),
+                                       archer_c25_v1_gpio_keys);
+
+       ath79_register_mdio(0, 0x0);
+       ath79_register_mdio(1, 0x0);
+
+       ath79_init_mac(ath79_eth0_data.mac_addr, mac, 0);
+       ath79_init_mac(ath79_eth1_data.mac_addr, mac, 1);
+
+       /* WAN port */
+       ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
+       ath79_eth0_data.speed = SPEED_100;
+       ath79_eth0_data.duplex = DUPLEX_FULL;
+       ath79_eth0_data.phy_mask = BIT(4);
+       ath79_register_eth(0);
+
+       /* LAN ports */
+       ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII;
+       ath79_eth1_data.speed = SPEED_1000;
+       ath79_eth1_data.duplex = DUPLEX_FULL;
+       ath79_switch_data.phy_poll_mask |= BIT(4);
+       ath79_switch_data.phy4_mii_en = 1;
+       ath79_register_eth(1);
+
+       ath79_register_wmac(art + ARCHER_C25_V1_WMAC_CALDATA_OFFSET, mac);
+       ap91_pci_init(NULL, NULL);
+}
+
+MIPS_MACHINE(ATH79_MACH_ARCHER_C25_V1, "ARCHER-C25-V1", "TP-LINK Archer C25 v1",
+            archer_c25_v1_setup);
index 46d250d47d40288c1bf5b2e5df6f004f4b25d707..19d06c983416341a4831322c0678daef31724aaf 100644 (file)
@@ -40,6 +40,7 @@ enum ath79_mach_type {
        ATH79_MACH_AP531B0,                     /* Rockeetech AP531B0 */
        ATH79_MACH_AP90Q,                       /* YunCore AP90Q */
        ATH79_MACH_AP96,                        /* Atheros AP96 */
+       ATH79_MACH_ARCHER_C25_V1,               /* TP-LINK Archer C25 V1 board */
        ATH79_MACH_ARCHER_C5,                   /* TP-LINK Archer C5 board */
        ATH79_MACH_ARCHER_C59_V1,               /* TP-LINK Archer C59 V1 board */
        ATH79_MACH_ARCHER_C60_V1,               /* TP-LINK Archer C60 V1 board */
index d9c7982e8c1ed9afdf9c42cf187c5738b7edfb99..c80b4ef71b2d6dfa8e0fef180a3fe95574157022 100644 (file)
@@ -118,6 +118,22 @@ define Device/tplink-16mlzma
   IMAGE_SIZE := 15872k
 endef
 
+define Device/archer-c25-v1
+  DEVICE_TITLE := TP-LINK Archer C25 v1
+  DEVICE_PACKAGES := kmod-ath10k ath10k-firmware-qca9887
+  BOARDNAME := ARCHER-C25-V1
+  TPLINK_BOARD_NAME := ARCHER-C25-V1
+  DEVICE_PROFILE := ARCHERC25V1
+  IMAGE_SIZE := 7808k
+  LOADER_TYPE := elf
+  KERNEL := kernel-bin | patch-cmdline | lzma | uImageArcher lzma
+  IMAGES := sysupgrade.bin factory.bin
+  IMAGE/sysupgrade.bin := append-rootfs | tplink-safeloader sysupgrade
+  IMAGE/factory.bin := append-rootfs | tplink-safeloader factory
+  MTDPARTS := spi0.0:128k(factory-uboot)ro,64k(u-boot)ro,1536k(kernel),6272k(rootfs),128k(config)ro,64k(art)ro,7808k@0x30000(firmware)
+endef
+TARGET_DEVICES += archer-c25-v1
+
 define Device/archer-c59-v1
   DEVICE_TITLE := TP-LINK Archer C59 v1
   DEVICE_PACKAGES := kmod-usb-core kmod-usb2 kmod-usb-ledtrig-usbport kmod-ath10k ath10k-firmware-qca988x
index 748252ce480038de271d9274b1c1934682c767a1..f00933bd87cea68ed4148ddbcdd97231b933db8d 100644 (file)
@@ -16,6 +16,7 @@
 # CONFIG_ATH79_MACH_AP531B0 is not set
 # CONFIG_ATH79_MACH_AP90Q is not set
 # CONFIG_ATH79_MACH_AP96 is not set
+# CONFIG_ATH79_MACH_ARCHER_C25_V1 is not set
 # CONFIG_ATH79_MACH_ARCHER_C59_V1 is not set
 # CONFIG_ATH79_MACH_ARCHER_C60_V1 is not set
 # CONFIG_ATH79_MACH_ARCHER_C7 is not set
index 7ae42fe8b98a2d06186b6748954d82bcca9e391b..41eacbf160938859ad9e33e35124106f14715113 100644 (file)
@@ -16,6 +16,7 @@
 # CONFIG_ATH79_MACH_AP531B0 is not set
 # CONFIG_ATH79_MACH_AP90Q is not set
 # CONFIG_ATH79_MACH_AP96 is not set
+# CONFIG_ATH79_MACH_ARCHER_C25_V1 is not set
 # CONFIG_ATH79_MACH_ARCHER_C59_V1 is not set
 # CONFIG_ATH79_MACH_ARCHER_C60_V1 is not set
 # CONFIG_ATH79_MACH_ARCHER_C7 is not set