ar71xx: Add support for the Meraki MR12 & MR16
authorJohn Crispin <john@openwrt.org>
Sat, 23 May 2015 15:27:22 +0000 (15:27 +0000)
committerJohn Crispin <john@openwrt.org>
Sat, 23 May 2015 15:27:22 +0000 (15:27 +0000)
This patch is to add support for the Meraki MR12 and MR16 Access Points.
Currently everything is working, minus the 2nd NIC interface on the MR12
which is built into the SoC.

Signed-off-by: Chris R Blake <chrisrblake93 at gmail.com>
SVN-Revision: 45726

target/linux/ar71xx/base-files/etc/diag.sh
target/linux/ar71xx/base-files/etc/uci-defaults/01_leds
target/linux/ar71xx/base-files/etc/uci-defaults/03_network-switchX-migration
target/linux/ar71xx/base-files/lib/ar71xx.sh
target/linux/ar71xx/base-files/lib/upgrade/platform.sh
target/linux/ar71xx/config-3.18
target/linux/ar71xx/files/arch/mips/ath79/mach-mr12.c [new file with mode: 0644]
target/linux/ar71xx/files/arch/mips/ath79/mach-mr16.c [new file with mode: 0644]
target/linux/ar71xx/generic/profiles/meraki.mk [new file with mode: 0644]
target/linux/ar71xx/image/Makefile
target/linux/ar71xx/patches-3.18/738-MIPS-ath79-add-meraki-mr12-mr16-support.patch [new file with mode: 0644]

index b73ea4d24c26b6f468edd4c301f833bc1f8d9dfd..055325179be2faf913786dc1771fbd1d5e665c72 100644 (file)
@@ -112,6 +112,12 @@ get_status_led() {
        mc-mac1200r)
                status_led="mercury:green:system"
                ;;
+       mr12)
+               status_led="mr12:green:power"
+               ;;
+       mr16)
+               status_led="mr16:green:power"
+               ;;
        mr600)
                status_led="mr600:orange:power"
                ;;
index 16064ded86f82ffbe908e9d945c5fe2009ba6951..41eeeebe321be8e62cbe1ea96e8521325a3a74df 100644 (file)
@@ -178,6 +178,22 @@ mc-mac1200r)
        ucidef_set_led_wlan "wlan5g" "WLAN5G" "mercury:green:wlan5g" "phy0tpt"
        ;;
 
+mr12)
+       ucidef_set_led_netdev "wan" "WAN" "mr12:green:wan" "eth0"
+       ucidef_set_led_wlan "wlan1" "WLAN1" "mr12:green:wifi1" "phy0assoc"
+       ucidef_set_led_wlan "wlan2" "WLAN2" "mr12:green:wifi2" "phy0assoc"
+       ucidef_set_led_wlan "wlan3" "WLAN3" "mr12:green:wifi3" "phy0assoc"
+       ucidef_set_led_wlan "wlan4" "WLAN4" "mr12:green:wifi4" "phy0tpt"
+       ;;
+
+mr16)
+       ucidef_set_led_netdev "wan" "WAN" "mr16:green:wan" "eth0"
+       ucidef_set_led_wlan "wlan1" "WLAN1" "mr16:green:wifi1" "phy0assoc"
+       ucidef_set_led_wlan "wlan2" "WLAN2" "mr16:green:wifi2" "phy0assoc"
+       ucidef_set_led_wlan "wlan3" "WLAN3" "mr16:green:wifi3" "phy0assoc"
+       ucidef_set_led_wlan "wlan4" "WLAN4" "mr16:green:wifi4" "phy0tpt"
+       ;;
+
 mr600)
        ucidef_set_led_wlan "wlan58" "WLAN58" "mr600:green:wlan58" "phy0tpt"
        ;;
index d9aa51989a7af4d41dcb32fcec3a635146d89836..aa0e1b4e2f2eab85adcdebcd3daf2fac6c781693 100644 (file)
@@ -61,6 +61,8 @@ dir-615-c1|\
 dir-615-e1|\
 dir-615-e4|\
 ja76pf|\
+mr-12|\
+mr-16|\
 rb-750|\
 rb-751|\
 tew-632brp|\
index 645c5d9a506becf263c72a00770595cc471ec6e2..d5dd561e3b95153aec6ddddac8eb1c863e9c5c0c 100755 (executable)
@@ -471,6 +471,12 @@ ar71xx_board_detect() {
        *"MAC1200R")
                name="mc-mac1200r"
                ;;
