Files

52 lines
1.6 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
FIRMWARE_PATH="${1:-${ROOT_DIR}/build/TQ_Cat_Code.bin}"
VERSION_FILE="${ROOT_DIR}/version.txt"
fail() {
echo "Error: $1" >&2
exit 1
}
if [[ ! -f "${FIRMWARE_PATH}" ]]; then
fail "firmware binary not found: ${FIRMWARE_PATH}"
fi
# ESP-IDF places esp_app_desc_t at image offset 0x20. Its magic word is
# 0xABCD5432 and its 32-byte application version starts at offset 0x30.
APP_DESC_MAGIC="$(od -An -tx1 -j 32 -N 4 "${FIRMWARE_PATH}" | tr -d '[:space:]')"
if [[ "${APP_DESC_MAGIC}" != "3254cdab" ]]; then
fail "not a supported ESP-IDF application image: ${FIRMWARE_PATH}"
fi
FIRMWARE_VERSION="$(
dd if="${FIRMWARE_PATH}" bs=1 skip=48 count=32 2>/dev/null |
LC_ALL=C tr -d '\000'
)"
if [[ -z "${FIRMWARE_VERSION}" ]]; then
fail "firmware version is empty: ${FIRMWARE_PATH}"
fi
SIZE_BYTES="$(wc -c < "${FIRMWARE_PATH}" | tr -d '[:space:]')"
if command -v sha256sum >/dev/null 2>&1; then
SHA256="$(sha256sum "${FIRMWARE_PATH}" | awk '{print $1}')"
elif command -v shasum >/dev/null 2>&1; then
SHA256="$(shasum -a 256 "${FIRMWARE_PATH}" | awk '{print $1}')"
else
fail "neither sha256sum nor shasum is available"
fi
echo "version=${FIRMWARE_VERSION}"
echo "sizeBytes=${SIZE_BYTES}"
echo "sha256=${SHA256}"
if [[ -f "${VERSION_FILE}" ]]; then
SOURCE_VERSION="$(tr -d '\r\n' < "${VERSION_FILE}")"
if [[ -n "${SOURCE_VERSION}" && "${SOURCE_VERSION}" != "${FIRMWARE_VERSION}" ]]; then
echo "Warning: version.txt=${SOURCE_VERSION}, but the binary contains ${FIRMWARE_VERSION}; rebuild the firmware." >&2
fi
fi