From 54b275c8ed3ad20c447fd46deec83384822ac79d Mon Sep 17 00:00:00 2001 From: John Crispin Date: Wed, 21 Feb 2018 20:40:50 +0100 Subject: ipq40xx: add target Signed-off-by: Christian Lamparter Signed-off-by: Mathias Kresin Signed-off-by: John Crispin --- .../linux/ipq40xx/base-files/etc/board.d/01_leds | 28 ++++++ .../ipq40xx/base-files/etc/board.d/02_network | 31 ++++++ target/linux/ipq40xx/base-files/etc/diag.sh | 43 ++++++++ .../etc/hotplug.d/firmware/11-ath10k-caldata | 62 ++++++++++++ target/linux/ipq40xx/base-files/etc/inittab | 4 + .../ipq40xx/base-files/lib/upgrade/openmesh.sh | 110 +++++++++++++++++++++ .../ipq40xx/base-files/lib/upgrade/platform.sh | 27 +++++ 7 files changed, 305 insertions(+) create mode 100755 target/linux/ipq40xx/base-files/etc/board.d/01_leds create mode 100755 target/linux/ipq40xx/base-files/etc/board.d/02_network create mode 100755 target/linux/ipq40xx/base-files/etc/diag.sh create mode 100644 target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata create mode 100644 target/linux/ipq40xx/base-files/etc/inittab create mode 100644 target/linux/ipq40xx/base-files/lib/upgrade/openmesh.sh create mode 100644 target/linux/ipq40xx/base-files/lib/upgrade/platform.sh (limited to 'target/linux/ipq40xx/base-files') diff --git a/target/linux/ipq40xx/base-files/etc/board.d/01_leds b/target/linux/ipq40xx/base-files/etc/board.d/01_leds new file mode 100755 index 0000000000..31c6e32a06 --- /dev/null +++ b/target/linux/ipq40xx/base-files/etc/board.d/01_leds @@ -0,0 +1,28 @@ +#!/bin/sh +# +# Copyright (C) 2015 OpenWrt.org +# + +. /lib/functions/uci-defaults.sh + +board_config_update + +board=$(board_name) +boardname="${board##*,}" + +case "$board" in +avm,fritzbox-4040) + ucidef_set_led_wlan "wlan" "WLAN" "fritz4040:green:wlan" "phy0tpt" "phy1tpt" + ucidef_set_led_netdev "wan" "WAN" "fritz4040:green:wan" "eth1" + ucidef_set_led_switch "lan" "LAN" "fritz4040:green:lan" "switch0" "0x1e" + ;; +glinet,gl-b1300) + ucidef_set_led_wlan "wlan" "WLAN" "${boardname}:green:wlan" "phy0tpt" + ;; +*) + ;; +esac + +board_config_flush + +exit 0 diff --git a/target/linux/ipq40xx/base-files/etc/board.d/02_network b/target/linux/ipq40xx/base-files/etc/board.d/02_network new file mode 100755 index 0000000000..37f81a398a --- /dev/null +++ b/target/linux/ipq40xx/base-files/etc/board.d/02_network @@ -0,0 +1,31 @@ +#!/bin/sh +# +# Copyright (c) 2015 The Linux Foundation. All rights reserved. +# Copyright (c) 2011-2015 OpenWrt.org +# + +. /lib/functions/uci-defaults.sh +. /lib/functions/system.sh + +board_config_update + +board=$(board_name) + +case "$board" in +avm,fritzbox-4040) + ucidef_set_interfaces_lan_wan "eth0" "eth1" + ucidef_add_switch "switch0" \ + "0u@eth0" "1:lan" "2:lan" "3:lan" "4:lan" + ;; +glinet,gl-b1300 |\ +openmesh,a42) + ucidef_set_interfaces_lan_wan "eth1" "eth0" + ;; +*) + echo "Unsupported hardware. Network interfaces not intialized" + ;; +esac + +board_config_flush + +exit 0 diff --git a/target/linux/ipq40xx/base-files/etc/diag.sh b/target/linux/ipq40xx/base-files/etc/diag.sh new file mode 100755 index 0000000000..4cfe6325f2 --- /dev/null +++ b/target/linux/ipq40xx/base-files/etc/diag.sh @@ -0,0 +1,43 @@ +#!/bin/sh + +. /lib/functions/leds.sh + +boot="$(get_dt_led boot)" +failsafe="$(get_dt_led failsafe)" +running="$(get_dt_led running)" +upgrade="$(get_dt_led upgrade)" + +set_state() { + status_led="$boot" + + case "$1" in + preinit) + status_led_blink_preinit + ;; + failsafe) + status_led_off + [ -n "$running" ] && { + status_led="$running" + status_led_off + } + status_led="$failsafe" + status_led_blink_failsafe + ;; + preinit_regular) + status_led_blink_preinit_regular + ;; + upgrade) + [ -n "$running" ] && { + status_led="$upgrade" + status_led_blink_preinit_regular + } + ;; + done) + status_led_off + [ -n "$running" ] && { + status_led="$running" + status_led_on + } + ;; + esac +} diff --git a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata new file mode 100644 index 0000000000..33ea9b426c --- /dev/null +++ b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata @@ -0,0 +1,62 @@ +#!/bin/sh + +ath10kcal_die() { + echo "ath10cal: " "$*" + exit 1 +} + +ath10kcal_extract() { + local part=$1 + local offset=$2 + local count=$3 + local mtd + + mtd=$(find_mtd_chardev $part) + [ -n "$mtd" ] || \ + ath10kcal_die "no mtd device found for partition $part" + + dd if=$mtd of=/lib/firmware/$FIRMWARE bs=1 skip=$offset count=$count 2>/dev/null || \ + ath10kcal_die "failed to extract calibration data from $mtd" +} + +[ -e /lib/firmware/$FIRMWARE ] && exit 0 + +. /lib/functions.sh +. /lib/functions/system.sh + +board=$(board_name) + + +case "$FIRMWARE" in +"ath10k/pre-cal-ahb-a000000.wifi.bin") + case "$board" in + avm,fritzbox-4040) + /usr/bin/fritz_cal_extract -i 1 -s 0x400 -e 0x207 -l 12064 -o /lib/firmware/$FIRMWARE $(find_mtd_chardev "urlader_config") + ;; + glinet,gl-b1300 |\ + qcom,ap-dk01.1-c1) + ath10kcal_extract "ART" 4096 12064 + ;; + openmesh,a42) + ath10kcal_extract "0:ART" 4096 12064 + ;; + esac + ;; +"ath10k/pre-cal-ahb-a800000.wifi.bin") + case "$board" in + avm,fritzbox-4040) + /usr/bin/fritz_cal_extract -i 1 -s 0x400 -e 0x208 -l 12064 -o /lib/firmware/$FIRMWARE $(find_mtd_chardev "urlader_config") + ;; + glinet,gl-b1300 |\ + qcom,ap-dk01.1-c1) + ath10kcal_extract "ART" 20480 12064 + ;; + openmesh,a42) + ath10kcal_extract "0:ART" 20480 12064 + ;; + esac + ;; +*) + exit 1 + ;; +esac diff --git a/target/linux/ipq40xx/base-files/etc/inittab b/target/linux/ipq40xx/base-files/etc/inittab new file mode 100644 index 0000000000..809bba5e5f --- /dev/null +++ b/target/linux/ipq40xx/base-files/etc/inittab @@ -0,0 +1,4 @@ +# Copyright (c) 2013 The Linux Foundation. All rights reserved. +::sysinit:/etc/init.d/rcS S boot +::shutdown:/etc/init.d/rcS K shutdown +ttyMSM0::askfirst:/usr/libexec/login.sh diff --git a/target/linux/ipq40xx/base-files/lib/upgrade/openmesh.sh b/target/linux/ipq40xx/base-files/lib/upgrade/openmesh.sh new file mode 100644 index 0000000000..71ab247ead --- /dev/null +++ b/target/linux/ipq40xx/base-files/lib/upgrade/openmesh.sh @@ -0,0 +1,110 @@ +# The U-Boot loader of the OpenMesh devices requires image sizes and +# checksums to be provided in the U-Boot environment. +# The OpenMesh devices come with 2 main partitions - while one is active +# sysupgrade will flash the other. The boot order is changed to boot the +# newly flashed partition. If the new partition can't be booted due to +# upgrade failures the previously used partition is loaded. + +platform_do_upgrade_openmesh() { + local tar_file="$1" + local restore_backup + local primary_kernel_mtd + + local setenv_script="/tmp/fw_env_upgrade" + + local kernel_mtd="$(find_mtd_index $PART_NAME)" + local kernel_offset="$(cat /sys/class/mtd/mtd${kernel_mtd}/offset)" + local total_size="$(cat /sys/class/mtd/mtd${kernel_mtd}/size)" + + # detect to which flash region the new image is written to. + # + # 1. check what is the mtd index for the first flash region on this + # device + # 2. check if the target partition ("inactive") has the mtd index of + # the first flash region + # + # - when it is: the new bootseq will be 1,2 and the first region is + # modified + # - when it isnt: bootseq will be 2,1 and the second region is + # modified + # + # The detection has to be done via the hardcoded mtd partition because + # the current boot might be done with the fallback region. Let us + # assume that the current bootseq is 1,2. The bootloader detected that + # the image in flash region 1 is corrupt and thus switches to flash + # region 2. The bootseq in the u-boot-env is now still the same and + # the sysupgrade code can now only rely on the actual mtd indexes and + # not the bootseq variable to detect the currently booted flash + # region/image. + # + # In the above example, an implementation which uses bootseq ("1,2") to + # detect the currently booted image would assume that region 1 is booted + # and then overwrite the variables for the wrong flash region (aka the + # one which isn't modified). This could result in a device which doesn't + # boot anymore to Linux until it was reflashed with ap51-flash. + local next_boot_part="1" + case "$(board_name)" in + openmesh,a42) + primary_kernel_mtd=8 + ;; + *) + echo "failed to detect primary kernel mtd partition for board" + return 1 + ;; + esac + [ "$kernel_mtd" = "$primary_kernel_mtd" ] || next_boot_part="2" + + local board_dir=$(tar tf $tar_file | grep -m 1 '^sysupgrade-.*/$') + board_dir=${board_dir%/} + + local kernel_length=$(tar xf $tar_file ${board_dir}/kernel -O | wc -c) + local rootfs_length=$(tar xf $tar_file ${board_dir}/root -O | wc -c) + # rootfs without EOF marker + rootfs_length=$((rootfs_length-4)) + + local kernel_md5=$(tar xf $tar_file ${board_dir}/kernel -O | md5sum); kernel_md5="${kernel_md5%% *}" + # md5 checksum of rootfs with EOF marker + local rootfs_md5=$(tar xf $tar_file ${board_dir}/root -O | dd bs=1 count=$rootfs_length | md5sum); rootfs_md5="${rootfs_md5%% *}" + + # + # add tar support to get_image() to use default_do_upgrade() instead? + # + + # take care of restoring a saved config + [ "$SAVE_CONFIG" -eq 1 ] && restore_backup="${MTD_CONFIG_ARGS} -j ${CONF_TAR}" + + # write concatinated kernel + rootfs to flash + tar xf $tar_file ${board_dir}/kernel ${board_dir}/root -O | \ + mtd $restore_backup write - $PART_NAME + + # prepare new u-boot env + if [ "$next_boot_part" = "1" ]; then + echo "bootseq 1,2" > $setenv_script + else + echo "bootseq 2,1" > $setenv_script + fi + + printf "kernel_size_%i 0x%08x\n" $next_boot_part $kernel_length >> $setenv_script + printf "vmlinux_start_addr 0x%08x\n" ${kernel_offset} >> $setenv_script + printf "vmlinux_size 0x%08x\n" ${kernel_length} >> $setenv_script + printf "vmlinux_checksum %s\n" ${kernel_md5} >> $setenv_script + + printf "rootfs_size_%i 0x%08x\n" $next_boot_part $((total_size-kernel_length)) >> $setenv_script + printf "rootfs_start_addr 0x%08x\n" $((kernel_offset+kernel_length)) >> $setenv_script + printf "rootfs_size 0x%08x\n" ${rootfs_length} >> $setenv_script + printf "rootfs_checksum %s\n" ${rootfs_md5} >> $setenv_script + + # store u-boot env changes + fw_setenv -s $setenv_script || { + echo "failed to update U-Boot environment" + return 1 + } +} + +# create /var/lock for the lock "fw_setenv.lock" of fw_setenv +# the rest is copied using ipq806x's RAMFS_COPY_BIN and RAMFS_COPY_DATA +platform_add_ramfs_ubootenv() +{ + mkdir -p $RAM_ROOT/var/lock +} +append sysupgrade_pre_upgrade platform_add_ramfs_ubootenv diff --git a/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh b/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh new file mode 100644 index 0000000000..defa04d880 --- /dev/null +++ b/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh @@ -0,0 +1,27 @@ +PART_NAME=firmware +REQUIRE_IMAGE_METADATA=1 + +RAMFS_COPY_BIN='fw_printenv fw_setenv' +RAMFS_COPY_DATA='/etc/fw_env.config /var/lock/fw_printenv.lock' + +platform_check_image() { + return 0; +} + +platform_do_upgrade() { + case "$(board_name)" in + openmesh,a42) + PART_NAME="inactive" + platform_do_upgrade_openmesh "$ARGV" + ;; + *) + default_do_upgrade "$ARGV" + ;; + esac +} + +blink_led() { + . /etc/diag.sh; set_state upgrade +} + +append sysupgrade_pre_upgrade blink_led -- cgit v1.2.3