From b1fde2aa5ba9336b8a4cba2a866ae8fce990737c Mon Sep 17 00:00:00 2001 From: David Jablonski Date: Mon, 18 Oct 2021 15:45:55 +0200 Subject: [PATCH] openocd: added script to reset devices --- CMakeLists.txt | 1 + config/freertos/nucleo_f446re/reset.sh | 17 +++++ config/freertos/nucleo_f446ze/reset.sh | 17 +++++ config/freertos/nucleo_f746zg/reset.sh | 17 +++++ config/freertos/nucleo_f767zi/reset.sh | 17 +++++ config/freertos/olimex-stm32-e407/reset.sh | 19 ++++++ config/host/generic/reset.sh | 2 + config/nuttx/generic/reset.sh | 32 ++++++++++ config/raspbian/generic/flash.sh | 0 config/zephyr/generic/reset.sh | 74 ++++++++++++++++++++++ scripts/reset_firmware.sh | 34 ++++++++++ 11 files changed, 230 insertions(+) create mode 100755 config/freertos/nucleo_f446re/reset.sh create mode 100755 config/freertos/nucleo_f446ze/reset.sh create mode 100755 config/freertos/nucleo_f746zg/reset.sh create mode 100755 config/freertos/nucleo_f767zi/reset.sh create mode 100755 config/freertos/olimex-stm32-e407/reset.sh create mode 100755 config/host/generic/reset.sh create mode 100755 config/nuttx/generic/reset.sh mode change 100644 => 100755 config/raspbian/generic/flash.sh create mode 100755 config/zephyr/generic/reset.sh create mode 100755 scripts/reset_firmware.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index 031e2e83..be1dafe8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,6 +45,7 @@ install( scripts/create_firmware_ws.sh scripts/configure_firmware.sh scripts/flash_firmware.sh + scripts/reset_firmware.sh scripts/build_firmware.sh scripts/build_agent.sh scripts/yaml_filter.py diff --git a/config/freertos/nucleo_f446re/reset.sh b/config/freertos/nucleo_f446re/reset.sh new file mode 100755 index 00000000..e59eff6f --- /dev/null +++ b/config/freertos/nucleo_f446re/reset.sh @@ -0,0 +1,17 @@ +EXTENSIONS_DIR=$FW_TARGETDIR/freertos_apps/microros_nucleo_f446re_extensions + +pushd $EXTENSIONS_DIR > /dev/null + +echo "Resetting firmware for $RTOS platform $PLATFORM" +if lsusb -d 0483:374b; then + ST_INTERFACE=interface/stlink-v2-1.cfg +elif lsusb -d 0483:3748; then + ST_INTERFACE=interface/stlink-v2.cfg +else +# TODO: add stlink v3, should it be stlink.cfg ? + echo "Error. Unsuported OpenOCD USB programmer" + exit 1 +fi +openocd -f $ST_INTERFACE -f target/stm32f4x.cfg -c init -c "reset halt" -c "reset" -c "exit" + +popd > /dev/null diff --git a/config/freertos/nucleo_f446ze/reset.sh b/config/freertos/nucleo_f446ze/reset.sh new file mode 100755 index 00000000..6a0fa6eb --- /dev/null +++ b/config/freertos/nucleo_f446ze/reset.sh @@ -0,0 +1,17 @@ +EXTENSIONS_DIR=$FW_TARGETDIR/freertos_apps/microros_nucleo_f446ze_extensions + +pushd $EXTENSIONS_DIR > /dev/null + +echo "Resetting firmware for $RTOS platform $PLATFORM" +if lsusb -d 0483:374b; then + ST_INTERFACE=interface/stlink-v2-1.cfg +elif lsusb -d 0483:3748; then + ST_INTERFACE=interface/stlink-v2.cfg +else +# TODO: add stlink v3, should it be stlink.cfg ? + echo "Error. Unsuported OpenOCD USB programmer" + exit 1 +fi +openocd -f $ST_INTERFACE -f target/stm32f4x.cfg -c init -c "reset halt" -c "reset" -c "exit" + +popd > /dev/null diff --git a/config/freertos/nucleo_f746zg/reset.sh b/config/freertos/nucleo_f746zg/reset.sh new file mode 100755 index 00000000..4d0c09a3 --- /dev/null +++ b/config/freertos/nucleo_f746zg/reset.sh @@ -0,0 +1,17 @@ +EXTENSIONS_DIR=$FW_TARGETDIR/freertos_apps/microros_nucleo_f746zg_extensions + +pushd $EXTENSIONS_DIR > /dev/null + +echo "Resetting firmware for $RTOS platform $PLATFORM" +if lsusb -d 0483:374b; then + ST_INTERFACE=interface/stlink-v2-1.cfg +elif lsusb -d 0483:3748; then + ST_INTERFACE=interface/stlink-v2.cfg +else +# TODO: add stlink v3, should it be stlink.cfg ? + echo "Error. Unsuported OpenOCD USB programmer" + exit 1 +fi +openocd -f $ST_INTERFACE -f target/stm32f4x.cfg -c init -c "reset halt" -c "reset" -c "exit" + +popd > /dev/null diff --git a/config/freertos/nucleo_f767zi/reset.sh b/config/freertos/nucleo_f767zi/reset.sh new file mode 100755 index 00000000..49e6d8f5 --- /dev/null +++ b/config/freertos/nucleo_f767zi/reset.sh @@ -0,0 +1,17 @@ +EXTENSIONS_DIR=$FW_TARGETDIR/freertos_apps/microros_nucleo_f767zi_extensions + +pushd $EXTENSIONS_DIR > /dev/null + +echo "Resetting firmware for $RTOS platform $PLATFORM" +if lsusb -d 0483:374b; then + ST_INTERFACE=interface/stlink-v2-1.cfg +elif lsusb -d 0483:3748; then + ST_INTERFACE=interface/stlink-v2.cfg +else +# TODO: add stlink v3, should it be stlink.cfg ? + echo "Error. Unsuported OpenOCD USB programmer" + exit 1 +fi +openocd -f $ST_INTERFACE -f target/stm32f4x.cfg -c init -c "reset halt" -c "reset" -c "exit" + +popd > /dev/null diff --git a/config/freertos/olimex-stm32-e407/reset.sh b/config/freertos/olimex-stm32-e407/reset.sh new file mode 100755 index 00000000..03a97532 --- /dev/null +++ b/config/freertos/olimex-stm32-e407/reset.sh @@ -0,0 +1,19 @@ +OLIMEX_EXTENSIONS_DIR=$FW_TARGETDIR/freertos_apps/microros_olimex_e407_extensions + +pushd $OLIMEX_EXTENSIONS_DIR > /dev/null + +if lsusb -d 15BA:002a; then + PROGRAMMER=interface/ftdi/olimex-arm-usb-tiny-h.cfg +elif lsusb -d 15BA:0003;then + PROGRAMMER=interface/ftdi/olimex-arm-usb-ocd.cfg +elif lsusb -d 15BA:002b;then + PROGRAMMER=interface/ftdi/olimex-arm-usb-ocd-h.cfg +else + echo "Error. Unsuported OpenOCD USB programmer" + exit 1 +fi + +openocd -f $PROGRAMMER -f target/stm32f4x.cfg -c init -c "reset halt" -c "reset" -c "exit" + +popd > /dev/null + diff --git a/config/host/generic/reset.sh b/config/host/generic/reset.sh new file mode 100755 index 00000000..72cd7cd9 --- /dev/null +++ b/config/host/generic/reset.sh @@ -0,0 +1,2 @@ +echo "Nothing to reset: running in host mode" +echo "Use 'RMW_IMPLEMENTATION=rmw_microxrcedds ros2 run micro_ros_demos_rcl int32_subscriber' to start with examples" diff --git a/config/nuttx/generic/reset.sh b/config/nuttx/generic/reset.sh new file mode 100755 index 00000000..d278c5a1 --- /dev/null +++ b/config/nuttx/generic/reset.sh @@ -0,0 +1,32 @@ +#! /bin/bash + +set -e +set -o nounset +set -o pipefail + + +pushd $FW_TARGETDIR/NuttX > /dev/null + +if [ "$PLATFORM" = "olimex-stm32-e407" ]; then + echo "Resetting firmware for $RTOS platform $PLATFORM" + + if lsusb -d 15BA:002a; then + PROGRAMMER=interface/ftdi/olimex-arm-usb-tiny-h.cfg + elif lsusb -d 15BA:0003;then + PROGRAMMER=interface/ftdi/olimex-arm-usb-ocd.cfg + elif lsusb -d 15BA:002b;then + PROGRAMMER=interface/ftdi/olimex-arm-usb-ocd-h.cfg + elif lsusb -d 0483:3748;then + PROGRAMMER=interface/stlink-v2.cfg + else + echo "Error. Unsuported OpenOCD USB programmer" + exit 1 + fi + + openocd -f $PROGRAMMER -f target/stm32f4x.cfg -c init -c "reset halt" -c "reset" -c "exit" +else + echo "Unrecognized board: $PLATFORM" + exit 1 +fi + +popd > /dev/null diff --git a/config/raspbian/generic/flash.sh b/config/raspbian/generic/flash.sh old mode 100644 new mode 100755 diff --git a/config/zephyr/generic/reset.sh b/config/zephyr/generic/reset.sh new file mode 100755 index 00000000..11d413b2 --- /dev/null +++ b/config/zephyr/generic/reset.sh @@ -0,0 +1,74 @@ +pushd $FW_TARGETDIR > /dev/null + +ZEPHYR_BUILD_DIR="$FW_TARGETDIR/build/zephyr" + +# Host platform (=native_posix) is special, as resetting is stopping and re-executing the binary +if [ "$PLATFORM" = "host" ]; then + + # TODO: stop the previous process + $ZEPHYR_BUILD_DIR/zephyr.exe + +else + + # These boards need special openocd rules + RESET_OPENOCD=false + if [ "$PLATFORM" = "olimex-stm32-e407" ]; then + + RESET_OPENOCD=true + OPENOCD_TARGET="stm32f4x.cfg" + if lsusb -d 15BA:002a; then + OPENOCD_PROGRAMMER=interface/ftdi/olimex-arm-usb-tiny-h.cfg + elif lsusb -d 15BA:0003;then + OPENOCD_PROGRAMMER=interface/ftdi/olimex-arm-usb-ocd.cfg + elif lsusb -d 15BA:002b;then + OPENOCD_PROGRAMMER=interface/ftdi/olimex-arm-usb-ocd-h.cfg + else + echo "Error: Unsuported OpenOCD USB programmer" + exit 1 + fi + + elif [ "$PLATFORM" = "nucleo_f446re" ]; then + + RESET_OPENOCD=true + OPENOCD_TARGET="stm32f4x.cfg" + + if lsusb -d 0483:374b;then + OPENOCD_PROGRAMMER=interface/stlink-v2-1.cfg + else + echo "Error: Unsupported OpenOCD programmer" + exit 1 + fi + + elif [ "$PLATFORM" = "nucleo_h743zi" ]; then + + RESET_OPENOCD=true + OPENOCD_TARGET="stm32h7x.cfg" + + if lsusb -d 0483:374e;then + OPENOCD_PROGRAMMER=interface/stlink.cfg + else + echo "Error: Unsupported OpenOCD programmer" + exit 1 + fi + + fi + + + + if [ "$RESET_OPENOCD" = true ]; then + + openocd -f $OPENOCD_PROGRAMMER -f target/$OPENOCD_TARGET \ + -c init \ + -c "reset halt" \ + -c "reset run; exit" + + else + + echo "Error: Resetting device is only supported with OpenOCD" + exit 1 + + fi + +fi + +popd > /dev/null diff --git a/scripts/reset_firmware.sh b/scripts/reset_firmware.sh new file mode 100755 index 00000000..a8d83f8e --- /dev/null +++ b/scripts/reset_firmware.sh @@ -0,0 +1,34 @@ +#! /bin/bash + +set -e +set -o nounset +set -o pipefail + +FW_TARGETDIR=$(pwd)/firmware +PREFIX=$(ros2 pkg prefix micro_ros_setup) + +# Checking if firmware exists +if [ -d $FW_TARGETDIR ]; then + RTOS=$(head -n1 $FW_TARGETDIR/PLATFORM) + PLATFORM=$(head -n2 firmware/PLATFORM | tail -n1) +else + echo "Firmware folder not found. Please use ros2 run micro_ros_setup create_firmware_ws.sh to create a new project." + exit 1 +fi + +# Reset specific firmware +if [ $PLATFORM != "generic" ] && [ -d "$PREFIX/config/$RTOS/generic" ]; then + if [ -f $PREFIX/config/$RTOS/generic/reset.sh ]; then + echo "Resetting firmware for $RTOS platform $PLATFORM" + . $PREFIX/config/$RTOS/generic/reset.sh + else + echo "No reset step found for $RTOS platform $PLATFORM" + fi +else + if [ -f $PREFIX/config/$RTOS/$PLATFORM/reset.sh ]; then + echo "Resetting firmware for $RTOS platform $PLATFORM" + . $PREFIX/config/$RTOS/$PLATFORM/reset.sh + else + echo "No reset step found for $RTOS platform $PLATFORM" + fi +fi