Files
CelloEffects/gcc/ncp_update.sh
T
2026-10-24 00:14:53 +02:00

124 lines
5.3 KiB
Bash
Executable File

#!/usr/bin/env bash
# Met a jour le firmware du module ST67W611M1 de la X-NUCLEO-67W61M1 depuis la STM32H7S78-DK.
#
# Les scripts de X-CUBE-ST67W61 ne supportent que quelques cartes NUCLEO. Ici la DK joue le role
# de passerelle : gcc/ncp_loader recopie le port serie virtuel du ST-LINK vers l'UART du module
# (et le met en mode telechargement), puis l'outil QConn_Flash du pack ecrit le firmware.
#
# Usage: gcc/ncp_update.sh [version] [--yes]
# version version du firmware "mission profile T01" (defaut : la plus recente du pack)
# --yes ne pas demander de confirmation
#
# ATTENTION : le binaire du module est signe ; son chargement VERROUILLE le module s'il ne l'est
# pas deja. Operation irreversible.
#
# Deroulement : compile la passerelle -> la charge dans la flash interne de la DK (a la place du Boot)
# -> flashe le module -> RESTAURE le Boot (gcc/flash.sh boot). L'Appli en flash externe n'est pas touchee.
# Prerequis : la X-NUCLEO montee sur l'Arduino, DK branchee en USB (CN7), aucun debug ouvert.
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT"
# shellcheck source=toolchain-env.sh
source "$ROOT/gcc/toolchain-env.sh"
RED=$'\033[0;31m'; NC=$'\033[0m'
VERSION=""
ASSUME_YES=0
for arg in "$@"; do
case "$arg" in
--yes|-y) ASSUME_YES=1 ;;
*) VERSION="$arg" ;;
esac
done
die() { echo "${RED}erreur: $*${NC}" >&2; exit 1; }
# --- outils -----------------------------------------------------------------------------------
PACK="$(ls -d "$HOME"/STM32Cube/Repository/Packs/STMicroelectronics/X-CUBE-ST67W61/* 2>/dev/null | tail -1)"
[[ -n "$PACK" ]] || die "pack X-CUBE-ST67W61 introuvable (~/STM32Cube/Repository/Packs/STMicroelectronics)"
BIN_DIR="$PACK/Projects/ST67W6X_Scripts/Binaries"
NCP_DIR="$BIN_DIR/NCP_Binaries"
QCONN="$BIN_DIR/QConn_Flash/QConn_Flash_Cmd-ubuntu"
CLI="${ST_PROGRAMMER_BIN:-}/STM32_Programmer_CLI"
[[ -x "$CLI" ]] || die "STM32_Programmer_CLI introuvable (STM32CubeIDE dans ~/st ?)"
[[ -f "$QCONN" ]] || die "outil QConn_Flash introuvable : $QCONN"
if [[ ! -x "$QCONN" ]]; then
echo "QConn_Flash n'est pas executable : chmod +x $QCONN"
chmod +x "$QCONN"
fi
# --- version du firmware ----------------------------------------------------------------------
PREFIX="st67w611m_mission_t01"
if [[ -z "$VERSION" ]]; then
VERSION="$(ls "$NCP_DIR"/${PREFIX}_v*.bin 2>/dev/null | sed -n "s#^.*/${PREFIX}_v\([0-9][0-9.]*\)\.bin\$#\1#p" | sort -V | tail -n 1)"
fi
FW="${PREFIX}_v${VERSION}.bin"
[[ -f "$NCP_DIR/$FW" ]] || die "firmware introuvable : $NCP_DIR/$FW"
echo "Firmware du module : $FW"
echo "Pack : $PACK"
# --- confirmation -----------------------------------------------------------------------------
echo "${RED}##########################################################${NC}"
echo "${RED}# Un binaire SIGNE va etre charge dans le module ST67W611M. #${NC}"
echo "${RED}# Il sera VERROUILLE s'il ne l'est pas deja (irreversible). #${NC}"
echo "${RED}##########################################################${NC}"
if [[ "$ASSUME_YES" -ne 1 ]]; then
read -r -p "Continuer ? (Y/N) " answer
[[ "$answer" == "Y" || "$answer" == "y" ]] || { echo "Abandon."; exit 1; }
fi
# --- 1. passerelle ----------------------------------------------------------------------------
echo ">>> Compilation de la passerelle"
make -f gcc/makefile_ncp_loader
LOADER_HEX="$ROOT/gcc/ncp_loader/build/ncp_loader.hex"
# Quoi qu'il arrive ensuite, la DK ne doit pas rester avec la passerelle a la place du Boot.
restore_boot() {
echo ">>> Restauration du Boot de la DK"
if [[ -f "$ROOT/Boot/TouchGFX/build/bin/target.hex" ]]; then
"$ROOT/gcc/flash.sh" boot || echo "${RED}Boot non restaure : lance 'gcc/flash.sh boot' a la main${NC}"
else
echo "${RED}Boot non compile : lance 'make -C gcc -f makefile_boot all' puis 'gcc/flash.sh boot'${NC}"
fi
}
GENERATED_CFG=""
cleanup() {
[[ -n "$GENERATED_CFG" && -f "$GENERATED_CFG" ]] && rm -f "$GENERATED_CFG"
restore_boot
}
trap cleanup EXIT
echo ">>> Chargement de la passerelle dans la DK"
"$CLI" -c port=SWD ap=1 mode=UR -d "$LOADER_HEX" -v -hardRst
# --- 2. port serie virtuel du ST-LINK ---------------------------------------------------------
sleep 1
COMNAME="$(ls /dev/serial/by-id/ 2>/dev/null | grep -i "STLINK-V3" | head -n 1 || true)"
[[ -n "$COMNAME" ]] || die "port serie du ST-LINK non detecte (/dev/serial/by-id)"
COMPORT="$(readlink -f "/dev/serial/by-id/$COMNAME")"
echo "Port serie : $COMPORT"
stty -F "$COMPORT" 2000000 cs8 -cstopb -parenb || die "port serie deja utilise (ferme tout terminal ou debug)"
sleep 1
stty -F "$COMPORT" 2000000 cs8 -cstopb -parenb
# --- 3. configuration de flash (meme principe que le script ST) -------------------------------
GENERATED_CFG="$NCP_DIR/mission_t01_flash_prog_cfg_auto.ini"
sed "s#^filedir[[:space:]]*=[[:space:]]*\./${PREFIX}_v.*\.bin[[:space:]]*\$#filedir = ./${FW}#" \
"$NCP_DIR/mission_t01_flash_prog_cfg.ini" > "$GENERATED_CFG"
# --- 4. flash du module -----------------------------------------------------------------------
echo ">>> Flash du module en cours ..."
attempt=0
until "$QCONN" --port "$COMPORT" --config "$GENERATED_CFG" --efuse="$NCP_DIR/efusedata.bin"; do
attempt=$((attempt + 1))
[[ "$attempt" -lt 2 ]] || die "echec du flash du module"
echo "QConn_Flash a echoue, nouvel essai ..."
sleep 1
done
echo "${NC}>>> Firmware $FW installe."