From ca2a03d1f6fc5288f1f1e9098c317ca9249e50b9 Mon Sep 17 00:00:00 2001 From: Thibaut VARENE Date: Wed, 4 Jan 2017 22:44:54 +0100 Subject: [PATCH] ar71xx: add support for RB-941-2nD Add full support for Mikrotik RB-941-2nD (hAP lite) Original patch by Sergey Sergeev 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 Signed-off-by: Felix Fietkau --- .../ar71xx/base-files/etc/board.d/01_leds | 3 + .../ar71xx/base-files/etc/board.d/02_network | 4 + target/linux/ar71xx/base-files/etc/diag.sh | 2 +- target/linux/ar71xx/base-files/lib/ar71xx.sh | 3 + .../ar71xx/base-files/lib/upgrade/platform.sh | 29 ++- target/linux/ar71xx/config-4.4 | 1 + .../files/arch/mips/ath79/Kconfig.openwrt | 10 + .../ar71xx/files/arch/mips/ath79/Makefile | 1 + .../ar71xx/files/arch/mips/ath79/mach-rb941.c | 174 ++++++++++++++++++ .../ar71xx/files/arch/mips/ath79/machtypes.h | 1 + target/linux/ar71xx/image/mikrotik.mk | 19 ++ 11 files changed, 243 insertions(+), 4 deletions(-) create mode 100644 target/linux/ar71xx/files/arch/mips/ath79/mach-rb941.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 5a2bf0cfc4..84cfb1e616 100755 --- a/target/linux/ar71xx/base-files/etc/board.d/01_leds +++ b/target/linux/ar71xx/base-files/etc/board.d/01_leds @@ -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|\ diff --git a/target/linux/ar71xx/base-files/etc/board.d/02_network b/target/linux/ar71xx/base-files/etc/board.d/02_network index 66274db15f..d46266aa43 100755 --- a/target/linux/ar71xx/base-files/etc/board.d/02_network +++ b/target/linux/ar71xx/base-files/etc/board.d/02_network @@ -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|\ diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh index d060ccf6e2..75c6c9acba 100644 --- a/target/linux/ar71xx/base-files/etc/diag.sh +++ b/target/linux/ar71xx/base-files/etc/diag.sh @@ -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|\ diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh index 1b30f4d827..7f27f45635 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -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" ;; diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh index 82ed041d66..80da9131c7 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -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" ;; diff --git a/target/linux/ar71xx/config-4.4 b/target/linux/ar71xx/config-4.4 index 4b2f736a86..a79d53e556 100644 --- a/target/linux/ar71xx/config-4.4 +++ b/target/linux/ar71xx/config-4.4 @@ -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 diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt index 21d6b51897..b38c30ae37 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt +++ b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt @@ -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 diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Makefile b/target/linux/ar71xx/files/arch/mips/ath79/Makefile index 6384c0604c..03bbe218d7 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_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 index 0000000000..5a8c7c0251 --- /dev/null +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-rb941.c @@ -0,0 +1,174 @@ +/* + * MikroTik RouterBOARD 941-2nD support + * + * Copyright (C) 2016 Sergey Sergeev + * + * 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 +#include +#include +#include +#include + +#include +//#include +#include + +#include +#include +#include + +#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); diff --git a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h index 9402185b9c..f9e8422faa 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h +++ b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h @@ -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 */ diff --git a/target/linux/ar71xx/image/mikrotik.mk b/target/linux/ar71xx/image/mikrotik.mk index 000253b622..ff14f90ca6 100644 --- a/target/linux/ar71xx/image/mikrotik.mk +++ b/target/linux/ar71xx/image/mikrotik.mk @@ -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