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