ar71xx: add support for RB-941-2nD
authorThibaut VARENE <hacks@slashdirt.org>
Wed, 4 Jan 2017 21:44:54 +0000 (22:44 +0100)
committerFelix Fietkau <nbd@nbd.name>
Wed, 1 Feb 2017 13:59:11 +0000 (14:59 +0100)
Add full support for Mikrotik RB-941-2nD (hAP lite)

Original patch by Sergey Sergeev <adron@yapic.net> and
more information is available here:
https://wiki.openwrt.org/toh/mikrotik/rb941_2nd
I updated and adapted the patch to apply cleanly to LEDE trunk
and added proper numbering for the switch ports (matching case
labels).
Tested working on actual hardware with the information
provided in the above webpage. Sysupgrade works.

Signed-off-by: Thibaut VARENE <hacks@slashdirt.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
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/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-rb941.c [new file with mode: 0644]
target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
target/linux/ar71xx/image/mikrotik.mk

index 5a2bf0cfc41991d684c0ad0eaf6bb0ff6441cc08..84cfb1e616de59749fb2df5ccae74fa3efd5b00b 100755 (executable)
@@ -201,6 +201,9 @@ rb-750)
        ucidef_set_led_switch "port4" "port4" "rb750:green:port4" "switch0" "0x04"
        ucidef_set_led_switch "port5" "port5" "rb750:green:port5" "switch0" "0x02"
        ;;
+rb-941-2nd)
+       ucidef_set_led_timer "act" "act" "rb:green:act" "1000" "1000"
+       ;;
 rb-2011l|\
 rb-2011uas|\
 rb-2011uias|\
index 66274db15fd61ebda18d5965f424744835b1bd44..d46266aa43e04466023e02986ed83c1ee457e3c7 100755 (executable)
@@ -239,6 +239,10 @@ ar71xx_setup_interfaces()
        dap-2695-a1)
                ucidef_add_switch "switch0" "0@eth0" "2:lan" "3:wan" "6@eth1"
                ;;
+       rb-941-2nd)
+               ucidef_add_switch "switch0" \
+                       "0@eth0" "1:lan:4" "2:lan:3" "3:lan:2" "4:wan:1"
+       ;;
        db120|\
        rb-2011l|\
        rb-2011uas|\
index d060ccf6e27b12b7c42fb3ca6e1220c9da560520..75c6c9acbab8eaec7139b3a35065e70b0bef74db 100644 (file)
@@ -288,7 +288,7 @@ get_status_led() {
        rb-912uag-5hpnd)
                status_led="rb:green:user"
                ;;
-       rb-951ui-2hnd)
+       rb-951ui-2hnd | rb-941-2nd)
                status_led="rb:green:act"
                ;;
        rb-sxt2n|\
index 1b30f4d827bd00d19a0a81310297e4946212ab54..7f27f456357666451c10273d99e1732096802f8b 100755 (executable)
@@ -835,6 +835,9 @@ ar71xx_board_detect() {
        *"RouterBOARD 912UAG-5HPnD")
                name="rb-912uag-5hpnd"
                ;;
+       *"RouterBOARD 941-2nD")
+               name="rb-941-2nd"
+               ;;
        *"RouterBOARD 951G-2HnD")
                name="rb-951g-2hnd"
                ;;
index 82ed041d66226239095bb53c3ecc068e5140dd64..80da9131c787cc8c1e9a8b2e5b2ddc30feb7e772 100755 (executable)
@@ -12,6 +12,8 @@ RAMFS_COPY_DATA=/lib/ar71xx.sh
 CI_BLKSZ=65536
 CI_LDADR=0x80060000
 
