From: Chris Blake Date: Wed, 20 Jul 2016 13:44:51 +0000 (+0200) Subject: apm821xx: add support for the Cisco Meraki MR24 X-Git-Tag: v17.01.0-rc1~1969 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=a57d6e2d47688cfa392d6ea7f36ae6f9d84affc5;p=oweals%2Fopenwrt.git apm821xx: add support for the Cisco Meraki MR24 This patch adds support for the Cisco Meraki MR24 Access point to the apm821xx target. Board: MR24 - Meraki MR24 Cloud Managed Access Point CPU: APM82181 SoC 800 MHz (PLB=200 OPB=100 EBC=100) Flash size: 32MiB RAM Size: 128MiB Wireless: Atheros AR9380 5.0GHz + Atheros AR9380 2.4GHz Ethernet ports: 1x Gigabit Atheros AR8035 WARNING: The serial port needs a TTL/RS-232 v3.3 level converter! For flashing instructions, visit: Signed-off-by: Chris Blake --- diff --git a/target/linux/apm821xx/Makefile b/target/linux/apm821xx/Makefile index 5c530d3ca6..eb34a3b3dc 100644 --- a/target/linux/apm821xx/Makefile +++ b/target/linux/apm821xx/Makefile @@ -11,6 +11,7 @@ CPU_TYPE:=464fp FEATURES:=fpu dt gpio MAINTAINER:=Chris Blake , \ Christian Lamparter +SUBTARGETS:=nand KERNEL_PATCHVER:=4.4 diff --git a/target/linux/apm821xx/base-files/etc/board.d/01_leds b/target/linux/apm821xx/base-files/etc/board.d/01_leds index eab8b59142..d5f4cc9478 100755 --- a/target/linux/apm821xx/base-files/etc/board.d/01_leds +++ b/target/linux/apm821xx/base-files/etc/board.d/01_leds @@ -8,6 +8,14 @@ board_config_update board=$(apm821xx_board_name) case "$board" in +mr24) + ucidef_set_led_netdev "wan" "WAN" "mr24:green:wan" "eth0" + ucidef_set_led_wlan "wlan1" "WLAN1" "mr24:green:wifi1" "phy0assoc" + ucidef_set_led_wlan "wlan2" "WLAN2" "mr24:green:wifi2" "phy0assoc" + ucidef_set_led_wlan "wlan3" "WLAN3" "mr24:green:wifi3" "phy0assoc" + ucidef_set_led_wlan "wlan4" "WLAN4" "mr24:green:wifi4" "phy0tpt" + ;; + *) ;; esac diff --git a/target/linux/apm821xx/base-files/etc/board.d/02_network b/target/linux/apm821xx/base-files/etc/board.d/02_network index 7dbabec11d..4d53b2f64a 100755 --- a/target/linux/apm821xx/base-files/etc/board.d/02_network +++ b/target/linux/apm821xx/base-files/etc/board.d/02_network @@ -9,6 +9,9 @@ board_config_update board=$(apm821xx_board_name) case "$board" in +mr24) + ucidef_set_interface_lan "eth0" + ;; *) ucidef_set_interfaces_lan_wan "eth0" "eth1" ;; diff --git a/target/linux/apm821xx/base-files/etc/diag.sh b/target/linux/apm821xx/base-files/etc/diag.sh index 4d6763879b..58301f836f 100755 --- a/target/linux/apm821xx/base-files/etc/diag.sh +++ b/target/linux/apm821xx/base-files/etc/diag.sh @@ -5,6 +5,10 @@ get_status_led() { case $(apm821xx_board_name) in + mr24) + status_led="mr24:green:power" + ;; + *) ;; esac diff --git a/target/linux/apm821xx/base-files/lib/apm821xx.sh b/target/linux/apm821xx/base-files/lib/apm821xx.sh index 8f15ced8ca..82f85c56be 100755 --- a/target/linux/apm821xx/base-files/lib/apm821xx.sh +++ b/target/linux/apm821xx/base-files/lib/apm821xx.sh @@ -10,6 +10,10 @@ apm821xx_board_detect() { model=$(awk 'BEGIN{FS="[ \t]+:[ \t]"} /model/ {print $2}' /proc/cpuinfo) case "$model" in + *"Meraki MR24 Access Point") + name="mr24" + ;; + *) name="unknown" ;; diff --git a/target/linux/apm821xx/base-files/lib/preinit/05_set_iface_mac_apm821xx b/target/linux/apm821xx/base-files/lib/preinit/05_set_iface_mac_apm821xx new file mode 100644 index 0000000000..5dc7175730 --- /dev/null +++ b/target/linux/apm821xx/base-files/lib/preinit/05_set_iface_mac_apm821xx @@ -0,0 +1,14 @@ +#!/bin/sh + +. /lib/apm821xx.sh + +preinit_set_mac_address() { + case $(apm821xx_board_name) in + mr24) + mac_lan=$(mtd_get_mac_binary_ubi board-config 102) + [ -n "$mac_lan" ] && ifconfig eth0 hw ether "$mac_lan" + ;; + esac +} + +boot_hook_add preinit_main preinit_set_mac_address diff --git a/target/linux/apm821xx/base-files/lib/upgrade/merakinand.sh b/target/linux/apm821xx/base-files/lib/upgrade/merakinand.sh new file mode 100755 index 0000000000..5861d97f12 --- /dev/null +++ b/target/linux/apm821xx/base-files/lib/upgrade/merakinand.sh @@ -0,0 +1,65 @@ +#!/bin/sh +# +# Copyright (C) 2016 Chris Blake +# +# Custom upgrade script for Meraki NAND devices (ex. MR24) +# Based on merakinand.sh from the ar71xx target +# +. /lib/apm821xx.sh +. /lib/functions.sh + +merakinand_do_kernel_check() { + local board_name="$1" + local tar_file="$2" + local image_magic_word=`(tar xf $tar_file sysupgrade-$board_name/kernel -O 2>/dev/null | dd bs=1 count=4 skip=0 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"')` + + # What is our kernel magic string? + case "$board_name" in + "mr24") + [ "$image_magic_word" == "8e73ed8a" ] && { + echo "pass" && return 0 + } + ;; + esac + + exit 1 +} + +merakinand_do_platform_check() { + local board_name="$1" + local tar_file="$2" + local control_length=`(tar xf $tar_file sysupgrade-$board_name/CONTROL -O | wc -c) 2> /dev/null` + local file_type="$(identify_tar $2 sysupgrade-$board_name/root)" + local kernel_magic="$(merakinand_do_kernel_check $1 $2)" + + case "$board_name" in + "mr24") + [ "$control_length" = 0 -o "$file_type" != "squashfs" -o "$kernel_magic" != "pass" ] && { + echo "Invalid sysupgrade file for $board_name" + return 1 + } + ;; + *) + echo "Unsupported device $board_name"; + return 1 + ;; + esac + + return 0 +} + +merakinand_do_upgrade() { + local tar_file="$1" + local board_name="$(cat /tmp/sysinfo/board_name)" + + # Do we need to do any platform tweaks? + case "$board_name" in + "mr24") + nand_do_upgrade $1 + ;; + *) + echo "Unsupported device $board_name"; + exit 1 + ;; + esac +} diff --git a/target/linux/apm821xx/base-files/lib/upgrade/platform.sh b/target/linux/apm821xx/base-files/lib/upgrade/platform.sh index 2406113bad..ddf775f4ae 100755 --- a/target/linux/apm821xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/apm821xx/base-files/lib/upgrade/platform.sh @@ -11,6 +11,11 @@ platform_check_image() { [ "$#" -gt 1 ] && return 1 case "$board" in + mr24) + merakinand_do_platform_check $board "$1" + return $?; + ;; + *) ;; esac @@ -23,6 +28,10 @@ platform_pre_upgrade() { local board=$(apm821xx_board_name) case "$board" in + mr24) + merakinand_do_upgrade "$1" + ;; + *) ;; esac diff --git a/target/linux/apm821xx/config-4.4 b/target/linux/apm821xx/config-4.4 index 31235996c8..1e82e26692 100644 --- a/target/linux/apm821xx/config-4.4 +++ b/target/linux/apm821xx/config-4.4 @@ -38,6 +38,7 @@ CONFIG_BOOKE=y CONFIG_BOOKE_WDT=y CONFIG_BOUNCE=y # CONFIG_CANYONLANDS is not set +# CONFIG_IKAREM is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_CLONE_BACKWARDS=y CONFIG_CMDLINE="rootfstype=squashfs noinitrd" diff --git a/target/linux/apm821xx/dts/MR24.dts b/target/linux/apm821xx/dts/MR24.dts new file mode 100644 index 0000000000..1e186e6f04 --- /dev/null +++ b/target/linux/apm821xx/dts/MR24.dts @@ -0,0 +1,433 @@ +/* + * Device Tree Source for Meraki MR24 (Ikarem) + * + * Copyright (C) 2016 Chris Blake + * + * Based on Cisco Meraki GPL Release r23-20150601 MR24 DTS + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without + * any warranty of any kind, whether express or implied. + */ + +/dts-v1/; + +/ { + #address-cells = <2>; + #size-cells = <1>; + model = "Meraki MR24 Access Point"; + compatible = "meraki,ikarem"; + dcr-parent = <&{/cpus/cpu@0}>; + + aliases { + ethernet0 = &EMAC0; + serial0 = &UART0; + }; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + + cpu@0 { + device_type = "cpu"; + model = "PowerPC,apm821xx"; + reg = <0x00000000>; + clock-frequency = <0>; /* Filled in by U-Boot */ + timebase-frequency = <0>; /* Filled in by U-Boot */ + i-cache-line-size = <32>; + d-cache-line-size = <32>; + i-cache-size = <32768>; + d-cache-size = <32768>; + dcr-controller; + dcr-access-method = "native"; + next-level-cache = <&L2C0>; + }; + }; + + memory { + device_type = "memory"; + reg = <0x00000000 0x00000000 0x00000000>; /* Filled in by U-Boot */ + }; + + UIC0: interrupt-controller0 { + compatible = "ibm,uic"; + interrupt-controller; + cell-index = <0>; + dcr-reg = <0x0c0 0x009>; + #address-cells = <0>; + #size-cells = <0>; + #interrupt-cells = <2>; + }; + + UIC1: interrupt-controller1 { + compatible = "ibm,uic"; + interrupt-controller; + cell-index = <1>; + dcr-reg = <0x0d0 0x009>; + #address-cells = <0>; + #size-cells = <0>; + #interrupt-cells = <2>; + interrupts = <0x1e 0x4 0x1f 0x4>; /* cascade */ + interrupt-parent = <&UIC0>; + }; + + UIC2: interrupt-controller2 { + compatible = "ibm,uic"; + interrupt-controller; + cell-index = <2>; + dcr-reg = <0x0e0 0x009>; + #address-cells = <0>; + #size-cells = <0>; + #interrupt-cells = <2>; + interrupts = <0xa 0x4 0xb 0x4>; /* cascade */ + interrupt-parent = <&UIC0>; + }; + + UIC3: interrupt-controller3 { + compatible = "ibm,uic"; + interrupt-controller; + cell-index = <3>; + dcr-reg = <0x0f0 0x009>; + #address-cells = <0>; + #size-cells = <0>; + #interrupt-cells = <2>; + interrupts = <0x10 0x4 0x11 0x4>; /* cascade */ + interrupt-parent = <&UIC0>; + }; + + /* KPH check the following */ + OCM: ocm@400040000 { + compatible = "ibm,ocm"; + status = "okay"; + cell-index = <1>; + /* configured in U-Boot */ + reg = <4 0x00040000 0x8000>; /* 32K */ + }; + + SDR0: sdr { + compatible = "ibm,sdr-apm821xx"; + dcr-reg = <0x00e 0x002>; + }; + + CPR0: cpr { + compatible = "ibm,cpr-apm821xx"; + dcr-reg = <0x00c 0x002>; + }; + + L2C0: l2c { + compatible = "ibm,l2-cache-apm82181", "ibm,l2-cache"; + dcr-reg = <0x020 0x008 + 0x030 0x008>; + cache-line-size = <32>; + cache-size = <262144>; + interrupt-parent = <&UIC1>; + interrupts = <11 1>; + }; + + /* kph check the below */ + CPM0: cpm { + compatible = "ibm,cpm-apm821xx", "ibm,cpm"; + cell-index = <0>; + dcr-reg = <0x160 0x003>; + pm-cpu = <0x02000000>; + pm-doze = <0x302570F0>; + pm-nap = <0x302570F0>; + pm-deepsleep = <0x302570F0>; + pm-iic-device = <&IIC0>; + pm-emac-device = <&EMAC0>; + }; + + plb { + compatible = "ibm,plb4"; + #address-cells = <2>; + #size-cells = <1>; + ranges; + clock-frequency = <0>; /* Filled in by U-Boot */ + + SDRAM0: sdram { + compatible = "ibm,sdram-apm821xx"; + dcr-reg = <0x010 0x002>; + }; + + /* kph check the below */ + CRYPTO: crypto@180000 { + compatible = "amcc,ppc460ex-crypto", "amcc,ppc4xx-crypto"; + reg = <4 0x00180000 0x80400>; + interrupt-parent = <&UIC0>; + interrupts = <0x1d 0x4>; + }; + + /* kph check the below */ + PKA: pka@114000 { + device_type = "pka"; + compatible = "ppc4xx-pka", "amcc,ppc4xx-pka"; + reg = <4 0x00114000 0x4000>; + interrupt-parent = <&UIC0>; + interrupts = <0x14 0x2>; + }; + + /* kph check the below */ + TRNG: trng@110000 { + compatible = "ppc4xx-trng", "amcc,ppc460ex-rng"; + reg = <4 0x00110000 0x50>; + interrupt-parent = <&UIC1>; + interrupts = <0x3 0x2>; + }; + + MAL0: mcmal { + compatible = "ibm,mcmal2"; + descriptor-memory = "ocm"; + dcr-reg = <0x180 0x062>; + num-tx-chans = <1>; + num-rx-chans = <1>; + #address-cells = <0>; + #size-cells = <0>; + interrupt-parent = <&UIC2>; + interrupts = < /*TXEOB*/ 0x6 0x4 + /*RXEOB*/ 0x7 0x4 + /*SERR*/ 0x3 0x4 + /*TXDE*/ 0x4 0x4 + /*RXDE*/ 0x5 0x4>; + }; + + POB0: opb { + compatible = "ibm,opb"; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0xb0000000 0x00000004 0xb0000000 0x50000000>; + clock-frequency = <0>; /* Filled in by U-Boot */ + + EBC0: ebc { + compatible = "ibm,ebc"; + dcr-reg = <0x012 0x002>; + #address-cells = <2>; + #size-cells = <1>; + clock-frequency = <0>; /* Filled in by U-Boot */ + /* ranges property is supplied by U-Boot */ + ranges = < 0x00000003 0x00000000 0xe0000000 0x8000000>; + interrupts = <0x6 0x4>; + interrupt-parent = <&UIC1>; + + /* Ikarem has 32MB of NAND */ + ndfc@1,0 { + compatible = "ibm,ndfc"; + reg = <00000003 00000000 00000400>; + ccr = <0x00001000>; + bank-settings = <0x80002222>; + #address-cells = <1>; + #size-cells = <1>; + /* 32 MiB NAND Flash */ + nand { + #address-cells = <1>; + #size-cells = <1>; + partition@0 { + label = "u-boot"; + reg = <0x00000000 0x00170000>; + read-only; + }; + partition@170000 { + label = "oops"; + reg = <0x00170000 0x00010000>; + }; + partition@180000 { + label = "ubi"; + reg = <0x00180000 0x01e80000>; + }; + }; + }; + }; + + UART0: serial@ef600400 { + device_type = "serial"; + compatible = "ns16550"; + reg = <0xef600400 0x00000008>; + virtual-reg = <0xef600400>; + clock-frequency = <0>; /* Filled in by U-Boot */ + current-speed = <0>; /* Filled in by U-Boot */ + interrupt-parent = <&UIC0>; + interrupts = <0x1 0x4>; + }; + + GPIO0: gpio@ef600b00 { + compatible = "ibm,ppc4xx-gpio"; + reg = <0xef600b00 0x00000048>; + #gpio-cells = <2>; + gpio-controller; + }; + + gpio-leds { + compatible = "gpio-leds"; + power-green { + label = "mr24:green:power"; + gpios = <&GPIO0 18 1>; + }; + power-orange { + label = "mr24:orange:power"; + gpios = <&GPIO0 19 1>; + }; + lan { + label = "mr24:green:wan"; + gpios = <&GPIO0 17 1>; + }; + ssi-0 { + label = "mr24:green:wifi1"; + gpios = <&GPIO0 23 1>; + }; + ssi-1 { + label = "mr24:green:wifi2"; + gpios = <&GPIO0 22 1>; + }; + ssi-2 { + label = "mr24:green:wifi3"; + gpios = <&GPIO0 21 1>; + }; + ssi-3 { + label = "mr24:green:wifi4"; + gpios = <&GPIO0 20 1>; + }; + }; + + gpio_keys_polled { + compatible = "gpio-keys-polled"; + #address-cells = <1>; + #size-cells = <0>; + poll-interval = <60>; /* 3 * 20 = 60ms */ + autorepeat; + button@1 { + label = "Reset button"; + linux,code = <0x198>; /* KEY_RESTART */ + gpios = <&GPIO0 16 1>; + }; + }; + + IIC0: i2c@ef600700 { + compatible = "ibm,iic"; + reg = <0xef600700 0x00000014>; + interrupt-parent = <&UIC0>; + interrupts = <0x2 0x4>; + #address-cells = <1>; + #size-cells = <0>; + /* Boot ROM is at 0x52-0x53, do not touch */ + /* Unknown chip at 0x6e, not sure what it is */ + }; + + IIC1: i2c@ef600800 { + compatible = "ibm,iic"; + reg = <0xef600800 0x00000014>; + interrupt-parent = <&UIC0>; + interrupts = <0x3 0x4>; + }; + + RGMII0: emac-rgmii@ef601500 { + compatible = "ibm,rgmii"; + reg = <0xef601500 0x00000008>; + has-mdio; + }; + + TAH0: emac-tah@ef601350 { + compatible = "ibm,tah"; + reg = <0xef601350 0x00000030>; + }; + + EMAC0: ethernet@ef600c00 { + device_type = "network"; + compatible = "ibm,emac-apm821xx", "ibm,emac4sync"; + interrupt-parent = <&EMAC0>; + interrupts = <0x0 0x1>; + #interrupt-cells = <1>; + #address-cells = <0>; + #size-cells = <0>; + interrupt-map = ; + reg = <0xef600c00 0x000000c4>; + local-mac-address = [000000000000]; /* Filled in by U-Boot */ + mal-device = <&MAL0>; + mal-tx-channel = <0>; + mal-rx-channel = <0>; + cell-index = <0>; + max-frame-size = <9000>; + rx-fifo-size = <16384>; + tx-fifo-size = <2048>; + phy-mode = "rgmii"; + phy-map = <0x00000000>; + rgmii-device = <&RGMII0>; + rgmii-channel = <0>; + tah-device = <&TAH0>; + tah-channel = <0>; + has-inverted-stacr-oc; + has-new-stacr-staopc; + }; + }; + + PCIE0: pciex@d00000000 { + device_type = "pci"; + #interrupt-cells = <1>; + #size-cells = <2>; + #address-cells = <3>; + compatible = "ibm,plb-pciex-apm821xx", "ibm,plb-pciex"; + primary; + port = <0x0>; /* port number */ + reg = <0x0000000d 0x00000000 0x20000000 /* Config space access */ + 0x0000000c 0x08010000 0x00001000>; /* Registers */ + dcr-reg = <0x100 0x020>; + sdr-base = <0x300>; + + /* Outbound ranges, one memory and one IO, + * later cannot be changed + */ + ranges = <0x02000000 0x00000000 0x80000000 0x0000000e 0x00000000 0x00000000 0x80000000 + 0x02000000 0x00000000 0x00000000 0x0000000f 0x00000000 0x00000000 0x00100000 + 0x01000000 0x00000000 0x00000000 0x0000000f 0x80000000 0x00000000 0x00010000>; + + /* Inbound 2GB range starting at 0 */ + dma-ranges = <0x42000000 0x0 0x0 0x0 0x0 0x0 0x80000000>; + + /* This drives busses 40 to 0x7f */ + bus-range = <0x40 0x7f>; + + /* Legacy interrupts (note the weird polarity, the bridge seems + * to invert PCIe legacy interrupts). + * We are de-swizzling here because the numbers are actually for + * port of the root complex virtual P2P bridge. But I want + * to avoid putting a node for it in the tree, so the numbers + * below are basically de-swizzled numbers. + * The real slot is on idsel 0, so the swizzling is 1:1 + */ + interrupt-map-mask = <0x0 0x0 0x0 0x7>; + interrupt-map = < + 0x0 0x0 0x0 0x1 &UIC3 0xc 0x4 /* swizzled int A */ + 0x0 0x0 0x0 0x2 &UIC3 0xd 0x4 /* swizzled int B */ + 0x0 0x0 0x0 0x3 &UIC3 0xe 0x4 /* swizzled int C */ + 0x0 0x0 0x0 0x4 &UIC3 0xf 0x4 /* swizzled int D */>; + }; + + MSI: ppc4xx-msi@C10000000 { + compatible = "amcc,ppc4xx-msi", "ppc4xx-msi"; + reg = < 0xC 0x10000000 0x100 + 0xC 0x10000000 0x100>; + sdr-base = <0x36C>; + msi-data = <0x00004440>; + msi-mask = <0x0000ffe0>; + interrupts =<0 1 2 3 4 5 6 7>; + interrupt-parent = <&MSI>; + #interrupt-cells = <1>; + #address-cells = <0>; + #size-cells = <0>; + msi-available-ranges = <0x0 0x100>; + interrupt-map = < + 0 &UIC3 0x18 1 + 1 &UIC3 0x19 1 + 2 &UIC3 0x1A 1 + 3 &UIC3 0x1B 1 + 4 &UIC3 0x1C 1 + 5 &UIC3 0x1D 1 + 6 &UIC3 0x1E 1 + 7 &UIC3 0x1F 1 + >; + }; + }; + + chosen { + linux,stdout-path = "/plb/opb/serial@ef600400"; + }; +}; diff --git a/target/linux/apm821xx/image/Makefile b/target/linux/apm821xx/image/Makefile index 48ada70d3f..ba11bb22ee 100644 --- a/target/linux/apm821xx/image/Makefile +++ b/target/linux/apm821xx/image/Makefile @@ -4,19 +4,80 @@ # include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/image.mk +include $(INCLUDE_DIR)/host.mk -IMAGE_PROFILE:=$(if $(PROFILE),$(PROFILE),Default) - -DEVICE_VARS += DTS IMAGE_SIZE +DEVICE_VARS += DEVICE_DTS DEVICE_PROFILE IMAGE_SIZE DTB_SIZE define Device/Default - BOARDNAME := - DEVICE_PROFILE = $$(BOARDNAME) - PROFILES = Default $$(DEVICE_PROFILE) - KERNEL_DEPENDS = $$(wildcard ../dts/$$(DTS).dts) - KERNEL := kernel-bin | lzma | uImage lzma - KERNEL_INITRAMFS := kernel-bin | lzma | uImage lzma + KERNEL_DEPENDS = $$(wildcard ../dts/$$(DEVICE_DTS).dts) + DEVICE_PROFILE := + DEVICE_DTS := + KERNEL_ENTRY := 0x00000000 + KERNEL_LOADADDR := 0x00000000 +endef + +define Build/dtb + $(call Image/BuildDTB,../dts/$(DEVICE_DTS).dts,$@.dtb,,--space $(DTB_SIZE)) +endef + +ifeq ($(SUBTARGET),nand) + +define Image/cpiogz + ( cd $(TARGET_DIR); find . | cpio -o -H newc | gzip -9n >$(KDIR_TMP)/$(IMG_PREFIX)-rootfs.cpio.gz ) +endef + +define Build/copy-file + cat "$(1)" > "$@" +endef + +define Build/MerakiAdd-dtb + $(call Image/BuildDTB,../dts/$(DEVICE_DTS).dts,$@.dtb) + ( \ + dd if=$@.dtb bs=$(DTB_SIZE) conv=sync; \ + dd if=$@ bs=$(BLOCKSIZE) conv=sync; \ + ) > $@.new + @mv $@.new $@ endef -TARGET_DEVICES += Default + +define Build/MerakiAdd-initramfs + $(call Image/cpiogz) + + -$(STAGING_DIR_HOST)/bin/mkimage -A $(LINUX_KARCH) -O linux -T ramdisk \ + -C gzip -n "$(PROFILE) rootfs" \ + -d $(KDIR_TMP)/$(IMG_PREFIX)-rootfs.cpio.gz \ + $(KDIR_TMP)/$(IMG_PREFIX)-uramdisk.image.gz + + ( \ + dd if=$@ bs=1k conv=sync; \ + dd if=$(KDIR_TMP)/$(IMG_PREFIX)-uramdisk.image.gz bs=$(BLOCKSIZE) conv=sync; \ + ) > $@.new + @mv $@.new $@ +endef + +define Build/MerakiNAND + -$(STAGING_DIR_HOST)/bin/mkmerakifw \ + -B $(DEVICE_PROFILE) -s \ + -i $@ \ + -o $@.new + @cp $@.new $@ +endef + +define Device/mr24 + DEVICE_TITLE := Cisco Meraki MR24 + DEVICE_PACKAGES := kmod-spi-gpio kmod-ath9k wpad-mini + DEVICE_PROFILE := MR24 + DEVICE_DTS := MR24 + BLOCKSIZE := 64512 + IMAGES := sysupgrade.tar + DTB_SIZE := 64512 + KERNEL_SIZE := 2048k + IMAGE_SIZE := 8191k + KERNEL := kernel-bin | lzma | uImage lzma | MerakiAdd-dtb | MerakiNAND + KERNEL_INITRAMFS := copy-file $(KDIR)/vmlinux | lzma | uImage lzma | MerakiAdd-dtb | pad-to 2047k | MerakiAdd-initramfs | MerakiNAND + IMAGE/sysupgrade.tar := sysupgrade-nand +endef +TARGET_DEVICES += mr24 $(eval $(call BuildImage)) + +endif diff --git a/target/linux/apm821xx/nand/config-default b/target/linux/apm821xx/nand/config-default new file mode 100644 index 0000000000..582d1295bc --- /dev/null +++ b/target/linux/apm821xx/nand/config-default @@ -0,0 +1,9 @@ +CONFIG_IKAREM=y +CONFIG_MTD_UBI=y +CONFIG_MTD_UBI_BEB_LIMIT=20 +CONFIG_MTD_UBI_BLOCK=y +# CONFIG_MTD_UBI_FASTMAP is not set +# CONFIG_MTD_UBI_GLUEBI is not set +CONFIG_MTD_UBI_WL_THRESHOLD=4096 +CONFIG_UBIFS_FS=y +# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set diff --git a/target/linux/apm821xx/nand/target.mk b/target/linux/apm821xx/nand/target.mk new file mode 100644 index 0000000000..a7d88b87c5 --- /dev/null +++ b/target/linux/apm821xx/nand/target.mk @@ -0,0 +1,7 @@ +BOARDNAME:=Devices with NAND flash (Routers) +FEATURES += nand pcie ramdisk squashfs usb + +define Target/Description + Build firmware images for APM821XX boards with NAND flash. + For routers like the MR24 or the WNDR4700. +endef diff --git a/target/linux/apm821xx/patches-4.4/002-powerpc_ibm_phy_add_ar8035.patch b/target/linux/apm821xx/patches-4.4/002-powerpc_ibm_phy_add_ar8035.patch new file mode 100644 index 0000000000..b7316e15b3 --- /dev/null +++ b/target/linux/apm821xx/patches-4.4/002-powerpc_ibm_phy_add_ar8035.patch @@ -0,0 +1,62 @@ +From 0c13957a43a90b1522eb616f3c9967ec44e4da1d Mon Sep 17 00:00:00 2001 +From: Christian Lamparter +Date: Tue, 3 May 2016 13:58:24 +0200 +Subject: [PATCH] drivers: net: emac: add Atheros AR8035 phy initialization + code +To: netdev@vger.kernel.org + +This patch adds the phy initialization code for Qualcomm +Atheros AR8035 phy. This configuration is found in the +Cisco Meraki MR24. + +Signed-off-by: Christian Lamparter +--- + drivers/net/ethernet/ibm/emac/phy.c | 26 ++++++++++++++++++++++++++ + 1 file changed, 26 insertions(+) + +diff --git a/drivers/net/ethernet/ibm/emac/phy.c b/drivers/net/ethernet/ibm/emac/phy.c +index d3b9d10..5b88cc6 100644 +--- a/drivers/net/ethernet/ibm/emac/phy.c ++++ b/drivers/net/ethernet/ibm/emac/phy.c +@@ -470,12 +470,38 @@ static struct mii_phy_def m88e1112_phy_def = { + .ops = &m88e1112_phy_ops, + }; + ++static int ar8035_init(struct mii_phy *phy) ++{ ++ phy_write(phy, 0x1d, 0x5); /* Address debug register 5 */ ++ phy_write(phy, 0x1e, 0x2d47); /* Value copied from u-boot */ ++ phy_write(phy, 0x1d, 0xb); /* Address hib ctrl */ ++ phy_write(phy, 0x1e, 0xbc20); /* Value copied from u-boot */ ++ ++ return 0; ++} ++ ++static struct mii_phy_ops ar8035_phy_ops = { ++ .init = ar8035_init, ++ .setup_aneg = genmii_setup_aneg, ++ .setup_forced = genmii_setup_forced, ++ .poll_link = genmii_poll_link, ++ .read_link = genmii_read_link, ++}; ++ ++static struct mii_phy_def ar8035_phy_def = { ++ .phy_id = 0x004dd070, ++ .phy_id_mask = 0xfffffff0, ++ .name = "Atheros 8035 Gigabit Ethernet", ++ .ops = &ar8035_phy_ops, ++}; ++ + static struct mii_phy_def *mii_phy_table[] = { + &et1011c_phy_def, + &cis8201_phy_def, + &bcm5248_phy_def, + &m88e1111_phy_def, + &m88e1112_phy_def, ++ &ar8035_phy_def, + &genmii_phy_def, + NULL + }; +-- +2.8.1 + diff --git a/target/linux/apm821xx/patches-4.4/200-add-meraki-mr24-ikarem-support.patch b/target/linux/apm821xx/patches-4.4/200-add-meraki-mr24-ikarem-support.patch new file mode 100644 index 0000000000..45892f272f --- /dev/null +++ b/target/linux/apm821xx/patches-4.4/200-add-meraki-mr24-ikarem-support.patch @@ -0,0 +1,31 @@ +--- a/arch/powerpc/platforms/44x/Kconfig ++++ b/arch/powerpc/platforms/44x/Kconfig +@@ -40,6 +40,19 @@ config EBONY + help + This option enables support for the IBM PPC440GP evaluation board. + ++config IKAREM ++ bool "Ikarem" ++ depends on 44x ++ default n ++ select PPC44x_SIMPLE ++ select APM821xx ++ select PCI_MSI ++ select PPC4xx_MSI ++ select PPC4xx_PCI_EXPRESS ++ select IBM_EMAC_RGMII ++ help ++ This option enables support for the Cisco Meraki MR24 (Ikarem) Access Point. ++ + config SAM440EP + bool "Sam440ep" + depends on 44x +--- a/arch/powerpc/platforms/44x/ppc44x_simple.c ++++ b/arch/powerpc/platforms/44x/ppc44x_simple.c +@@ -62,6 +62,7 @@ static char *board[] __initdata = { + "amcc,sequoia", + "amcc,taishan", + "amcc,yosemite", ++ "meraki,ikarem", + "mosaixtech,icon" + }; diff --git a/tools/firmware-utils/src/mkmerakifw.c b/tools/firmware-utils/src/mkmerakifw.c index 241bb33400..61b81c6b5f 100644 --- a/tools/firmware-utils/src/mkmerakifw.c +++ b/tools/firmware-utils/src/mkmerakifw.c @@ -62,6 +62,16 @@ static const struct board_info boards[] = { 0xbf, 0xef, 0x95, 0x60, 0x18, 0x90, 0xaf, 0xd8, 0x07, 0x09}, }, { + .id = "mr24", + .description = "Meraki MR24 Access Point", + .magic = 0x8e73ed8a, + .imagelen = 0x00800000, + .statichash = {0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff}, + }, { + /* terminating entry */ } };