ar71xx: add support for ALFA Network N5Q
authorPiotr Dymacz <pepe2k@gmail.com>
Fri, 5 Jan 2018 10:35:45 +0000 (11:35 +0100)
committerPiotr Dymacz <pepe2k@gmail.com>
Sun, 14 Jan 2018 20:30:16 +0000 (21:30 +0100)
ALFA Network N5Q is a successor of previous model, the N5 (outdoor
CPE/AP, based on Atheros AR7240 + AR9280). New version is based on
Atheros AR9344.

Specification:

- 550/400/200 MHz (CPU/DDR/AHB)
- 64 MB of RAM (DDR2)
- 16 MB of FLASH (SPI NOR)
- 2x 10/100 Mbps Ethernet, with passive PoE support (24 V)
- 2T2R 5 GHz (AR9344), with ext. PA (RFPA5542) and LNA, up to 27 dBm
- 8x LED (7 are driven by GPIO)
- 1x button (reset)
- external h/w watchdog (EM6324QYSP5B, disabled and not used)
- header for optional 802.3at/af PoE module
- DC jack for main power input (optional, not installed by default)
- UART header on PCB

Flash instruction:

You can use sysupgrade image directly in vendor firmare which is based
on OpenWrt/LEDE. Alternatively, you can use web recovery mode in U-Boot:

1. Configure PC with static IP 192.168.1.2/24.
2. Connect PC with one of RJ45 ports, press the reset button, power up
   device, wait for first blink of all LEDs (indicates network setup),
   then keep button for 3 following blinks and release it.
3. Open 192.168.1.1 address in your browser and upload sysupgrade image.

Signed-off-by: Piotr Dymacz <pepe2k@gmail.com>
12 files changed:
target/linux/ar71xx/base-files/etc/board.d/01_leds
target/linux/ar71xx/base-files/etc/diag.sh
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/config-4.9
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-n5q.c [new file with mode: 0644]
target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
target/linux/ar71xx/generic/config-default
target/linux/ar71xx/image/generic.mk

index 97bf330..f2d66b2 100755 (executable)
@@ -129,13 +129,21 @@ dr531)
                ;;
        esac
        ;;
-ap91-5g)
+ap91-5g|\
+n5q)
        ucidef_set_led_netdev "lan" "LAN" "$board:green:lan" "eth0"
        ucidef_set_rssimon "wlan0" "200000" "1"
        ucidef_set_led_rssi "signal1" "SIGNAL1" "$board:red:signal1" "wlan0" "1" "100"
        ucidef_set_led_rssi "signal2" "SIGNAL2" "$board:orange:signal2" "wlan0" "25" "100"
        ucidef_set_led_rssi "signal3" "SIGNAL3" "$board:green:signal3" "wlan0" "50" "100"
        ucidef_set_led_rssi "signal4" "SIGNAL4" "$board:green:signal4" "wlan0" "75" "100"
+
+       case "$board" in
+       n5q)
+               ucidef_set_led_netdev "wan" "WAN" "$board:green:wan" "eth1"
+               ucidef_set_led_wlan "wlan" "WLAN" "$board:green:wlan" "phy0tpt"
+               ;;
+       esac
        ;;
 bhr-4grv2)
        ucidef_set_led_default "power" "POWER" "buffalo:green:power" "1"
index 2f2d2c3..63a9ebc 100644 (file)
@@ -80,7 +80,8 @@ get_status_led() {
        gl-mifi)
                status_led="$board:green:lan"
                ;;
-       ap91-5g)
+       ap91-5g|\
+       n5q)
                status_led="$board:green:signal4"
                ;;
        ap96)
index e90d89e..1de9d02 100755 (executable)
@@ -768,6 +768,9 @@ ar71xx_board_detect() {
        *"MZK-W300NH")
                name="mzk-w300nh"
                ;;
+       *"N5Q")
+               name="n5q"
+               ;;
        *"Nanostation M")
                name="nanostation-m"
                ubnt_xm_board_detect
