#!/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."