+PLATFORM_DO_UPGRADE_COMBINED_SEPARATE_MTD=0
+
 platform_find_partitions() {
        local first dev size erasesize name
        while read dev size erasesize name; do
@@ -41,6 +43,13 @@ platform_find_kernelpart() {
        done
 }
 
+platform_find_rootfspart() {
+       local part
+       for part in "${1%:*}" "${1#*:}"; do
+               [ "$part" != "$2" ] && echo "$part"; break
+       done
+}
+
 platform_do_upgrade_combined() {
        local partitions=$(platform_find_partitions)
        local kernelpart=$(platform_find_kernelpart "${partitions#*:}")
@@ -54,13 +63,22 @@ platform_do_upgrade_combined() {
           [ ${root_blocks:-0} -gt 0 ] && \
           [ ${erase_size:-0} -gt 0 ];
        then
+               local rootfspart=$(platform_find_rootfspart "$partitions" "$kernelpart")
                local append=""
                [ -f "$CONF_TAR" -a "$SAVE_CONFIG" -eq 1 ] && append="-j $CONF_TAR"
 
-               ( dd if="$1" bs=$CI_BLKSZ skip=1 count=$kern_blocks 2>/dev/null; \
-                 dd if="$1" bs=$CI_BLKSZ skip=$((1+$kern_blocks)) count=$root_blocks 2>/dev/null ) | \
-                       mtd -r $append -F$kernelpart:$kern_length:$CI_LDADR,rootfs write - $partitions
+               if [ "$PLATFORM_DO_UPGRADE_COMBINED_SEPARATE_MTD" -ne 1 ]; then
+                   ( dd if="$1" bs=$CI_BLKSZ skip=1 count=$kern_blocks 2>/dev/null; \
+                     dd if="$1" bs=$CI_BLKSZ skip=$((1+$kern_blocks)) count=$root_blocks 2>/dev/null ) | \
+                           mtd -r $append -F$kernelpart:$kern_length:$CI_LDADR,rootfs write - $partitions
+               elif [ -n "$rootfspart" ]; then
+                   dd if="$1" bs=$CI_BLKSZ skip=1 count=$kern_blocks 2>/dev/null | \
+                           mtd write - $kernelpart
+                   dd if="$1" bs=$CI_BLKSZ skip=$((1+$kern_blocks)) count=$root_blocks 2>/dev/null | \
+                           mtd -r $append write - $rootfspart
+               fi
        fi
+       PLATFORM_DO_UPGRADE_COMBINED_SEPARATE_MTD=0
 }
 
 tplink_get_image_hwid() {
@@ -318,6 +336,7 @@ platform_check_image() {
        ls-sr71|\
        pb42|\
        pb44|\
+       rb-941-2nd|\
        routerstation-pro|\
        routerstation|\
        wp543|\
@@ -618,6 +637,10 @@ platform_do_upgrade() {
        local board=$(ar71xx_board_name)
 
        case "$board" in
+       rb-941-2nd)
+               PLATFORM_DO_UPGRADE_COMBINED_SEPARATE_MTD=1
+               platform_do_upgrade_combined "$ARGV"
+               ;;
        all0258n)
                platform_do_upgrade_allnet "0x9f050000" "$ARGV"
                ;;
index 4b2f736a86d34c42ab7ba689fc87b4456abbddf4..a79d53e55633fcc63416c84ef8979752e1e5d183 100644 (file)
@@ -143,6 +143,7 @@ CONFIG_ATH79_MACH_R6100=y
 # CONFIG_ATH79_MACH_RB750 is not set
 # CONFIG_ATH79_MACH_RB91X is not set
 # CONFIG_ATH79_MACH_RB922 is not set
+# CONFIG_ATH79_MACH_RB941 is not set
 # CONFIG_ATH79_MACH_RB95X is not set
 # CONFIG_ATH79_MACH_RBSXTLITE is not set
 CONFIG_ATH79_MACH_RE450=y
index 21d6b51897ecf0395ce87f3b15e8930c80dcabca..b38c30ae37a750b92c9bf7f8a5c61d1dc792ce29 100644 (file)
@@ -860,6 +860,16 @@ config ATH79_MACH_RB922
        select ATH79_ROUTERBOOT
        select RLE_DECOMPRESS
 
+config ATH79_MACH_RB941
+       bool "MikroTik RouterBOARD 941-2nd support"
+       select SOC_QCA953X
+       select ATH79_DEV_ETH
+       select ATH79_DEV_GPIO_BUTTONS
+       select ATH79_DEV_LEDS_GPIO
+       select ATH79_DEV_M25P80
+       select ATH79_DEV_WMAC
+       select ATH79_ROUTERBOOT
+
 config ATH79_MACH_RB95X
        bool "MikroTik RouterBOARD 95X support"
        select SOC_AR934X
index 6384c0604c87241417c843261fd32788abb3c8e5..03bbe218d7b496dcb4e473c174902fe003fc8b15 100644 (file)
@@ -147,6 +147,7 @@ obj-$(CONFIG_ATH79_MACH_RB4XX)                      += mach-rb4xx.o
 obj-$(CONFIG_ATH79_MACH_RB750)                 += mach-rb750.o
 obj-$(CONFIG_ATH79_MACH_RB91X)                 += mach-rb91x.o
 obj-$(CONFIG_ATH79_MACH_RB922)                 += mach-rb922.o
+obj-$(CONFIG_ATH79_MACH_RB941)                 += mach-rb941.o
 obj-$(CONFIG_ATH79_MACH_RB95X)                 += mach-rb95x.o
 obj-$(CONFIG_ATH79_MACH_RBSXTLITE)             += mach-rbsxtlite.o
 obj-$(CONFIG_ATH79_MACH_RE450)                 += mach-re450.o
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-rb941.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-rb941.c
new file mode 100644 (file)
index 0000000..5a8c7c0
--- /dev/null
@@ -0,0 +1,174 @@
+/*
+ *  MikroTik RouterBOARD 941-2nD support
+ *
+ *  Copyright (C) 2016 Sergey Sergeev <adron@yapic.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/export.h>
+#include <linux/pci.h>
+#include <linux/ath9k_platform.h>
+#include <linux/platform_device.h>
+#include <linux/phy.h>
+#include <linux/ar8216_platform.h>
+#include <linux/rle.h>
+#include <linux/routerboot.h>
+#include <linux/gpio.h>
+
+#include <linux/mtd/mtd.h>
+//#include <linux/mtd/nand.h>
+#include <linux/mtd/partitions.h>
+
+#include <asm/mach-ath79/ar71xx_regs.h>
+#include <asm/mach-ath79/ath79.h>
+#include <asm/mach-ath79/irq.h>
+
+#include "common.h"
+#include "dev-ap9x-pci.h"
+#include "dev-eth.h"
+#include "dev-spi.h"
+#include "dev-gpio-buttons.h"
+#include "dev-leds-gpio.h"
+#include "dev-m25p80.h"
+//#include "dev-usb.h"
+#include "dev-wmac.h"
+#include "machtypes.h"
+#include "routerboot.h"
+
+#define RB941_GPIO_LED_ACT      14
+#define RB941_GPIO_BTN_RESET    16
+
+#define RB941_KEYS_POLL_INTERVAL 20 /* msecs */
+#define RB941_KEYS_DEBOUNCE_INTERVAL (3 * RB941_KEYS_POLL_INTERVAL)
+
+#define RB_ROUTERBOOT_OFFSET    0x0000
+#define RB_ROUTERBOOT_SIZE      0xe000
+#define RB_HARD_CFG_OFFSET      0xe000
+#define RB_HARD_CFG_SIZE        0x1000
+#define RB_BIOS_OFFSET          0xf000
+#define RB_BIOS_SIZE            0x1000
+#define RB_ROUTERBOOT2_OFFSET   0x10000
+#define RB_ROUTERBOOT2_SIZE     0xf000
+#define RB_SOFT_CFG_OFFSET      0x1f000
+#define RB_SOFT_CFG_SIZE        0x1000
+#define RB_ROOTFS_OFFSET        0x20000
+#define RB_ROOTFS_SIZE          0x9e0000
+#define RB_KERNEL_OFFSET        0xa00000
+#define RB_KERNEL_SIZE          MTDPART_SIZ_FULL
+
+void __init rb941_wlan_init(void)
+{
+    char *art_buf;
+    u8 wlan_mac[ETH_ALEN];
+
+    art_buf = rb_get_wlan_data();
+    if (art_buf == NULL)
+            return;
+
+    ath79_init_mac(wlan_mac, ath79_mac_base, 11);
+    ath79_register_wmac(art_buf + 0x1000, wlan_mac);
+
+    kfree(art_buf);
+}
+
+static struct mtd_partition rb941_spi_partitions[] = {
+    {
+            .name = "routerboot",
+            .offset = RB_ROUTERBOOT_OFFSET,
+            .mask_flags = MTD_WRITEABLE,
+            .size = RB_ROUTERBOOT_SIZE,
+    }, {
+            .name = "hard_config",
+            .offset = RB_HARD_CFG_OFFSET,
+            .size = RB_HARD_CFG_SIZE,
+            .mask_flags = MTD_WRITEABLE,
+    }, {
+            .name = "bios",
+            .offset = RB_BIOS_OFFSET,
+            .size = RB_BIOS_SIZE,
+            .mask_flags = MTD_WRITEABLE,
+    }, {
+            .name = "routerboot2",
+            .offset = RB_ROUTERBOOT2_OFFSET,
+            .size = RB_ROUTERBOOT2_SIZE,
+            .mask_flags = MTD_WRITEABLE,
+    }, {
+            .name = "soft_config",
+            .offset = RB_SOFT_CFG_OFFSET,
+            .size = RB_SOFT_CFG_SIZE,
+            .mask_flags = MTD_WRITEABLE,
+    }, {
+            .name = "rootfs",
+            .offset = RB_ROOTFS_OFFSET,
+            .size = RB_ROOTFS_SIZE,
+    }, {
+            .name = "kernel",
+            .offset = RB_KERNEL_OFFSET,
+            .size = RB_KERNEL_SIZE,
+    }
+};
+
+static struct flash_platform_data rb941_spi_flash_data = {
+    .parts          = rb941_spi_partitions,
+    .nr_parts       = ARRAY_SIZE(rb941_spi_partitions),
+};
+
+static struct gpio_led rb941_leds[] __initdata = {
+    {
+        .name = "rb:green:act",
+        .gpio = RB941_GPIO_LED_ACT,
+        .active_low = 1,
+    },
+};
+
+static struct gpio_keys_button rb941_gpio_keys[] __initdata = {
+    {
+        .desc = "Reset button",
+        .type = EV_KEY,
+        .code = KEY_RESTART,
+        .debounce_interval = RB941_KEYS_DEBOUNCE_INTERVAL,
+        .gpio = RB941_GPIO_BTN_RESET,
+        .active_low = 1,
+    },
+};
+
+static void __init rb941_setup(void)
+{
+    const struct rb_info *info;
+    //try to get rb_info data
+    info = rb_init_info((void *)(KSEG1ADDR(AR71XX_SPI_BASE)), 0x20000);
+    if (!info){
+        pr_err("%s: Can't get rb_info data from flash!\n", __func__);
+        //return -EINVAL; //Not critical ... continue!
+    }
+    ath79_setup_ar934x_eth_cfg(AR934X_ETH_CFG_SW_ONLY_MODE);
+    ath79_register_m25p80(&rb941_spi_flash_data);
+    ath79_register_mdio(0, 0x0);
+
+    /* WAN. We have no WAN. Only LAN. */
+    /*ath79_switch_data.phy4_mii_en = 1;
+    ath79_switch_data.phy_poll_mask = BIT(4);
+    ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
+    ath79_eth0_data.phy_mask = BIT(4);
+    ath79_init_mac(ath79_eth0_data.mac_addr, ath79_mac_base, 0);
+    ath79_register_eth(0); */
+
+    /* LAN */
+    ath79_init_mac(ath79_eth1_data.mac_addr, ath79_mac_base, 0);
+    ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII;
+    ath79_register_eth(1);
+
+    //ath79_register_usb();
+
+    rb941_wlan_init();
+
+    ath79_register_leds_gpio(-1, ARRAY_SIZE(rb941_leds), rb941_leds);
+    ath79_register_gpio_keys_polled(-1, RB941_KEYS_POLL_INTERVAL,
+                                    ARRAY_SIZE(rb941_gpio_keys),
+                                    rb941_gpio_keys);
+}
+
+MIPS_MACHINE(ATH79_MACH_RB_941, "H951L", "MikroTik RouterBOARD 941-2nD", rb941_setup);
index 9402185b9cb617d15b16a2977389907734d57633..f9e8422faa62e3564c4c1a84a1b5897cd511ec86 100644 (file)
@@ -162,6 +162,7 @@ enum ath79_mach_type {
        ATH79_MACH_RB_751,                      /* MikroTik RouterBOARD 751 */
        ATH79_MACH_RB_751G,                     /* Mikrotik RouterBOARD 751G */
        ATH79_MACH_RB_922GS,                    /* Mikrotik RouterBOARD 911/922GS boards */
+       ATH79_MACH_RB_941,                      /* MikroTik RouterBOARD 941-2nD */
        ATH79_MACH_RB_951G,                     /* Mikrotik RouterBOARD 951G */
        ATH79_MACH_RB_951U,                     /* Mikrotik RouterBOARD 951Ui-2HnD */
        ATH79_MACH_RB_SXTLITE2ND,               /* Mikrotik RouterBOARD SXT Lite 2nD */
index 000253b62266ec12bbe485d0231b74b64c7dfb79..ff14f90ca6aeb539aaf7de69bc7bcb6de69bf09c 100644 (file)
@@ -20,3 +20,22 @@ $(Device/mikrotik)
 endef
 
 TARGET_DEVICES += nand-64m nand-large
+
+define Device/rb-nor-flash-16M
+  DEVICE_PROFILE := Default
+  BLOCKSIZE := 64k
+  IMAGE_SIZE := 16000k
+  LOADER_TYPE := elf
+  KERNEL_INSTALL := 1
+  KERNEL := kernel-bin | lzma | loader-kernel | kernel2minor -s 1024 -e
+  KERNEL_INITRAMFS := kernel-bin | lzma | loader-kernel
+  IMAGES := sysupgrade.bin
+  IMAGE/sysupgrade.bin = append-rootfs | pad-rootfs | combined-image | check-size $$$$(IMAGE_SIZE)
+endef
+
+define Device/rb-941-2nd
+$(Device/rb-nor-flash-16M)
+  BOARDNAME:= rb-941-2nd
+endef
+
+TARGET_DEVICES += rb-941-2nd