index 37c637b..3bfedf8 100755 (executable)
@@ -252,6 +252,7 @@ platform_check_image() {
        loco-m-xw|\
        mzk-w04nu|\
        mzk-w300nh|\
+       n5q|\
        nanostation-m|\
        nanostation-m-xw|\
        nbg460n_550n_550nh|\
index 44af80d..c5bcc40 100644 (file)
@@ -139,6 +139,7 @@ CONFIG_ATH79=y
 # CONFIG_ATH79_MACH_MYNET_REXT is not set
 # CONFIG_ATH79_MACH_MZK_W04NU is not set
 # CONFIG_ATH79_MACH_MZK_W300NH is not set
+# CONFIG_ATH79_MACH_N5Q is not set
 # CONFIG_ATH79_MACH_NBG460N is not set
 # CONFIG_ATH79_MACH_NBG6716 is not set
 # CONFIG_ATH79_MACH_OM2P is not set
index 401c41e..8815edf 100644 (file)
@@ -137,6 +137,7 @@ CONFIG_ATH79=y
 # CONFIG_ATH79_MACH_MYNET_REXT is not set
 # CONFIG_ATH79_MACH_MZK_W04NU is not set
 # CONFIG_ATH79_MACH_MZK_W300NH is not set
+# CONFIG_ATH79_MACH_N5Q is not set
 # CONFIG_ATH79_MACH_NBG460N is not set
 # CONFIG_ATH79_MACH_NBG6716 is not set
 # CONFIG_ATH79_MACH_OM2P is not set
index f2717e8..4309646 100644 (file)
@@ -2008,6 +2008,14 @@ config ATH79_MACH_ZCN_1523H
        select ATH79_DEV_LEDS_GPIO
        select ATH79_DEV_M25P80
 
+config ATH79_MACH_N5Q
+       bool "ALFA Network N5Q support"
+       select SOC_AR934X
+       select ATH79_DEV_ETH
+       select ATH79_DEV_GPIO_BUTTONS
+       select ATH79_DEV_LEDS_GPIO
+       select ATH79_DEV_WMAC
+
 config ATH79_MACH_NBG460N
        bool "Zyxel NBG460N/550N/550NH board support"
        select SOC_AR913X
index 0e58100..53edaac 100644 (file)
@@ -147,6 +147,7 @@ obj-$(CONFIG_ATH79_MACH_MYNET_N750)         += mach-mynet-n750.o
 obj-$(CONFIG_ATH79_MACH_MYNET_REXT)            += mach-mynet-rext.o
 obj-$(CONFIG_ATH79_MACH_MZK_W04NU)             += mach-mzk-w04nu.o
 obj-$(CONFIG_ATH79_MACH_MZK_W300NH)            += mach-mzk-w300nh.o
+obj-$(CONFIG_ATH79_MACH_N5Q)                   += mach-n5q.o
 obj-$(CONFIG_ATH79_MACH_NBG460N)               += mach-nbg460n.o
 obj-$(CONFIG_ATH79_MACH_NBG6716)               += mach-nbg6716.o
 obj-$(CONFIG_ATH79_MACH_RAMBUTAN)              += mach-rambutan.o
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-n5q.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-n5q.c
new file mode 100644 (file)
index 0000000..895fc32
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ * ALFA Network N5Q board support
+ *
+ * Copyright (C) 2018 Piotr Dymacz <pepe2k@gmail.com>
+ *
+ * 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 N5Q_GPIO_LED_LAN       19
+#define N5Q_GPIO_LED_SIGNAL1   0
+#define N5Q_GPIO_LED_SIGNAL2   1
+#define N5Q_GPIO_LED_SIGNAL3   2
+#define N5Q_GPIO_LED_SIGNAL4   3
+#define N5Q_GPIO_LED_WAN       18
+#define N5Q_GPIO_LED_WLAN      12
+
+#define N5Q_GPIO_WDT_EN                16
+#define N5Q_GPIO_WDT_IN                17
+
+#define N5Q_GPIO_BTN_RESET     11
+
+#define N5Q_MAC0_OFFSET                0
+#define N5Q_MAC1_OFFSET                6
+#define N5Q_WMAC_CALDATA_OFFSET        0x1000
+
+#define N5Q_KEYS_POLL_INTERVAL         20
+#define N5Q_KEYS_DEBOUNCE_INTERVAL     (3 * N5Q_KEYS_POLL_INTERVAL)
+
+static struct gpio_led n5q_leds_gpio[] __initdata = {
+       {
+               .name           = "n5q:green:lan",
+               .gpio           = N5Q_GPIO_LED_LAN,
+               .active_low     = 1,
+       }, {
+               .name           = "n5q:red:signal1",
+               .gpio           = N5Q_GPIO_LED_SIGNAL1,
+               .active_low     = 1,
+       }, {
+               .name           = "n5q:orange:signal2",
+               .gpio           = N5Q_GPIO_LED_SIGNAL2,
+               .active_low     = 1,
+       }, {
+               .name           = "n5q:green:signal3",
+               .gpio           = N5Q_GPIO_LED_SIGNAL3,
+               .active_low     = 1,
+       }, {
+               .name           = "n5q:green:signal4",
+               .gpio           = N5Q_GPIO_LED_SIGNAL4,
+               .active_low     = 1,
+       }, {
+               .name           = "n5q:green:wan",
+               .gpio           = N5Q_GPIO_LED_WAN,
+               .active_low     = 1,
+       }, {
+               .name           = "n5q:green:wlan",
+               .gpio           = N5Q_GPIO_LED_WLAN,
+               .active_low     = 1,
+       },
+};
+
+static struct gpio_keys_button n5q_gpio_keys[] __initdata = {
+       {
+               .desc                   = "reset",
+               .type                   = EV_KEY,
+               .code                   = KEY_RESTART,
+               .debounce_interval      = N5Q_KEYS_DEBOUNCE_INTERVAL,
+               .gpio                   = N5Q_GPIO_BTN_RESET,
+               .active_low             = 1,
+       },
+};
+
+static void __init n5q_setup(void)
+{
+       u8 *art = (u8 *) KSEG1ADDR(0x1f070000);
+
+       ath79_register_m25p80(NULL);
+
+       ath79_register_mdio(1, 0x0);
+
+       ath79_switch_data.phy4_mii_en = 1;
+       ath79_switch_data.phy_poll_mask = 0xf7;
+
+       /* LAN */
+       ath79_eth1_data.duplex = DUPLEX_FULL;
+       ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII;
+       ath79_init_mac(ath79_eth1_data.mac_addr, art + N5Q_MAC1_OFFSET, 0);
+       ath79_register_eth(1);
+
+       /* WAN */
+       ath79_eth0_data.duplex = DUPLEX_FULL;
+       ath79_eth0_data.mii_bus_dev = &ath79_mdio1_device.dev;
+       ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
+       ath79_eth0_data.phy_mask = BIT(4);
+       ath79_eth0_data.speed = SPEED_100;
+       ath79_init_mac(ath79_eth0_data.mac_addr, art + N5Q_MAC0_OFFSET, 0);
+       ath79_register_eth(0);
+
+       ath79_register_leds_gpio(-1, ARRAY_SIZE(n5q_leds_gpio),
+                                n5q_leds_gpio);
+
+       ath79_register_gpio_keys_polled(-1, N5Q_KEYS_POLL_INTERVAL,
+                                       ARRAY_SIZE(n5q_gpio_keys),
+                                       n5q_gpio_keys);
+
+       gpio_request_one(N5Q_GPIO_WDT_IN,
+                        GPIOF_OUT_INIT_LOW | GPIOF_EXPORT_DIR_FIXED,
+                        "WDT input");
+
+       gpio_request_one(N5Q_GPIO_WDT_EN,
+                        GPIOF_OUT_INIT_LOW | GPIOF_EXPORT_DIR_FIXED,
+                        "WDT enable");
+
+       ath79_register_wmac(art + N5Q_WMAC_CALDATA_OFFSET, NULL);
+}
+
+MIPS_MACHINE(ATH79_MACH_N5Q, "N5Q", "ALFA Network N5Q", n5q_setup);
index c2cb8b6..06fa476 100644 (file)
@@ -143,6 +143,7 @@ enum ath79_mach_type {
        ATH79_MACH_MYNET_REXT,                  /* WD My Net Wi-Fi Range Extender */
        ATH79_MACH_MZK_W04NU,                   /* Planex MZK-W04NU */
        ATH79_MACH_MZK_W300NH,                  /* Planex MZK-W300NH */
+       ATH79_MACH_N5Q,                         /* ALFA Network N5Q */
        ATH79_MACH_NBG460N,                     /* Zyxel NBG460N/550N/550NH */
        ATH79_MACH_NBG6616,                     /* Zyxel NBG6616 */
        ATH79_MACH_NBG6716,                     /* Zyxel NBG6716 */
index e9bf6f3..5d236b2 100644 (file)
@@ -108,6 +108,7 @@ CONFIG_ATH79_MACH_MYNET_N750=y
 CONFIG_ATH79_MACH_MYNET_REXT=y
 CONFIG_ATH79_MACH_MZK_W04NU=y
 CONFIG_ATH79_MACH_MZK_W300NH=y
+CONFIG_ATH79_MACH_N5Q=y
 CONFIG_ATH79_MACH_OM2P=y
 CONFIG_ATH79_MACH_OM5P=y
 CONFIG_ATH79_MACH_OM5P_AC=y
index d6515ac..f1efebc 100644 (file)
@@ -757,6 +757,18 @@ define Device/oolite
 endef
 TARGET_DEVICES += oolite
 
+define Device/n5q
+  DEVICE_TITLE := ALFA Network N5Q
+  DEVICE_PACKAGES := rssileds -swconfig
+  BOARDNAME := N5Q
+  SUPPORTED_DEVICES := n5q
+  IMAGE_SIZE := 15872k
+  MTDPARTS := spi0.0:384k(u-boot)ro,64k(u-boot-env),64k(art)ro,-(firmware)
+  IMAGE/sysupgrade.bin := append-kernel | pad-to $$$$(BLOCKSIZE) | \
+       append-rootfs | pad-rootfs | append-metadata | check-size $$$$(IMAGE_SIZE)
+endef
+TARGET_DEVICES += n5q
+
 define Device/NBG6616
   DEVICE_TITLE := ZyXEL NBG6616
   DEVICE_PACKAGES := kmod-usb-core kmod-usb2 kmod-usb-ledtrig-usbport kmod-usb-storage kmod-rtc-pcf8563 kmod-ath10k ath10k-firmware-qca988x