Initial assumption with Arduino 101 was that the "alternate setting name of the DFU interface" would be simple enough to be used as the grep pattern when attempting to find the board in DFU mode. However, for boards such as the 96Boards Carbon, this name includes grep meta-characters, so the DFUUTIL_ALT environment variable is provided as a numeric value, instead of the previously expected name string. In order to avoid false positives, we now check whether DFUUTIL_ALT is a numeric value, and the grep pattern is adjusted accordingly to search for either "alt=" or "name=". Also take into account that the name might contain spaces. Change-Id: I81351d03bd727b35093fd1280e2b8b6904f3c89b Signed-off-by: Patrice Buriez <patrice.buriez@intel.com>
87 lines
2.2 KiB
Bash
Executable File
87 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
|
|
}
|
|
|
|
CMD=$1
|
|
shift
|
|
|
|
case "$CMD" in
|
|
flash)
|
|
do_flash "$@"
|
|
;;
|
|
*)
|
|
echo "Unsupported command '$CMD'"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|