--- /dev/null
+#!/bin/bash
+
+_usage()
+{
+ echo "Usage: $0 /path/to/firmware.hex"
+}
+
+_check_bootloader_device()
+{
+ cec_adapter=`lsusb | grep "03eb:2ffa" | wc -l`
+ if [ $cec_adapter -eq 0 ]; then
+ _enter_bootloader
+ cec_adapter=`lsusb | grep "03eb:2ffa" | wc -l`
+ fi
+
+ if [ $cec_adapter -eq 0 ]; then
+ echo "ERROR: failed to find any CEC adapter in bootloader mode"
+ return 1
+ fi
+
+ return 0
+}
+
+_enter_bootloader()
+{
+ echo "Instructing the CEC adapter to enter bootloader mode"
+ cec_adapter=`lsusb | grep "2548:1001" | wc -l`
+ if [ $cec_adapter -gt 0 ]; then
+ echo "bl" | cec-client -s -d 2
+ echo "Waiting for the device to reinitialise"
+ sleep 5
+ fi
+}
+
+_flash()
+{
+ file=$1
+
+ if [ ! -f "$file" ]; then
+ echo "ERROR: firmware file '$file' does not exist"
+ exit 1
+ fi
+
+ cat << EOB
+Flash '$file' onto the CEC adapter
+
+DO NOT POWER OFF OR DISCONNECT THE DEVICE WHILE THIS OPERATION IS IN PROGRESS!
+
+
+Are you sure you want to flash '$file' onto the CEC adapter?
+Type 'do it!' if you're sure. Anything else will cancel the operation.
+
+EOB
+ read confirmation
+ if [ ! "$confirmation" == "do it!" ]; then
+ echo "Exiting"
+ exit 0
+ fi
+
+ _prereq
+ if [ $? -eq 1 ]; then
+ exit 1
+ fi
+
+ _check_bootloader_device
+ if [ $? -eq 1 ]; then
+ exit 1
+ fi
+
+
+ echo "Erasing the previous firmware"
+ sudo dfu-programmer at90usb162 erase
+
+ echo "Flashing the new firmware"
+ sudo dfu-programmer at90usb162 flash "$file"
+
+ cat << EOB
+
+===============================================================================
+
+Done!
+
+Remove the USB cable from the device and reconnect it to use the new firmware.
+
+EOB
+ exit 0
+}
+
+_prereq()
+{
+ programmer=`which dfu-programmer`
+ if [ -z "$programmer" ]; then
+ echo "dfu-programmer was not found in your path, installing"
+ sudo apt-get install -y dfu-programmer
+ fi
+
+ programmer=`which dfu-programmer`
+ if [ -z "$programmer" ]; then
+ echo "ERROR: failed to find dfu-programmer"
+ return 1
+ fi
+ return 0
+}
+
+
+cat << EOB
+===============================================================================
+ Pulse-Eight CEC Adapter firmware flash tool
+===============================================================================
+
+EOB
+
+if [ -z "$1" ]; then
+ _usage
+else
+ _flash $1
+fi
+
+exit 0