From abc84551c04783c2d59fdd4aa474d5a82ed30cf5 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Sat, 12 Dec 2015 06:42:29 +0000 Subject: ar71xx: add support for Cisco's MR18 This patch adds support for Cisco's MR18. Detailed instructions for the flashing the device can be found in the OpenWrt forum thread: Signed-off-by: Chris R Blake SVN-Revision: 47878 --- target/linux/ar71xx/base-files/etc/board.d/01_leds | 4 + .../linux/ar71xx/base-files/etc/board.d/02_network | 1 + target/linux/ar71xx/base-files/etc/diag.sh | 3 + .../etc/hotplug.d/firmware/10-ath9k-eeprom | 32 +++++ target/linux/ar71xx/base-files/lib/ar71xx.sh | 3 + .../base-files/lib/preinit/05_set_iface_mac_ar71xx | 4 + .../ar71xx/base-files/lib/upgrade/merakinand.sh | 137 +++++++++++++++++++++ .../ar71xx/base-files/lib/upgrade/platform.sh | 7 ++ 8 files changed, 191 insertions(+) create mode 100644 target/linux/ar71xx/base-files/lib/upgrade/merakinand.sh (limited to 'target/linux/ar71xx/base-files') 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 33f83776a4..d4f226e085 100755 --- a/target/linux/ar71xx/base-files/etc/board.d/01_leds +++ b/target/linux/ar71xx/base-files/etc/board.d/01_leds @@ -283,6 +283,10 @@ mr16) ucidef_set_led_wlan "wlan4" "WLAN4" "mr16:green:wifi4" "phy0tpt" ;; +mr18) + ucidef_set_led_netdev "wlan0" "WLAN0" "mr18:blue:tricolor0" "wlan0" + ;; + mr600) ucidef_set_led_wlan "wlan58" "WLAN58" "mr600:green:wlan58" "phy0tpt" ;; 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 0e77e933c3..11c4341557 100755 --- a/target/linux/ar71xx/base-files/etc/board.d/02_network +++ b/target/linux/ar71xx/base-files/etc/board.d/02_network @@ -313,6 +313,7 @@ eap7660d |\ el-mini |\ loco-m-xw |\ mr1750 |\ +mr18 |\ mr600 |\ mr600v2 |\ mr900 |\ diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh index 5b997e08df..0e1df108f0 100644 --- a/target/linux/ar71xx/base-files/etc/diag.sh +++ b/target/linux/ar71xx/base-files/etc/diag.sh @@ -152,6 +152,9 @@ get_status_led() { mr16) status_led="mr16:green:power" ;; + mr18) + status_led="mr18:green:tricolor0" + ;; mr600) status_led="mr600:orange:power" ;; diff --git a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom index b5f0588863..5398e76105 100644 --- a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom +++ b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom @@ -38,6 +38,14 @@ board=$(ar71xx_board_name) case "$FIRMWARE" in "soc_wmac.eeprom") case $board in + mr18) + if [ -n "$(nand_find_volume ubi0 caldata)" ]; then + ath9k_ubi_eeprom_extract "caldata" 4096 2048 + else + ath9k_eeprom_extract "odm-caldata" 4096 2048 + fi + ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 102) +1) + ;; r6100 | \ wndr3700v4 | \ wndr4300) @@ -52,6 +60,14 @@ case "$FIRMWARE" in "pci_wmac0.eeprom") case $board in + mr18) + if [ -n "$(nand_find_volume ubi0 caldata)" ]; then + ath9k_ubi_eeprom_extract "caldata" 20480 2048 + else + ath9k_eeprom_extract "odm-caldata" 20480 2048 + fi + ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 102) +2) + ;; wndr3700v4 | \ wndr4300) ath9k_eeprom_extract "caldata" 20480 2048 @@ -62,4 +78,20 @@ case "$FIRMWARE" in ;; esac ;; + +"pci_wmac1.eeprom") + case $board in + mr18) + if [ -n "$(nand_find_volume ubi0 caldata)" ]; then + ath9k_ubi_eeprom_extract "caldata" 36864 2048 + else + ath9k_eeprom_extract "odm-caldata" 36864 2048 + fi + ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 102) +3) + ;; + *) + ath9k_eeprom_die "board $board is not supported yet" + ;; + esac + ;; esac diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh index a1125236cf..54e6166d6d 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -551,6 +551,9 @@ ar71xx_board_detect() { *MR16) name="mr16" ;; + *MR18) + name="mr18" + ;; *MR600v2) name="mr600v2" ;; diff --git a/target/linux/ar71xx/base-files/lib/preinit/05_set_iface_mac_ar71xx b/target/linux/ar71xx/base-files/lib/preinit/05_set_iface_mac_ar71xx index 92b3765bb2..a9f4bf5244 100644 --- a/target/linux/ar71xx/base-files/lib/preinit/05_set_iface_mac_ar71xx +++ b/target/linux/ar71xx/base-files/lib/preinit/05_set_iface_mac_ar71xx @@ -29,6 +29,10 @@ preinit_set_mac_address() { dir-615-i1) fetch_mac_from_mtd nvram sys_lan_mac sys_wan_mac ;; + mr18) + mac_lan=$(mtd_get_mac_binary_ubi board-config 102) + [ -n "$mac_lan" ] && ifconfig eth0 hw ether "$mac_lan" + ;; r6100) mac_lan=$(mtd_get_mac_binary caldata 0) [ -n "$mac_lan" ] && ifconfig eth1 hw ether "$mac_lan" diff --git a/target/linux/ar71xx/base-files/lib/upgrade/merakinand.sh b/target/linux/ar71xx/base-files/lib/upgrade/merakinand.sh new file mode 100644 index 0000000000..fe78e9ff96 --- /dev/null +++ b/target/linux/ar71xx/base-files/lib/upgrade/merakinand.sh @@ -0,0 +1,137 @@ +#!/bin/sh +# +# Copyright (C) 2015 Chris Blake +# +# Custom upgrade script for Meraki NAND devices (ex. MR18) +# Based on dir825.sh and stock nand functions +# +. /lib/ar71xx.sh +. /lib/functions.sh +. /lib/upgrade/nand.sh + +get_magic_at() { + local mtddev=$1 + local pos=$2 + dd bs=1 count=2 skip=$pos if=$mtddev 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"' +} + +mr18_is_caldata_valid() { + local mtddev=$1 + local magic + + magic=$(get_magic_at $mtddev 4096) + [ "$magic" != "0202" ] && return 0 + + magic=$(get_magic_at $mtddev 20480) + [ "$magic" != "0202" ] && return 0 + + magic=$(get_magic_at $mtddev 36864) + [ "$magic" != "0202" ] && return 0 + + return 1 +} + +merakinand_copy_caldata() { + local cal_src=$1 + local cal_dst=$2 + local ubidev=$( nand_find_ubi $CI_UBIPART ) + local board_name="$(cat /tmp/sysinfo/board_name)" + local rootfs_size="$(ubinfo /dev/ubi0 -N rootfs_data | grep "Size" | awk '{ print $6 }')" + + # Setup partitions using board name, in case of future platforms + case "$board_name" in + "mr18") + # Src is MTD + mtd_src=$(find_mtd_chardev $cal_src) + [ -n "$mtd_src" ] || { + echo "no mtd device found for partition $cal_src" + exit 1 + } + + # Dest is UBI + # TODO: possibly add create (hard to do when rootfs_data is expanded & mounted) + # Would need to be done from ramdisk + mtd_dst="$(nand_find_volume $ubidev $cal_dst)" + [ -n "$mtd_dst" ] || { + echo "no ubi device found for partition $cal_dst" + exit 1 + } + + mr18_is_caldata_valid "$mtd_src" && { + echo "no valid calibration data found in $cal_src" + exit 1 + } + + mr18_is_caldata_valid "/dev/$mtd_dst" && { + echo "Copying calibration data from $cal_src to $cal_dst..." + dd if="$mtd_src" of=/tmp/caldata.tmp 2>/dev/null + ubiupdatevol "/dev/$mtd_dst" /tmp/caldata.tmp + rm /tmp/caldata.tmp + sync + } + return 0 + ;; + *) + echo "Unsupported device $board_name"; + return 1 + ;; + esac +} + +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 + "mr18") + [ "$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 + "mr18") + [ "$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 + "mr18") + # Check and create UBI caldata if it's invalid + merakinand_copy_caldata "odm-caldata" "caldata" + nand_do_upgrade $1 + ;; + *) + echo "Unsupported device $board_name"; + exit 1 + ;; + esac +} diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh index 5ec4499b73..bb64ef81bc 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -434,6 +434,10 @@ platform_check_image() { } return 0 ;; + mr18) + merakinand_do_platform_check $board $1 + return $?; + ;; nbg6716 | \ r6100 | \ wndr3700v4 | \ @@ -494,6 +498,9 @@ platform_pre_upgrade() { wndr4300 ) nand_do_upgrade "$1" ;; + mr18) + merakinand_do_upgrade "$1" + ;; esac } -- cgit v1.2.3