+       *MR12)
+               name="mr12"
+               ;;
+       *MR16)
+               name="mr16"
+               ;;
        *MR600v2)
                name="mr600v2"
                ;;
index 7ab3f5f2a10f0b67c40536322e1e4acde4114ff3..3dbd91cfc7e9fec69d8973542754faa0ce12bea9 100755 (executable)
@@ -184,6 +184,8 @@ platform_check_image() {
        db120 | \
        f9k1115v2 |\
        hornet-ub | \
+       mr12 | \
+       mr16 | \
        wpj558 | \
        zcn-1523h-2 | \
        zcn-1523h-5)
index 36b8bb6be98899a5ea82737796bb383e244371b3..543b77e9fb758100390f8cb51daf0101e139f3a5 100644 (file)
@@ -68,6 +68,8 @@ CONFIG_ATH79_MACH_HORNET_UB=y
 CONFIG_ATH79_MACH_JA76PF=y
 CONFIG_ATH79_MACH_JWAP003=y
 CONFIG_ATH79_MACH_MC_MAC1200R=y
+CONFIG_ATH79_MACH_MR16=y
+CONFIG_ATH79_MACH_MR12=y
 CONFIG_ATH79_MACH_MR600=y
 CONFIG_ATH79_MACH_MR900=y
 CONFIG_ATH79_MACH_MYNET_N600=y
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-mr12.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-mr12.c
new file mode 100644 (file)
index 0000000..12c9a1c
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ *  Cisco Meraki MR12 board support
+ *
+ *  Copyright (C) 2014-2015 Chris Blake <chrisrblake93@gmail.com>
+ *
+ *  Based on Atheros AP96 board support configuration
+ *
+ *  Copyright (C) 2009 Marco Porsch
+ *  Copyright (C) 2009-2012 Gabor Juhos <juhosg@openwrt.org>
+ *  Copyright (C) 2010 Atheros Communications
+ *
+ *  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/delay.h>
+
+#include <asm/mach-ath79/ath79.h>
+
+#include "dev-ap9x-pci.h"
+#include "dev-eth.h"
+#include "dev-gpio-buttons.h"
+#include "dev-leds-gpio.h"
+#include "dev-m25p80.h"
+#include "machtypes.h"
+
+#define MR12_GPIO_LED_W4_GREEN         14
+#define MR12_GPIO_LED_W3_GREEN         13
+#define MR12_GPIO_LED_W2_GREEN         12
+#define MR12_GPIO_LED_W1_GREEN         11
+
+#define MR12_GPIO_LED_WAN              15
+
+#define MR12_GPIO_LED_POWER_ORANGE             16
+#define MR12_GPIO_LED_POWER_GREEN              17
+
+#define MR12_GPIO_BTN_RESET            8
+#define MR12_KEYS_POLL_INTERVAL                20      /* msecs */
+#define MR12_KEYS_DEBOUNCE_INTERVAL    (3 * MR12_KEYS_POLL_INTERVAL)
+
+#define MR12_WAN_PHYMASK    BIT(4)
+
+#define MR12_WMAC0_MAC_OFFSET           0x120c
+#define MR12_CALDATA0_OFFSET            0x1000
+
+static struct gpio_led MR12_leds_gpio[] __initdata = {
+       {
+               .name           = "mr12:green:wan",
+               .gpio           = MR12_GPIO_LED_WAN,
+               .active_low     = 1,
+       }, {
+               .name           = "mr12:orange:power",
+               .gpio           = MR12_GPIO_LED_POWER_ORANGE,
+               .active_low     = 1,
+       }, {
+               .name           = "mr12:green:power",
+               .gpio           = MR12_GPIO_LED_POWER_GREEN,
+               .active_low     = 1,
+       }, {
+               .name           = "mr12:green:wifi4",
+               .gpio           = MR12_GPIO_LED_W4_GREEN,
+               .active_low     = 1,
+       }, {
+               .name           = "mr12:green:wifi3",
+               .gpio           = MR12_GPIO_LED_W3_GREEN,
+               .active_low     = 1,
+       }, {
+               .name           = "mr12:green:wifi2",
+               .gpio           = MR12_GPIO_LED_W2_GREEN,
+               .active_low     = 1,
+       }, {
+               .name           = "mr12:green:wifi1",
+               .gpio           = MR12_GPIO_LED_W1_GREEN,
+               .active_low     = 1,
+       }
+};
+
+static struct gpio_keys_button MR12_gpio_keys[] __initdata = {
+       {
+               .desc           = "reset",
+               .type           = EV_KEY,
+               .code           = KEY_RESTART,
+               .debounce_interval = MR12_KEYS_DEBOUNCE_INTERVAL,
+               .gpio           = MR12_GPIO_BTN_RESET,
+               .active_low     = 1,
+       }
+};
+
+static void __init MR12_setup(void)
+{
+       u8 *mac = (u8 *) KSEG1ADDR(0xbfff0000);
+       
+       ath79_register_mdio(0,0x0);
+
+       ath79_init_mac(ath79_eth0_data.mac_addr, mac, 0);
+       ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII;
+       ath79_eth0_data.phy_mask = MR12_WAN_PHYMASK;
+       ath79_register_eth(0);
+
+       ath79_register_m25p80(NULL);
+
+       ath79_register_leds_gpio(-1, ARRAY_SIZE(MR12_leds_gpio),
+                                       MR12_leds_gpio);
+       ath79_register_gpio_keys_polled(-1, MR12_KEYS_POLL_INTERVAL,
+                                       ARRAY_SIZE(MR12_gpio_keys),
+                                       MR12_gpio_keys);
+
+       ap91_pci_init(mac + MR12_CALDATA0_OFFSET,
+                               mac + MR12_WMAC0_MAC_OFFSET);
+
+}
+
+MIPS_MACHINE(ATH79_MACH_MR12, "MR12", "Meraki MR12", MR12_setup);
\ No newline at end of file
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-mr16.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-mr16.c
new file mode 100644 (file)
index 0000000..9f08e3d
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ *  Cisco Meraki MR16 board support
+ *
+ *  Copyright (C) 2015 Chris Blake <chrisrblake93@gmail.com>
+ *
+ *  Based on Atheros AP96 board support configuration
+ *
+ *  Copyright (C) 2009 Marco Porsch
+ *  Copyright (C) 2009-2012 Gabor Juhos <juhosg@openwrt.org>
+ *  Copyright (C) 2010 Atheros Communications
+ *
+ *  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/delay.h>
+
+#include <asm/mach-ath79/ath79.h>
+
+#include "dev-ap9x-pci.h"
+#include "dev-eth.h"
+#include "dev-gpio-buttons.h"
+#include "dev-leds-gpio.h"
+#include "dev-m25p80.h"
+#include "machtypes.h"
+
+#define MR16_GPIO_LED_W4_GREEN         3
+#define MR16_GPIO_LED_W3_GREEN         2
+#define MR16_GPIO_LED_W2_GREEN         1
+#define MR16_GPIO_LED_W1_GREEN         0
+
+#define MR16_GPIO_LED_WAN              4
+
+#define MR16_GPIO_LED_POWER_ORANGE             5
+#define MR16_GPIO_LED_POWER_GREEN              6
+
+#define MR16_GPIO_BTN_RESET            7
+#define MR16_KEYS_POLL_INTERVAL                20      /* msecs */
+#define MR16_KEYS_DEBOUNCE_INTERVAL    (3 * MR16_KEYS_POLL_INTERVAL)
+
+#define MR16_WAN_PHYMASK    BIT(0)
+
+#define MR16_WMAC0_MAC_OFFSET          0x120c
+#define MR16_WMAC1_MAC_OFFSET          0x520c
+#define MR16_CALDATA0_OFFSET           0x1000
+#define MR16_CALDATA1_OFFSET           0x5000
+
+static struct gpio_led MR16_leds_gpio[] __initdata = {
+       {
+               .name           = "mr16:green:wan",
+               .gpio           = MR16_GPIO_LED_WAN,
+               .active_low     = 1,
+       }, {
+               .name           = "mr16:orange:power",
+               .gpio           = MR16_GPIO_LED_POWER_ORANGE,
+               .active_low     = 1,
+       }, {
+               .name           = "mr16:green:power",
+               .gpio           = MR16_GPIO_LED_POWER_GREEN,
+               .active_low     = 1,
+       }, {
+               .name           = "mr16:green:wifi4",
+               .gpio           = MR16_GPIO_LED_W4_GREEN,
+               .active_low     = 1,
+       }, {
+               .name           = "mr16:green:wifi3",
+               .gpio           = MR16_GPIO_LED_W3_GREEN,
+               .active_low     = 1,
+       }, {
+               .name           = "mr16:green:wifi2",
+               .gpio           = MR16_GPIO_LED_W2_GREEN,
+               .active_low     = 1,
+       }, {
+               .name           = "mr16:green:wifi1",
+               .gpio           = MR16_GPIO_LED_W1_GREEN,
+               .active_low     = 1,
+       }
+};
+
+static struct gpio_keys_button MR16_gpio_keys[] __initdata = {
+       {
+               .desc           = "reset",
+               .type           = EV_KEY,
+               .code           = KEY_RESTART,
+               .debounce_interval = MR16_KEYS_DEBOUNCE_INTERVAL,
+               .gpio           = MR16_GPIO_BTN_RESET,
+               .active_low     = 1,
+       }
+};
+
+static void __init MR16_setup(void)
+{
+       u8 *mac = (u8 *) KSEG1ADDR(0xbfff0000);
+       
+       ath79_register_mdio(0,0x0);
+
+       ath79_init_mac(ath79_eth0_data.mac_addr, mac, 0);
+       ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII;
+       ath79_eth0_data.phy_mask = MR16_WAN_PHYMASK;
+       ath79_register_eth(0);
+
+       ath79_register_m25p80(NULL);
+
+       ath79_register_leds_gpio(-1, ARRAY_SIZE(MR16_leds_gpio),
+                                       MR16_leds_gpio);
+       ath79_register_gpio_keys_polled(-1, MR16_KEYS_POLL_INTERVAL,
+                                       ARRAY_SIZE(MR16_gpio_keys),
+                                       MR16_gpio_keys);
+
+       ap94_pci_init(mac + MR16_CALDATA0_OFFSET,
+                   mac + MR16_WMAC0_MAC_OFFSET,
+                   mac + MR16_CALDATA1_OFFSET,
+                   mac + MR16_WMAC1_MAC_OFFSET);
+}
+
+MIPS_MACHINE(ATH79_MACH_MR16, "MR16", "Meraki MR16", MR16_setup);
\ No newline at end of file
diff --git a/target/linux/ar71xx/generic/profiles/meraki.mk b/target/linux/ar71xx/generic/profiles/meraki.mk
new file mode 100644 (file)
index 0000000..0d5cda0
--- /dev/null
@@ -0,0 +1,27 @@
+#
+# Copyright (C) 2014-2015 Chris Blake (chrisrblake93@gmail.com)
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+define Profile/MR12
+       NAME:=Meraki MR12
+       PACKAGES:=kmod-spi-gpio kmod-ath9k
+endef
+
+define Profile/MR12/description
+       Package set optimized for the Cisco Meraki MR12 Access Point.
+endef
+
+define Profile/MR16
+       NAME:=Meraki MR16
+       PACKAGES:=kmod-spi-gpio kmod-ath9k
+endef
+
+define Profile/MR16/description
+       Package set optimized for the Cisco Meraki MR16 Access Point.
+endef
+
+$(eval $(call Profile,MR12))
+$(eval $(call Profile,MR16))
\ No newline at end of file
index 71d6c915dc78c4a7771f22c60c530f990f6480cd..38d01c85a9b69bb7530287ceb089695d43f17cb3 100644 (file)
@@ -899,6 +899,8 @@ dlrtdev_mtdlayout=mtdparts=spi0.0:256k(uboot)ro,64k(config)ro,6208k(firmware),64
 dlrtdev_mtdlayout_fat=mtdparts=spi0.0:256k(uboot)ro,64k(config)ro,7168k(firmware),640k(certs),64k(caldata)ro,64k@0x660000(caldata_orig),6208k@0x50000(firmware_orig)
 dragino2_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,16000k(firmware),64k(config)ro,64k(art)ro
 hiwifi_hc6361_mtdlayout=mtdparts=spi0.0:64k(u-boot)ro,64k(bdinfo)ro,1280k(kernel),14848k(rootfs),64k(backup)ro,64k(art)ro,16128k@0x20000(firmware)
