Boot Linux faster!

Check our new training course

Boot Linux faster!

Check our new training course
and Creative Commons CC-BY-SA
lecture and lab materials

Bootlin logo

Elixir Cross Referencer

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