ar71xx: add support for RB-941-2nD

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>
This commit is contained in:
Thibaut VARENE 2017-01-04 22:44:54 +01:00 committed by Felix Fietkau
parent 8ab057f5e4
commit 3f7841a70a
11 changed files with 243 additions and 4 deletions

View file

@ -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|\

View file

@ -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|\

View 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|\

View file

@ -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"
;;

View file

@ -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"
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"
;;

View 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

View 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

View 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

View file

@ -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);

View 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 */

View 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