+mr12_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,256k(u-boot-env)ro,13440k(rootfs),2304k(kernel),128k(art)ro,15744k@0x80000(firmware)
+mr16_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,256k(u-boot-env)ro,13440k(rootfs),2304k(kernel),128k(art)ro,15744k@0x80000(firmware)
 pb92_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,2752k(rootfs),896k(kernel),64k(nvram),64k(art)ro,3648k@0x50000(firmware)
 planex_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,7744k(firmware),128k(art)ro
 ubntxm_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,7552k(firmware),256k(cfg)ro,64k(EEPROM)ro
@@ -1776,6 +1778,8 @@ $(eval $(call SingleProfile,AthLzma,64k,EWDORINAP,ew-dorin,EW-DORIN,ttyATH0,1152
 $(eval $(call SingleProfile,AthLzma,64k,EWDORINRT,ew-dorin-router,EW-DORIN-ROUTER,ttyATH0,115200,$$(ew-dorin_mtdlayout_4M),KRuImage,65536))
 $(eval $(call SingleProfile,AthLzma,64k,EWDORIN16M,ew-dorin-16M,EW-DORIN,ttyATH0,115200,$$(ew-dorin_mtdlayout_16M),KRuImage,65536))
 $(eval $(call SingleProfile,AthLzma,64k,HORNETUBx2,hornet-ub-x2,HORNET-UB,ttyATH0,115200,$$(alfa_mtdlayout_16M),KRuImage,65536))
+$(eval $(call SingleProfile,AthLzma,64k,MR12,mr12,MR12,ttyS0,115200,$$(mr12_mtdlayout),RKuImage))
+$(eval $(call SingleProfile,AthLzma,64k,MR16,mr16,MR16,ttyS0,115200,$$(mr16_mtdlayout),RKuImage))
 $(eval $(call SingleProfile,AthLzma,64k,PB92,pb92,PB92,ttyS0,115200,$$(pb92_mtdlayout),KRuImage))
 $(eval $(call SingleProfile,AthLzma,64k,TUBE2H16M,tube2h-16M,TUBE2H,ttyATH0,115200,$$(alfa_mtdlayout_16M),KRuImage,65536))
 $(eval $(call SingleProfile,AthLzma,64k,WLR8100,wlr8100,WLR8100,ttyS0,115200,$$(wlr8100_mtdlayout),KRuImage))
diff --git a/target/linux/ar71xx/patches-3.18/738-MIPS-ath79-add-meraki-mr12-mr16-support.patch b/target/linux/ar71xx/patches-3.18/738-MIPS-ath79-add-meraki-mr12-mr16-support.patch
new file mode 100644 (file)
index 0000000..a117774
--- /dev/null
@@ -0,0 +1,51 @@
+--- a/arch/mips/ath79/Kconfig
++++ b/arch/mips/ath79/Kconfig
+@@ -687,6 +687,26 @@ config ATH79_MACH_OM5P
+       select ATH79_DEV_M25P80
+       select ATH79_DEV_WMAC
++config ATH79_MACH_MR12
++      bool "Meraki MR12 board support"
++      select SOC_AR724X
++      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_MR16
++      bool "Meraki MR16 board support"
++      select SOC_AR71XX
++      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_MR600
+       bool "OpenMesh MR600 board support"
+       select SOC_AR934X
+--- a/arch/mips/ath79/Makefile
++++ b/arch/mips/ath79/Makefile
+@@ -78,6 +78,8 @@ obj-$(CONFIG_ATH79_MACH_JA76PF)      +
+ obj-$(CONFIG_ATH79_MACH_JWAP003)      += mach-jwap003.o
+ obj-$(CONFIG_ATH79_MACH_HORNET_UB)    += mach-hornet-ub.o
+ obj-$(CONFIG_ATH79_MACH_MC_MAC1200R)     += mach-mc-mac1200r.o
++obj-$(CONFIG_ATH79_MACH_MR12)         += mach-mr12.o
++obj-$(CONFIG_ATH79_MACH_MR16)         += mach-mr16.o
+ obj-$(CONFIG_ATH79_MACH_MR600)                += mach-mr600.o
+ obj-$(CONFIG_ATH79_MACH_MR900)                += mach-mr900.o
+ obj-$(CONFIG_ATH79_MACH_MYNET_N600)   += mach-mynet-n600.o
+--- a/arch/mips/ath79/machtypes.h
++++ b/arch/mips/ath79/machtypes.h
+@@ -67,6 +67,8 @@ enum ath79_mach_type {
+       ATH79_MACH_JA76PF2,             /* jjPlus JA76PF2 */
+       ATH79_MACH_JWAP003,             /* jjPlus JWAP003 */
+       ATH79_MACH_HORNET_UB,           /* ALFA Networks Hornet-UB */
++      ATH79_MACH_MR12,                /* Cisco Meraki MR12 */
++      ATH79_MACH_MR16,                /* Cisco Meraki MR16 */
+       ATH79_MACH_MR600V2,             /* OpenMesh MR600v2 */
+       ATH79_MACH_MR600,               /* OpenMesh MR600 */
+       ATH79_MACH_MR900,               /* OpenMesh MR900 */