From 4b0eebe9dfa49f995474322f2c6998026534a5f8 Mon Sep 17 00:00:00 2001 From: Piotr Dymacz Date: Fri, 5 Jan 2018 11:35:45 +0100 Subject: [PATCH] ar71xx: add support for ALFA Network N5Q 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 --- .../ar71xx/base-files/etc/board.d/01_leds | 10 +- target/linux/ar71xx/base-files/etc/diag.sh | 3 +- target/linux/ar71xx/base-files/lib/ar71xx.sh | 3 + .../ar71xx/base-files/lib/upgrade/platform.sh | 1 + target/linux/ar71xx/config-4.4 | 1 + target/linux/ar71xx/config-4.9 | 1 + .../files/arch/mips/ath79/Kconfig.openwrt | 8 ++ .../ar71xx/files/arch/mips/ath79/Makefile | 1 + .../ar71xx/files/arch/mips/ath79/mach-n5q.c | 132 ++++++++++++++++++ .../ar71xx/files/arch/mips/ath79/machtypes.h | 1 + target/linux/ar71xx/generic/config-default | 1 + target/linux/ar71xx/image/generic.mk | 12 ++ 12 files changed, 172 insertions(+), 2 deletions(-) create mode 100644 target/linux/ar71xx/files/arch/mips/ath79/mach-n5q.c 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 97bf33052c..f2d66b2986 100755 --- a/target/linux/ar71xx/base-files/etc/board.d/01_leds +++ b/target/linux/ar71xx/base-files/etc/board.d/01_leds @@ -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" diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh index 2f2d2c3103..63a9ebc1ec 100644 --- a/target/linux/ar71xx/base-files/etc/diag.sh +++ b/target/linux/ar71xx/base-files/etc/diag.sh @@ -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) diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh index e90d89e20e..1de9d02965 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -768,6 +768,9 @@ ar71xx_board_detect() { *"MZK-W300NH") name="mzk-w300nh" ;; + *"N5Q") + name="n5q" + ;; *"Nanostation M") name="nanostation-m" ubnt_xm_board_detect diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh index 37c637b6f5..3bfedf82da 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -252,6 +252,7 @@ platform_check_image() { loco-m-xw|\ mzk-w04nu|\ mzk-w300nh|\ + n5q|\ nanostation-m|\ nanostation-m-xw|\ nbg460n_550n_550nh|\ diff --git a/target/linux/ar71xx/config-4.4 b/target/linux/ar71xx/config-4.4 index 44af80d0f3..c5bcc4061a 100644 --- a/target/linux/ar71xx/config-4.4 +++ b/target/linux/ar71xx/config-4.4 @@ -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 diff --git a/target/linux/ar71xx/config-4.9 b/target/linux/ar71xx/config-4.9 index 401c41e493..8815edf343 100644 --- a/target/linux/ar71xx/config-4.9 +++ b/target/linux/ar71xx/config-4.9 @@ -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 diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt index f2717e86e9..43096463c2 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt +++ b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt @@ -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 diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Makefile b/target/linux/ar71xx/files/arch/mips/ath79/Makefile index 0e581005d7..53edaac712 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/Makefile +++ b/target/linux/ar71xx/files/arch/mips/ath79/Makefile @@ -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 index 0000000000..895fc32933 --- /dev/null +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-n5q.c @@ -0,0 +1,132 @@ +/* + * ALFA Network N5Q board support + * + * Copyright (C) 2018 Piotr Dymacz + * + * 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 +#include + +#include +#include + +#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); diff --git a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h index c2cb8b6126..06fa4768c1 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h +++ b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h @@ -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 */ diff --git a/target/linux/ar71xx/generic/config-default b/target/linux/ar71xx/generic/config-default index e9bf6f3267..5d236b2e69 100644 --- a/target/linux/ar71xx/generic/config-default +++ b/target/linux/ar71xx/generic/config-default @@ -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 diff --git a/target/linux/ar71xx/image/generic.mk b/target/linux/ar71xx/image/generic.mk index d6515ac529..f1efebc523 100644 --- a/target/linux/ar71xx/image/generic.mk +++ b/target/linux/ar71xx/image/generic.mk @@ -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