#!/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 iflag=skip_bytes bs=$count skip=$offset count=1 2>/dev/null || \ ath10kcal_die "failed to extract calibration data from $mtd" } ensure_correct_art() { # NOTE(rytis): Hardcoded hashes for 64 KiB file, filled with zeroes (md5b0) and ones (md5b1). local md5b0="fcd6bcb56c1689fcef28b57c22475bad" local md5b1="ecb99e6ffea7be1e5419350f725da86b" local artdir="/dev/mtd12" local bindir="/usr/share/art/art_rutx.bin" local md5art="$(md5sum $artdir)" md5art="${md5art%% *}" local devicename="$(mnf_info -n)" devicename="${devicename:0:6}" if [ "$devicename" != "RUTX08" ] && [ "$devicename" != "RUTX09" ]; then if [ "$md5art" == "$md5b0" ] || [ "$md5art" == "$md5b1" ] && [ -e "$bindir" ]; then mtd write $bindir $artdir fi else if [ "$md5art" != "$md5b0" ] && [ "$md5art" != "$md5b1" ]; then mtd erase $artdir fi fi } [ -e /lib/firmware/$FIRMWARE ] && exit 0 . /lib/functions.sh . /lib/functions/system.sh board=$(board_name) ensure_correct_art case "$FIRMWARE" in "ath10k/pre-cal-ahb-a000000.wifi.bin") case "$board" in teltonika,rutx) ath10kcal_extract "0:ART" 4096 12064 ;; esac ;; "ath10k/pre-cal-ahb-a800000.wifi.bin") case "$board" in teltonika,rutx) ath10kcal_extract "0:ART" 20480 12064 ;; esac ;; *) exit 1 ;; esac