zephyr/scripts/support/dfuutil.sh

92 lines
2.2 KiB
Bash
Executable File

#!/bin/sh
# This script is inspired from ./openocd.sh, and from both flash_dfu.sh and
# fwversion.sh, included in arduino101-factory_recovery-flashpack.tar.bz2,
# which is available from https://downloadcenter.intel.com/download/25470
# It requires the following environment variables to be defined, typically
# exported from Makefile.board:
# - DFUUTIL_PID: vendor_ID:product_ID of the board in DFU mode
# - DFUUTIL_ALT: alternate setting name or number of the DFU interface
# - DFUUTIL_IMG: path to the binary image sent to the board
# - DFUUTIL_DFUSE_ADDR: target address, for DfuSe devices
DFUUTIL_EXE=${DFUUTIL:-dfu-util}
DFUUTIL_CMD="$DFUUTIL_EXE -d,$DFUUTIL_PID"
# Is DFUUTIL_ALT a numeric value?
num=$(printf '%u' "$DFUUTIL_ALT" 2>/dev/null)
if [ $? -eq 0 -a "$num" = "$DFUUTIL_ALT" ]; then
# alternate setting number
pattern=", alt=$DFUUTIL_ALT,"
else
# alternate setting name
pattern=", name=\"$DFUUTIL_ALT\","
fi
test_exe() {
if ! which $DFUUTIL_EXE >/dev/null 2>&1; then
echo "Error: Unable to locate dfu-util executable: $DFUUTIL_EXE"
exit 1
fi
}
test_img() {
if [ ! -f "$DFUUTIL_IMG" ]; then
echo "Error: Unable to locate binary image: $DFUUTIL_IMG"
exit 1
fi
}
find_dfu() {
$DFUUTIL_CMD -l |grep "$pattern" >/dev/null 2>&1
}
do_flash() {
test_exe
test_img
# Wait until DFU device is ready
reset_dfu=0
if ! find_dfu; then
reset_dfu=1
echo "Please reset your board to switch to DFU mode..."
until find_dfu; do
sleep 0.1
done
fi
# Allow DfuSe based devices by checking for DFUUTIL_DFUSE_ADDR
if [ -n "${DFUUTIL_DFUSE_ADDR}" ]; then
DFUUTIL_CMD="${DFUUTIL_CMD} -s ${DFUUTIL_DFUSE_ADDR}:leave"
fi
# Flash DFU device with specified image
# Do NOT reset with -R, to avoid random 'error resetting after download'
$DFUUTIL_CMD -a "$DFUUTIL_ALT" -D $DFUUTIL_IMG
ok=$?
if [ $ok -eq 0 -a $reset_dfu -eq 1 ]; then
echo "Now reset your board again to switch back to runtime mode."
fi
return $ok
}
if [ "$KBUILD_VERBOSE" -eq 1 ]
then
set -x
fi
CMD=$1
shift
case "$CMD" in
flash)
do_flash "$@"
;;
*)
echo "Unsupported command '$CMD'"
exit 1
;;
esac