124 lines
5.3 KiB
Bash
Executable File
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."
|