summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim <cpldcpu@gmail.com>2015-06-06 22:40:52 +0200
committerTim <cpldcpu@gmail.com>2015-06-06 22:40:52 +0200
commit1548e70077127c079a801c396e2d790763b23e08 (patch)
tree233cd87a07fd1fdbb91d710e9870dd9a28111d2b
parent21d57991d6b321e1cc3690df9addb3b26e4145aa (diff)
parentf0bb13678d45c2c87fb3439aef50e92de1f0e52b (diff)
downloadmicronucleus-1548e70077127c079a801c396e2d790763b23e08.tar.gz
micronucleus-1548e70077127c079a801c396e2d790763b23e08.tar.bz2
micronucleus-1548e70077127c079a801c396e2d790763b23e08.zip
Merge pull request #43 from micronucleus/testing-V2-New
First release of V2.0 to master.
-rw-r--r--.gitignore3
-rw-r--r--Devices_with_Micronucleus.md27
-rw-r--r--Readme.txt140
-rw-r--r--commandline/Makefile5
-rwxr-xr-xcommandline/builds/OSX/micronucleusbin124292 -> 0 bytes
-rw-r--r--[-rwxr-xr-x]commandline/builds/Windows/micronucleus.exebin26126 -> 27662 bytes
-rw-r--r--commandline/library/micronucleus_lib.c173
-rw-r--r--commandline/library/micronucleus_lib.h16
-rw-r--r--commandline/micronucleus.c66
-rw-r--r--commandline/micronucleus.exebin0 -> 27662 bytes
-rw-r--r--firmware/Makefile218
-rw-r--r--firmware/configuration/Nanite841/Makefile.inc60
-rw-r--r--firmware/configuration/Nanite841/bootloaderconfig.h271
-rw-r--r--firmware/configuration/t167_default/Makefile.inc21
-rw-r--r--firmware/configuration/t167_default/bootloaderconfig.h275
-rw-r--r--firmware/configuration/t841_default/Makefile.inc60
-rw-r--r--firmware/configuration/t841_default/bootloaderconfig.h267
-rw-r--r--firmware/configuration/t84_default/Makefile.inc63
-rw-r--r--firmware/configuration/t84_default/bootloaderconfig.h265
-rw-r--r--firmware/configuration/t85_aggressive/Makefile.inc68
-rw-r--r--firmware/configuration/t85_aggressive/bootloaderconfig.h262
-rw-r--r--firmware/configuration/t85_default/Makefile.inc60
-rw-r--r--firmware/configuration/t85_default/bootloaderconfig.h (renamed from firmware/bootloaderconfig.h)256
-rw-r--r--firmware/crt1.S25
-rw-r--r--firmware/main.c439
-rw-r--r--firmware/makerelease.bat18
-rw-r--r--firmware/osccalASM.S133
-rw-r--r--firmware/releases/Nanite841.hex103
-rw-r--r--firmware/releases/micronucleus-1.02.hex256
-rw-r--r--firmware/releases/micronucleus-1.03-2secs.hex132
-rw-r--r--firmware/releases/micronucleus-1.03-5secs.hex132
-rw-r--r--firmware/releases/micronucleus-1.04-low-power.hex135
-rw-r--r--firmware/releases/micronucleus-1.04.hex133
-rw-r--r--firmware/releases/micronucleus-1.05-jumper.hex134
-rw-r--r--firmware/releases/micronucleus-1.05.hex134
-rw-r--r--firmware/releases/micronucleus-1.06-jumper-v2.hex137
-rw-r--r--firmware/releases/micronucleus-1.06.hex137
-rw-r--r--firmware/releases/micronucleus-1.10-ledpb1.hex122
-rw-r--r--firmware/releases/micronucleus-1.10.hex121
-rw-r--r--firmware/releases/micronucleus-1.11-entry_ext_reset.hex119
-rw-r--r--firmware/releases/micronucleus-1.11-entry_jumper_pb0.hex120
-rw-r--r--firmware/releases/micronucleus-1.11-ledpb1.hex119
-rw-r--r--firmware/releases/micronucleus-1.11.hex118
-rw-r--r--firmware/releases/release notes.txt158
-rw-r--r--firmware/releases/t167_default.hex89
-rw-r--r--firmware/releases/t841_default.hex101
-rw-r--r--firmware/releases/t84_default.hex98
-rw-r--r--firmware/releases/t85_aggressive.hex91
-rw-r--r--firmware/releases/t85_default.hex103
-rw-r--r--firmware/upgrade.c (renamed from upgrade/upgrade.c)0
-rw-r--r--firmware/usbconfig.h12
-rw-r--r--firmware/usbdrv/asmcommon.inc31
-rw-r--r--firmware/usbdrv/usbdrv.c70
-rw-r--r--firmware/usbdrv/usbdrvasm165.inc43
-rw-r--r--micronucleus-t85_winDriver.zipbin1136830 -> 0 bytes
-rw-r--r--ruby/dump.rb3
-rw-r--r--ruby/hex-to-bin.rb9
-rw-r--r--ruby/micronucleus.rb171
-rw-r--r--ruby/upload.rb33
-rw-r--r--upgrade/Makefile206
-rw-r--r--upgrade/bootloader_data.c11
-rw-r--r--upgrade/generate-data.rb39
-rw-r--r--upgrade/readme.txt34
-rw-r--r--upgrade/releases/micronucleus-1.03-upgrade.hex179
-rw-r--r--upgrade/releases/micronucleus-1.04-upgrade.hex180
-rw-r--r--upgrade/releases/micronucleus-1.05-jumper-upgrade.hex182
-rw-r--r--upgrade/releases/micronucleus-1.05-upgrade.hex181
-rw-r--r--upgrade/releases/micronucleus-1.06-jumper-v2-upgrade.hex185
-rw-r--r--upgrade/releases/micronucleus-1.06-upgrade.hex185
-rw-r--r--upgrade/releases/micronucleus-1.10-ledpb1-upgrade.hex168
-rw-r--r--upgrade/releases/micronucleus-1.10-upgrade.hex167
-rw-r--r--upgrade/releases/micronucleus-1.11-entry-ext-reset-upgrade.hex165
-rw-r--r--upgrade/releases/micronucleus-1.11-entry-jumper-pb0-upgrade.hex166
-rw-r--r--upgrade/releases/micronucleus-1.11-ledpb1-upgrade.hex165
-rw-r--r--upgrade/releases/micronucleus-1.11-upgrade.hex164
-rw-r--r--upgrade/technical details.txt51
-rw-r--r--upgrade/upgrade-prefix.hex1
-rw-r--r--upgrade/utils.h90
-rw-r--r--windows_driver/amd64/libusb0.dllbin0 -> 76384 bytes
-rw-r--r--windows_driver/amd64/libusb0.sysbin0 -> 52832 bytes
-rw-r--r--windows_driver/bin/amd64/install-filter-win.exebin0 -> 63488 bytes
-rw-r--r--windows_driver/bin/amd64/install-filter.exebin0 -> 44544 bytes
-rw-r--r--windows_driver/bin/amd64/libusb0.dllbin0 -> 76384 bytes
-rw-r--r--windows_driver/bin/amd64/libusb0.sysbin0 -> 52832 bytes
-rw-r--r--windows_driver/bin/amd64/testlibusb-win.exebin0 -> 15360 bytes
-rw-r--r--windows_driver/bin/amd64/testlibusb.exebin0 -> 10752 bytes
-rw-r--r--windows_driver/bin/ia64/install-filter-win.exebin0 -> 121344 bytes
-rw-r--r--windows_driver/bin/ia64/install-filter.exebin0 -> 87040 bytes
-rw-r--r--windows_driver/bin/ia64/libusb0.dllbin0 -> 157792 bytes
-rw-r--r--windows_driver/bin/ia64/libusb0.sysbin0 -> 110176 bytes
-rw-r--r--windows_driver/bin/ia64/testlibusb-win.exebin0 -> 33792 bytes
-rw-r--r--windows_driver/bin/ia64/testlibusb.exebin0 -> 30720 bytes
-rw-r--r--windows_driver/bin/inf-wizard.exebin0 -> 776192 bytes
-rw-r--r--windows_driver/bin/libusb-win32-bin-README.txt27
-rw-r--r--windows_driver/bin/x86/install-filter-win.exebin0 -> 57344 bytes
-rw-r--r--windows_driver/bin/x86/install-filter.exebin0 -> 46592 bytes
-rw-r--r--windows_driver/bin/x86/libusb0.sysbin0 -> 42592 bytes
-rw-r--r--windows_driver/bin/x86/libusb0_x86.dllbin0 -> 67680 bytes
-rw-r--r--windows_driver/bin/x86/testlibusb-win.exebin0 -> 14848 bytes
-rw-r--r--windows_driver/bin/x86/testlibusb.exebin0 -> 11264 bytes
-rw-r--r--windows_driver/ia64/libusb0.dllbin0 -> 157792 bytes
-rw-r--r--windows_driver/ia64/libusb0.sysbin0 -> 110176 bytes
-rw-r--r--windows_driver/installer_x64.exebin0 -> 25088 bytes
-rw-r--r--windows_driver/installer_x86.exebin0 -> 23552 bytes
-rw-r--r--windows_driver/license/libusb0/installer_license.txt851
-rw-r--r--windows_driver/micronucleus_bootloader.catbin0 -> 9090 bytes
-rw-r--r--windows_driver/micronucleus_bootloader.infbin0 -> 8176 bytes
-rw-r--r--windows_driver/x86/libusb0.sysbin0 -> 42592 bytes
-rw-r--r--windows_driver/x86/libusb0_x86.dllbin0 -> 67680 bytes
109 files changed, 4100 insertions, 5652 deletions
diff --git a/.gitignore b/.gitignore
index 933e699..e0b0020 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,6 @@
+*.o
+*.tmp
+*.raw
firmware/*.bin
commandline/littleWire_util.o
commandline/micronucleus
diff --git a/Devices_with_Micronucleus.md b/Devices_with_Micronucleus.md
new file mode 100644
index 0000000..b0bbc72
--- /dev/null
+++ b/Devices_with_Micronucleus.md
@@ -0,0 +1,27 @@
+
+# List of devices with Micronucleus (incomplete) #
+
+Micronucleus is widely used on thousands of open hardware product by different vendors. Please submit a pull request to add your own devices to this list, in case you design new hardware employing the Micronucleus bootloader.
+
+Please note that Micronucleus is a completely independent project and is not afilliated in any way with the vendors mentioned below.
+
+## ATtiny85 ##
+
+- [Digispark](http://digistump.com/products/1) by [Digistump](digistump.com) - Widely spread tiny USB Developmentboard with Arduino-Support.
+
+- [Olimexino 85](https://www.olimex.com/Products/Duino/AVR/open-source-hardware) by [Olimex](https://www.olimex.com) - Several different devboards fully assembled or as kits with USB interface
+
+- [Usblinky](https://metalab.at/wiki/Usblinky) by [Metalab](https://metalab.at) - Tiny USB controller for WS2812 RGB LEDs.
+
+- [Nanite 85](https://cpldcpu.wordpress.com/2014/04/25/the-nanite-85/) - Smallest useable ATtiny85 devboard. Approximates DIP ATtiny85 form factor.
+
+- [Wattuino Nanite 85](http://www.watterott.com/en/Wattuino-Nanite85) by [Watterott](http://www.watterott.com) - Manufacturable redesign of the Nanite 85
+
+- [BBtech ATtiny85 board](https://www.tindie.com/products/BBTech/attiny85-usb-development-tool-board/) - Well designed ATtiny85 board in Trinket form factor. Discontinued(?)
+
+## ATtiny 841 ##
+
+
+## ATtiny 167 ##
+
+- [Digispark Pro](http://digistump.com/products/109) by [Digistump](digistump.com) - Digispark successor with more I/O and memory \ No newline at end of file
diff --git a/Readme.txt b/Readme.txt
index ac2d7db..f058523 100644
--- a/Readme.txt
+++ b/Readme.txt
@@ -1,47 +1,123 @@
-Micronucleus
-=============
-Micronucleus is a bootloader designed for AVR tiny 85 chips with a minimal usb interface, cross platform libusb-based program upload tool, and a strong emphasis on bootloader compactness. The project aims to release a 2.0kb usb bootloader, and has reached this goal with the latest release. By using the tinyvector mechanism designed by Embedded Creations in their USBaspLoader-tiny85 project, combined with the simplicity of Objective Development's bootloadHID and a unique bare bones usb protocol, Micronucleus is the smallest usb bootloader available for tiny85 at the time of writing.
+Micronucleus V2.0b
+==================
-Micronucleus adds a small amount of delay to the Pin Change interrupt in user applications, but this latency is low enough to not interfere with V-USB applications. Once bootloaded, an ISP or HVSP programmer can disable the reset pin, offering an extra pin for GPIO and ADC use! After disabling the reset pin functionality, of course you will no longer be able to use ISP programmers with the chip, but that's okay because we made a neat 'upgrade' program. The Upgrade program takes a compiled bootloader hex file and packs it in to an AVR program. You upload the 'upgrade' program via an existing micronucleus installation, any other bootloader, or via ISP or HVSP programmer, and once uploaded the upgrade program runs and writes over the bootloader and then installs a trampoline over it's own interrupt vector table, then reboots, launching the new bootloader. In this way users can change their bootloader to have bugfixes or different configurations like the 'jumper' versions without needing any programming tools.
+Micronucleus is a bootloader designed for AVR ATtiny microcontrollers with a minimal usb interface, cross platform libusb-based program upload tool, and a strong emphasis on bootloader compactness. To the authors knowledge this is, by far, the smallest USB bootloader for AVR ATtiny
-tiny85 does not offer any hardware bootloading support, and does not protect the bootloader from being accidentally overwritten by a misbehaving app. We recommend great caution if using flash self programming inside an uploaded program due to the potential of bricking.
+The V2.0 release is a complete rewrite of the firmware and offers significant improvements over V1.x:
-Micronucleus is now widely installed on over 40,000 Digispark devices from Digistump - a tiny unofficial arduino device, so you can be confident that micronucleus will be well supported in the future. Micronucleus is now also the recommended bootloader for Ihsan Kehribar's wonderful LittleWire devices, and can be successfully installed on to existing LittleWire's by uploading the 'upgrade' program via the old serial bootloader, then uploading the littlewire firmware via the micronucleus command line upload tool.
+ • Support for the entire ATtiny family instead of only ATtiny85.
+ • Much smaller size. All configurations are below 2kb.
+ • Interrupt free V-USB: no patching of the user program INT-vector anymore.
+ • Faster uploads due to new protocol.
+ • Far jmp also allows using ATtinies with more than 8kb flash.
+ • Many robustness improvements, such as compatibility to USB hubs and
+ less erratic time out behavior.
+
+Due to the many changes, also the upload tool had to be updated. The V2.0 upload tool is backwards compatible to the V1.X tool, though.
-Changes
+The last release of the V1.x can be found here: https://github.com/micronucleus/micronucleus/tree/v1.11
+
+
+Usage
+=====
+
+The bootloader allows uploading of new firmware via USB. In its usual configuration it is invoked at device reset and will identify to the host computer. If no communication is initiated by the host machine within a given time, the bootloader will time out and enter the user program, if one is present.
+
+For proper timing, the command line tool should to be started on the host computer _before_ the bootloader is invoked.
+
+Windows machines will need to install the libusb drivers found in the /windows_drivers folder. Clean Micronucleus devices without uploaded userprogram will not time out and allow sufficient time for proper driver installation. Linux and OS X do not require custom drivers.
+
+Please invoke the command line tool with "micronucleus -help" for a list of available options.
+
+The bootloader resides in the same memory as the user program, since the ATtiny series does not support a protected bootloader section. Therefore, special care has to be taken not to overwrite the bootloader if the user program uses the self programming features. The bootloader will patch itself into the reset vector of the user program. No other interrupt vectors are changed.
+
+
+Compiling
+=========
+
+Micronucleus can be configured to support all devices of the ATtiny series, with the exception of the reduced core ATtiny 4/5/9/10/20/40.
+
+To allow maximum flexibility, micronucleus supports a configuration system. To compile micronucleus with a specific configuration, please invoke the AVR-GCC tool-chain with:
+
+ make CONFIG=<config_name>
+
+Currently, the following configurations are included and tested. Please check the subfolders /firmware/configurations/ for details. Hex files can be found in /releases.
+
+t84_default - ATtiny84A default configuration - 1532 bytes
+t841_default - ATtiny841 default configuration - 1584 bytes
+t85_default - ATtiny85 default configuration - 1606 bytes
+t85_aggressive - ATtiny85 smaller size - critical - 1414 bytes
+t167_default - ATtiny167 default (uses xtal) - 1390 bytes
+Nanite841 - Nanite841 firmware - 1608 bytes
+
+You can add your own configuration by adding a new folder to /firmware/configurations/. The folder has to contain a customized "Makefile.inc" and "bootloaderconfig.h". Feel free to supply a pull request if you added and tested a previously unsupported device.
+
+If changes to the configuration lead to an increase in bootloader size, it may be necessary to change the bootloader start address. Please consult "Makefile.inc" for details.
+
+Other make options:
+
+ make CONFIG=<config_name> fuse # Configure fuses
+ make CONFIG=<config_name> flash # Uploade the bootloader using AVRDUDE
+
+There is also an option to disable the reset line and use it as an I/O. While it may seem tempting to use this feature to make an additional I/O pin available on the ATtiny85, we strongly discourage from doing so, as it led to many issues in the past.
+
+Please "make clean" when switching from one configuration to another.
+
+
+Devices using Micronucleus
+==========================
+
+Micronucleus is widely installed on thousands of open source hardware devices. Please find an incomplete list here:
+https://github.com/micronucleus/micronucleus/Devices_with_Microncleus.md
+
+
+License
=======
-This is release 1.11. Please use this at your own risk. The last official release for the DigiSpark is v1.06, which can be found here: https://github.com/micronucleus/micronucleus/tree/v1.06
-
-Changes compared to v1.10:
- • The size was reduced further to 1816 bytes, allowing 6380 bytes user space.
- (320 bytes more than in v1.06)
- • The bootloader will always start and never quit if no user program was loaded.
- This allows for much easier driver installation. Use the new "--erase-only"
- function of the command line tool to create a clean device.
- • New entrymodes have been added. See firmware release notes and source code
- comments for details.
- • All incoming data is now CRC checked to improve robustness.
+This project is released under the GPLv2 license. Code uploaded via the bootloader is not subject to any license.
+
+In addition, we'd like you to consider these points if you intend to sell products using micronucleus:
+
+ • Please make your hardware open source. At least the schematic needs to be
+ published according to the license inherited from V-USB.
+
+ • Your documentation should mention Micronucleus and include a link to the
+ main repository (https://github.com/micronucleus/)
+
+ • Please do not "rebrand" micronucleus by renaming the USB device.
-Changes compared to v1.06:
- • Major size optimization and code reorganization.
- • The size was reduced to 1878 bytes, allowing 6314 bytes user space
- (256 bytes more than in v1.06).
- • The bootloader will disconnect from USB on exit.
+ • Feel welcome to submit a pull request to include your product in the
+ "Devices using Micronucleus"-list.
-See release notes (/firmware/releases/release notes.txt) for details.
-
-@cpldcpu - Jan 14th, 2013
+
+Changes
+=======
+
+This pull request documents changes leading to V2.0: https://github.com/micronucleus/micronucleus/pull/43
-----------------------------------------------------------------------------------
+ • v2.0b June 6th, 2015
+Credits
+=======
+
+Firmware:
+
+ • Micronucleus V2.0 (c) 2015 Tim Bo"scke - cpldcpu@gmail.com
+ (c) 2014 Shay Green
+ • Original Micronucleus (c) 2012 Jenna Fox
+
+ • Based on USBaspLoader-tiny85 (c) 2012 Louis Beaudoin
+ • Based on USBaspLoader (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH
+
+Commandline tool:
+
+ • Original commandline tool (c) 2012 by ihsan Kehribar <ihsan@kehribar.me>
+ • Updates for V2.x (c) 2014 T. Bo"scke
+
Special Thanks:
- • Shay Green/@gblargg for numerous optimization ideas.
+
• Aaron Stone/@sodabrew for building the OS X command line tool and various fixes.
• Objective Development's great V-USB bitbanging usb driver
• Embedded Creations' pioneering and inspiring USBaspLoader-tiny85
• Digistump for motivation and contributing the VID/PID pair
- • Ihsan Kehribar for the command line C-based upload tool
-
-This project is released under the GPLv2 license. Code uploaded via the bootloader is not subject to any license issues.
-
+ \ No newline at end of file
diff --git a/commandline/Makefile b/commandline/Makefile
index 3c52cb4..e8aadfd 100644
--- a/commandline/Makefile
+++ b/commandline/Makefile
@@ -20,6 +20,11 @@ else ifeq ($(shell uname), Darwin)
# USBLIBS += -framework IOKit
# Uncomment these to create a dual architecture binary:
# OSFLAG += -arch x86_64 -arch i386
+else ifeq ($(shell uname), OpenBSD)
+ USBFLAGS=$(shell libusb-config --cflags || libusb-legacy-config --cflags)
+ USBLIBS=$(shell libusb-config --libs || libusb-legacy-config --libs)
+ EXE_SUFFIX =
+ OSFLAG = -D OPENBSD
else
USBFLAGS = -I C:\MinGW\include
USBLIBS = -L C:\MinGW\lib -lusb
diff --git a/commandline/builds/OSX/micronucleus b/commandline/builds/OSX/micronucleus
deleted file mode 100755
index 3ae62c4..0000000
--- a/commandline/builds/OSX/micronucleus
+++ /dev/null
Binary files differ
diff --git a/commandline/builds/Windows/micronucleus.exe b/commandline/builds/Windows/micronucleus.exe
index bfdb56b..aa4752f 100755..100644
--- a/commandline/builds/Windows/micronucleus.exe
+++ b/commandline/builds/Windows/micronucleus.exe
Binary files differ
diff --git a/commandline/library/micronucleus_lib.c b/commandline/library/micronucleus_lib.c
index 6e574f5..0569dbe 100644
--- a/commandline/library/micronucleus_lib.c
+++ b/commandline/library/micronucleus_lib.c
@@ -1,8 +1,10 @@
/*
Created: September 2012
- by ihsan Kehribar <ihsan@kehribar.me>
-
+ (c) 2012 by ihsan Kehribar <ihsan@kehribar.me>
+ Changes for Micronucleus protocol version V2.x
+ (c) 2014 T. Bo"scke
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
@@ -28,7 +30,7 @@
#include "micronucleus_lib.h"
#include "littleWire_util.h"
-micronucleus* micronucleus_connect() {
+micronucleus* micronucleus_connect(int fast_mode) {
micronucleus *nucleus = NULL;
struct usb_bus *busses;
@@ -60,17 +62,64 @@ micronucleus* micronucleus_connect() {
nucleus->device = usb_open(dev);
- // get nucleus info
- unsigned char buffer[4];
- int res = usb_control_msg(nucleus->device, 0xC0, 0, 0, 0, (char *)buffer, 4, MICRONUCLEUS_USB_TIMEOUT);
- assert(res >= 4);
-
- nucleus->flash_size = (buffer[0]<<8) + buffer[1];
- nucleus->page_size = buffer[2];
- nucleus->pages = (nucleus->flash_size / nucleus->page_size);
- if (nucleus->pages * nucleus->page_size < nucleus->flash_size) nucleus->pages += 1;
- nucleus->write_sleep = buffer[3];
- nucleus->erase_sleep = nucleus->write_sleep * nucleus->pages;
+ if (nucleus->version.major>=2) { // Version 2.x
+ // get nucleus info
+ unsigned char buffer[6];
+ int res = usb_control_msg(nucleus->device, USB_ENDPOINT_IN| USB_TYPE_VENDOR | USB_RECIP_DEVICE, 0, 0, 0, (char *)buffer, 6, MICRONUCLEUS_USB_TIMEOUT);
+
+ // Device descriptor was found, but talking to it was not succesful. This can happen when the device is being reset.
+ if (res<0) return NULL;
+
+ assert(res >= 6);
+
+ nucleus->flash_size = (buffer[0]<<8) + buffer[1];
+ nucleus->page_size = buffer[2];
+ nucleus->pages = (nucleus->flash_size / nucleus->page_size);
+ if (nucleus->pages * nucleus->page_size < nucleus->flash_size) nucleus->pages += 1;
+
+ nucleus->bootloader_start = nucleus->pages*nucleus->page_size;
+
+ if ((nucleus->version.major>=2)&&(!fast_mode)) {
+ // firmware v2 reports more aggressive write times. Add 2ms if fast mode is not used.
+ nucleus->write_sleep = (buffer[3] & 127) + 2;
+ } else {
+ nucleus->write_sleep = (buffer[3] & 127);
+ }
+
+ // if bit 7 of write sleep time is set, divide the erase time by four to
+ // accomodate to the 4*page erase of the ATtiny841/441
+ if (buffer[3]&128) {
+ nucleus->erase_sleep = nucleus->write_sleep * nucleus->pages / 4;
+ } else {
+ nucleus->erase_sleep = nucleus->write_sleep * nucleus->pages;
+ }
+
+ nucleus->signature1 = buffer[4];
+ nucleus->signature2 = buffer[5];
+
+ } else { // Version 1.x
+ // get nucleus info
+ unsigned char buffer[4];
+ int res = usb_control_msg(nucleus->device, USB_ENDPOINT_IN| USB_TYPE_VENDOR | USB_RECIP_DEVICE, 0, 0, 0, (char *)buffer, 4, MICRONUCLEUS_USB_TIMEOUT);
+
+ // Device descriptor was found, but talking to it was not succesful. This can happen when the device is being reset.
+ if (res<0) return NULL;
+
+ assert(res >= 4);
+
+ nucleus->flash_size = (buffer[0]<<8) + buffer[1];
+ nucleus->page_size = buffer[2];
+ nucleus->pages = (nucleus->flash_size / nucleus->page_size);
+ if (nucleus->pages * nucleus->page_size < nucleus->flash_size) nucleus->pages += 1;
+
+ nucleus->bootloader_start = nucleus->pages*nucleus->page_size;
+
+ nucleus->write_sleep = (buffer[3] & 127);
+ nucleus->erase_sleep = nucleus->write_sleep * nucleus->pages;
+
+ nucleus->signature1 = 0;
+ nucleus->signature2 = 0;
+ }
}
}
}
@@ -80,7 +129,7 @@ micronucleus* micronucleus_connect() {
int micronucleus_eraseFlash(micronucleus* deviceHandle, micronucleus_callback progress) {
int res;
- res = usb_control_msg(deviceHandle->device, 0xC0, 2, 0, 0, NULL, 0, MICRONUCLEUS_USB_TIMEOUT);
+ res = usb_control_msg(deviceHandle->device, USB_ENDPOINT_OUT| USB_TYPE_VENDOR | USB_RECIP_DEVICE, 2, 0, 0, NULL, 0, MICRONUCLEUS_USB_TIMEOUT);
// give microcontroller enough time to erase all writable pages and come back online
float i = 0;
@@ -122,6 +171,7 @@ int micronucleus_writeFlash(micronucleus* deviceHandle, unsigned int program_siz
unsigned int page_address; // address within this page when copying buffer
unsigned int res;
unsigned int pagecontainsdata;
+ unsigned int userReset;
for (address = 0; address < deviceHandle->flash_size; address += deviceHandle->page_size) {
// work around a bug in older bootloader versions
@@ -142,12 +192,99 @@ int micronucleus_writeFlash(micronucleus* deviceHandle, unsigned int program_siz
}
}
+ // Reset vector patching is done in the host tool in micronucleus >=2
+ if (deviceHandle->version.major >=2)
+ {
+ if ( address == 0 ) {
+ // save user reset vector (bootloader will patch with its vector)
+ unsigned int word0,word1;
+ word0 = page_buffer [1] * 0x100 + page_buffer [0];
+ word1 = page_buffer [3] * 0x100 + page_buffer [2];
+
+ if (word0==0x940c) { // long jump
+ userReset = word1;
+ } else if ((word0&0xf000)==0xc000) { // rjmp
+ userReset = (word0 & 0x0fff) - 0 + 1;
+ } else {
+ fprintf(stderr,
+ "The reset vector of the user program does not contain a branch instruction,\n"
+ "therefore the bootloader can not be inserted. Please rearrage your code.\n"
+ );
+ return -1;
+ }
+
+ // Patch in jmp to bootloader.
+ if (deviceHandle->bootloader_start > 0x2000) {
+ // jmp
+ unsigned data = 0x940c;
+ page_buffer [ 0 ] = data >> 0 & 0xff;
+ page_buffer [ 1 ] = data >> 8 & 0xff;
+ page_buffer [ 2 ] = deviceHandle->bootloader_start >> 0 & 0xff;
+ page_buffer [ 3 ] = deviceHandle->bootloader_start >> 8 & 0xff;
+ } else {
+ // rjmp
+ unsigned data = 0xc000 | ((deviceHandle->bootloader_start/2 - 1) & 0x0fff);
+ page_buffer [ 0 ] = data >> 0 & 0xff;
+ page_buffer [ 1 ] = data >> 8 & 0xff;
+ }
+
+ }
+
+ if ( address >= deviceHandle->bootloader_start - deviceHandle->page_size ) {
+ // move user reset vector to end of last page
+ // The reset vector is always the last vector in the tinyvectortable
+ unsigned int user_reset_addr = (deviceHandle->pages*deviceHandle->page_size) - 4;
+
+ if (user_reset_addr > 0x2000) {
+ // jmp
+ unsigned data = 0x940c;
+ page_buffer [user_reset_addr - address + 0] = data >> 0 & 0xff;
+ page_buffer [user_reset_addr - address + 1] = data >> 8 & 0xff;
+ page_buffer [user_reset_addr - address + 2] = userReset >> 0 & 0xff;
+ page_buffer [user_reset_addr - address + 3] = userReset >> 8 & 0xff;
+ } else {
+ // rjmp
+ unsigned data = 0xc000 | ((userReset - user_reset_addr/2 - 1) & 0x0fff);
+ page_buffer [user_reset_addr - address + 0] = data >> 0 & 0xff;
+ page_buffer [user_reset_addr - address + 1] = data >> 8 & 0xff;
+ }
+ }
+ }
+
+
// always write last page so bootloader can insert the tiny vector table
- if ( address >= deviceHandle->flash_size - deviceHandle->page_size )
+ if ( address >= deviceHandle->bootloader_start - deviceHandle->page_size )
pagecontainsdata = 1;
// ask microcontroller to write this page's data
if (pagecontainsdata) {
+
+ if (deviceHandle->version.major == 1) {
+ // Firmware rev.1 transfers a page as a single block
+ // ask microcontroller to write this page's data
+ res = usb_control_msg(deviceHandle->device,
+ USB_ENDPOINT_OUT| USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+ 1,
+ page_length, address,
+ page_buffer, page_length,
+ MICRONUCLEUS_USB_TIMEOUT);
+ } else if (deviceHandle->version.major >= 2) {
+ // Firmware rev.2 uses individual set up packets to transfer data
+ res = usb_control_msg(deviceHandle->device, USB_ENDPOINT_OUT| USB_TYPE_VENDOR | USB_RECIP_DEVICE, 1, page_length, address, NULL, 0, MICRONUCLEUS_USB_TIMEOUT);
+ if (res) return -1;
+ int i;
+
+ for (i=0; i< page_length; i+=4)
+ {
+ int w1,w2;
+ w1=(page_buffer[i+1]<<8)+(page_buffer[i+0]<<0);
+ w2=(page_buffer[i+3]<<8)+(page_buffer[i+2]<<0);
+
+ res = usb_control_msg(deviceHandle->device, USB_ENDPOINT_OUT| USB_TYPE_VENDOR | USB_RECIP_DEVICE, 3, w1, w2, NULL, 0, MICRONUCLEUS_USB_TIMEOUT);
+ if (res) return -1;
+ }
+ }
+ /*
res = usb_control_msg(deviceHandle->device,
USB_ENDPOINT_OUT| USB_TYPE_VENDOR | USB_RECIP_DEVICE,
1,
@@ -156,7 +293,7 @@ int micronucleus_writeFlash(micronucleus* deviceHandle, unsigned int program_siz
MICRONUCLEUS_USB_TIMEOUT);
if (res != page_length) return -1;
-
+ */
// give microcontroller enough time to write this page and come back online
delay(deviceHandle->write_sleep);
}
@@ -174,7 +311,7 @@ int micronucleus_writeFlash(micronucleus* deviceHandle, unsigned int program_siz
int micronucleus_startApp(micronucleus* deviceHandle) {
int res;
- res = usb_control_msg(deviceHandle->device, 0xC0, 4, 0, 0, NULL, 0, MICRONUCLEUS_USB_TIMEOUT);
+ res = usb_control_msg(deviceHandle->device, USB_ENDPOINT_OUT| USB_TYPE_VENDOR | USB_RECIP_DEVICE, 4, 0, 0, NULL, 0, MICRONUCLEUS_USB_TIMEOUT);
if(res!=0)
return -1;
diff --git a/commandline/library/micronucleus_lib.h b/commandline/library/micronucleus_lib.h
index 9118ace..b691fa4 100644
--- a/commandline/library/micronucleus_lib.h
+++ b/commandline/library/micronucleus_lib.h
@@ -3,7 +3,9 @@
/*
Created: September 2012
- by ihsan Kehribar <ihsan@kehribar.me>
+ (c) 2012 by ihsan Kehribar <ihsan@kehribar.me>
+ Changes for Micronucleus protocol version V2.x
+ (c) 2014 T. Bo"scke
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
@@ -44,11 +46,12 @@
#define MICRONUCLEUS_VENDOR_ID 0x16D0
#define MICRONUCLEUS_PRODUCT_ID 0x0753
#define MICRONUCLEUS_USB_TIMEOUT 0xFFFF
-#define MICRONUCLEUS_MAX_MAJOR_VERSION 1
+#define MICRONUCLEUS_MAX_MAJOR_VERSION 2
+
/*******************************************************************************/
/********************************************************************************
-* Declearations
+* Declarations
********************************************************************************/
//typedef usb_dev_handle micronucleus;
// representing version number of micronucleus device
@@ -57,6 +60,8 @@ typedef struct _micronucleus_version {
unsigned char minor;
} micronucleus_version;
+#define MICRONUCLEUS_COMMANDLINE_VERSION "Commandline tool version: 2.0a5"
+
// handle representing one micronucleus device
typedef struct _micronucleus {
usb_dev_handle *device;
@@ -64,9 +69,12 @@ typedef struct _micronucleus {
micronucleus_version version;
unsigned int flash_size; // programmable size (in bytes) of progmem
unsigned int page_size; // size (in bytes) of page
+ unsigned int bootloader_start; // Start of the bootloader
unsigned int pages; // total number of pages to program
unsigned int write_sleep; // milliseconds
unsigned int erase_sleep; // milliseconds
+ unsigned char signature1; // only used in protocol v2
+ unsigned char signature2; // only used in protocol v2
} micronucleus;
typedef void (*micronucleus_callback)(float progress);
@@ -77,7 +85,7 @@ typedef void (*micronucleus_callback)(float progress);
* Try to connect to the device
* Returns: device handle for success, NULL for fail
********************************************************************************/
-micronucleus* micronucleus_connect();
+micronucleus* micronucleus_connect(int fast_mode);
/*******************************************************************************/
/********************************************************************************
diff --git a/commandline/micronucleus.c b/commandline/micronucleus.c
index b7d49ab..14c1761 100644
--- a/commandline/micronucleus.c
+++ b/commandline/micronucleus.c
@@ -1,7 +1,9 @@
/*
- Created: September 2012
- by ihsan Kehribar <ihsan@kehribar.me>
-
+Created: September 2012
+ (c) 2012 by ihsan Kehribar <ihsan@kehribar.me>
+ Changes for Micronucleus protocol version V2.x
+ (c) 2014 T. Bo"scke
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
@@ -54,6 +56,7 @@ static char* progress_friendly_name; // name of progress section
static int dump_progress = 0; // output computer friendly progress info
static int use_ansi = 0; // output ansi control character stuff
static int erase_only = 0; // only erase, dont't write file
+static int fast_mode = 0; // normal mode adds 2ms to page writing times and waits longer for connect.
static int timeout = 0;
/*****************************************************************************/
@@ -69,17 +72,22 @@ int main(int argc, char **argv) {
int run = 0;
int file_type = FILE_TYPE_INTEL_HEX;
int arg_pointer = 1;
- char* usage = "usage: micronucleus [--run] [--dump-progress] [--type intel-hex|raw] [--no-ansi] [--timeout integer] [--erase-only] filename";
+ #if defined(WIN)
+ char* usage = "usage: micronucleus [--help] [--run] [--dump-progress] [--fast-mode] [--type intel-hex|raw] [--timeout integer] [--erase-only] filename";
+ #else
+ char* usage = "usage: micronucleus [--help] [--run] [--dump-progress] [--fast-mode] [--type intel-hex|raw] [--timeout integer] [--erase-only] filename [--no-ansi]";
+ #endif
progress_step = 0;
progress_total_steps = 5; // steps: waiting, connecting, parsing, erasing, writing, (running)?
dump_progress = 0;
erase_only = 0;
+ fast_mode=0;
timeout = 0; // no timeout by default
- //#if defined(WIN)
- // use_ansi = 0;
- //#else
+ #if defined(WIN)
+ use_ansi = 0;
+ #else
use_ansi = 1;
- //#endif
+ #endif
while (arg_pointer < argc) {
if (strcmp(argv[arg_pointer], "--run") == 0) {
@@ -104,19 +112,25 @@ int main(int argc, char **argv) {
puts(" for driving GUIs");
puts(" --erase-only: Erase the device without programming. Fills the");
puts(" program memory with 0xFFFF. Any files are ignored.");
+ puts(" --fast-mode: Speed up the timing of micronucleus. Do not use if");
+ puts(" you encounter USB errors. ");
puts(" --run: Ask bootloader to run the program when finished");
puts(" uploading provided program");
- //#ifndef WIN
+ #ifndef WIN
puts(" --no-ansi: Don't use ANSI in terminal output");
- //#endif
+ #endif
puts(" --timeout [integer]: Timeout after waiting specified number of seconds");
puts(" filename: Path to intel hex or raw data file to upload,");
puts(" or \"-\" to read from stdin");
+ puts("");
+ puts(MICRONUCLEUS_COMMANDLINE_VERSION);
return EXIT_SUCCESS;
} else if (strcmp(argv[arg_pointer], "--dump-progress") == 0) {
dump_progress = 1;
} else if (strcmp(argv[arg_pointer], "--no-ansi") == 0) {
use_ansi = 0;
+ } else if (strcmp(argv[arg_pointer], "--fast-mode") == 0) {
+ fast_mode = 1;
} else if (strcmp(argv[arg_pointer], "--erase-only") == 0) {
erase_only = 1;
progress_total_steps -= 1;
@@ -149,7 +163,7 @@ int main(int argc, char **argv) {
while (my_device == NULL) {
delay(100);
- my_device = micronucleus_connect();
+ my_device = micronucleus_connect(fast_mode);
time(&current_time);
if (timeout && start_time + timeout < current_time) {
@@ -164,28 +178,20 @@ int main(int argc, char **argv) {
printf("> Device is found!\n");
- // wait for CONNECT_WAIT milliseconds with progress output
- float wait = 0.0f;
- setProgressData("connecting", 2);
- while (wait < CONNECT_WAIT) {
- printProgress((wait / ((float) CONNECT_WAIT)) * 0.9f);
- wait += 50.0f;
- delay(50);
+ if (!fast_mode) {
+ // wait for CONNECT_WAIT milliseconds with progress output
+ float wait = 0.0f;
+ setProgressData("connecting", 2);
+ while (wait < CONNECT_WAIT) {
+ printProgress((wait / ((float) CONNECT_WAIT)) * 0.9f);
+ wait += 50.0f;
+ delay(50);
+ }
}
-
- //my_device = micronucleus_connect();
printProgress(1.0);
- // if (my_device->page_size == 64) {
- // printf("> Device looks like ATtiny85!\n");
- // } else if (my_device->page_size == 32) {
- // printf("> Device looks like ATtiny45!\n");
- // } else {
- // printf("> Unsupported device!\n");
- // return EXIT_FAILURE;
- // }
-
printf("> Device has firmware version %d.%d\n",my_device->version.major,my_device->version.minor);
+ if (my_device->signature1) printf("> Device signature: 0x1e%02x%02x \n",(int)my_device->signature1,(int)my_device->signature2);
printf("> Available space for user applications: %d bytes\n", my_device->flash_size);
printf("> Suggested sleep time between sending pages: %ums\n", my_device->write_sleep);
printf("> Whole page count: %d page size: %d\n", my_device->pages,my_device->page_size);
@@ -239,7 +245,7 @@ int main(int argc, char **argv) {
int deciseconds_till_reconnect_notice = 50; // notice after 5 seconds
while (my_device == NULL) {
delay(100);
- my_device = micronucleus_connect();
+ my_device = micronucleus_connect(fast_mode);
deciseconds_till_reconnect_notice -= 1;
if (deciseconds_till_reconnect_notice == 0) {
diff --git a/commandline/micronucleus.exe b/commandline/micronucleus.exe
new file mode 100644
index 0000000..c5aeedc
--- /dev/null
+++ b/commandline/micronucleus.exe
Binary files differ
diff --git a/firmware/Makefile b/firmware/Makefile
index 941310c..4574e0f 100644
--- a/firmware/Makefile
+++ b/firmware/Makefile
@@ -6,223 +6,93 @@
# Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH
# License: GNU GPL v2 (see License.txt)
+CONFIG ?= t85_default
+#CONFIG ?= t85_aggressive
+#CONFIG ?= t841_default
+#CONFIG ?= t167_default
+
###############################################################################
# Configure the following variables according to your AVR.
# Program the device with
# make fuse # to set the clock generator, boot section size etc.
# make flash # to load the boot loader into flash
-# make lock # to protect the boot loader from overwriting
-# make disablereset # for ATtiny85 target - to use external reset line for IO (CAUTION: this is not easy to enable again, see README)
-
-F_CPU = 16500000
-DEVICE = attiny85
-FUSEOPT = $(FUSEOPT_t85)
-LOCKOPT = -U lock:w:0x2f:m
-
-# hexadecimal address for bootloader section to begin. To calculate the best value:
-# - make clean; make main.hex; ### output will list data: 2124 (or something like that)
-# - for the size of your device (8kb = 1024 * 8 = 8192) subtract above value 2124... = 6068
-# - How many pages in is that? 6068 / 64 (tiny85 page size in bytes) = 94.8125
-# - round that down to 94 - our new bootloader address is 94 * 64 = 6016, in hex = 1780
-BOOTLOADER_ADDRESS = 18C0
-
-PROGRAMMER = -c USBasp
-# PROGRAMMER contains AVRDUDE options to address your programmer
+# make disablereset # use external reset line for IO (CAUTION: this is not easy to enable again, see README)
-FUSEOPT_8 = -U hfuse:w:0xc0:m -U lfuse:w:0x9f:m
-FUSEOPT_88 = -U hfuse:w:0xd6:m -U lfuse:w:0xdf:m -U efuse:w:0x00:m
-FUSEOPT_168 = -U hfuse:w:0xd6:m -U lfuse:w:0xdf:m -U efuse:w:0x00:m
-FUSEOPT_328 = -U lfuse:w:0xf7:m -U hfuse:w:0xda:m -U efuse:w:0x03:m
-FUSEOPT_t85 = -U lfuse:w:0xe1:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m
-FUSEOPT_t85_DISABLERESET = -U lfuse:w:0xe1:m -U efuse:w:0xfe:m -U hfuse:w:0x5d:m
-# You may have to change the order of these -U commands.
-
-#---------------------------------------------------------------------
-# ATMega8
-#---------------------------------------------------------------------
-# Fuse high byte:
-# 0xc0 = 1 1 0 0 0 0 0 0 <-- BOOTRST (boot reset vector at 0x1800)
-# ^ ^ ^ ^ ^ ^ ^------ BOOTSZ0
-# | | | | | +-------- BOOTSZ1
-# | | | | + --------- EESAVE (preserve EEPROM over chip erase)
-# | | | +-------------- CKOPT (full output swing)
-# | | +---------------- SPIEN (allow serial programming)
-# | +------------------ WDTON (WDT not always on)
-# +-------------------- RSTDISBL (reset pin is enabled)
-# Fuse low byte:
-# 0x9f = 1 0 0 1 1 1 1 1
-# ^ ^ \ / \--+--/
-# | | | +------- CKSEL 3..0 (external >8M crystal)
-# | | +--------------- SUT 1..0 (crystal osc, BOD enabled)
-# | +------------------ BODEN (BrownOut Detector enabled)
-# +-------------------- BODLEVEL (2.7V)
-#---------------------------------------------------------------------
-# ATMega88, ATMega168
-#---------------------------------------------------------------------
-# Fuse extended byte:
-# 0x00 = 0 0 0 0 0 0 0 0 <-- BOOTRST (boot reset vector at 0x1800)
-# \+/
-# +------- BOOTSZ (00 = 2k bytes)
-# Fuse high byte:
-# 0xd6 = 1 1 0 1 0 1 1 0
-# ^ ^ ^ ^ ^ \-+-/
-# | | | | | +------ BODLEVEL 0..2 (110 = 1.8 V)
-# | | | | + --------- EESAVE (preserve EEPROM over chip erase)
-# | | | +-------------- WDTON (if 0: watchdog always on)
-# | | +---------------- SPIEN (allow serial programming)
-# | +------------------ DWEN (debug wire enable)
-# +-------------------- RSTDISBL (reset pin is enabled)
-# Fuse low byte:
-# 0xdf = 1 1 0 1 1 1 1 1
-# ^ ^ \ / \--+--/
-# | | | +------- CKSEL 3..0 (external >8M crystal)
-# | | +--------------- SUT 1..0 (crystal osc, BOD enabled)
-# | +------------------ CKOUT (if 0: Clock output enabled)
-# +-------------------- CKDIV8 (if 0: divide by 8)
-#---------------------------------------------------------------------
-# ATMega328P
-#---------------------------------------------------------------------
-# Fuse extended byte:
-# 0x03 = - - - - - 0 1 1
-# \-+-/
-# +------ BODLEVEL 0..2 (011 = 4.3V)
-# Fuse high byte:
-# 0xda = 1 1 0 1 1 0 1 0 <-- BOOTRST (0 = jump to bootloader at start)
-# ^ ^ ^ ^ ^ \+/
-# | | | | | +------- BOOTSZ 0..1 (01 = 2KB starting at 0x7800)
-# | | | | + --------- EESAVE (don't preserve EEPROM over chip erase)
-# | | | +-------------- WDTON (1 = watchdog disabled at start)
-# | | +---------------- SPIEN (0 = allow serial programming)
-# | +------------------ DWEN (1 = debug wire disable)
-# +-------------------- RSTDISBL (1 = reset pin is enabled)
-# Fuse low byte:
-# 0xf7 = 1 1 1 1 0 1 1 1
-# ^ ^ \ / \--+--/
-# | | | +------- CKSEL 3..0 (0111 = external full-swing crystal)
-# | | +--------------- SUT 1..0 (11 = startup time 16K CK/14K + 65ms)
-# | +------------------ CKOUT (1 = clock output disabled)
-# +-------------------- CKDIV8 (1 = do not divide clock by 8)
-#---------------------------------------------------------------------
-# ATtiny85
-#---------------------------------------------------------------------
-# Fuse extended byte:
-# 0xFE = - - - - - 1 1 0
-# ^
-# |
-# +---- SELFPRGEN (enable self programming flash)
-#
-# Fuse high byte:
-# 0xdd = 1 1 0 1 1 1 0 1
-# ^ ^ ^ ^ ^ \-+-/
-# | | | | | +------ BODLEVEL 2..0 (brownout trigger level -> 2.7V)
-# | | | | +---------- EESAVE (preserve EEPROM on Chip Erase -> not preserved)
-# | | | +-------------- WDTON (watchdog timer always on -> disable)
-# | | +---------------- SPIEN (enable serial programming -> enabled)
-# | +------------------ DWEN (debug wire enable)
-# +-------------------- RSTDISBL (disable external reset -> enabled)
-#
-# Fuse high byte ("no reset": external reset disabled, can't program through SPI anymore)
-# 0x5d = 0 1 0 1 1 1 0 1
-# ^ ^ ^ ^ ^ \-+-/
-# | | | | | +------ BODLEVEL 2..0 (brownout trigger level -> 2.7V)
-# | | | | +---------- EESAVE (preserve EEPROM on Chip Erase -> not preserved)
-# | | | +-------------- WDTON (watchdog timer always on -> disable)
-# | | +---------------- SPIEN (enable serial programming -> enabled)
-# | +------------------ DWEN (debug wire enable)
-# +-------------------- RSTDISBL (disable external reset -> disabled!)
-#
-# Fuse low byte:
-# 0xe1 = 1 1 1 0 0 0 0 1
-# ^ ^ \+/ \--+--/
-# | | | +------- CKSEL 3..0 (clock selection -> HF PLL)
-# | | +--------------- SUT 1..0 (BOD enabled, fast rising power)
-# | +------------------ CKOUT (clock output on CKOUT pin -> disabled)
-# +-------------------- CKDIV8 (divide clock by 8 -> don't divide)
+CFLAGS =
+CONFIGPATH = configuration/$(CONFIG)
+include $(CONFIGPATH)/Makefile.inc
-###############################################################################
+PROGRAMMER ?= -c USBasp
+# PROGRAMMER contains AVRDUDE options to address your programmer
# Tools:
-AVRDUDE = avrdude $(PROGRAMMER) -p $(DEVICE)
+AVRDUDE = avrdude $(PROGRAMMER) -p $(DEVICE)
CC = avr-gcc
# Options:
-DEFINES = -DBOOTLOADER_ADDRESS=0x$(BOOTLOADER_ADDRESS) #-DDEBUG_LEVEL=2
-# Remove the -fno-* options when you use gcc 3, it does not understand them
-#
-CFLAGS = -g2 -nostartfiles -ffunction-sections -fdata-sections -fpack-struct -Wall -Os -fno-inline-small-functions -fno-move-loop-invariants -fno-tree-scev-cprop -I. -mmcu=$(DEVICE) -DF_CPU=$(F_CPU) $(DEFINES)
-LDFLAGS = -Wl,--relax,--section-start=.text=$(BOOTLOADER_ADDRESS),-Map=main.map,--section-start=.zerotable=0
+CFLAGS += -I. -g2 -Os # -Wall
+CFLAGS += -I$(CONFIGPATH) -mmcu=$(DEVICE) -DF_CPU=$(F_CPU) -DBOOTLOADER_ADDRESS=0x$(BOOTLOADER_ADDRESS)
+CFLAGS += -nostartfiles -ffunction-sections -fdata-sections -fpack-struct -fno-inline-small-functions -fno-move-loop-invariants -fno-tree-scev-cprop
+LDFLAGS = -Wl,--relax,--section-start=.text=$(BOOTLOADER_ADDRESS),-Map=main.map
OBJECTS = crt1.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o
OBJECTS += osccalASM.o
+
# symbolic targets:
all: main.hex
.c.o:
- $(CC) $(CFLAGS) -c $< -o $@ -Wa,-ahls=$<.lst
+ @$(CC) $(CFLAGS) -c $< -o $@ -Wa,-ahls=$<.lst
.S.o:
- $(CC) $(CFLAGS) -x assembler-with-cpp -c $< -o $@
+ @$(CC) $(CFLAGS) -x assembler-with-cpp -c $< -o $@
# "-x assembler-with-cpp" should not be necessary since this is the default
# file type for the .S (with capital S) extension. However, upper case
# characters are not always preserved on Windows. To ensure WinAVR
# compatibility define the file type manually.
.c.s:
- $(CC) $(CFLAGS) -S $< -o $@
+ @$(CC) $(CFLAGS) -S $< -o $@
flash: all
- $(AVRDUDE) -U flash:w:main.hex:i -B 10
+ $(AVRDUDE) -U flash:w:main.hex:i -B 20
readflash:
- $(AVRDUDE) -U flash:r:read.hex:i
+ $(AVRDUDE) -U flash:r:read.hex:i -B 20
fuse:
- $(AVRDUDE) $(FUSEOPT)
+ $(AVRDUDE) $(FUSEOPT) -B 20
disablereset:
- $(AVRDUDE) $(FUSEOPT_t85_DISABLERESET)
-
-lock:
- $(AVRDUDE) $(LOCKOPT)
+ $(AVRDUDE) $(FUSEOPT_DISABLERESET) -B 20
read_fuses:
- $(UISP) --rd_fuses
+ $(UISP) --rd_fuses -B 20
clean:
- rm -f main.hex main.bin main.c.lst main.map *.o usbdrv/*.o main.s usbdrv/oddebug.s usbdrv/usbdrv.s *.lss
+ @rm -f main.hex main.bin main.c.lst main.map main.raw *.o usbdrv/*.o main.s usbdrv/oddebug.s usbdrv/usbdrv.s main.lss
# file targets:
main.bin: $(OBJECTS)
- $(CC) $(CFLAGS) -o main.bin $(OBJECTS) $(LDFLAGS)
+ @$(CC) $(CFLAGS) -o main.bin $(OBJECTS) $(LDFLAGS)
main.hex: main.bin
- rm -f main.hex main.eep.hex
- avr-objcopy -j .text -j .zerotable -j .data -O ihex main.bin main.hex
- avr-size main.hex
-
+ @echo Building Micronucleus configuration: $(CONFIG)
+ @rm -f main.hex main.eep.hex
+ @avr-objcopy -j .text -j .data -O ihex main.bin main.hex
+ @echo Size of sections:
+ @avr-size main.bin
+ @echo Size of binary hexfile. Use the "data" size to calculate the bootloader address:
+ @avr-size main.hex
+
+upgrade: main.bin
+ avr-objcopy -O binary main.bin main.raw
+ avr-objcopy -I binary -O elf32-avr \
+ --rename-section .data=.text \
+ --redefine-sym _binary_main_raw_start=loader \
+ --redefine-sym _binary_main_raw_end=loader_end \
+ main.raw bootloader_linkable.o
+
disasm: main.bin
- avr-objdump -d -S main.bin >main.lss
-
-cpp:
- $(CC) $(CFLAGS) -E main.c
-
-# Special rules for generating hex files for various devices and clock speeds
-ALLHEXFILES = hexfiles/mega8_12mhz.hex hexfiles/mega8_15mhz.hex hexfiles/mega8_16mhz.hex \
- hexfiles/mega88_12mhz.hex hexfiles/mega88_15mhz.hex hexfiles/mega88_16mhz.hex hexfiles/mega88_20mhz.hex\
- hexfiles/mega168_12mhz.hex hexfiles/mega168_15mhz.hex hexfiles/mega168_16mhz.hex hexfiles/mega168_20mhz.hex\
- hexfiles/mega328p_12mhz.hex hexfiles/mega328p_15mhz.hex hexfiles/mega328p_16mhz.hex hexfiles/mega328p_20mhz.hex
-
-allhexfiles: $(ALLHEXFILES)
- $(MAKE) clean
- avr-size hexfiles/*.hex
-
-$(ALLHEXFILES):
- @[ -d hexfiles ] || mkdir hexfiles
- @device=`echo $@ | sed -e 's|.*/mega||g' -e 's|_.*||g'`; \
- clock=`echo $@ | sed -e 's|.*_||g' -e 's|mhz.*||g'`; \
- addr=`echo $$device | sed -e 's/\([0-9]\)8/\1/g' | awk '{printf("%x", ($$1 - 2) * 1024)}'`; \
- echo "### Make with F_CPU=$${clock}000000 DEVICE=atmega$$device BOOTLOADER_ADDRESS=$$addr"; \
- $(MAKE) clean; \
- $(MAKE) main.hex F_CPU=$${clock}000000 DEVICE=atmega$$device BOOTLOADER_ADDRESS=$$addr DEFINES=-DUSE_AUTOCONFIG=1
- mv main.hex $@
+ @avr-objdump -d -S main.bin >main.lss
diff --git a/firmware/configuration/Nanite841/Makefile.inc b/firmware/configuration/Nanite841/Makefile.inc
new file mode 100644
index 0000000..e147248
--- /dev/null
+++ b/firmware/configuration/Nanite841/Makefile.inc
@@ -0,0 +1,60 @@
+# Name: Makefile
+# Project: Micronucleus
+# License: GNU GPL v2 (see License.txt)
+#
+# Controller type: ATtiny 841
+# Configuration: Default configuration - 12 Mhz RC oscillator
+# Last Change: Mar 16,2014
+
+
+F_CPU = 12000000
+DEVICE = attiny841
+
+# hexadecimal address for bootloader section to begin. To calculate the best value:
+# - make clean; make main.hex; ### output will list data: 2124 (or something like that)
+# - for the size of your device (8kb = 1024 * 8 = 8192) subtract above value 2124... = 6068
+# - How many pages in is that? 6068 / 64 (tiny85 page size in bytes) = 94.8125
+# - round that down to 94 - our new bootloader address is 94 * 64 = 6016, in hex = 1780
+BOOTLOADER_ADDRESS = 1980
+
+FUSEOPT = -U lfuse:w:0xe2:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m
+FUSEOPT_DISABLERESET = # TODO
+
+#---------------------------------------------------------------------
+# ATtiny841
+#---------------------------------------------------------------------
+# Fuse extended byte:
+# 0xFE = 1 1 1 1 1 1 1 0
+# ^
+# |
+# +---- SELFPRGEN (enable self programming flash)
+#
+# Fuse high byte:
+# 0xdd = 1 1 0 1 1 1 0 1
+# ^ ^ ^ ^ ^ \-+-/
+# | | | | | +------ BODLEVEL 2..0 (brownout trigger level -> 2.7V)
+# | | | | +---------- EESAVE (preserve EEPROM on Chip Erase -> not preserved)
+# | | | +-------------- WDTON (watchdog timer always on -> disable)
+# | | +---------------- SPIEN (enable serial programming -> enabled)
+# | +------------------ DWEN (debug wire enable)
+# +-------------------- RSTDISBL (disable external reset -> enabled)
+#
+# Fuse high byte ("no reset": external reset disabled, can't program through SPI anymore)
+# 0x5d = 0 1 0 1 1 1 0 1
+# ^ ^ ^ ^ ^ \-+-/
+# | | | | | +------ BODLEVEL 2..0 (brownout trigger level -> 2.7V)
+# | | | | +---------- EESAVE (preserve EEPROM on Chip Erase -> not preserved)
+# | | | +-------------- WDTON (watchdog timer always on -> disable)
+# | | +---------------- SPIEN (enable serial programming -> enabled)
+# | +------------------ DWEN (debug wire enable)
+# +-------------------- RSTDISBL (disable external reset -> disabled!)
+#
+# Fuse low byte:
+# 0xe2 = 1 1 1 0 0 0 1 0
+# ^ ^ \+/ \--+--/
+# | | | +------- CKSEL 3..0 (clock selection -> RC Oscillator)
+# | | +--------------- SUT 1..0 (BOD enabled, fast rising power)
+# | +------------------ CKOUT (clock output on CKOUT pin -> disabled)
+# +-------------------- CKDIV8 (divide clock by 8 -> don't divide)
+
+
diff --git a/firmware/configuration/Nanite841/bootloaderconfig.h b/firmware/configuration/Nanite841/bootloaderconfig.h
new file mode 100644
index 0000000..930d9ef
--- /dev/null
+++ b/firmware/configuration/Nanite841/bootloaderconfig.h
@@ -0,0 +1,271 @@
+/* Name: bootloaderconfig.h
+ * Micronucleus configuration file.
+ * This file (together with some settings in Makefile.inc) configures the boot loader
+ * according to the hardware.
+ *
+ * Controller type: ATtiny 841 - 12 MHz
+ * Configuration: Nanite841
+ * USB D- : PB1
+ * USB D+ : PB0
+ * Entry : Always
+ * LED : PB2, Active Low
+ * OSCCAL : Revert to precalibrated value (8 MHz)
+ * Note: can use 12 MHz V-USB without PLL due to stable RC-osc in ATTiny841
+ * Last Change: June 5,2015
+ *
+ * License: GNU GPL v2 (see License.txt
+ */
+
+#ifndef __bootloaderconfig_h_included__
+#define __bootloaderconfig_h_included__
+
+/* ------------------------------------------------------------------------- */
+/* Hardware configuration. */
+/* Change this according to your CPU and USB configuration */
+/* ------------------------------------------------------------------------- */
+
+#define USB_CFG_IOPORTNAME B
+ /* This is the port where the USB bus is connected. When you configure it to
+ * "B", the registers PORTB, PINB and DDRB will be used.
+ */
+
+#define USB_CFG_DMINUS_BIT 1
+/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
+ * This may be any bit in the port.
+ */
+#define USB_CFG_DPLUS_BIT 0
+/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
+ * This may be any bit in the port, but must be configured as a pin change interrupt.
+ */
+
+#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
+/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
+ * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
+ * require no crystal, they tolerate +/- 1% deviation from the nominal
+ * frequency. All other rates require a precision of 2000 ppm and thus a
+ * crystal!
+ * Since F_CPU should be defined to your actual clock rate anyway, you should
+ * not need to modify this setting.
+ */
+
+/* ------------- Set up interrupt configuration (CPU specific) -------------- */
+/* The register names change quite a bit in the ATtiny family. Pay attention */
+/* to the manual. Note that the interrupt flag system is still used even though */
+/* interrupts are disabled. So this has to be configured correctly. */
+
+
+// setup interrupt for Pin Change for D+
+#define USB_INTR_CFG PCMSK1
+#define USB_INTR_CFG_SET (1 << USB_CFG_DPLUS_BIT)
+#define USB_INTR_CFG_CLR 0
+#define USB_INTR_ENABLE GIMSK
+#define USB_INTR_ENABLE_BIT PCIE1
+#define USB_INTR_PENDING GIFR
+#define USB_INTR_PENDING_BIT PCIF1
+#define USB_INTR_VECTOR PCINT1_vect
+
+/* ------------------------------------------------------------------------- */
+/* Configuration relevant to the CPU the bootloader is running on */
+/* ------------------------------------------------------------------------- */
+
+// how many milliseconds should host wait till it sends another erase or write?
+// needs to be above 4.5 (and a whole integer) as avr freezes for 4.5ms
+
+// Set bit 7 to reduce wait time for page erase by factor of four
+#define MICRONUCLEUS_WRITE_SLEEP 128 + 5
+
+// ATtiny841 does not know OSCCAL
+#ifndef OSCCAL
+#define OSCCAL OSCCAL0
+#endif
+
+/* ---------------------- feature / code size options ---------------------- */
+/* Configure the behavior of the bootloader here */
+/* ------------------------------------------------------------------------- */
+
+/*
+ * Define Bootloader entry condition
+ *
+ * If the entry condition is not met, the bootloader will not be activated and the user program
+ * is executed directly after a reset. If no user program has been loaded, the bootloader
+ * is always active.
+ *
+ * ENTRY_ALWAYS Always activate the bootloader after reset. Requires the least
+ * amount of code.
+ *
+ * ENTRY_WATCHDOG Activate the bootloader after a watchdog reset. This can be used
+ * to enter the bootloader from the user program.
+ * Adds 22 bytes.
+ *
+ * ENTRY_EXT_RESET Activate the bootloader after an external reset was issued by
+ * pulling the reset pin low. It may be necessary to add an external
+ * pull-up resistor to the reset pin if this entry method appears to
+ * behave unreliably.
+ * Adds 22 bytes.
+ *
+ * ENTRY_JUMPER Activate the bootloader when a specific pin is pulled low by an
+ * external jumper.
+ * Adds 34 bytes.
+ *
+ * JUMPER_PIN Pin the jumper is connected to. (e.g. PB0)
+ * JUMPER_PORT Port out register for the jumper (e.g. PORTB)
+ * JUMPER_DDR Port data direction register for the jumper (e.g. DDRB)
+ * JUMPER_INP Port inout register for the jumper (e.g. PINB)
+ *
+ */
+
+#define ENTRYMODE ENTRY_EXT_RESET
+
+#define JUMPER_PIN PB0
+#define JUMPER_PORT PORTB
+#define JUMPER_DDR DDRB
+#define JUMPER_INP PINB
+
+/*
+ Internal implementation, don't change this unless you want to add an entrymode.
+*/
+
+#define ENTRY_ALWAYS 1
+#define ENTRY_WATCHDOG 2
+#define ENTRY_EXT_RESET 3
+#define ENTRY_JUMPER 4
+
+#if ENTRYMODE==ENTRY_ALWAYS
+ #define bootLoaderInit()
+ #define bootLoaderExit()
+ #define bootLoaderStartCondition() 1
+#elif ENTRYMODE==ENTRY_WATCHDOG
+ #define bootLoaderInit()
+ #define bootLoaderExit()
+ #define bootLoaderStartCondition() (MCUSR&_BV(WDRF))
+#elif ENTRYMODE==ENTRY_EXT_RESET
+ #define bootLoaderInit()
+ #define bootLoaderExit()
+ #define bootLoaderStartCondition() (MCUSR&_BV(EXTRF))
+#elif ENTRYMODE==ENTRY_JUMPER
+ // Enable pull up on jumper pin and delay to stabilize input
+ #define bootLoaderInit() {JUMPER_DDR&=~_BV(JUMPER_PIN);JUMPER_PORT|=_BV(JUMPER_PIN);_delay_ms(1);}
+ #define bootLoaderExit() {JUMPER_PORT&=~_BV(JUMPER_PIN);}
+ #define bootLoaderStartCondition() (!(JUMPER_INP&_BV(JUMPER_PIN)))
+#else
+ #error "No entry mode defined"
+#endif
+
+/*
+ * Define bootloader timeout value.
+ *
+ * The bootloader will only time out if a user program was loaded.
+ *
+ * AUTO_EXIT_NO_USB_MS The bootloader will exit after this delay if no USB is connected.
+ * Set to 0 to disable
+ * Adds ~6 bytes.
+ * (This will wait for an USB SE0 reset from the host)
+ *
+ * AUTO_EXIT_MS The bootloader will exit after this delay if no USB communication
+ * from the host tool was received.
+ * Set to 0 to disable
+ *
+ * All values are approx. in milliseconds
+ */
+
+#define AUTO_EXIT_NO_USB_MS 0
+#define AUTO_EXIT_MS 6000
+
+ /*
+ * Defines the setting of the RC-oscillator calibration after quitting the bootloader. (OSCCAL)
+ *
+ * OSCCAL_RESTORE_DEFAULT Set this to '1' to revert to OSCCAL factore calibration after bootlaoder exit.
+ * This is 8 MHz +/-2% on most devices or 16 MHz on the ATtiny 85 with activated PLL.
+ * Adds ~14 bytes.
+ *
+ * OSCCAL_SAVE_CALIB Set this to '1' to save the OSCCAL calibration during program upload.
+ * This value will be reloaded after reset and will also be used for the user
+ * program unless "OSCCAL_RESTORE_DEFAULT" is active. This allows calibrate the internal
+ * RC oscillator to the F_CPU target frequency +/-1% from the USB timing. Please note
+ * that only true if the ambient temperature does not change.
+ * Adds ~38 bytes.
+ *
+ * OSCCAL_HAVE_XTAL Set this to '1' if you have an external crystal oscillator. In this case no attempt
+ * will be made to calibrate the oscillator. You should deactivate both options above
+ * if you use this to avoid redundant code.
+ *
+ * OSCCAL_SLOW_PROGRAMMING Setting this to '1' will set OSCCAL back to the factory calibration during programming to make
+ * sure correct timing is used for the flash writes. This is needed if the micronucleus clock
+ * speed significantly deviated from the default clock. E.g. 12 Mhz on ATtiny841 vs. 8Mhz default.
+ *
+ * If both options are selected, OSCCAL_RESTORE_DEFAULT takes precedence.
+ *
+ * If no option is selected, OSCCAL will be left untouched and stays at either factory calibration or F_CPU depending
+ * on whether the bootloader was activated. This will take the least memory. You can use this if your program
+ * comes with its own OSCCAL calibration or an external clock source is used.
+ */
+
+#define OSCCAL_RESTORE_DEFAULT 1
+#define OSCCAL_SAVE_CALIB 1
+#define OSCCAL_HAVE_XTAL 0
+#define OSCCAL_SLOW_PROGRAMMING 1
+
+/*
+ * Defines handling of an indicator LED while the bootloader is active.
+ *
+ * LED_MODE Define behavior of attached LED or suppress LED code.
+ *
+ * NONE Do not generate LED code (gains 18 bytes).
+ * ACTIVE_HIGH LED is on when output pin is high. This will toggle bettwen 1 and 0.
+ * ACTIVE_LOW LED is on when output pin is low. This will toggle between Z and 0.
+ *
+ * LED_DDR,LED_PORT,LED_PIN Where is your LED connected?
+ *
+ */
+
+#define LED_MODE ACTIVE_LOW
+
+#define LED_DDR DDRB
+#define LED_PORT PORTB
+#define LED_PIN PB2
+
+/*
+ * This is the implementation of the LED code. Change the configuration above unless you want to
+ * change the led behavior
+ *
+ * LED_INIT Called once after bootloader entry
+ * LED_EXIT Called once during bootloader exit
+ * LED_MACRO Called in the main loop with the idle counter as parameter.
+ * Use to define pattern.
+*/
+
+#define NONE 0
+#define ACTIVE_HIGH 1
+#define ACTIVE_LOW 2
+
+#if LED_MODE==ACTIVE_HIGH
+ #define LED_INIT(x) LED_DDR = _BV(LED_PIN);
+ #define LED_EXIT(x) {LED_DDR &=~_BV(LED_PIN);LED_PORT &=~_BV(LED_PIN);}
+ #define LED_MACRO(x) if ( x & 0x4c ) {LED_PORT&=~_BV(LED_PIN);} else {LED_PORT|=_BV(LED_PIN);}
+#elif LED_MODE==ACTIVE_LOW
+ #define LED_INIT(x) LED_PORT &=~_BV(LED_PIN);
+ #define LED_EXIT(x) LED_DDR &=~_BV(LED_PIN);
+ #define LED_MACRO(x) if ( x & 0x4c ) {LED_DDR&=~_BV(LED_PIN);} else {LED_DDR|=_BV(LED_PIN);}
+#elif LED_MODE==NONE
+ #define LED_INIT(x)
+ #define LED_EXIT(x)
+ #define LED_MACRO(x)
+#endif
+
+/* --------------------------------------------------------------------------- */
+/* Micronucleus internal configuration. Do not change anything below this line */
+/* --------------------------------------------------------------------------- */
+
+// Microcontroller vectortable entries in the flash
+#define RESET_VECTOR_OFFSET 0
+
+// number of bytes before the boot loader vectors to store the tiny application vector table
+#define TINYVECTOR_RESET_OFFSET 4
+#define TINYVECTOR_OSCCAL_OFFSET 6
+
+/* ------------------------------------------------------------------------ */
+// postscript are the few bytes at the end of programmable memory which store tinyVectors
+#define POSTSCRIPT_SIZE 6
+#define PROGMEM_SIZE (BOOTLOADER_ADDRESS - POSTSCRIPT_SIZE) /* max size of user program */
+
+#endif /* __bootloader_h_included__ */
diff --git a/firmware/configuration/t167_default/Makefile.inc b/firmware/configuration/t167_default/Makefile.inc
new file mode 100644
index 0000000..ca17884
--- /dev/null
+++ b/firmware/configuration/t167_default/Makefile.inc
@@ -0,0 +1,21 @@
+# Name: Makefile
+# Project: Micronucleus
+# License: GNU GPL v2 (see License.txt)
+#
+# Controller type: ATtiny 167
+# Configuration: Default configuration.
+# Last Change: Mar 16,2014
+
+
+F_CPU = 16000000
+DEVICE = attiny167
+
+# hexadecimal address for bootloader section to begin. To calculate the best value:
+# - make clean; make main.hex; ### output will list data: 2124 (or something like that)
+# - for the size of your device (8kb = 1024 * 8 = 8192) subtract above value 2124... = 6068
+# - How many pages in is that? 6068 / 64 (tiny85 page size in bytes) = 94.8125
+# - round that down to 94 - our new bootloader address is 94 * 64 = 6016, in hex = 1780
+BOOTLOADER_ADDRESS = 3980
+
+FUSEOPT = # TODO
+FUSEOPT_DISABLERESET = # TODO
diff --git a/firmware/configuration/t167_default/bootloaderconfig.h b/firmware/configuration/t167_default/bootloaderconfig.h
new file mode 100644
index 0000000..8c29913
--- /dev/null
+++ b/firmware/configuration/t167_default/bootloaderconfig.h
@@ -0,0 +1,275 @@
+ /* Name: bootloaderconfig.h
+ * Micronucleus configuration file.
+ * This file (together with some settings in Makefile.inc) configures the boot loader
+ * according to the hardware.
+ *
+ * Controller type: ATtiny 167 - 16 MHz with crystal
+ * Configuration: Standard configuration
+ * USB D- : PB3
+ * USB D+ : PB4
+ * Entry : Always
+ * LED : None
+ * OSCCAL : No change due to external crystal
+ * Note: Uses 16 MHz V-USB implementation.
+ * Last Change: Mar 16,2014
+ *
+ * License: GNU GPL v2 (see License.txt
+ */
+
+#ifndef __bootloaderconfig_h_included__
+#define __bootloaderconfig_h_included__
+
+/* ------------------------------------------------------------------------- */
+/* Hardware configuration. */
+/* Change this according to your CPU and USB configuration */
+/* ------------------------------------------------------------------------- */
+
+#define USB_CFG_IOPORTNAME B
+ /* This is the port where the USB bus is connected. When you configure it to
+ * "B", the registers PORTB, PINB and DDRB will be used.
+ */
+
+#define USB_CFG_DMINUS_BIT 3
+/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
+ * This may be any bit in the port.
+ */
+#define USB_CFG_DPLUS_BIT 4
+/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
+ * This may be any bit in the port, but must be configured as a pin change interrupt.
+ */
+
+#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
+/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
+ * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
+ * require no crystal, they tolerate +/- 1% deviation from the nominal
+ * frequency. All other rates require a precision of 2000 ppm and thus a
+ * crystal!
+ * Since F_CPU should be defined to your actual clock rate anyway, you should
+ * not need to modify this setting.
+ */
+
+/* ------------- Set up interrupt configuration (CPU specific) -------------- */
+/* The register names change quite a bit in the ATtiny family. Pay attention */
+/* to the manual. Note that the interrupt flag system is still used even though */
+/* interrupts are disabled. So this has to be configured correctly. */
+
+
+// setup interrupt for Pin Change for D+
+
+// This is configured for PORTB.
+
+#define USB_INTR_CFG PCMSK1
+#define USB_INTR_CFG_SET (1 << USB_CFG_DPLUS_BIT)
+#define USB_INTR_CFG_CLR 0
+#define USB_INTR_ENABLE PCICR
+#define USB_INTR_ENABLE_BIT PCIE1
+#define USB_INTR_PENDING PCIFR
+#define USB_INTR_PENDING_BIT PCIF1
+#define USB_INTR_VECTOR PCINT1_vect
+
+/* Configuration for PORTA */
+/*
+#define USB_INTR_CFG PCMSK0
+#define USB_INTR_CFG_SET (1 << USB_CFG_DPLUS_BIT)
+#define USB_INTR_CFG_CLR 0
+#define USB_INTR_ENABLE PCICR
+#define USB_INTR_ENABLE_BIT PCIE0
+#define USB_INTR_PENDING PCIFR
+#define USB_INTR_PENDING_BIT PCIF0
+#define USB_INTR_VECTOR PCINT0_vect
+*/
+
+/* ------------------------------------------------------------------------- */
+/* Configuration relevant to the CPU the bootloader is running on */
+/* ------------------------------------------------------------------------- */
+
+// how many milliseconds should host wait till it sends another erase or write?
+// needs to be above 4.5 (and a whole integer) as avr freezes for 4.5ms
+#define MICRONUCLEUS_WRITE_SLEEP 5
+
+
+/* ---------------------- feature / code size options ---------------------- */
+/* Configure the behavior of the bootloader here */
+/* ------------------------------------------------------------------------- */
+
+/*
+ * Define Bootloader entry condition
+ *
+ * If the entry condition is not met, the bootloader will not be activated and the user program
+ * is executed directly after a reset. If no user program has been loaded, the bootloader
+ * is always active.
+ *
+ * ENTRY_ALWAYS Always activate the bootloader after reset. Requires the least
+ * amount of code.
+ *
+ * ENTRY_WATCHDOG Activate the bootloader after a watchdog reset. This can be used
+ * to enter the bootloader from the user program.
+ * Adds 22 bytes.
+ *
+ * ENTRY_EXT_RESET Activate the bootloader after an external reset was issued by
+ * pulling the reset pin low. It may be necessary to add an external
+ * pull-up resistor to the reset pin if this entry method appears to
+ * behave unreliably.
+ * Adds 22 bytes.
+ *
+ * ENTRY_JUMPER Activate the bootloader when a specific pin is pulled low by an
+ * external jumper.
+ * Adds 34 bytes.
+ *
+ * JUMPER_PIN Pin the jumper is connected to. (e.g. PB0)
+ * JUMPER_PORT Port out register for the jumper (e.g. PORTB)
+ * JUMPER_DDR Port data direction register for the jumper (e.g. DDRB)
+ * JUMPER_INP Port inout register for the jumper (e.g. PINB)
+ *
+ */
+
+#define ENTRYMODE ENTRY_ALWAYS
+
+#define JUMPER_PIN PB0
+#define JUMPER_PORT PORTB
+#define JUMPER_DDR DDRB
+#define JUMPER_INP PINB
+
+/*
+ Internal implementation, don't change this unless you want to add an entrymode.
+*/
+
+#define ENTRY_ALWAYS 1
+#define ENTRY_WATCHDOG 2
+#define ENTRY_EXT_RESET 3
+#define ENTRY_JUMPER 4
+
+#if ENTRYMODE==ENTRY_ALWAYS
+ #define bootLoaderInit()
+ #define bootLoaderExit()
+ #define bootLoaderStartCondition() 1
+#elif ENTRYMODE==ENTRY_WATCHDOG
+ #define bootLoaderInit()
+ #define bootLoaderExit()
+ #define bootLoaderStartCondition() (MCUSR&_BV(WDRF))
+#elif ENTRYMODE==ENTRY_EXT_RESET
+ #define bootLoaderInit()
+ #define bootLoaderExit()
+ #define bootLoaderStartCondition() (MCUSR&_BV(EXTRF))
+#elif ENTRYMODE==ENTRY_JUMPER
+ // Enable pull up on jumper pin and delay to stabilize input
+ #define bootLoaderInit() {JUMPER_DDR&=~_BV(JUMPER_PIN);JUMPER_PORT|=_BV(JUMPER_PIN);_delay_ms(1);}
+ #define bootLoaderExit() {JUMPER_PORT&=~_BV(JUMPER_PIN);}
+ #define bootLoaderStartCondition() (!(JUMPER_INP&_BV(JUMPER_PIN)))
+#else
+ #error "No entry mode defined"
+#endif
+
+/*
+ * Define bootloader timeout value.
+ *
+ * The bootloader will only time out if a user program was loaded.
+ *
+ * AUTO_EXIT_NO_USB_MS The bootloader will exit after this delay if no USB is connected.
+ * Set to 0 to disable
+ * Adds ~6 bytes.
+ * (This will wait for an USB SE0 reset from the host)
+ *
+ * AUTO_EXIT_MS The bootloader will exit after this delay if no USB communication
+ * from the host tool was received.
+ * Set to 0 to disable
+ *
+ * All values are approx. in milliseconds
+ */
+
+#define AUTO_EXIT_NO_USB_MS 0
+#define AUTO_EXIT_MS 6000
+
+ /*
+ * Defines the setting of the RC-oscillator calibration after quitting the bootloader. (OSCCAL)
+ *
+ * OSCCAL_RESTORE_DEFAULT Set this to '1' to revert to OSCCAL factore calibration after bootlaoder exit.
+ * This is 8 MHz +/-2% on most devices or 16 MHz on the ATtiny 85 with activated PLL.
+ * Adds ~14 bytes.
+ *
+ * OSCCAL_SAVE_CALIB Set this to '1' to save the OSCCAL calibration during program upload.
+ * This value will be reloaded after reset and will also be used for the user
+ * program unless "OSCCAL_RESTORE_DEFAULT" is active. This allows calibrate the internal
+ * RC oscillator to the F_CPU target frequency +/-1% from the USB timing. Please note
+ * that only true if the ambient temperature does not change.
+ * Adds ~38 bytes.
+ *
+ * OSCCAL_HAVE_XTAL Set this to '1' if you have an external crystal oscillator. In this case no attempt
+ * will be made to calibrate the oscillator. You should deactivate both options above
+ * if you use this to avoid redundant code.
+ *
+ * If both options are selected, OSCCAL_RESTORE_DEFAULT takes precedence.
+ *
+ * If no option is selected, OSCCAL will be left untouched and stays at either factory calibration or F_CPU depending
+ * on whether the bootloader was activated. This will take the least memory. You can use this if your program
+ * comes with its own OSCCAL calibration or an external clock source is used.
+ */
+
+#define OSCCAL_RESTORE_DEFAULT 0
+#define OSCCAL_SAVE_CALIB 0
+#define OSCCAL_HAVE_XTAL 1
+
+/*
+ * Defines handling of an indicator LED while the bootloader is active.
+ *
+ * LED_MODE Define behavior of attached LED or suppress LED code.
+ *
+ * NONE Do not generate LED code (gains 18 bytes).
+ * ACTIVE_HIGH LED is on when output pin is high. This will toggle bettwen 1 and 0.
+ * ACTIVE_LOW LED is on when output pin is low. This will toggle between Z and 0.
+ *
+ * LED_DDR,LED_PORT,LED_PIN Where is your LED connected?
+ *
+ */
+
+#define LED_MODE NONE
+
+#define LED_DDR DDRB
+#define LED_PORT PORTB
+#define LED_PIN PB1
+
+/*
+ * This is the implementation of the LED code. Change the configuration above unless you want to
+ * change the led behavior
+ *
+ * LED_INIT Called once after bootloader entry
+ * LED_EXIT Called once during bootloader exit
+ * LED_MACRO Called in the main loop with the idle counter as parameter.
+ * Use to define pattern.
+*/
+
+#define NONE 0
+#define ACTIVE_HIGH 1
+#define ACTIVE_LOW 2
+
+#if LED_MODE==ACTIVE_HIGH
+ #define LED_INIT(x) LED_DDR = _BV(LED_PIN);
+ #define LED_EXIT(x) {LED_DDR &=~_BV(LED_PIN);LED_PORT &=~_BV(LED_PIN);}
+ #define LED_MACRO(x) if ( x & 0x4c ) {LED_PORT&=~_BV(LED_PIN);} else {LED_PORT|=_BV(LED_PIN);}
+#elif LED_MODE==ACTIVE_LOW
+ #define LED_INIT(x) LED_PORT &=~_BV(LED_PIN);
+ #define LED_EXIT(x) LED_DDR &=~_BV(LED_PIN);
+ #define LED_MACRO(x) if ( x & 0x4c ) {LED_DDR&=~_BV(LED_PIN);} else {LED_DDR|=_BV(LED_PIN);}
+#elif LED_MODE==NONE
+ #define LED_INIT(x)
+ #define LED_EXIT(x)
+ #define LED_MACRO(x)
+#endif
+
+/* --------------------------------------------------------------------------- */
+/* Micronucleus internal configuration. Do not change anything below this line */
+/* --------------------------------------------------------------------------- */
+
+// Microcontroller vectortable entries in the flash
+#define RESET_VECTOR_OFFSET 0
+
+// number of bytes before the boot loader vectors to store the tiny application vector table
+#define TINYVECTOR_RESET_OFFSET 4
+#define TINYVECTOR_OSCCAL_OFFSET 6
+
+/* ------------------------------------------------------------------------ */
+// postscript are the few bytes at the end of programmable memory which store tinyVectors
+#define POSTSCRIPT_SIZE 6
+#define PROGMEM_SIZE (BOOTLOADER_ADDRESS - POSTSCRIPT_SIZE) /* max size of user program */
+
+#endif /* __bootloader_h_included__ */
diff --git a/firmware/configuration/t841_default/Makefile.inc b/firmware/configuration/t841_default/Makefile.inc
new file mode 100644
index 0000000..9601a69
--- /dev/null
+++ b/firmware/configuration/t841_default/Makefile.inc
@@ -0,0 +1,60 @@
+# Name: Makefile
+# Project: Micronucleus
+# License: GNU GPL v2 (see License.txt)
+#
+# Controller type: ATtiny 841
+# Configuration: Default configuration - 12 Mhz RC oscillator
+# Last Change: Mar 16,2014
+
+
+F_CPU = 12000000
+DEVICE = attiny841
+
+# hexadecimal address for bootloader section to begin. To calculate the best value:
+# - make clean; make main.hex; ### output will list data: 2124 (or something like that)
+# - for the size of your device (8kb = 1024 * 8 = 8192) subtract above value 2124... = 6068
+# - How many pages in is that? 6068 / 64 (tiny85 page size in bytes) = 94.8125
+# - round that down to 94 - our new bootloader address is 94 * 64 = 6016, in hex = 1780
+BOOTLOADER_ADDRESS = 19C0
+
+FUSEOPT = -U lfuse:w:0xe2:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m
+FUSEOPT_DISABLERESET = # TODO
+
+#---------------------------------------------------------------------
+# ATtiny841
+#---------------------------------------------------------------------
+# Fuse extended byte:
+# 0xFE = 1 1 1 1 1 1 1 0
+# ^
+# |
+# +---- SELFPRGEN (enable self programming flash)
+#
+# Fuse high byte:
+# 0xdd = 1 1 0 1 1 1 0 1
+# ^ ^ ^ ^ ^ \-+-/
+# | | | | | +------ BODLEVEL 2..0 (brownout trigger level -> 2.7V)
+# | | | | +---------- EESAVE (preserve EEPROM on Chip Erase -> not preserved)
+# | | | +-------------- WDTON (watchdog timer always on -> disable)
+# | | +---------------- SPIEN (enable serial programming -> enabled)
+# | +------------------ DWEN (debug wire enable)
+# +-------------------- RSTDISBL (disable external reset -> enabled)
+#
+# Fuse high byte ("no reset": external reset disabled, can't program through SPI anymore)
+# 0x5d = 0 1 0 1 1 1 0 1
+# ^ ^ ^ ^ ^ \-+-/
+# | | | | | +------ BODLEVEL 2..0 (brownout trigger level -> 2.7V)
+# | | | | +---------- EESAVE (preserve EEPROM on Chip Erase -> not preserved)
+# | | | +-------------- WDTON (watchdog timer always on -> disable)
+# | | +---------------- SPIEN (enable serial programming -> enabled)
+# | +------------------ DWEN (debug wire enable)
+# +-------------------- RSTDISBL (disable external reset -> disabled!)
+#
+# Fuse low byte:
+# 0xe2 = 1 1 1 0 0 0 1 0
+# ^ ^ \+/ \--+--/
+# | | | +------- CKSEL 3..0 (clock selection -> RC Oscillator)
+# | | +--------------- SUT 1..0 (BOD enabled, fast rising power)
+# | +------------------ CKOUT (clock output on CKOUT pin -> disabled)
+# +-------------------- CKDIV8 (divide clock by 8 -> don't divide)
+
+
diff --git a/firmware/configuration/t841_default/bootloaderconfig.h b/firmware/configuration/t841_default/bootloaderconfig.h
new file mode 100644
index 0000000..6dfe795
--- /dev/null
+++ b/firmware/configuration/t841_default/bootloaderconfig.h
@@ -0,0 +1,267 @@
+/* Name: bootloaderconfig.h
+ * Micronucleus configuration file.
+ * This file (together with some settings in Makefile.inc) configures the boot loader
+ * according to the hardware.
+ *
+ * Controller type: ATtiny 841 - 12 MHz
+ * Configuration: Default configuration
+ * USB D- : PB0
+ * USB D+ : PB1
+ * Entry : Always
+ * LED : PB2, Active Low
+ * OSCCAL : Revert to precalibrated value (8 MHz)
+ * Note: can use 12 MHz V-USB without PLL due to stable RC-osc in ATTiny841
+ * Flash write time may be too low.
+ * Last Change: Mar 16,2014
+ *
+ * License: GNU GPL v2 (see License.txt
+ */
+
+#ifndef __bootloaderconfig_h_included__
+#define __bootloaderconfig_h_included__
+
+/* ------------------------------------------------------------------------- */
+/* Hardware configuration. */
+/* Change this according to your CPU and USB configuration */
+/* ------------------------------------------------------------------------- */
+
+#define USB_CFG_IOPORTNAME B
+ /* This is the port where the USB bus is connected. When you configure it to
+ * "B", the registers PORTB, PINB and DDRB will be used.
+ */
+
+#define USB_CFG_DMINUS_BIT 0
+/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
+ * This may be any bit in the port.
+ */
+#define USB_CFG_DPLUS_BIT 1
+/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
+ * This may be any bit in the port, but must be configured as a pin change interrupt.
+ */
+
+#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
+/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
+ * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
+ * require no crystal, they tolerate +/- 1% deviation from the nominal
+ * frequency. All other rates require a precision of 2000 ppm and thus a
+ * crystal!
+ * Since F_CPU should be defined to your actual clock rate anyway, you should
+ * not need to modify this setting.
+ */
+
+/* ------------- Set up interrupt configuration (CPU specific) -------------- */
+/* The register names change quite a bit in the ATtiny family. Pay attention */
+/* to the manual. Note that the interrupt flag system is still used even though */
+/* interrupts are disabled. So this has to be configured correctly. */
+
+
+// setup interrupt for Pin Change for D+
+#define USB_INTR_CFG PCMSK1
+#define USB_INTR_CFG_SET (1 << USB_CFG_DPLUS_BIT)
+#define USB_INTR_CFG_CLR 0
+#define USB_INTR_ENABLE GIMSK
+#define USB_INTR_ENABLE_BIT PCIE1
+#define USB_INTR_PENDING GIFR
+#define USB_INTR_PENDING_BIT PCIF1
+#define USB_INTR_VECTOR PCINT1_vect
+
+/* ------------------------------------------------------------------------- */
+/* Configuration relevant to the CPU the bootloader is running on */
+/* ------------------------------------------------------------------------- */
+
+// how many milliseconds should host wait till it sends another erase or write?
+// needs to be above 4.5 (and a whole integer) as avr freezes for 4.5ms
+
+// Set bit 7 to reduce wait time for page erase by factor of four
+#define MICRONUCLEUS_WRITE_SLEEP 128 + 5
+
+// ATtiny841 does not know OSCCAL
+#ifndef OSCCAL
+#define OSCCAL OSCCAL0
+#endif
+
+/* ---------------------- feature / code size options ---------------------- */
+/* Configure the behavior of the bootloader here */
+/* ------------------------------------------------------------------------- */
+
+/*
+ * Define Bootloader entry condition
+ *
+ * If the entry condition is not met, the bootloader will not be activated and the user program
+ * is executed directly after a reset. If no user program has been loaded, the bootloader
+ * is always active.
+ *
+ * ENTRY_ALWAYS Always activate the bootloader after reset. Requires the least
+ * amount of code.
+ *
+ * ENTRY_WATCHDOG Activate the bootloader after a watchdog reset. This can be used
+ * to enter the bootloader from the user program.
+ * Adds 22 bytes.
+ *
+ * ENTRY_EXT_RESET Activate the bootloader after an external reset was issued by
+ * pulling the reset pin low. It may be necessary to add an external
+ * pull-up resistor to the reset pin if this entry method appears to
+ * behave unreliably.
+ * Adds 22 bytes.
+ *
+ * ENTRY_JUMPER Activate the bootloader when a specific pin is pulled low by an
+ * external jumper.
+ * Adds 34 bytes.
+ *
+ * JUMPER_PIN Pin the jumper is connected to. (e.g. PB0)
+ * JUMPER_PORT Port out register for the jumper (e.g. PORTB)
+ * JUMPER_DDR Port data direction register for the jumper (e.g. DDRB)
+ * JUMPER_INP Port inout register for the jumper (e.g. PINB)
+ *
+ */
+
+#define ENTRYMODE ENTRY_EXT_RESET
+
+#define JUMPER_PIN PB0
+#define JUMPER_PORT PORTB
+#define JUMPER_DDR DDRB
+#define JUMPER_INP PINB
+
+/*
+ Internal implementation, don't change this unless you want to add an entrymode.
+*/
+
+#define ENTRY_ALWAYS 1
+#define ENTRY_WATCHDOG 2
+#define ENTRY_EXT_RESET 3
+#define ENTRY_JUMPER 4
+
+#if ENTRYMODE==ENTRY_ALWAYS
+ #define bootLoaderInit()
+ #define bootLoaderExit()
+ #define bootLoaderStartCondition() 1
+#elif ENTRYMODE==ENTRY_WATCHDOG
+ #define bootLoaderInit()
+ #define bootLoaderExit()
+ #define bootLoaderStartCondition() (MCUSR&_BV(WDRF))
+#elif ENTRYMODE==ENTRY_EXT_RESET
+ #define bootLoaderInit()
+ #define bootLoaderExit()
+ #define bootLoaderStartCondition() (MCUSR&_BV(EXTRF))
+#elif ENTRYMODE==ENTRY_JUMPER
+ // Enable pull up on jumper pin and delay to stabilize input
+ #define bootLoaderInit() {JUMPER_DDR&=~_BV(JUMPER_PIN);JUMPER_PORT|=_BV(JUMPER_PIN);_delay_ms(1);}
+ #define bootLoaderExit() {JUMPER_PORT&=~_BV(JUMPER_PIN);}
+ #define bootLoaderStartCondition() (!(JUMPER_INP&_BV(JUMPER_PIN)))
+#else
+ #error "No entry mode defined"
+#endif
+
+/*
+ * Define bootloader timeout value.
+ *
+ * The bootloader will only time out if a user program was loaded.
+ *
+ * AUTO_EXIT_NO_USB_MS The bootloader will exit after this delay if no USB is connected.
+ * Set to 0 to disable
+ * Adds ~6 bytes.
+ * (This will wait for an USB SE0 reset from the host)
+ *
+ * AUTO_EXIT_MS The bootloader will exit after this delay if no USB communication
+ * from the host tool was received.
+ * Set to 0 to disable
+ *
+ * All values are approx. in milliseconds
+ */
+
+#define AUTO_EXIT_NO_USB_MS 0
+#define AUTO_EXIT_MS 6000
+
+ /*
+ * Defines the setting of the RC-oscillator calibration after quitting the bootloader. (OSCCAL)
+ *
+ * OSCCAL_RESTORE_DEFAULT Set this to '1' to revert to OSCCAL factore calibration after bootlaoder exit.
+ * This is 8 MHz +/-2% on most devices or 16 MHz on the ATtiny 85 with activated PLL.
+ * Adds ~14 bytes.
+ *
+ * OSCCAL_SAVE_CALIB Set this to '1' to save the OSCCAL calibration during program upload.
+ * This value will be reloaded after reset and will also be used for the user
+ * program unless "OSCCAL_RESTORE_DEFAULT" is active. This allows calibrate the internal
+ * RC oscillator to the F_CPU target frequency +/-1% from the USB timing. Please note
+ * that only true if the ambient temperature does not change.
+ * Adds ~38 bytes.
+ *
+ * OSCCAL_HAVE_XTAL Set this to '1' if you have an external crystal oscillator. In this case no attempt
+ * will be made to calibrate the oscillator. You should deactivate both options above
+ * if you use this to avoid redundant code.
+ *
+ * If both options are selected, OSCCAL_RESTORE_DEFAULT takes precedence.
+ *
+ * If no option is selected, OSCCAL will be left untouched and stays at either factory calibration or F_CPU depending
+ * on whether the bootloader was activated. This will take the least memory. You can use this if your program
+ * comes with its own OSCCAL calibration or an external clock source is used.
+ */
+
+#define OSCCAL_ENTRY_ALWAYS
+#define OSCCAL_SAVE_CALIB 1
+#define OSCCAL_HAVE_XTAL 0
+
+/*
+ * Defines handling of an indicator LED while the bootloader is active.
+ *
+ * LED_MODE Define behavior of attached LED or suppress LED code.
+ *
+ * NONE Do not generate LED code (gains 18 bytes).
+ * ACTIVE_HIGH LED is on when output pin is high. This will toggle bettwen 1 and 0.
+ * ACTIVE_LOW LED is on when output pin is low. This will toggle between Z and 0.
+ *
+ * LED_DDR,LED_PORT,LED_PIN Where is your LED connected?
+ *
+ */
+
+#define LED_MODE ACTIVE_LOW
+
+#define LED_DDR DDRB
+#define LED_PORT PORTB
+#define LED_PIN PB2
+
+/*
+ * This is the implementation of the LED code. Change the configuration above unless you want to
+ * change the led behavior
+ *
+ * LED_INIT Called once after bootloader entry
+ * LED_EXIT Called once during bootloader exit
+ * LED_MACRO Called in the main loop with the idle counter as parameter.
+ * Use to define pattern.
+*/
+
+#define NONE 0
+#define ACTIVE_HIGH 1
+#define ACTIVE_LOW 2
+
+#if LED_MODE==ACTIVE_HIGH
+ #define LED_INIT(x) LED_DDR = _BV(LED_PIN);
+ #define LED_EXIT(x) {LED_DDR &=~_BV(LED_PIN);LED_PORT &=~_BV(LED_PIN);}
+ #define LED_MACRO(x) if ( x & 0x4c ) {LED_PORT&=~_BV(LED_PIN);} else {LED_PORT|=_BV(LED_PIN);}
+#elif LED_MODE==ACTIVE_LOW
+ #define LED_INIT(x) LED_PORT &=~_BV(LED_PIN);
+ #define LED_EXIT(x) LED_DDR &=~_BV(LED_PIN);
+ #define LED_MACRO(x) if ( x & 0x4c ) {LED_DDR&=~_BV(LED_PIN);} else {LED_DDR|=_BV(LED_PIN);}
+#elif LED_MODE==NONE
+ #define LED_INIT(x)
+ #define LED_EXIT(x)
+ #define LED_MACRO(x)
+#endif
+
+/* --------------------------------------------------------------------------- */
+/* Micronucleus internal configuration. Do not change anything below this line */
+/* --------------------------------------------------------------------------- */
+
+// Microcontroller vectortable entries in the flash
+#define RESET_VECTOR_OFFSET 0
+
+// number of bytes before the boot loader vectors to store the tiny application vector table
+#define TINYVECTOR_RESET_OFFSET 4
+#define TINYVECTOR_OSCCAL_OFFSET 6
+
+/* ------------------------------------------------------------------------ */
+// postscript are the few bytes at the end of programmable memory which store tinyVectors
+#define POSTSCRIPT_SIZE 6
+#define PROGMEM_SIZE (BOOTLOADER_ADDRESS - POSTSCRIPT_SIZE) /* max size of user program */
+
+#endif /* __bootloader_h_included__ */
diff --git a/firmware/configuration/t84_default/Makefile.inc b/firmware/configuration/t84_default/Makefile.inc
new file mode 100644
index 0000000..5213b19
--- /dev/null
+++ b/firmware/configuration/t84_default/Makefile.inc
@@ -0,0 +1,63 @@
+# Name: Makefile
+# Project: Micronucleus
+# License: GNU GPL v2 (see License.txt)
+#
+# Controller type: ATtiny 84
+# Configuration: Default configuration - 12 Mhz RC oscillator
+# Last Change: Mar 16,2014
+
+
+F_CPU = 12000000
+DEVICE = attiny84
+
+# hexadecimal address for bootloader section to begin. To calculate the best value:
+# - make clean; make main.hex; ### output will list data: 2124 (or something like that)
+# - for the size of your device (8kb = 1024 * 8 = 8192) subtract above value 2124... = 6068
+# - How many pages in is that? 6068 / 64 (tiny85 page size in bytes) = 94.8125
+# - round that down to 94 - our new bootloader address is 94 * 64 = 6016, in hex = 1780
+BOOTLOADER_ADDRESS = 1A00
+
+FUSEOPT = -U lfuse:w:0xe2:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m
+FUSEOPT_DISABLERESET = # TODO
+
+
+#---------------------------------------------------------------------
+# ATtiny84
+#---------------------------------------------------------------------
+# Fuse extended byte:
+# 0xFE = - - - - - 1 1 0
+# ^
+# |
+# +---- SELFPRGEN (enable self programming flash)
+#
+# Fuse high byte:
+# 0xdd = 1 1 0 1 1 1 0 1
+# ^ ^ ^ ^ ^ \-+-/
+# | | | | | +------ BODLEVEL 2..0 (brownout trigger level -> 2.7V)
+# | | | | +---------- EESAVE (preserve EEPROM on Chip Erase -> not preserved)
+# | | | +-------------- WDTON (watchdog timer always on -> disable)
+# | | +---------------- SPIEN (enable serial programming -> enabled)
+# | +------------------ DWEN (debug wire enable)
+# +-------------------- RSTDISBL (disable external reset -> enabled)
+#
+# Fuse high byte ("no reset": external reset disabled, can't program through SPI anymore)
+# 0x5d = 0 1 0 1 1 1 0 1
+# ^ ^ ^ ^ ^ \-+-/
+# | | | | | +------ BODLEVEL 2..0 (brownout trigger level -> 2.7V)
+# | | | | +---------- EESAVE (preserve EEPROM on Chip Erase -> not preserved)
+# | | | +-------------- WDTON (watchdog timer always on -> disable)
+# | | +---------------- SPIEN (enable serial programming -> enabled)
+# | +------------------ DWEN (debug wire enable)
+# +-------------------- RSTDISBL (disable external reset -> disabled!)
+#
+# Fuse low byte:
+# 0xe1 = 1 1 1 0 0 0 1 0
+# ^ ^ \+/ \--+--/
+# | | | +------- CKSEL 3..0 (clock selection -> RC Oscillator)
+# | | +--------------- SUT 1..0 (BOD enabled, fast rising power)
+# | +------------------ CKOUT (clock output on CKOUT pin -> disabled)
+# +-------------------- CKDIV8 (divide clock by 8 -> don't divide)
+
+
+
+
diff --git a/firmware/configuration/t84_default/bootloaderconfig.h b/firmware/configuration/t84_default/bootloaderconfig.h
new file mode 100644
index 0000000..05748ad
--- /dev/null
+++ b/firmware/configuration/t84_default/bootloaderconfig.h
@@ -0,0 +1,265 @@
+/* Name: bootloaderconfig.h
+ * Micronucleus configuration file.
+ * This file (together with some settings in Makefile.inc) configures the boot loader
+ * according to the hardware.
+ *
+ * Controller type: ATtiny 84 - 12 MHz
+ * Configuration: Default configuration
+ * USB D- : PB0
+ * USB D+ : PB1
+ * Entry : Always
+ * LED : PB2, Active Low
+ * OSCCAL : Revert to precalibrated value (8 MHz)
+ * Note: can use 12 MHz V-USB without PLL due to stable RC-osc in ATTiny84A
+ * Last Change: Mar 16,2014
+ *
+ * License: GNU GPL v2 (see License.txt
+ */
+
+#ifndef __bootloaderconfig_h_included__
+#define __bootloaderconfig_h_included__
+
+/* ------------------------------------------------------------------------- */
+/* Hardware configuration. */
+/* Change this according to your CPU and USB configuration */
+/* ------------------------------------------------------------------------- */
+
+#define USB_CFG_IOPORTNAME B
+ /* This is the port where the USB bus is connected. When you configure it to
+ * "B", the registers PORTB, PINB and DDRB will be used.
+ */
+
+#define USB_CFG_DMINUS_BIT 0
+/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
+ * This may be any bit in the port.
+ */
+#define USB_CFG_DPLUS_BIT 1
+/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
+ * This may be any bit in the port, but must be configured as a pin change interrupt.
+ */
+
+#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
+/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
+ * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
+ * require no crystal, they tolerate +/- 1% deviation from the nominal
+ * frequency. All other rates require a precision of 2000 ppm and thus a
+ * crystal!
+ * Since F_CPU should be defined to your actual clock rate anyway, you should
+ * not need to modify this setting.
+ */
+
+/* ------------- Set up interrupt configuration (CPU specific) -------------- */
+/* The register names change quite a bit in the ATtiny family. Pay attention */
+/* to the manual. Note that the interrupt flag system is still used even though */
+/* interrupts are disabled. So this has to be configured correctly. */
+
+
+// setup interrupt for Pin Change for D+
+#define USB_INTR_CFG PCMSK1
+#define USB_INTR_CFG_SET (1 << USB_CFG_DPLUS_BIT)
+#define USB_INTR_CFG_CLR 0
+#define USB_INTR_ENABLE GIMSK
+#define USB_INTR_ENABLE_BIT PCIE1
+#define USB_INTR_PENDING GIFR
+#define USB_INTR_PENDING_BIT PCIF1
+#define USB_INTR_VECTOR PCINT1_vect
+
+/* ------------------------------------------------------------------------- */
+/* Configuration relevant to the CPU the bootloader is running on */
+/* ------------------------------------------------------------------------- */
+
+// how many milliseconds should host wait till it sends another erase or write?
+// needs to be above 4.5 (and a whole integer) as avr freezes for 4.5ms
+
+#define MICRONUCLEUS_WRITE_SLEEP 5
+
+// ATtiny84 does not know WDTCR
+#ifndef WDTCR
+#define WDTCR WDTCSR
+#endif
+
+/* ---------------------- feature / code size options ---------------------- */
+/* Configure the behavior of the bootloader here */
+/* ------------------------------------------------------------------------- */
+
+/*
+ * Define Bootloader entry condition
+ *
+ * If the entry condition is not met, the bootloader will not be activated and the user program
+ * is executed directly after a reset. If no user program has been loaded, the bootloader
+ * is always active.
+ *
+ * ENTRY_ALWAYS Always activate the bootloader after reset. Requires the least
+ * amount of code.
+ *
+ * ENTRY_WATCHDOG Activate the bootloader after a watchdog reset. This can be used
+ * to enter the bootloader from the user program.
+ * Adds 22 bytes.
+ *
+ * ENTRY_EXT_RESET Activate the bootloader after an external reset was issued by
+ * pulling the reset pin low. It may be necessary to add an external
+ * pull-up resistor to the reset pin if this entry method appears to
+ * behave unreliably.
+ * Adds 22 bytes.
+ *
+ * ENTRY_JUMPER Activate the bootloader when a specific pin is pulled low by an
+ * external jumper.
+ * Adds 34 bytes.
+ *
+ * JUMPER_PIN Pin the jumper is connected to. (e.g. PB0)
+ * JUMPER_PORT Port out register for the jumper (e.g. PORTB)
+ * JUMPER_DDR Port data direction register for the jumper (e.g. DDRB)
+ * JUMPER_INP Port inout register for the jumper (e.g. PINB)
+ *
+ */
+
+#define ENTRYMODE ENTRY_ALWAYS
+
+#define JUMPER_PIN PB0
+#define JUMPER_PORT PORTB
+#define JUMPER_DDR DDRB
+#define JUMPER_INP PINB
+
+/*
+ Internal implementation, don't change this unless you want to add an entrymode.
+*/
+
+#define ENTRY_ALWAYS 1
+#define ENTRY_WATCHDOG 2
+#define ENTRY_EXT_RESET 3
+#define ENTRY_JUMPER 4
+
+#if ENTRYMODE==ENTRY_ALWAYS
+ #define bootLoaderInit()
+ #define bootLoaderExit()
+ #define bootLoaderStartCondition() 1
+#elif ENTRYMODE==ENTRY_WATCHDOG
+ #define bootLoaderInit()
+ #define bootLoaderExit()
+ #define bootLoaderStartCondition() (MCUSR&_BV(WDRF))
+#elif ENTRYMODE==ENTRY_EXT_RESET
+ #define bootLoaderInit()
+ #define bootLoaderExit()
+ #define bootLoaderStartCondition() (MCUSR&_BV(EXTRF))
+#elif ENTRYMODE==ENTRY_JUMPER
+ // Enable pull up on jumper pin and delay to stabilize input
+ #define bootLoaderInit() {JUMPER_DDR&=~_BV(JUMPER_PIN);JUMPER_PORT|=_BV(JUMPER_PIN);_delay_ms(1);}
+ #define bootLoaderExit() {JUMPER_PORT&=~_BV(JUMPER_PIN);}
+ #define bootLoaderStartCondition() (!(JUMPER_INP&_BV(JUMPER_PIN)))
+#else
+ #error "No entry mode defined"
+#endif
+
+/*
+ * Define bootloader timeout value.
+ *
+ * The bootloader will only time out if a user program was loaded.
+ *
+ * AUTO_EXIT_NO_USB_MS The bootloader will exit after this delay if no USB is connected.
+ * Set to 0 to disable
+ * Adds ~6 bytes.
+ * (This will wait for an USB SE0 reset from the host)
+ *
+ * AUTO_EXIT_MS The bootloader will exit after this delay if no USB communication
+ * from the host tool was received.
+ * Set to 0 to disable
+ *
+ * All values are approx. in milliseconds
+ */
+
+#define AUTO_EXIT_NO_USB_MS 0
+#define AUTO_EXIT_MS 6000
+
+ /*
+ * Defines the setting of the RC-oscillator calibration after quitting the bootloader. (OSCCAL)
+ *
+ * OSCCAL_RESTORE_DEFAULT Set this to '1' to revert to OSCCAL factore calibration after bootlaoder exit.
+ * This is 8 MHz +/-2% on most devices or 16 MHz on the ATtiny 85 with activated PLL.
+ * Adds ~14 bytes.
+ *
+ * OSCCAL_SAVE_CALIB Set this to '1' to save the OSCCAL calibration during program upload.
+ * This value will be reloaded after reset and will also be used for the user
+ * program unless "OSCCAL_RESTORE_DEFAULT" is active. This allows calibrate the internal
+ * RC oscillator to the F_CPU target frequency +/-1% from the USB timing. Please note
+ * that only true if the ambient temperature does not change.
+ * Adds ~38 bytes.
+ *
+ * OSCCAL_HAVE_XTAL Set this to '1' if you have an external crystal oscillator. In this case no attempt
+ * will be made to calibrate the oscillator. You should deactivate both options above
+ * if you use this to avoid redundant code.
+ *
+ * If both options are selected, OSCCAL_RESTORE_DEFAULT takes precedence.
+ *
+ * If no option is selected, OSCCAL will be left untouched and stays at either factory calibration or F_CPU depending
+ * on whether the bootloader was activated. This will take the least memory. You can use this if your program
+ * comes with its own OSCCAL calibration or an external clock source is used.
+ */
+
+#define OSCCAL_RESTORE_DEFAULT 1
+#define OSCCAL_SAVE_CALIB 0
+#define OSCCAL_HAVE_XTAL 0
+
+/*
+ * Defines handling of an indicator LED while the bootloader is active.
+ *
+ * LED_MODE Define behavior of attached LED or suppress LED code.
+ *
+ * NONE Do not generate LED code (gains 18 bytes).
+ * ACTIVE_HIGH LED is on when output pin is high. This will toggle bettwen 1 and 0.
+ * ACTIVE_LOW LED is on when output pin is low. This will toggle between Z and 0.
+ *
+ * LED_DDR,LED_PORT,LED_PIN Where is your LED connected?
+ *
+ */
+
+#define LED_MODE ACTIVE_LOW
+
+#define LED_DDR DDRB
+#define LED_PORT PORTB
+#define LED_PIN PB2
+
+/*
+ * This is the implementation of the LED code. Change the configuration above unless you want to
+ * change the led behavior
+ *
+ * LED_INIT Called once after bootloader entry
+ * LED_EXIT Called once during bootloader exit
+ * LED_MACRO Called in the main loop with the idle counter as parameter.
+ * Use to define pattern.
+*/
+
+#define NONE 0
+#define ACTIVE_HIGH 1
+#define ACTIVE_LOW 2
+
+#if LED_MODE==ACTIVE_HIGH
+ #define LED_INIT(x) LED_DDR = _BV(LED_PIN);
+ #define LED_EXIT(x) {LED_DDR &=~_BV(LED_PIN);LED_PORT &=~_BV(LED_PIN);}
+ #define LED_MACRO(x) if ( x & 0x4c ) {LED_PORT&=~_BV(LED_PIN);} else {LED_PORT|=_BV(LED_PIN);}
+#elif LED_MODE==ACTIVE_LOW
+ #define LED_INIT(x) LED_PORT &=~_BV(LED_PIN);
+ #define LED_EXIT(x) LED_DDR &=~_BV(LED_PIN);
+ #define LED_MACRO(x) if ( x & 0x4c ) {LED_DDR&=~_BV(LED_PIN);} else {LED_DDR|=_BV(LED_PIN);}
+#elif LED_MODE==NONE
+ #define LED_INIT(x)
+ #define LED_EXIT(x)
+ #define LED_MACRO(x)
+#endif
+
+/* --------------------------------------------------------------------------- */
+/* Micronucleus internal configuration. Do not change anything below this line */
+/* --------------------------------------------------------------------------- */
+
+// Microcontroller vectortable entries in the flash
+#define RESET_VECTOR_OFFSET 0
+
+// number of bytes before the boot loader vectors to store the tiny application vector table
+#define TINYVECTOR_RESET_OFFSET 4
+#define TINYVECTOR_OSCCAL_OFFSET 6
+
+/* ------------------------------------------------------------------------ */
+// postscript are the few bytes at the end of programmable memory which store tinyVectors
+#define POSTSCRIPT_SIZE 6
+#define PROGMEM_SIZE (BOOTLOADER_ADDRESS - POSTSCRIPT_SIZE) /* max size of user program */
+
+#endif /* __bootloader_h_included__ */
diff --git a/firmware/configuration/t85_aggressive/Makefile.inc b/firmware/configuration/t85_aggressive/Makefile.inc
new file mode 100644
index 0000000..4675ae9
--- /dev/null
+++ b/firmware/configuration/t85_aggressive/Makefile.inc
@@ -0,0 +1,68 @@
+# Name: Makefile
+# Project: Micronucleus
+# License: GNU GPL v2 (see License.txt)
+
+# Controller type: ATtiny 85
+# Configuration: Size optimized. Uses 16 MHz V-USB implementation, which may be instable with some computers
+# Last Change: Jan 11,2015
+
+# Enable unsafe optimizions. This will disable several safety features in microncleus to save around 40 more bytes
+#
+# Disabled features:
+# * Stack pointer and SREG initialization in CRT
+# * Client side reset vector patching
+# * USB collision detection. Micronucleus will not work reliability with hubs if this is disabled.
+
+CFLAGS += -DENABLE_UNSAFE_OPTIMIZATIONS
+
+F_CPU = 16000000
+DEVICE = attiny85
+
+# hexadecimal address for bootloader section to begin. To calculate the best value:
+# - make clean; make main.hex; ### output will list data: 2124 (or something like that)
+# - for the size of your device (8kb = 1024 * 8 = 8192) subtract above value 2124... = 6068
+# - How many pages in is that? 6068 / 64 (tiny85 page size in bytes) = 94.8125
+# - round that down to 94 - our new bootloader address is 94 * 64 = 6016, in hex = 1780
+BOOTLOADER_ADDRESS = 1A40
+
+FUSEOPT = -U lfuse:w:0xe1:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m
+FUSEOPT_DISABLERESET = -U lfuse:w:0xe1:m -U efuse:w:0xfe:m -U hfuse:w:0x5d:m
+
+#---------------------------------------------------------------------
+# ATtiny85
+#---------------------------------------------------------------------
+# Fuse extended byte:
+# 0xFE = - - - - - 1 1 0
+# ^
+# |
+# +---- SELFPRGEN (enable self programming flash)
+#
+# Fuse high byte:
+# 0xdd = 1 1 0 1 1 1 0 1
+# ^ ^ ^ ^ ^ \-+-/
+# | | | | | +------ BODLEVEL 2..0 (brownout trigger level -> 2.7V)
+# | | | | +---------- EESAVE (preserve EEPROM on Chip Erase -> not preserved)
+# | | | +-------------- WDTON (watchdog timer always on -> disable)
+# | | +---------------- SPIEN (enable serial programming -> enabled)
+# | +------------------ DWEN (debug wire enable)
+# +-------------------- RSTDISBL (disable external reset -> enabled)
+#
+# Fuse high byte ("no reset": external reset disabled, can't program through SPI anymore)
+# 0x5d = 0 1 0 1 1 1 0 1
+# ^ ^ ^ ^ ^ \-+-/
+# | | | | | +------ BODLEVEL 2..0 (brownout trigger level -> 2.7V)
+# | | | | +---------- EESAVE (preserve EEPROM on Chip Erase -> not preserved)
+# | | | +-------------- WDTON (watchdog timer always on -> disable)
+# | | +---------------- SPIEN (enable serial programming -> enabled)
+# | +------------------ DWEN (debug wire enable)
+# +-------------------- RSTDISBL (disable external reset -> disabled!)
+#
+# Fuse low byte:
+# 0xe1 = 1 1 1 0 0 0 0 1
+# ^ ^ \+/ \--+--/
+# | | | +------- CKSEL 3..0 (clock selection -> HF PLL)
+# | | +--------------- SUT 1..0 (BOD enabled, fast rising power)
+# | +------------------ CKOUT (clock output on CKOUT pin -> disabled)
+# +-------------------- CKDIV8 (divide clock by 8 -> don't divide)
+
+###############################################################################
diff --git a/firmware/configuration/t85_aggressive/bootloaderconfig.h b/firmware/configuration/t85_aggressive/bootloaderconfig.h
new file mode 100644
index 0000000..5cd1266
--- /dev/null
+++ b/firmware/configuration/t85_aggressive/bootloaderconfig.h
@@ -0,0 +1,262 @@
+ /* Name: bootloaderconfig.h
+ * Micronucleus configuration file.
+ * This file (together with some settings in Makefile.inc) configures the boot loader
+ * according to the hardware.
+ *
+ * Controller type: ATtiny 85 - 16 MHz
+ * Configuration: Aggresively size optimized configuration
+ * USB D- : PB3
+ * USB D+ : PB4
+ * Entry : Always
+ * LED : None
+ * OSCCAL : Stays at 16 MHz
+ * Note: Uses 16 MHz V-USB implementation.
+ * Worked reliably in all tests, but is possibly less stable than 16.5M Hz Implementation with PLL
+ * Last Change: Jan 11,2015
+ *
+ * License: GNU GPL v2 (see License.txt
+ */
+
+#ifndef __bootloaderconfig_h_included__
+#define __bootloaderconfig_h_included__
+
+/* ------------------------------------------------------------------------- */
+/* Hardware configuration. */
+/* Change this according to your CPU and USB configuration */
+/* ------------------------------------------------------------------------- */
+
+#define USB_CFG_IOPORTNAME B
+ /* This is the port where the USB bus is connected. When you configure it to
+ * "B", the registers PORTB, PINB and DDRB will be used.
+ */
+
+#define USB_CFG_DMINUS_BIT 3
+/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
+ * This may be any bit in the port.
+ */
+#define USB_CFG_DPLUS_BIT 4
+/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
+ * This may be any bit in the port, but must be configured as a pin change interrupt.
+ */
+
+#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
+/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
+ * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
+ * require no crystal, they tolerate +/- 1% deviation from the nominal
+ * frequency. All other rates require a precision of 2000 ppm and thus a
+ * crystal!
+ * Since F_CPU should be defined to your actual clock rate anyway, you should
+ * not need to modify this setting.
+ */
+
+/* ------------- Set up interrupt configuration (CPU specific) -------------- */
+/* The register names change quite a bit in the ATtiny family. Pay attention */
+/* to the manual. Note that the interrupt flag system is still used even though */
+/* interrupts are disabled. So this has to be configured correctly. */
+
+
+// setup interrupt for Pin Change for D+
+#define USB_INTR_CFG PCMSK
+#define USB_INTR_CFG_SET (1 << USB_CFG_DPLUS_BIT)
+#define USB_INTR_CFG_CLR 0
+#define USB_INTR_ENABLE GIMSK
+#define USB_INTR_ENABLE_BIT PCIE
+#define USB_INTR_PENDING GIFR
+#define USB_INTR_PENDING_BIT PCIF
+#define USB_INTR_VECTOR PCINT0_vect
+
+/* ------------------------------------------------------------------------- */
+/* Configuration relevant to the CPU the bootloader is running on */
+/* ------------------------------------------------------------------------- */
+
+// how many milliseconds should host wait till it sends another erase or write?
+// needs to be above 4.5 (and a whole integer) as avr freezes for 4.5ms
+#define MICRONUCLEUS_WRITE_SLEEP 5
+
+
+/* ---------------------- feature / code size options ---------------------- */
+/* Configure the behavior of the bootloader here */
+/* ------------------------------------------------------------------------- */
+
+/*
+ * Define Bootloader entry condition
+ *
+ * If the entry condition is not met, the bootloader will not be activated and the user program
+ * is executed directly after a reset. If no user program has been loaded, the bootloader
+ * is always active.
+ *
+ * ENTRY_ALWAYS Always activate the bootloader after reset. Requires the least
+ * amount of code.
+ *
+ * ENTRY_WATCHDOG Activate the bootloader after a watchdog reset. This can be used
+ * to enter the bootloader from the user program.
+ * Adds 22 bytes.
+ *
+ * ENTRY_EXT_RESET Activate the bootloader after an external reset was issued by
+ * pulling the reset pin low. It may be necessary to add an external
+ * pull-up resistor to the reset pin if this entry method appears to
+ * behave unreliably.
+ * Adds 22 bytes.
+ *
+ * ENTRY_JUMPER Activate the bootloader when a specific pin is pulled low by an
+ * external jumper.
+ * Adds 34 bytes.
+ *
+ * JUMPER_PIN Pin the jumper is connected to. (e.g. PB0)
+ * JUMPER_PORT Port out register for the jumper (e.g. PORTB)
+ * JUMPER_DDR Port data direction register for the jumper (e.g. DDRB)
+ * JUMPER_INP Port inout register for the jumper (e.g. PINB)
+ *
+ */
+
+#define ENTRYMODE ENTRY_ALWAYS
+
+#define JUMPER_PIN PB0
+#define JUMPER_PORT PORTB
+#define JUMPER_DDR DDRB
+#define JUMPER_INP PINB
+
+/*
+ Internal implementation, don't change this unless you want to add an entrymode.
+*/
+
+#define ENTRY_ALWAYS 1
+#define ENTRY_WATCHDOG 2
+#define ENTRY_EXT_RESET 3
+#define ENTRY_JUMPER 4
+
+#if ENTRYMODE==ENTRY_ALWAYS
+ #define bootLoaderInit()
+ #define bootLoaderExit()
+ #define bootLoaderStartCondition() 1
+#elif ENTRYMODE==ENTRY_WATCHDOG
+ #define bootLoaderInit()
+ #define bootLoaderExit()
+ #define bootLoaderStartCondition() (MCUSR&_BV(WDRF))
+#elif ENTRYMODE==ENTRY_EXT_RESET
+ #define bootLoaderInit()
+ #define bootLoaderExit()
+ #define bootLoaderStartCondition() (MCUSR&_BV(EXTRF))
+#elif ENTRYMODE==ENTRY_JUMPER
+ // Enable pull up on jumper pin and delay to stabilize input
+ #define bootLoaderInit() {JUMPER_DDR&=~_BV(JUMPER_PIN);JUMPER_PORT|=_BV(JUMPER_PIN);_delay_ms(1);}
+ #define bootLoaderExit() {JUMPER_PORT&=~_BV(JUMPER_PIN);}
+ #define bootLoaderStartCondition() (!(JUMPER_INP&_BV(JUMPER_PIN)))
+#else
+ #error "No entry mode defined"
+#endif
+
+/*
+ * Define bootloader timeout value.
+ *
+ * The bootloader will only time out if a user program was loaded.
+ *
+ * AUTO_EXIT_NO_USB_MS The bootloader will exit after this delay if no USB is connected.
+ * Set to 0 to disable
+ * Adds ~6 bytes.
+ * (This will wait for an USB SE0 reset from the host)
+ *
+ * AUTO_EXIT_MS The bootloader will exit after this delay if no USB communication
+ * from the host tool was received.
+ * Set to 0 to disable
+ *
+ * All values are approx. in milliseconds
+ */
+
+#define AUTO_EXIT_NO_USB_MS 0
+#define AUTO_EXIT_MS 6000
+
+ /*
+ * Defines the setting of the RC-oscillator calibration after quitting the bootloader. (OSCCAL)
+ *
+ * OSCCAL_RESTORE_DEFAULT Set this to '1' to revert to OSCCAL factore calibration after bootlaoder exit.
+ * This is 8 MHz +/-2% on most devices or 16 MHz on the ATtiny 85 with activated PLL.
+ * Adds ~14 bytes.
+ *
+ * OSCCAL_SAVE_CALIB Set this to '1' to save the OSCCAL calibration during program upload.
+ * This value will be reloaded after reset and will also be used for the user
+ * program unless "OSCCAL_RESTORE_DEFAULT" is active. This allows calibrate the internal
+ * RC oscillator to the F_CPU target frequency +/-1% from the USB timing. Please note
+ * that only true if the ambient temperature does not change.
+ * Adds ~38 bytes.
+ *
+ * OSCCAL_HAVE_XTAL Set this to '1' if you have an external crystal oscillator. In this case no attempt
+ * will be made to calibrate the oscillator. You should deactivate both options above
+ * if you use this to avoid redundant code.
+ *
+ * If both options are selected, OSCCAL_RESTORE_DEFAULT takes precedence.
+ *
+ * If no option is selected, OSCCAL will be left untouched and stays at either factory calibration or F_CPU depending
+ * on whether the bootloader was activated. This will take the least memory. You can use this if your program
+ * comes with its own OSCCAL calibration or an external clock source is used.
+ */
+
+#define OSCCAL_RESTORE_DEFAULT 0
+#define OSCCAL_SAVE_CALIB 0
+#define OSCCAL_HAVE_XTAL 0
+
+
+/*
+ * Defines handling of an indicator LED while the bootloader is active.
+ *
+ * LED_MODE Define behavior of attached LED or suppress LED code.
+ *
+ * NONE Do not generate LED code (gains 18 bytes).
+ * ACTIVE_HIGH LED is on when output pin is high. This will toggle bettwen 1 and 0.
+ * ACTIVE_LOW LED is on when output pin is low. This will toggle between Z and 0.
+ *
+ * LED_DDR,LED_PORT,LED_PIN Where is your LED connected?
+ *
+ */
+
+#define LED_MODE NONE
+
+#define LED_DDR DDRB
+#define LED_PORT PORTB
+#define LED_PIN PB1
+
+/*
+ * This is the implementation of the LED code. Change the configuration above unless you want to
+ * change the led behavior
+ *
+ * LED_INIT Called once after bootloader entry
+ * LED_EXIT Called once during bootloader exit
+ * LED_MACRO Called in the main loop with the idle counter as parameter.
+ * Use to define pattern.
+*/
+
+#define NONE 0
+#define ACTIVE_HIGH 1
+#define ACTIVE_LOW 2
+
+#if LED_MODE==ACTIVE_HIGH
+ #define LED_INIT(x) LED_DDR = _BV(LED_PIN);
+ #define LED_EXIT(x) {LED_DDR &=~_BV(LED_PIN);LED_PORT &=~_BV(LED_PIN);}
+ #define LED_MACRO(x) if ( x & 0x4c ) {LED_PORT&=~_BV(LED_PIN);} else {LED_PORT|=_BV(LED_PIN);}
+#elif LED_MODE==ACTIVE_LOW
+ #define LED_INIT(x) LED_PORT &=~_BV(LED_PIN);
+ #define LED_EXIT(x) LED_DDR &=~_BV(LED_PIN);
+ #define LED_MACRO(x) if ( x & 0x4c ) {LED_DDR&=~_BV(LED_PIN);} else {LED_DDR|=_BV(LED_PIN);}
+#elif LED_MODE==NONE
+ #define LED_INIT(x)
+ #define LED_EXIT(x)
+ #define LED_MACRO(x)
+#endif
+
+/* --------------------------------------------------------------------------- */
+/* Micronucleus internal configuration. Do not change anything below this line */
+/* --------------------------------------------------------------------------- */
+
+// Microcontroller vectortable entries in the flash
+#define RESET_VECTOR_OFFSET 0
+
+// number of bytes before the boot loader vectors to store the tiny application vector table
+#define TINYVECTOR_RESET_OFFSET 4
+#define TINYVECTOR_OSCCAL_OFFSET 6
+
+/* ------------------------------------------------------------------------ */
+// postscript are the few bytes at the end of programmable memory which store tinyVectors
+#define POSTSCRIPT_SIZE 6
+#define PROGMEM_SIZE (BOOTLOADER_ADDRESS - POSTSCRIPT_SIZE) /* max size of user program */
+
+#endif /* __bootloader_h_included__ */
diff --git a/firmware/configuration/t85_default/Makefile.inc b/firmware/configuration/t85_default/Makefile.inc
new file mode 100644
index 0000000..ee7252d
--- /dev/null
+++ b/firmware/configuration/t85_default/Makefile.inc
@@ -0,0 +1,60 @@
+# Name: Makefile
+# Project: Micronucleus
+# License: GNU GPL v2 (see License.txt)
+
+# Controller type: ATtiny 85 - 16.5 MHz
+# Configuration: Default
+# Last Change: Mar 16,2014
+
+
+F_CPU = 16500000
+DEVICE = attiny85
+
+# hexadecimal address for bootloader section to begin. To calculate the best value:
+# - make clean; make main.hex; ### output will list data: 2124 (or something like that)
+# - for the size of your device (8kb = 1024 * 8 = 8192) subtract above value 2124... = 6068
+# - How many pages in is that? 6068 / 64 (tiny85 page size in bytes) = 94.8125
+# - round that down to 94 - our new bootloader address is 94 * 64 = 6016, in hex = 1780
+BOOTLOADER_ADDRESS = 1980
+
+FUSEOPT = -U lfuse:w:0xe1:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m
+FUSEOPT_DISABLERESET = -U lfuse:w:0xe1:m -U efuse:w:0xfe:m -U hfuse:w:0x5d:m
+
+#---------------------------------------------------------------------
+# ATtiny85
+#---------------------------------------------------------------------
+# Fuse extended byte:
+# 0xFE = - - - - - 1 1 0
+# ^
+# |
+# +---- SELFPRGEN (enable self programming flash)
+#
+# Fuse high byte:
+# 0xdd = 1 1 0 1 1 1 0 1
+# ^ ^ ^ ^ ^ \-+-/
+# | | | | | +------ BODLEVEL 2..0 (brownout trigger level -> 2.7V)
+# | | | | +---------- EESAVE (preserve EEPROM on Chip Erase -> not preserved)
+# | | | +-------------- WDTON (watchdog timer always on -> disable)
+# | | +---------------- SPIEN (enable serial programming -> enabled)
+# | +------------------ DWEN (debug wire enable)
+# +-------------------- RSTDISBL (disable external reset -> enabled)
+#
+# Fuse high byte ("no reset": external reset disabled, can't program through SPI anymore)
+# 0x5d = 0 1 0 1 1 1 0 1
+# ^ ^ ^ ^ ^ \-+-/
+# | | | | | +------ BODLEVEL 2..0 (brownout trigger level -> 2.7V)
+# | | | | +---------- EESAVE (preserve EEPROM on Chip Erase -> not preserved)
+# | | | +-------------- WDTON (watchdog timer always on -> disable)
+# | | +---------------- SPIEN (enable serial programming -> enabled)
+# | +------------------ DWEN (debug wire enable)
+# +-------------------- RSTDISBL (disable external reset -> disabled!)
+#
+# Fuse low byte:
+# 0xe1 = 1 1 1 0 0 0 0 1
+# ^ ^ \+/ \--+--/
+# | | | +------- CKSEL 3..0 (clock selection -> HF PLL)
+# | | +--------------- SUT 1..0 (BOD enabled, fast rising power)
+# | +------------------ CKOUT (clock output on CKOUT pin -> disabled)
+# +-------------------- CKDIV8 (divide clock by 8 -> don't divide)
+
+###############################################################################
diff --git a/firmware/bootloaderconfig.h b/firmware/configuration/t85_default/bootloaderconfig.h
index a93e6ff..f86b3ac 100644
--- a/firmware/bootloaderconfig.h
+++ b/firmware/configuration/t85_default/bootloaderconfig.h
@@ -1,87 +1,33 @@
/* Name: bootloaderconfig.h
- * Project: USBaspLoader
- * Author: Christian Starkjohann
- * Creation Date: 2007-12-08
- * Tabsize: 4
- * Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH
- * Portions Copyright: (c) 2012 Louis Beaudoin
- * License: GNU GPL v2 (see License.txt)
- * This Revision: $Id: bootloaderconfig.h 729 2009-03-20 09:03:58Z cs $
+ * Micronucleus configuration file.
+ * This file (together with some settings in Makefile.inc) configures the boot loader
+ * according to the hardware.
+ *
+ * Controller type: ATtiny 85 - 16.5 MHz
+ * Configuration: Default configuration
+ * USB D- : PB3
+ * USB D+ : PB4
+ * Entry : Always
+ * LED : None
+ * OSCCAL : Stays at 16 MHz
+ * Note: Uses 16.5 MHz V-USB implementation with PLL
+ * Last Change: Mar 16,2014
+ *
+ * License: GNU GPL v2 (see License.txt
*/
-
#ifndef __bootloaderconfig_h_included__
#define __bootloaderconfig_h_included__
-/*
- * Bootloader defines
- */
-
-#ifndef __ASSEMBLER__
- typedef union {
- uint16_t w;
- uint8_t b[2];
- } uint16_union_t;
-#endif
-/*
-General Description:
-This file (together with some settings in Makefile) configures the boot loader
-according to the hardware.
-
-This file contains (besides the hardware configuration normally found in
-usbconfig.h) two functions or macros: bootLoaderInit() and
-bootLoaderCondition(). Whether you implement them as macros or as static
-inline functions is up to you, decide based on code size and convenience.
-
-bootLoaderInit() is called as one of the first actions after reset. It should
-be a minimum initialization of the hardware so that the boot loader condition
-can be read. This will usually consist of activating a pull-up resistor for an
-external jumper which selects boot loader mode.
-
-bootLoaderCondition() is called immediately after initialization and in each
-main loop iteration. If it returns TRUE, the boot loader will be active. If it
-returns FALSE, the boot loader jumps to address 0 (the loaded application)
-immediately.
-
-For compatibility with Thomas Fischl's avrusbboot, we also support the macro
-names BOOTLOADER_INIT and BOOTLOADER_CONDITION for this functionality. If
-these macros are defined, the boot loader uses them.
-*/
-
-#define TINY85_HARDWARE_CONFIG_1 1
-#define TINY85_HARDWARE_CONFIG_2 2
-
-/* ---------------------------- Hardware Config ---------------------------- */
-#define HARDWARE_CONFIG TINY85_HARDWARE_CONFIG_2
+/* ------------------------------------------------------------------------- */
+/* Hardware configuration. */
+/* Change this according to your CPU and USB configuration */
+/* ------------------------------------------------------------------------- */
#define USB_CFG_IOPORTNAME B
/* This is the port where the USB bus is connected. When you configure it to
* "B", the registers PORTB, PINB and DDRB will be used.
*/
-#ifndef __AVR_ATtiny85__
- # define USB_CFG_DMINUS_BIT 0
- /* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
- #define USB_CFG_DPLUS_BIT 2
- /* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0!
- */
-#endif
-
-#if (defined __AVR_ATtiny85__) && (HARDWARE_CONFIG == TINY85_HARDWARE_CONFIG_1)
- #define USB_CFG_DMINUS_BIT 0
- /* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
- #define USB_CFG_DPLUS_BIT 2
- /* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port, but must be configured as a pin change interrupt.
- */
-#endif
-
-#if (defined __AVR_ATtiny85__) && (HARDWARE_CONFIG == TINY85_HARDWARE_CONFIG_2)
#define USB_CFG_DMINUS_BIT 3
/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
* This may be any bit in the port.
@@ -90,43 +36,22 @@ these macros are defined, the boot loader uses them.
/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
* This may be any bit in the port, but must be configured as a pin change interrupt.
*/
-#endif
#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 16000 or 16500.
- * The 16.5 MHz version of the code requires no crystal, it tolerates +/- 1%
- * deviation from the nominal frequency. All other rates require a precision
- * of 2000 ppm and thus a crystal!
- * Default if not specified: 12 MHz
+/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
+ * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
+ * require no crystal, they tolerate +/- 1% deviation from the nominal
+ * frequency. All other rates require a precision of 2000 ppm and thus a
+ * crystal!
+ * Since F_CPU should be defined to your actual clock rate anyway, you should
+ * not need to modify this setting.
*/
-/* ----------------------- Optional Hardware Config ------------------------ */
+/* ------------- Set up interrupt configuration (CPU specific) -------------- */
+/* The register names change quite a bit in the ATtiny family. Pay attention */
+/* to the manual. Note that the interrupt flag system is still used even though */
+/* interrupts are disabled. So this has to be configured correctly. */
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* ------------------------------------------------------------------------- */
-/* ---------------------- feature / code size options ---------------------- */
-/* ------------------------------------------------------------------------- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* tiny85 Architecture Specifics */
-#ifndef __AVR_ATtiny85__
-# error "uBoot is only designed for attiny85"
-#endif
-#define TINY85MODE
-
-/* ------------- Set up interrupt configuration (CPU specific) -------------- */
// setup interrupt for Pin Change for D+
#define USB_INTR_CFG PCMSK
@@ -138,20 +63,17 @@ these macros are defined, the boot loader uses them.
#define USB_INTR_PENDING_BIT PCIF
#define USB_INTR_VECTOR PCINT0_vect
-// Microcontroller vectortable entries in the flash
-#define RESET_VECTOR_OFFSET 0
-#define USBPLUS_VECTOR_OFFSET 2
+/* ------------------------------------------------------------------------- */
+/* Configuration relevant to the CPU the bootloader is running on */
+/* ------------------------------------------------------------------------- */
-// number of bytes before the boot loader vectors to store the tiny application vector table
-#define TINYVECTOR_RESET_OFFSET 4
-#define TINYVECTOR_USBPLUS_OFFSET 2
-#define TINYVECTOR_OSCCAL_OFFSET 6
+// how many milliseconds should host wait till it sends another erase or write?
+// needs to be above 4.5 (and a whole integer) as avr freezes for 4.5ms
+#define MICRONUCLEUS_WRITE_SLEEP 5
-/* ------------------------------------------------------------------------ */
-// postscript are the few bytes at the end of programmable memory which store tinyVectors
-#define POSTSCRIPT_SIZE 6
-#define PROGMEM_SIZE (BOOTLOADER_ADDRESS - POSTSCRIPT_SIZE) /* max size of user program */
+/* ---------------------- feature / code size options ---------------------- */
+/* Configure the behavior of the bootloader here */
/* ------------------------------------------------------------------------- */
/*
@@ -192,6 +114,10 @@ these macros are defined, the boot loader uses them.
#define JUMPER_DDR DDRB
#define JUMPER_INP PINB
+/*
+ Internal implementation, don't change this unless you want to add an entrymode.
+*/
+
#define ENTRY_ALWAYS 1
#define ENTRY_WATCHDOG 2
#define ENTRY_EXT_RESET 3
@@ -236,60 +162,98 @@ these macros are defined, the boot loader uses them.
*/
#define AUTO_EXIT_NO_USB_MS 0
-#define AUTO_EXIT_MS 5000
+#define AUTO_EXIT_MS 6000
/*
- * Defines the setting of the RC-oscillator calibration after quitting the bootloader. (OSCCAL)
+ * Defines the setting of the RC-oscillator calibration after quitting the bootloader. (OSCCAL)
*
- * OSCCAL_RESTORE Set this to '1' to revert to factory calibration, which is 16.0 MHZ +/-10%
+ * OSCCAL_RESTORE_DEFAULT Set this to '1' to revert to OSCCAL factore calibration after bootlaoder exit.
+ * This is 8 MHz +/-2% on most devices or 16 MHz on the ATtiny 85 with activated PLL.
* Adds ~14 bytes.
*
- * OSCCAL_16.5MHz Set this to '1' to use the same calibration as during program upload.
- * This value is 16.5Mhz +/-1% as calibrated from the USB timing. Please note
+ * OSCCAL_SAVE_CALIB Set this to '1' to save the OSCCAL calibration during program upload.
+ * This value will be reloaded after reset and will also be used for the user
+ * program unless "OSCCAL_RESTORE_DEFAULT" is active. This allows calibrate the internal
+ * RC oscillator to the F_CPU target frequency +/-1% from the USB timing. Please note
* that only true if the ambient temperature does not change.
- * This is the default behaviour of the Digispark.
* Adds ~38 bytes.
*
- * If both options are selected, OSCCAL_RESTORE takes precedence.
+ * OSCCAL_HAVE_XTAL Set this to '1' if you have an external crystal oscillator. In this case no attempt
+ * will be made to calibrate the oscillator. You should deactivate both options above
+ * if you use this to avoid redundant code.
+ *
+ * If both options are selected, OSCCAL_RESTORE_DEFAULT takes precedence.
*
- * If no option is selected, OSCCAL will be left untouched and stay at either 16.0Mhz or 16.5Mhz depending
+ * If no option is selected, OSCCAL will be left untouched and stays at either factory calibration or F_CPU depending
* on whether the bootloader was activated. This will take the least memory. You can use this if your program
- * comes with its own OSCCAL calibration or an external clock source is used.
+ * comes with its own OSCCAL calibration or an external clock source is used.
*/
- #define OSCCAL_RESTORE 0
- #define OSCCAL_16_5MHz 1
-
+#define OSCCAL_RESTORE_DEFAULT 0
+#define OSCCAL_SAVE_CALIB 1
+#define OSCCAL_HAVE_XTAL 0
+
/*
* Defines handling of an indicator LED while the bootloader is active.
*
- * LED_PRESENT Set this this to '1' to active all LED related code. If this is 0, all other
- * defines are ignored.
- * Adds 18 bytes depending on implementation.
+ * LED_MODE Define behavior of attached LED or suppress LED code.
+ *
+ * NONE Do not generate LED code (gains 18 bytes).
+ * ACTIVE_HIGH LED is on when output pin is high. This will toggle bettwen 1 and 0.
+ * ACTIVE_LOW LED is on when output pin is low. This will toggle between Z and 0.
*
* LED_DDR,LED_PORT,LED_PIN Where is your LED connected?
*
+ */
+
+#define LED_MODE NONE
+
+#define LED_DDR DDRB
+#define LED_PORT PORTB
+#define LED_PIN PB1
+
+/*
+ * This is the implementation of the LED code. Change the configuration above unless you want to
+ * change the led behavior
+ *
* LED_INIT Called once after bootloader entry
* LED_EXIT Called once during bootloader exit
* LED_MACRO Called in the main loop with the idle counter as parameter.
* Use to define pattern.
- */
+*/
-#define LED_PRESENT 0
+#define NONE 0
+#define ACTIVE_HIGH 1
+#define ACTIVE_LOW 2
+
+#if LED_MODE==ACTIVE_HIGH
+ #define LED_INIT(x) LED_DDR = _BV(LED_PIN);
+ #define LED_EXIT(x) {LED_DDR &=~_BV(LED_PIN);LED_PORT &=~_BV(LED_PIN);}
+ #define LED_MACRO(x) if ( x & 0x4c ) {LED_PORT&=~_BV(LED_PIN);} else {LED_PORT|=_BV(LED_PIN);}
+#elif LED_MODE==ACTIVE_LOW
+ #define LED_INIT(x) LED_PORT &=~_BV(LED_PIN);
+ #define LED_EXIT(x) LED_DDR &=~_BV(LED_PIN);
+ #define LED_MACRO(x) if ( x & 0x4c ) {LED_DDR&=~_BV(LED_PIN);} else {LED_DDR|=_BV(LED_PIN);}
+#elif LED_MODE==NONE
+ #define LED_INIT(x)
+ #define LED_EXIT(x)
+ #define LED_MACRO(x)
+#endif
-#define LED_DDR DDRB
-#define LED_PORT PORTB
-#define LED_PIN PB1
+/* --------------------------------------------------------------------------- */
+/* Micronucleus internal configuration. Do not change anything below this line */
+/* --------------------------------------------------------------------------- */
-#if LED_PRESENT
- #define LED_INIT(x) LED_PORT &=~_BV(LED_PIN);
- #define LED_EXIT(x) LED_DDR &=~_BV(LED_PIN);
- #define LED_MACRO(x) if ( x & 0xd ) {LED_DDR&=~_BV(LED_PIN);} else {LED_DDR|=_BV(LED_PIN);}
-#else
- #define LED_INIT(x)
- #define LED_EXIT(x)
- #define LED_MACRO(x)
-#endif
-/* ------------------------------------------------------------------------- */
+// Microcontroller vectortable entries in the flash
+#define RESET_VECTOR_OFFSET 0
+
+// number of bytes before the boot loader vectors to store the tiny application vector table
+#define TINYVECTOR_RESET_OFFSET 4
+#define TINYVECTOR_OSCCAL_OFFSET 6
+
+/* ------------------------------------------------------------------------ */
+// postscript are the few bytes at the end of programmable memory which store tinyVectors
+#define POSTSCRIPT_SIZE 6
+#define PROGMEM_SIZE (BOOTLOADER_ADDRESS - POSTSCRIPT_SIZE) /* max size of user program */
#endif /* __bootloader_h_included__ */
diff --git a/firmware/crt1.S b/firmware/crt1.S
index 29693ac..1f68351 100644
--- a/firmware/crt1.S
+++ b/firmware/crt1.S
@@ -43,7 +43,12 @@
#include <avr/io.h>
//#include <avr/pgmspace.h>
+#ifdef __AVR_HAVE_JMP_CALL__
+ #define XJMP jmp
+#else
#define XJMP rjmp
+#endif
+
#define XCALL rcall
.macro vector name
@@ -56,12 +61,13 @@
.global __vectors
.global __bad_interrupt
.func __vectors
+
__bad_interrupt:
__vectors:
XJMP __init
- vector __vector_1
- vector __vector_2
- vector __vector_3
+; vector __vector_1
+; vector __vector_2
+; vector __vector_3
.endfunc
/* Handle unexpected interrupts (enabled and no handler), which
@@ -89,19 +95,18 @@ __init:
.section .init2,"ax",@progbits
clr R1
+
+#ifndef ENABLE_UNSAFE_OPTIMIZATIONS
out 0x3f,r1
ldi r28,lo8(__stack)
ldi r29,hi8(__stack)
out 0x3d, r28
out 0x3e, r29
+#endif
.section .init9,"ax",@progbits
+; rcall main
+; XJMP __vectors-2
XJMP main
+
; .endfunc
-
- .section .zerotable,"ax",@progbits
-zerovectors:
- XJMP __init
- XJMP __vector_1
- XJMP __vector_2
- XJMP __vector_3
diff --git a/firmware/main.c b/firmware/main.c
index 16cca65..fdf22e4 100644
--- a/firmware/main.c
+++ b/firmware/main.c
@@ -1,10 +1,9 @@
/*
- * Project: Micronucleus - v1.11
- *
- * Original author (c) 2012 Jenna Fox
+ * Project: Micronucleus - v2.0
*
- * Optimizations v1.10/v1.11 (c) 2013 Tim Bo"scke - cpldcpu@gmail.com
- * v1.11 (c) 2013 Shay Green
+ * Micronucleus V2.0 (c) 2014 Tim Bo"scke - cpldcpu@gmail.com
+ * (c) 2014 Shay Green
+ * Original Micronucleus (c) 2012 Jenna Fox
*
* Based on USBaspLoader-tiny85 (c) 2012 Louis Beaudoin
* Based on USBaspLoader (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH
@@ -12,13 +11,8 @@
* License: GNU GPL v2 (see License.txt)
*/
-#define MICRONUCLEUS_VERSION_MAJOR 1
-#define MICRONUCLEUS_VERSION_MINOR 11
-// how many milliseconds should host wait till it sends another erase or write?
-// needs to be above 4.5 (and a whole integer) as avr freezes for 4.5ms
-#define MICRONUCLEUS_WRITE_SLEEP 8
-// Use the old delay routines without NOP padding. This saves memory.
-#define __DELAY_BACKWARD_COMPATIBLE__
+#define MICRONUCLEUS_VERSION_MAJOR 2
+#define MICRONUCLEUS_VERSION_MINOR 0
#include <avr/io.h>
#include <avr/pgmspace.h>
@@ -27,294 +21,349 @@
#include <util/delay.h>
#include "bootloaderconfig.h"
-
-
-
#include "usbdrv/usbdrv.c"
// verify the bootloader address aligns with page size
-#if BOOTLOADER_ADDRESS % SPM_PAGESIZE != 0
- #error "BOOTLOADER_ADDRESS in makefile must be a multiple of chip's pagesize"
+#if (defined __AVR_ATtiny841__)||(defined __AVR_ATtiny441__)
+ #if BOOTLOADER_ADDRESS % ( SPM_PAGESIZE * 4 ) != 0
+ #error "BOOTLOADER_ADDRESS in makefile must be a multiple of chip's pagesize"
+ #endif
+#else
+ #if BOOTLOADER_ADDRESS % SPM_PAGESIZE != 0
+ #error "BOOTLOADER_ADDRESS in makefile must be a multiple of chip's pagesize"
+ #endif
#endif
#if SPM_PAGESIZE>256
#error "Micronucleus only supports pagesizes up to 256 bytes"
#endif
-// command system schedules functions to run in the main loop
-register uint8_t command asm("r3"); // bind command to r3
-register uint16_union_t currentAddress asm("r4"); // r4/r5 current progmem address, used for erasing and writing
-register uint16_union_t idlePolls asm("r6"); // r6/r7 idlecounter
+#if ((AUTO_EXIT_MS>0) && (AUTO_EXIT_MS<1000))
+ #error "Do not set AUTO_EXIT_MS to below 1s to allow Micronucleus to function properly"
+#endif
-#if OSCCAL_RESTORE
+// Device configuration reply
+// Length: 6 bytes
+// Byte 0: User program memory size, high byte
+// Byte 1: User program memory size, low byte
+// Byte 2: Flash Pagesize in bytes
+// Byte 3: Page write timing in ms.
+// Bit 7 '0': Page erase time equals page write time
+// Bit 7 '1': Page erase time equals page write time divided by 4
+// Byte 4: SIGNATURE_1
+// Byte 5: SIGNATURE_2
+
+PROGMEM const uint8_t configurationReply[6] = {
+ (((uint16_t)PROGMEM_SIZE) >> 8) & 0xff,
+ ((uint16_t)PROGMEM_SIZE) & 0xff,
+ SPM_PAGESIZE,
+ MICRONUCLEUS_WRITE_SLEEP,
+ SIGNATURE_1,
+ SIGNATURE_2
+};
+
+ typedef union {
+ uint16_t w;
+ uint8_t b[2];
+ } uint16_union_t;
+
+#if OSCCAL_RESTORE_DEFAULT
register uint8_t osccal_default asm("r2");
#endif
-static uint16_t vectorTemp[2]; // remember data to create tinyVector table before BOOTLOADER_ADDRESS
+register uint16_union_t currentAddress asm("r4"); // r4/r5 current progmem address, used for erasing and writing
+register uint16_union_t idlePolls asm("r6"); // r6/r7 idlecounter
+// command system schedules functions to run in the main loop
enum {
- cmd_local_nop=0, // also: get device info
+ cmd_local_nop=0,
cmd_device_info=0,
cmd_transfer_page=1,
cmd_erase_application=2,
+ cmd_write_data=3,
cmd_exit=4,
- cmd_write_page=5,
+ cmd_write_page=64 // internal commands start at 64
};
+register uint8_t command asm("r3"); // bind command to r3
// Definition of sei and cli without memory barrier keyword to prevent reloading of memory variables
#define sei() asm volatile("sei")
#define cli() asm volatile("cli")
#define nop() asm volatile("nop")
+#define wdr() asm volatile("wdr")
+
+// Use the old delay routines without NOP padding. This saves memory.
+#define __DELAY_BACKWARD_COMPATIBLE__
/* ------------------------------------------------------------------------ */
static inline void eraseApplication(void);
static void writeFlashPage(void);
static void writeWordToPageBuffer(uint16_t data);
static uint8_t usbFunctionSetup(uint8_t data[8]);
-static uint8_t usbFunctionWrite(uint8_t *data, uint8_t length);
static inline void leaveBootloader(void);
-// erase any existing application and write in jumps for usb interrupt and reset to bootloader
-// - Because flash can be erased once and programmed several times, we can write the bootloader
-// - vectors in now, and write in the application stuff around them later.
-// - if vectors weren't written back in immediately, usb would fail.
+// This function is never called, it is just here to suppress a compiler warning.
+USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq) { return 0; }
+
+// erase all pages until bootloader, in reverse order (so our vectors stay in place for as long as possible)
+// to minimise the chance of leaving the device in a state where the bootloader wont run, if there's power failure
+// during upload
static inline void eraseApplication(void) {
- // erase all pages until bootloader, in reverse order (so our vectors stay in place for as long as possible)
- // while the vectors don't matter for usb comms as interrupts are disabled during erase, it's important
- // to minimise the chance of leaving the device in a state where the bootloader wont run, if there's power failure
- // during upload
-
- uint8_t i;
uint16_t ptr = BOOTLOADER_ADDRESS;
- cli();
while (ptr) {
+#if (defined __AVR_ATtiny841__)||(defined __AVR_ATtiny441__)
+ ptr -= SPM_PAGESIZE * 4;
+#else
ptr -= SPM_PAGESIZE;
+#endif
boot_page_erase(ptr);
}
-
- currentAddress.w = 0;
- for (i=0; i<8; i++) writeWordToPageBuffer(0xFFFF); // Write first 8 words to fill in vectors.
- writeFlashPage(); // enables interrupts
+
+ // Reset address to ensure the reset vector is written first.
+ currentAddress.w = 0;
}
// simply write currently stored page in to already erased flash memory
-static void writeFlashPage(void) {
- cli();
- boot_page_write(currentAddress.w - 2); // will halt CPU, no waiting required
- sei();
+static inline void writeFlashPage(void) {
+ if (currentAddress.w - 2 <BOOTLOADER_ADDRESS)
+ boot_page_write(currentAddress.w - 2); // will halt CPU, no waiting required
}
-// clear memory which stores data to be written by next writeFlashPage call
-#define __boot_page_fill_clear() \
-(__extension__({ \
- __asm__ __volatile__ \
- ( \
- "sts %0, %1\n\t" \
- "spm\n\t" \
- : \
- : "i" (_SFR_MEM_ADDR(__SPM_REG)), \
- "r" ((uint8_t)(__BOOT_PAGE_FILL | (1 << CTPB))) \
- ); \
-}))
-
-// write a word in to the page buffer, doing interrupt table modifications where they're required
+// Write a word into the page buffer.
+// Will patch the bootloader reset vector into the main vectortable to ensure
+// the device can not be bricked. Saving user-reset-vector is done in the host
+// tool, starting with firmware V2
static void writeWordToPageBuffer(uint16_t data) {
- uint8_t previous_sreg;
-
- // first two interrupt vectors get replaced with a jump to the bootloader's vector table
- // remember vectors or the tinyvector table
- if (currentAddress.w == RESET_VECTOR_OFFSET * 2) {
- vectorTemp[0] = data;
- data = 0xC000 + (BOOTLOADER_ADDRESS/2) - 1;
- }
-
- if (currentAddress.w == USBPLUS_VECTOR_OFFSET * 2) {
- vectorTemp[1] = data;
- data = 0xC000 + (BOOTLOADER_ADDRESS/2) - 1;
- }
-
- // at end of page just before bootloader, write in tinyVector table
- // see http://embedded-creations.com/projects/attiny85-usb-bootloader-overview/avr-jtag-programmer/
- // for info on how the tiny vector table works
- if (currentAddress.w == BOOTLOADER_ADDRESS - TINYVECTOR_RESET_OFFSET) {
- data = vectorTemp[0] + ((FLASHEND + 1) - BOOTLOADER_ADDRESS)/2 + 2 + RESET_VECTOR_OFFSET;
- } else if (currentAddress.w == BOOTLOADER_ADDRESS - TINYVECTOR_USBPLUS_OFFSET) {
- data = vectorTemp[1] + ((FLASHEND + 1) - BOOTLOADER_ADDRESS)/2 + 1 + USBPLUS_VECTOR_OFFSET;
-#if (!OSCCAL_RESTORE) && OSCCAL_16_5MHz
- } else if (currentAddress.w == BOOTLOADER_ADDRESS - TINYVECTOR_OSCCAL_OFFSET) {
- data = OSCCAL;
-#endif
+
+#ifndef ENABLE_UNSAFE_OPTIMIZATIONS
+ #if BOOTLOADER_ADDRESS < 8192
+ // rjmp
+ if (currentAddress.w == RESET_VECTOR_OFFSET * 2) {
+ data = 0xC000 + (BOOTLOADER_ADDRESS/2) - 1;
}
+ #else
+ // far jmp
+ if (currentAddress.w == RESET_VECTOR_OFFSET * 2) {
+ data = 0x940c;
+ } else if (currentAddress.w == (RESET_VECTOR_OFFSET +1 ) * 2) {
+ data = (BOOTLOADER_ADDRESS/2);
+ }
+ #endif
+#endif
- previous_sreg=SREG;
- cli(); // ensure interrupts are disabled
+#if OSCCAL_SAVE_CALIB
+ if (currentAddress.w == BOOTLOADER_ADDRESS - TINYVECTOR_OSCCAL_OFFSET) {
+ data = OSCCAL;
+ }
+#endif
boot_page_fill(currentAddress.w, data);
-
- // increment progmem address by one word
currentAddress.w += 2;
- SREG=previous_sreg;
}
-// This function is never called, it is just here to suppress a compiler warning.
-USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq) { return 0; }
-
/* ------------------------------------------------------------------------ */
static uint8_t usbFunctionSetup(uint8_t data[8]) {
usbRequest_t *rq = (void *)data;
-
- static uint8_t replyBuffer[4] = {
- (((uint16_t)PROGMEM_SIZE) >> 8) & 0xff,
- ((uint16_t)PROGMEM_SIZE) & 0xff,
- SPM_PAGESIZE,
- MICRONUCLEUS_WRITE_SLEEP
- };
-
- idlePolls.b[1]=0; // reset idle polls when we get usb traffic
-
+
if (rq->bRequest == cmd_device_info) { // get device info
- usbMsgPtr = replyBuffer;
- return 4;
- } else if (rq->bRequest == cmd_transfer_page) { // transfer page
- // clear page buffer as a precaution before filling the buffer in case
- // a previous write operation failed and there is still something in the buffer.
- __boot_page_fill_clear();
- currentAddress.w = rq->wIndex.word;
- return USB_NO_MSG; // hands off work to usbFunctionWrite
+ usbMsgPtr = (usbMsgPtr_t)configurationReply;
+ return sizeof(configurationReply);
+ } else if (rq->bRequest == cmd_transfer_page) {
+ // Set page address. Address zero always has to be written first to ensure reset vector patching.
+ // Mask to page boundary to prevent vulnerability to partial page write "attacks"
+ if ( currentAddress.w != 0 ) {
+ currentAddress.b[0]=rq->wIndex.bytes[0] & (~ (SPM_PAGESIZE-1));
+ currentAddress.b[1]=rq->wIndex.bytes[1];
+ }
+ } else if (rq->bRequest == cmd_write_data) { // Write data
+ writeWordToPageBuffer(rq->wValue.word);
+ writeWordToPageBuffer(rq->wIndex.word);
+ if ((currentAddress.b[0] % SPM_PAGESIZE) == 0)
+ command=cmd_write_page; // ask runloop to write our page
} else {
// Handle cmd_erase_application and cmd_exit
- command=rq->bRequest;
- return 0;
+ command=rq->bRequest&0x3f;
}
-}
-
-// read in a page over usb, and write it in to the flash write buffer
-static uint8_t usbFunctionWrite(uint8_t *data, uint8_t length) {
- do {
- // make sure we don't write over the bootloader!
- if (currentAddress.w >= BOOTLOADER_ADDRESS) break;
-
- writeWordToPageBuffer(*(uint16_t *) data);
- data += 2; // advance data pointer
- length -= 2;
- } while(length);
-
- // if we have now reached another page boundary, we're done
- uint8_t isLast = ((currentAddress.b[0] % SPM_PAGESIZE) == 0);
- if (isLast) command=cmd_write_page; // ask runloop to write our page
-
- return isLast; // let V-USB know we're done with this request
-}
-
-/* ------------------------------------------------------------------------ */
-void PushMagicWord (void) __attribute__ ((naked)) __attribute__ ((section (".init3")));
-
-// put the word "B007" at the bottom of the stack (RAMEND - RAMEND-1)
-void PushMagicWord (void) {
- asm volatile("ldi r16, 0xB0"::);
- asm volatile("push r16"::);
- asm volatile("ldi r16, 0x07"::);
- asm volatile("push r16"::);
+ return 0;
}
static void initHardware (void)
{
// Disable watchdog and set timeout to maximum in case the WDT is fused on
+#ifdef CCP
+ // New ATtinies841/441 use a different unlock sequence and renamed registers
+ MCUSR=0;
+ CCP = 0xD8;
+ WDTCSR = 1<<WDP2 | 1<<WDP1 | 1<<WDP0;
+#else
MCUSR=0;
WDTCR = 1<<WDCE | 1<<WDE;
WDTCR = 1<<WDP2 | 1<<WDP1 | 1<<WDP0;
+#endif
- /* initialize */
- #if OSCCAL_RESTORE
- osccal_default = OSCCAL;
- #endif
-
+
usbDeviceDisconnect(); /* do this while interrupts are disabled */
- _delay_ms(500);
+ _delay_ms(300);
usbDeviceConnect();
- usbInit(); // Initialize INT settings after reconnect
- sei();
+ usbInit(); // Initialize INT settings after reconnect
}
/* ------------------------------------------------------------------------ */
// reset system to a normal state and launch user program
static void leaveBootloader(void) __attribute__((__noreturn__));
static inline void leaveBootloader(void) {
-
+
bootLoaderExit();
- cli();
- usbDeviceDisconnect(); /* Disconnect micronucleus */
- USB_INTR_ENABLE = 0;
- USB_INTR_CFG = 0; /* also reset config bits */
-
- // clear magic word from bottom of stack before jumping to the app
- *(uint8_t*)(RAMEND) = 0x00; // A single write is sufficient to invalidate magic word
+#if OSCCAL_RESTORE_DEFAULT
+ OSCCAL=osccal_default;
+ nop(); // NOP to avoid CPU hickup during oscillator stabilization
+#endif
- #if OSCCAL_RESTORE
- OSCCAL=osccal_default;
- nop(); // NOP to avoid CPU hickup during oscillator stabilization
- #elif OSCCAL_16_5MHz
- // adjust clock to previous calibration value, so user program always starts with same calibration
- // as when it was uploaded originally
- unsigned char stored_osc_calibration = pgm_read_byte(BOOTLOADER_ADDRESS - TINYVECTOR_OSCCAL_OFFSET);
- if (stored_osc_calibration != 0xFF && stored_osc_calibration != 0x00) {
- OSCCAL=stored_osc_calibration;
- nop();
- }
- #endif
-
- asm volatile ("rjmp __vectors - 4"); // jump to application reset vector at end of flash
+ asm volatile ("rjmp __vectors - 4"); // jump to application reset vector at end of flash
- for (;;); // Make sure function does not return to help compiler optimize
+ for (;;); // Make sure function does not return to help compiler optimize
}
+void USB_INTR_VECTOR(void);
int main(void) {
-
+ uint8_t osccal_tmp;
+
bootLoaderInit();
-
+
+ /* save default OSCCAL calibration */
+#if OSCCAL_RESTORE_DEFAULT
+ osccal_default = OSCCAL;
+#endif
+
+#if OSCCAL_SAVE_CALIB
+ // adjust clock to previous calibration value, so bootloader starts with proper clock calibration
+ unsigned char stored_osc_calibration = pgm_read_byte(BOOTLOADER_ADDRESS - TINYVECTOR_OSCCAL_OFFSET);
+ if (stored_osc_calibration != 0xFF) {
+ OSCCAL=stored_osc_calibration;
+ nop();
+ }
+#endif
+
if (bootLoaderStartCondition()||(pgm_read_byte(BOOTLOADER_ADDRESS - TINYVECTOR_RESET_OFFSET + 1)==0xff)) {
initHardware();
LED_INIT();
if (AUTO_EXIT_NO_USB_MS>0) {
- idlePolls.b[1]=((AUTO_EXIT_MS-AUTO_EXIT_NO_USB_MS) * 10UL)>>8;
+ idlePolls.b[1]=((AUTO_EXIT_MS-AUTO_EXIT_NO_USB_MS)/5)>>8;
} else {
idlePolls.b[1]=0;
}
+ command=cmd_local_nop;
+ currentAddress.w = 0;
+
do {
- _delay_us(100);
- wdt_reset(); // Only necessary if WDT is fused on
+ // 15 clockcycles per loop.
+ // adjust fastctr for 5ms timeout
- command=cmd_local_nop;
- usbPoll();
-
- idlePolls.w++;
+ uint16_t fastctr=(uint16_t)(F_CPU/(1000.0f*15.0f/5.0f));
+ uint8_t resetctr=20;
+
+ do {
+ if ((USBIN & USBMASK) !=0) resetctr=20;
+
+ if (!--resetctr) { // reset encountered
+ usbNewDeviceAddr = 0; // bits from the reset handling of usbpoll()
+ usbDeviceAddr = 0;
+#if (OSCCAL_HAVE_XTAL == 0)
+ calibrateOscillatorASM();
+#endif
+ }
+
+ if (USB_INTR_PENDING & (1<<USB_INTR_PENDING_BIT)) {
+ USB_INTR_VECTOR(); // clears INT_PENDING (See se0: in asmcommon.inc)
+ idlePolls.b[1]=0; // reset idle polls when we get usb traffic
+ break;
+ }
+
+ } while(--fastctr);
- // Try to execute program if bootloader exit condition is met
- if (AUTO_EXIT_MS&&(idlePolls.w==AUTO_EXIT_MS*10L)) command=cmd_exit;
-
- LED_MACRO( idlePolls.b[1] );
-
- // Wait for USB traffic to finish before a blocking event is executed
- // All events will render the MCU unresponsive to USB traffic for a while.
- if (command!=cmd_local_nop) _delay_ms(2);
-
+ wdr();
+
+ #if OSCCAL_SLOW_PROGRAMMING
+ osccal_tmp = OSCCAL;
+ OSCCAL = osccal_default;
+ #endif
+ // commands are only evaluated after next USB transmission or after 5 ms passed
if (command==cmd_erase_application)
eraseApplication();
- else if (command==cmd_write_page)
- writeFlashPage();
+ if (command==cmd_write_page)
+ writeFlashPage();
+ #if OSCCAL_SLOW_PROGRAMMING
+ OSCCAL = osccal_tmp;
+ #endif
+
+
+
+ if (command==cmd_exit) {
+ if (!fastctr) break; // Only exit after 5 ms timeout
+ } else {
+ command=cmd_local_nop;
+ }
+
+ {
+ // This is usbpoll() minus reset logic and double buffering
+ int8_t len;
+ len = usbRxLen - 3;
+ if(len >= 0){
+ usbProcessRx(usbRxBuf + 1, len); // only single buffer due to in-order processing
+ usbRxLen = 0; /* mark rx buffer as available */
+ }
+ if(usbTxLen & 0x10){ /* transmit system idle */
+ if(usbMsgLen != USB_NO_MSG){ /* transmit data pending? */
+ usbBuildTxBlock();
+ }
+ }
+ }
+
+ idlePolls.w++;
+
+ // Try to execute program when bootloader times out
+ if (AUTO_EXIT_MS&&(idlePolls.w==(AUTO_EXIT_MS/5))) {
+ if (pgm_read_byte(BOOTLOADER_ADDRESS - TINYVECTOR_RESET_OFFSET + 1)!=0xff) break;
+ }
+
+ LED_MACRO( idlePolls.b[0] );
+
+ // Test whether another interrupt occurred during the processing of USBpoll and commands.
+ // If yes, we missed a data packet on the bus. Wait until the bus was idle for 10µs to
+ // allow synchronising to the next incoming packet.
- /* main event loop runs as long as no problem is uploaded or existing program is not executed */
- } while((command!=cmd_exit)||(pgm_read_byte(BOOTLOADER_ADDRESS - TINYVECTOR_RESET_OFFSET + 1)==0xff));
+ if (USB_INTR_PENDING & (1<<USB_INTR_PENDING_BIT)) // Usbpoll() collided with data packet
+ {
+ uint8_t ctr;
+
+ // loop takes 5 cycles
+ asm volatile(
+ " ldi %0,%1 \n\t"
+ "loop%=: sbic %2,%3 \n\t"
+ " ldi %0,%1 \n\t"
+ " subi %0,1 \n\t"
+ " brne loop%= \n\t"
+ : "=&d" (ctr)
+ : "M" ((uint8_t)(10.0f*(F_CPU/1.0e6f)/5.0f+0.5)), "I" (_SFR_IO_ADDR(USBIN)), "M" (USB_CFG_DPLUS_BIT)
+ );
+ USB_INTR_PENDING = 1<<USB_INTR_PENDING_BIT;
+ }
+ } while(1);
LED_EXIT();
- }
+ usbDeviceDisconnect(); /* Disconnect micronucleus */
+ USB_INTR_ENABLE = 0;
+ USB_INTR_CFG = 0; /* also reset config bits */
+
+ }
+
leaveBootloader();
}
/* ------------------------------------------------------------------------ */
diff --git a/firmware/makerelease.bat b/firmware/makerelease.bat
new file mode 100644
index 0000000..908d40c
--- /dev/null
+++ b/firmware/makerelease.bat
@@ -0,0 +1,18 @@
+make clean
+make CONFIG=t84_default
+cp main.hex releases/t84_default.hex
+make clean
+make CONFIG=t85_default
+cp main.hex releases/t85_default.hex
+make clean
+make CONFIG=t85_aggressive
+cp main.hex releases/t85_aggressive.hex
+make clean
+make CONFIG=t841_default
+cp main.hex releases/t841_default.hex
+make clean
+make CONFIG=t167_default
+cp main.hex releases/t167_default.hex
+make clean
+make CONFIG=Nanite841
+cp main.hex releases/Nanite841.hex
diff --git a/firmware/osccalASM.S b/firmware/osccalASM.S
index 9a317f1..57730bf 100644
--- a/firmware/osccalASM.S
+++ b/firmware/osccalASM.S
@@ -1,6 +1,8 @@
-/* Name: osccalASM.S
+/* Name: osccalASM.S v1.1
* Author: cpldcpu@gmail.com
* Creation Date: 2013-11-3
+ * Update : 2014-01-4
+ *
* Tabsize: 4
* License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
*/
@@ -11,28 +13,34 @@
*
*
* Benefits:
- * - Codesize reduced by 90 bytes.
+ * - Codesize reduced by 90 bytes.
* - Improved robustness due to removing timeout from frame length measurement and
- * inserted NOP after OSCCAL writes.
+ * inserted NOP after OSCCAL writes.
*
* Changes:
* - The new routine performs a combined binary and neighborhood search
* in a single loop.
* Note that the neighborhood search is necessary due to the quasi-monotonic
* nature of OSCCAL. (See Atmel application note AVR054).
- * - Inserted NOP after writes to OSCCAL to avoid CPU errors during oscillator
+ * - Inserted NOP after writes to OSCCAL to avoid CPU errors during oscillator
* stabilization.
* - Implemented new routine to measure frame time "usbMeasureFrameLengthDecreasing".
- * This routine takes the target time as a parameter and returns the deviation.
- * - usbMeasureFrameLengthDecreasing measures in multiples of 5 cycles and is thus
- * slighly more accurate.
- * - usbMeasureFrameLengthDecreasing does not support time out anymore. The original
- * implementation returned zero in case of time out, which would have caused the old
+ * This routine takes the target time as a parameter and returns the deviation.
+ * - usbMeasureFrameLengthDecreasing measures in multiples of 5 cycles and is thus
+ * slighly more accurate.
+ * - usbMeasureFrameLengthDecreasing does not support time out anymore. The original
+ * implementation returned zero in case of time out, which would have caused the old
* calibrateOscillator() implementation to increase OSSCAL to 255, effictively
* overclocking and most likely crashing the CPU. The new implementation will enter
- * an infinite loop when no USB activity is encountered. The user program should
+ * an infinite loop when no USB activity is encountered. The user program should
* use the watchdog to escape from situations like this.
- *
+ * Update 2014-01-4
+ * - Added an initial sync-state, which will discard the first delay measurement.
+ * This allows to call this routine before or during the SE0 bus reset without
+ * corrupting OSCCAL.
+ * - Removed CLI/SEI to allow more flexibility.
+ *
+ *
* This routine will work both on controllers with and without split OSCCAL range.
* The first trial value is 128 which is the lowest value of the upper OSCCAL range
* on Attiny85 and will effectively limit the search to the upper range, unless the
@@ -85,31 +93,45 @@
#endif
# define cnt16 cnt16L
-; extern void calibrateOscillatorASM(void);
+#if (OSCCAL_HAVE_XTAL == 0)
.global calibrateOscillatorASM
calibrateOscillatorASM:
- cli
- ldi opD, 255
+ ldi opD, 255
- ldi try, 128 ; calibration start value
- ldi stp, 64 ; initial step width
- ldi i, 10 ; 10 iterations
+ ldi try, 128 ; calibration start value
+ ldi stp, 0 ; initial step width=0 for sync phase (first delay is discarded)
+ ldi i, 11 ; 11 iterations (1x sync, 7x binary search, 3x neighbourhood)
usbCOloop:
- out OSCCAL, try
- nop
+#if OSCCAL <64
+ out OSCCAL, try
+#else
+ sts OSCCAL, try
+#endif
+ nop
- ; Delay values = F_CPU * 999e-6 / 5 + 0.5
-
+usbCOLoopNoCal:
+
+ ; Delay values = F_CPU * 999e-6 / 5 + 0.5
+
#if (F_CPU == 16500000)
- ldi cnt16L, lo8(3297)
- ldi cnt16H, hi8(3297)
+ ldi cnt16L, lo8(3297)
+ ldi cnt16H, hi8(3297)
#elif (F_CPU == 12800000)
- ldi cnt16L, lo8(2557)
- ldi cnt16H, hi8(2557)
+ ldi cnt16L, lo8(2557)
+ ldi cnt16H, hi8(2557)
+#elif (F_CPU == 12000000)
+ ldi cnt16L, lo8(2398)
+ ldi cnt16H, hi8(2398)
+#elif (F_CPU == 16000000)
+ ldi cnt16L, lo8(3197)
+ ldi cnt16H, hi8(3197)
+#elif (F_CPU == 15000000)
+ ldi cnt16L, lo8(2998)
+ ldi cnt16H, hi8(2998)
#else
#error "calibrateOscillatorASM: no delayvalues defined for this F_CPU setting"
#endif
@@ -125,6 +147,26 @@ usbCOWaitLoop:
sbic USBIN, USBMINUS ;[2]
rjmp usbCOWaitLoop ;[3]
+ ; This section of code deals with traffic from other USB devices on the same hub.
+ ; If this code is excluded, micronucleus may only work when it is connected to a dedicated USB port
+#ifndef ENABLE_UNSAFE_OPTIMIZATIONS
+ sbis USBIN, USBPLUS ; ignore frame if data is present
+ rjmp usbCOnotdata
+
+usbCOWaitNoData:
+ in cnt16H, USBIN ; wait for SE0 state (both lines low)
+ andi cnt16H, (1<<USBPLUS)|(1<<USBMINUS)
+ brne usbCOWaitNoData
+ in cnt16H, USBIN ; be sure SE0 state wasn't a glitch
+ andi cnt16H, (1<<USBPLUS)|(1<<USBMINUS)
+ brne usbCOWaitNoData
+usbCOWaitNoData2:
+ sbis USBIN, USBMINUS ; wait for D- go to high
+ rjmp usbCOWaitNoData2
+ rjmp usbCOLoopNoCal
+#endif
+
+usbCOnotdata:
sbrs cnt16H, 7 ;delay overflow?
rjmp usbCOclocktoolow
sub try, stp
@@ -133,23 +175,38 @@ usbCOWaitLoop:
usbCOclocktoolow:
add try, stp
usbCOclocktoohigh:
- lsr stp
- brne usbCOnoneighborhoodsearch
- cp opD, cnt16L
- brcs usbCOnoimprovement
- in opV, OSCCAL
+ lsr stp ; stp = 0 in first iteration (sync)
+ ; stp = 2^x (x=0..6) during binary search,
+ ; stp = 1 during neighbourhood search
+
+ brne usbCObinarysearch
+ ldi stp, 64 ; stp=64 to initiate binary search.
+ ; If we are in neighbourhood search (c=1), it is changed to 1 below
+ brcc usbCObinarysearch
+ cp opD, cnt16L
+ brcs usbCOnoimprovement
+#if OSCCAL <64
+ in opV, OSCCAL
+#else
+ lds opV, OSCCAL
+#endif
mov opD, cnt16L
usbCOnoimprovement:
- ldi stp, 1
-usbCOnoneighborhoodsearch:
+ ldi stp, 1 ; stp=1 to continue with neighbourhood search
+usbCObinarysearch:
subi i, 1
brne usbCOloop
- out OSCCAL, opV
- nop
- sei
- ret
+#if OSCCAL <64
+ out OSCCAL, opV
+#else
+ sts OSCCAL, opV
+#endif
+ nop
+ ret
+#endif //OSCCAL_HAVE_XTAL
+
#undef i
#undef opV
#undef opD
@@ -221,8 +278,6 @@ void calibrateOscillator(void)
}
OSCCAL = optimumValue;
- asm volatile(" NOP");
-
- sei(); // enable interrupts
+ asm volatile(" NOP");
}
#endif \ No newline at end of file
diff --git a/firmware/releases/Nanite841.hex b/firmware/releases/Nanite841.hex
new file mode 100644
index 0000000..8413aba
--- /dev/null
+++ b/firmware/releases/Nanite841.hex
@@ -0,0 +1,103 @@
+:1019800017C0197A10859315090212000101008011
+:101990003209040000000000000012011001FF00E5
+:1019A0000008D016530700020000000104030904D8
+:1019B00011241FBECFEFD2E0CDBFDEBF21E0A0E0FB
+:1019C000B1E001C01D92AC32B207E1F78FC1A82F80
+:1019D000B92F80E090E041E050EA609530E009C026
+:1019E0002D9182279795879510F084279527305E53
+:1019F000C8F36F5FA8F30895EADF8D939D93089570
+:101A0000CF93CFB7CF93C395B19BE9F7B19B09C0F3
+:101A1000B19B07C0B19B05C0B19B03C0B19B01C086
+:101A2000A7C0DF93C0910E01DD27CA5EDE4FB19BD8
+:101A300002C0DF91EBCF2F930F931F9306B32FEFCD
+:101A400001FB20F94F933F9316B34FEF012701FBA2
+:101A500021F93BE031C04E7F012F16B3216028C031
+:101A6000102F4D7F2260000006B329C04B7F2460F9
+:101A7000012F000016B32BC016B3477F28602AC081
+:101A80004F7E06B320612CC04F7D16B320622FC05D
+:101A90004F7B06B3206432C0422706B349934FEF11
+:101AA0000000102711FB20F916B31370C9F1297F2C
+:101AB00091F2012701FB21F906B3237F89F231500E
+:101AC00058F1102711FB22F916B3277E79F201276E
+:101AD00001FB23F92F7C81F206B3102711FB24F9B7
+:101AE0002F7971F200C016B3012701FB25F92F737E
+:101AF00059F200C006B3102711FB26F9223040F23C
+:101B000000C016B3012701FB27F9243028F64F77D0
+:101B1000206816B30000F9CF10E21ABF00271DC0DD
+:101B20003B503195C31BD04010E21ABF0881033CE3
+:101B300019F10B3409F120910C011981110F1213C5
+:101B4000EDCF093641F10D3211F0013E39F7CAE00F
+:101B50001AB715FD02C0CA95D9F7009314013F9139
+:101B60004F911F910F912F91DF91CAB7C5FD4BCFB8
+:101B7000CF91CFBFCF91089520911401222379F303
+:101B8000109112011123E1F43430E2F0309312018C
+:101B900020930D0117C00091120101308CF40AE569
+:101BA00030910F0134FD10C000930F01C1E0D1E06E
+:101BB0000FC02795A8F45150A9F4220F0000F9CFC7
+:101BC0004AE503C042ED01C0432FC4E1D0E032E05A
+:101BD00017B31360C19A17BB08B320E413E05F93F7
+:101BE000012756E008BB279520F4515021F4220F1D
+:101BF000F9CF012756E000003B5A08BBD0F22795E9
+:101C000028F4515029F4220F0000F9CF012756E0A3
+:101C1000279508BB20F4515021F4220FF9CF01275A
+:101C200056E02991332308BB21F60C7F1091130154
+:101C3000110FC651D04008BB11F010930C0110E2F7
+:101C40001ABF026017B31C7F402F4C7F5F9100C00A
+:101C500000C008BB17BB48BB82CF2FEFB0E8A0E0A5
+:101C60004BE0B093740000008EE599E0B199FECF8F
+:101C7000B19BFECF0197B199FDCFB09B09C096B340
+:101C80009370E9F796B39370D1F7B19BFECFECCF89
+:101C900097FF03C0BA1B819501C0BA0FA69541F406
+:101CA000A0E430F4281718F030917400282FA1E038
+:101CB0004150B9F63093740000000895F201309756
+:101CC00049F02AE7421629E1520631F48091740066
+:101CD00090E002C08FEB9CEC21E00C0120935700B8
+:101CE000E8951124CF0102962C010895809174008B
+:101CF000282EEAE7F9E1E491EF3F19F0E093740050
+:101D0000000004B601FC06C0EDE7F9E1E491EF3F05
+:101D100009F055C114BE88ED8093710087E081BD44
+:101D2000B99A2FE78CEF9AE0215080409040E1F77C
+:101D300000C00000B9988AE580930F018FEF80936F
+:101D4000000180B5816080BD8BB780628BBFC29877
+:101D5000712C312C412C512C14E1C0EADFE086B308
+:101D6000837009F014E1115029F4109213011092BC
+:101D70000C0173DF0AB605FE03C042DE712C03C0FE
+:101D80002197209761F7A8958091740020927400A4
+:101D900022E032120CC0E0E8F9E1E054F10993E0EE
+:101DA00090935700E8953097C1F7412C512C90E45F
+:101DB00039120AC0F2013297E03829E1F20720F423
+:101DC00095E090935700E8958093740084E0381272
+:101DD00003C0CD2B11F4EFC0312C80911201835040
+:101DE00087FD98C090910D019D3209F091C0883017
+:101DF00009F08EC083EC809301018AE580930F0186
+:101E000090911701907680911801992361F18111C9
+:101E100008C082E899E1909311018093100126E0B7
+:101E20006CC0813059F44114510409F44CC08091C4
+:101E30001B01807F482E50901C0145C0833081F4E7
+:101E40008091190190911A0139DF80911B019091C5
+:101E50001C0134DF842D8F70B1F580E4382E33C03F
+:101E60008F73382E30C09091190110920A018111A0
+:101E700006C010920B018AE091E022E03AC0853062
+:101E800019F49093130127C08630F9F480911A0158
+:101E9000813019F48AE999E104C0823041F488E87C
+:101EA00099E1909311018093100122E126C08330C3
+:101EB00051F4911108C08CEA99E19093110180933B
+:101EC000100124E01AC020E018C0883079F0893071
+:101ED00031F4909315018AE091E020E00AC021E0FE
+:101EE0008A3009F020E08AE091E003C085E191E0CA
+:101EF00021E0909311018093100180911E018111C6
+:101F000005C080911D01821708F4282F209300013D
+:101F10001092120180910F0184FF31C08091000165
+:101F20008F3F69F1C82F893008F0C8E08C1B80937F
+:101F300000018091010198E8892780930101CC2359
+:101F400091F0E0911001F091110182E091E0DC014B
+:101F500024912D9331962C2F280F2A13F9CFF0932B
+:101F60001101E09310016C2F82E091E045DDCC5F20
+:101F7000CC3019F08FEF80930001C0930F01C301A3
+:101F800001963C01803B944029F4EDE7F9E1E491AE
+:101F9000EF3F89F4862D8C7411F0BA9801C0BA9A7B
+:101FA0000AB605FED9CE88E1B09988E18150E1F703
+:101FB00080E28ABFD1CEBA98B99A1BBE10BC2092DB
+:081FC00074000000DBCCFFCF30
+:040000030000198060
+:00000001FF
diff --git a/firmware/releases/micronucleus-1.02.hex b/firmware/releases/micronucleus-1.02.hex
deleted file mode 100644
index 2bc966c..0000000
--- a/firmware/releases/micronucleus-1.02.hex
+++ /dev/null
@@ -1,256 +0,0 @@
-:20000000BFCB32C1BFCB30C12FC12EC12DC12CC12BC12AC129C128C127C126C125C1EC4E95
-:2000200050F64B4B81474A494781EC47494AF64A4947494B4E504B4E494B474947EC4B4E70
-:20004000F6504B4E494B474A4B4A494749EC4AF647494B4E494B4947EC4947494E50F64B11
-:200060004B81474A494781EC47494AF64A4947494B4E504B4E494B474947EC4B4EF6504B30
-:200080004E494B474A4B4A494749EC4AF647494B4E494B4947EC49474947F64244EC47F655
-:2000A000424447494B474C4B4C4EEC4747F6424447424C4B4947423F4042EC47F64244EC23
-:2000C00047F642444747494B47424442EC47F64746474244474C4B4C4EEC474647F64244F5
-:2000E000EC47F6424447494B474C4B4C4EEC4747F6424447424C4B4947423F4042EC47F62C
-:200100004244EC47F642444747494B47424442EC47F64746474244474C4B4C4EEC4749F60C
-:200120004B4CEC4E53F64B4C4E5355575552EC534EF64B4CEC4E53F65552535558575855D2
-:20014000F64E5255F655524E28002B002D0030003300360039003D004000440048004D0021
-:20016000510056005B00610067006D0073007A008100890091009A00A300AD00B700C2005D
-:20018000CE00DA00E700F400030113012301340147015A016F0184019C01B401CE01E901C8
-:2001A00007022602460269028E02B402DE020903380369039C03D3030E044C048D04D20444
-:2001C0001C056905BC0513067006D2063907A7071C0898081A09A509380AD30A780B270C10
-:2001E000E00CA40D730E4F0F3910301135124A137014A715F1164E18C019481BE71C9F1EAC
-:20020000722060226B249526E1284F2BE22D9D3081339136CF393F3DE440C044D6482B4D64
-:20022000C2519E56C55B3A610267226D9F737F7AC8818089AD91569A84A33DAD8AB774C2F1
-:2002400004CE44DA3FE7FFF411241FBECFE5D2E0DEBFCDBF10E0A0E6B0E001C01D92A136A7
-:20026000B107E1F7FFD081C1CBCE2DE130E104C0F9013197F1F701970097D1F70895382FBC
-:20028000662359F028B381E090E002C0880F991F3A95E2F7282B28BB089528B381E090E0A8
-:2002A00002C0880F991F3A95E2F78095822388BB0895AF92BF92CF92DF92EF92FF920F93D3
-:2002C0001F93E62E9C01442737FD4095542F60E972EE8DE790E00CD159016A01FF2400E092
-:2002E00010E0C801B70128E834E842E050E0D3D0950140E050E0FCD0A895B89AB5016D50B8
-:200300007040769567957695679541E008C0CB010197F1F788B3842788BB215030402115AA
-:200320003105A9F71F910F91FF90EF90DF90CF90BF90AF900895C0988AE090E02DE130E13F
-:20034000F9013197F1F70197D9F7B8980895AF92BF92CF92DF92EF92FF921F93CF93DF93A2
-:200360006C017B0110916000C0E0D0E02DE1A22E20E1B22E27C0F601EC0FFD1F849187FDF6
-:200380000FC0E82FF0E0EE0FFF1FE85BFE4F8591949165E070E098D0CB01612F8ADF11C02E
-:2003A000813869F4812F90E06AE070E062D004C0F5013197F1F701970097D1F702C0182FD1
-:2003C00011952196CE15DF05B0F210936000B3DFDF91CF911F91FF90EF90DF90CF90BF9017
-:2003E000AF9008950F931F93CF93DF93EC010DE110E10CC080E793E06AE05BDF82E390E02E
-:20040000F8013197F1F70197D9F72197209791F792DFDF91CF911F910F91089584E491E0CD
-:2004200064E070E094DF089580E491E064E070E08EDF089582E090E0D5DF08958FE191E0A1
-:2004400061E270E084DF0895F9DF8EE190E061E071E07DDFFACFF2DF8EE190E061E071E059
-:2004600076DF089587B38FEF87BBEEDF80E090E008955527002480FF02C0060E571F660F76
-:20048000771F6115710521F096958795009799F7952F802D0895FF27EE27BB27AA2760FF00
-:2004A00004C0A20FB31FE41FF51F220F331F441F551F969587957795679589F700977607A1
-:2004C00071F7CF01BD010895AA1BBB1B51E107C0AA1FBB1FA617B70710F0A61BB70B881FAD
-:2004E000991F5A95A9F780959095BC01CD01089597FB092E05260ED057FD04D014D00AD09B
-:20050000001C38F450954095309521953F4F4F4F5F4F0895F6F790958095709561957F4FF7
-:200520008F4F9F4F0895A1E21A2EAA1BBB1BFD010DC0AA1FBB1FEE1FFF1FA217B307E407F5
-:20054000F50720F0A21BB30BE40BF50B661F771F881F991F1A9469F7609570958095909569
-:200560009B01AC01BD01CF010895F894FFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF
-:20058000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B
-:2005A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B
-:2005C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B
-:2005E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B
-:20060000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA
-:20062000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA
-:20064000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA
-:20066000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A
-:20068000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A
-:2006A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A
-:2006C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A
-:2006E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A
-:20070000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9
-:20072000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9
-:20074000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9
-:20076000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99
-:20078000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79
-:2007A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59
-:2007C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39
-:2007E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19
-:20080000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8
-:20082000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8
-:20084000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8
-:20086000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98
-:20088000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78
-:2008A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58
-:2008C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38
-:2008E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18
-:20090000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7
-:20092000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7
-:20094000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7
-:20096000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97
-:20098000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77
-:2009A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57
-:2009C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37
-:2009E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17
-:200A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6
-:200A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6
-:200A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6
-:200A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96
-:200A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76
-:200AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56
-:200AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36
-:200AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16
-:200B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5
-:200B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5
-:200B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5
-:200B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95
-:200B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75
-:200BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55
-:200BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35
-:200BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15
-:200C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4
-:200C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4
-:200C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4
-:200C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94
-:200C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74
-:200CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54
-:200CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34
-:200CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14
-:200D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3
-:200D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3
-:200D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3
-:200D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93
-:200D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73
-:200DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53
-:200DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33
-:200DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13
-:200E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2
-:200E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2
-:200E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2
-:200E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92
-:200E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72
-:200EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
-:200EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32
-:200EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12
-:200F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1
-:200F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1
-:200F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1
-:200F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91
-:200F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71
-:200FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51
-:200FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31
-:200FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11
-:20100000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
-:20102000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
-:20104000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
-:20106000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
-:20108000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70
-:2010A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50
-:2010C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30
-:2010E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10
-:20110000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF
-:20112000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF
-:20114000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF
-:20116000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F
-:20118000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F
-:2011A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F
-:2011C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F
-:2011E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F
-:20120000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE
-:20122000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE
-:20124000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE
-:20126000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E
-:20128000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E
-:2012A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E
-:2012C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E
-:2012E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E
-:20130000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED
-:20132000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD
-:20134000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD
-:20136000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D
-:20138000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D
-:2013A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D
-:2013C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D
-:2013E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D
-:20140000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC
-:20142000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC
-:20144000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC
-:20146000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C
-:20148000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C
-:2014A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C
-:2014C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C
-:2014E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C
-:20150000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB
-:20152000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB
-:20154000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB
-:20156000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B
-:20158000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B
-:2015A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B
-:2015C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B
-:2015E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B
-:20160000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA
-:20162000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA
-:20164000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA
-:20166000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A
-:20168000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A
-:2016A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A
-:2016C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A
-:2016E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A
-:20170000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9
-:20172000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9
-:20174000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9
-:20176000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65C574C522
-:2017800022C040C06CC03EC03DC03CC03BC03AC039C038C037C036C035C034C033C004038E
-:2017A000090412011001FF000008D0165307020100000001090212000101008032090400CF
-:2017C00000000000000011241FBECFE5D2E0DEBFCDBF00EB0F9307E00F9310E0A0E6B0E04C
-:2017E000E6ECFFE102C005900D92A636B107D9F710E0A6E6B0E001C01D92AB39B107E1F7ED
-:20180000E6D1DFC3BDCFA82FB92F80E090E041E050EA609530E009C02D918227979587957C
-:2018200010F084279527305EC8F36F5FA8F30895EADF8D939D930895A6E088279927AA9508
-:2018400069F00197E1F3B399FCCFB39BFECF81E09927A6B3019611F0A871D9F70895CF9397
-:20186000CFB7CF93C0915F02C03B21F4C0915E02C73021F0CF91CFBFCF9181CFCC27C3951C
-:20188000B39BE9F7B39B0BC0B39B09C0B39B07C0B39B05C0B39B03C0B39B01C0D3C00F926E
-:2018A000DF93C0917E00DD27CB57DF4F012EB39B03C0DF910F90E6CF2F930F931F934F9397
-:2018C0002FEF4F6F06B303FB20F95F933F9350E03BE065C016B30126502953FDC89556B309
-:2018E000012703FB25F92F7306B3B1F05027102713FB26F906B22230F0F000C016B3012732
-:2019000003FB27F90126502906B22430E8F54F77206816B30000F6CF50274F7D206206B2C7
-:20192000102F000000C006B300265029102713FB26F906B2E2CF4F7B06B3206400C0DACF13
-:2019400001265029187106B269F14E7F2160012F16B328C0002650294D7F06B22260102F39
-:2019600029C0012650294B7F06B22460012F2DC016B301265029477F2860000006B22EC05E
-:201980004F7E06B3206130C0422706B3499300265029102706B24FEF13FB20F9297F16B3EE
-:2019A00079F2187159F10126502906B2012703FB21F9237F06B371F2002650293150D0F0B3
-:2019C00006B2102713FB22F9277E16B351F201265029012703FB06B223F92F7C49F20000BE
-:2019E00006B3102713FB24F90026502906B22F7939F270CF10E21ABF002717C03B50319549
-:201A0000C31BD04010E21ABF0881033CF9F00B34E9F020917C001981110F1213EDCF09363D
-:201A200051F10D3211F0013E39F7009383003F915F914F911F910F912F91DF910F90CAB75F
-:201A4000C5FD1DCFCF91CFBFCF91189520918300222369F310918100112321F5343022F125
-:201A60003093810020937D0010917E003BE0311B30937E0019C00091810001309CF40AE590
-:201A80003091600034FD11C000936000C1E7D0E010C0052710E000C021C0052710E0C895D2
-:201AA00008BB14C03AE501C032ED032EC0E0D0E032E017B31861C39A08B317BB58E120E88F
-:201AC0004FEF20FF052708BB279517951C3F28F700004552B0F720FF0527279508BB179524
-:201AE0001C3FB8F629913A9561F7077E10918200110F08BBC250D04011F010937C0010E23D
-:201B00001ABF086017B3177E402F477E54E05A95F1F708BB17BB48BB8ACF81E0809367001A
-:201B2000F894E0916F00F0917000329785E080935700E89507B600FCFDCF789408959C0168
-:201B4000E0916F00F0917000309749F1E430F105B1F087E1EC37F80739F420916B00309174
-:201B60006C002E5B3B4F0DC087E1EE37F80749F420916D0030916E002D5B3B4F02C02FEB15
-:201B80003BECF89481E0090180935700E895112478943296F0937000E0936F00089581E163
-:201BA00080935700E895EBCFCF93DF93C0916F00D0917000CF73D0708FEF9FEFC0DF22963A
-:201BC000C034D105CCF3A9DFDF91CF91089588E10FB6F89481BD11BC0FBEE0E0F0E085914F
-:201BE00094918F5B9B4C39F4E4E0F0E0859194918F5B9B4C09F0D8DF1092700010926F004F
-:201C0000AC9A8BB780628BBFBB9A88E893E1ECE9F1E03197F1F70197D1F7BB987894EE24B0
-:201C2000FF2410918100135017FDD9C080917E00CCE0D0E0C81BD109CB57DF4F80917D00C9
-:201C40008D3209F090C0183009F0C7C083EC809371008AE580936000109269002881822F7A
-:201C600080769981882321F1992341F482E690E09093800080937F0024E06BC0913069F44C
-:201C80008A8180936A008C819D819093700080936F0027FD59C09FEF58C080916600923060
-:201CA00011F4816001C084608093660020E051C08A8110927A00992331F410927B008AE779
-:201CC00090E022E03CC0953019F48093820034C0963011F58B81813019F482EA97E104C0FD
-:201CE000823041F484EB97E19093800080937F0022E10EC0833059F48A81882341F48EE9AE
-:201D000097E19093800080937F0024E001C020E080E4809369001DC0983019F484E890E0E3
-:201D200009C0993019F48093840006C09A3021F48AE790E021E003C08AE790E020E090931F
-:201D4000800080937F0005C09E8180E88093690007C08F81882319F49E81921708F0922F99
-:201D6000909361003AC08091690087FF36C080916A00811B80936A0080916F00909170004A
-:201D8000009739F48881998190936C0080936B0012C08430910539F48881998190936E0052
-:201DA00080936D0008C08A57974128F081E180935700E89507C088819981C1DE125011F0D5
-:201DC0002296DACF80916A00882339F4809166008260809366001092610010928100809146
-:201DE000600084FF3CC0809161008F3FC1F1182F893008F018E0811B809361008091710090
-:201E000098E88927809371001123E1F0E0917F00F09180008091690086FF09C0912FA2E707
-:201E2000B0E084918D9331969150D9F707C0912FA2E7B0E081918D939150E1F7F0938000D7
-:201E4000E0937F0082E790E0612FF2DC612F6C5F6C3019F08FEF809361006093600094E19F
-:201E600086B3887131F49150D9F71092820010927C0010E0992309F411E08091680081176D
-:201E800039F0112319F4F8945DD07894109368008CE991E00197F1F780916600882319F077
-:201EA000EE24FF2403C00894E11CF11C182F80FF14C0F894E0E8F7E1E054F04083E08093E4
-:201EC0005700E89507B600FCFDCF3097A9F71092700010926F0068DE789411FF0FC08AE381
-:201EE00090E20197F1F780916F00909170008F739070892B11F058DE01C00FDE12FF12C061
-:201F000080916700882311F408C04EDE80916F009091700080589741C0F382E291EA0197BA
-:201F2000F1F708C01092660080E5E81683ECF80608F477CEF8941BBE15BA10925F021092FF
-:201F40005E021CCCFF920F931F93CF93DF9380E8F82E00E0C0E0D0E0102F1F0D11BF6CDC3F
-:201F600029E0843392070CF0102FF6942196C830D10511F0012FF0CF115011BF1F5F012FEF
-:201F8000EC0110C059DC8453994097FF03C0909581959F4F8C179D0714F401B7EC0181B7F1
-:201FA0008F5F81BF21B730E0812F90E001968217930744F701BFDF91CF911F910F91FF9077
-:0C1FC0000895F894FFCF5AFF177A4008EC
-:00000001FF
diff --git a/firmware/releases/micronucleus-1.03-2secs.hex b/firmware/releases/micronucleus-1.03-2secs.hex
deleted file mode 100644
index 9180b6a..0000000
--- a/firmware/releases/micronucleus-1.03-2secs.hex
+++ /dev/null
@@ -1,132 +0,0 @@
-:1017C00022C040C06CC03EC03DC03CC03BC03AC01F
-:1017D00039C038C037C036C035C034C033C0040348
-:1017E000090412011001FF000008D016530703017D
-:1017F000000000010902120001010080320904000A
-:1018000000000000000011241FBECFE5D2E0DEBFC3
-:10181000CDBF00EB0F9307E00F9310E0A0E6B0E020
-:10182000EAECFFE102C005900D92A636B107D9F7A8
-:1018300010E0A6E6B0E001C01D92AA39B107E1F7B9
-:10184000DFD1C1C3BDCFA82FB92F80E090E041E028
-:1018500050EA609530E009C02D91822797958795D1
-:1018600010F084279527305EC8F36F5FA8F30895C2
-:10187000EADF8D939D930895A6E088279927AA957E
-:1018800069F00197E1F3B399FCCFB39BFECF81E000
-:101890009927A6B3019611F0A871D9F70895CF93AF
-:1018A000CFB7CF93C0915F02C03B21F4C0915E02DD
-:1018B000C73021F0CF91CFBFCF9181CFCC27C39537
-:1018C000B39BE9F7B39B0BC0B39B09C0B39B07C0A5
-:1018D000B39B05C0B39B03C0B39B01C0D3C00F92A1
-:1018E000DF93C0917D00DD27CC57DF4F012EB39BE6
-:1018F00003C0DF910F90E6CF2F930F931F934F9369
-:101900002FEF4F6F06B303FB20F95F933F9350E037
-:101910003BE065C016B30126502953FDC89556B368
-:10192000012703FB25F92F7306B3B1F050271027C9
-:1019300013FB26F906B22230F0F000C016B30127DF
-:1019400003FB27F90126502906B22430E8F54F772A
-:10195000206816B30000F6CF50274F7D206206B2F4
-:10196000102F000000C006B300265029102713FBDB
-:1019700026F906B2E2CF4F7B06B3206400C0DACF6F
-:1019800001265029187106B269F14E7F2160012F9E
-:1019900016B328C0002650294D7F06B22260102FB2
-:1019A00029C0012650294B7F06B22460012F2DC08B
-:1019B00016B301265029477F2860000006B22EC0CA
-:1019C0004F7E06B3206130C0422706B349930026FC
-:1019D0005029102706B24FEF13FB20F9297F16B3C9
-:1019E00079F2187159F10126502906B2012703FB3B
-:1019F00021F9237F06B371F2002650293150D0F02F
-:101A000006B2102713FB22F9277E16B351F20126E6
-:101A10005029012703FB06B223F92F7C49F200006D
-:101A200006B3102713FB24F90026502906B22F799C
-:101A300039F270CF10E21ABF002717C03B50319522
-:101A4000C31BD04010E21ABF0881033CF9F00B34ED
-:101A5000E9F020917B001981110F1213EDCF0936A7
-:101A600051F10D3211F0013E39F7009382003F91A0
-:101A70005F914F911F910F912F91DF910F90CAB7F6
-:101A8000C5FD1DCFCF91CFBFCF911895209182007A
-:101A9000222369F310918000112321F5343022F1C3
-:101AA0003093800020937C0010917D003BE0311B3F
-:101AB00030937D0019C00091800001309CF40AE54C
-:101AC0003091600034FD11C000936000C0E7D0E0A9
-:101AD00010C0052710E000C021C0052710E0C89500
-:101AE00008BB14C03AE501C032ED032EC0E0D0E0DF
-:101AF00032E017B31861C39A08B317BB58E120E866
-:101B00004FEF20FF052708BB279517951C3F28F7A7
-:101B100000004552B0F720FF0527279508BB179511
-:101B20001C3FB8F629913A9561F7077E1091810024
-:101B3000110F08BBC250D04011F010937B0010E28F
-:101B40001ABF086017B3177E402F477E54E05A959E
-:101B5000F1F708BB17BB48BB8ACF81E080936700D1
-:101B6000F894E0916E00F0916F00329785E08093D9
-:101B70005700E89507B600FCFDCF789408959C01C6
-:101B8000E0916E00F0916F00309749F1E430F1057B
-:101B9000B1F087E1EC3BF80739F420916A0030910D
-:101BA0006B002E5D3B4F0DC087E1EE3BF80749F41B
-:101BB00020916C0030916D002D5D3B4F02C02FEDE8
-:101BC0003BECF89481E0090180935700E8951124DB
-:101BD00078943296F0936F00E0936E00089581E15F
-:101BE00080935700E895EBCF8FEF9FEFC8DF809190
-:101BF0006E0090916F008F739070892BA9F7ADCF15
-:101C000088E10FB6F89481BD11BC0FBEE0E0F0E0B2
-:101C1000859194918F5D9B4C39F4E4E0F0E08591DF
-:101C200094918F5D9B4C09F0DFDF10926F00109252
-:101C30006E00AC9A8BB780628BBFBB9A88E893E149
-:101C4000ECE9F1E03197F1F70197D1F7BB9878947F
-:101C5000EE24FF2410918000135017FDD0C0809116
-:101C60007D00CCE0D0E0C81BD109CC57DF4F80917C
-:101C70007C008D3209F08DC0183009F0BEC083ECB5
-:101C8000809370008AE5809360001092690028813B
-:101C9000822F80769981882309F1992341F482E685
-:101CA00090E090937F0080937E0024E068C09130A4
-:101CB00051F48C819D8190936F0080936E0027FD7D
-:101CC00059C09FEF58C080916600923011F4816036
-:101CD00001C084608093660020E051C08A81109228
-:101CE0007900992331F410927A0089E790E022E09C
-:101CF0003CC0953019F48093810034C0963011F5C2
-:101D00008B81813019F482EE97E104C0823041F476
-:101D100084EF97E190937F0080937E0022E10EC0D4
-:101D2000833059F48A81882341F48EED97E19093B2
-:101D30007F0080937E0024E001C020E080E4809357
-:101D400069001DC0983019F483E890E009C099300B
-:101D500019F48093830006C09A3021F489E790E05B
-:101D600021E003C089E790E020E090937F0080931A
-:101D70007E0005C09E8180E88093690007C08F8146
-:101D8000882319F49E81921708F0922F9093610096
-:101D900034C08091690087FF30C080916E009091BF
-:101DA0006F00009739F48881998190936B0080933C
-:101DB0006A000DC08430910539F48881998190932F
-:101DC0006D0080936C0003C0805C974138F488817B
-:101DD0009981D5DE125011F02296DFCF80916E00EE
-:101DE00090916F008F739070892B39F48091660009
-:101DF0008260809366001092610010928000809152
-:101E0000600084FF3CC0809161008F3FC1F1182FBA
-:101E1000893008F018E0811B809361008091700088
-:101E200098E88927809370001123E1F0E0917E000B
-:101E3000F0917F008091690086FF09C0912FA1E792
-:101E4000B0E084918D9331969150D9F707C0912FCE
-:101E5000A1E7B0E081918D939150E1F7F0937F007D
-:101E6000E0937E0081E790E0612F02DD612F6C5FDF
-:101E70006C3019F08FEF809361006093600094E103
-:101E800086B3887131F49150D9F710928100109285
-:101E90007B0010E0992309F411E08091680081171C
-:101EA00039F0112319F4F8944FD078941093680006
-:101EB0008CE991E00197F1F780916600882319F091
-:101EC000EE24FF2403C00894E11CF11C182F80FFAE
-:101ED00014C0F894E0ECF7E1E054F04083E0809324
-:101EE0005700E89507B600FCFDCF3097A9F7109290
-:101EF0006F0010926E0078DE789411FF0FC08AE3B5
-:101F000090E20197F1F780916E0090916F008F73CE
-:101F10009070892B11F068DE01C01FDE12FD08C031
-:101F20001092660080E2E8168EE4F80608F492CE7D
-:101F300082E291EA0197F1F7F8941BBE15BA10926C
-:101F40005F0210925E023ACCFF920F931F93CF93E1
-:101F5000DF9380E8F82E00E0C0E0D0E0102F1F0DE6
-:101F600011BF8ADC29E0843392070CF0102FF6941D
-:101F70002196C830D10511F0012FF0CF115011BFBB
-:101F80001F5F012FEC0110C077DC8453994097FF4D
-:101F900003C0909581959F4F8C179D0714F401B74E
-:101FA000EC0181B78F5F81BF21B730E0812F90E0D6
-:101FB00001968217930744F701BFDF91CF911F91DC
-:0A1FC0000F91FF900895F894FFCFF1
-:061FCA005AFF17BC40089D
-:04000003000017C022
-:00000001FF
diff --git a/firmware/releases/micronucleus-1.03-5secs.hex b/firmware/releases/micronucleus-1.03-5secs.hex
deleted file mode 100644
index 5ca4e98..0000000
--- a/firmware/releases/micronucleus-1.03-5secs.hex
+++ /dev/null
@@ -1,132 +0,0 @@
-:1017C00022C040C06CC03EC03DC03CC03BC03AC01F
-:1017D00039C038C037C036C035C034C033C0040348
-:1017E000090412011001FF000008D016530703017D
-:1017F000000000010902120001010080320904000A
-:1018000000000000000011241FBECFE5D2E0DEBFC3
-:10181000CDBF00EB0F9307E00F9310E0A0E6B0E020
-:10182000EAECFFE102C005900D92A636B107D9F7A8
-:1018300010E0A6E6B0E001C01D92AA39B107E1F7B9
-:10184000DFD1C1C3BDCFA82FB92F80E090E041E028
-:1018500050EA609530E009C02D91822797958795D1
-:1018600010F084279527305EC8F36F5FA8F30895C2
-:10187000EADF8D939D930895A6E088279927AA957E
-:1018800069F00197E1F3B399FCCFB39BFECF81E000
-:101890009927A6B3019611F0A871D9F70895CF93AF
-:1018A000CFB7CF93C0915F02C03B21F4C0915E02DD
-:1018B000C73021F0CF91CFBFCF9181CFCC27C39537
-:1018C000B39BE9F7B39B0BC0B39B09C0B39B07C0A5
-:1018D000B39B05C0B39B03C0B39B01C0D3C00F92A1
-:1018E000DF93C0917D00DD27CC57DF4F012EB39BE6
-:1018F00003C0DF910F90E6CF2F930F931F934F9369
-:101900002FEF4F6F06B303FB20F95F933F9350E037
-:101910003BE065C016B30126502953FDC89556B368
-:10192000012703FB25F92F7306B3B1F050271027C9
-:1019300013FB26F906B22230F0F000C016B30127DF
-:1019400003FB27F90126502906B22430E8F54F772A
-:10195000206816B30000F6CF50274F7D206206B2F4
-:10196000102F000000C006B300265029102713FBDB
-:1019700026F906B2E2CF4F7B06B3206400C0DACF6F
-:1019800001265029187106B269F14E7F2160012F9E
-:1019900016B328C0002650294D7F06B22260102FB2
-:1019A00029C0012650294B7F06B22460012F2DC08B
-:1019B00016B301265029477F2860000006B22EC0CA
-:1019C0004F7E06B3206130C0422706B349930026FC
-:1019D0005029102706B24FEF13FB20F9297F16B3C9
-:1019E00079F2187159F10126502906B2012703FB3B
-:1019F00021F9237F06B371F2002650293150D0F02F
-:101A000006B2102713FB22F9277E16B351F20126E6
-:101A10005029012703FB06B223F92F7C49F200006D
-:101A200006B3102713FB24F90026502906B22F799C
-:101A300039F270CF10E21ABF002717C03B50319522
-:101A4000C31BD04010E21ABF0881033CF9F00B34ED
-:101A5000E9F020917B001981110F1213EDCF0936A7
-:101A600051F10D3211F0013E39F7009382003F91A0
-:101A70005F914F911F910F912F91DF910F90CAB7F6
-:101A8000C5FD1DCFCF91CFBFCF911895209182007A
-:101A9000222369F310918000112321F5343022F1C3
-:101AA0003093800020937C0010917D003BE0311B3F
-:101AB00030937D0019C00091800001309CF40AE54C
-:101AC0003091600034FD11C000936000C0E7D0E0A9
-:101AD00010C0052710E000C021C0052710E0C89500
-:101AE00008BB14C03AE501C032ED032EC0E0D0E0DF
-:101AF00032E017B31861C39A08B317BB58E120E866
-:101B00004FEF20FF052708BB279517951C3F28F7A7
-:101B100000004552B0F720FF0527279508BB179511
-:101B20001C3FB8F629913A9561F7077E1091810024
-:101B3000110F08BBC250D04011F010937B0010E28F
-:101B40001ABF086017B3177E402F477E54E05A959E
-:101B5000F1F708BB17BB48BB8ACF81E080936700D1
-:101B6000F894E0916E00F0916F00329785E08093D9
-:101B70005700E89507B600FCFDCF789408959C01C6
-:101B8000E0916E00F0916F00309749F1E430F1057B
-:101B9000B1F087E1EC3BF80739F420916A0030910D
-:101BA0006B002E5D3B4F0DC087E1EE3BF80749F41B
-:101BB00020916C0030916D002D5D3B4F02C02FEDE8
-:101BC0003BECF89481E0090180935700E8951124DB
-:101BD00078943296F0936F00E0936E00089581E15F
-:101BE00080935700E895EBCF8FEF9FEFC8DF809190
-:101BF0006E0090916F008F739070892BA9F7ADCF15
-:101C000088E10FB6F89481BD11BC0FBEE0E0F0E0B2
-:101C1000859194918F5D9B4C39F4E4E0F0E08591DF
-:101C200094918F5D9B4C09F0DFDF10926F00109252
-:101C30006E00AC9A8BB780628BBFBB9A88E893E149
-:101C4000ECE9F1E03197F1F70197D1F7BB9878947F
-:101C5000EE24FF2410918000135017FDD0C0809116
-:101C60007D00CCE0D0E0C81BD109CC57DF4F80917C
-:101C70007C008D3209F08DC0183009F0BEC083ECB5
-:101C8000809370008AE5809360001092690028813B
-:101C9000822F80769981882309F1992341F482E685
-:101CA00090E090937F0080937E0024E068C09130A4
-:101CB00051F48C819D8190936F0080936E0027FD7D
-:101CC00059C09FEF58C080916600923011F4816036
-:101CD00001C084608093660020E051C08A81109228
-:101CE0007900992331F410927A0089E790E022E09C
-:101CF0003CC0953019F48093810034C0963011F5C2
-:101D00008B81813019F482EE97E104C0823041F476
-:101D100084EF97E190937F0080937E0022E10EC0D4
-:101D2000833059F48A81882341F48EED97E19093B2
-:101D30007F0080937E0024E001C020E080E4809357
-:101D400069001DC0983019F483E890E009C099300B
-:101D500019F48093830006C09A3021F489E790E05B
-:101D600021E003C089E790E020E090937F0080931A
-:101D70007E0005C09E8180E88093690007C08F8146
-:101D8000882319F49E81921708F0922F9093610096
-:101D900034C08091690087FF30C080916E009091BF
-:101DA0006F00009739F48881998190936B0080933C
-:101DB0006A000DC08430910539F48881998190932F
-:101DC0006D0080936C0003C0805C974138F488817B
-:101DD0009981D5DE125011F02296DFCF80916E00EE
-:101DE00090916F008F739070892B39F48091660009
-:101DF0008260809366001092610010928000809152
-:101E0000600084FF3CC0809161008F3FC1F1182FBA
-:101E1000893008F018E0811B809361008091700088
-:101E200098E88927809370001123E1F0E0917E000B
-:101E3000F0917F008091690086FF09C0912FA1E792
-:101E4000B0E084918D9331969150D9F707C0912FCE
-:101E5000A1E7B0E081918D939150E1F7F0937F007D
-:101E6000E0937E0081E790E0612F02DD612F6C5FDF
-:101E70006C3019F08FEF809361006093600094E103
-:101E800086B3887131F49150D9F710928100109285
-:101E90007B0010E0992309F411E08091680081171C
-:101EA00039F0112319F4F8944FD078941093680006
-:101EB0008CE991E00197F1F780916600882319F091
-:101EC000EE24FF2403C00894E11CF11C182F80FFAE
-:101ED00014C0F894E0ECF7E1E054F04083E0809324
-:101EE0005700E89507B600FCFDCF3097A9F7109290
-:101EF0006F0010926E0078DE789411FF0FC08AE3B5
-:101F000090E20197F1F780916E0090916F008F73CE
-:101F10009070892B11F068DE01C01FDE12FD08C031
-:101F20001092660080E5E81683ECF80608F492CE7D
-:101F300082E291EA0197F1F7F8941BBE15BA10926C
-:101F40005F0210925E023ACCFF920F931F93CF93E1
-:101F5000DF9380E8F82E00E0C0E0D0E0102F1F0DE6
-:101F600011BF8ADC29E0843392070CF0102FF6941D
-:101F70002196C830D10511F0012FF0CF115011BFBB
-:101F80001F5F012FEC0110C077DC8453994097FF4D
-:101F900003C0909581959F4F8C179D0714F401B74E
-:101FA000EC0181B78F5F81BF21B730E0812F90E0D6
-:101FB00001968217930744F701BFDF91CF911F91DC
-:0A1FC0000F91FF900895F894FFCFF1
-:061FCA005AFF17BC40089D
-:04000003000017C022
-:00000001FF
diff --git a/firmware/releases/micronucleus-1.04-low-power.hex b/firmware/releases/micronucleus-1.04-low-power.hex
deleted file mode 100644
index 7cd99e2..0000000
--- a/firmware/releases/micronucleus-1.04-low-power.hex
+++ /dev/null
@@ -1,135 +0,0 @@
-:1017C00022C040C06CC03EC03DC03CC03BC03AC01F
-:1017D00039C038C037C036C035C034C033C0040348
-:1017E000090412011001FF000008D016530704017C
-:1017F000000000010902120001010080320904000A
-:1018000000000000000011241FBECFE5D2E0DEBFC3
-:10181000CDBF00EB0F9307E00F9310E0A0E6B0E020
-:10182000E6EFFFE102C005900D92A636B107D9F7A9
-:1018300010E0A6E6B0E001C01D92AC39B107E1F7B7
-:10184000DFD1D7C3BDCFA82FB92F80E090E041E012
-:1018500050EA609530E009C02D91822797958795D1
-:1018600010F084279527305EC8F36F5FA8F30895C2
-:10187000EADF8D939D930895A6E088279927AA957E
-:1018800069F00197E1F3B399FCCFB39BFECF81E000
-:101890009927A6B3019611F0A871D9F70895CF93AF
-:1018A000CFB7CF93C0915F02C03B21F4C0915E02DD
-:1018B000C73021F0CF91CFBFCF9181CFCC27C39537
-:1018C000B39BE9F7B39B0BC0B39B09C0B39B07C0A5
-:1018D000B39B05C0B39B03C0B39B01C0D3C00F92A1
-:1018E000DF93C0917F00DD27CA57DF4F012EB39BE6
-:1018F00003C0DF910F90E6CF2F930F931F934F9369
-:101900002FEF4F6F06B303FB20F95F933F9350E037
-:101910003BE065C016B30126502953FDC89556B368
-:10192000012703FB25F92F7306B3B1F050271027C9
-:1019300013FB26F906B22230F0F000C016B30127DF
-:1019400003FB27F90126502906B22430E8F54F772A
-:10195000206816B30000F6CF50274F7D206206B2F4
-:10196000102F000000C006B300265029102713FBDB
-:1019700026F906B2E2CF4F7B06B3206400C0DACF6F
-:1019800001265029187106B269F14E7F2160012F9E
-:1019900016B328C0002650294D7F06B22260102FB2
-:1019A00029C0012650294B7F06B22460012F2DC08B
-:1019B00016B301265029477F2860000006B22EC0CA
-:1019C0004F7E06B3206130C0422706B349930026FC
-:1019D0005029102706B24FEF13FB20F9297F16B3C9
-:1019E00079F2187159F10126502906B2012703FB3B
-:1019F00021F9237F06B371F2002650293150D0F02F
-:101A000006B2102713FB22F9277E16B351F20126E6
-:101A10005029012703FB06B223F92F7C49F200006D
-:101A200006B3102713FB24F90026502906B22F799C
-:101A300039F270CF10E21ABF002717C03B50319522
-:101A4000C31BD04010E21ABF0881033CF9F00B34ED
-:101A5000E9F020917D001981110F1213EDCF0936A5
-:101A600051F10D3211F0013E39F7009384003F919E
-:101A70005F914F911F910F912F91DF910F90CAB7F6
-:101A8000C5FD1DCFCF91CFBFCF9118952091840078
-:101A9000222369F310918200112321F5343022F1C1
-:101AA0003093820020937E0010917F003BE0311B39
-:101AB00030937F0019C00091820001309CF40AE548
-:101AC0003091600034FD11C000936000C2E7D0E0A7
-:101AD00010C0052710E000C021C0052710E0C89500
-:101AE00008BB14C03AE501C032ED032EC0E0D0E0DF
-:101AF00032E017B31861C39A08B317BB58E120E866
-:101B00004FEF20FF052708BB279517951C3F28F7A7
-:101B100000004552B0F720FF0527279508BB179511
-:101B20001C3FB8F629913A9561F7077E1091830022
-:101B3000110F08BBC250D04011F010937D0010E28D
-:101B40001ABF086017B3177E402F477E54E05A959E
-:101B5000F1F708BB17BB48BB8ACF81E080936900CF
-:101B6000F894E0917000F0917100329785E08093D5
-:101B70005700E89507B600FCFDCF789408959C01C6
-:101B8000E0917000F0917100309749F1E430F10577
-:101B9000B1F087E1EC3BF80739F420916C0030910B
-:101BA0006D002E5D3B4F0DC087E1EE3BF80749F419
-:101BB00020916E0030916F002D5D3B4F02C02FEDE4
-:101BC0003BECF89481E0090180935700E8951124DB
-:101BD00078943296F0937100E0937000089581E15B
-:101BE00080935700E895EBCF8FEF9FEFC8DF809190
-:101BF0007000909171008F739070892BA9F7ADCF11
-:101C000001B788E10FB6F89481BD11BC0FBEE0E0CA
-:101C1000F0E0859194918F5D9B4C39F4E4E0F0E025
-:101C2000859194918F5D9B4C09F0DEDF10927100DD
-:101C300010927000B39B87C180E886BD16BCAC9A39
-:101C40008BB780628BBFBB9A88E893E1ECE9F1E047
-:101C50003197F1F70197D1F7BB98789410918200F2
-:101C6000135017FDD4C080917F00CCE0D0E0C81B9A
-:101C7000D109CA57DF4F80917E008D3209F091C0A3
-:101C8000183009F0C2C083EC809372008AE580931B
-:101C9000600010926B002881822F807699818823C2
-:101CA00029F11092670010926600992341F482E6B0
-:101CB00090E0909381008093800024E068C0913090
-:101CC00051F48C819D81909371008093700027FD69
-:101CD00059C09FEF58C080916800923011F4816024
-:101CE00001C084608093680020E051C08A81109216
-:101CF0007B00992331F410927C008BE790E022E086
-:101D00003CC0953019F48093830034C0963011F5AF
-:101D10008B81813019F482EE97E104C0823041F466
-:101D200084EF97E1909381008093800022E10EC0C0
-:101D3000833059F48A81882341F48EED97E19093A2
-:101D400081008093800024E001C020E080E4809343
-:101D50006B001DC0983019F485E890E009C09930F7
-:101D600019F48093850006C09A3021F48BE790E047
-:101D700021E003C08BE790E020E090938100809306
-:101D8000800005C09E8180E880936B0007C08F8132
-:101D9000882319F49E81921708F0922F9093610086
-:101DA00034C080916B0087FF30C0809170009091AB
-:101DB0007100009739F48881998190936D00809328
-:101DC0006C000DC08430910539F48881998190931D
-:101DD0006F0080936E0003C0805C974138F4888167
-:101DE0009981CDDE125011F02296DFCF80917000E4
-:101DF000909171008F739070892B39F480916800F5
-:101E0000826080936800109261001092820080913D
-:101E1000600084FF3CC0809161008F3FC1F1182FAA
-:101E2000893008F018E0811B809361008091720076
-:101E300098E88927809372001123E1F0E0918000F7
-:101E4000F091810080916B0086FF09C0912FA3E77C
-:101E5000B0E084918D9331969150D9F707C0912FBE
-:101E6000A3E7B0E081918D939150E1F7F093810069
-:101E7000E093800083E790E0612FFADC612F6C5FD4
-:101E80006C3019F08FEF809361006093600094E1F3
-:101E900086B3887131F49150D9F710928300109273
-:101EA0007D0010E0992309F411E080916A00811708
-:101EB00039F0112319F4F8945DD0789410936A00E6
-:101EC0008CE991E00197F1F78091660090916700AD
-:101ED0000196909367008093660080916800182FA8
-:101EE00080FF14C0F894E0ECF7E1E054F04083E0A8
-:101EF00080935700E89507B600FCFDCF3097A9F70F
-:101F000010927100109270006FDE789411FF0FC074
-:101F10008AE390E20197F1F780917000909171004F
-:101F20008F739070892B11F05FDE01C016DE12FDF9
-:101F30000AC0109268008091660090916700885AEC
-:101F4000914608F48BCE80E886BD81E086BD03C053
-:101F500081B7815081BF81B70817D0F382E291EA3F
-:101F60000197F1F7F8941BBE15BA10925F02109218
-:101F70005E0224CCFF920F931F93CF93DF9380E8F0
-:101F8000F82E00E0C0E0D0E0102F1F0D11BF74DC70
-:101F900029E0843392070CF0102FF6942196C83074
-:101FA000D10511F0012FF0CF115011BF1F5F012F8C
-:101FB000EC0110C061DC8453994097FF03C09095F9
-:101FC00081959F4F8C179D0714F401B7EC0181B7E1
-:101FD0008F5F81BF21B730E0812F90E0019682179B
-:101FE000930744F701BFDF91CF911F910F91FF90AD
-:061FF0000895F894FFCFF4
-:061FF6005AFF17BC400673
-:04000003000017C022
-:00000001FF
diff --git a/firmware/releases/micronucleus-1.04.hex b/firmware/releases/micronucleus-1.04.hex
deleted file mode 100644
index b57982a..0000000
--- a/firmware/releases/micronucleus-1.04.hex
+++ /dev/null
@@ -1,133 +0,0 @@
-:1017C00022C040C06CC03EC03DC03CC03BC03AC01F
-:1017D00039C038C037C036C035C034C033C0040348
-:1017E000090412011001FF000008D016530704017C
-:1017F000000000010902120001010080320904000A
-:1018000000000000000011241FBECFE5D2E0DEBFC3
-:10181000CDBF00EB0F9307E00F9310E0A0E6B0E020
-:10182000E4EDFFE102C005900D92A636B107D9F7AD
-:1018300010E0A6E6B0E001C01D92AC39B107E1F7B7
-:10184000DFD1C6C3BDCFA82FB92F80E090E041E023
-:1018500050EA609530E009C02D91822797958795D1
-:1018600010F084279527305EC8F36F5FA8F30895C2
-:10187000EADF8D939D930895A6E088279927AA957E
-:1018800069F00197E1F3B399FCCFB39BFECF81E000
-:101890009927A6B3019611F0A871D9F70895CF93AF
-:1018A000CFB7CF93C0915F02C03B21F4C0915E02DD
-:1018B000C73021F0CF91CFBFCF9181CFCC27C39537
-:1018C000B39BE9F7B39B0BC0B39B09C0B39B07C0A5
-:1018D000B39B05C0B39B03C0B39B01C0D3C00F92A1
-:1018E000DF93C0917F00DD27CA57DF4F012EB39BE6
-:1018F00003C0DF910F90E6CF2F930F931F934F9369
-:101900002FEF4F6F06B303FB20F95F933F9350E037
-:101910003BE065C016B30126502953FDC89556B368
-:10192000012703FB25F92F7306B3B1F050271027C9
-:1019300013FB26F906B22230F0F000C016B30127DF
-:1019400003FB27F90126502906B22430E8F54F772A
-:10195000206816B30000F6CF50274F7D206206B2F4
-:10196000102F000000C006B300265029102713FBDB
-:1019700026F906B2E2CF4F7B06B3206400C0DACF6F
-:1019800001265029187106B269F14E7F2160012F9E
-:1019900016B328C0002650294D7F06B22260102FB2
-:1019A00029C0012650294B7F06B22460012F2DC08B
-:1019B00016B301265029477F2860000006B22EC0CA
-:1019C0004F7E06B3206130C0422706B349930026FC
-:1019D0005029102706B24FEF13FB20F9297F16B3C9
-:1019E00079F2187159F10126502906B2012703FB3B
-:1019F00021F9237F06B371F2002650293150D0F02F
-:101A000006B2102713FB22F9277E16B351F20126E6
-:101A10005029012703FB06B223F92F7C49F200006D
-:101A200006B3102713FB24F90026502906B22F799C
-:101A300039F270CF10E21ABF002717C03B50319522
-:101A4000C31BD04010E21ABF0881033CF9F00B34ED
-:101A5000E9F020917D001981110F1213EDCF0936A5
-:101A600051F10D3211F0013E39F7009384003F919E
-:101A70005F914F911F910F912F91DF910F90CAB7F6
-:101A8000C5FD1DCFCF91CFBFCF9118952091840078
-:101A9000222369F310918200112321F5343022F1C1
-:101AA0003093820020937E0010917F003BE0311B39
-:101AB00030937F0019C00091820001309CF40AE548
-:101AC0003091600034FD11C000936000C2E7D0E0A7
-:101AD00010C0052710E000C021C0052710E0C89500
-:101AE00008BB14C03AE501C032ED032EC0E0D0E0DF
-:101AF00032E017B31861C39A08B317BB58E120E866
-:101B00004FEF20FF052708BB279517951C3F28F7A7
-:101B100000004552B0F720FF0527279508BB179511
-:101B20001C3FB8F629913A9561F7077E1091830022
-:101B3000110F08BBC250D04011F010937D0010E28D
-:101B40001ABF086017B3177E402F477E54E05A959E
-:101B5000F1F708BB17BB48BB8ACF81E080936900CF
-:101B6000F894E0917000F0917100329785E08093D5
-:101B70005700E89507B600FCFDCF789408959C01C6
-:101B8000E0917000F0917100309749F1E430F10577
-:101B9000B1F087E1EC3BF80739F420916C0030910B
-:101BA0006D002E5D3B4F0DC087E1EE3BF80749F419
-:101BB00020916E0030916F002D5D3B4F02C02FEDE4
-:101BC0003BECF89481E0090180935700E8951124DB
-:101BD00078943296F0937100E0937000089581E15B
-:101BE00080935700E895EBCF8FEF9FEFC8DF809190
-:101BF0007000909171008F739070892BA9F7ADCF11
-:101C000088E10FB6F89481BD11BC0FBEE0E0F0E0B2
-:101C1000859194918F5D9B4C39F4E4E0F0E08591DF
-:101C200094918F5D9B4C09F0DFDF10927100109250
-:101C30007000AC9A8BB780628BBFBB9A88E893E147
-:101C4000ECE9F1E03197F1F70197D1F7BB9878947F
-:101C500010918200135017FDD4C080917F00CCE01A
-:101C6000D0E0C81BD109CA57DF4F80917E008D326A
-:101C700009F091C0183009F0C2C083EC8093720063
-:101C80008AE58093600010926B002881822F807615
-:101C90009981882329F11092670010926600992398
-:101CA00041F482E690E0909381008093800024E0EC
-:101CB00068C0913051F48C819D8190937100809324
-:101CC000700027FD59C09FEF58C080916800923086
-:101CD00011F4816001C084608093680020E051C0ED
-:101CE0008A8110927B00992331F410927C008BE75B
-:101CF00090E022E03CC0953019F48093830034C01A
-:101D0000963011F58B81813019F482EE97E104C091
-:101D1000823041F484EF97E19093810080938000BA
-:101D200022E10EC0833059F48A81882341F48EED7C
-:101D300097E1909381008093800024E001C020E02F
-:101D400080E480936B001DC0983019F485E890E022
-:101D500009C0993019F48093850006C09A3021F4A7
-:101D60008BE790E021E003C08BE790E020E09093C8
-:101D700081008093800005C09E8180E880936B0085
-:101D800007C08F81882319F49E81921708F0922F43
-:101D90009093610034C080916B0087FF30C08091C8
-:101DA000700090917100009739F488819981909327
-:101DB0006D0080936C000DC08430910539F48881EA
-:101DC000998190936F0080936E0003C0805C97416F
-:101DD00038F488819981D3DE125011F02296DFCF3A
-:101DE00080917000909171008F739070892B39F4FD
-:101DF0008091680082608093680010926100109268
-:101E000082008091600084FF3CC0809161008F3F20
-:101E1000C1F1182F893008F018E0811B8093610010
-:101E20008091720098E88927809372001123E1F075
-:101E3000E0918000F091810080916B0086FF09C0E5
-:101E4000912FA3E7B0E084918D9331969150D9F70B
-:101E500007C0912FA3E7B0E081918D939150E1F7F6
-:101E6000F0938100E093800083E790E0612F00DD34
-:101E7000612F6C5F6C3019F08FEF8093610060937D
-:101E8000600094E186B3887131F49150D9F71092D3
-:101E9000830010927D0010E0992309F411E08091F5
-:101EA0006A00811739F0112319F4F89452D078940C
-:101EB00010936A008CE991E00197F1F78091660038
-:101EC00090916700019690936700809366008091DF
-:101ED0006800182F80FF14C0F894E0ECF7E1E0549C
-:101EE000F04083E080935700E89507B600FCFDCFF3
-:101EF0003097A9F7109271001092700075DE7894F7
-:101F000011FF0FC08AE390E20197F1F78091700012
-:101F1000909171008F739070892B11F065DE01C074
-:101F20001CDE12FD0AC0109268008091660090913C
-:101F30006700885A914608F48BCE82E291EA0197B5
-:101F4000F1F7F8941BBE15BA10925F0210925E0270
-:101F500035CCFF920F931F93CF93DF9380E8F82E39
-:101F600000E0C0E0D0E0102F1F0D11BF85DC29E09C
-:101F7000843392070CF0102FF6942196C830D105C7
-:101F800011F0012FF0CF115011BF1F5F012FEC0195
-:101F900010C072DC8453994097FF03C090958195DF
-:101FA0009F4F8C179D0714F401B7EC0181B78F5F29
-:101FB00081BF21B730E0812F90E00196821793070F
-:101FC00044F701BFDF91CF911F910F91FF900895CA
-:041FD000F894FFCFB3
-:061FD4005AFF17BC400695
-:04000003000017C022
-:00000001FF
diff --git a/firmware/releases/micronucleus-1.05-jumper.hex b/firmware/releases/micronucleus-1.05-jumper.hex
deleted file mode 100644
index 74de89c..0000000
--- a/firmware/releases/micronucleus-1.05-jumper.hex
+++ /dev/null
@@ -1,134 +0,0 @@
-:1017C00022C040C06CC03EC03DC03CC03BC03AC01F
-:1017D00039C038C037C036C035C034C033C0040348
-:1017E000090412011001FF000008D016530705017B
-:1017F000000000010902120001010080320904000A
-:1018000000000000000011241FBECFE5D2E0DEBFC3
-:10181000CDBF00EB0F9307E00F9310E0A0E6B0E020
-:10182000E0EFFFE102C005900D92A636B107D9F7AF
-:1018300010E0A6E6B0E001C01D92AC39B107E1F7B7
-:10184000DFD1D4C3BDCFA82FB92F80E090E041E015
-:1018500050EA609530E009C02D91822797958795D1
-:1018600010F084279527305EC8F36F5FA8F30895C2
-:10187000EADF8D939D930895A6E088279927AA957E
-:1018800069F00197E1F3B399FCCFB39BFECF81E000
-:101890009927A6B3019611F0A871D9F70895CF93AF
-:1018A000CFB7CF93C0915F02C03B21F4C0915E02DD
-:1018B000C73021F0CF91CFBFCF9181CFCC27C39537
-:1018C000B39BE9F7B39B0BC0B39B09C0B39B07C0A5
-:1018D000B39B05C0B39B03C0B39B01C0D3C00F92A1
-:1018E000DF93C0917F00DD27CA57DF4F012EB39BE6
-:1018F00003C0DF910F90E6CF2F930F931F934F9369
-:101900002FEF4F6F06B303FB20F95F933F9350E037
-:101910003BE065C016B30126502953FDC89556B368
-:10192000012703FB25F92F7306B3B1F050271027C9
-:1019300013FB26F906B22230F0F000C016B30127DF
-:1019400003FB27F90126502906B22430E8F54F772A
-:10195000206816B30000F6CF50274F7D206206B2F4
-:10196000102F000000C006B300265029102713FBDB
-:1019700026F906B2E2CF4F7B06B3206400C0DACF6F
-:1019800001265029187106B269F14E7F2160012F9E
-:1019900016B328C0002650294D7F06B22260102FB2
-:1019A00029C0012650294B7F06B22460012F2DC08B
-:1019B00016B301265029477F2860000006B22EC0CA
-:1019C0004F7E06B3206130C0422706B349930026FC
-:1019D0005029102706B24FEF13FB20F9297F16B3C9
-:1019E00079F2187159F10126502906B2012703FB3B
-:1019F00021F9237F06B371F2002650293150D0F02F
-:101A000006B2102713FB22F9277E16B351F20126E6
-:101A10005029012703FB06B223F92F7C49F200006D
-:101A200006B3102713FB24F90026502906B22F799C
-:101A300039F270CF10E21ABF002717C03B50319522
-:101A4000C31BD04010E21ABF0881033CF9F00B34ED
-:101A5000E9F020917D001981110F1213EDCF0936A5
-:101A600051F10D3211F0013E39F7009384003F919E
-:101A70005F914F911F910F912F91DF910F90CAB7F6
-:101A8000C5FD1DCFCF91CFBFCF9118952091840078
-:101A9000222369F310918200112321F5343022F1C1
-:101AA0003093820020937E0010917F003BE0311B39
-:101AB00030937F0019C00091820001309CF40AE548
-:101AC0003091600034FD11C000936000C2E7D0E0A7
-:101AD00010C0052710E000C021C0052710E0C89500
-:101AE00008BB14C03AE501C032ED032EC0E0D0E0DF
-:101AF00032E017B31861C39A08B317BB58E120E866
-:101B00004FEF20FF052708BB279517951C3F28F7A7
-:101B100000004552B0F720FF0527279508BB179511
-:101B20001C3FB8F629913A9561F7077E1091830022
-:101B3000110F08BBC250D04011F010937D0010E28D
-:101B40001ABF086017B3177E402F477E54E05A959E
-:101B5000F1F708BB17BB48BB8ACF81E080936900CF
-:101B6000F894E0917000F0917100329785E08093D5
-:101B70005700E89507B600FCFDCF789408959C01C6
-:101B8000E0917000F0917100309749F1E430F10577
-:101B9000B1F087E1EC3BF80739F420916C0030910B
-:101BA0006D002E5D3B4F0DC087E1EE3BF80749F419
-:101BB00020916E0030916F002D5D3B4F02C02FEDE4
-:101BC0003BECF89481E0090180935700E8951124DB
-:101BD00078943296F0937100E0937000089581E15B
-:101BE00080935700E895EBCF8FEF9FEFC8DF809190
-:101BF0007000909171008F739070892BA9F7ADCF11
-:101C00001F93CF93DF9388E10FB6F89481BD11BC89
-:101C10000FBEE0E0F0E0859194918F5D9B4C39F42C
-:101C2000E4E0F0E0859194918F5D9B4C09F0DCDF5E
-:101C30001092710010927000BD9AC59A82E291EAEA
-:101C40000197F1F786B382958695877080FD7DC1F7
-:101C5000AC9A8BB780628BBFBB9A88E893E1ECE9C2
-:101C6000F1E03197F1F70197D1F7BB987894109193
-:101C70008200135017FDD4C080917F00CCE0D0E0EB
-:101C8000C81BD109CA57DF4F80917E008D3209F001
-:101C900091C0183009F0C2C083EC809372008AE5CD
-:101CA0008093600010926B002881822F807699814A
-:101CB000882329F11092670010926600992341F45D
-:101CC00082E690E0909381008093800024E068C0D9
-:101CD000913051F48C819D819093710080937000BC
-:101CE00027FD59C09FEF58C080916800923011F4D1
-:101CF000816001C084608093680020E051C08A81C7
-:101D000010927B00992331F410927C008BE790E0D5
-:101D100022E03CC0953019F48093830034C09630A3
-:101D200011F58B81813019F482EE97E104C0823085
-:101D300041F484EF97E1909381008093800022E149
-:101D40000EC0833059F48A81882341F48EED97E1E7
-:101D5000909381008093800024E001C020E080E423
-:101D600080936B001DC0983019F485E890E009C09D
-:101D7000993019F48093850006C09A3021F48BE7DE
-:101D800090E021E003C08BE790E020E09093810099
-:101D90008093800005C09E8180E880936B0007C01F
-:101DA0008F81882319F49E81921708F0922F9093C7
-:101DB000610034C080916B0087FF30C0809170005B
-:101DC00090917100009739F48881998190936D000A
-:101DD00080936C000DC08430910539F4888199811D
-:101DE00090936F0080936E0003C0805C974138F43D
-:101DF00088819981C4DE125011F02296DFCF809144
-:101E00007000909171008F739070892B39F48091DC
-:101E100068008260809368001092610010928200D6
-:101E20008091600084FF3CC0809161008F3FC1F1D0
-:101E3000182F893008F018E0811B80936100809191
-:101E4000720098E88927809372001123E1F0E091F5
-:101E50008000F091810080916B0086FF09C0912F76
-:101E6000A3E7B0E084918D9331969150D9F707C0E4
-:101E7000912FA3E7B0E081918D939150E1F7F0931A
-:101E80008100E093800083E790E0612FF1DC612F17
-:101E90006C5F6C3019F08FEF80936100609360008D
-:101EA00094E186B3887131F49150D9F71092830090
-:101EB00010927D0010E0992309F411E080916A00EE
-:101EC000811739F0112319F4F89451D078941093B4
-:101ED0006A008CE991E00197F1F78091660090919A
-:101EE0006700019690936700809366008091680078
-:101EF000182F80FF14C0F894E0ECF7E1E054F040B4
-:101F000083E080935700E89507B600FCFDCF30973B
-:101F1000A9F7109271001092700066DE789411FF9C
-:101F20000FC08AE390E20197F1F7809170009091E1
-:101F300071008F739070892B11F056DE01C00DDE99
-:101F400012FD03C01092680092CE82E291EA0197DE
-:101F5000F1F718BA17BAF8941BBE15BA10925F02BF
-:101F600010925E022BCCDF91CF911F910895FF92CA
-:101F70000F931F93CF93DF9380E8F82E00E0C0E02B
-:101F8000D0E0102F1F0D11BF77DC29E084339207BA
-:101F90000CF0102FF6942196C830D10511F0012FC6
-:101FA000F0CF115011BF1F5F012FEC0110C064DC96
-:101FB0008453994097FF03C0909581959F4F8C174C
-:101FC0009D0714F401B7EC0181B78F5F81BF21B782
-:101FD00030E0812F90E001968217930744F701BF0C
-:101FE000DF91CF911F910F91FF900895F894FFCF4B
-:061FF0005AFF17BC400877
-:04000003000017C022
-:00000001FF
diff --git a/firmware/releases/micronucleus-1.05.hex b/firmware/releases/micronucleus-1.05.hex
deleted file mode 100644
index 5805e95..0000000
--- a/firmware/releases/micronucleus-1.05.hex
+++ /dev/null
@@ -1,134 +0,0 @@
-:1017C00022C040C06CC03EC03DC03CC03BC03AC01F
-:1017D00039C038C037C036C035C034C033C0040348
-:1017E000090412011001FF000008D016530705017B
-:1017F000000000010902120001010080320904000A
-:1018000000000000000011241FBECFE5D2E0DEBFC3
-:10181000CDBF00EB0F9307E00F9310E0A0E6B0E020
-:10182000E2EEFFE102C005900D92A636B107D9F7AE
-:1018300010E0A6E6B0E001C01D92AC39B107E1F7B7
-:10184000DFD1CDC3BDCFA82FB92F80E090E041E01C
-:1018500050EA609530E009C02D91822797958795D1
-:1018600010F084279527305EC8F36F5FA8F30895C2
-:10187000EADF8D939D930895A6E088279927AA957E
-:1018800069F00197E1F3B399FCCFB39BFECF81E000
-:101890009927A6B3019611F0A871D9F70895CF93AF
-:1018A000CFB7CF93C0915F02C03B21F4C0915E02DD
-:1018B000C73021F0CF91CFBFCF9181CFCC27C39537
-:1018C000B39BE9F7B39B0BC0B39B09C0B39B07C0A5
-:1018D000B39B05C0B39B03C0B39B01C0D3C00F92A1
-:1018E000DF93C0917F00DD27CA57DF4F012EB39BE6
-:1018F00003C0DF910F90E6CF2F930F931F934F9369
-:101900002FEF4F6F06B303FB20F95F933F9350E037
-:101910003BE065C016B30126502953FDC89556B368
-:10192000012703FB25F92F7306B3B1F050271027C9
-:1019300013FB26F906B22230F0F000C016B30127DF
-:1019400003FB27F90126502906B22430E8F54F772A
-:10195000206816B30000F6CF50274F7D206206B2F4
-:10196000102F000000C006B300265029102713FBDB
-:1019700026F906B2E2CF4F7B06B3206400C0DACF6F
-:1019800001265029187106B269F14E7F2160012F9E
-:1019900016B328C0002650294D7F06B22260102FB2
-:1019A00029C0012650294B7F06B22460012F2DC08B
-:1019B00016B301265029477F2860000006B22EC0CA
-:1019C0004F7E06B3206130C0422706B349930026FC
-:1019D0005029102706B24FEF13FB20F9297F16B3C9
-:1019E00079F2187159F10126502906B2012703FB3B
-:1019F00021F9237F06B371F2002650293150D0F02F
-:101A000006B2102713FB22F9277E16B351F20126E6
-:101A10005029012703FB06B223F92F7C49F200006D
-:101A200006B3102713FB24F90026502906B22F799C
-:101A300039F270CF10E21ABF002717C03B50319522
-:101A4000C31BD04010E21ABF0881033CF9F00B34ED
-:101A5000E9F020917D001981110F1213EDCF0936A5
-:101A600051F10D3211F0013E39F7009384003F919E
-:101A70005F914F911F910F912F91DF910F90CAB7F6
-:101A8000C5FD1DCFCF91CFBFCF9118952091840078
-:101A9000222369F310918200112321F5343022F1C1
-:101AA0003093820020937E0010917F003BE0311B39
-:101AB00030937F0019C00091820001309CF40AE548
-:101AC0003091600034FD11C000936000C2E7D0E0A7
-:101AD00010C0052710E000C021C0052710E0C89500
-:101AE00008BB14C03AE501C032ED032EC0E0D0E0DF
-:101AF00032E017B31861C39A08B317BB58E120E866
-:101B00004FEF20FF052708BB279517951C3F28F7A7
-:101B100000004552B0F720FF0527279508BB179511
-:101B20001C3FB8F629913A9561F7077E1091830022
-:101B3000110F08BBC250D04011F010937D0010E28D
-:101B40001ABF086017B3177E402F477E54E05A959E
-:101B5000F1F708BB17BB48BB8ACF81E080936900CF
-:101B6000F894E0917000F0917100329785E08093D5
-:101B70005700E89507B600FCFDCF789408959C01C6
-:101B8000E0917000F0917100309749F1E430F10577
-:101B9000B1F087E1EC3BF80739F420916C0030910B
-:101BA0006D002E5D3B4F0DC087E1EE3BF80749F419
-:101BB00020916E0030916F002D5D3B4F02C02FEDE4
-:101BC0003BECF89481E0090180935700E8951124DB
-:101BD00078943296F0937100E0937000089581E15B
-:101BE00080935700E895EBCF8FEF9FEFC8DF809190
-:101BF0007000909171008F739070892BA9F7ADCF11
-:101C00001F93CF93DF9388E10FB6F89481BD11BC89
-:101C10000FBEE0E0F0E0859194918F5D9B4C39F42C
-:101C2000E4E0F0E0859194918F5D9B4C09F0DCDF5E
-:101C30001092710010927000AC9A8BB780628BBFCB
-:101C4000BB9A88E893E1ECE9F1E03197F1F701976D
-:101C5000D1F7BB98789410918200135017FDD4C02F
-:101C600080917F00CCE0D0E0C81BD109CA57DF4F7C
-:101C700080917E008D3209F091C0183009F0C2C009
-:101C800083EC809372008AE58093600010926B0071
-:101C90002881822F80769981882329F1109267000C
-:101CA00010926600992341F482E690E090938100BF
-:101CB0008093800024E068C0913051F48C819D8134
-:101CC000909371008093700027FD59C09FEF58C01A
-:101CD00080916800923011F4816001C0846080932B
-:101CE000680020E051C08A8110927B00992331F472
-:101CF00010927C008BE790E022E03CC0953019F414
-:101D00008093830034C0963011F58B81813019F4B3
-:101D100082EE97E104C0823041F484EF97E1909322
-:101D200081008093800022E10EC0833059F48A81C3
-:101D3000882341F48EED97E1909381008093800099
-:101D400024E001C020E080E480936B001DC0983047
-:101D500019F485E890E009C0993019F48093850062
-:101D600006C09A3021F48BE790E021E003C08BE7B6
-:101D700090E020E0909381008093800005C09E81D8
-:101D800080E880936B0007C08F81882319F49E81BF
-:101D9000921708F0922F9093610034C080916B00ED
-:101DA00087FF30C08091700090917100009739F4E6
-:101DB0008881998190936D0080936C000DC0843070
-:101DC000910539F48881998190936F0080936E001A
-:101DD00003C0805C974138F488819981D0DE12502D
-:101DE00011F02296DFCF80917000909171008F7377
-:101DF0009070892B39F4809168008260809368002C
-:101E000010926100109282008091600084FF3CC0BB
-:101E1000809161008F3FC1F1182F893008F018E0E0
-:101E2000811B809361008091720098E889278093DC
-:101E300072001123E1F0E0918000F0918100809127
-:101E40006B0086FF09C0912FA3E7B0E084918D93CA
-:101E500031969150D9F707C0912FA3E7B0E0819157
-:101E60008D939150E1F7F0938100E093800083E738
-:101E700090E0612FFDDC612F6C5F6C3019F08FEF0B
-:101E8000809361006093600094E186B3887131F4BF
-:101E90009150D9F71092830010927D0010E09923A1
-:101EA00009F411E080916A00811739F0112319F4C7
-:101EB000F89456D0789410936A008CE991E00197D9
-:101EC000F1F780916600909167000196909367000A
-:101ED0008093660080916800182F80FF14C0F894EA
-:101EE000E0ECF7E1E054F04083E080935700E895A0
-:101EF00007B600FCFDCF3097A9F710927100109241
-:101F0000700072DE789411FF0FC08AE390E20197AF
-:101F1000F1F780917000909171008F739070892B10
-:101F200011F062DE01C019DE12FD0AC010926800D5
-:101F300080916600909167008055934C08F48BCE99
-:101F400082E291EA0197F1F7F8941BBE15BA10925C
-:101F50005F0210925E0232CCDF91CF911F91089503
-:101F6000FF920F931F93CF93DF9380E8F82E00E04A
-:101F7000C0E0D0E0102F1F0D11BF7EDC29E08433BC
-:101F800092070CF0102FF6942196C830D10511F06D
-:101F9000012FF0CF115011BF1F5F012FEC0110C0B6
-:101FA0006BDC8453994097FF03C0909581959F4FB8
-:101FB0008C179D0714F401B7EC0181B78F5F81BFC7
-:101FC00021B730E0812F90E001968217930744F704
-:101FD00001BFDF91CF911F910F91FF900895F89469
-:021FE000FFCF31
-:061FE2005AFF17BC400885
-:04000003000017C022
-:00000001FF
diff --git a/firmware/releases/micronucleus-1.06-jumper-v2.hex b/firmware/releases/micronucleus-1.06-jumper-v2.hex
deleted file mode 100644
index bda9f5e..0000000
--- a/firmware/releases/micronucleus-1.06-jumper-v2.hex
+++ /dev/null
@@ -1,137 +0,0 @@
-:1017800022C040C06CC03EC03DC03CC03BC03AC05F
-:1017900039C038C037C036C035C034C033C0040388
-:1017A000090412011001FF000008D01653070601BA
-:1017B000000000010902120001010080320904004A
-:1017C00000000000000011241FBECFE5D2E0DEBF04
-:1017D000CDBF00EB0F9307E00F9310E0A0E6B0E061
-:1017E000EEEDFFE102C005900D92A636B107D9F7E4
-:1017F00010E0A6E6B0E001C01D92AC39B107E1F7F8
-:10180000E7D1EBC3BDCFA82FB92F80E090E041E036
-:1018100050EA609530E009C02D9182279795879511
-:1018200010F084279527305EC8F36F5FA8F3089502
-:10183000EADF8D939D930895A6E088279927AA95BE
-:1018400069F00197E1F3B399FCCFB39BFECF81E040
-:101850009927A6B3019611F0A871D9F70895CF93EF
-:10186000CFB7CF93C0915F02C03B21F4C0915E021D
-:10187000C73021F0CF91CFBFCF9181CFCC27C39577
-:10188000B39BE9F7B39B0BC0B39B09C0B39B07C0E5
-:10189000B39B05C0B39B03C0B39B01C0D3C00F92E1
-:1018A000DF93C0917F00DD27CA57DF4F012EB39B26
-:1018B00003C0DF910F90E6CF2F930F931F934F93A9
-:1018C0002FEF4F6F06B303FB20F95F933F9350E078
-:1018D0003BE065C016B30126502953FDC89556B3A9
-:1018E000012703FB25F92F7306B3B1F0502710270A
-:1018F00013FB26F906B22230F0F000C016B3012720
-:1019000003FB27F90126502906B22430E8F54F776A
-:10191000206816B30000F6CF50274F7D206206B234
-:10192000102F000000C006B300265029102713FB1B
-:1019300026F906B2E2CF4F7B06B3206400C0DACFAF
-:1019400001265029187106B269F14E7F2160012FDE
-:1019500016B328C0002650294D7F06B22260102FF2
-:1019600029C0012650294B7F06B22460012F2DC0CB
-:1019700016B301265029477F2860000006B22EC00A
-:101980004F7E06B3206130C0422706B3499300263C
-:101990005029102706B24FEF13FB20F9297F16B309
-:1019A00079F2187159F10126502906B2012703FB7B
-:1019B00021F9237F06B371F2002650293150D0F06F
-:1019C00006B2102713FB22F9277E16B351F2012627
-:1019D0005029012703FB06B223F92F7C49F20000AE
-:1019E00006B3102713FB24F90026502906B22F79DD
-:1019F00039F270CF10E21ABF002717C03B50319563
-:101A0000C31BD04010E21ABF0881033CF9F00B342D
-:101A1000E9F020917D001981110F1213EDCF0936E5
-:101A200051F10D3211F0013E39F7009384003F91DE
-:101A30005F914F911F910F912F91DF910F90CAB736
-:101A4000C5FD1DCFCF91CFBFCF91189520918400B8
-:101A5000222369F310918200112321F5343022F101
-:101A60003093820020937E0010917F003BE0311B79
-:101A700030937F0019C00091820001309CF40AE588
-:101A80003091600034FD11C000936000C2E7D0E0E7
-:101A900010C0052710E000C021C0052710E0C89540
-:101AA00008BB14C03AE501C032ED032EC0E0D0E01F
-:101AB00032E017B31861C39A08B317BB58E120E8A6
-:101AC0004FEF20FF052708BB279517951C3F28F7E8
-:101AD00000004552B0F720FF0527279508BB179552
-:101AE0001C3FB8F629913A9561F7077E1091830063
-:101AF000110F08BBC250D04011F010937D0010E2CE
-:101B00001ABF086017B3177E402F477E54E05A95DE
-:101B1000F1F708BB17BB48BB8ACF81E0809369000F
-:101B2000F894E0917000F0917100329785E0809315
-:101B30005700E89507B600FCFDCF789408959C0106
-:101B4000E0917000F0917100309789F1E430F10577
-:101B5000F1F087E1EC37F80739F420916C0030910F
-:101B60006D002E5B3B4F15C087E1EE37F80739F467
-:101B700020916E0030916F002D5B3B4F0AC087E1D2
-:101B8000EA37F80731F481B7282F30E002C02FEB95
-:101B90003BECF89481E0090180935700E89511240B
-:101BA00078943296F0937100E0937000089581E18B
-:101BB00080935700E895EBCF8FEF9FEFC0DF8091C8
-:101BC0007000909171008F739070892BA9F7A5CF49
-:101BD0001F93CF93DF9388E10FB6F89481BD11BCBA
-:101BE0000FBEE0E0F0E0859194918F5B9B4C39F45F
-:101BF000E4E0F0E0859194918F5B9B4C09F0DCDF91
-:101C00001092710010927000C59A82E291EA0197D9
-:101C1000F1F7B5997DC1AC9A8BB780628BBFBB9A47
-:101C200088E893E1ECE9F1E03197F1F70197D1F71A
-:101C3000BB98789410918200135017FDD4C0809106
-:101C40007F00CCE0D0E0C81BD109CA57DF4F80919C
-:101C50007E008D3209F091C0183009F0C2C083ECCB
-:101C6000809372008AE58093600010926B00288157
-:101C7000822F80769981882329F110926700109233
-:101C80006600992341F482E690E09093810080936E
-:101C9000800024E068C0913051F48C819D81909344
-:101CA00071008093700027FD59C09FEF58C080914C
-:101CB0006800923011F4816001C0846080936800F4
-:101CC00020E051C08A8110927B00992331F4109258
-:101CD0007C008BE790E022E03CC0953019F48093C3
-:101CE000830034C0963011F58B81813019F482EA7B
-:101CF00097E104C0823041F484EB97E19093810036
-:101D00008093800022E10EC0833059F48A818823B9
-:101D100041F48EE997E1909381008093800024E064
-:101D200001C020E080E480936B001DC0983019F45E
-:101D300085E890E009C0993019F48093850006C0C9
-:101D40009A3021F48BE790E021E003C08BE790E02C
-:101D500020E0909381008093800005C09E8180E800
-:101D600080936B0007C08F81882319F49E8192179E
-:101D700008F0922F9093610034C080916B0087FF30
-:101D800030C08091700090917100009739F4888183
-:101D9000998190936D0080936C000DC08430910503
-:101DA00039F48881998190936F0080936E0003C00D
-:101DB0008058974138F488819981C1DE125011F022
-:101DC0002296DFCF80917000909171008F73907098
-:101DD000892B39F4809168008260809368001092AA
-:101DE0006100109282008091600084FF3CC080916D
-:101DF00061008F3FC1F1182F893008F018E0811B76
-:101E0000809361008091720098E889278093720026
-:101E10001123E1F0E0918000F091810080916B004E
-:101E200086FF09C0912FA3E7B0E084918D9331968E
-:101E30009150D9F707C0912FA3E7B0E081918D931E
-:101E40009150E1F7F0938100E093800083E790E008
-:101E5000612FEEDC612F6C5F6C3019F08FEF809397
-:101E600061006093600094E186B3887131F4915011
-:101E7000D9F71092830010927D0010E0992309F4A5
-:101E800011E080916A00811739F0112319F4F89458
-:101E900065D0789410936A008CE991E00197F1F78E
-:101EA00080916600909167000196909367008093FF
-:101EB000660080916800182F80FF14C0F894E0E855
-:101EC000F7E1E054F04083E080935700E89507B6CF
-:101ED00000FCFDCF3097A9F71092710010927000AE
-:101EE0006BDE789411FF0FC08AE390E20197F1F75F
-:101EF00080917000909171008F739070892B11F018
-:101F00005BDE01C00ADE12FD03C01092680092CEB3
-:101F100082E291EA0197F1F718BAF8941BBE15BA5C
-:101F200010925F0210925E02EAE7F7E19491892F26
-:101F300081508E3F20F00DC081B7815081BF81B7A5
-:101F40009817D0F303C081B78F5F81BF81B789171E
-:101F5000D0F314CCDF91CF911F910895FF920F938E
-:101F60001F93CF93DF9380E8F82E00E0C0E0D0E02D
-:101F7000102F1F0D11BF60DC29E0843392070CF095
-:101F8000102FF6942196C830D10511F0012FF0CF13
-:101F9000115011BF1F5F012FEC0110C04DDC8453A5
-:101FA000994097FF03C0909581959F4F8C179D078F
-:101FB00014F401B7EC0181B78F5F81BF21B730E026
-:101FC000812F90E001968217930744F701BFDF91BC
-:0E1FD000CF911F910F91FF900895F894FFCFCD
-:061FDE005AFF177C4008C9
-:040000030000178062
-:00000001FF
diff --git a/firmware/releases/micronucleus-1.06.hex b/firmware/releases/micronucleus-1.06.hex
deleted file mode 100644
index 301751f..0000000
--- a/firmware/releases/micronucleus-1.06.hex
+++ /dev/null
@@ -1,137 +0,0 @@
-:1017800022C040C06CC03EC03DC03CC03BC03AC05F
-:1017900039C038C037C036C035C034C033C0040388
-:1017A000090412011001FF000008D01653070601BA
-:1017B000000000010902120001010080320904004A
-:1017C00000000000000011241FBECFE5D2E0DEBF04
-:1017D000CDBF00EB0F9307E00F9310E0A0E6B0E061
-:1017E000ECEDFFE102C005900D92A636B107D9F7E6
-:1017F00010E0A6E6B0E001C01D92AC39B107E1F7F8
-:10180000E7D1EAC3BDCFA82FB92F80E090E041E037
-:1018100050EA609530E009C02D9182279795879511
-:1018200010F084279527305EC8F36F5FA8F3089502
-:10183000EADF8D939D930895A6E088279927AA95BE
-:1018400069F00197E1F3B399FCCFB39BFECF81E040
-:101850009927A6B3019611F0A871D9F70895CF93EF
-:10186000CFB7CF93C0915F02C03B21F4C0915E021D
-:10187000C73021F0CF91CFBFCF9181CFCC27C39577
-:10188000B39BE9F7B39B0BC0B39B09C0B39B07C0E5
-:10189000B39B05C0B39B03C0B39B01C0D3C00F92E1
-:1018A000DF93C0917F00DD27CA57DF4F012EB39B26
-:1018B00003C0DF910F90E6CF2F930F931F934F93A9
-:1018C0002FEF4F6F06B303FB20F95F933F9350E078
-:1018D0003BE065C016B30126502953FDC89556B3A9
-:1018E000012703FB25F92F7306B3B1F0502710270A
-:1018F00013FB26F906B22230F0F000C016B3012720
-:1019000003FB27F90126502906B22430E8F54F776A
-:10191000206816B30000F6CF50274F7D206206B234
-:10192000102F000000C006B300265029102713FB1B
-:1019300026F906B2E2CF4F7B06B3206400C0DACFAF
-:1019400001265029187106B269F14E7F2160012FDE
-:1019500016B328C0002650294D7F06B22260102FF2
-:1019600029C0012650294B7F06B22460012F2DC0CB
-:1019700016B301265029477F2860000006B22EC00A
-:101980004F7E06B3206130C0422706B3499300263C
-:101990005029102706B24FEF13FB20F9297F16B309
-:1019A00079F2187159F10126502906B2012703FB7B
-:1019B00021F9237F06B371F2002650293150D0F06F
-:1019C00006B2102713FB22F9277E16B351F2012627
-:1019D0005029012703FB06B223F92F7C49F20000AE
-:1019E00006B3102713FB24F90026502906B22F79DD
-:1019F00039F270CF10E21ABF002717C03B50319563
-:101A0000C31BD04010E21ABF0881033CF9F00B342D
-:101A1000E9F020917D001981110F1213EDCF0936E5
-:101A200051F10D3211F0013E39F7009384003F91DE
-:101A30005F914F911F910F912F91DF910F90CAB736
-:101A4000C5FD1DCFCF91CFBFCF91189520918400B8
-:101A5000222369F310918200112321F5343022F101
-:101A60003093820020937E0010917F003BE0311B79
-:101A700030937F0019C00091820001309CF40AE588
-:101A80003091600034FD11C000936000C2E7D0E0E7
-:101A900010C0052710E000C021C0052710E0C89540
-:101AA00008BB14C03AE501C032ED032EC0E0D0E01F
-:101AB00032E017B31861C39A08B317BB58E120E8A6
-:101AC0004FEF20FF052708BB279517951C3F28F7E8
-:101AD00000004552B0F720FF0527279508BB179552
-:101AE0001C3FB8F629913A9561F7077E1091830063
-:101AF000110F08BBC250D04011F010937D0010E2CE
-:101B00001ABF086017B3177E402F477E54E05A95DE
-:101B1000F1F708BB17BB48BB8ACF81E0809369000F
-:101B2000F894E0917000F0917100329785E0809315
-:101B30005700E89507B600FCFDCF789408959C0106
-:101B4000E0917000F0917100309789F1E430F10577
-:101B5000F1F087E1EC37F80739F420916C0030910F
-:101B60006D002E5B3B4F15C087E1EE37F80739F467
-:101B700020916E0030916F002D5B3B4F0AC087E1D2
-:101B8000EA37F80731F481B7282F30E002C02FEB95
-:101B90003BECF89481E0090180935700E89511240B
-:101BA00078943296F0937100E0937000089581E18B
-:101BB00080935700E895EBCF8FEF9FEFC0DF8091C8
-:101BC0007000909171008F739070892BA9F7A5CF49
-:101BD0001F93CF93DF9388E10FB6F89481BD11BCBA
-:101BE0000FBEE0E0F0E0859194918F5B9B4C39F45F
-:101BF000E4E0F0E0859194918F5B9B4C09F0DCDF91
-:101C00001092710010927000AC9A8BB780628BBFFB
-:101C1000BB9A88E893E1ECE9F1E03197F1F701979D
-:101C2000D1F7BB98789410918200135017FDD4C05F
-:101C300080917F00CCE0D0E0C81BD109CA57DF4FAC
-:101C400080917E008D3209F091C0183009F0C2C039
-:101C500083EC809372008AE58093600010926B00A1
-:101C60002881822F80769981882329F1109267003C
-:101C700010926600992341F482E690E090938100EF
-:101C80008093800024E068C0913051F48C819D8164
-:101C9000909371008093700027FD59C09FEF58C04A
-:101CA00080916800923011F4816001C0846080935B
-:101CB000680020E051C08A8110927B00992331F4A2
-:101CC00010927C008BE790E022E03CC0953019F444
-:101CD0008093830034C0963011F58B81813019F4E4
-:101CE00082EA97E104C0823041F484EB97E190935B
-:101CF00081008093800022E10EC0833059F48A81F4
-:101D0000882341F48EE997E19093810080938000CD
-:101D100024E001C020E080E480936B001DC0983077
-:101D200019F485E890E009C0993019F48093850092
-:101D300006C09A3021F48BE790E021E003C08BE7E6
-:101D400090E020E0909381008093800005C09E8108
-:101D500080E880936B0007C08F81882319F49E81EF
-:101D6000921708F0922F9093610034C080916B001D
-:101D700087FF30C08091700090917100009739F416
-:101D80008881998190936D0080936C000DC08430A0
-:101D9000910539F48881998190936F0080936E004A
-:101DA00003C08058974138F488819981C8DE125069
-:101DB00011F02296DFCF80917000909171008F73A7
-:101DC0009070892B39F4809168008260809368005C
-:101DD00010926100109282008091600084FF3CC0EC
-:101DE000809161008F3FC1F1182F893008F018E011
-:101DF000811B809361008091720098E8892780930D
-:101E000072001123E1F0E0918000F0918100809157
-:101E10006B0086FF09C0912FA3E7B0E084918D93FA
-:101E200031969150D9F707C0912FA3E7B0E0819187
-:101E30008D939150E1F7F0938100E093800083E768
-:101E400090E0612FF5DC612F6C5F6C3019F08FEF43
-:101E5000809361006093600094E186B3887131F4EF
-:101E60009150D9F71092830010927D0010E09923D1
-:101E700009F411E080916A00811739F0112319F4F7
-:101E8000F8946BD0789410936A008CE991E00197F4
-:101E9000F1F780916600909167000196909367003A
-:101EA0008093660080916800182F80FF14C0F8941A
-:101EB000E0E8F7E1E054F04083E080935700E895D4
-:101EC00007B600FCFDCF3097A9F710927100109271
-:101ED000700072DE789411FF0FC08AE390E20197E0
-:101EE000F1F780917000909171008F739070892B41
-:101EF00011F062DE01C011DE12FD0AC0109268000E
-:101F000080916600909167008055934C08F48BCEC9
-:101F100082E291EA0197F1F7F8941BBE15BA10928C
-:101F20005F0210925E02EAE7F7E19491892F8150F7
-:101F30008E3F20F00DC081B7815081BF81B79817C7
-:101F4000D0F303C081B78F5F81BF81B78917D0F30A
-:101F500015CCDF91CF911F910895FF920F931F939E
-:101F6000CF93DF9380E8F82E00E0C0E0D0E0102FA0
-:101F70001F0D11BF61DC29E0843392070CF0102F94
-:101F8000F6942196C830D10511F0012FF0CF1150F1
-:101F900011BF1F5F012FEC0110C04EDC845399402C
-:101FA00097FF03C0909581959F4F8C179D0714F460
-:101FB00001B7EC0181B78F5F81BF21B730E0812F7E
-:101FC00090E001968217930744F701BFDF91CF910C
-:0C1FD0001F910F91FF900895F894FFCF2F
-:061FDC005AFF177C4008CB
-:040000030000178062
-:00000001FF
diff --git a/firmware/releases/micronucleus-1.10-ledpb1.hex b/firmware/releases/micronucleus-1.10-ledpb1.hex
deleted file mode 100644
index 074a0d6..0000000
--- a/firmware/releases/micronucleus-1.10-ledpb1.hex
+++ /dev/null
@@ -1,122 +0,0 @@
-:0800000057CC56CC8CCC54CC3B
-:1018800017C016C04CC014C009021200010100802C
-:101890003209040000000000000012011001FF00E6
-:1018A0000008D01653070A010000000104030904D0
-:1018B00011241FBECFE5D2E0CDBFDEBF00EB0F93FA
-:1018C00007E00F9310E0A0E6B0E0EAEDFFE102C010
-:1018D00005900D92A636B107D9F720E0A6E6B0E054
-:1018E00001C01D92AB39B207E1F7ECC1A82FB92FA7
-:1018F00080E090E041E050EA609530E009C02D9131
-:1019000082279795879510F084279527305EC8F336
-:101910006F5FA8F30895EADF8D939D930895CF93A9
-:10192000CFB7CF93C0915F02C03B21F4C0915E025C
-:10193000C73021F0CF91CFBFCF91A1CFCC27C39596
-:10194000B39BE9F7B39B0BC0B39B09C0B39B07C024
-:10195000B39B05C0B39B03C0B39B01C0D3C00F9220
-:10196000DF93C0917E00DD27CB57DF4F012EB39B65
-:1019700003C0DF910F90E6CF2F930F931F934F93E8
-:101980002FEF4F6F06B303FB20F95F933F9350E0B7
-:101990003BE065C016B30126502953FDC89556B3E8
-:1019A000012703FB25F92F7306B3B1F05027102749
-:1019B00013FB26F906B22230F0F000C016B301275F
-:1019C00003FB27F90126502906B22430E8F54F77AA
-:1019D000206816B30000F6CF50274F7D206206B274
-:1019E000102F000000C006B300265029102713FB5B
-:1019F00026F906B2E2CF4F7B06B3206400C0DACFEF
-:101A000001265029187106B269F14E7F2160012F1D
-:101A100016B328C0002650294D7F06B22260102F31
-:101A200029C0012650294B7F06B22460012F2DC00A
-:101A300016B301265029477F2860000006B22EC049
-:101A40004F7E06B3206130C0422706B3499300267B
-:101A50005029102706B24FEF13FB20F9297F16B348
-:101A600079F2187159F10126502906B2012703FBBA
-:101A700021F9237F06B371F2002650293150D0F0AE
-:101A800006B2102713FB22F9277E16B351F2012666
-:101A90005029012703FB06B223F92F7C49F20000ED
-:101AA00006B3102713FB24F90026502906B22F791C
-:101AB00039F270CF10E21ABF002717C03B503195A2
-:101AC000C31BD04010E21ABF0881033CF9F00B346D
-:101AD000E9F020917C001981110F1213EDCF093626
-:101AE00051F10D3211F0013E39F7009383003F911F
-:101AF0005F914F911F910F912F91DF910F90CAB776
-:101B0000C5FD1DCFCF91CFBFCF91189520918300F8
-:101B1000222369F310918100112321F5343022F141
-:101B20003093810020937D0010917E003BE0311BBB
-:101B300030937E0019C00091810001309CF40AE5C9
-:101B40003091600034FD11C000936000C1E7D0E027
-:101B500010C0052710E000C021C0052710E0C8957F
-:101B600008BB14C03AE501C032ED032EC0E0D0E05E
-:101B700032E017B31861C39A08B317BB58E120E8E5
-:101B80004FEF20FF052708BB279517951C3F28F727
-:101B900000004552B0F720FF0527279508BB179591
-:101BA0001C3FB8F629913A9561F7077E10918200A3
-:101BB000110F08BBC250D04011F010937C0010E20E
-:101BC0001ABF086017B3177E402F477E54E05A951E
-:101BD000F1F708BB17BB48BB8ACFF8942FEFB0E8EA
-:101BE000A0E44AE0B1BF000081EE9CE0B399FECFD3
-:101BF000B39BFECF0197B399FDCF97FF03C0BA1BEC
-:101C0000819501C0BA0FA69529F4281710F031B7B5
-:101C1000282FA1E0415031F731BF0000789408959A
-:101C2000F894E0916A00F0916B00329785E0809320
-:101C30005700E89578940895E0916A00F0916B0060
-:101C4000309729F490936D0080936C0007C0E430C6
-:101C5000F10539F490936F0080936E008FE39CEC54
-:101C60001CC0EC3728E1F20739F480916C009091A8
-:101C70006D008E539C4F11C0EE3728E1F20739F406
-:101C800080916E0090916F008D539C4F06C0EA3793
-:101C900028E1F20711F481B790E02FB7F89430975C
-:101CA00021F431E130935700E89531E00C01309395
-:101CB0005700E89511243296F0936B00E0936A0088
-:101CC0002FBF089514BE88E10FB6F89481BD11BCF2
-:101CD0000FBEC198BB9A88E893E1ECE9F1E0319737
-:101CE000F1F70197D1F7BB98AC9A8BB780628BBFA5
-:101CF000789400918100035007FDBAC080917E0066
-:101D0000CCE0D0E0C81BD109CB57DF4F80917D00DC
-:101D10008D3209F08EC0083009F0A8C083EC8093A2
-:101D200071008AE580936000109269002881922FEB
-:101D300090768981992319F110926700811108C06A
-:101D400082E690E09093800080937F0014E067C06B
-:101D5000813051F48C819D8190936B0080936A0057
-:101D600027FD58C01FEF57C090916800823011F4D2
-:101D7000916001C094609093680010E050C09A8117
-:101D800010927A00811106C010927B008AE790E0E1
-:101D900012E03BC0853019F4909382002CC086304D
-:101DA00009F58B81813019F48AE998E104C0823009
-:101DB00041F488E898E19093800080937F0012E1DD
-:101DC0000DC0833051F4911108C08CEA98E19093D2
-:101DD000800080937F0014E001C010E080E48093D5
-:101DE00069001DC0883059F0893019F4909384003F
-:101DF00002C08A3039F08AE790E010E006C084E83B
-:101E000090E002C08AE790E011E090938000809318
-:101E10007F0005C01E8180E88093690007C08F8124
-:101E2000811104C08E81811708F4182F109361006E
-:101E30001DC08091690087FF19C080916A00909150
-:101E40006B008038984128F080916A008F7339F0D8
-:101E50000DC089919991F0DE025079F7F5CF80910C
-:101E60006800826080936800109261001092810087
-:101E70008091600084FF43C0809161008F3F09F42E
-:101E80003EC0082F893008F008E0801B8093610075
-:101E90008091710098E8892780937100002319F1DF
-:101EA000E0917F00F09180008091690086FF0BC077
-:101EB000A2E7B0E084918D93319682E790E0800FA5
-:101EC0008A13F8CF0CC0CF01A2E7B0E0FC0121914A
-:101ED000CF012D9322E730E0200F2A13F7CFF093A4
-:101EE0008000E0937F00602F82E790E014DD0C5FBC
-:101EF0000C3019F08FEF809361000093600084E153
-:101F000096B3987131F48150D9F7109282001092F3
-:101F10007C0001E0811100E080917000801739F0B1
-:101F2000011103C01092670058DE009370008CE925
-:101F300091E00197F1F70091680000FF17C0F89455
-:101F4000E0E8F8E1E054F10983E080935700E89578
-:101F50003097C1F710926B0010926A0088E0F82E5B
-:101F60008FEF9FEF69DEFA94D9F75ADE01FF05C0C3
-:101F70008AE390E20197F1F753DE02FF13C0B998AC
-:101F800082E291EA0197F1F7F894BB9A1BBE15BA69
-:101F900010925F02EAE7F8E1E4918E2F81508E3FC4
-:101FA000C0F019C010926800809167008D7011F028
-:101FB000B99801C0B99A8091660090916700019626
-:101FC000909367008093660080369A4E08F491CE15
-:0A1FD000D6CFE1BF000052CC22CFB3
-:061FDA005AFF187A4008CE
-:040000030000188061
-:00000001FF
diff --git a/firmware/releases/micronucleus-1.10.hex b/firmware/releases/micronucleus-1.10.hex
deleted file mode 100644
index 8b66f21..0000000
--- a/firmware/releases/micronucleus-1.10.hex
+++ /dev/null
@@ -1,121 +0,0 @@
-:0800000057CC56CC8CCC54CC3B
-:1018800017C016C04CC014C009021200010100802C
-:101890003209040000000000000012011001FF00E6
-:1018A0000008D01653070A010000000104030904D0
-:1018B00011241FBECFE5D2E0CDBFDEBF00EB0F93FA
-:1018C00007E00F9310E0A0E6B0E0E8ECFFE102C013
-:1018D00005900D92A636B107D9F720E0A6E6B0E054
-:1018E00001C01D92AB39B207E1F7ECC1A82FB92FA7
-:1018F00080E090E041E050EA609530E009C02D9131
-:1019000082279795879510F084279527305EC8F336
-:101910006F5FA8F30895EADF8D939D930895CF93A9
-:10192000CFB7CF93C0915F02C03B21F4C0915E025C
-:10193000C73021F0CF91CFBFCF91A1CFCC27C39596
-:10194000B39BE9F7B39B0BC0B39B09C0B39B07C024
-:10195000B39B05C0B39B03C0B39B01C0D3C00F9220
-:10196000DF93C0917E00DD27CB57DF4F012EB39B65
-:1019700003C0DF910F90E6CF2F930F931F934F93E8
-:101980002FEF4F6F06B303FB20F95F933F9350E0B7
-:101990003BE065C016B30126502953FDC89556B3E8
-:1019A000012703FB25F92F7306B3B1F05027102749
-:1019B00013FB26F906B22230F0F000C016B301275F
-:1019C00003FB27F90126502906B22430E8F54F77AA
-:1019D000206816B30000F6CF50274F7D206206B274
-:1019E000102F000000C006B300265029102713FB5B
-:1019F00026F906B2E2CF4F7B06B3206400C0DACFEF
-:101A000001265029187106B269F14E7F2160012F1D
-:101A100016B328C0002650294D7F06B22260102F31
-:101A200029C0012650294B7F06B22460012F2DC00A
-:101A300016B301265029477F2860000006B22EC049
-:101A40004F7E06B3206130C0422706B3499300267B
-:101A50005029102706B24FEF13FB20F9297F16B348
-:101A600079F2187159F10126502906B2012703FBBA
-:101A700021F9237F06B371F2002650293150D0F0AE
-:101A800006B2102713FB22F9277E16B351F2012666
-:101A90005029012703FB06B223F92F7C49F20000ED
-:101AA00006B3102713FB24F90026502906B22F791C
-:101AB00039F270CF10E21ABF002717C03B503195A2
-:101AC000C31BD04010E21ABF0881033CF9F00B346D
-:101AD000E9F020917C001981110F1213EDCF093626
-:101AE00051F10D3211F0013E39F7009383003F911F
-:101AF0005F914F911F910F912F91DF910F90CAB776
-:101B0000C5FD1DCFCF91CFBFCF91189520918300F8
-:101B1000222369F310918100112321F5343022F141
-:101B20003093810020937D0010917E003BE0311BBB
-:101B300030937E0019C00091810001309CF40AE5C9
-:101B40003091600034FD11C000936000C1E7D0E027
-:101B500010C0052710E000C021C0052710E0C8957F
-:101B600008BB14C03AE501C032ED032EC0E0D0E05E
-:101B700032E017B31861C39A08B317BB58E120E8E5
-:101B80004FEF20FF052708BB279517951C3F28F727
-:101B900000004552B0F720FF0527279508BB179591
-:101BA0001C3FB8F629913A9561F7077E10918200A3
-:101BB000110F08BBC250D04011F010937C0010E20E
-:101BC0001ABF086017B3177E402F477E54E05A951E
-:101BD000F1F708BB17BB48BB8ACFF8942FEFB0E8EA
-:101BE000A0E44AE0B1BF000081EE9CE0B399FECFD3
-:101BF000B39BFECF0197B399FDCF97FF03C0BA1BEC
-:101C0000819501C0BA0FA69529F4281710F031B7B5
-:101C1000282FA1E0415031F731BF0000789408959A
-:101C2000F894E0916A00F0916B00329785E0809320
-:101C30005700E89578940895E0916A00F0916B0060
-:101C4000309729F490936D0080936C0007C0E430C6
-:101C5000F10539F490936F0080936E008FE39CEC54
-:101C60001CC0EC3728E1F20739F480916C009091A8
-:101C70006D008E539C4F11C0EE3728E1F20739F406
-:101C800080916E0090916F008D539C4F06C0EA3793
-:101C900028E1F20711F481B790E02FB7F89430975C
-:101CA00021F431E130935700E89531E00C01309395
-:101CB0005700E89511243296F0936B00E0936A0088
-:101CC0002FBF089514BE88E10FB6F89481BD11BCF2
-:101CD0000FBEBB9A88E893E1ECE9F1E03197F1F7A8
-:101CE0000197D1F7BB98AC9A8BB780628BBF789481
-:101CF00000918100035007FDBAC080917E00CCE0C6
-:101D0000D0E0C81BD109CB57DF4F80917D008D32C9
-:101D100009F08EC0083009F0A8C083EC80937100F0
-:101D20008AE580936000109269002881922F907656
-:101D30008981992319F110926700811108C082E608
-:101D400090E09093800080937F0014E067C0813022
-:101D500051F48C819D8190936B0080936A0027FDE4
-:101D600058C01FEF57C090916800823011F4916005
-:101D700001C094609093680010E050C09A81109266
-:101D80007A00811106C010927B008AE790E012E091
-:101D90003BC0853019F4909382002CC0863009F541
-:101DA0008B81813019F48AE998E104C0823041F4D2
-:101DB00088E898E19093800080937F0012E10DC045
-:101DC000833051F4911108C08CEA98E1909380001F
-:101DD00080937F0014E001C010E080E480936900EC
-:101DE0001DC0883059F0893019F49093840002C0E6
-:101DF0008A3039F08AE790E010E006C084E890E08D
-:101E000002C08AE790E011E09093800080937F0009
-:101E100005C01E8180E88093690007C08F81811111
-:101E200004C08E81811708F4182F109361001DC023
-:101E30008091690087FF19C080916A0090916B00C2
-:101E40008038984128F080916A008F7339F00DC076
-:101E500089919991F1DE025079F7F5CF8091680070
-:101E600082608093680010926100109281008091DE
-:101E7000600084FF43C0809161008F3F09F43EC041
-:101E8000082F893008F008E0801B80936100809162
-:101E9000710098E8892780937100002319F1E0917F
-:101EA0007F00F09180008091690086FF0BC0A2E75F
-:101EB000B0E084918D93319682E790E0800F8A1391
-:101EC000F8CF0CC0CF01A2E7B0E0FC012191CF0117
-:101ED0002D9322E730E0200F2A13F7CFF0938000F4
-:101EE000E0937F00602F82E790E015DD0C5F0C30FF
-:101EF00019F08FEF809361000093600084E196B346
-:101F0000987131F48150D9F71092820010927C00C0
-:101F100001E0811100E080917000801739F001111B
-:101F200003C01092670059DE009370008CE991E0C5
-:101F30000197F1F70091680000FF17C0F894E0E8FE
-:101F4000F8E1E054F10983E080935700E895309779
-:101F5000C1F710926B0010926A0088E0F82E8FEFA4
-:101F60009FEF6ADEFA94D9F75BDE01FF05C08AE3D2
-:101F700090E20197F1F754DE02FF12C082E291EA8B
-:101F80000197F1F7F894BB9A1BBE15BA10925F0245
-:101F9000EAE7F8E1E4918E2F81508E3F88F012C07D
-:101FA000109268008091660090916700019690936E
-:101FB00067008093660080369A4E08F499CEDECF93
-:081FC000E1BF00005BCC2ACF59
-:061FC8005AFF187A4008E0
-:040000030000188061
-:00000001FF
diff --git a/firmware/releases/micronucleus-1.11-entry_ext_reset.hex b/firmware/releases/micronucleus-1.11-entry_ext_reset.hex
deleted file mode 100644
index 7389281..0000000
--- a/firmware/releases/micronucleus-1.11-entry_ext_reset.hex
+++ /dev/null
@@ -1,119 +0,0 @@
-:0800000077CC76CCACCC74CCBB
-:1018C00017C016C04CC014C00902120001010080EC
-:1018D0003209040000000000000012011001FF00A6
-:1018E0000008D01653070B0100000001040309048F
-:1018F00011241FBECFE5D2E0CDBFDEBF00EB0F93BA
-:1019000007E00F9310E0A0E6B0E0E8EEFFE102C0D0
-:1019100005900D92A636B107D9F720E0A6E6B0E013
-:1019200001C01D92A639B207E1F7E2C1A82FB92F75
-:1019300080E090E041E050EA609530E009C02D91F0
-:1019400082279795879510F084279527305EC8F3F6
-:101950006F5FA8F30895EADF8D939D930895CF9369
-:10196000CFB7CF93C0915F02C03B21F4C0915E021C
-:10197000C73021F0CF91CFBFCF91A1CFCC27C39556
-:10198000B39BE9F7B39B0BC0B39B09C0B39B07C0E4
-:10199000B39B05C0B39B03C0B39B01C0D3C00F92E0
-:1019A000DF93C0917900DD27C058DF4F012EB39B34
-:1019B00003C0DF910F90E6CF2F930F931F934F93A8
-:1019C0002FEF4F6F06B303FB20F95F933F9350E077
-:1019D0003BE065C016B30126502953FDC89556B3A8
-:1019E000012703FB25F92F7306B3B1F05027102709
-:1019F00013FB26F906B22230F0F000C016B301271F
-:101A000003FB27F90126502906B22430E8F54F7769
-:101A1000206816B30000F6CF50274F7D206206B233
-:101A2000102F000000C006B300265029102713FB1A
-:101A300026F906B2E2CF4F7B06B3206400C0DACFAE
-:101A400001265029187106B269F14E7F2160012FDD
-:101A500016B328C0002650294D7F06B22260102FF1
-:101A600029C0012650294B7F06B22460012F2DC0CA
-:101A700016B301265029477F2860000006B22EC009
-:101A80004F7E06B3206130C0422706B3499300263B
-:101A90005029102706B24FEF13FB20F9297F16B308
-:101AA00079F2187159F10126502906B2012703FB7A
-:101AB00021F9237F06B371F2002650293150D0F06E
-:101AC00006B2102713FB22F9277E16B351F2012626
-:101AD0005029012703FB06B223F92F7C49F20000AD
-:101AE00006B3102713FB24F90026502906B22F79DC
-:101AF00039F270CF10E21ABF002717C03B50319562
-:101B0000C31BD04010E21ABF0881033CF9F00B342C
-:101B1000E9F0209177001981110F1213EDCF0936EA
-:101B200051F10D3211F0013E39F700937E003F91E3
-:101B30005F914F911F910F912F91DF910F90CAB735
-:101B4000C5FD1DCFCF91CFBFCF91189520917E00BD
-:101B5000222369F310917C00112321F5343022F106
-:101B600030937C0020937800109179003BE0311B8A
-:101B70003093790019C000917C0001309CF40AE593
-:101B80003091600034FD11C000936000CCE6D0E0DD
-:101B900010C0052710E000C021C0052710E0C8953F
-:101BA00008BB14C03AE501C032ED032EC0E0D0E01E
-:101BB00032E017B31861C39A08B317BB58E120E8A5
-:101BC0004FEF20FF052708BB279517951C3F28F7E7
-:101BD00000004552B0F720FF0527279508BB179551
-:101BE0001C3FB8F629913A9561F7077E10917D0068
-:101BF000110F08BBC250D04011F01093770010E2D3
-:101C00001ABF086017B3177E402F477E54E05A95DD
-:101C1000F1F708BB17BB48BB8ACFF8942FEFB0E8A9
-:101C2000A0E44AE0B1BF000081EE9CE0B399FECF92
-:101C3000B39BFECF0197B399FDCF97FF03C0BA1BAB
-:101C4000819501C0BA0FA69529F4281710F031B775
-:101C5000282FA1E0415031F731BF0000789408955A
-:101C6000F894F201329785E080935700E8957894D4
-:101C70000895F201309729F49093680080936700EB
-:101C800007C0E430F10539F490936A00809369004D
-:101C90008FE59CEC1FC02CEB421628E1520639F46C
-:101CA00080916700909168008E559C4F13C02EEB79
-:101CB000421628E1520639F48091690090916A0039
-:101CC0008D559C4F07C02AEB421628E1520611F4AD
-:101CD00081B790E02FB7F89431E00C0130935700B2
-:101CE000E89511242F0182E0480E511C2FBF089562
-:101CF00004B601FC14C0EDEBF8E1E491EF3F79F09C
-:101D0000F894BB9A1BBE15BA10925F02EAEBF8E199
-:101D1000E4918E2F81508E3F08F462C163C114BEDE
-:101D200088E181BD87E081BDBB9A88E893E1ECE959
-:101D3000F1E03197F1F70197D1F7BB98AC9A8BB7E7
-:101D400080628BBF7894712C8CE991E00197F1F758
-:101D5000A895312C60917C00162F135017FDB2C04E
-:101D600080917900CCE0D0E0C81BD109C058DF4F8A
-:101D70006150CE01DBDD8E3F9F4409F0A1C0809110
-:101D800078008D3209F085C0183009F099C083ECD5
-:101D900080936C008AE580936000109266009881C1
-:101DA000292F207689812223D1F0712C811108C03E
-:101DB00082E690E090937B0080937A0024E05FC0FD
-:101DC000813051F481E180935700E8954C805D802B
-:101DD00097FD50C02FEF4FC0382E20E050C09A81A1
-:101DE00010927500811106C01092760085E790E090
-:101DF00022E03BC0853019F490937D002CC08630E2
-:101E000009F58B81813019F48AED98E104C08230A4
-:101E100041F488EC98E190937B0080937A0022E172
-:101E20000DC0833051F4911108C08CEE98E190936D
-:101E30007B0080937A0024E001C020E080E480935E
-:101E400066001DC0883059F0893019F490937F00E6
-:101E500002C08A3039F085E790E020E006C08FE7C5
-:101E600090E002C085E790E021E090937B008093B2
-:101E70007A0005C02E8180E88093660007C08F81BC
-:101E8000811104C08E81821708F4282F20936100ED
-:101E900017C08091660087FF13C080EC481688E168
-:101EA000580620F0842D8F7339F00AC089919991DA
-:101EB000E0DE125091F7F6CF95E0392E10926100D6
-:101EC00010927C008091600084FF42C0809161008C
-:101ED0008F3F09F43DC0182F893008F018E0811BAE
-:101EE0008093610080916C0098E8892780936C0052
-:101EF000112311F1E0917A00F0917B00809166004E
-:101F000086FF0BC0ADE6B0E084918D9331968DE6EF
-:101F100090E0810F8A13F8CF0BC0EF01ADE6B0E07F
-:101F200089918D93FE018DE690E0810F8A13F8CFA1
-:101F3000F0937B00E0937A00612F8DE690E00BDD5B
-:101F40001C5F1C3019F08FEF8093610010936000CC
-:101F500084E196B3987131F48150D9F710927D00E5
-:101F600010927700C1E08111C0E080916B008C1766
-:101F700029F0C11101C051DEC0936B00C30101966D
-:101F80003C018035934C11F484E0382E232D33200E
-:101F9000E9F08AE390E20197F1F72230A9F4F8948E
-:101FA000E0ECF8E1E054F10983E080935700E89514
-:101FB0003097C1F7412C512CC8E08FEF9FEF59DECD
-:101FC000C150D9F74DDE02C02530E1F384E038126C
-:101FD000BBCEEDEBF8E1E491EF3F09F4B5CE90CE46
-:081FE000E1BF00006BCCFFCF54
-:061FE8005AFF18BA400880
-:04000003000018C021
-:00000001FF
diff --git a/firmware/releases/micronucleus-1.11-entry_jumper_pb0.hex b/firmware/releases/micronucleus-1.11-entry_jumper_pb0.hex
deleted file mode 100644
index 96a101c..0000000
--- a/firmware/releases/micronucleus-1.11-entry_jumper_pb0.hex
+++ /dev/null
@@ -1,120 +0,0 @@
-:0800000077CC76CCACCC74CCBB
-:1018C00017C016C04CC014C00902120001010080EC
-:1018D0003209040000000000000012011001FF00A6
-:1018E0000008D01653070B0100000001040309048F
-:1018F00011241FBECFE5D2E0CDBFDEBF00EB0F93BA
-:1019000007E00F9310E0A0E6B0E0E4EFFFE102C0D3
-:1019100005900D92A636B107D9F720E0A6E6B0E013
-:1019200001C01D92A639B207E1F7E2C1A82FB92F75
-:1019300080E090E041E050EA609530E009C02D91F0
-:1019400082279795879510F084279527305EC8F3F6
-:101950006F5FA8F30895EADF8D939D930895CF9369
-:10196000CFB7CF93C0915F02C03B21F4C0915E021C
-:10197000C73021F0CF91CFBFCF91A1CFCC27C39556
-:10198000B39BE9F7B39B0BC0B39B09C0B39B07C0E4
-:10199000B39B05C0B39B03C0B39B01C0D3C00F92E0
-:1019A000DF93C0917900DD27C058DF4F012EB39B34
-:1019B00003C0DF910F90E6CF2F930F931F934F93A8
-:1019C0002FEF4F6F06B303FB20F95F933F9350E077
-:1019D0003BE065C016B30126502953FDC89556B3A8
-:1019E000012703FB25F92F7306B3B1F05027102709
-:1019F00013FB26F906B22230F0F000C016B301271F
-:101A000003FB27F90126502906B22430E8F54F7769
-:101A1000206816B30000F6CF50274F7D206206B233
-:101A2000102F000000C006B300265029102713FB1A
-:101A300026F906B2E2CF4F7B06B3206400C0DACFAE
-:101A400001265029187106B269F14E7F2160012FDD
-:101A500016B328C0002650294D7F06B22260102FF1
-:101A600029C0012650294B7F06B22460012F2DC0CA
-:101A700016B301265029477F2860000006B22EC009
-:101A80004F7E06B3206130C0422706B3499300263B
-:101A90005029102706B24FEF13FB20F9297F16B308
-:101AA00079F2187159F10126502906B2012703FB7A
-:101AB00021F9237F06B371F2002650293150D0F06E
-:101AC00006B2102713FB22F9277E16B351F2012626
-:101AD0005029012703FB06B223F92F7C49F20000AD
-:101AE00006B3102713FB24F90026502906B22F79DC
-:101AF00039F270CF10E21ABF002717C03B50319562
-:101B0000C31BD04010E21ABF0881033CF9F00B342C
-:101B1000E9F0209177001981110F1213EDCF0936EA
-:101B200051F10D3211F0013E39F700937E003F91E3
-:101B30005F914F911F910F912F91DF910F90CAB735
-:101B4000C5FD1DCFCF91CFBFCF91189520917E00BD
-:101B5000222369F310917C00112321F5343022F106
-:101B600030937C0020937800109179003BE0311B8A
-:101B70003093790019C000917C0001309CF40AE593
-:101B80003091600034FD11C000936000CCE6D0E0DD
-:101B900010C0052710E000C021C0052710E0C8953F
-:101BA00008BB14C03AE501C032ED032EC0E0D0E01E
-:101BB00032E017B31861C39A08B317BB58E120E8A5
-:101BC0004FEF20FF052708BB279517951C3F28F7E7
-:101BD00000004552B0F720FF0527279508BB179551
-:101BE0001C3FB8F629913A9561F7077E10917D0068
-:101BF000110F08BBC250D04011F01093770010E2D3
-:101C00001ABF086017B3177E402F477E54E05A95DD
-:101C1000F1F708BB17BB48BB8ACFF8942FEFB0E8A9
-:101C2000A0E44AE0B1BF000081EE9CE0B399FECF92
-:101C3000B39BFECF0197B399FDCF97FF03C0BA1BAB
-:101C4000819501C0BA0FA69529F4281710F031B775
-:101C5000282FA1E0415031F731BF0000789408955A
-:101C6000F894F201329785E080935700E8957894D4
-:101C70000895F201309729F49093680080936700EB
-:101C800007C0E430F10539F490936A00809369004D
-:101C90008FE59CEC1FC02CEB421628E1520639F46C
-:101CA00080916700909168008E559C4F13C02EEB79
-:101CB000421628E1520639F48091690090916A0039
-:101CC0008D559C4F07C02AEB421628E1520611F4AD
-:101CD00081B790E02FB7F89431E00C0130935700B2
-:101CE000E89511242F0182E0480E511C2FBF089562
-:101CF000B898C09A8DE190E10197F1F7B09B15C0BB
-:101D0000EDEBF8E1E491EF3F81F0C098F894BB9AD5
-:101D10001BBE15BA10925F02EAEBF8E1E4918E2F38
-:101D200081508E3F08F462C163C114BE88E181BD59
-:101D300087E081BDBB9A88E893E1ECE9F1E0319757
-:101D4000F1F70197D1F7BB98AC9A8BB780628BBF44
-:101D50007894712C8CE991E00197F1F7A895312CDA
-:101D600060917C00162F135017FDB2C0809179004E
-:101D7000CCE0D0E0C81BD109C058DF4F6150CE0184
-:101D8000D5DD8E3F9F4409F0A1C0809178008D324F
-:101D900009F085C0183009F099C083EC80936C007D
-:101DA0008AE580936000109266009881292F207642
-:101DB00089812223D1F0712C811108C082E690E044
-:101DC00090937B0080937A0024E05FC0813051F4CF
-:101DD00081E180935700E8954C805D8097FD50C06D
-:101DE0002FEF4FC0382E20E050C09A81109275001E
-:101DF000811106C01092760085E790E022E03BC09A
-:101E0000853019F490937D002CC0863009F58B81C4
-:101E1000813019F48AED98E104C0823041F488ECF5
-:101E200098E190937B0080937A0022E10DC083308B
-:101E300051F4911108C08CEE98E190937B0080934F
-:101E40007A0024E001C020E080E4809366001DC099
-:101E5000883059F0893019F490937F0002C08A309D
-:101E600039F085E790E020E006C08FE790E002C0FF
-:101E700085E790E021E090937B0080937A0005C095
-:101E80002E8180E88093660007C08F81811104C095
-:101E90008E81821708F4282F2093610017C080914B
-:101EA000660087FF13C080EC481688E1580620F0D2
-:101EB000842D8F7339F00AC089919991DADE12501E
-:101EC00091F7F6CF95E0392E1092610010927C00C8
-:101ED0008091600084FF42C0809161008F3F09F4CF
-:101EE0003DC0182F893008F018E0811B80936100F5
-:101EF00080916C0098E8892780936C00112311F180
-:101F0000E0917A00F0917B008091660086FF0BC023
-:101F1000ADE6B0E084918D9331968DE690E0810F2F
-:101F20008A13F8CF0BC0EF01ADE6B0E089918D9335
-:101F3000FE018DE690E0810F8A13F8CFF0937B00CD
-:101F4000E0937A00612F8DE690E005DD1C5F1C3088
-:101F500019F08FEF809361001093600084E196B3D5
-:101F6000987131F48150D9F710927D00109277006A
-:101F7000C1E08111C0E080916B008C1729F0C11184
-:101F800001C04BDEC0936B00C30101963C0180355C
-:101F9000934C11F484E0382E232D3320E9F08AE3AA
-:101FA00090E20197F1F72230A9F4F894E0ECF8E11F
-:101FB000E054F10983E080935700E8953097C1F72A
-:101FC000412C512CC8E08FEF9FEF53DEC150D9F761
-:101FD00047DE02C02530E1F384E03812BBCEEDEBE2
-:101FE000F8E1E491EF3F09F4B5CE8FCEE1BF0000F8
-:041FF00065CCFFCFEE
-:061FF4005AFF18BA400874
-:04000003000018C021
-:00000001FF
diff --git a/firmware/releases/micronucleus-1.11-ledpb1.hex b/firmware/releases/micronucleus-1.11-ledpb1.hex
deleted file mode 100644
index 3397f3e..0000000
--- a/firmware/releases/micronucleus-1.11-ledpb1.hex
+++ /dev/null
@@ -1,119 +0,0 @@
-:0800000077CC76CCACCC74CCBB
-:1018C00017C016C04CC014C00902120001010080EC
-:1018D0003209040000000000000012011001FF00A6
-:1018E0000008D01653070B0100000001040309048F
-:1018F00011241FBECFE5D2E0CDBFDEBF00EB0F93BA
-:1019000007E00F9310E0A0E6B0E0E2EEFFE102C0D6
-:1019100005900D92A636B107D9F720E0A6E6B0E013
-:1019200001C01D92A639B207E1F7E2C1A82FB92F75
-:1019300080E090E041E050EA609530E009C02D91F0
-:1019400082279795879510F084279527305EC8F3F6
-:101950006F5FA8F30895EADF8D939D930895CF9369
-:10196000CFB7CF93C0915F02C03B21F4C0915E021C
-:10197000C73021F0CF91CFBFCF91A1CFCC27C39556
-:10198000B39BE9F7B39B0BC0B39B09C0B39B07C0E4
-:10199000B39B05C0B39B03C0B39B01C0D3C00F92E0
-:1019A000DF93C0917900DD27C058DF4F012EB39B34
-:1019B00003C0DF910F90E6CF2F930F931F934F93A8
-:1019C0002FEF4F6F06B303FB20F95F933F9350E077
-:1019D0003BE065C016B30126502953FDC89556B3A8
-:1019E000012703FB25F92F7306B3B1F05027102709
-:1019F00013FB26F906B22230F0F000C016B301271F
-:101A000003FB27F90126502906B22430E8F54F7769
-:101A1000206816B30000F6CF50274F7D206206B233
-:101A2000102F000000C006B300265029102713FB1A
-:101A300026F906B2E2CF4F7B06B3206400C0DACFAE
-:101A400001265029187106B269F14E7F2160012FDD
-:101A500016B328C0002650294D7F06B22260102FF1
-:101A600029C0012650294B7F06B22460012F2DC0CA
-:101A700016B301265029477F2860000006B22EC009
-:101A80004F7E06B3206130C0422706B3499300263B
-:101A90005029102706B24FEF13FB20F9297F16B308
-:101AA00079F2187159F10126502906B2012703FB7A
-:101AB00021F9237F06B371F2002650293150D0F06E
-:101AC00006B2102713FB22F9277E16B351F2012626
-:101AD0005029012703FB06B223F92F7C49F20000AD
-:101AE00006B3102713FB24F90026502906B22F79DC
-:101AF00039F270CF10E21ABF002717C03B50319562
-:101B0000C31BD04010E21ABF0881033CF9F00B342C
-:101B1000E9F0209177001981110F1213EDCF0936EA
-:101B200051F10D3211F0013E39F700937E003F91E3
-:101B30005F914F911F910F912F91DF910F90CAB735
-:101B4000C5FD1DCFCF91CFBFCF91189520917E00BD
-:101B5000222369F310917C00112321F5343022F106
-:101B600030937C0020937800109179003BE0311B8A
-:101B70003093790019C000917C0001309CF40AE593
-:101B80003091600034FD11C000936000CCE6D0E0DD
-:101B900010C0052710E000C021C0052710E0C8953F
-:101BA00008BB14C03AE501C032ED032EC0E0D0E01E
-:101BB00032E017B31861C39A08B317BB58E120E8A5
-:101BC0004FEF20FF052708BB279517951C3F28F7E7
-:101BD00000004552B0F720FF0527279508BB179551
-:101BE0001C3FB8F629913A9561F7077E10917D0068
-:101BF000110F08BBC250D04011F01093770010E2D3
-:101C00001ABF086017B3177E402F477E54E05A95DD
-:101C1000F1F708BB17BB48BB8ACFF8942FEFB0E8A9
-:101C2000A0E44AE0B1BF000081EE9CE0B399FECF92
-:101C3000B39BFECF0197B399FDCF97FF03C0BA1BAB
-:101C4000819501C0BA0FA69529F4281710F031B775
-:101C5000282FA1E0415031F731BF0000789408955A
-:101C6000F894F201329785E080935700E8957894D4
-:101C70000895F201309729F49093680080936700EB
-:101C800007C0E430F10539F490936A00809369004D
-:101C90008FE59CEC1FC02CEB421628E1520639F46C
-:101CA00080916700909168008E559C4F13C02EEB79
-:101CB000421628E1520639F48091690090916A0039
-:101CC0008D559C4F07C02AEB421628E1520611F4AD
-:101CD00081B790E02FB7F89431E00C0130935700B2
-:101CE000E89511242F0182E0480E511C2FBF089562
-:101CF00014BE88E181BD87E081BDBB9A88E893E18D
-:101D0000ECE9F1E03197F1F70197D1F7BB98AC9A84
-:101D10008BB780628BBF7894C198712C8CE991E06D
-:101D20000197F1F7A895312C60917C00162F135084
-:101D300017FDB2C080917900CCE0D0E0C81BD1097A
-:101D4000C058DF4F6150CE01F1DD8E3F9F4409F056
-:101D5000A1C0809178008D3209F085C0183009F05B
-:101D600099C083EC80936C008AE5809360001092A8
-:101D700066009881292F207689812223D1F0712C49
-:101D8000811108C082E690E090937B0080937A00F6
-:101D900024E05FC0813051F481E180935700E895E1
-:101DA0004C805D8097FD50C02FEF4FC0382E20E053
-:101DB00050C09A8110927500811106C01092760071
-:101DC00085E790E022E03BC0853019F490937D00D8
-:101DD0002CC0863009F58B81813019F48AED98E1A9
-:101DE00004C0823041F488EC98E190937B008093AA
-:101DF0007A0022E10DC0833051F4911108C08CEEBD
-:101E000098E190937B0080937A0024E001C020E069
-:101E100080E4809366001DC0883059F0893019F441
-:101E200090937F0002C08A3039F085E790E020E08F
-:101E300006C08FE790E002C085E790E021E0909334
-:101E40007B0080937A0005C02E8180E88093660035
-:101E500007C08F81811104C08E81821708F4282F5A
-:101E60002093610017C08091660087FF13C080EC4B
-:101E7000481688E1580620F0842D8F7339F00AC087
-:101E800089919991F6DE125091F7F6CF95E0392EAF
-:101E90001092610010927C008091600084FF42C02B
-:101EA000809161008F3F09F43DC0182F893008F000
-:101EB00018E0811B8093610080916C0098E889276D
-:101EC00080936C00112311F1E0917A00F0917B0076
-:101ED0008091660086FF0BC0ADE6B0E084918D93E3
-:101EE00031968DE690E0810F8A13F8CF0BC0EF0199
-:101EF000ADE6B0E089918D93FE018DE690E0810F13
-:101F00008A13F8CFF0937B00E0937A00612F8DE67F
-:101F100090E021DD1C5F1C3019F08FEF8093610091
-:101F20001093600084E196B3987131F48150D9F731
-:101F300010927D0010927700C1E08111C0E0809185
-:101F40006B008C1729F0C11101C067DEC0936B00D4
-:101F5000C30101963C018035934C11F484E0382E86
-:101F6000872D8D7011F0B99801C0B99A232D3320B7
-:101F7000E9F08AE390E20197F1F72230A9F4F894AE
-:101F8000E0ECF8E1E054F10983E080935700E89534
-:101F90003097C1F7412C512CC8E08FEF9FEF69DEDD
-:101FA000C150D9F75DDE02C02530E1F384E038127C
-:101FB000B5CEEDEBF8E1E491EF3F09F4AFCEB9987F
-:101FC000F894BB9A1BBE15BA10925F02EAEBF8E1D7
-:101FD000E4918E2F81508E3F10F4E1BF00006ECC53
-:021FE000FFCF31
-:061FE2005AFF18BA400886
-:04000003000018C021
-:00000001FF
diff --git a/firmware/releases/micronucleus-1.11.hex b/firmware/releases/micronucleus-1.11.hex
deleted file mode 100644
index dd31260..0000000
--- a/firmware/releases/micronucleus-1.11.hex
+++ /dev/null
@@ -1,118 +0,0 @@
-:0800000077CC76CCACCC74CCBB
-:1018C00017C016C04CC014C00902120001010080EC
-:1018D0003209040000000000000012011001FF00A6
-:1018E0000008D01653070B0100000001040309048F
-:1018F00011241FBECFE5D2E0CDBFDEBF00EB0F93BA
-:1019000007E00F9310E0A0E6B0E0E2EDFFE102C0D7
-:1019100005900D92A636B107D9F720E0A6E6B0E013
-:1019200001C01D92A639B207E1F7E2C1A82FB92F75
-:1019300080E090E041E050EA609530E009C02D91F0
-:1019400082279795879510F084279527305EC8F3F6
-:101950006F5FA8F30895EADF8D939D930895CF9369
-:10196000CFB7CF93C0915F02C03B21F4C0915E021C
-:10197000C73021F0CF91CFBFCF91A1CFCC27C39556
-:10198000B39BE9F7B39B0BC0B39B09C0B39B07C0E4
-:10199000B39B05C0B39B03C0B39B01C0D3C00F92E0
-:1019A000DF93C0917900DD27C058DF4F012EB39B34
-:1019B00003C0DF910F90E6CF2F930F931F934F93A8
-:1019C0002FEF4F6F06B303FB20F95F933F9350E077
-:1019D0003BE065C016B30126502953FDC89556B3A8
-:1019E000012703FB25F92F7306B3B1F05027102709
-:1019F00013FB26F906B22230F0F000C016B301271F
-:101A000003FB27F90126502906B22430E8F54F7769
-:101A1000206816B30000F6CF50274F7D206206B233
-:101A2000102F000000C006B300265029102713FB1A
-:101A300026F906B2E2CF4F7B06B3206400C0DACFAE
-:101A400001265029187106B269F14E7F2160012FDD
-:101A500016B328C0002650294D7F06B22260102FF1
-:101A600029C0012650294B7F06B22460012F2DC0CA
-:101A700016B301265029477F2860000006B22EC009
-:101A80004F7E06B3206130C0422706B3499300263B
-:101A90005029102706B24FEF13FB20F9297F16B308
-:101AA00079F2187159F10126502906B2012703FB7A
-:101AB00021F9237F06B371F2002650293150D0F06E
-:101AC00006B2102713FB22F9277E16B351F2012626
-:101AD0005029012703FB06B223F92F7C49F20000AD
-:101AE00006B3102713FB24F90026502906B22F79DC
-:101AF00039F270CF10E21ABF002717C03B50319562
-:101B0000C31BD04010E21ABF0881033CF9F00B342C
-:101B1000E9F0209177001981110F1213EDCF0936EA
-:101B200051F10D3211F0013E39F700937E003F91E3
-:101B30005F914F911F910F912F91DF910F90CAB735
-:101B4000C5FD1DCFCF91CFBFCF91189520917E00BD
-:101B5000222369F310917C00112321F5343022F106
-:101B600030937C0020937800109179003BE0311B8A
-:101B70003093790019C000917C0001309CF40AE593
-:101B80003091600034FD11C000936000CCE6D0E0DD
-:101B900010C0052710E000C021C0052710E0C8953F
-:101BA00008BB14C03AE501C032ED032EC0E0D0E01E
-:101BB00032E017B31861C39A08B317BB58E120E8A5
-:101BC0004FEF20FF052708BB279517951C3F28F7E7
-:101BD00000004552B0F720FF0527279508BB179551
-:101BE0001C3FB8F629913A9561F7077E10917D0068
-:101BF000110F08BBC250D04011F01093770010E2D3
-:101C00001ABF086017B3177E402F477E54E05A95DD
-:101C1000F1F708BB17BB48BB8ACFF8942FEFB0E8A9
-:101C2000A0E44AE0B1BF000081EE9CE0B399FECF92
-:101C3000B39BFECF0197B399FDCF97FF03C0BA1BAB
-:101C4000819501C0BA0FA69529F4281710F031B775
-:101C5000282FA1E0415031F731BF0000789408955A
-:101C6000F894F201329785E080935700E8957894D4
-:101C70000895F201309729F49093680080936700EB
-:101C800007C0E430F10539F490936A00809369004D
-:101C90008FE59CEC1FC02CEB421628E1520639F46C
-:101CA00080916700909168008E559C4F13C02EEB79
-:101CB000421628E1520639F48091690090916A0039
-:101CC0008D559C4F07C02AEB421628E1520611F4AD
-:101CD00081B790E02FB7F89431E00C0130935700B2
-:101CE000E89511242F0182E0480E511C2FBF089562
-:101CF00014BE88E181BD87E081BDBB9A88E893E18D
-:101D0000ECE9F1E03197F1F70197D1F7BB98AC9A84
-:101D10008BB780628BBF7894712C8CE991E001972E
-:101D2000F1F7A895312C60917C00162F135017FD08
-:101D3000B2C080917900CCE0D0E0C81BD109C05876
-:101D4000DF4F6150CE01F2DD8E3F9F4409F0A1C00C
-:101D5000809178008D3209F085C0183009F099C063
-:101D600083EC80936C008AE580936000109266009B
-:101D70009881292F207689812223D1F0712C81111D
-:101D800008C082E690E090937B0080937A0024E084
-:101D90005FC0813051F481E180935700E8954C8019
-:101DA0005D8097FD50C02FEF4FC0382E20E050C00F
-:101DB0009A8110927500811106C01092760085E715
-:101DC00090E022E03BC0853019F490937D002CC058
-:101DD000863009F58B81813019F48AED98E104C0D1
-:101DE000823041F488EC98E190937B0080937A00F4
-:101DF00022E10DC0833051F4911108C08CEE98E1BE
-:101E000090937B0080937A0024E001C020E080E47E
-:101E1000809366001DC0883059F0893019F4909382
-:101E20007F0002C08A3039F085E790E020E006C0EC
-:101E30008FE790E002C085E790E021E090937B007F
-:101E400080937A0005C02E8180E88093660007C0E9
-:101E50008F81811104C08E81821708F4282F20936E
-:101E6000610017C08091660087FF13C080EC4816A0
-:101E700088E1580620F0842D8F7339F00AC08991CB
-:101E80009991F7DE125091F7F6CF95E0392E109226
-:101E9000610010927C008091600084FF42C08091BC
-:101EA00061008F3F09F43DC0182F893008F018E019
-:101EB000811B8093610080916C0098E88927809352
-:101EC0006C00112311F1E0917A00F0917B00809178
-:101ED000660086FF0BC0ADE6B0E084918D9331962D
-:101EE0008DE690E0810F8A13F8CF0BC0EF01ADE6CD
-:101EF000B0E089918D93FE018DE690E0810F8A1309
-:101F0000F8CFF0937B00E0937A00612F8DE690E0AC
-:101F100022DD1C5F1C3019F08FEF8093610010935D
-:101F2000600084E196B3987131F48150D9F7109232
-:101F30007D0010927700C1E08111C0E080916B00BC
-:101F40008C1729F0C11101C068DEC0936B00C3017A
-:101F500001963C018035934C11F484E0382E232DFA
-:101F60003320E9F08AE390E20197F1F72230A9F4F7
-:101F7000F894E0ECF8E1E054F10983E08093570035
-:101F8000E8953097C1F7412C512CC8E08FEF9FEFB7
-:101F900070DEC150D9F764DE02C02530E1F384E081
-:101FA0003812BBCEEDEBF8E1E491EF3F09F4B5CE8A
-:101FB000F894BB9A1BBE15BA10925F02EAEBF8E1E7
-:101FC000E4918E2F81508E3F10F4E1BF000076CC5B
-:021FD000FFCF41
-:061FD2005AFF18BA400896
-:04000003000018C021
-:00000001FF
diff --git a/firmware/releases/release notes.txt b/firmware/releases/release notes.txt
deleted file mode 100644
index 1f098a8..0000000
--- a/firmware/releases/release notes.txt
+++ /dev/null
@@ -1,158 +0,0 @@
-== 1.11 - 2013-01-04 ==
-Firmware:
- o New features
- - The bootloader will now always start if no user program was loaded, regardless of the
- entry condition.
- - The bootloader will not quit if no user program is loaded. This prevents periodic
- re-enumeration of the bootloader and should make driver installation much easier.
- The new "--erase-only" function of the commandline tool can be used to erase the
- user program and create a stable device for easier installation.
- - New entry modes can be selected in "bootloader.h". Please read the comments for details.
- + ENTRY_ALWAYS
- + ENTRY_WATCHDOG
- + ENTRY_EXT_RESET
- + ENTRY_JUMPER
- - The bootloader is now able to cope with a fused-on watch dog timer.
- o Internal changes
- - A CRC is now performed on all incoming USB traffic.
- - The flash buffer is now cleaned before loading a page to prevent data corruption.
- - Further size optimizations (62 bytes gained, despite new features)
- + Changed event system into a directly mapped command system.
- + Introduce union types and forced global variables to registers.
- - More source code cleaning up.
- o Size is now 1816 bytes, 6380 bytes user space. Note that avr-objcopy reports 8 bytes
- more due to the zero vector table which is overwritten by the userprogram.
-
-Commandline tool:
- o New features (Note: All new features are compatible with previous firmware releases)
- - Added "--erase-only" command to erase the device without writing a new user program.
- - The commandline tool will not transfer empty memory pages any more, resulting in
- a significantly reduced programming time in many cases.
- - Client firmware version will now be displayed after connecting.
- o Internal changes:
- - Clean up of source code
- - Bugfixes (see commits)
-
-== 1.10rc3 - 2013-12-15 ==
-firmware:
- o Major reorganization of the source and build system.
- - Used own crt1.s to create vector table in the first flash-page.
- - Removed all functions related to vector-table writing.
- - Refactored code and inlined all functions that were only called once.
- - Removed redundantly defined types to avoid confusion. Only C99 types are used now.
- o Size is now 1878 bytes, 6314 bytes user space. No changes to functionality.
-
-== 1.10rc2 - 2013-11-25 ==
-
-firmware:
- o It seems that the USB specification does not define a maximum delay from device power up until
- the host issues a bus reset. Therefore too short delays AUTO_EXIT_NO_USB_MS can lead to the
- bootloader exiting before enumeration on some systems. Disabled AUTO_EXIT_NO_USB_MS in default configuration.
-
-== 1.10rc1 - 2013-11-25 ==
-
-firmware:
-Version jump to 1.10 due to major changes in firmware by @cpldcpu.
- o Reduced code size to below 2kb (1974 with standard configuration) by implementing oscillator
- calibration in assembler and various local code tweaking. See Github commit history for full details.
- This version has 6208 bytes programmable code space.
- o Micronucleus will now simulate an USB-disconnect when exiting the bootloader. This prevents various
- issues with having a non-responsive USB device, including crashing the host tool. It is now possible
- to enter the bootloader again by resetting the device using the watchdog timer or the reset input without
- physically disconnecting from USB.
- o Cleaned up bootloaderconfig.h
- o Introduced a second time-out (AUTO_EXIT_NO_USB_MS) if no USB reset from the host is detected. This can be used
- to quit the bootloader early if the device is not connected to USB. The bootloader will enter the user
- program after ~0.8s with the default settings instead of 6s when USB is connected.
- o Introduced optional code to flash a LED. See LED_PRESENT in bootloaderconfig.h for details.
- Careful: Right now enabling the LED-code requires setting the bootloader base address to 0x1800 due
- to increased code size.
-
-
-== 1.06-jumper-v2 - 2013-5-20 ==
-
-firmware:
- o Fix horrible bug reported by @giannoug where jumper pin is made in to an output instead of input!
- -- **Install update immediately** - current version creates short circuits!!!
- -- Previous version of 1.06 jumper deleted due to short circuits - do not use previous versions either
-
-== 1.06 - 2013-3-4 ==
-
-firmware:
- o Store 16.5mhz oscillator calibration value in tiny vector table
- o At user program startup, restore oscillator calibration value stored together with program
- -> User programs always start on the calibration value from the last time they were uploaded
- o Slightly too big to have 6076 programmable bytes, reverted to having 6012 bytes free for user program
- -> Hopefully a future version can slim down again and get another page free!
-
-== 1.05 - 2013-2-8 ==
-
-firmware:
- o Revert all timing aspects to be like 1.02 - the most reliable version ever as judged by digistump
- this means this is a 5 sec boot time release
- o The only meaningful difference between using this and version 1.02 is 1.02 has 6010 bytes of
- programmable space and 1.05 has 6076 bytes. This release also has the improved idlePolls mechanism
- which might improve reliability in some cases
- o I'm not totally sure this version is as reliable as 1.02. Maybe it's better? Maybe it's worse?
- o Now includes a -jumper. "-jumper" works exactly the same with four exceptions:
- -> Bootloader never times out (no 5 seconds waiting)
- -> Bootloader runs user program immediately
- -> If you want to upload something, connect jumper between D5 / reset pin and ground
- -> You obviously can't use this on chips which don't have their reset pin disabled
- :: I made it for DeuxVis on digispark forum, but I mostly use it on my LittleWire. It's really great for that!
-
-upgrade:
- o When finished upgrading runs new bootloader firmware.
- -> you can watch for the new bootloader to connect to see when the upgrade has finished
- -> upgrades only take about half a second, so you could just wait like five seconds
- :: if upgrading to a micronucleus -jumper variant you might like to connect the jumper before you upgrade
-
-== 1.04 - 2012-10-5 ==
-
-firmware:
- o Further reduction in code size - not enough to gain another page yet
- o Reduced default configuration's timeout from 5 seconds to 2.5 seconds - seems to work on Mac, Windows 7, and Linux
- o Timeout mechanism now more robust - any usb requests reset timeout
- o Faster Uploads - write sleeps reduced from 8ms to 6ms, for a roughly 25% speed boost
- o You can poll info requests once every half second or so to keep bootloader captive, so it doesn't launch user program
- -- this is useful for programs which are likely to do strange things to the USB data lines - less freaking out usb
- -- root hubs in specialist applications where that can be predicted
- o Added warning when bootloader configured with idle timeout below duration of erase request (the longest running request)
- o Option to restore OSCCAL to it's factory setting - run your programs at 16.0mhz instead of 16.5mhz
- o Option to set CLKPR prescale selection - You can configure micronucleus to run on devices with clkdiv8 fuse set. By default it returns to clkdiv8 after (2mhz real speed), but you can optionally specify a different division, to have 8mhz, 4mhz, or a much lower speed.
-
-upgrade:
- o Micronucleus now includes a viral upgrade tool. Upload these hex files via an older version of micronucleus or some other attiny85 bootloader like fast tiny & mega uart bootloader, and when the program runs it'll brick the chip, patch the bootloader with a new version, then patch it's own interrupt vector table to point to the bootloader. After letting it run for at least five seconds, power cycle the device and it should boot right in to the new bootloader!
- o I (bluebie) make no guarentees that any of micronucleus wont brick your chips. Be careful if you don't have access to a fuse resetter or HVSP programmer.
-
-commandline:
- o Added percentage progress logging
- o New --dump-progress option outputs computer readable JSON lines, for driving GUIs, including raw progress bar data
- o Can pass "-" as filename to upload via stdin, for GUI apps
- o Exit code is more reliably not zero when an error occurs, and zero when upload succeeds flawlessly
- o Detect and refuse to upload to unknown newer versions of firmware
- o Adjusted some delays - uploads now take about a quarter to half of a second less time
- o `make install` works and installs to /usr/local/bin (anyone know how to make this smarter?)
- - notice: I think there may be a bug uploading raw binary files, but intel hex files seem to work fine
-
-commandline's c library:
- o progress argument to eraseFlash and writeFlash functions - a function to call frequently with progress data
- -- eraseFlash: library currently simulates progress, by providing the erase_sleep progress in steps of 1%
- -- writeFlash: provides real progress, at about one update every write_sleep milliseconds (usually about 8-10ms)
-
-
-== 1.03 - released 2012-9-30 ==
-
- o Reduced bootloader size by one page, expanding memory for user program by 64 bytes
- o Adjusted tinyvector table to correct size (four bytes) - giving user program two more bytes
- o Changed upload protocol in an incompatible way to enable smaller bootloaders in the future
- o Now we have a command line tool (which detects 1.02 and works around upload protocol differences)
- o Now requires all pages be written
- o 'Finish' command repurposed as 'run' command for bootloader configs where running user program maybe optional
-
-
-== 1.02 - released 2012-9-30 ==
-
- o Most recent build before next release where some subtle protocol changes took place
-
-
diff --git a/firmware/releases/t167_default.hex b/firmware/releases/t167_default.hex
new file mode 100644
index 0000000..e5e51be
--- /dev/null
+++ b/firmware/releases/t167_default.hex
@@ -0,0 +1,89 @@
+:1039800018C00000397A80059487090212000101ED
+:103990000080320904000000000000001201100144
+:1039A000FF000008D01653070002000000010403C6
+:1039B000090411241FBECEEFD2E0CDBFDEBF21E04F
+:1039C000A0E0B1E001C01D92AC32B207E1F742C104
+:1039D000A82FB92F80E090E041E050EA609530E0F8
+:1039E00009C02D9182279795879510F084279527F8
+:1039F000305EC8F36F5FA8F30895EADF8D939D935F
+:103A00000895CF93CFB7CF93DF93C3951B9BE9F76F
+:103A10001B9B0BC01B9B09C01B9B07C01B9B05C0AE
+:103A20001B9B03C01B9B01C08FC06F93C0910E01F5
+:103A3000DD27CA5EDE4F2F9365E51B9B03C02F91E8
+:103A40006F91E6CF0F931F934F9320E040E15F9378
+:103A500003B1087103FB27F93F9350E03BE039C005
+:103A6000187140642F77012F5F5F1EC0406813B14B
+:103A700018712F7752501FC0406403B12F7708711F
+:103A8000D1F15F5F00C023C0406213B12F7718717E
+:103A900091F15F5F00C025C008711027515012F4EA
+:103AA0005D5F0000115027952C3F13B1C8F61871C7
+:103AB0000127015027952C3FC8F64227499303B1AF
+:103AC000087110274F73115027952C3FA8F6469583
+:103AD000469513B1187179F00127015027952C3FB5
+:103AE00098F66B5A60F3315003B1B0F600C012E0A3
+:103AF0001BBB00271DC03B503195C31BD04012E0BB
+:103B00001BBB0881033C29F10B3419F120910C01F6
+:103B10001981110F1213EDCF093651F10D3211F049
+:103B2000013E39F7CAE01BB311FD02C0CA95D9F7AF
+:103B3000009314013F915F914F911F910F912F912D
+:103B40006F91CBB3C1FD61CFDF91CF91CFBFCF914B
+:103B5000089520911401222369F310911201112379
+:103B600009F534300AF13093120120930D011CC085
+:103B7000009112010130B4F40AE530910F0134FDD7
+:103B800014C000930F01C1E0D1E013C0052710E07D
+:103B900000C0000005B91AC0052710E0221F1DC093
+:103BA00010E021C04AE502C032ED432FC4E1D0E06D
+:103BB00032E014B118612B9A05B114B958E120E82C
+:103BC00065E320FF052705B9279517951C3FF0F6FB
+:103BD0006695B8F7B1F720FF052705B92795179522
+:103BE0001C3FD0F62795179517FF052700001C3FAF
+:103BF00005B9B0F629913A9519F7077E109113018E
+:103C0000110FC651D04005B911F010930C0112E00C
+:103C10001BBB086014B1177E402F477E54E05A95B5
+:103C2000F1F705B914B945B985CFF201309731F0F4
+:103C3000E230F10529F480EC9CE102C08CE094E9CB
+:103C400021E00C0120935700E8951124CF01029642
+:103C50002C01089514BE88E18093600087E0809372
+:103C60006000239A2FEF85EA9EE02150804090402B
+:103C7000E1F700C0000023988AE580930F018FEFE1
+:103C80008093000180916C00806180936C00809132
+:103C90006800826080936800712C312C412C512C7B
+:103CA00084E1C5EDD4E193B1987109F084E18150CC
+:103CB00021F41092130110920C01D99B03C0A1DED4
+:103CC000712C03C02197209771F7A89522E032123A
+:103CD0000CC0E0E8F9E3E058F10983E08093570075
+:103CE000E8953097C1F7412C512C832D803459F43D
+:103CF000F2013297E03889E3F80750F485E08093C9
+:103D00005700E89505C0843019F4CD2B11F4E8C0B4
+:103D1000312C80911201835087FD98C090910D0144
+:103D20009D3209F091C0883009F08EC083EC8093F9
+:103D300001018AE580930F0190911701907680919F
+:103D40001801992361F1811108C084E899E39093E7
+:103D500011018093100126E06CC0813059F44114A8
+:103D6000510409F44CC080911B018078482E50907A
+:103D70001C0145C0833081F48091190190911A0192
+:103D800054DF80911B0190911C014FDF842D8F77B0
+:103D9000B1F580E4382E33C08F73382E30C0909147
+:103DA000190110920A01811106C010920B018AE0DC
+:103DB00091E022E03AC0853019F49093130127C0B6
+:103DC0008630F9F480911A01813019F48CE999E375
+:103DD00004C0823041F48AE899E390931101809302
+:103DE000100122E126C0833051F4911108C08EEAFF
+:103DF00099E3909311018093100124E01AC020E010
+:103E000018C0883079F0893031F4909315018AE038
+:103E100091E020E00AC021E08A3009F020E08AE049
+:103E200091E003C085E191E021E09093110180933E
+:103E3000100180911E01811105C080911D01821722
+:103E400008F4282F209300011092120180910F0195
+:103E500084FF31C0809100018F3F69F1C82F893004
+:103E600008F0C8E08C1B809300018091010198E864
+:103E7000892780930101CC2391F0E0911001F0910A
+:103E8000110182E091E0DC0124912D9331962C2FD9
+:103E9000280F2A13F9CFF0931101E09310016C2F32
+:103EA00082E091E0AADDCC5FCC3019F08FEF8093F7
+:103EB0000001C0930F01C30101963C01803B944077
+:103EC00029F4EDE7F9E3E491EF3F51F4D99BE8CE13
+:103ED00080E21C9980E28150E1F782E08BBBE0CE6A
+:0E3EE000239A1092680010926C0048CDFFCF1C
+:040000030000398040
+:00000001FF
diff --git a/firmware/releases/t841_default.hex b/firmware/releases/t841_default.hex
new file mode 100644
index 0000000..0102d58
--- /dev/null
+++ b/firmware/releases/t841_default.hex
@@ -0,0 +1,101 @@
+:1019C00017C019BA10859315090212000101008091
+:1019D0003209040000000000000012011001FF00A5
+:1019E0000008D01653070002000000010403090498
+:1019F00011241FBECFEFD2E0CDBFDEBF21E0A0E0BB
+:101A0000B1E001C01D92AC32B207E1F78FC1A82F3F
+:101A1000B92F80E090E041E050EA609530E009C0E5
+:101A20002D9182279795879510F084279527305E12
+:101A3000C8F36F5FA8F30895EADF8D939D9308952F
+:101A4000CF93CFB7CF93C395B09BE9F7B09B09C0B5
+:101A5000B09B07C0B09B05C0B09B03C0B09B01C04A
+:101A6000A7C0DF93C0910E01DD27CA5EDE4FB09B99
+:101A700002C0DF91EBCF2F930F931F9306B32FEF8D
+:101A800000FB20F94F933F9316B34FEF012700FB64
+:101A900021F93BE031C04E7F012F16B3216028C0F1
+:101AA000102F4D7F2260000006B329C04B7F2460B9
+:101AB000012F000016B32BC016B3477F28602AC041
+:101AC0004F7E06B320612CC04F7D16B320622FC01D
+:101AD0004F7B06B3206432C0422706B349934FEFD1
+:101AE0000000102710FB20F916B31370C9F1297FED
+:101AF00091F2012700FB21F906B3237F89F23150CF
+:101B000058F1102710FB22F916B3277E79F201272E
+:101B100000FB23F92F7C81F206B3102710FB24F978
+:101B20002F7971F200C016B3012700FB25F92F733E
+:101B300059F200C006B3102710FB26F9223040F2FC
+:101B400000C016B3012700FB27F9243028F64F7791
+:101B5000206816B30000F9CF10E21ABF00271DC09D
+:101B60003B503195C31BD04010E21ABF0881033CA3
+:101B700019F10B3409F120910C011981110F121385
+:101B8000EDCF093641F10D3211F0013E39F7CAE0CF
+:101B90001AB715FD02C0CA95D9F7009314013F91F9
+:101BA0004F911F910F912F91DF91CAB7C5FD4BCF78
+:101BB000CF91CFBFCF91089520911401222379F3C3
+:101BC000109112011123E1F43430E2F0309312014C
+:101BD00020930D0117C00091120101308CF40AE529
+:101BE00030910F0134FD10C000930F01C1E0D1E02E
+:101BF0000FC02795A8F45150A9F4220F0000F9CF87
+:101C00004AE503C042ED01C0432FC4E1D0E032E019
+:101C100017B31360C09A17BB08B320E413E05F93B7
+:101C2000012756E008BB279520F4515021F4220FDC
+:101C3000F9CF012756E000003B5A08BBD0F22795A8
+:101C400028F4515029F4220F0000F9CF012756E063
+:101C5000279508BB20F4515021F4220FF9CF01271A
+:101C600056E02991332308BB21F60C7F1091130114
+:101C7000110FC651D04008BB11F010930C0110E2B7
+:101C80001ABF016017B31C7F402F4C7F5F9100C0CB
+:101C900000C008BB17BB48BB82CF2FEFB0E8A0E065
+:101CA0004BE0B093740000008EE599E0B099FECF50
+:101CB000B09BFECF0197B099FDCFB19B09C096B301
+:101CC0009370E9F796B39370D1F7B09BFECFECCF4A
+:101CD00097FF03C0BA1B819501C0BA0FA69541F4C6
+:101CE000A0E430F4281718F030917400282FA1E0F8
+:101CF0004150B9F63093740000000895F201309716
+:101D000049F02AEB421629E1520631F48091740021
+:101D100090E002C08FED9CEC21E00C012093570075
+:101D2000E8951124CF0102962C010895EAEBF9E120
+:101D3000E491EF3F19F0E0937400000004B601FC59
+:101D400006C0EDEBF9E1E491EF3F09F04FC114BE9D
+:101D500088ED8093710087E081BDB89A2FE78CEF02
+:101D60009AE0215080409040E1F700C00000B89810
+:101D70008AE580930F018FEF8093000180B5826028
+:101D800080BD8BB780628BBFC298712C312C412CE7
+:101D9000512C14E1C0EADFE086B3837009F014E14E
+:101DA000115029F41092130110920C0176DF0AB63B
+:101DB00005FE03C045DE712C03C02197209761F713
+:101DC000A89522E032120CC0E0ECF9E1E054F109F0
+:101DD00083E080935700E8953097C1F7412C512C50
+:101DE000832D803459F4F2013297E03C89E1F80701
+:101DF00050F485E080935700E89505C0843019F4CD
+:101E0000CD2B11F4EFC0312C80911201835087FD4E
+:101E100098C090910D019D3209F091C0883009F071
+:101E20008EC083EC809301018AE580930F0190912D
+:101E30001701907680911801992361F1811108C0F2
+:101E400082EC99E1909311018093100126E06CC01F
+:101E5000813059F44114510409F44CC080911B01A4
+:101E6000807F482E50901C0145C0833081F48091C2
+:101E7000190190911A0142DF80911B0190911C0180
+:101E80003DDF842D8F70B1F580E4382E33C08F7321
+:101E9000382E30C09091190110920A01811106C0AC
+:101EA00010920B018AE091E022E03AC0853019F4EB
+:101EB0009093130127C08630F9F480911A01813084
+:101EC00019F48AED99E104C0823041F488EC99E17B
+:101ED000909311018093100122E126C0833051F4C8
+:101EE000911108C08CEE99E190931101809310013B
+:101EF00024E01AC020E018C0883079F0893031F42D
+:101F0000909315018AE091E020E00AC021E08A3038
+:101F100009F020E08AE091E003C085E191E021E052
+:101F2000909311018093100180911E01811105C0D1
+:101F300080911D01821708F4282F20930001109230
+:101F4000120180910F0184FF31C0809100018F3F09
+:101F500069F1C82F893008F0C8E08C1B809300011C
+:101F60008091010198E8892780930101CC2391F0A9
+:101F7000E0911001F091110182E091E0DC012491E7
+:101F80002D9331962C2F280F2A13F9CFF09311019E
+:101F9000E09310016C2F82E091E04EDDCC5FCC30FD
+:101FA00019F08FEF80930001C0930F01C3010196D8
+:101FB0003C01803B944029F4EDEBF9E1E491EF3FE3
+:101FC00089F4862D8C7411F0BA9801C0BA9A0AB6B9
+:101FD00005FEDFCE88E1B19988E18150E1F780E22A
+:101FE0008ABFD7CEBA98B89A1BBE10BCE7CCFFCF39
+:04000003000019C020
+:00000001FF
diff --git a/firmware/releases/t84_default.hex b/firmware/releases/t84_default.hex
new file mode 100644
index 0000000..7471f72
--- /dev/null
+++ b/firmware/releases/t84_default.hex
@@ -0,0 +1,98 @@
+:101A000017C019FA4005930C090212000101008069
+:101A10003209040000000000000012011001FF0064
+:101A20000008D01653070002000000010403090457
+:101A300011241FBECFE5D2E0CDBFDEBF20E0A0E67F
+:101A4000B0E001C01D92AC38B207E1F783C1A82F06
+:101A5000B92F80E090E041E050EA609530E009C0A5
+:101A60002D9182279795879510F084279527305ED2
+:101A7000C8F36F5FA8F30895EADF8D939D930895EF
+:101A8000CF93CFB7CF93C395B09BE9F7B09B09C075
+:101A9000B09B07C0B09B05C0B09B03C0B09B01C00A
+:101AA000A7C0DF93C0916E00DD27CA58DF4FB09BFF
+:101AB00002C0DF91EBCF2F930F931F9306B32FEF4D
+:101AC00000FB20F94F933F9316B34FEF012700FB24
+:101AD00021F93BE031C04E7F012F16B3216028C0B1
+:101AE000102F4D7F2260000006B329C04B7F246079
+:101AF000012F000016B32BC016B3477F28602AC001
+:101B00004F7E06B320612CC04F7D16B320622FC0DC
+:101B10004F7B06B3206432C0422706B349934FEF90
+:101B20000000102710FB20F916B31370C9F1297FAC
+:101B300091F2012700FB21F906B3237F89F231508E
+:101B400058F1102710FB22F916B3277E79F20127EE
+:101B500000FB23F92F7C81F206B3102710FB24F938
+:101B60002F7971F200C016B3012700FB25F92F73FE
+:101B700059F200C006B3102710FB26F9223040F2BC
+:101B800000C016B3012700FB27F9243028F64F7751
+:101B9000206816B30000F9CF10E21ABF00271DC05D
+:101BA0003B503195C31BD04010E21ABF0881033C63
+:101BB00019F10B3409F120916C001981110F1213E6
+:101BC000EDCF093641F10D3211F0013E39F7CAE08F
+:101BD0001AB715FD02C0CA95D9F7009374003F915A
+:101BE0004F911F910F912F91DF91CAB7C5FD4BCF38
+:101BF000CF91CFBFCF91089520917400222379F324
+:101C0000109172001123E1F43430E2F0309372004D
+:101C100020936D0017C00091720001308CF40AE52A
+:101C200030916F0034FD10C000936F00C1E6D0E02A
+:101C30000FC02795A8F45150A9F4220F0000F9CF46
+:101C40004AE503C042ED01C0432FC4E1D0E032E0D9
+:101C500017B31360C09A17BB08B320E413E05F9377
+:101C6000012756E008BB279520F4515021F4220F9C
+:101C7000F9CF012756E000003B5A08BBD0F2279568
+:101C800028F4515029F4220F0000F9CF012756E023
+:101C9000279508BB20F4515021F4220FF9CF0127DA
+:101CA00056E02991332308BB21F60C7F1091730075
+:101CB000110FC651D04008BB11F010936C0010E218
+:101CC0001ABF016017B31C7F402F4C7F5F9100C08B
+:101CD00000C008BB17BB48BB82CF2FEFB0E8A0E025
+:101CE0004BE0B1BF00008EE599E0B099FECFB09B0C
+:101CF000FECF0197B099FDCFB19B09C096B3937009
+:101D0000E9F796B39370D1F7B09BFECFECCF97FF76
+:101D100003C0BA1B819501C0BA0FA69539F4A0E49F
+:101D200028F4281710F031B7282FA1E04150C9F648
+:101D300031BF00000895F201309711F48FEF9CEC51
+:101D400021E00C0120935700E8951124CF01029661
+:101D50002C01089581B7282E14BE88E181BD87E04B
+:101D600081BDB89A2FE78CEF9AE0215080409040D7
+:101D7000E1F700C00000B8988AE580936F008FEF0C
+:101D80008093600080B5826080BD8BB780628BBF1E
+:101D9000C298712C312C412C512C14E1C0EADFE0A7
+:101DA00086B3837009F014E1115029F41092730086
+:101DB00010926C0092DF0AB605FE03C061DE712C42
+:101DC00003C02197209761F7A89522E032120CC03A
+:101DD000E0E0FAE1E054F10983E080935700E895F0
+:101DE0003097C1F7412C512C832D803459F4F201E6
+:101DF0003297E1158AE1F80750F485E080935700A7
+:101E0000E89505C0843019F4CD2B11F4EFC0312CC6
+:101E100080917200835087FD98C090916D009D3233
+:101E200009F091C0883009F08EC083EC8093610086
+:101E30008AE580936F00909177009076809178008A
+:101E4000992361F1811108C082E09AE190937100B9
+:101E50008093700026E06CC0813059F44114510425
+:101E600009F44CC080917B00807C482E50907C000F
+:101E700045C0833081F48091790090917A005BDFD6
+:101E800080917B0090917C0056DF842D8F73B1F59B
+:101E900080E4382E33C08F73382E30C09091790093
+:101EA00010926A00811106C010926B008AE690E0E1
+:101EB00022E03AC0853019F49093730027C0863031
+:101EC000F9F480917A00813019F48AE19AE104C032
+:101ED000823041F488E09AE1909371008093700021
+:101EE00022E126C0833051F4911108C08CE29AE1BE
+:101EF000909371008093700024E01AC020E018C015
+:101F0000883079F0893031F4909375008AE690E05A
+:101F100020E00AC021E08A3009F020E08AE690E063
+:101F200003C085E790E021E09093710080937000FA
+:101F300080917E00811105C080917D00821708F498
+:101F4000282F209360001092720080916F0084FF10
+:101F500031C0809160008F3F69F1C82F893008F04F
+:101F6000C8E08C1B809360008091610098E889270D
+:101F700080936100CC2391F0E0917000F0917100AA
+:101F800082E690E0DC0124912D9331962C2F280FCE
+:101F90002A13F9CFF0937100E09370006C2F82E662
+:101FA00090E06ADDCC5FCC3019F08FEF8093600059
+:101FB000C0936F00C30101963C01803B944029F41B
+:101FC000EDEFF9E1E491EF3F89F4862D8C7411F087
+:101FD000BA9801C0BA9A0AB605FEDFCE88E1B19977
+:101FE00088E18150E1F780E28ABFD7CEBA98B89AEB
+:0C1FF0001BBE10BC21BE000001CDFFCFC5
+:0400000300001A00DF
+:00000001FF
diff --git a/firmware/releases/t85_aggressive.hex b/firmware/releases/t85_aggressive.hex
new file mode 100644
index 0000000..ca675ac
--- /dev/null
+++ b/firmware/releases/t85_aggressive.hex
@@ -0,0 +1,91 @@
+:101A400017C01A3A4005930B0902120001010080E9
+:101A50003209040000000000000012011001FF0024
+:101A60000008D01653070002000000010403090417
+:101A7000112420E0A0E6B0E001C01D92AC38B2070E
+:101A8000E1F75BC1A82FB92F80E090E041E050EA78
+:101A9000609530E009C02D9182279795879510F0C9
+:101AA00084279527305EC8F36F5FA8F30895EADFB7
+:101AB0008D939D930895CF93CFB7CF93DF93C39525
+:101AC000B39BE9F7B39B0BC0B39B09C0B39B07C0A3
+:101AD000B39B05C0B39B03C0B39B01C08FC06F9382
+:101AE000C0916E00DD27CA58DF4F2F9365E5B39B89
+:101AF00003C02F916F91E6CF0F931F934F9320E078
+:101B000040E15F9306B3087103FB27F93F9350E070
+:101B10003BE039C0187140642F77012F5F5F1EC012
+:101B2000406816B318712F7752501FC0406406B337
+:101B30002F770871D1F15F5F00C023C0406216B3F8
+:101B40002F77187191F15F5F00C025C008711027D1
+:101B5000515012F45D5F0000115027952C3F16B3D1
+:101B6000C8F618710127015027952C3FC8F6422767
+:101B7000499306B3087110274F73115027952C3FD6
+:101B8000A8F64695469516B3187179F001270150CD
+:101B900027952C3F98F66B5A60F3315006B3B0F698
+:101BA00000C010E21ABF00271DC03B503195C31B77
+:101BB000D04010E21ABF0881033C29F10B3419F11F
+:101BC00020916C001981110F1213EDCF093651F1DC
+:101BD0000D3211F0013E39F7CAE01AB715FD02C007
+:101BE000CA95D9F7009374003F915F914F911F916F
+:101BF0000F912F916F91CAB7C5FD61CFDF91CF9142
+:101C0000CFBFCF91089520917400222369F31091E2
+:101C10007200112309F534300AF1309372002093D9
+:101C20006D001CC0009172000130B4F40AE53091DF
+:101C30006F0034FD14C000936F00C1E6D0E013C004
+:101C4000052710E000C0000008BB1AC0052710E0FF
+:101C5000221F1DC010E021C04AE502C032ED432F13
+:101C6000C4E1D0E032E017B31861C39A08B317BBE0
+:101C700058E120E865E320FF052708BB2795179565
+:101C80001C3FF0F66695B8F7B1F720FF052708BBB3
+:101C9000279517951C3FD0F62795179517FF052711
+:101CA00000001C3F08BBB0F629913A9519F7077E52
+:101CB00010917300110FC651D04008BB11F0109362
+:101CC0006C0010E21ABF086017B3177E402F477EE2
+:101CD00054E05A95F1F708BB17BB48BB85CF2FEFEF
+:101CE000B0E8A0E04BE0B1BF00008DE79CE0B39905
+:101CF000FECFB39BFECF0197B399FDCF97FF03C0F3
+:101D0000BA1B819501C0BA0FA69539F4A0E428F456
+:101D1000281710F031B7282FA1E0415021F731BF2B
+:101D200000000895F20121E00C0120935700E8958E
+:101D30001124C20102962C01089514BE88E181BDD0
+:101D400087E081BDBB9A2FEF85EA9EE0215080405D
+:101D50009040E1F700C00000BB988AE580936F00D7
+:101D60008FEF80936000AC9A8BB780628BBF712C31
+:101D7000312C412C512C14E1C5EDD4E186B388718E
+:101D800009F014E1115029F41092730010926C00C4
+:101D9000A6DF0AB605FE03C08EDE712C03C02197B4
+:101DA000209761F7A89522E032120CC0E0E4FAE136
+:101DB000E054F10983E080935700E8953097C1F72C
+:101DC000412C512C832D803459F4F2013297E034A8
+:101DD0008AE1F80750F485E080935700E89505C044
+:101DE000843019F4CD2B11F4E9C0312C80917200AC
+:101DF000835087FD98C090916D009D3209F091C08D
+:101E0000883009F08EC083EC809361008AE580936E
+:101E10006F0090917700907680917800992361F11E
+:101E2000811108C082E49AE1909371008093700060
+:101E300026E06CC0813059F44114510409F44CC0BF
+:101E400080917B00807C482E50907C0045C0833080
+:101E500081F48091790090917A0064DF80917B0019
+:101E600090917C005FDF842D8F73B1F580E4382E74
+:101E700033C08F73382E30C09091790010926A0071
+:101E8000811106C010926B008AE690E022E03AC011
+:101E9000853019F49093730027C08630F9F480914F
+:101EA0007A00813019F48AE59AE104C0823041F465
+:101EB00088E49AE1909371008093700022E126C03B
+:101EC000833051F4911108C08CE69AE1909371002F
+:101ED0008093700024E01AC020E018C0883079F0A8
+:101EE000893031F4909375008AE690E020E00AC0D2
+:101EF00021E08A3009F020E08AE690E003C085E71F
+:101F000090E021E0909371008093700080917E00BA
+:101F1000811105C080917D00821708F4282F20933D
+:101F200060001092720080916F0084FF31C0809138
+:101F300060008F3F69F1C82F893008F0C8E08C1B22
+:101F4000809360008091610098E889278093610008
+:101F5000CC2391F0E0917000F091710082E690E066
+:101F6000DC0124912D9331962C2F280F2A13F9CFC1
+:101F7000F0937100E09370006C2F82E690E097DDA3
+:101F8000CC5FCC3019F08FEF80936000C0936F006E
+:101F9000C30101963C01803B944029F4EDE3FAE152
+:101FA000E491EF3F59F40AB605FEE5CE80E2B4991C
+:101FB00080E28150E1F780E28ABFDDCEBB9A1BBE92
+:061FC00015BA3CCDFFCF75
+:0400000300001A409F
+:00000001FF
diff --git a/firmware/releases/t85_default.hex b/firmware/releases/t85_default.hex
new file mode 100644
index 0000000..091c1b9
--- /dev/null
+++ b/firmware/releases/t85_default.hex
@@ -0,0 +1,103 @@
+:1019800017C0197A4005930B09021200010100806B
+:101990003209040000000000000012011001FF00E5
+:1019A0000008D016530700020000000104030904D8
+:1019B00011241FBECFE5D2E0CDBFDEBF20E0A0E600
+:1019C000B0E001C01D92AC38B207E1F7AFC1A82F5B
+:1019D000B92F80E090E041E050EA609530E009C026
+:1019E0002D9182279795879510F084279527305E53
+:1019F000C8F36F5FA8F30895EADF8D939D93089570
+:101A0000CF93CFB7CF93C395B39BE9F7B39B0BC0ED
+:101A1000B39B09C0B39B07C0B39B05C0B39B03C076
+:101A2000B39B01C0D9C00F92DF93C0916E00DD2738
+:101A3000CA58DF4F012EB39B03C0DF910F90E6CF52
+:101A40002F930F931F934F932FEF4F6F06B303FB0B
+:101A500020F95F933F9350E03BE065C016B3012649
+:101A6000502953FDC89556B3012703FB25F92F7361
+:101A700006B3B1F05027102713FB26F906B2223027
+:101A8000F0F000C016B3012703FB27F90126502907
+:101A900006B22430E8F54F77206816B30000F6CF81
+:101AA00050274F7D206206B2102F000000C006B301
+:101AB00000265029102713FB26F906B2E2CF4F7BF0
+:101AC00006B3206400C0DACF01265029187106B28F
+:101AD00069F14E7F2160012F16B328C000265029DE
+:101AE0004D7F06B22260102F29C0012650294B7F5E
+:101AF00006B22460012F2DC016B301265029477F5E
+:101B00002860000006B22EC04F7E06B3206130C0B0
+:101B1000422706B3499300265029102706B24FEFFB
+:101B200013FB20F9297F16B379F2187159F10126B8
+:101B3000502906B2012703FB21F9237F06B371F276
+:101B4000002650293150D0F006B2102713FB22F99D
+:101B5000277E16B351F201265029012703FB06B256
+:101B600023F92F7C49F2000006B3102713FB24F958
+:101B70000026502906B22F7939F270CF10E21ABF31
+:101B800000271DC03B503195C31BD04010E21ABF47
+:101B90000881033C29F10B3419F120916C00198163
+:101BA000110F1213EDCF093651F10D3211F0013E34
+:101BB00039F7CAE01AB715FD02C0CA95D9F70093E4
+:101BC00074003F915F914F911F910F912F91DF9181
+:101BD0000F90CAB7C5FD17CFCF91CFBFCF91089552
+:101BE00020917400222369F3109172001123F1F403
+:101BF0003430F2F03093720020936D0019C00091E0
+:101C0000720001309CF40AE530916F0034FD11C080
+:101C100000936F00C1E6D0E010C0052710E000C0BF
+:101C200021C0052710E0C89508BB14C03AE501C0E3
+:101C300032ED032EC0E0D0E032E017B31861C39A52
+:101C400008B317BB58E120E84FEF20FF052708BB7A
+:101C5000279517951C3F28F700004552B0F720FF45
+:101C60000527279508BB17951C3FB8F629913A958B
+:101C700061F7077E10917300110F08BBC250D0406E
+:101C800011F010936C0010E21ABF086017B3177EB2
+:101C9000402F477E54E05A95F1F708BB17BB48BB6D
+:101CA00090CF2FEFB0E8A0E04BE0B1BF000081EE95
+:101CB0009CE0B399FECFB39BFECF0197B399FDCFC4
+:101CC000B49B09C096B39871E9F796B39871D1F7B0
+:101CD000B39BFECFECCF97FF03C0BA1B819501C029
+:101CE000BA0FA69539F4A0E428F4281710F031B7FC
+:101CF000282FA1E04150C9F631BF00000895F2013C
+:101D0000309741F02AE7421629E1520629F481B7BB
+:101D100090E002C08FEB9CEC21E00C012093570077
+:101D2000E8951124CF0102962C010895EAE7F9E124
+:101D3000E491EF3F11F0E1BF000014BE88E181BDE6
+:101D400087E081BDBB9A2FE28BE19FE0215080406C
+:101D50009040E1F700C00000BB988AE580936F00D7
+:101D60008FEF80936000AC9A8BB780628BBF712C31
+:101D7000312C412C512C14E1CCE7D5E186B388718C
+:101D800009F014E1115029F41092730010926C00C4
+:101D900088DF0AB605FE03C033DE712C03C021972D
+:101DA000209761F7A89522E032120CC0E0E8F9E133
+:101DB000E054F10983E080935700E8953097C1F72C
+:101DC000412C512C832D803459F4F2013297E038A4
+:101DD00089E1F80750F485E080935700E89505C045
+:101DE000843019F4CD2B11F4E9C0312C80917200AC
+:101DF000835087FD98C090916D009D3209F091C08D
+:101E0000883009F08EC083EC809361008AE580936E
+:101E10006F0090917700907680917800992361F11E
+:101E2000811108C082E899E190937100809370005D
+:101E300026E06CC0813059F44114510409F44CC0BF
+:101E400080917B00807C482E50907C0045C0833080
+:101E500081F48091790090917A0051DF80917B002C
+:101E600090917C004CDF842D8F73B1F580E4382E87
+:101E700033C08F73382E30C09091790010926A0071
+:101E8000811106C010926B008AE690E022E03AC011
+:101E9000853019F49093730027C08630F9F480914F
+:101EA0007A00813019F48AE999E104C0823041F462
+:101EB00088E899E1909371008093700022E126C038
+:101EC000833051F4911108C08CEA99E1909371002C
+:101ED0008093700024E01AC020E018C0883079F0A8
+:101EE000893031F4909375008AE690E020E00AC0D2
+:101EF00021E08A3009F020E08AE690E003C085E71F
+:101F000090E021E0909371008093700080917E00BA
+:101F1000811105C080917D00821708F4282F20933D
+:101F200060001092720080916F0084FF31C0809138
+:101F300060008F3F69F1C82F893008F0C8E08C1B22
+:101F4000809360008091610098E889278093610008
+:101F5000CC2391F0E0917000F091710082E690E066
+:101F6000DC0124912D9331962C2F280F2A13F9CFC1
+:101F7000F0937100E09370006C2F82E690E03CDDFE
+:101F8000CC5FCC3019F08FEF80936000C0936F006E
+:101F9000C30101963C01803B944029F4EDE7F9E14F
+:101FA000E491EF3F59F40AB605FEE5CE81E2B4991B
+:101FB00081E28150E1F780E28ABFDDCEBB9A1BBE91
+:061FC00015BADCCCFFCFD6
+:040000030000198060
+:00000001FF
diff --git a/upgrade/upgrade.c b/firmware/upgrade.c
index 698ed28..698ed28 100644
--- a/upgrade/upgrade.c
+++ b/firmware/upgrade.c
diff --git a/firmware/usbconfig.h b/firmware/usbconfig.h
index dc5cafc..65864df 100644
--- a/firmware/usbconfig.h
+++ b/firmware/usbconfig.h
@@ -77,7 +77,7 @@
* The value is in milliamperes. [It will be divided by two since USB
* communicates power requirements in units of 2 mA.]
*/
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
+#define USB_CFG_IMPLEMENT_FN_WRITE 0
/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
* transfers. Set it to 0 if you don't need it and want to save a couple of
* bytes.
@@ -112,10 +112,12 @@
/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
// Check CRC of all received data
+/*
#define USB_RX_USER_HOOK( data, len ) { \
if ( usbCrc16( data, len + 2 ) != 0x4FFE )\
return;\
}
+*/
/* This macro is a hook if you want to do unconventional things. If it is
* defined, it's inserted at the beginning of received message processing.
* If you eat the received message and don't want default processing to
@@ -163,20 +165,18 @@ return;\
* usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
* for each control- and out-endpoint to check for duplicate packets.
*/
-//#if USB_CFG_CLOCK_KHZ==16500
-
-//#include "osccal.h"
+
#ifndef __ASSEMBLER__
void calibrateOscillatorASM(void);
-
+/*
#if AUTO_EXIT_NO_USB_MS>0
extern uint16_union_t idlePolls;
#define USB_RESET_HOOK(resetStarts) if(!resetStarts){ idlePolls.b[1]=0; calibrateOscillatorASM();}
#else
#define USB_RESET_HOOK(resetStarts) if(!resetStarts){ calibrateOscillatorASM();}
#endif
-
+*/
#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
#endif
diff --git a/firmware/usbdrv/asmcommon.inc b/firmware/usbdrv/asmcommon.inc
index d2a4f7c..5f269af 100644
--- a/firmware/usbdrv/asmcommon.inc
+++ b/firmware/usbdrv/asmcommon.inc
@@ -5,6 +5,9 @@
* Tabsize: 4
* Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH
* License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
+ *
+ * Modified to an interrupt-less driver for micronucleus V2. (c) 2014 T. Bo"scke
+ *
*/
/* Do not link this file! Link usbdrvasm.S instead, which includes the
@@ -84,7 +87,20 @@ se0:
;Setup and Out are followed by a data packet two bit times (16 cycles) after
;the end of SE0. The sync code allows up to 40 cycles delay from the start of
;the sync pattern until the first bit is sampled. That's a total of 56 cycles.
+;
+;TB 2014-02-02
+;The interrupt-less driver always has to wait for the next packet at this point
+;or usbpoll() will get confused.
+
handleSetupOrOut: ;[32]
+ ldi YL,10 ; Time out
+waitForData:
+ USB_LOAD_PENDING(x2) ;[xx]
+ sbrc x2, USB_INTR_PENDING_BIT;[xx] check whether data is already arriving
+ rjmp storeTokenAndReturn
+ dec YL
+ brne waitForData
+
#if USB_CFG_IMPLEMENT_FN_WRITEOUT /* if we have data for endpoint != 0, set usbCurrentTok to address */
andi x3, 0xf ;[32]
breq storeTokenAndReturn ;[33]
@@ -99,7 +115,9 @@ doReturn:
rjmp waitForJ ;[51] save the pops and pushes -- a new interrupt is already pending
sofError:
POP_RETI ;macro call
- reti
+
+ ret ;02-02-2014 not called from INT in micronucleus.
+; reti
handleData:
#if USB_CFG_CHECK_CRC
@@ -120,10 +138,13 @@ handleData:
#endif
sts usbRxLen, cnt ;[28] store received data, swap buffers
sts usbRxToken, shift ;[30]
- lds x2, usbInputBufOffset;[32] swap buffers
- ldi cnt, USB_BUFSIZE ;[34]
- sub cnt, x2 ;[35]
- sts usbInputBufOffset, cnt;[36] buffers now swapped
+
+; Microncleus V2 does not need double buffering due to in-order processing of USB-rx
+; TB 2014-01-04
+; lds x2, usbInputBufOffset;[32] swap buffers
+; ldi cnt, USB_BUFSIZE ;[34]
+; sub cnt, x2 ;[35]
+; sts usbInputBufOffset, cnt;[36] buffers now swapped
rjmp sendAckAndReti ;[38] 40 + 17 = 57 until SOP
handleIn:
diff --git a/firmware/usbdrv/usbdrv.c b/firmware/usbdrv/usbdrv.c
index d838935..354dce7 100644
--- a/firmware/usbdrv/usbdrv.c
+++ b/firmware/usbdrv/usbdrv.c
@@ -3,10 +3,25 @@
* Author: Christian Starkjohann
* Creation Date: 2004-12-29
* Tabsize: 4
+ *
+
* Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
* License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
*/
+/* This copy of usbdrv.c was optimized to reduce the memory footprint with micronucleus V2
+ *
+ * Changes:
+ * a) Replies to USB SETUP IN Packets are now only possible from Flash
+ * * Commented out routines to copy from SRAM
+ * * remove msgflag variable and all handling involving it
+ */
+#define MNHACK_ONLY_FLASH_MSGPTR
+/* b) Do not use preinitialized global variables to avoid having to initialize
+ * the data section.
+ */
+#define MNHACK_NO_DATASECTION
+
#include "usbdrv.h"
#include "oddebug.h"
@@ -27,7 +42,11 @@ uchar usbConfiguration; /* currently selected configuration. Administere
volatile schar usbRxLen; /* = 0; number of bytes in usbRxBuf; 0 means free, -1 for flow control */
uchar usbCurrentTok; /* last token received or endpoint number for last OUT token if != 0 */
uchar usbRxToken; /* token for data we received; or endpont number for last OUT */
-volatile uchar usbTxLen = USBPID_NAK; /* number of bytes to transmit with next IN token or handshake token */
+#ifdef MNHACK_NO_DATASECTION
+ volatile uchar usbTxLen; /* number of bytes to transmit with next IN token or handshake token */
+#else
+ volatile uchar usbTxLen = USBPID_NAK; /* number of bytes to transmit with next IN token or handshake token */
+#endif
uchar usbTxBuf[USB_BUFSIZE];/* data to transmit with next IN, free if usbTxLen contains handshake token */
#if USB_COUNT_SOF
volatile uchar usbSofCount; /* incremented by assembler module every SOF */
@@ -44,8 +63,15 @@ uchar usbCurrentDataToken;/* when we check data toggling to ignore duplica
/* USB status registers / not shared with asm code */
usbMsgPtr_t usbMsgPtr; /* data to transmit next -- ROM or RAM address */
-static usbMsgLen_t usbMsgLen = USB_NO_MSG; /* remaining number of bytes */
+#ifdef MNHACK_NO_DATASECTION
+ static usbMsgLen_t usbMsgLen; /* remaining number of bytes */
+#else
+ static usbMsgLen_t usbMsgLen = USB_NO_MSG; /* remaining number of bytes */
+#endif
+
+#ifndef MNHACK_ONLY_FLASH_MSGPTR
static uchar usbMsgFlags; /* flag values see below */
+#endif
#define USB_FLG_MSGPTR_IS_ROM (1<<6)
#define USB_FLG_USE_USER_RW (1<<7)
@@ -291,17 +317,18 @@ USB_PUBLIC void usbSetInterrupt3(uchar *data, uchar len)
* This may cause problems with undefined symbols if compiled without
* optimizing!
*/
-#define GET_DESCRIPTOR(cfgProp, staticName) \
- if(cfgProp){ \
- if((cfgProp) & USB_PROP_IS_RAM) \
- flags = 0; \
- if((cfgProp) & USB_PROP_IS_DYNAMIC){ \
- len = usbFunctionDescriptor(rq); \
- }else{ \
- len = USB_PROP_LENGTH(cfgProp); \
- usbMsgPtr = (usbMsgPtr_t)(staticName); \
- } \
- }
+
+ #define GET_DESCRIPTOR(cfgProp, staticName) \
+ if(cfgProp){ \
+ if((cfgProp) & USB_PROP_IS_RAM) \
+ flags = 0; \
+ if((cfgProp) & USB_PROP_IS_DYNAMIC){ \
+ len = usbFunctionDescriptor(rq); \
+ }else{ \
+ len = USB_PROP_LENGTH(cfgProp); \
+ usbMsgPtr = (usbMsgPtr_t)(staticName); \
+ } \
+ }
/* usbDriverDescriptor() is similar to usbFunctionDescriptor(), but used
* internally for all types of descriptors.
@@ -348,7 +375,11 @@ uchar flags = USB_FLG_MSGPTR_IS_ROM;
len = usbFunctionDescriptor(rq);
}
SWITCH_END
+
+ flags=flags; // Make compiler shut up about unused variable
+#ifndef MNHACK_ONLY_FLASH_MSGPTR
usbMsgFlags = flags;
+#endif
return len;
}
@@ -441,7 +472,9 @@ usbRequest_t *rq = (void *)data;
usbMsgLen_t replyLen;
usbTxBuf[0] = USBPID_DATA0; /* initialize data toggling */
usbTxLen = USBPID_NAK; /* abort pending transmit */
+#ifndef MNHACK_ONLY_FLASH_MSGPTR
usbMsgFlags = 0;
+#endif
uchar type = rq->bmRequestType & USBRQ_TYPE_MASK;
if(type != USBRQ_TYPE_STANDARD){ /* standard requests are handled by driver */
replyLen = usbFunctionSetup(data);
@@ -499,18 +532,22 @@ static uchar usbDeviceRead(uchar *data, uchar len)
{
uchar i = len;
usbMsgPtr_t r = usbMsgPtr;
+#ifndef MNHACK_ONLY_FLASH_MSGPTR
if(usbMsgFlags & USB_FLG_MSGPTR_IS_ROM){ /* ROM data */
+#endif
do{
uchar c = USB_READ_FLASH(r); /* assign to char size variable to enforce byte ops */
*data++ = c;
r++;
}while(--i);
- }else{ /* RAM data */
+#ifndef MNHACK_ONLY_FLASH_MSGPTR
+ }else{ // RAM data
do{
*data++ = *((uchar *)r);
r++;
}while(--i);
}
+#endif
usbMsgPtr = r;
}
}
@@ -609,6 +646,11 @@ isNotReset:
USB_PUBLIC void usbInit(void)
{
+#ifdef MNHACK_NO_DATASECTION
+ usbTxLen = USBPID_NAK;
+ usbMsgLen = USB_NO_MSG;
+#endif
+
#if USB_INTR_CFG_SET != 0
USB_INTR_CFG |= USB_INTR_CFG_SET;
#endif
diff --git a/firmware/usbdrv/usbdrvasm165.inc b/firmware/usbdrv/usbdrvasm165.inc
index 450d2fd..ae91588 100644
--- a/firmware/usbdrv/usbdrvasm165.inc
+++ b/firmware/usbdrv/usbdrvasm165.inc
@@ -4,9 +4,7 @@
* Creation Date: 2007-04-22
* Tabsize: 4
* Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH
- * Portions Copyright: (c) 2012 Louis Beaudoin
* License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * Revision: $Id: usbdrvasm165.inc 740 2009-04-13 18:23:31Z cs $
*/
/* Do not link this file! Link usbdrvasm.S instead, which includes the
@@ -36,41 +34,12 @@ of CPU cycles, but even an exact number of cycles!
; Numbers in brackets are clocks counted from center of last sync bit
; when instruction starts
-; the code enabled by TINY85MODE is inteded only for use with the tiny85-compatible USBaspLoader
-; project.
-; with TINY85MODE set, the beginning of the ISR checks for a magic word "B007" at the very bottom of the stack
-; and jumps to the application's ISR if the magic word isn't present
-; the max allowable interrupt latency is lower given this additional code before getting to the
-; USB-specific portion of the ISR.
USB_INTR_VECTOR:
;order of registers pushed: YL, SREG [sofError], r0, YH, shift, x1, x2, x3, x4, cnt
- push YL ; push only what is necessary to sync with edge ASAP
- in YL, SREG ;
- push YL ;
-
-#ifdef TINY85MODE
-; look for magic word "B007" at the bottom of the stack
- lds YL, RAMEND
- cpi YL, 0xB0
- brne cleanupAndJumpToApp
-
- lds YL, RAMEND-1
- cpi YL, 0x07
- breq cleanupBootloaderIntStack
-
-cleanupAndJumpToApp:
-; magic word was not found, put registers back to where they were before this ISR ran, and jump to application ISR
- pop YL
- out SREG, YL
- pop YL
-
- rjmp __vectors - TINYVECTOR_USBPLUS_OFFSET
-
-cleanupBootloaderIntStack:
-; magic word was found, put registers
- CLR YL ; [-19] ensure we meet below requirements for YL < 0x80
-#endif
+ push YL ;[-23] push only what is necessary to sync with edge ASAP
+ in YL, SREG ;[-21]
+ push YL ;[-20]
;----------------------------------------------------------------------------
; Synchronize with sync pattern:
;----------------------------------------------------------------------------
@@ -80,9 +49,9 @@ cleanupBootloaderIntStack:
;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to
;waitForJ, ensure that this prerequisite is met.
waitForJ:
- inc YL ; [-18]
- sbis USBIN, USBMINUS ; [-17]
- brne waitForJ ; [-16] just make sure we have ANY timeout
+ inc YL
+ sbis USBIN, USBMINUS
+ brne waitForJ ; just make sure we have ANY timeout
waitForK:
;The following code results in a sampling window of < 1/4 bit which meets the spec.
sbis USBIN, USBMINUS ;[-15]
diff --git a/micronucleus-t85_winDriver.zip b/micronucleus-t85_winDriver.zip
deleted file mode 100644
index f16738b..0000000
--- a/micronucleus-t85_winDriver.zip
+++ /dev/null
Binary files differ
diff --git a/ruby/dump.rb b/ruby/dump.rb
deleted file mode 100644
index 471d6d4..0000000
--- a/ruby/dump.rb
+++ /dev/null
@@ -1,3 +0,0 @@
-`rm temp-dump.bin`
-`avrdude -c usbtiny -p t85 -U flash:r:temp-dump.bin:r`
-puts open('temp-dump.bin').read(30).bytes.to_a.map { |x| x.to_s(16) }.join(' ')
diff --git a/ruby/hex-to-bin.rb b/ruby/hex-to-bin.rb
deleted file mode 100644
index 528a50f..0000000
--- a/ruby/hex-to-bin.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-require_relative "../ruby/micronucleus.rb"
-
-# just converts a hex file to a binary file
-program = HexProgram.new open ARGV.first
-
-File.open ARGV.first.split('/').last.sub(/\.hex$/, '') + '.raw', 'w' do |file|
- file.write program.binary
- file.close
-end
diff --git a/ruby/micronucleus.rb b/ruby/micronucleus.rb
deleted file mode 100644
index 4b63af2..0000000
--- a/ruby/micronucleus.rb
+++ /dev/null
@@ -1,171 +0,0 @@
-require 'libusb'
-
-# Abstracts access to micronucleus avr tiny85 bootloader - can be used only to erase and upload bytes
-class Micronucleus
- Functions = [
- :get_info,
- :write_page,
- :erase_application,
- :run_program
- ]
-
- # return all micronucleus devices connected to computer
- def self.all
- usb = LIBUSB::Context.new
- usb.devices.select { |device|
- device.idVendor == 0x16d0 && device.idProduct == 0x0753
- }.map { |device|
- self.new(device)
- }
- end
-
- def initialize devref
- @device = devref
- end
-
- def info
- unless @info
- result = control_transfer(function: :get_info, dataIn: 4)
- flash_length, page_size, write_sleep = result.unpack('S>CC')
-
- @info = {
- flash_length: flash_length,
- page_size: page_size,
- pages: (flash_length.to_f / page_size).ceil,
- write_sleep: write_sleep.to_f / 1000.0,
- version: "#{@device.bcdDevice >> 8}.#{@device.bcdDevice & 0xFF}",
- version_numeric: @device.bcdDevice
- }
- end
-
- @info
- end
-
- def erase!
- puts "erasing"
- info = self.info
- control_transfer(function: :erase_application)
- info[:pages].times do
- sleep(info[:write_sleep]) # sleep for as many pages as the chip has to erase
- end
- puts "erased chip"
- end
-
- # upload a new program
- def program= bytestring
- info = self.info
- raise "Program too long!" if bytestring.bytesize > info[:flash_length]
- bytes = bytestring.bytes.to_a
- bytes.push(0xFF) while bytes.length < info[:flash_length]
-
- erase!
-
- address = 0
- bytes.each_slice(info[:page_size]) do |slice|
- slice.push(0xFF) while slice.length < info[:page_size] # ensure every slice is one page_size long - pad out if needed
-
- puts "uploading @ #{address} of #{bytes.length}"
- control_transfer(function: :write_page, wIndex: address, wValue: slice.length, dataOut: slice.pack('C*'))
- sleep(info[:write_sleep])
- address += slice.length
- end
- end
-
- def finished
- info = self.info
-
- puts "asking device to finish writing"
- control_transfer(function: :run_program)
- puts "waiting for device to finish"
-
- # sleep for as many pages as the chip could potentially need to write - this could be smarter
- info[:pages].times do
- sleep(info[:write_sleep])
- end
-
- @io.close
- @io = nil
- end
-
- def inspect
- "<MicroBoot #{info[:version]}: #{(info[:flash_length] / 1024.0).round(1)} kb programmable>"
- end
-
- protected
- # raw opened device
- def io
- unless @io
- @io = @device.open
- end
-
- @io
- end
-
- def control_transfer(opts = {})
- opts[:bRequest] = Functions.index(opts.delete(:function)) if opts[:function]
- io.control_transfer({
- wIndex: 0,
- wValue: 0,
- bmRequestType: usb_request_type(opts),
- timeout: 5000
- }.merge opts)
- end
-
- # calculate usb request type
- def usb_request_type opts #:nodoc:
- value = LIBUSB::REQUEST_TYPE_VENDOR | LIBUSB::RECIPIENT_DEVICE
- value |= LIBUSB::ENDPOINT_OUT if opts.has_key? :dataOut
- value |= LIBUSB::ENDPOINT_IN if opts.has_key? :dataIn
- return value
- end
-end
-
-class HexProgram
- def initialize input
- @bytes = Hash.new(0xFF)
- input = input.read if input.is_a? IO
- parse input
- end
-
- def binary
- bytes.pack('C*')
- end
-
- def bytes
- highest_address = @bytes.keys.max
-
- bytes = Array.new(highest_address + 1) { |index|
- @bytes[index]
- }
- end
-
- protected
-
- def parse input_text
- input_text.each_line do |line|
- next unless line.start_with? ':'
- line.chomp!
- length = line[1..2].to_i(16) # usually 16 or 32
- address = line[3..6].to_i(16) # 16-bit start address
- record_type = line[7..8].to_i(16)
- data = line[9... 9 + (length * 2)]
- checksum = line[9 + (length * 2).. 10 + (length * 2)].to_i(16)
- checksum_section = line[1...9 + (length * 2)]
-
- checksum_calculated = checksum_section.chars.to_a.each_slice(2).map { |slice|
- slice.join('').to_i(16)
- }.reduce(0, &:+)
-
- checksum_calculated = (((checksum_calculated % 256) ^ 0xFF) + 1) % 256
-
- raise "Hex file checksum mismatch @ #{line} should be #{checksum_calculated.to_s(16)}" unless checksum == checksum_calculated
-
- if record_type == 0 # data record
- data_bytes = data.chars.each_slice(2).map { |slice| slice.join('').to_i(16) }
- data_bytes.each_with_index do |byte, index|
- @bytes[address + index] = byte
- end
- end
- end
- end
-end \ No newline at end of file
diff --git a/ruby/upload.rb b/ruby/upload.rb
deleted file mode 100644
index 32aefa9..0000000
--- a/ruby/upload.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-require_relative './micronucleus'
-
-if ARGV[0]
- if ARGV[0].end_with? '.hex'
- puts "parsing input file as intel hex"
- test_data = HexProgram.new(open ARGV[0]).binary
- else
- puts "parsing input file as raw binary"
- test_data = open(ARGV[0]).read
- end
-else
- raise "Pass intel hex or raw binary as argument to script"
-end
-
-#test_data += ("\xFF" * 64)
-
-puts "Plug in programmable device now: (waiting)"
-sleep 0.25 while Micronucleus.all.length == 0
-
-nucleus = Micronucleus.all.first
-puts "Attached to device: #{nucleus.inspect}"
-
-#puts "Attempting to write '#{test_data.inspect}' to first thinklet's program memory"
-#puts "Bytes: #{test_data.bytes.to_a.inspect}"
-sleep(0.25) # some time to think?
-puts "Attempting to write supplied program in to device's memory"
-nucleus.program = test_data
-
-puts "Great! Starting program..."
-
-
-nucleus.finished # let thinklet know it can go do other things now if it likes
-puts "All done!"
diff --git a/upgrade/Makefile b/upgrade/Makefile
deleted file mode 100644
index e1c8254..0000000
--- a/upgrade/Makefile
+++ /dev/null
@@ -1,206 +0,0 @@
-# Name: Makefile
-# Project: Upgrade - based on Micronucleus makefile
-# Author: Jenna Fox; portions by Christian Starkjohann, Louis Beaudoin
-# Creation Date: 2012-10-4
-# Tabsize: 4
-# License: GNU GPL v2 (see License.txt)
-
-###############################################################################
-# Configure the following variables according to your AVR.
-# Program the device with
-# make fuse # to set the clock generator, boot section size etc.
-# make flash # to load the boot loader into flash
-# make lock # to protect the boot loader from overwriting
-# make disablereset # for ATtiny85 target - to use external reset line for IO (CAUTION: this is not easy to enable again, see README)
-
-F_CPU = 16500000
-DEVICE = attiny85
-FUSEOPT = $(FUSEOPT_t85)
-LOCKOPT = -U lock:w:0x2f:m
-
-# app starts two pages in, so we can mess around with the first page for leet ISR hax
-APP_ADDRESS = 80
-
-PROGRAMMER = -c USBasp
-# PROGRAMMER contains AVRDUDE options to address your programmer
-
-FUSEOPT_8 = -U hfuse:w:0xc0:m -U lfuse:w:0x9f:m
-FUSEOPT_88 = -U hfuse:w:0xd6:m -U lfuse:w:0xdf:m -U efuse:w:0x00:m
-FUSEOPT_168 = -U hfuse:w:0xd6:m -U lfuse:w:0xdf:m -U efuse:w:0x00:m
-FUSEOPT_328 = -U lfuse:w:0xf7:m -U hfuse:w:0xda:m -U efuse:w:0x03:m
-FUSEOPT_t85 = -U lfuse:w:0xe1:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m
-FUSEOPT_t85_DISABLERESET = -U lfuse:w:0xe1:m -U efuse:w:0xfe:m -U hfuse:w:0x5d:m
-# You may have to change the order of these -U commands.
-
-#---------------------------------------------------------------------
-# ATMega8
-#---------------------------------------------------------------------
-# Fuse high byte:
-# 0xc0 = 1 1 0 0 0 0 0 0 <-- BOOTRST (boot reset vector at 0x1800)
-# ^ ^ ^ ^ ^ ^ ^------ BOOTSZ0
-# | | | | | +-------- BOOTSZ1
-# | | | | + --------- EESAVE (preserve EEPROM over chip erase)
-# | | | +-------------- CKOPT (full output swing)
-# | | +---------------- SPIEN (allow serial programming)
-# | +------------------ WDTON (WDT not always on)
-# +-------------------- RSTDISBL (reset pin is enabled)
-# Fuse low byte:
-# 0x9f = 1 0 0 1 1 1 1 1
-# ^ ^ \ / \--+--/
-# | | | +------- CKSEL 3..0 (external >8M crystal)
-# | | +--------------- SUT 1..0 (crystal osc, BOD enabled)
-# | +------------------ BODEN (BrownOut Detector enabled)
-# +-------------------- BODLEVEL (2.7V)
-#---------------------------------------------------------------------
-# ATMega88, ATMega168
-#---------------------------------------------------------------------
-# Fuse extended byte:
-# 0x00 = 0 0 0 0 0 0 0 0 <-- BOOTRST (boot reset vector at 0x1800)
-# \+/
-# +------- BOOTSZ (00 = 2k bytes)
-# Fuse high byte:
-# 0xd6 = 1 1 0 1 0 1 1 0
-# ^ ^ ^ ^ ^ \-+-/
-# | | | | | +------ BODLEVEL 0..2 (110 = 1.8 V)
-# | | | | + --------- EESAVE (preserve EEPROM over chip erase)
-# | | | +-------------- WDTON (if 0: watchdog always on)
-# | | +---------------- SPIEN (allow serial programming)
-# | +------------------ DWEN (debug wire enable)
-# +-------------------- RSTDISBL (reset pin is enabled)
-# Fuse low byte:
-# 0xdf = 1 1 0 1 1 1 1 1
-# ^ ^ \ / \--+--/
-# | | | +------- CKSEL 3..0 (external >8M crystal)
-# | | +--------------- SUT 1..0 (crystal osc, BOD enabled)
-# | +------------------ CKOUT (if 0: Clock output enabled)
-# +-------------------- CKDIV8 (if 0: divide by 8)
-#---------------------------------------------------------------------
-# ATMega328P
-#---------------------------------------------------------------------
-# Fuse extended byte:
-# 0x03 = - - - - - 0 1 1
-# \-+-/
-# +------ BODLEVEL 0..2 (011 = 4.3V)
-# Fuse high byte:
-# 0xda = 1 1 0 1 1 0 1 0 <-- BOOTRST (0 = jump to bootloader at start)
-# ^ ^ ^ ^ ^ \+/
-# | | | | | +------- BOOTSZ 0..1 (01 = 2KB starting at 0x7800)
-# | | | | + --------- EESAVE (don't preserve EEPROM over chip erase)
-# | | | +-------------- WDTON (1 = watchdog disabled at start)
-# | | +---------------- SPIEN (0 = allow serial programming)
-# | +------------------ DWEN (1 = debug wire disable)
-# +-------------------- RSTDISBL (1 = reset pin is enabled)
-# Fuse low byte:
-# 0xf7 = 1 1 1 1 0 1 1 1
-# ^ ^ \ / \--+--/
-# | | | +------- CKSEL 3..0 (0111 = external full-swing crystal)
-# | | +--------------- SUT 1..0 (11 = startup time 16K CK/14K + 65ms)
-# | +------------------ CKOUT (1 = clock output disabled)
-# +-------------------- CKDIV8 (1 = do not divide clock by 8)
-#---------------------------------------------------------------------
-# ATtiny85
-#---------------------------------------------------------------------
-# Fuse extended byte:
-# 0xFE = - - - - - 1 1 0
-# ^
-# |
-# +---- SELFPRGEN (enable self programming flash)
-#
-# Fuse high byte:
-# 0xdd = 1 1 0 1 1 1 0 1
-# ^ ^ ^ ^ ^ \-+-/
-# | | | | | +------ BODLEVEL 2..0 (brownout trigger level -> 2.7V)
-# | | | | +---------- EESAVE (preserve EEPROM on Chip Erase -> not preserved)
-# | | | +-------------- WDTON (watchdog timer always on -> disable)
-# | | +---------------- SPIEN (enable serial programming -> enabled)
-# | +------------------ DWEN (debug wire enable)
-# +-------------------- RSTDISBL (disable external reset -> enabled)
-#
-# Fuse high byte ("no reset": external reset disabled, can't program through SPI anymore)
-# 0x5d = 0 1 0 1 1 1 0 1
-# ^ ^ ^ ^ ^ \-+-/
-# | | | | | +------ BODLEVEL 2..0 (brownout trigger level -> 2.7V)
-# | | | | +---------- EESAVE (preserve EEPROM on Chip Erase -> not preserved)
-# | | | +-------------- WDTON (watchdog timer always on -> disable)
-# | | +---------------- SPIEN (enable serial programming -> enabled)
-# | +------------------ DWEN (debug wire enable)
-# +-------------------- RSTDISBL (disable external reset -> disabled!)
-#
-# Fuse low byte:
-# 0xe1 = 1 1 1 0 0 0 0 1
-# ^ ^ \+/ \--+--/
-# | | | +------- CKSEL 3..0 (clock selection -> HF PLL)
-# | | +--------------- SUT 1..0 (BOD enabled, fast rising power)
-# | +------------------ CKOUT (clock output on CKOUT pin -> disabled)
-# +-------------------- CKDIV8 (divide clock by 8 -> don't divide)
-
-###############################################################################
-
-# Tools:
-AVRDUDE = avrdude $(PROGRAMMER) -p $(DEVICE)
-CC = avr-gcc
-
-# Options:
-DEFINES = -DAPP_ADDRESS=0x$(APP_ADDRESS) #-DDEBUG_LEVEL=2
-# Remove the -fno-* options when you use gcc 3, it does not understand them
-CFLAGS = -Wall -Os -fno-move-loop-invariants -fno-tree-scev-cprop -fno-inline-small-functions -I. -Ilibs-device -mmcu=$(DEVICE) -DF_CPU=$(F_CPU) $(DEFINES)
-LDFLAGS = -Wl,--relax,--gc-sections -Wl,--section-start=.text=$(APP_ADDRESS),-Map=upgrade.map
-
-OBJECTS = upgrade.o
-
-# symbolic targets:
-all: upgrade.hex
-
-
-.c.o:
- $(CC) $(CFLAGS) -c $< -o $@ -Wa,-ahls=$<.lst
-
-.S.o:
- $(CC) $(CFLAGS) -x assembler-with-cpp -c $< -o $@
-# "-x assembler-with-cpp" should not be necessary since this is the default
-# file type for the .S (with capital S) extension. However, upper case
-# characters are not always preserved on Windows. To ensure WinAVR
-# compatibility define the file type manually.
-
-.c.s:
- $(CC) $(CFLAGS) -S $< -o $@
-
-flash: all
- $(AVRDUDE) -U flash:w:upgrade.hex:i
-
-readflash:
- $(AVRDUDE) -U flash:r:read.hex:i
-
-fuse:
- $(AVRDUDE) $(FUSEOPT)
-
-disablereset:
- $(AVRDUDE) $(FUSEOPT_t85_DISABLERESET)
-
-lock:
- $(AVRDUDE) $(LOCKOPT)
-
-read_fuses:
- $(UISP) --rd_fuses
-
-clean:
- rm -f upgrade.hex upgrade.bin *.o upgrade.s upgrade.map upgrade.c.lst
-
-# file targets:
-upgrade.bin: $(OBJECTS)
- $(CC) $(CFLAGS) -o upgrade.bin $(OBJECTS) $(LDFLAGS)
-
-upgrade.hex: upgrade.bin
- rm -f upgrade.hex upgrade.eep.hex
- avr-objcopy -j .text -j .data -O ihex upgrade.bin upgrade-app.hex
- cat upgrade-prefix.hex upgrade-app.hex > upgrade.hex
- rm upgrade-app.hex
- avr-size upgrade.hex
-
-disasm: upgrade.bin
- avr-objdump -d upgrade.bin
-
-cpp:
- $(CC) $(CFLAGS) -E upgrade.c
-
-
diff --git a/upgrade/bootloader_data.c b/upgrade/bootloader_data.c
deleted file mode 100644
index c0c5447..0000000
--- a/upgrade/bootloader_data.c
+++ /dev/null
@@ -1,11 +0,0 @@
-// This file contains the bootloader data itself and the address to
-// install the bootloader
-// Use generate-data.rb with ruby 1.9 or 2.0 to generate these
-// values from a hex file
-// Generated from ../firmware/releases/micronucleus-1.10_LEDonPB1.hex at 2013-12-16 13:16:29 +1100 by bluebie
-
-const uint16_t bootloader_data[944] PROGMEM = {
-0xc017, 0xc016, 0xc04c, 0xc014, 0x0209, 0x0012, 0x0101, 0x8000, 0x0932, 0x0004, 0x0000, 0x0000, 0x0000, 0x0112, 0x0110, 0x00ff, 0x0800, 0x16d0, 0x0753, 0x010a, 0x0000, 0x0100, 0x0304, 0x0409, 0x2411, 0xbe1f, 0xe5cf, 0xe0d2, 0xbfcd, 0xbfde, 0xeb00, 0x930f, 0xe007, 0x930f, 0xe010, 0xe6a0, 0xe0b0, 0xedea, 0xe1ff, 0xc002, 0x9005, 0x920d, 0x36a6, 0x07b1, 0xf7d9, 0xe020, 0xe6a6, 0xe0b0, 0xc001, 0x921d, 0x39ab, 0x07b2, 0xf7e1, 0xc1ec, 0x2fa8, 0x2fb9, 0xe080, 0xe090, 0xe041, 0xea50, 0x9560, 0xe030, 0xc009, 0x912d, 0x2782, 0x9597, 0x9587, 0xf010, 0x2784, 0x2795, 0x5e30, 0xf3c8, 0x5f6f, 0xf3a8, 0x9508, 0xdfea, 0x938d, 0x939d, 0x9508, 0x93cf, 0xb7cf, 0x93cf, 0x91c0, 0x025f, 0x3bc0, 0xf421, 0x91c0, 0x025e, 0x30c7, 0xf021, 0x91cf, 0xbfcf, 0x91cf, 0xcfa1, 0x27cc, 0x95c3, 0x9bb3, 0xf7e9, 0x9bb3, 0xc00b, 0x9bb3, 0xc009, 0x9bb3, 0xc007, 0x9bb3, 0xc005, 0x9bb3, 0xc003, 0x9bb3, 0xc001, 0xc0d3, 0x920f, 0x93df, 0x91c0, 0x007e, 0x27dd, 0x57cb, 0x4fdf, 0x2e01, 0x9bb3, 0xc003, 0x91df, 0x900f, 0xcfe6, 0x932f, 0x930f, 0x931f, 0x934f, 0xef2f, 0x6f4f, 0xb306, 0xfb03, 0xf920, 0x935f, 0x933f, 0xe050, 0xe03b, 0xc065, 0xb316, 0x2601, 0x2950, 0xfd53, 0x95c8, 0xb356, 0x2701, 0xfb03, 0xf925, 0x732f, 0xb306, 0xf0b1, 0x2750, 0x2710, 0xfb13, 0xf926, 0xb206, 0x3022, 0xf0f0, 0xc000, 0xb316, 0x2701, 0xfb03, 0xf927, 0x2601, 0x2950, 0xb206, 0x3024, 0xf5e8, 0x774f, 0x6820, 0xb316, 0x0000, 0xcff6, 0x2750, 0x7d4f, 0x6220, 0xb206, 0x2f10, 0x0000, 0xc000, 0xb306, 0x2600, 0x2950, 0x2710, 0xfb13, 0xf926, 0xb206, 0xcfe2, 0x7b4f, 0xb306, 0x6420, 0xc000, 0xcfda, 0x2601, 0x2950, 0x7118, 0xb206, 0xf169, 0x7f4e, 0x6021, 0x2f01, 0xb316, 0xc028, 0x2600, 0x2950, 0x7f4d, 0xb206, 0x6022, 0x2f10, 0xc029, 0x2601, 0x2950, 0x7f4b, 0xb206, 0x6024, 0x2f01, 0xc02d, 0xb316, 0x2601, 0x2950, 0x7f47, 0x6028, 0x0000, 0xb206, 0xc02e, 0x7e4f, 0xb306, 0x6120, 0xc030, 0x2742, 0xb306, 0x9349, 0x2600, 0x2950, 0x2710, 0xb206, 0xef4f, 0xfb13, 0xf920, 0x7f29, 0xb316, 0xf279, 0x7118, 0xf159, 0x2601, 0x2950, 0xb206, 0x2701, 0xfb03, 0xf921, 0x7f23, 0xb306, 0xf271, 0x2600, 0x2950, 0x5031, 0xf0d0, 0xb206, 0x2710, 0xfb13, 0xf922, 0x7e27, 0xb316, 0xf251, 0x2601, 0x2950, 0x2701, 0xfb03, 0xb206, 0xf923, 0x7c2f, 0xf249, 0x0000, 0xb306, 0x2710, 0xfb13, 0xf924, 0x2600, 0x2950, 0xb206, 0x792f, 0xf239, 0xcf70, 0xe210, 0xbf1a, 0x2700, 0xc017, 0x503b, 0x9531, 0x1bc3, 0x40d0, 0xe210, 0xbf1a, 0x8108, 0x3c03, 0xf0f9, 0x340b, 0xf0e9, 0x9120, 0x007c, 0x8119, 0x0f11, 0x1312, 0xcfed, 0x3609, 0xf151, 0x320d, 0xf011, 0x3e01, 0xf739, 0x9300, 0x0083, 0x913f, 0x915f, 0x914f, 0x911f, 0x910f, 0x912f, 0x91df, 0x900f, 0xb7ca, 0xfdc5, 0xcf1d, 0x91cf, 0xbfcf, 0x91cf, 0x9518, 0x9120, 0x0083, 0x2322, 0xf369, 0x9110, 0x0081, 0x2311, 0xf521, 0x3034, 0xf122, 0x9330, 0x0081, 0x9320, 0x007d, 0x9110, 0x007e, 0xe03b, 0x1b31, 0x9330, 0x007e, 0xc019, 0x9100, 0x0081, 0x3001, 0xf49c, 0xe50a, 0x9130, 0x0060, 0xfd34, 0xc011, 0x9300, 0x0060, 0xe7c1, 0xe0d0, 0xc010, 0x2705, 0xe010, 0xc000, 0xc021, 0x2705, 0xe010, 0x95c8, 0xbb08, 0xc014, 0xe53a, 0xc001, 0xed32, 0x2e03, 0xe0c0, 0xe0d0, 0xe032, 0xb317, 0x6118, 0x9ac3, 0xb308, 0xbb17, 0xe158, 0xe820, 0xef4f, 0xff20, 0x2705, 0xbb08, 0x9527, 0x9517, 0x3f1c, 0xf728, 0x0000, 0x5245, 0xf7b0, 0xff20, 0x2705, 0x9527, 0xbb08, 0x9517, 0x3f1c, 0xf6b8, 0x9129, 0x953a, 0xf761, 0x7e07, 0x9110, 0x0082, 0x0f11, 0xbb08, 0x50c2, 0x40d0, 0xf011, 0x9310, 0x007c, 0xe210, 0xbf1a, 0x6008, 0xb317, 0x7e17, 0x2f40, 0x7e47, 0xe054, 0x955a, 0xf7f1, 0xbb08, 0xbb17, 0xbb48, 0xcf8a, 0x94f8, 0xef2f, 0xe8b0, 0xe4a0, 0xe04a, 0xbfb1, 0x0000, 0xee81, 0xe09c, 0x99b3, 0xcffe, 0x9bb3, 0xcffe, 0x9701, 0x99b3, 0xcffd, 0xff97, 0xc003, 0x1bba, 0x9581, 0xc001, 0x0fba, 0x95a6, 0xf429, 0x1728, 0xf010, 0xb731, 0x2f28, 0xe0a1, 0x5041, 0xf731, 0xbf31, 0x0000, 0x9478, 0x9508, 0x94f8, 0x91e0, 0x006a, 0x91f0, 0x006b, 0x9732, 0xe085, 0x9380, 0x0057, 0x95e8, 0x9478, 0x9508, 0x91e0, 0x006a, 0x91f0, 0x006b, 0x9730, 0xf429, 0x9390, 0x006d, 0x9380, 0x006c, 0xc007, 0x30e4, 0x05f1, 0xf439, 0x9390, 0x006f, 0x9380, 0x006e, 0xe38f, 0xec9c, 0xc01c, 0x37ec, 0xe128, 0x07f2, 0xf439, 0x9180, 0x006c, 0x9190, 0x006d, 0x538e, 0x4f9c, 0xc011, 0x37ee, 0xe128, 0x07f2, 0xf439, 0x9180, 0x006e, 0x9190, 0x006f, 0x538d, 0x4f9c, 0xc006, 0x37ea, 0xe128, 0x07f2, 0xf411, 0xb781, 0xe090, 0xb72f, 0x94f8, 0x9730, 0xf421, 0xe131, 0x9330, 0x0057, 0x95e8, 0xe031, 0x010c, 0x9330, 0x0057, 0x95e8, 0x2411, 0x9632, 0x93f0, 0x006b, 0x93e0, 0x006a, 0xbf2f, 0x9508, 0xbe14, 0xe188, 0xb60f, 0x94f8, 0xbd81, 0xbc11, 0xbe0f, 0x98c1, 0x9abb, 0xe888, 0xe193, 0xe9ec, 0xe0f1, 0x9731, 0xf7f1, 0x9701, 0xf7d1, 0x98bb, 0x9aac, 0xb78b, 0x6280, 0xbf8b, 0x9478, 0x9100, 0x0081, 0x5003, 0xfd07, 0xc0ba, 0x9180, 0x007e, 0xe0cc, 0xe0d0, 0x1bc8, 0x09d1, 0x57cb, 0x4fdf, 0x9180, 0x007d, 0x328d, 0xf009, 0xc08e, 0x3008, 0xf009, 0xc0a8, 0xec83, 0x9380, 0x0071, 0xe58a, 0x9380, 0x0060, 0x9210, 0x0069, 0x8128, 0x2f92, 0x7690, 0x8189, 0x2399, 0xf119, 0x9210, 0x0067, 0x1181, 0xc008, 0xe682, 0xe090, 0x9390, 0x0080, 0x9380, 0x007f, 0xe014, 0xc067, 0x3081, 0xf451, 0x818c, 0x819d, 0x9390, 0x006b, 0x9380, 0x006a, 0xfd27, 0xc058, 0xef1f, 0xc057, 0x9190, 0x0068, 0x3082, 0xf411, 0x6091, 0xc001, 0x6094, 0x9390, 0x0068, 0xe010, 0xc050, 0x819a, 0x9210, 0x007a, 0x1181, 0xc006, 0x9210, 0x007b, 0xe78a, 0xe090, 0xe012, 0xc03b, 0x3085, 0xf419, 0x9390, 0x0082, 0xc02c, 0x3086, 0xf509, 0x818b, 0x3081, 0xf419, 0xe98a, 0xe198, 0xc004, 0x3082, 0xf441, 0xe888, 0xe198, 0x9390, 0x0080, 0x9380, 0x007f, 0xe112, 0xc00d, 0x3083, 0xf451, 0x1191, 0xc008, 0xea8c, 0xe198, 0x9390, 0x0080, 0x9380, 0x007f, 0xe014, 0xc001, 0xe010, 0xe480, 0x9380, 0x0069, 0xc01d, 0x3088, 0xf059, 0x3089, 0xf419, 0x9390, 0x0084, 0xc002, 0x308a, 0xf039, 0xe78a, 0xe090, 0xe010, 0xc006, 0xe884, 0xe090, 0xc002, 0xe78a, 0xe090, 0xe011, 0x9390, 0x0080, 0x9380, 0x007f, 0xc005, 0x811e, 0xe880, 0x9380, 0x0069, 0xc007, 0x818f, 0x1181, 0xc004, 0x818e, 0x1781, 0xf408, 0x2f18, 0x9310, 0x0061, 0xc01d, 0x9180, 0x0069, 0xff87, 0xc019, 0x9180, 0x006a, 0x9190, 0x006b, 0x3880, 0x4198, 0xf028, 0x9180, 0x006a, 0x738f, 0xf039, 0xc00d, 0x9189, 0x9199, 0xdef0, 0x5002, 0xf779, 0xcff5, 0x9180, 0x0068, 0x6082, 0x9380, 0x0068, 0x9210, 0x0061, 0x9210, 0x0081, 0x9180, 0x0060, 0xff84, 0xc043, 0x9180, 0x0061, 0x3f8f, 0xf409, 0xc03e, 0x2f08, 0x3089, 0xf008, 0xe008, 0x1b80, 0x9380, 0x0061, 0x9180, 0x0071, 0xe898, 0x2789, 0x9380, 0x0071, 0x2300, 0xf119, 0x91e0, 0x007f, 0x91f0, 0x0080, 0x9180, 0x0069, 0xff86, 0xc00b, 0xe7a2, 0xe0b0, 0x9184, 0x938d, 0x9631, 0xe782, 0xe090, 0x0f80, 0x138a, 0xcff8, 0xc00c, 0x01cf, 0xe7a2, 0xe0b0, 0x01fc, 0x9121, 0x01cf, 0x932d, 0xe722, 0xe030, 0x0f20, 0x132a, 0xcff7, 0x93f0, 0x0080, 0x93e0, 0x007f, 0x2f60, 0xe782, 0xe090, 0xdd14, 0x5f0c, 0x300c, 0xf019, 0xef8f, 0x9380, 0x0061, 0x9300, 0x0060, 0xe184, 0xb396, 0x7198, 0xf431, 0x5081, 0xf7d9, 0x9210, 0x0082, 0x9210, 0x007c, 0xe001, 0x1181, 0xe000, 0x9180, 0x0070, 0x1780, 0xf039, 0x1101, 0xc003, 0x9210, 0x0067, 0xde58, 0x9300, 0x0070, 0xe98c, 0xe091, 0x9701, 0xf7f1, 0x9100, 0x0068, 0xff00, 0xc017, 0x94f8, 0xe8e0, 0xe1f8, 0x54e0, 0x09f1, 0xe083, 0x9380, 0x0057, 0x95e8, 0x9730, 0xf7c1, 0x9210, 0x006b, 0x9210, 0x006a, 0xe088, 0x2ef8, 0xef8f, 0xef9f, 0xde69, 0x94fa, 0xf7d9, 0xde5a, 0xff01, 0xc005, 0xe38a, 0xe290, 0x9701, 0xf7f1, 0xde53, 0xff02, 0xc013, 0x98b9, 0xe282, 0xea91, 0x9701, 0xf7f1, 0x94f8, 0x9abb, 0xbe1b, 0xba15, 0x9210, 0x025f, 0xe7ea, 0xe1f8, 0x91e4, 0x2f8e, 0x5081, 0x3f8e, 0xf0c0, 0xc019, 0x9210, 0x0068, 0x9180, 0x0067, 0x708d, 0xf011, 0x98b9, 0xc001, 0x9ab9, 0x9180, 0x0066, 0x9190, 0x0067, 0x9601, 0x9390, 0x0067, 0x9380, 0x0066, 0x3680, 0x4e9a, 0xf408, 0xce91, 0xcfd6, 0xbfe1, 0x0000, 0xcc52, 0xcf22, 0xff5a, 0x7a18, 0x0840
-};
-
-uint16_t bootloader_address = 6272;
diff --git a/upgrade/generate-data.rb b/upgrade/generate-data.rb
deleted file mode 100644
index 875870c..0000000
--- a/upgrade/generate-data.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-require_relative "../ruby/micronucleus.rb"
-
-data = HexProgram.new(open ARGV.first)
-
-puts data.instance_variable_get(:@bytes).inspect
-
-data = data.bytes
-
-# find start address
-start_address = 16 # skip past baked in trampoline - upgrade firmware generates one anyway!
-# TODO: Verify jump table? or store it in the upgrade firmware for verbatim installation?
-start_address += 1 while data[start_address] == 0xFF
-
-raise "Seems to be junk data quite early in the bootloader" unless start_address > 100
-
-# trim blank padding data from start of data
-start_address.times { data.shift }
-
-# if data is an odd number of bytes make it even
-data.push 0xFF while (data.length % 2) != 0
-
-puts "Length: #{data.length}"
-puts "Start address: #{start_address}"
-
-File.open "bootloader_data.c", "w" do |file|
- file.puts "// This file contains the bootloader data itself and the address to"
- file.puts "// install the bootloader"
- file.puts "// Use generate-data.rb with ruby 1.9 or 2.0 to generate these"
- file.puts "// values from a hex file"
- file.puts "// Generated from #{ARGV.first} at #{Time.now} by #{ENV['USER']}"
- file.puts ""
- file.puts "const uint16_t bootloader_data[#{data.length / 2}] PROGMEM = {"
- file.puts data.each_slice(2).map { |big_end, little_end|
- "0x#{ ((little_end * 256) + big_end).to_s(16).rjust(4, '0') }"
- }.join(', ')
- file.puts "};"
- file.puts ""
- file.puts "uint16_t bootloader_address = #{start_address};"
-end \ No newline at end of file
diff --git a/upgrade/readme.txt b/upgrade/readme.txt
deleted file mode 100644
index 394e206..0000000
--- a/upgrade/readme.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-Micronucleus Upgrade
-====================
-
-Upgrade is a virus-like payload you can upload via micronucleus (or other bootloaders!) to install a new version of micronucleus on the target chip. The upgrade program works by compiling the binary contents of a bootloader hex file in to a progmem array, then running on the chip bricking the device so it doesn't enter any existing bootloader anymore but instead runs the upgrade program exclusively. Next it erases and rewrites the bootloader in place at the same address the hex file specifies (BOOTLOADER_ADDRESS in the case of micronucleus). Once the bootloader has been rewritten, upgrade rewrites it's own interrupt vector table to point every interrupt including reset straight at the newly uploaded bootloader's interrupt vector table at whichever address it was installed.
-
-The program then emits a beep if a piezo speaker is connected between PB0 and PB1. If you have no speaker, use an LED with positive on PB0 (requires resistor). Premade upgrades are included in releases/ for micronucleus builds. Just upload one in the usual way and wait for the beep. Once you hear the beep, the chip will automatically reboot and should enumerate over USB as a micronucleus device, ready to accept a new program.
-
-Upgrade has only been tested with micronucleus - use it to upload other bootloaders at your own risk!
-
-Prerequesits
-============
-
-You'll need a few dependencies to start with:
-
- gem install libusb
-
-Also, you'll need avr-gcc. For OS X, it can be obtained from http://www.obdev.at/products/crosspack/download.html
-
-
-Creating an Upgrade
-===================
-
- ruby generate-data.rb my_new_bootloader.hex
- make clean; make
-
-Next upload the 'upgrade.hex' file generated in this folder, via whichever bootloader you're using, or an ISP or whatever - everything should work. If you're using micronucleus and have the command line tool installed: micronucleus --run upgrade.hex
-
-The generate-data.rb script requires Ruby 1.9 or newer to be installed. If you're using an older version of Mac OS X (before Mavericks), use homebrew to install ruby with 'brew install ruby' to get a recent version. On linuxes you can usually find a package called ruby1.9 in whichever installing thingy. On windows you're on your own!
-
-
-License
-=======
-
-Released under BSD license. Have fun!
diff --git a/upgrade/releases/micronucleus-1.03-upgrade.hex b/upgrade/releases/micronucleus-1.03-upgrade.hex
deleted file mode 100644
index 120e279..0000000
--- a/upgrade/releases/micronucleus-1.03-upgrade.hex
+++ /dev/null
@@ -1,179 +0,0 @@
-:1000000003C003C003C003C003C003C003C003C0D8
-:1000800016C438C437C436C435C434C433C432C4C7
-:1000900031C430C42FC42EC42DC42CC42BC422C0E0
-:1000A00040C06CC03EC03DC03CC03BC03AC039C03F
-:1000B00038C037C036C035C034C033C0040309046B
-:1000C00012011001FF000008D016530703010000C1
-:1000D0000001090212000101008032090400000041
-:1000E0000000000011241FBECFE5D2E0DEBFCDBF6F
-:1000F00000EB0F9307E00F9310E0A0E6B0E0EAEC0E
-:10010000FFE102C005900D92A636B107D9F710E0C5
-:10011000A6E6B0E001C01D92AA39B107E1F7DFD130
-:10012000C1C3BDCFA82FB92F80E090E041E050EAD5
-:10013000609530E009C02D9182279795879510F042
-:1001400084279527305EC8F36F5FA8F30895EADF30
-:100150008D939D930895A6E088279927AA9569F025
-:100160000197E1F3B399FCCFB39BFECF81E09927D0
-:10017000A6B3019611F0A871D9F70895CF93CFB720
-:10018000CF93C0915F02C03B21F4C0915E02C730A3
-:1001900021F0CF91CFBFCF9181CFCC27C395B39B17
-:1001A000E9F7B39B0BC0B39B09C0B39B07C0B39BDC
-:1001B00005C0B39B03C0B39B01C0D3C00F92DF93B4
-:1001C000C0917D00DD27CC57DF4F012EB39B03C0CC
-:1001D000DF910F90E6CF2F930F931F934F932FEF45
-:1001E0004F6F06B303FB20F95F933F9350E03BE072
-:1001F00065C016B30126502953FDC89556B3012793
-:1002000003FB25F92F7306B3B1F05027102713FB1A
-:1002100026F906B22230F0F000C016B3012703FB26
-:1002200027F90126502906B22430E8F54F772068D7
-:1002300016B30000F6CF50274F7D206206B2102F74
-:10024000000000C006B300265029102713FB26F932
-:1002500006B2E2CF4F7B06B3206400C0DACF01269E
-:100260005029187106B269F14E7F2160012F16B333
-:1002700028C0002650294D7F06B22260102F29C0C9
-:10028000012650294B7F06B22460012F2DC016B3E2
-:1002900001265029477F2860000006B22EC04F7EFD
-:1002A00006B3206130C0422706B349930026502987
-:1002B000102706B24FEF13FB20F9297F16B379F20E
-:1002C000187159F10126502906B2012703FB21F9C3
-:1002D000237F06B371F2002650293150D0F006B2C8
-:1002E000102713FB22F9277E16B351F2012650295D
-:1002F000012703FB06B223F92F7C49F2000006B365
-:10030000102713FB24F90026502906B22F7939F261
-:1003100070CF10E21ABF002717C03B503195C31BA6
-:10032000D04010E21ABF0881033CF9F00B34E9F029
-:1003300020917B001981110F1213EDCF093651F175
-:100340000D3211F0013E39F7009382003F915F9129
-:100350004F911F910F912F91DF910F90CAB7C5FD5B
-:100360001DCFCF91CFBFCF9118952091820022232E
-:1003700069F310918000112321F5343022F130937C
-:10038000800020937C0010917D003BE0311B309376
-:100390007D0019C00091800001309CF40AE5309185
-:1003A000600034FD11C000936000C0E7D0E010C0D1
-:1003B000052710E000C021C0052710E0C89508BB44
-:1003C00014C03AE501C032ED032EC0E0D0E032E0C7
-:1003D00017B31861C39A08B317BB58E120E84FEF71
-:1003E00020FF052708BB279517951C3F28F700001D
-:1003F0004552B0F720FF0527279508BB17951C3FEE
-:10040000B8F629913A9561F7077E10918100110F96
-:1004100008BBC250D04011F010937B0010E21ABF0D
-:10042000086017B3177E402F477E54E05A95F1F7C6
-:1004300008BB17BB48BB8ACF81E080936700F89464
-:10044000E0916E00F0916F00329785E08093570045
-:10045000E89507B600FCFDCF789408959C01E091E3
-:100460006E00F0916F00309749F1E430F105B1F082
-:1004700087E1EC3BF80739F420916A0030916B007A
-:100480002E5D3B4F0DC087E1EE3BF80749F420910C
-:100490006C0030916D002D5D3B4F02C02FED3BECA9
-:1004A000F89481E0090180935700E895112478942D
-:1004B0003296F0936F00E0936E00089581E180938F
-:1004C0005700E895EBCF8FEF9FEFC8DF80916E006C
-:1004D00090916F008F739070892BA9F7ADCF88E151
-:1004E0000FB6F89481BD11BC0FBEE0E0F0E085913D
-:1004F00094918F5D9B4C39F4E4E0F0E08591949108
-:100500008F5D9B4C09F0DFDF10926F0010926E0040
-:10051000AC9A8BB780628BBFBB9A88E893E1ECE919
-:10052000F1E03197F1F70197D1F7BB987894EE2479
-:10053000FF2410918000135017FDD0C080917D00E2
-:10054000CCE0D0E0C81BD109CC57DF4F80917C00B4
-:100550008D3209F08DC0183009F0BEC083EC809355
-:1005600070008AE580936000109269002881822FD4
-:1005700080769981882309F1992341F482E690E0FD
-:1005800090937F0080937E0024E068C0913051F406
-:100590008C819D8190936F0080936E0027FD59C0E0
-:1005A0009FEF58C080916600923011F4816001C0C5
-:1005B00084608093660020E051C08A8110927900A7
-:1005C000992331F410927A0089E790E022E03CC050
-:1005D000953019F48093810034C0963011F58B81E9
-:1005E000813019F482EE97E104C0823041F484EF47
-:1005F00097E190937F0080937E0022E10EC08330CC
-:1006000059F48A81882341F48EED97E190937F001D
-:1006100080937E0024E001C020E080E480936900A4
-:100620001DC0983019F483E890E009C0993019F49E
-:100630008093830006C09A3021F489E790E021E09E
-:1006400003C089E790E020E090937F0080937E00D4
-:1006500005C09E8180E88093690007C08F81882350
-:1006600019F49E81921708F0922F9093610034C084
-:100670008091690087FF30C080916E0090916F007B
-:10068000009739F48881998190936B0080936A0078
-:100690000DC08430910539F48881998190936D0063
-:1006A00080936C0003C0805C974138F48881998105
-:1006B000D5DE125011F02296DFCF80916E0090911E
-:1006C0006F008F739070892B39F48091660082607F
-:1006D000809366001092610010928000809160000B
-:1006E00084FF3CC0809161008F3FC1F1182F893099
-:1006F00008F018E0811B809361008091700098E8F9
-:100700008927809370001123E1F0E0917E00F09141
-:100710007F008091690086FF09C0912FA1E7B0E0BA
-:1007200084918D9331969150D9F707C0912FA1E70D
-:10073000B0E081918D939150E1F7F0937F00E093C9
-:100740007E0081E790E0612F02DD612F6C5F6C30ED
-:1007500019F08FEF809361006093600094E186B39D
-:10076000887131F49150D9F71092810010927B007A
-:1007700010E0992309F411E080916800811739F0A5
-:10078000112319F4F8944FD07894109368008CE9F1
-:1007900091E00197F1F780916600882319F0EE242B
-:1007A000FF2403C00894E11CF11C182F80FF14C023
-:1007B000F894E0ECF7E1E054F04083E080935700D8
-:1007C000E89507B600FCFDCF3097A9F710926F00AF
-:1007D00010926E0078DE789411FF0FC08AE390E2E9
-:1007E0000197F1F780916E0090916F008F73907078
-:1007F000892B11F068DE01C01FDE12FD08C01092C7
-:10080000660080E5E81683ECF80608F492CE82E2F2
-:1008100091EA0197F1F7F8941BBE15BA10925F02A6
-:1008200010925E023ACCFF920F931F93CF93DF9307
-:1008300080E8F82E00E0C0E0D0E0102F1F0D11BFBF
-:100840008ADC29E0843392070CF0102FF69421966D
-:10085000C830D10511F0012FF0CF115011BF1F5F2B
-:10086000012FEC0110C077DC8453994097FF03C03F
-:10087000909581959F4F8C179D0714F401B7EC015B
-:1008800081B78F5F81BF21B730E0812F90E0019663
-:100890008217930744F701BFDF91CF911F910F910A
-:1008A000FF900895F894FFCF5AFF17BC400800004E
-:1008B0000000000000000000000000000000000038
-:1008C00000000000000000000000000000001124F3
-:1008D0001FBECFE5D2E0DEBFCDBF10E0A0E6B0E0A6
-:1008E000ECE6FBE002C005900D92A236B107D9F705
-:1008F0001CD13AC1C5CB05C0EDE1F0E13197F1F76C
-:1009000001970097C9F70895AC01407C20E030E0E2
-:10091000F901E40FF51F85919491F901EE7FE60F3F
-:10092000F71F918380832E5F3F4F2034310581F77D
-:100930000895FC01E07C83E080935700E89507B6BA
-:1009400000FCFDCF0895CF93DF93EC01A0E0B0E071
-:10095000AD014C0F5D1FFB01EA0FFB1F80819181F0
-:1009600021E0FA010C0120935700E895112412961A
-:10097000A034B10569F785E0FE0180935700E89542
-:1009800007B600FCFDCFDF91CF910895DF93CF93A1
-:10099000CDB7DEB7C054D0400FB6F894DEBF0FBE5F
-:1009A000CDBF209160003091610036952795215090
-:1009B0003044FE01319621933193CE018F5B9F4FDE
-:1009C000E817F907C1F780E090E0B3DF80E090E03E
-:1009D000BE016F5F7F4FB7DFC05CDF4F0FB6F8948B
-:1009E000DEBF0FBECDBFCF91DF910895EF92FF9292
-:1009F0000F931F93DF93CF93CDB7DEB7C054D04092
-:100A00000FB6F894DEBF0FBECDBF00E010E035C0DA
-:100A10009B01359527957E010894E11CF11C88E027
-:100A2000AE3AB80738F0220F331FE20EF31E8FEFF5
-:100A30009FEF07C0FD0185919491220F331FE20EB5
-:100A4000F31EF701918380836E5F7F4F12966034AF
-:100A50007105F1F68091600090916100800F911F07
-:100A600068DF8091600090916100800F911FBE014E
-:100A70006F5F7F4F68DF005C1F4FF8E000341F0797
-:100A800031F0D801A256BF4F60E070E0C1CFC05C2A
-:100A9000DF4F0FB6F894DEBF0FBECDBFCF91DF9111
-:100AA0001F910F91FF90EF900895DF93CF93CDB7F3
-:100AB000DEB7C054D0400FB6F894DEBF0FBECDBF36
-:100AC00080E090E0BE016F5F7F4F1EDF80E090E02E
-:100AD000019680329105E1F78FEF9FEF9A8389832A
-:100AE00080E090E026DF80E090E0BE016F5F7F4F06
-:100AF0002ADFC05CDF4F0FB6F894DEBF0FBECDBF5C
-:100B0000CF91DF91089587B3836087BBC19820E0C0
-:100B10008DE190E1FC013197F1F7C19A0197F1F76E
-:100B2000C1982F5F2A3FA1F7089588B318BA87B3F9
-:100B30008FEF87BB8AEF90E0EDE1F0E13197F1F7BD
-:100B40000197D1F787B317BA8AEF90E0EDE1F0E1B2
-:100B50003197F1F70197D1F7F894A7DF47DF16DF58
-:0C0B6000D2DF80E090E00895F894FFCF11
-:020B6C00C017B0
-:040000030000008079
-:00000001FF
diff --git a/upgrade/releases/micronucleus-1.04-upgrade.hex b/upgrade/releases/micronucleus-1.04-upgrade.hex
deleted file mode 100644
index 51417de..0000000
--- a/upgrade/releases/micronucleus-1.04-upgrade.hex
+++ /dev/null
@@ -1,180 +0,0 @@
-:1000000003C003C003C003C003C003C003C003C0D8
-:100080001BC43DC43CC43BC43AC439C438C437C49F
-:1000900036C435C434C433C432C431C430C422C0BD
-:1000A00040C06CC03EC03DC03CC03BC03AC039C03F
-:1000B00038C037C036C035C034C033C0040309046B
-:1000C00012011001FF000008D016530704010000C0
-:1000D0000001090212000101008032090400000041
-:1000E0000000000011241FBECFE5D2E0DEBFCDBF6F
-:1000F00000EB0F9307E00F9310E0A0E6B0E0E4ED13
-:10010000FFE102C005900D92A636B107D9F710E0C5
-:10011000A6E6B0E001C01D92AC39B107E1F7DFD12E
-:10012000C6C3BDCFA82FB92F80E090E041E050EAD0
-:10013000609530E009C02D9182279795879510F042
-:1001400084279527305EC8F36F5FA8F30895EADF30
-:100150008D939D930895A6E088279927AA9569F025
-:100160000197E1F3B399FCCFB39BFECF81E09927D0
-:10017000A6B3019611F0A871D9F70895CF93CFB720
-:10018000CF93C0915F02C03B21F4C0915E02C730A3
-:1001900021F0CF91CFBFCF9181CFCC27C395B39B17
-:1001A000E9F7B39B0BC0B39B09C0B39B07C0B39BDC
-:1001B00005C0B39B03C0B39B01C0D3C00F92DF93B4
-:1001C000C0917F00DD27CA57DF4F012EB39B03C0CC
-:1001D000DF910F90E6CF2F930F931F934F932FEF45
-:1001E0004F6F06B303FB20F95F933F9350E03BE072
-:1001F00065C016B30126502953FDC89556B3012793
-:1002000003FB25F92F7306B3B1F05027102713FB1A
-:1002100026F906B22230F0F000C016B3012703FB26
-:1002200027F90126502906B22430E8F54F772068D7
-:1002300016B30000F6CF50274F7D206206B2102F74
-:10024000000000C006B300265029102713FB26F932
-:1002500006B2E2CF4F7B06B3206400C0DACF01269E
-:100260005029187106B269F14E7F2160012F16B333
-:1002700028C0002650294D7F06B22260102F29C0C9
-:10028000012650294B7F06B22460012F2DC016B3E2
-:1002900001265029477F2860000006B22EC04F7EFD
-:1002A00006B3206130C0422706B349930026502987
-:1002B000102706B24FEF13FB20F9297F16B379F20E
-:1002C000187159F10126502906B2012703FB21F9C3
-:1002D000237F06B371F2002650293150D0F006B2C8
-:1002E000102713FB22F9277E16B351F2012650295D
-:1002F000012703FB06B223F92F7C49F2000006B365
-:10030000102713FB24F90026502906B22F7939F261
-:1003100070CF10E21ABF002717C03B503195C31BA6
-:10032000D04010E21ABF0881033CF9F00B34E9F029
-:1003300020917D001981110F1213EDCF093651F173
-:100340000D3211F0013E39F7009384003F915F9127
-:100350004F911F910F912F91DF910F90CAB7C5FD5B
-:100360001DCFCF91CFBFCF9118952091840022232C
-:1003700069F310918200112321F5343022F130937A
-:10038000820020937E0010917F003BE0311B309370
-:100390007F0019C00091820001309CF40AE5309181
-:1003A000600034FD11C000936000C2E7D0E010C0CF
-:1003B000052710E000C021C0052710E0C89508BB44
-:1003C00014C03AE501C032ED032EC0E0D0E032E0C7
-:1003D00017B31861C39A08B317BB58E120E84FEF71
-:1003E00020FF052708BB279517951C3F28F700001D
-:1003F0004552B0F720FF0527279508BB17951C3FEE
-:10040000B8F629913A9561F7077E10918300110F94
-:1004100008BBC250D04011F010937D0010E21ABF0B
-:10042000086017B3177E402F477E54E05A95F1F7C6
-:1004300008BB17BB48BB8ACF81E080936900F89462
-:10044000E0917000F0917100329785E08093570041
-:10045000E89507B600FCFDCF789408959C01E091E3
-:100460007000F0917100309749F1E430F105B1F07E
-:1004700087E1EC3BF80739F420916C0030916D0076
-:100480002E5D3B4F0DC087E1EE3BF80749F420910C
-:100490006E0030916F002D5D3B4F02C02FED3BECA5
-:1004A000F89481E0090180935700E895112478942D
-:1004B0003296F0937100E0937000089581E180938B
-:1004C0005700E895EBCF8FEF9FEFC8DF809170006A
-:1004D000909171008F739070892BA9F7ADCF88E14F
-:1004E0000FB6F89481BD11BC0FBEE0E0F0E085913D
-:1004F00094918F5D9B4C39F4E4E0F0E08591949108
-:100500008F5D9B4C09F0DFDF10927100109270003C
-:10051000AC9A8BB780628BBFBB9A88E893E1ECE919
-:10052000F1E03197F1F70197D1F7BB9878941091EA
-:100530008200135017FDD4C080917F00CCE0D0E042
-:10054000C81BD109CA57DF4F80917E008D3209F058
-:1005500091C0183009F0C2C083EC809372008AE524
-:100560008093600010926B002881822F80769981A1
-:10057000882329F11092670010926600992341F4B4
-:1005800082E690E0909381008093800024E068C030
-:10059000913051F48C819D81909371008093700013
-:1005A00027FD59C09FEF58C080916800923011F428
-:1005B000816001C084608093680020E051C08A811E
-:1005C00010927B00992331F410927C008BE790E02D
-:1005D00022E03CC0953019F48093830034C09630FB
-:1005E00011F58B81813019F482EE97E104C08230DD
-:1005F00041F484EF97E1909381008093800022E1A1
-:100600000EC0833059F48A81882341F48EED97E13E
-:10061000909381008093800024E001C020E080E47A
-:1006200080936B001DC0983019F485E890E009C0F4
-:10063000993019F48093850006C09A3021F48BE735
-:1006400090E021E003C08BE790E020E090938100F0
-:100650008093800005C09E8180E880936B0007C076
-:100660008F81882319F49E81921708F0922F90931E
-:10067000610034C080916B0087FF30C080917000B2
-:1006800090917100009739F48881998190936D0061
-:1006900080936C000DC08430910539F48881998174
-:1006A00090936F0080936E0003C0805C974138F494
-:1006B00088819981D3DE125011F02296DFCF80918C
-:1006C0007000909171008F739070892B39F4809134
-:1006D000680082608093680010926100109282002E
-:1006E0008091600084FF3CC0809161008F3FC1F128
-:1006F000182F893008F018E0811B809361008091E9
-:10070000720098E88927809372001123E1F0E0914C
-:100710008000F091810080916B0086FF09C0912FCD
-:10072000A3E7B0E084918D9331969150D9F707C03B
-:10073000912FA3E7B0E081918D939150E1F7F09371
-:100740008100E093800083E790E0612F00DD612F5E
-:100750006C5F6C3019F08FEF8093610060936000E4
-:1007600094E186B3887131F49150D9F710928300E7
-:1007700010927D0010E0992309F411E080916A0045
-:10078000811739F0112319F4F89452D0789410930A
-:100790006A008CE991E00197F1F7809166009091F1
-:1007A00067000196909367008093660080916800CF
-:1007B000182F80FF14C0F894E0ECF7E1E054F0400B
-:1007C00083E080935700E89507B600FCFDCF309793
-:1007D000A9F7109271001092700075DE789411FFE5
-:1007E0000FC08AE390E20197F1F780917000909139
-:1007F00071008F739070892B11F065DE01C01CDED3
-:1008000012FD0AC010926800809166009091670006
-:10081000885A914608F48BCE82E291EA0197F1F76B
-:10082000F8941BBE15BA10925F0210925E0235CC8E
-:10083000FF920F931F93CF93DF9380E8F82E00E091
-:10084000C0E0D0E0102F1F0D11BF85DC29E08433FC
-:1008500092070CF0102FF6942196C830D10511F0B4
-:10086000012FF0CF115011BF1F5F012FEC0110C0FD
-:1008700072DC8453994097FF03C0909581959F4FF8
-:100880008C179D0714F401B7EC0181B78F5F81BF0E
-:1008900021B730E0812F90E001968217930744F74B
-:1008A00001BFDF91CF911F910F91FF900895F894B0
-:1008B000FFCF5AFF17BC40060000000000000000F8
-:1008C0000000000000000000000000000000000028
-:1008D000000000000000000011241FBECFE5D2E0A0
-:1008E000DEBFCDBF10E0A0E6B0E0E6E7FBE002C06F
-:1008F00005900D92A236B107D9F71CD13AC1C0CBF1
-:1009000005C0EDE1F0E13197F1F701970097C9F7E4
-:100910000895AC01407C20E030E0F901E40FF51FC0
-:1009200085919491F901EE7FE60FF71F9183808303
-:100930002E5F3F4F2034310581F70895FC01E07CA4
-:1009400083E080935700E89507B600FCFDCF08953B
-:10095000CF93DF93EC01A0E0B0E0AD014C0F5D1F41
-:10096000FB01EA0FFB1F8081918121E0FA010C015C
-:1009700020935700E89511241296A034B10569F729
-:1009800085E0FE0180935700E89507B600FCFDCF97
-:10099000DF91CF910895DF93CF93CDB7DEB7C054E9
-:1009A000D0400FB6F894DEBF0FBECDBF20916000DF
-:1009B000309161003695279521503044FE013196E3
-:1009C00021933193CE018F5B9F4FE817F907C1F751
-:1009D00080E090E0B3DF80E090E0BE016F5F7F4F8A
-:1009E000B7DFC05CDF4F0FB6F894DEBF0FBECDBFE0
-:1009F000CF91DF910895EF92FF920F931F93DF93B2
-:100A0000CF93CDB7DEB7C054D0400FB6F894DEBF59
-:100A10000FBECDBF00E010E035C09B013595279596
-:100A20007E010894E11CF11C88E0A83BB80738F06F
-:100A3000220F331FE20EF31E8FEF9FEF07C0FD0161
-:100A400085919491220F331FE20EF31EF7019183DB
-:100A500080836E5F7F4F129660347105F1F680914E
-:100A6000600090916100800F911F68DF80916000AD
-:100A700090916100800F911FBE016F5F7F4F68DF13
-:100A8000005C1F4FF8E000341F0731F0D801A25678
-:100A9000BF4F60E070E0C1CFC05CDF4F0FB6F8948D
-:100AA000DEBF0FBECDBFCF91DF911F910F91FF90A1
-:100AB000EF900895DF93CF93CDB7DEB7C054D04009
-:100AC0000FB6F894DEBF0FBECDBF80E090E0BE0150
-:100AD0006F5F7F4F1EDF80E090E0019680329105CE
-:100AE000E1F78FEF9FEF9A83898380E090E026DF24
-:100AF00080E090E0BE016F5F7F4F2ADFC05CDF4F78
-:100B00000FB6F894DEBF0FBECDBFCF91DF91089531
-:100B100087B3836087BBC19820E08DE190E1FC0141
-:100B20003197F1F7C19A0197F1F7C1982F5F2A3FEA
-:100B3000A1F7089588B318BA87B38FEF87BB8AEF00
-:100B400090E0EDE1F0E13197F1F70197D1F787B34C
-:100B500017BA8AEF90E0EDE1F0E13197F1F70197F4
-:100B6000D1F7F894A7DF47DF16DFD2DF80E090E00F
-:060B70000895F894FFCF88
-:020B7600C017A6
-:040000030000008079
-:00000001FF
diff --git a/upgrade/releases/micronucleus-1.05-jumper-upgrade.hex b/upgrade/releases/micronucleus-1.05-jumper-upgrade.hex
deleted file mode 100644
index 278a0fb..0000000
--- a/upgrade/releases/micronucleus-1.05-jumper-upgrade.hex
+++ /dev/null
@@ -1,182 +0,0 @@
-:1000000003C003C003C003C003C003C003C003C0D8
-:1000800029C44BC44AC449C448C447C446C445C42F
-:1000900044C443C442C441C440C43FC43EC422C05B
-:1000A00040C06CC03EC03DC03CC03BC03AC039C03F
-:1000B00038C037C036C035C034C033C0040309046B
-:1000C00012011001FF000008D016530705010000BF
-:1000D0000001090212000101008032090400000041
-:1000E0000000000011241FBECFE5D2E0DEBFCDBF6F
-:1000F00000EB0F9307E00F9310E0A0E6B0E0E0EF15
-:10010000FFE102C005900D92A636B107D9F710E0C5
-:10011000A6E6B0E001C01D92AC39B107E1F7DFD12E
-:10012000D4C3BDCFA82FB92F80E090E041E050EAC2
-:10013000609530E009C02D9182279795879510F042
-:1001400084279527305EC8F36F5FA8F30895EADF30
-:100150008D939D930895A6E088279927AA9569F025
-:100160000197E1F3B399FCCFB39BFECF81E09927D0
-:10017000A6B3019611F0A871D9F70895CF93CFB720
-:10018000CF93C0915F02C03B21F4C0915E02C730A3
-:1001900021F0CF91CFBFCF9181CFCC27C395B39B17
-:1001A000E9F7B39B0BC0B39B09C0B39B07C0B39BDC
-:1001B00005C0B39B03C0B39B01C0D3C00F92DF93B4
-:1001C000C0917F00DD27CA57DF4F012EB39B03C0CC
-:1001D000DF910F90E6CF2F930F931F934F932FEF45
-:1001E0004F6F06B303FB20F95F933F9350E03BE072
-:1001F00065C016B30126502953FDC89556B3012793
-:1002000003FB25F92F7306B3B1F05027102713FB1A
-:1002100026F906B22230F0F000C016B3012703FB26
-:1002200027F90126502906B22430E8F54F772068D7
-:1002300016B30000F6CF50274F7D206206B2102F74
-:10024000000000C006B300265029102713FB26F932
-:1002500006B2E2CF4F7B06B3206400C0DACF01269E
-:100260005029187106B269F14E7F2160012F16B333
-:1002700028C0002650294D7F06B22260102F29C0C9
-:10028000012650294B7F06B22460012F2DC016B3E2
-:1002900001265029477F2860000006B22EC04F7EFD
-:1002A00006B3206130C0422706B349930026502987
-:1002B000102706B24FEF13FB20F9297F16B379F20E
-:1002C000187159F10126502906B2012703FB21F9C3
-:1002D000237F06B371F2002650293150D0F006B2C8
-:1002E000102713FB22F9277E16B351F2012650295D
-:1002F000012703FB06B223F92F7C49F2000006B365
-:10030000102713FB24F90026502906B22F7939F261
-:1003100070CF10E21ABF002717C03B503195C31BA6
-:10032000D04010E21ABF0881033CF9F00B34E9F029
-:1003300020917D001981110F1213EDCF093651F173
-:100340000D3211F0013E39F7009384003F915F9127
-:100350004F911F910F912F91DF910F90CAB7C5FD5B
-:100360001DCFCF91CFBFCF9118952091840022232C
-:1003700069F310918200112321F5343022F130937A
-:10038000820020937E0010917F003BE0311B309370
-:100390007F0019C00091820001309CF40AE5309181
-:1003A000600034FD11C000936000C2E7D0E010C0CF
-:1003B000052710E000C021C0052710E0C89508BB44
-:1003C00014C03AE501C032ED032EC0E0D0E032E0C7
-:1003D00017B31861C39A08B317BB58E120E84FEF71
-:1003E00020FF052708BB279517951C3F28F700001D
-:1003F0004552B0F720FF0527279508BB17951C3FEE
-:10040000B8F629913A9561F7077E10918300110F94
-:1004100008BBC250D04011F010937D0010E21ABF0B
-:10042000086017B3177E402F477E54E05A95F1F7C6
-:1004300008BB17BB48BB8ACF81E080936900F89462
-:10044000E0917000F0917100329785E08093570041
-:10045000E89507B600FCFDCF789408959C01E091E3
-:100460007000F0917100309749F1E430F105B1F07E
-:1004700087E1EC3BF80739F420916C0030916D0076
-:100480002E5D3B4F0DC087E1EE3BF80749F420910C
-:100490006E0030916F002D5D3B4F02C02FED3BECA5
-:1004A000F89481E0090180935700E895112478942D
-:1004B0003296F0937100E0937000089581E180938B
-:1004C0005700E895EBCF8FEF9FEFC8DF809170006A
-:1004D000909171008F739070892BA9F7ADCF1F9306
-:1004E000CF93DF9388E10FB6F89481BD11BC0FBEA6
-:1004F000E0E0F0E0859194918F5D9B4C39F4E4E06D
-:10050000F0E0859194918F5D9B4C09F0DCDF1092B7
-:10051000710010927000BD9AC59A82E291EA01972B
-:10052000F1F786B382958695877080FD7DC1AC9A80
-:100530008BB780628BBFBB9A88E893E1ECE9F1E06E
-:100540003197F1F70197D1F7BB9878941091820019
-:10055000135017FDD4C080917F00CCE0D0E0C81BC1
-:10056000D109CA57DF4F80917E008D3209F091C0CA
-:10057000183009F0C2C083EC809372008AE5809342
-:10058000600010926B002881822F807699818823E9
-:1005900029F11092670010926600992341F482E6D7
-:1005A00090E0909381008093800024E068C09130B7
-:1005B00051F48C819D81909371008093700027FD90
-:1005C00059C09FEF58C080916800923011F481604B
-:1005D00001C084608093680020E051C08A8110923D
-:1005E0007B00992331F410927C008BE790E022E0AD
-:1005F0003CC0953019F48093830034C0963011F5D7
-:100600008B81813019F482EE97E104C0823041F48D
-:1006100084EF97E1909381008093800022E10EC0E7
-:10062000833059F48A81882341F48EED97E19093C9
-:1006300081008093800024E001C020E080E480936A
-:100640006B001DC0983019F485E890E009C099301E
-:1006500019F48093850006C09A3021F48BE790E06E
-:1006600021E003C08BE790E020E09093810080932D
-:10067000800005C09E8180E880936B0007C08F8159
-:10068000882319F49E81921708F0922F90936100AD
-:1006900034C080916B0087FF30C0809170009091D2
-:1006A0007100009739F48881998190936D0080934F
-:1006B0006C000DC08430910539F488819981909344
-:1006C0006F0080936E0003C0805C974138F488818E
-:1006D0009981C4DE125011F02296DFCF8091700014
-:1006E000909171008F739070892B39F4809168001C
-:1006F0008260809368001092610010928200809165
-:10070000600084FF3CC0809161008F3FC1F1182FD1
-:10071000893008F018E0811B80936100809172009D
-:1007200098E88927809372001123E1F0E09180001E
-:10073000F091810080916B0086FF09C0912FA3E7A3
-:10074000B0E084918D9331969150D9F707C0912FE5
-:10075000A3E7B0E081918D939150E1F7F093810090
-:10076000E093800083E790E0612FF1DC612F6C5F04
-:100770006C3019F08FEF809361006093600094E11A
-:1007800086B3887131F49150D9F71092830010929A
-:100790007D0010E0992309F411E080916A0081172F
-:1007A00039F0112319F4F89451D0789410936A0019
-:1007B0008CE991E00197F1F78091660090916700D4
-:1007C0000196909367008093660080916800182FCF
-:1007D00080FF14C0F894E0ECF7E1E054F04083E0CF
-:1007E00080935700E89507B600FCFDCF3097A9F736
-:1007F000109271001092700066DE789411FF0FC0A5
-:100800008AE390E20197F1F7809170009091710076
-:100810008F739070892B11F056DE01C00DDE12FD32
-:1008200003C01092680092CE82E291EA0197F1F73C
-:1008300018BA17BAF8941BBE15BA10925F0210923C
-:100840005E022BCCDF91CF911F910895FF920F9301
-:100850001F93CF93DF9380E8F82E00E0C0E0D0E054
-:10086000102F1F0D11BF77DC29E0843392070CF0A5
-:10087000102FF6942196C830D10511F0012FF0CF3A
-:10088000115011BF1F5F012FEC0110C064DC8453B5
-:10089000994097FF03C0909581959F4F8C179D07B6
-:1008A00014F401B7EC0181B78F5F81BF21B730E04D
-:1008B000812F90E001968217930744F701BFDF91E3
-:1008C000CF911F910F91FF900895F894FFCF5AFF99
-:1008D00017BC4008000000000000000000000000FD
-:1008E0000000000000000000000000000000000008
-:1008F0000000000011241FBECFE5D2E0DEBFCDBF57
-:1009000010E0A0E6B0E0ECE9FBE002C005900D923B
-:10091000A236B107D9F720D13FC1B2CB05C0EDE176
-:10092000F0E13197F1F701970097C9F70895AC010D
-:10093000407C20E030E0F901E40FF51F85919491AF
-:10094000F901EE7FE60FF71F918380832E5F3F4F03
-:100950002034310581F70895FC01E07C83E0809329
-:100960005700E89507B600FCFDCF0895CF93DF93BD
-:10097000EC01A0E0B0E0AD014C0F5D1FFB01EA0F00
-:10098000FB1F8081918121E0FA010C012093570027
-:10099000E89511241296A034B10569F785E0FE01AF
-:1009A00080935700E89507B600FCFDCFDF91CF910B
-:1009B0000895DF93CF93CDB7DEB7C054D0400FB6C4
-:1009C000F894DEBF0FBECDBF209160003091610072
-:1009D0003695279521503044FE013196219331936D
-:1009E000CE018F5B9F4FE817F907C1F780E090E0D9
-:1009F000B3DF80E090E0BE016F5F7F4FB7DFC05C88
-:100A0000DF4F0FB6F894DEBF0FBECDBFCF91DF91A1
-:100A10000895EF92FF920F931F93DF93CF93CDB77B
-:100A2000DEB7C054D0400FB6F894DEBF0FBECDBFC6
-:100A300000E010E035C09B01359527957E010894B4
-:100A4000E11CF11C88E0A43DB80738F0220F331FE9
-:100A5000E20EF31E8FEF9FEF07C0FD018591949189
-:100A6000220F331FE20EF31EF701918380836E5F26
-:100A70007F4F129660347105F1F68091600090917D
-:100A80006100800F911F68DF80916000909161008C
-:100A9000800F911FBE016F5F7F4F68DF005C1F4FAB
-:100AA000F8E000341F0731F0D801A256BF4F60E0D4
-:100AB00070E0C1CFC05CDF4F0FB6F894DEBF0FBE51
-:100AC000CDBFCF91DF911F910F91FF90EF900895CF
-:100AD000DF93CF93CDB7DEB7C054D0400FB6F894B4
-:100AE000DEBF0FBECDBF80E090E0BE016F5F7F4FE5
-:100AF0001EDF80E090E0019680329105E1F78FEFF4
-:100B00009FEF9A83898380E090E026DF80E090E089
-:100B1000BE016F5F7F4F2ADFC05CDF4F0FB6F894D6
-:100B2000DEBF0FBECDBFCF91DF91089587B3836045
-:100B300087BBC19820E08DE190E1FC013197F1F78E
-:100B4000C19A0197F1F7C1982F5F2A3FA1F7089545
-:100B5000E0E0F0E00995089588B318BA87B38FEF05
-:100B600087BB8AEF90E0EDE1F0E13197F1F7019773
-:100B7000D1F787B317BA8AEF90E0EDE1F0E1319752
-:100B8000F1F70197D1F7F894A3DF43DF12DFCEDF4F
-:0C0B9000DFDF80E090E00895F894FFCFD4
-:020B9C00C01780
-:040000030000008079
-:00000001FF
diff --git a/upgrade/releases/micronucleus-1.05-upgrade.hex b/upgrade/releases/micronucleus-1.05-upgrade.hex
deleted file mode 100644
index f430323..0000000
--- a/upgrade/releases/micronucleus-1.05-upgrade.hex
+++ /dev/null
@@ -1,181 +0,0 @@
-:1000000003C003C003C003C003C003C003C003C0D8
-:1000800022C444C443C442C441C440C43FC43EC467
-:100090003DC43CC43BC43AC439C438C437C422C08C
-:1000A00040C06CC03EC03DC03CC03BC03AC039C03F
-:1000B00038C037C036C035C034C033C0040309046B
-:1000C00012011001FF000008D016530705010000BF
-:1000D0000001090212000101008032090400000041
-:1000E0000000000011241FBECFE5D2E0DEBFCDBF6F
-:1000F00000EB0F9307E00F9310E0A0E6B0E0E2EE14
-:10010000FFE102C005900D92A636B107D9F710E0C5
-:10011000A6E6B0E001C01D92AC39B107E1F7DFD12E
-:10012000CDC3BDCFA82FB92F80E090E041E050EAC9
-:10013000609530E009C02D9182279795879510F042
-:1001400084279527305EC8F36F5FA8F30895EADF30
-:100150008D939D930895A6E088279927AA9569F025
-:100160000197E1F3B399FCCFB39BFECF81E09927D0
-:10017000A6B3019611F0A871D9F70895CF93CFB720
-:10018000CF93C0915F02C03B21F4C0915E02C730A3
-:1001900021F0CF91CFBFCF9181CFCC27C395B39B17
-:1001A000E9F7B39B0BC0B39B09C0B39B07C0B39BDC
-:1001B00005C0B39B03C0B39B01C0D3C00F92DF93B4
-:1001C000C0917F00DD27CA57DF4F012EB39B03C0CC
-:1001D000DF910F90E6CF2F930F931F934F932FEF45
-:1001E0004F6F06B303FB20F95F933F9350E03BE072
-:1001F00065C016B30126502953FDC89556B3012793
-:1002000003FB25F92F7306B3B1F05027102713FB1A
-:1002100026F906B22230F0F000C016B3012703FB26
-:1002200027F90126502906B22430E8F54F772068D7
-:1002300016B30000F6CF50274F7D206206B2102F74
-:10024000000000C006B300265029102713FB26F932
-:1002500006B2E2CF4F7B06B3206400C0DACF01269E
-:100260005029187106B269F14E7F2160012F16B333
-:1002700028C0002650294D7F06B22260102F29C0C9
-:10028000012650294B7F06B22460012F2DC016B3E2
-:1002900001265029477F2860000006B22EC04F7EFD
-:1002A00006B3206130C0422706B349930026502987
-:1002B000102706B24FEF13FB20F9297F16B379F20E
-:1002C000187159F10126502906B2012703FB21F9C3
-:1002D000237F06B371F2002650293150D0F006B2C8
-:1002E000102713FB22F9277E16B351F2012650295D
-:1002F000012703FB06B223F92F7C49F2000006B365
-:10030000102713FB24F90026502906B22F7939F261
-:1003100070CF10E21ABF002717C03B503195C31BA6
-:10032000D04010E21ABF0881033CF9F00B34E9F029
-:1003300020917D001981110F1213EDCF093651F173
-:100340000D3211F0013E39F7009384003F915F9127
-:100350004F911F910F912F91DF910F90CAB7C5FD5B
-:100360001DCFCF91CFBFCF9118952091840022232C
-:1003700069F310918200112321F5343022F130937A
-:10038000820020937E0010917F003BE0311B309370
-:100390007F0019C00091820001309CF40AE5309181
-:1003A000600034FD11C000936000C2E7D0E010C0CF
-:1003B000052710E000C021C0052710E0C89508BB44
-:1003C00014C03AE501C032ED032EC0E0D0E032E0C7
-:1003D00017B31861C39A08B317BB58E120E84FEF71
-:1003E00020FF052708BB279517951C3F28F700001D
-:1003F0004552B0F720FF0527279508BB17951C3FEE
-:10040000B8F629913A9561F7077E10918300110F94
-:1004100008BBC250D04011F010937D0010E21ABF0B
-:10042000086017B3177E402F477E54E05A95F1F7C6
-:1004300008BB17BB48BB8ACF81E080936900F89462
-:10044000E0917000F0917100329785E08093570041
-:10045000E89507B600FCFDCF789408959C01E091E3
-:100460007000F0917100309749F1E430F105B1F07E
-:1004700087E1EC3BF80739F420916C0030916D0076
-:100480002E5D3B4F0DC087E1EE3BF80749F420910C
-:100490006E0030916F002D5D3B4F02C02FED3BECA5
-:1004A000F89481E0090180935700E895112478942D
-:1004B0003296F0937100E0937000089581E180938B
-:1004C0005700E895EBCF8FEF9FEFC8DF809170006A
-:1004D000909171008F739070892BA9F7ADCF1F9306
-:1004E000CF93DF9388E10FB6F89481BD11BC0FBEA6
-:1004F000E0E0F0E0859194918F5D9B4C39F4E4E06D
-:10050000F0E0859194918F5D9B4C09F0DCDF1092B7
-:10051000710010927000AC9A8BB780628BBFBB9A4F
-:1005200088E893E1ECE9F1E03197F1F70197D1F731
-:10053000BB98789410918200135017FDD4C080911D
-:100540007F00CCE0D0E0C81BD109CA57DF4F8091B3
-:100550007E008D3209F091C0183009F0C2C083ECE2
-:10056000809372008AE58093600010926B0028816E
-:10057000822F80769981882329F11092670010924A
-:100580006600992341F482E690E090938100809385
-:10059000800024E068C0913051F48C819D8190935B
-:1005A00071008093700027FD59C09FEF58C0809163
-:1005B0006800923011F4816001C08460809368000B
-:1005C00020E051C08A8110927B00992331F410926F
-:1005D0007C008BE790E022E03CC0953019F48093DA
-:1005E000830034C0963011F58B81813019F482EE8E
-:1005F00097E104C0823041F484EF97E19093810049
-:100600008093800022E10EC0833059F48A818823D0
-:1006100041F48EED97E1909381008093800024E077
-:1006200001C020E080E480936B001DC0983019F475
-:1006300085E890E009C0993019F48093850006C0E0
-:100640009A3021F48BE790E021E003C08BE790E043
-:1006500020E0909381008093800005C09E8180E817
-:1006600080936B0007C08F81882319F49E819217B5
-:1006700008F0922F9093610034C080916B0087FF47
-:1006800030C08091700090917100009739F488819A
-:10069000998190936D0080936C000DC0843091051A
-:1006A00039F48881998190936F0080936E0003C024
-:1006B000805C974138F488819981D0DE125011F026
-:1006C0002296DFCF80917000909171008F739070AF
-:1006D000892B39F4809168008260809368001092C1
-:1006E0006100109282008091600084FF3CC0809184
-:1006F00061008F3FC1F1182F893008F018E0811B8D
-:10070000809361008091720098E88927809372003D
-:100710001123E1F0E0918000F091810080916B0065
-:1007200086FF09C0912FA3E7B0E084918D933196A5
-:100730009150D9F707C0912FA3E7B0E081918D9335
-:100740009150E1F7F0938100E093800083E790E01F
-:10075000612FFDDC612F6C5F6C3019F08FEF80939F
-:1007600061006093600094E186B3887131F4915028
-:10077000D9F71092830010927D0010E0992309F4BC
-:1007800011E080916A00811739F0112319F4F8946F
-:1007900056D0789410936A008CE991E00197F1F7B4
-:1007A0008091660090916700019690936700809316
-:1007B000660080916800182F80FF14C0F894E0EC68
-:1007C000F7E1E054F04083E080935700E89507B6E6
-:1007D00000FCFDCF3097A9F71092710010927000C5
-:1007E00072DE789411FF0FC08AE390E20197F1F76F
-:1007F00080917000909171008F739070892B11F02F
-:1008000062DE01C019DE12FD0AC0109268008091FC
-:100810006600909167008055934C08F48BCE82E27D
-:1008200091EA0197F1F7F8941BBE15BA10925F0296
-:1008300010925E0232CCDF91CF911F910895FF920A
-:100840000F931F93CF93DF9380E8F82E00E0C0E072
-:10085000D0E0102F1F0D11BF7EDC29E084339207FA
-:100860000CF0102FF6942196C830D10511F0012F0D
-:10087000F0CF115011BF1F5F012FEC0110C06BDCD6
-:100880008453994097FF03C0909581959F4F8C1793
-:100890009D0714F401B7EC0181B78F5F81BF21B7C9
-:1008A00030E0812F90E001968217930744F701BF53
-:1008B000DF91CF911F910F91FF900895F894FFCF92
-:1008C0005AFF17BC400800000000000000000000B4
-:1008D0000000000000000000000000000000000018
-:1008E00000000000000011241FBECFE5D2E0DEBFF3
-:1008F000CDBF10E0A0E6B0E0EEE8FBE002C005905E
-:100900000D92A236B107D9F720D13FC1B9CB05C0AE
-:10091000EDE1F0E13197F1F701970097C9F70895FC
-:10092000AC01407C20E030E0F901E40FF51F859137
-:100930009491F901EE7FE60FF71F918380832E5F7C
-:100940003F4F2034310581F70895FC01E07C83E0BE
-:1009500080935700E89507B600FCFDCF0895CF932C
-:10096000DF93EC01A0E0B0E0AD014C0F5D1FFB0197
-:10097000EA0FFB1F8081918121E0FA010C01209395
-:100980005700E89511241296A034B10569F785E067
-:10099000FE0180935700E89507B600FCFDCFDF917C
-:1009A000CF910895DF93CF93CDB7DEB7C054D04039
-:1009B0000FB6F894DEBF0FBECDBF2091600030911E
-:1009C00061003695279521503044FE0131962193E0
-:1009D0003193CE018F5B9F4FE817F907C1F780E095
-:1009E00090E0B3DF80E090E0BE016F5F7F4FB7DF44
-:1009F000C05CDF4F0FB6F894DEBF0FBECDBFCF9106
-:100A0000DF910895EF92FF920F931F93DF93CF939F
-:100A1000CDB7DEB7C054D0400FB6F894DEBF0FBEDE
-:100A2000CDBF00E010E035C09B01359527957E01D4
-:100A30000894E11CF11C88E0A63CB80738F0220FAE
-:100A4000331FE20EF31E8FEF9FEF07C0FD0185916C
-:100A50009491220F331FE20EF31EF70191838083DE
-:100A60006E5F7F4F129660347105F1F680916000E1
-:100A700090916100800F911F68DF809160009091DC
-:100A80006100800F911FBE016F5F7F4F68DF005CC8
-:100A90001F4FF8E000341F0731F0D801A256BF4FB6
-:100AA00060E070E0C1CFC05CDF4F0FB6F894DEBFEE
-:100AB0000FBECDBFCF91DF911F910F91FF90EF90AF
-:100AC0000895DF93CF93CDB7DEB7C054D0400FB6B3
-:100AD000F894DEBF0FBECDBF80E090E0BE016F5F37
-:100AE0007F4F1EDF80E090E0019680329105E1F7B4
-:100AF0008FEF9FEF9A83898380E090E026DF80E08C
-:100B000090E0BE016F5F7F4F2ADFC05CDF4F0FB602
-:100B1000F894DEBF0FBECDBFCF91DF91089587B3AC
-:100B2000836087BBC19820E08DE190E1FC013197A3
-:100B3000F1F7C19A0197F1F7C1982F5F2A3FA1F70A
-:100B40000895E0E0F0E00995089588B318BA87B3F6
-:100B50008FEF87BB8AEF90E0EDE1F0E13197F1F79D
-:100B60000197D1F787B317BA8AEF90E0EDE1F0E192
-:100B70003197F1F70197D1F7F894A3DF43DF12DF44
-:0E0B8000CEDFDFDF80E090E00895F894FFCF35
-:020B8E00C0178E
-:040000030000008079
-:00000001FF
diff --git a/upgrade/releases/micronucleus-1.06-jumper-v2-upgrade.hex b/upgrade/releases/micronucleus-1.06-jumper-v2-upgrade.hex
deleted file mode 100644
index 019c7e0..0000000
--- a/upgrade/releases/micronucleus-1.06-jumper-v2-upgrade.hex
+++ /dev/null
@@ -1,185 +0,0 @@
-:1000000003C003C003C003C003C003C003C003C0D8
-:1000800040C462C461C460C45FC45EC45DC45CC477
-:100090005BC45AC459C458C457C456C455C422C0BA
-:1000A00040C06CC03EC03DC03CC03BC03AC039C03F
-:1000B00038C037C036C035C034C033C0040309046B
-:1000C00012011001FF000008D016530706010000BE
-:1000D0000001090212000101008032090400000041
-:1000E0000000000011241FBECFE5D2E0DEBFCDBF6F
-:1000F00000EB0F9307E00F9310E0A0E6B0E0EEED09
-:10010000FFE102C005900D92A636B107D9F710E0C5
-:10011000A6E6B0E001C01D92AC39B107E1F7E7D126
-:10012000EBC3BDCFA82FB92F80E090E041E050EAAB
-:10013000609530E009C02D9182279795879510F042
-:1001400084279527305EC8F36F5FA8F30895EADF30
-:100150008D939D930895A6E088279927AA9569F025
-:100160000197E1F3B399FCCFB39BFECF81E09927D0
-:10017000A6B3019611F0A871D9F70895CF93CFB720
-:10018000CF93C0915F02C03B21F4C0915E02C730A3
-:1001900021F0CF91CFBFCF9181CFCC27C395B39B17
-:1001A000E9F7B39B0BC0B39B09C0B39B07C0B39BDC
-:1001B00005C0B39B03C0B39B01C0D3C00F92DF93B4
-:1001C000C0917F00DD27CA57DF4F012EB39B03C0CC
-:1001D000DF910F90E6CF2F930F931F934F932FEF45
-:1001E0004F6F06B303FB20F95F933F9350E03BE072
-:1001F00065C016B30126502953FDC89556B3012793
-:1002000003FB25F92F7306B3B1F05027102713FB1A
-:1002100026F906B22230F0F000C016B3012703FB26
-:1002200027F90126502906B22430E8F54F772068D7
-:1002300016B30000F6CF50274F7D206206B2102F74
-:10024000000000C006B300265029102713FB26F932
-:1002500006B2E2CF4F7B06B3206400C0DACF01269E
-:100260005029187106B269F14E7F2160012F16B333
-:1002700028C0002650294D7F06B22260102F29C0C9
-:10028000012650294B7F06B22460012F2DC016B3E2
-:1002900001265029477F2860000006B22EC04F7EFD
-:1002A00006B3206130C0422706B349930026502987
-:1002B000102706B24FEF13FB20F9297F16B379F20E
-:1002C000187159F10126502906B2012703FB21F9C3
-:1002D000237F06B371F2002650293150D0F006B2C8
-:1002E000102713FB22F9277E16B351F2012650295D
-:1002F000012703FB06B223F92F7C49F2000006B365
-:10030000102713FB24F90026502906B22F7939F261
-:1003100070CF10E21ABF002717C03B503195C31BA6
-:10032000D04010E21ABF0881033CF9F00B34E9F029
-:1003300020917D001981110F1213EDCF093651F173
-:100340000D3211F0013E39F7009384003F915F9127
-:100350004F911F910F912F91DF910F90CAB7C5FD5B
-:100360001DCFCF91CFBFCF9118952091840022232C
-:1003700069F310918200112321F5343022F130937A
-:10038000820020937E0010917F003BE0311B309370
-:100390007F0019C00091820001309CF40AE5309181
-:1003A000600034FD11C000936000C2E7D0E010C0CF
-:1003B000052710E000C021C0052710E0C89508BB44
-:1003C00014C03AE501C032ED032EC0E0D0E032E0C7
-:1003D00017B31861C39A08B317BB58E120E84FEF71
-:1003E00020FF052708BB279517951C3F28F700001D
-:1003F0004552B0F720FF0527279508BB17951C3FEE
-:10040000B8F629913A9561F7077E10918300110F94
-:1004100008BBC250D04011F010937D0010E21ABF0B
-:10042000086017B3177E402F477E54E05A95F1F7C6
-:1004300008BB17BB48BB8ACF81E080936900F89462
-:10044000E0917000F0917100329785E08093570041
-:10045000E89507B600FCFDCF789408959C01E091E3
-:100460007000F0917100309789F1E430F105F1F0FE
-:1004700087E1EC37F80739F420916C0030916D007A
-:100480002E5B3B4F15C087E1EE37F80739F420911A
-:100490006E0030916F002D5B3B4F0AC087E1EA3759
-:1004A000F80731F481B7282F30E002C02FEB3BEC86
-:1004B000F89481E0090180935700E895112478941D
-:1004C0003296F0937100E0937000089581E180937B
-:1004D0005700E895EBCF8FEF9FEFC0DF8091700062
-:1004E000909171008F739070892BA9F7A5CF1F93FE
-:1004F000CF93DF9388E10FB6F89481BD11BC0FBE96
-:10050000E0E0F0E0859194918F5B9B4C39F4E4E05E
-:10051000F0E0859194918F5B9B4C09F0DCDF1092A9
-:10052000710010927000C59A82E291EA0197F1F78A
-:10053000B5997DC1AC9A8BB780628BBFBB9A88E8B6
-:1005400093E1ECE9F1E03197F1F70197D1F7BB982E
-:10055000789410918200135017FDD4C080917F00D1
-:10056000CCE0D0E0C81BD109CA57DF4F80917E0094
-:100570008D3209F091C0183009F0C2C083EC80932D
-:1005800072008AE58093600010926B002881822FB0
-:1005900080769981882329F1109267001092660075
-:1005A000992341F482E690E090938100809380004B
-:1005B00024E068C0913051F48C819D81909371004A
-:1005C0008093700027FD59C09FEF58C0809168004C
-:1005D000923011F4816001C084608093680020E053
-:1005E00051C08A8110927B00992331F410927C00D3
-:1005F0008BE790E022E03CC0953019F480938300B3
-:1006000034C0963011F58B81813019F482EA97E17C
-:1006100004C0823041F484EB97E190938100809391
-:10062000800022E10EC0833059F48A81882341F48E
-:100630008EE997E1909381008093800024E001C0CF
-:1006400020E080E480936B001DC0983019F485E8A9
-:1006500090E009C0993019F48093850006C09A3063
-:1006600021F48BE790E021E003C08BE790E020E0ED
-:10067000909381008093800005C09E8180E88093E4
-:100680006B0007C08F81882319F49E81921708F0B0
-:10069000922F9093610034C080916B0087FF30C02F
-:1006A0008091700090917100009739F48881998150
-:1006B00090936D0080936C000DC08430910539F4E7
-:1006C0008881998190936F0080936E0003C0805859
-:1006D000974138F488819981C1DE125011F0229639
-:1006E000DFCF80917000909171008F739070892B93
-:1006F00039F48091680082608093680010926100F4
-:10070000109282008091600084FF3CC08091610063
-:100710008F3FC1F1182F893008F018E0811B8093BA
-:1007200061008091720098E88927809372001123FC
-:10073000E1F0E0918000F091810080916B0086FFF4
-:1007400009C0912FA3E7B0E084918D933196915029
-:10075000D9F707C0912FA3E7B0E081918D93915015
-:10076000E1F7F0938100E093800083E790E0612F50
-:10077000EEDC612F6C5F6C3019F08FEF80936100BD
-:100780006093600094E186B3887131F49150D9F799
-:100790001092830010927D0010E0992309F411E07B
-:1007A00080916A00811739F0112319F4F89465D00B
-:1007B000789410936A008CE991E00197F1F78091A9
-:1007C00066009091670001969093670080936600A1
-:1007D00080916800182F80FF14C0F894E0E8F7E1DA
-:1007E000E054F04083E080935700E89507B600FCA2
-:1007F000FDCF3097A9F710927100109270006BDE58
-:10080000789411FF0FC08AE390E20197F1F780918D
-:100810007000909171008F739070892B11F05BDEE6
-:1008200001C00ADE12FD03C01092680092CE82E27F
-:1008300091EA0197F1F718BAF8941BBE15BA109215
-:100840005F0210925E02EAE7F7E19491892F8150EE
-:100850008E3F20F00DC081B7815081BF81B79817BE
-:10086000D0F303C081B78F5F81BF81B78917D0F301
-:1008700014CCDF91CF911F910895FF920F931F9396
-:10088000CF93DF9380E8F82E00E0C0E0D0E0102F97
-:100890001F0D11BF60DC29E0843392070CF0102F8C
-:1008A000F6942196C830D10511F0012FF0CF1150E8
-:1008B00011BF1F5F012FEC0110C04DDC8453994024
-:1008C00097FF03C0909581959F4F8C179D0714F457
-:1008D00001B7EC0181B78F5F81BF21B730E0812F75
-:1008E00090E001968217930744F701BFDF91CF9103
-:1008F0001F910F91FF900895F894FFCF5AFF177C36
-:10090000400800000000000000000000000000009F
-:1009100000000000000000000000000000000000D7
-:10092000000011241FBECFE5D2E0DEBFCDBF10E036
-:10093000A0E6B0E0EAECFBE002C005900D92A23622
-:10094000B107D9F720D13FC19BCB05C0EDE1F0E164
-:100950003197F1F701970097C9F70895AC01407CF2
-:1009600020E030E0F901E40FF51F85919491F90141
-:10097000EE7FE60FF71F918380832E5F3F4F203479
-:10098000310581F70895FC01E07C83E080935700F6
-:10099000E89507B600FCFDCF0895CF93DF93EC01F7
-:1009A000A0E0B0E0AD014C0F5D1FFB01EA0FFB1FA3
-:1009B0008081918121E0FA010C0120935700E89594
-:1009C00011241296A034B10569F785E0FE018093E9
-:1009D0005700E89507B600FCFDCFDF91CF91089551
-:1009E000DF93CF93CDB7DEB7C054D0400FB6F894A5
-:1009F000DEBF0FBECDBF2091600030916100369503
-:100A0000279521503044FE01319621933193CE0138
-:100A10008F5B9F4FE817F907C1F780E090E0B3DFE5
-:100A200080E090E0BE016F5F7F4FB7DFC05CDF4FBB
-:100A30000FB6F894DEBF0FBECDBFCF91DF91089502
-:100A4000EF92FF920F931F93DF93CF93CDB7DEB753
-:100A5000C054D0400FB6F894DEBF0FBECDBF00E04B
-:100A600010E035C09B01359527957E010894E11C67
-:100A7000F11C89E0A230B80738F0220F331FE20ED4
-:100A8000F31E8FEF9FEF07C0FD0185919491220F18
-:100A9000331FE20EF31EF701918380836E5F7F4F59
-:100AA000129660347105F1F68091600090916100BA
-:100AB000800F911F68DF8091600090916100800F2E
-:100AC000911FBE016F5F7F4F68DF005C1F4FF8E032
-:100AD00000381F0731F0D801A256BF4F60E070E028
-:100AE000C1CFC05CDF4F0FB6F894DEBF0FBECDBFE5
-:100AF000CF91DF911F910F91FF90EF900895DF93B9
-:100B0000CF93CDB7DEB7C054D0400FB6F894DEBF58
-:100B10000FBECDBF80E090E0BE016F5F7F4F1EDF54
-:100B200080E090E0019680329105E1F78FEF9FEF32
-:100B30009A83898380E090E026DF80E090E0BE0128
-:100B40006F5F7F4F2ADFC05CDF4F0FB6F894DEBFC8
-:100B50000FBECDBFCF91DF91089587B3836087BB70
-:100B6000C19820E08DE190E1FC013197F1F7C19A45
-:100B70000197F1F7C1982F5F2A3FA1F70895E0E0B0
-:100B8000F0E00995089588B318BA87B38FEF87BB53
-:100B90008AEF90E0EDE1F0E13197F1F70197D1F7BD
-:100BA00087B317BA8AEF90E0EDE1F0E13197F1F702
-:100BB0000197D1F7F894A3DF43DF12DFCEDFDFDF49
-:0A0BC00080E090E00895F894FFCF64
-:020BCA00801792
-:040000030000008079
-:00000001FF
diff --git a/upgrade/releases/micronucleus-1.06-upgrade.hex b/upgrade/releases/micronucleus-1.06-upgrade.hex
deleted file mode 100644
index 90ffe74..0000000
--- a/upgrade/releases/micronucleus-1.06-upgrade.hex
+++ /dev/null
@@ -1,185 +0,0 @@
-:1000000003C003C003C003C003C003C003C003C0D8
-:100080003FC461C460C45FC45EC45DC45CC45BC47F
-:100090005AC459C458C457C456C455C454C422C0C1
-:1000A00040C06CC03EC03DC03CC03BC03AC039C03F
-:1000B00038C037C036C035C034C033C0040309046B
-:1000C00012011001FF000008D016530706010000BE
-:1000D0000001090212000101008032090400000041
-:1000E0000000000011241FBECFE5D2E0DEBFCDBF6F
-:1000F00000EB0F9307E00F9310E0A0E6B0E0ECED0B
-:10010000FFE102C005900D92A636B107D9F710E0C5
-:10011000A6E6B0E001C01D92AC39B107E1F7E7D126
-:10012000EAC3BDCFA82FB92F80E090E041E050EAAC
-:10013000609530E009C02D9182279795879510F042
-:1001400084279527305EC8F36F5FA8F30895EADF30
-:100150008D939D930895A6E088279927AA9569F025
-:100160000197E1F3B399FCCFB39BFECF81E09927D0
-:10017000A6B3019611F0A871D9F70895CF93CFB720
-:10018000CF93C0915F02C03B21F4C0915E02C730A3
-:1001900021F0CF91CFBFCF9181CFCC27C395B39B17
-:1001A000E9F7B39B0BC0B39B09C0B39B07C0B39BDC
-:1001B00005C0B39B03C0B39B01C0D3C00F92DF93B4
-:1001C000C0917F00DD27CA57DF4F012EB39B03C0CC
-:1001D000DF910F90E6CF2F930F931F934F932FEF45
-:1001E0004F6F06B303FB20F95F933F9350E03BE072
-:1001F00065C016B30126502953FDC89556B3012793
-:1002000003FB25F92F7306B3B1F05027102713FB1A
-:1002100026F906B22230F0F000C016B3012703FB26
-:1002200027F90126502906B22430E8F54F772068D7
-:1002300016B30000F6CF50274F7D206206B2102F74
-:10024000000000C006B300265029102713FB26F932
-:1002500006B2E2CF4F7B06B3206400C0DACF01269E
-:100260005029187106B269F14E7F2160012F16B333
-:1002700028C0002650294D7F06B22260102F29C0C9
-:10028000012650294B7F06B22460012F2DC016B3E2
-:1002900001265029477F2860000006B22EC04F7EFD
-:1002A00006B3206130C0422706B349930026502987
-:1002B000102706B24FEF13FB20F9297F16B379F20E
-:1002C000187159F10126502906B2012703FB21F9C3
-:1002D000237F06B371F2002650293150D0F006B2C8
-:1002E000102713FB22F9277E16B351F2012650295D
-:1002F000012703FB06B223F92F7C49F2000006B365
-:10030000102713FB24F90026502906B22F7939F261
-:1003100070CF10E21ABF002717C03B503195C31BA6
-:10032000D04010E21ABF0881033CF9F00B34E9F029
-:1003300020917D001981110F1213EDCF093651F173
-:100340000D3211F0013E39F7009384003F915F9127
-:100350004F911F910F912F91DF910F90CAB7C5FD5B
-:100360001DCFCF91CFBFCF9118952091840022232C
-:1003700069F310918200112321F5343022F130937A
-:10038000820020937E0010917F003BE0311B309370
-:100390007F0019C00091820001309CF40AE5309181
-:1003A000600034FD11C000936000C2E7D0E010C0CF
-:1003B000052710E000C021C0052710E0C89508BB44
-:1003C00014C03AE501C032ED032EC0E0D0E032E0C7
-:1003D00017B31861C39A08B317BB58E120E84FEF71
-:1003E00020FF052708BB279517951C3F28F700001D
-:1003F0004552B0F720FF0527279508BB17951C3FEE
-:10040000B8F629913A9561F7077E10918300110F94
-:1004100008BBC250D04011F010937D0010E21ABF0B
-:10042000086017B3177E402F477E54E05A95F1F7C6
-:1004300008BB17BB48BB8ACF81E080936900F89462
-:10044000E0917000F0917100329785E08093570041
-:10045000E89507B600FCFDCF789408959C01E091E3
-:100460007000F0917100309789F1E430F105F1F0FE
-:1004700087E1EC37F80739F420916C0030916D007A
-:100480002E5B3B4F15C087E1EE37F80739F420911A
-:100490006E0030916F002D5B3B4F0AC087E1EA3759
-:1004A000F80731F481B7282F30E002C02FEB3BEC86
-:1004B000F89481E0090180935700E895112478941D
-:1004C0003296F0937100E0937000089581E180937B
-:1004D0005700E895EBCF8FEF9FEFC0DF8091700062
-:1004E000909171008F739070892BA9F7A5CF1F93FE
-:1004F000CF93DF9388E10FB6F89481BD11BC0FBE96
-:10050000E0E0F0E0859194918F5B9B4C39F4E4E05E
-:10051000F0E0859194918F5B9B4C09F0DCDF1092A9
-:10052000710010927000AC9A8BB780628BBFBB9A3F
-:1005300088E893E1ECE9F1E03197F1F70197D1F721
-:10054000BB98789410918200135017FDD4C080910D
-:100550007F00CCE0D0E0C81BD109CA57DF4F8091A3
-:100560007E008D3209F091C0183009F0C2C083ECD2
-:10057000809372008AE58093600010926B0028815E
-:10058000822F80769981882329F11092670010923A
-:100590006600992341F482E690E090938100809375
-:1005A000800024E068C0913051F48C819D8190934B
-:1005B00071008093700027FD59C09FEF58C0809153
-:1005C0006800923011F4816001C0846080936800FB
-:1005D00020E051C08A8110927B00992331F410925F
-:1005E0007C008BE790E022E03CC0953019F48093CA
-:1005F000830034C0963011F58B81813019F482EA82
-:1006000097E104C0823041F484EB97E1909381003C
-:100610008093800022E10EC0833059F48A818823C0
-:1006200041F48EE997E1909381008093800024E06B
-:1006300001C020E080E480936B001DC0983019F465
-:1006400085E890E009C0993019F48093850006C0D0
-:100650009A3021F48BE790E021E003C08BE790E033
-:1006600020E0909381008093800005C09E8180E807
-:1006700080936B0007C08F81882319F49E819217A5
-:1006800008F0922F9093610034C080916B0087FF37
-:1006900030C08091700090917100009739F488818A
-:1006A000998190936D0080936C000DC0843091050A
-:1006B00039F48881998190936F0080936E0003C014
-:1006C0008058974138F488819981C8DE125011F022
-:1006D0002296DFCF80917000909171008F7390709F
-:1006E000892B39F4809168008260809368001092B1
-:1006F0006100109282008091600084FF3CC0809174
-:1007000061008F3FC1F1182F893008F018E0811B7C
-:10071000809361008091720098E88927809372002D
-:100720001123E1F0E0918000F091810080916B0055
-:1007300086FF09C0912FA3E7B0E084918D93319695
-:100740009150D9F707C0912FA3E7B0E081918D9325
-:100750009150E1F7F0938100E093800083E790E00F
-:10076000612FF5DC612F6C5F6C3019F08FEF809397
-:1007700061006093600094E186B3887131F4915018
-:10078000D9F71092830010927D0010E0992309F4AC
-:1007900011E080916A00811739F0112319F4F8945F
-:1007A0006BD0789410936A008CE991E00197F1F78F
-:1007B0008091660090916700019690936700809306
-:1007C000660080916800182F80FF14C0F894E0E85C
-:1007D000F7E1E054F04083E080935700E89507B6D6
-:1007E00000FCFDCF3097A9F71092710010927000B5
-:1007F00072DE789411FF0FC08AE390E20197F1F75F
-:1008000080917000909171008F739070892B11F01E
-:1008100062DE01C011DE12FD0AC0109268008091F4
-:100820006600909167008055934C08F48BCE82E26D
-:1008300091EA0197F1F7F8941BBE15BA10925F0286
-:1008400010925E02EAE7F7E19491892F81508E3F82
-:1008500020F00DC081B7815081BF81B79817D0F3C8
-:1008600003C081B78F5F81BF81B78917D0F315CCE3
-:10087000DF91CF911F910895FF920F931F93CF9314
-:10088000DF9380E8F82E00E0C0E0D0E0102F1F0DCD
-:1008900011BF61DC29E0843392070CF0102FF6942D
-:1008A0002196C830D10511F0012FF0CF115011BFA2
-:1008B0001F5F012FEC0110C04EDC8453994097FF5D
-:1008C00003C0909581959F4F8C179D0714F401B735
-:1008D000EC0181B78F5F81BF21B730E0812F90E0BD
-:1008E00001968217930744F701BFDF91CF911F91C3
-:1008F0000F91FF900895F894FFCF5AFF177C40089E
-:1009000000000000000000000000000000000000E7
-:1009100000000000000000000000000000000000D7
-:1009200011241FBECFE5D2E0DEBFCDBF10E0A0E6B0
-:10093000B0E0E8ECFBE002C005900D92A236B107F2
-:10094000D9F720D13FC19CCB05C0EDE1F0E1319753
-:10095000F1F701970097C9F70895AC01407C20E0BA
-:1009600030E0F901E40FF51F85919491F901EE7FD4
-:10097000E60FF71F918380832E5F3F4F20343105B0
-:1009800081F70895FC01E07C83E080935700E895AF
-:1009900007B600FCFDCF0895CF93DF93EC01A0E0F4
-:1009A000B0E0AD014C0F5D1FFB01EA0FFB1F808122
-:1009B000918121E0FA010C0120935700E895112460
-:1009C0001296A034B10569F785E0FE0180935700C7
-:1009D000E89507B600FCFDCFDF91CF910895DF9336
-:1009E000CF93CDB7DEB7C054D0400FB6F894DEBF7A
-:1009F0000FBECDBF209160003091610036952795E4
-:100A000021503044FE01319621933193CE018F5B0A
-:100A10009F4FE817F907C1F780E090E0B3DF80E06F
-:100A200090E0BE016F5F7F4FB7DFC05CDF4F0FB656
-:100A3000F894DEBF0FBECDBFCF91DF910895EF9246
-:100A4000FF920F931F93DF93CF93CDB7DEB7C054C0
-:100A5000D0400FB6F894DEBF0FBECDBF00E010E06F
-:100A600035C09B01359527957E010894E11CF11C4A
-:100A700089E0A030B80738F0220F331FE20EF31ED2
-:100A80008FEF9FEF07C0FD0185919491220F331FD7
-:100A9000E20EF31EF701918380836E5F7F4F129603
-:100AA00060347105F1F68091600090916100800FD3
-:100AB000911F68DF8091600090916100800F911F0D
-:100AC000BE016F5F7F4F68DF005C1F4FF8E00038AA
-:100AD0001F0731F0D801A256BF4F60E070E0C1CFD0
-:100AE000C05CDF4F0FB6F894DEBF0FBECDBFCF9115
-:100AF000DF911F910F91FF90EF900895DF93CF93B7
-:100B0000CDB7DEB7C054D0400FB6F894DEBF0FBEED
-:100B1000CDBF80E090E0BE016F5F7F4F1EDF80E0C1
-:100B200090E0019680329105E1F78FEF9FEF9A8375
-:100B3000898380E090E026DF80E090E0BE016F5F77
-:100B40007F4F2ADFC05CDF4F0FB6F894DEBF0FBEC9
-:100B5000CDBFCF91DF91089587B3836087BBC198E4
-:100B600020E08DE190E1FC013197F1F7C19A019706
-:100B7000F1F7C1982F5F2A3FA1F70895E0E0F0E078
-:100B80000995089588B318BA87B38FEF87BB8AEFAA
-:100B900090E0EDE1F0E13197F1F70197D1F787B3FC
-:100BA00017BA8AEF90E0EDE1F0E13197F1F70197A4
-:100BB000D1F7F894A3DF43DF12DFCEDFDFDF80E081
-:080BC00090E00895F894FFCFC6
-:020BC800801794
-:040000030000008079
-:00000001FF
diff --git a/upgrade/releases/micronucleus-1.10-ledpb1-upgrade.hex b/upgrade/releases/micronucleus-1.10-ledpb1-upgrade.hex
deleted file mode 100644
index d70f544..0000000
--- a/upgrade/releases/micronucleus-1.10-ledpb1-upgrade.hex
+++ /dev/null
@@ -1,168 +0,0 @@
-:1000000003C003C003C003C003C003C003C003C0D8
-:10008000BEC3E8C3E7C3E6C3E5C3E4C3E3C3E2C357
-:10009000E1C3E0C3DFC3DEC3DDC3DCC3DBC317C022
-:1000A00016C04CC014C009021200010100803209C0
-:1000B000040000000000000012011001FF00000811
-:1000C000D01653070A01000000010403090411249B
-:1000D0001FBECFE5D2E0CDBFDEBF00EB0F9307E040
-:1000E0000F9310E0A0E6B0E0EAEDFFE102C005905A
-:1000F0000D92A636B107D9F720E0A6E6B0E001C020
-:100100001D92AB39B207E1F7ECC1A82FB92F80E0FF
-:1001100090E041E050EA609530E009C02D918227DF
-:100120009795879510F084279527305EC8F36F5F09
-:10013000A8F30895EADF8D939D930895CF93CFB7E9
-:10014000CF93C0915F02C03B21F4C0915E02C730E3
-:1001500021F0CF91CFBFCF91A1CFCC27C395B39B37
-:10016000E9F7B39B0BC0B39B09C0B39B07C0B39B1C
-:1001700005C0B39B03C0B39B01C0D3C00F92DF93F4
-:10018000C0917E00DD27CB57DF4F012EB39B03C00C
-:10019000DF910F90E6CF2F930F931F934F932FEF85
-:1001A0004F6F06B303FB20F95F933F9350E03BE0B2
-:1001B00065C016B30126502953FDC89556B30127D3
-:1001C00003FB25F92F7306B3B1F05027102713FB5B
-:1001D00026F906B22230F0F000C016B3012703FB67
-:1001E00027F90126502906B22430E8F54F77206818
-:1001F00016B30000F6CF50274F7D206206B2102FB5
-:10020000000000C006B300265029102713FB26F972
-:1002100006B2E2CF4F7B06B3206400C0DACF0126DE
-:100220005029187106B269F14E7F2160012F16B373
-:1002300028C0002650294D7F06B22260102F29C009
-:10024000012650294B7F06B22460012F2DC016B322
-:1002500001265029477F2860000006B22EC04F7E3D
-:1002600006B3206130C0422706B3499300265029C7
-:10027000102706B24FEF13FB20F9297F16B379F24E
-:10028000187159F10126502906B2012703FB21F903
-:10029000237F06B371F2002650293150D0F006B208
-:1002A000102713FB22F9277E16B351F2012650299D
-:1002B000012703FB06B223F92F7C49F2000006B3A5
-:1002C000102713FB24F90026502906B22F7939F2A2
-:1002D00070CF10E21ABF002717C03B503195C31BE7
-:1002E000D04010E21ABF0881033CF9F00B34E9F06A
-:1002F00020917C001981110F1213EDCF093651F1B5
-:100300000D3211F0013E39F7009383003F915F9168
-:100310004F911F910F912F91DF910F90CAB7C5FD9B
-:100320001DCFCF91CFBFCF9118952091830022236D
-:1003300069F310918100112321F5343022F13093BB
-:10034000810020937D0010917E003BE0311B3093B3
-:100350007E0019C00091810001309CF40AE53091C3
-:10036000600034FD11C000936000C1E7D0E010C010
-:10037000052710E000C021C0052710E0C89508BB84
-:1003800014C03AE501C032ED032EC0E0D0E032E007
-:1003900017B31861C39A08B317BB58E120E84FEFB1
-:1003A00020FF052708BB279517951C3F28F700005D
-:1003B0004552B0F720FF0527279508BB17951C3F2E
-:1003C000B8F629913A9561F7077E10918200110FD6
-:1003D00008BBC250D04011F010937C0010E21ABF4D
-:1003E000086017B3177E402F477E54E05A95F1F707
-:1003F00008BB17BB48BB8ACFF8942FEFB0E8A0E446
-:100400004AE0B1BF000081EE9CE0B399FECFB39B00
-:10041000FECF0197B399FDCF97FF03C0BA1B81951B
-:1004200001C0BA0FA69529F4281710F031B7282F6C
-:10043000A1E0415031F731BF000078940895F8945D
-:10044000E0916A00F0916B00329785E0809357004D
-:10045000E89578940895E0916A00F0916B003097E8
-:1004600029F490936D0080936C0007C0E430F1058F
-:1004700039F490936F0080936E008FE39CEC1CC066
-:10048000EC3728E1F20739F480916C0090916D000F
-:100490008E539C4F11C0EE3728E1F20739F480915A
-:1004A0006E0090916F008D539C4F06C0EA3728E193
-:1004B000F20711F481B790E02FB7F894309721F448
-:1004C00031E130935700E89531E00C01309357004B
-:1004D000E89511243296F0936B00E0936A002FBFE9
-:1004E000089514BE88E10FB6F89481BD11BC0FBE0B
-:1004F000C198BB9A88E893E1ECE9F1E03197F1F714
-:100500000197D1F7BB98AC9A8BB780628BBF789478
-:1005100000918100035007FDBAC080917E00CCE0BD
-:10052000D0E0C81BD109CB57DF4F80917D008D32C1
-:1005300009F08EC0083009F0A8C083EC80937100E8
-:100540008AE580936000109269002881922F90764E
-:100550008981992319F110926700811108C082E600
-:1005600090E09093800080937F0014E067C081301A
-:1005700051F48C819D8190936B0080936A0027FDDC
-:1005800058C01FEF57C090916800823011F49160FD
-:1005900001C094609093680010E050C09A8110925E
-:1005A0007A00811106C010927B008AE790E012E089
-:1005B0003BC0853019F4909382002CC0863009F539
-:1005C0008B81813019F48AE998E104C0823041F4CA
-:1005D00088E898E19093800080937F0012E10DC03D
-:1005E000833051F4911108C08CEA98E19093800017
-:1005F00080937F0014E001C010E080E480936900E4
-:100600001DC0883059F0893019F49093840002C0DD
-:100610008A3039F08AE790E010E006C084E890E084
-:1006200002C08AE790E011E09093800080937F0001
-:1006300005C01E8180E88093690007C08F81811109
-:1006400004C08E81811708F4182F109361001DC01B
-:100650008091690087FF19C080916A0090916B00BA
-:100660008038984128F080916A008F7339F00DC06E
-:1006700089919991F0DE025079F7F5CF8091680069
-:1006800082608093680010926100109281008091D6
-:10069000600084FF43C0809161008F3F09F43EC039
-:1006A000082F893008F008E0801B8093610080915A
-:1006B000710098E8892780937100002319F1E09177
-:1006C0007F00F09180008091690086FF0BC0A2E757
-:1006D000B0E084918D93319682E790E0800F8A1389
-:1006E000F8CF0CC0CF01A2E7B0E0FC012191CF010F
-:1006F0002D9322E730E0200F2A13F7CFF0938000EC
-:10070000E0937F00602F82E790E014DD0C5F0C30F7
-:1007100019F08FEF809361000093600084E196B33D
-:10072000987131F48150D9F71092820010927C00B8
-:1007300001E0811100E080917000801739F0011113
-:1007400003C01092670058DE009370008CE991E0BE
-:100750000197F1F70091680000FF17C0F894E0E8F6
-:10076000F8E1E054F10983E080935700E895309771
-:10077000C1F710926B0010926A0088E0F82E8FEF9C
-:100780009FEF69DEFA94D9F75ADE01FF05C08AE3CC
-:1007900090E20197F1F753DE02FF13C0B99882E2AD
-:1007A00091EA0197F1F7F894BB9A1BBE15BA109223
-:1007B0005F02EAE7F8E1E4918E2F81508E3FC0F0AE
-:1007C00019C010926800809167008D7011F0B9987F
-:1007D00001C0B99A8091660090916700019690934C
-:1007E00067008093660080369A4E08F491CED6CF8B
-:1007F000E1BF000052CC22CF5AFF187A4008000017
-:1008000000000000000000000000000000000000E8
-:1008100000000000000000000000000000001124A3
-:100820001FBECFE5D2E0DEBFCDBF10E0A0E6B0E056
-:10083000EAEBFAE002C005900D92A236B107D9F7B3
-:1008400010E0A2E6B0E001C01D92A236B107E1F7C8
-:100850001CD131C115CC05C0EDE1F0E13197F1F7C4
-:1008600001970097C9F70895AC01407C80E090E0C3
-:10087000FC01E40FF51F25913491FC01EE7FE60F9A
-:10088000F71F2083318302968034910589F70895FC
-:10089000FC01E07C83E080935700E89507B600FCFC
-:1008A000FDCF0895CF93DF93EC01AB01DB0120E096
-:1008B00030E0FE01E41BF50BEA0FFB1F8D919D91CB
-:1008C00061E00C0160935700E89511242F5F3F4FC2
-:1008D0002032310571F785E0FE0180935700E895DD
-:1008E00007B600FCFDCFDF91CF910895CF93DF9342
-:1008F000CDB7DEB7C054D0400FB6F894DEBF0FBE00
-:10090000CDBF809160009091610096958795815050
-:100910009044FE0131969E012F5B3F4F819391934E
-:10092000E217F307D9F780E090E0B2DF80E090E0D3
-:10093000BE016F5F7F4FB6DFC05CDF4F0FB6F8942C
-:10094000DEBF0FBECDBFDF91CF9108950F931F93F0
-:10095000CF93DF93CDB7DEB7C054D0400FB6F89435
-:10096000DEBF0FBECDBF00E010E040C080E090E0F1
-:10097000F801E256FF4FE80FF91F9C0135952795C6
-:1009800047E0EE3FF40770F0F901EE0FFF1F21E0A2
-:1009900030E02C0F3D1FE20FF31F2FEF3FEF3183AD
-:1009A00020830DC045915491F901EE0FFF1F21E006
-:1009B00030E02C0F3D1FE20FF31F4083518302965E
-:1009C00080349105A9F68091600090916100800FBC
-:1009D000911F5EDF8091600090916100800F911FF8
-:1009E000BE016F5F7F4F5EDF005C1F4F37E0003856
-:1009F000130709F0BBCFC05CDF4F0FB6F894DEBF22
-:100A00000FBECDBFDF91CF911F910F910895CF936E
-:100A1000DF93CDB7DEB7C054D0400FB6F894DEBF39
-:100A20000FBECDBF80E090E0BE016F5F7F4F1CDF47
-:100A30008FEF9FEF9A83898380E090E029DF80E049
-:100A400090E0BE016F5F7F4F2DDFC05CDF4F0FB6C0
-:100A5000F894DEBF0FBECDBFDF91CF910895CF9345
-:100A600087B3836087BBC198CAEF81E090E0F3DE73
-:100A7000C19A81E090E0EFDEC198C150B1F7CF910B
-:100A80000895E0E0F0E00995089588B318BA87B3B7
-:100A90008FEF87BB8AEF90E0DEDE87B317BA8AEF6D
-:100AA00090E0D9DEF894B3DF51DF20DFD8DFE9DF53
-:0A0AB00080E090E00895F894FFCF75
-:020ABA008018A2
-:040000030000008079
-:00000001FF
diff --git a/upgrade/releases/micronucleus-1.10-upgrade.hex b/upgrade/releases/micronucleus-1.10-upgrade.hex
deleted file mode 100644
index 9fb05a9..0000000
--- a/upgrade/releases/micronucleus-1.10-upgrade.hex
+++ /dev/null
@@ -1,167 +0,0 @@
-:1000000003C003C003C003C003C003C003C003C0D8
-:10008000B5C3DFC3DEC3DDC3DCC3DBC3DAC3D9C39F
-:10009000D8C3D7C3D6C3D5C3D4C3D3C3D2C317C061
-:1000A00016C04CC014C009021200010100803209C0
-:1000B000040000000000000012011001FF00000811
-:1000C000D01653070A01000000010403090411249B
-:1000D0001FBECFE5D2E0CDBFDEBF00EB0F9307E040
-:1000E0000F9310E0A0E6B0E0E8ECFFE102C005905D
-:1000F0000D92A636B107D9F720E0A6E6B0E001C020
-:100100001D92AB39B207E1F7ECC1A82FB92F80E0FF
-:1001100090E041E050EA609530E009C02D918227DF
-:100120009795879510F084279527305EC8F36F5F09
-:10013000A8F30895EADF8D939D930895CF93CFB7E9
-:10014000CF93C0915F02C03B21F4C0915E02C730E3
-:1001500021F0CF91CFBFCF91A1CFCC27C395B39B37
-:10016000E9F7B39B0BC0B39B09C0B39B07C0B39B1C
-:1001700005C0B39B03C0B39B01C0D3C00F92DF93F4
-:10018000C0917E00DD27CB57DF4F012EB39B03C00C
-:10019000DF910F90E6CF2F930F931F934F932FEF85
-:1001A0004F6F06B303FB20F95F933F9350E03BE0B2
-:1001B00065C016B30126502953FDC89556B30127D3
-:1001C00003FB25F92F7306B3B1F05027102713FB5B
-:1001D00026F906B22230F0F000C016B3012703FB67
-:1001E00027F90126502906B22430E8F54F77206818
-:1001F00016B30000F6CF50274F7D206206B2102FB5
-:10020000000000C006B300265029102713FB26F972
-:1002100006B2E2CF4F7B06B3206400C0DACF0126DE
-:100220005029187106B269F14E7F2160012F16B373
-:1002300028C0002650294D7F06B22260102F29C009
-:10024000012650294B7F06B22460012F2DC016B322
-:1002500001265029477F2860000006B22EC04F7E3D
-:1002600006B3206130C0422706B3499300265029C7
-:10027000102706B24FEF13FB20F9297F16B379F24E
-:10028000187159F10126502906B2012703FB21F903
-:10029000237F06B371F2002650293150D0F006B208
-:1002A000102713FB22F9277E16B351F2012650299D
-:1002B000012703FB06B223F92F7C49F2000006B3A5
-:1002C000102713FB24F90026502906B22F7939F2A2
-:1002D00070CF10E21ABF002717C03B503195C31BE7
-:1002E000D04010E21ABF0881033CF9F00B34E9F06A
-:1002F00020917C001981110F1213EDCF093651F1B5
-:100300000D3211F0013E39F7009383003F915F9168
-:100310004F911F910F912F91DF910F90CAB7C5FD9B
-:100320001DCFCF91CFBFCF9118952091830022236D
-:1003300069F310918100112321F5343022F13093BB
-:10034000810020937D0010917E003BE0311B3093B3
-:100350007E0019C00091810001309CF40AE53091C3
-:10036000600034FD11C000936000C1E7D0E010C010
-:10037000052710E000C021C0052710E0C89508BB84
-:1003800014C03AE501C032ED032EC0E0D0E032E007
-:1003900017B31861C39A08B317BB58E120E84FEFB1
-:1003A00020FF052708BB279517951C3F28F700005D
-:1003B0004552B0F720FF0527279508BB17951C3F2E
-:1003C000B8F629913A9561F7077E10918200110FD6
-:1003D00008BBC250D04011F010937C0010E21ABF4D
-:1003E000086017B3177E402F477E54E05A95F1F707
-:1003F00008BB17BB48BB8ACFF8942FEFB0E8A0E446
-:100400004AE0B1BF000081EE9CE0B399FECFB39B00
-:10041000FECF0197B399FDCF97FF03C0BA1B81951B
-:1004200001C0BA0FA69529F4281710F031B7282F6C
-:10043000A1E0415031F731BF000078940895F8945D
-:10044000E0916A00F0916B00329785E0809357004D
-:10045000E89578940895E0916A00F0916B003097E8
-:1004600029F490936D0080936C0007C0E430F1058F
-:1004700039F490936F0080936E008FE39CEC1CC066
-:10048000EC3728E1F20739F480916C0090916D000F
-:100490008E539C4F11C0EE3728E1F20739F480915A
-:1004A0006E0090916F008D539C4F06C0EA3728E193
-:1004B000F20711F481B790E02FB7F894309721F448
-:1004C00031E130935700E89531E00C01309357004B
-:1004D000E89511243296F0936B00E0936A002FBFE9
-:1004E000089514BE88E10FB6F89481BD11BC0FBE0B
-:1004F000BB9A88E893E1ECE9F1E03197F1F70197D5
-:10050000D1F7BB98AC9A8BB780628BBF789400917F
-:100510008100035007FDBAC080917E00CCE0D0E09E
-:10052000C81BD109CB57DF4F80917D008D3209F078
-:100530008EC0083009F0A8C083EC809371008AE572
-:1005400080936000109269002881922F90768981B3
-:10055000992319F110926700811108C082E690E09A
-:100560009093800080937F0014E067C0813051F445
-:100570008C819D8190936B0080936A0027FD58C009
-:100580001FEF57C090916800823011F4916001C054
-:1005900094609093680010E050C09A8110927A00A5
-:1005A000811106C010927B008AE790E012E03BC008
-:1005B000853019F4909382002CC0863009F58B8128
-:1005C000813019F48AE998E104C0823041F488E866
-:1005D00098E19093800080937F0012E10DC08330FA
-:1005E00051F4911108C08CEA98E1909380008093B7
-:1005F0007F0014E001C010E080E4809369001DC01A
-:10060000883059F0893019F49093840002C08A3000
-:1006100039F08AE790E010E006C084E890E002C07C
-:100620008AE790E011E09093800080937F0005C0FE
-:100630001E8180E88093690007C08F81811104C00A
-:100640008E81811708F4182F109361001DC08091CE
-:10065000690087FF19C080916A0090916B00803813
-:10066000984128F080916A008F7339F00DC089910C
-:100670009991F1DE025079F7F5CF809168008260A0
-:100680008093680010926100109281008091600058
-:1006900084FF43C0809161008F3F09F43EC0082F62
-:1006A000893008F008E0801B809361008091710020
-:1006B00098E8892780937100002319F1E0917F0069
-:1006C000F09180008091690086FF0BC0A2E7B0E046
-:1006D00084918D93319682E790E0800F8A13F8CF52
-:1006E0000CC0CF01A2E7B0E0FC012191CF012D9316
-:1006F00022E730E0200F2A13F7CFF0938000E09339
-:100700007F00602F82E790E015DD0C5F0C3019F060
-:100710008FEF809361000093600084E196B398713D
-:1007200031F48150D9F71092820010927C0001E0E0
-:10073000811100E080917000801739F0011103C031
-:100740001092670059DE009370008CE991E00197E8
-:10075000F1F70091680000FF17C0F894E0E8F8E1B5
-:10076000E054F10983E080935700E8953097C1F792
-:1007700010926B0010926A0088E0F82E8FEF9FEFC6
-:100780006ADEFA94D9F75BDE01FF05C08AE390E2E6
-:100790000197F1F754DE02FF12C082E291EA01975D
-:1007A000F1F7F894BB9A1BBE15BA10925F02EAE704
-:1007B000F8E1E4918E2F81508E3F88F012C01092A4
-:1007C00068008091660090916700019690936700A1
-:1007D0008093660080369A4E08F499CEDECFE1BF52
-:1007E00000005BCC2ACF5AFF187A400800000000B6
-:1007F00000000000000000000000000000000000F9
-:1008000000000000000000000000000011241FBED6
-:10081000CFE5D2E0DEBFCDBF10E0A0E6B0E0E8EA71
-:10082000FAE002C005900D92A236B107D9F710E0A8
-:10083000A2E6B0E001C01D92A236B107E1F71CD1DB
-:1008400031C11ECC05C0EDE1F0E13197F1F7019720
-:100850000097C9F70895AC01407C80E090E0FC016E
-:10086000E40FF51F25913491FC01EE7FE60FF71F91
-:100870002083318302968034910589F70895FC0125
-:10088000E07C83E080935700E89507B600FCFDCF3D
-:100890000895CF93DF93EC01AB01DB0120E030E062
-:1008A000FE01E41BF50BEA0FFB1F8D919D9161E0AA
-:1008B0000C0160935700E89511242F5F3F4F2032C1
-:1008C000310571F785E0FE0180935700E89507B682
-:1008D00000FCFDCFDF91CF910895CF93DF93CDB78B
-:1008E000DEB7C054D0400FB6F894DEBF0FBECDBF08
-:1008F0008091600090916100969587958150904419
-:10090000FE0131969E012F5B3F4F81939193E21739
-:10091000F307D9F780E090E0B2DF80E090E0BE011D
-:100920006F5F7F4FB6DFC05CDF4F0FB6F894DEBF5E
-:100930000FBECDBFDF91CF9108950F931F93CF933B
-:10094000DF93CDB7DEB7C054D0400FB6F894DEBF0A
-:100950000FBECDBF00E010E040C080E090E0F801A5
-:10096000E256FF4FE80FF91F9C013595279547E0A8
-:10097000EC3EF40770F0F901EE0FFF1F21E030E0CC
-:100980002C0F3D1FE20FF31F2FEF3FEF318320832A
-:100990000DC045915491F901EE0FFF1F21E030E0A9
-:1009A0002C0F3D1FE20FF31F4083518302968034CA
-:1009B0009105A9F68091600090916100800F911FD0
-:1009C0005EDF8091600090916100800F911FBE01F9
-:1009D0006F5F7F4F5EDF005C1F4F37E0003813070B
-:1009E00009F0BBCFC05CDF4F0FB6F894DEBF0FBE7F
-:1009F000CDBFDF91CF911F910F910895CF93DF93DA
-:100A0000CDB7DEB7C054D0400FB6F894DEBF0FBEEE
-:100A1000CDBF80E090E0BE016F5F7F4F1CDF8FEFA6
-:100A20009FEF9A83898380E090E029DF80E090E067
-:100A3000BE016F5F7F4F2DDFC05CDF4F0FB6F894B4
-:100A4000DEBF0FBECDBFDF91CF910895CF9387B3A7
-:100A5000836087BBC198CAEF81E090E0F3DEC19A62
-:100A600081E090E0EFDEC198C150B1F7CF910895D9
-:100A7000E0E0F0E00995089588B318BA87B38FEFE6
-:100A800087BB8AEF90E0DEDE87B317BA8AEF90E08B
-:100A9000D9DEF894B3DF51DF20DFD8DFE9DF80E073
-:080AA00090E00895F894FFCFE7
-:020AA8008018B4
-:040000030000008079
-:00000001FF
diff --git a/upgrade/releases/micronucleus-1.11-entry-ext-reset-upgrade.hex b/upgrade/releases/micronucleus-1.11-entry-ext-reset-upgrade.hex
deleted file mode 100644
index a6a1236..0000000
--- a/upgrade/releases/micronucleus-1.11-entry-ext-reset-upgrade.hex
+++ /dev/null
@@ -1,165 +0,0 @@
-:1000000003C003C003C003C003C003C003C003C0D8
-:10008000A5C3CFC3CEC3CDC3CCC3CBC3CAC3C9C31F
-:10009000C8C3C7C3C6C3C5C3C4C3C3C3C2C317C0D1
-:1000A00016C04CC014C009021200010100803209C0
-:1000B000040000000000000012011001FF00000811
-:1000C000D01653070B01000000010403090411249A
-:1000D0001FBECFE5D2E0CDBFDEBF00EB0F9307E040
-:1000E0000F9310E0A0E6B0E0E8EEFFE102C005905B
-:1000F0000D92A636B107D9F720E0A6E6B0E001C020
-:100100001D92A639B207E1F7E2C1A82FB92F80E00E
-:1001100090E041E050EA609530E009C02D918227DF
-:100120009795879510F084279527305EC8F36F5F09
-:10013000A8F30895EADF8D939D930895CF93CFB7E9
-:10014000CF93C0915F02C03B21F4C0915E02C730E3
-:1001500021F0CF91CFBFCF91A1CFCC27C395B39B37
-:10016000E9F7B39B0BC0B39B09C0B39B07C0B39B1C
-:1001700005C0B39B03C0B39B01C0D3C00F92DF93F4
-:10018000C0917900DD27C058DF4F012EB39B03C01B
-:10019000DF910F90E6CF2F930F931F934F932FEF85
-:1001A0004F6F06B303FB20F95F933F9350E03BE0B2
-:1001B00065C016B30126502953FDC89556B30127D3
-:1001C00003FB25F92F7306B3B1F05027102713FB5B
-:1001D00026F906B22230F0F000C016B3012703FB67
-:1001E00027F90126502906B22430E8F54F77206818
-:1001F00016B30000F6CF50274F7D206206B2102FB5
-:10020000000000C006B300265029102713FB26F972
-:1002100006B2E2CF4F7B06B3206400C0DACF0126DE
-:100220005029187106B269F14E7F2160012F16B373
-:1002300028C0002650294D7F06B22260102F29C009
-:10024000012650294B7F06B22460012F2DC016B322
-:1002500001265029477F2860000006B22EC04F7E3D
-:1002600006B3206130C0422706B3499300265029C7
-:10027000102706B24FEF13FB20F9297F16B379F24E
-:10028000187159F10126502906B2012703FB21F903
-:10029000237F06B371F2002650293150D0F006B208
-:1002A000102713FB22F9277E16B351F2012650299D
-:1002B000012703FB06B223F92F7C49F2000006B3A5
-:1002C000102713FB24F90026502906B22F7939F2A2
-:1002D00070CF10E21ABF002717C03B503195C31BE7
-:1002E000D04010E21ABF0881033CF9F00B34E9F06A
-:1002F000209177001981110F1213EDCF093651F1BA
-:100300000D3211F0013E39F700937E003F915F916D
-:100310004F911F910F912F91DF910F90CAB7C5FD9B
-:100320001DCFCF91CFBFCF91189520917E00222372
-:1003300069F310917C00112321F5343022F13093C0
-:100340007C0020937800109179003BE0311B3093C2
-:10035000790019C000917C0001309CF40AE53091CD
-:10036000600034FD11C000936000CCE6D0E010C006
-:10037000052710E000C021C0052710E0C89508BB84
-:1003800014C03AE501C032ED032EC0E0D0E032E007
-:1003900017B31861C39A08B317BB58E120E84FEFB1
-:1003A00020FF052708BB279517951C3F28F700005D
-:1003B0004552B0F720FF0527279508BB17951C3F2E
-:1003C000B8F629913A9561F7077E10917D00110FDB
-:1003D00008BBC250D04011F01093770010E21ABF52
-:1003E000086017B3177E402F477E54E05A95F1F707
-:1003F00008BB17BB48BB8ACFF8942FEFB0E8A0E446
-:100400004AE0B1BF000081EE9CE0B399FECFB39B00
-:10041000FECF0197B399FDCF97FF03C0BA1B81951B
-:1004200001C0BA0FA69529F4281710F031B7282F6C
-:10043000A1E0415031F731BF000078940895F8945D
-:10044000F201329785E080935700E89578940895FB
-:10045000F201309729F4909368008093670007C0F9
-:10046000E430F10539F490936A00809369008FE5D8
-:100470009CEC1FC02CEB421628E1520639F4809107
-:100480006700909168008E559C4F13C02EEB42166A
-:1004900028E1520639F48091690090916A008D55E7
-:1004A0009C4F07C02AEB421628E1520611F481B78F
-:1004B00090E02FB7F89431E00C0130935700E895A5
-:1004C00011242F0182E0480E511C2FBF089504B65D
-:1004D00001FC14C0EDEBF8E1E491EF3F79F0F89402
-:1004E000BB9A1BBE15BA10925F02EAEBF8E1E491E9
-:1004F0008E2F81508E3F08F462C163C114BE88E123
-:1005000081BD87E081BDBB9A88E893E1ECE9F1E029
-:100510003197F1F70197D1F7BB98AC9A8BB780620E
-:100520008BBF7894712C8CE991E00197F1F7A89535
-:10053000312C60917C00162F135017FDB2C08091B2
-:100540007900CCE0D0E0C81BD109C058DF4F615022
-:10055000CE01DBDD8E3F9F4409F0A1C08091780081
-:100560008D3209F085C0183009F099C083EC809372
-:100570006C008AE580936000109266009881292FB4
-:10058000207689812223D1F0712C811108C082E666
-:1005900090E090937B0080937A0024E05FC08130EC
-:1005A00051F481E180935700E8954C805D8097FD80
-:1005B00050C02FEF4FC0382E20E050C09A811092CB
-:1005C0007500811106C01092760085E790E022E068
-:1005D0003BC0853019F490937D002CC0863009F51E
-:1005E0008B81813019F48AED98E104C0823041F4A6
-:1005F00088EC98E190937B0080937A0022E10DC013
-:10060000833051F4911108C08CEE98E190937B00F7
-:1006100080937A0024E001C020E080E480936600AB
-:100620001DC0883059F0893019F490937F0002C0C2
-:100630008A3039F085E790E020E006C08FE790E04F
-:1006400002C085E790E021E090937B0080937A00E0
-:1006500005C02E8180E88093660007C08F818111DC
-:1006600004C08E81821708F4282F2093610017C0E0
-:100670008091660087FF13C080EC481688E1580619
-:1006800020F0842D8F7339F00AC089919991E0DEB2
-:10069000125091F7F6CF95E0392E1092610010922A
-:1006A0007C008091600084FF42C0809161008F3F98
-:1006B00009F43DC0182F893008F018E0811B8093A1
-:1006C000610080916C0098E8892780936C00112369
-:1006D00011F1E0917A00F0917B008091660086FF35
-:1006E0000BC0ADE6B0E084918D9331968DE690E03D
-:1006F000810F8A13F8CF0BC0EF01ADE6B0E089910E
-:100700008D93FE018DE690E0810F8A13F8CFF09370
-:100710007B00E0937A00612F8DE690E00BDD1C5F9B
-:100720001C3019F08FEF809361001093600084E11A
-:1007300096B3987131F48150D9F710927D001092E0
-:100740007700C1E08111C0E080916B008C1729F027
-:10075000C11101C051DEC0936B00C30101963C0181
-:100760008035934C11F484E0382E232D3320E9F0AA
-:100770008AE390E20197F1F72230A9F4F894E0ECD3
-:10078000F8E1E054F10983E080935700E895309751
-:10079000C1F7412C512CC8E08FEF9FEF59DEC150BB
-:1007A000D9F74DDE02C02530E1F384E03812BBCE2C
-:1007B000EDEBF8E1E491EF3F09F4B5CE90CEE1BF67
-:1007C00000006BCCFFCF5AFF18BA400800000000B1
-:1007D0000000000000000000000000000000000019
-:1007E00000000000000000000000000011241FBEF7
-:1007F000CFE5D2E0DEBFCDBF10E0A0E6B0E0E8E894
-:10080000FAE002C005900D92A236B107D9F710E0C8
-:10081000A2E6B0E001C01D92A236B107E1F71CD1FB
-:1008200031C12ECC05C0EDE1F0E13197F1F7019730
-:100830000097C9F70895AC01407C80E090E0FC018E
-:10084000E40FF51F25913491FC01EE7FE60FF71FB1
-:100850002083318302968034910589F70895FC0145
-:10086000E07C83E080935700E89507B600FCFDCF5D
-:100870000895CF93DF93EC01AB01DB0120E030E082
-:10088000FE01E41BF50BEA0FFB1F8D919D9161E0CA
-:100890000C0160935700E89511242F5F3F4F2032E1
-:1008A000310571F785E0FE0180935700E89507B6A2
-:1008B00000FCFDCFDF91CF910895CF93DF93CDB7AB
-:1008C000DEB7C054D0400FB6F894DEBF0FBECDBF28
-:1008D0008091600090916100969587958150904439
-:1008E000FE0131969E012F5B3F4F81939193E2175A
-:1008F000F307D9F780E090E0B2DF80E090E0BE013E
-:100900006F5F7F4FB6DFC05CDF4F0FB6F894DEBF7E
-:100910000FBECDBFDF91CF9108950F931F93CF935B
-:10092000DF93CDB7DEB7C054D0400FB6F894DEBF2A
-:100930000FBECDBF00E010E040C080E090E0F801C5
-:10094000E256FF4FE80FF91F9C013595279547E0C8
-:10095000EC3CF40770F0F901EE0FFF1F21E030E0EE
-:100960002C0F3D1FE20FF31F2FEF3FEF318320834A
-:100970000DC045915491F901EE0FFF1F21E030E0C9
-:100980002C0F3D1FE20FF31F4083518302968034EA
-:100990009105A9F68091600090916100800F911FF0
-:1009A0005EDF8091600090916100800F911FBE0119
-:1009B0006F5F7F4F5EDF005C1F4F37E0003413072F
-:1009C00009F0BBCFC05CDF4F0FB6F894DEBF0FBE9F
-:1009D000CDBFDF91CF911F910F910895CF93DF93FA
-:1009E000CDB7DEB7C054D0400FB6F894DEBF0FBE0F
-:1009F000CDBF80E090E0BE016F5F7F4F1CDF8FEFC7
-:100A00009FEF9A83898380E090E029DF80E090E087
-:100A1000BE016F5F7F4F2DDFC05CDF4F0FB6F894D4
-:100A2000DEBF0FBECDBFDF91CF910895CF9387B3C7
-:100A3000836087BBC198CAEF81E090E0F3DEC19A82
-:100A400081E090E0EFDEC198C150B1F7CF910895F9
-:100A5000E0E0F0E00995089588B318BA87B38FEF06
-:100A600087BB8AEF90E0DEDE87B317BA8AEF90E0AB
-:100A7000D9DEF894B3DF51DF20DFD8DFE9DF80E093
-:080A800090E00895F894FFCF07
-:020A8800C01894
-:040000030000008079
-:00000001FF
diff --git a/upgrade/releases/micronucleus-1.11-entry-jumper-pb0-upgrade.hex b/upgrade/releases/micronucleus-1.11-entry-jumper-pb0-upgrade.hex
deleted file mode 100644
index 979bbdf..0000000
--- a/upgrade/releases/micronucleus-1.11-entry-jumper-pb0-upgrade.hex
+++ /dev/null
@@ -1,166 +0,0 @@
-:1000000003C003C003C003C003C003C003C003C0D8
-:10008000ABC3D5C3D4C3D3C3D2C3D1C3D0C3CFC3EF
-:10009000CEC3CDC3CCC3CBC3CAC3C9C3C8C317C0A7
-:1000A00016C04CC014C009021200010100803209C0
-:1000B000040000000000000012011001FF00000811
-:1000C000D01653070B01000000010403090411249A
-:1000D0001FBECFE5D2E0CDBFDEBF00EB0F9307E040
-:1000E0000F9310E0A0E6B0E0E4EFFFE102C005905E
-:1000F0000D92A636B107D9F720E0A6E6B0E001C020
-:100100001D92A639B207E1F7E2C1A82FB92F80E00E
-:1001100090E041E050EA609530E009C02D918227DF
-:100120009795879510F084279527305EC8F36F5F09
-:10013000A8F30895EADF8D939D930895CF93CFB7E9
-:10014000CF93C0915F02C03B21F4C0915E02C730E3
-:1001500021F0CF91CFBFCF91A1CFCC27C395B39B37
-:10016000E9F7B39B0BC0B39B09C0B39B07C0B39B1C
-:1001700005C0B39B03C0B39B01C0D3C00F92DF93F4
-:10018000C0917900DD27C058DF4F012EB39B03C01B
-:10019000DF910F90E6CF2F930F931F934F932FEF85
-:1001A0004F6F06B303FB20F95F933F9350E03BE0B2
-:1001B00065C016B30126502953FDC89556B30127D3
-:1001C00003FB25F92F7306B3B1F05027102713FB5B
-:1001D00026F906B22230F0F000C016B3012703FB67
-:1001E00027F90126502906B22430E8F54F77206818
-:1001F00016B30000F6CF50274F7D206206B2102FB5
-:10020000000000C006B300265029102713FB26F972
-:1002100006B2E2CF4F7B06B3206400C0DACF0126DE
-:100220005029187106B269F14E7F2160012F16B373
-:1002300028C0002650294D7F06B22260102F29C009
-:10024000012650294B7F06B22460012F2DC016B322
-:1002500001265029477F2860000006B22EC04F7E3D
-:1002600006B3206130C0422706B3499300265029C7
-:10027000102706B24FEF13FB20F9297F16B379F24E
-:10028000187159F10126502906B2012703FB21F903
-:10029000237F06B371F2002650293150D0F006B208
-:1002A000102713FB22F9277E16B351F2012650299D
-:1002B000012703FB06B223F92F7C49F2000006B3A5
-:1002C000102713FB24F90026502906B22F7939F2A2
-:1002D00070CF10E21ABF002717C03B503195C31BE7
-:1002E000D04010E21ABF0881033CF9F00B34E9F06A
-:1002F000209177001981110F1213EDCF093651F1BA
-:100300000D3211F0013E39F700937E003F915F916D
-:100310004F911F910F912F91DF910F90CAB7C5FD9B
-:100320001DCFCF91CFBFCF91189520917E00222372
-:1003300069F310917C00112321F5343022F13093C0
-:100340007C0020937800109179003BE0311B3093C2
-:10035000790019C000917C0001309CF40AE53091CD
-:10036000600034FD11C000936000CCE6D0E010C006
-:10037000052710E000C021C0052710E0C89508BB84
-:1003800014C03AE501C032ED032EC0E0D0E032E007
-:1003900017B31861C39A08B317BB58E120E84FEFB1
-:1003A00020FF052708BB279517951C3F28F700005D
-:1003B0004552B0F720FF0527279508BB17951C3F2E
-:1003C000B8F629913A9561F7077E10917D00110FDB
-:1003D00008BBC250D04011F01093770010E21ABF52
-:1003E000086017B3177E402F477E54E05A95F1F707
-:1003F00008BB17BB48BB8ACFF8942FEFB0E8A0E446
-:100400004AE0B1BF000081EE9CE0B399FECFB39B00
-:10041000FECF0197B399FDCF97FF03C0BA1B81951B
-:1004200001C0BA0FA69529F4281710F031B7282F6C
-:10043000A1E0415031F731BF000078940895F8945D
-:10044000F201329785E080935700E89578940895FB
-:10045000F201309729F4909368008093670007C0F9
-:10046000E430F10539F490936A00809369008FE5D8
-:100470009CEC1FC02CEB421628E1520639F4809107
-:100480006700909168008E559C4F13C02EEB42166A
-:1004900028E1520639F48091690090916A008D55E7
-:1004A0009C4F07C02AEB421628E1520611F481B78F
-:1004B00090E02FB7F89431E00C0130935700E895A5
-:1004C00011242F0182E0480E511C2FBF0895B898C7
-:1004D000C09A8DE190E10197F1F7B09B15C0EDEB6B
-:1004E000F8E1E491EF3F81F0C098F894BB9A1BBE0D
-:1004F00015BA10925F02EAEBF8E1E4918E2F815079
-:100500008E3F08F462C163C114BE88E181BD87E0FB
-:1005100081BDBB9A88E893E1ECE9F1E03197F1F70E
-:100520000197D1F7BB98AC9A8BB780628BBF789458
-:10053000712C8CE991E00197F1F7A895312C60912D
-:100540007C00162F135017FDB2C080917900CCE0CB
-:10055000D0E0C81BD109C058DF4F6150CE01D5DDB6
-:100560008E3F9F4409F0A1C0809178008D3209F040
-:1005700085C0183009F099C083EC80936C008AE53F
-:1005800080936000109266009881292F20768981DF
-:100590002223D1F0712C811108C082E690E0909363
-:1005A0007B0080937A0024E05FC0813051F481E1C8
-:1005B00080935700E8954C805D8097FD50C02FEFE9
-:1005C0004FC0382E20E050C09A81109275008111E2
-:1005D00006C01092760085E790E022E03BC08530AF
-:1005E00019F490937D002CC0863009F58B81813001
-:1005F00019F48AED98E104C0823041F488EC98E166
-:1006000090937B0080937A0022E10DC0833051F4F7
-:10061000911108C08CEE98E190937B0080937A0052
-:1006200024E001C020E080E4809366001DC0883093
-:1006300059F0893019F490937F0002C08A3039F064
-:1006400085E790E020E006C08FE790E002C085E7F4
-:1006500090E021E090937B0080937A0005C02E818A
-:1006600080E88093660007C08F81811104C08E816D
-:10067000821708F4282F2093610017C0809166002C
-:1006800087FF13C080EC481688E1580620F0842DBF
-:100690008F7339F00AC089919991DADE125091F77F
-:1006A000F6CF95E0392E1092610010927C00809177
-:1006B000600084FF42C0809161008F3F09F43DC01B
-:1006C000182F893008F018E0811B80936100809119
-:1006D0006C0098E8892780936C00112311F1E09158
-:1006E0007A00F0917B008091660086FF0BC0ADE63A
-:1006F000B0E084918D9331968DE690E0810F8A135E
-:10070000F8CF0BC0EF01ADE6B0E089918D93FE010B
-:100710008DE690E0810F8A13F8CFF0937B00E09391
-:100720007A00612F8DE690E005DD1C5F1C3019F02A
-:100730008FEF809361001093600084E196B398710D
-:1007400031F48150D9F710927D0010927700C1E00A
-:100750008111C0E080916B008C1729F0C11101C09C
-:100760004BDEC0936B00C30101963C018035934C76
-:1007700011F484E0382E232D3320E9F08AE390E24F
-:100780000197F1F72230A9F4F894E0ECF8E1E05495
-:10079000F10983E080935700E8953097C1F7412C29
-:1007A000512CC8E08FEF9FEF53DEC150D9F747DEE1
-:1007B00002C02530E1F384E03812BBCEEDEBF8E166
-:1007C000E491EF3F09F4B5CE8FCEE1BF000065CCD8
-:1007D000FFCF5AFF18BA40080000000000000000D8
-:1007E0000000000000000000000000000000000009
-:1007F000000000000000000011241FBECFE5D2E081
-:10080000DEBFCDBF10E0A0E6B0E0E4E9FAE002C050
-:1008100005900D92A236B107D9F710E0A2E6B0E03C
-:1008200001C01D92A236B107E1F71CD131C128CC1D
-:1008300005C0EDE1F0E13197F1F701970097C9F7B5
-:100840000895AC01407C80E090E0FC01E40FF51FCE
-:1008500025913491FC01EE7FE60FF71F2083318351
-:1008600002968034910589F70895FC01E07C83E0CD
-:1008700080935700E89507B600FCFDCF0895CF930D
-:10088000DF93EC01AB01DB0120E030E0FE01E41B73
-:10089000F50BEA0FFB1F8D919D9161E00C016093B8
-:1008A0005700E89511242F5F3F4F2032310571F733
-:1008B00085E0FE0180935700E89507B600FCFDCF68
-:1008C000DF91CF910895CF93DF93CDB7DEB7C054BA
-:1008D000D0400FB6F894DEBF0FBECDBF8091600050
-:1008E000909161009695879581509044FE013196D4
-:1008F0009E012F5B3F4F81939193E217F307D9F746
-:1009000080E090E0B2DF80E090E0BE016F5F7F4F5B
-:10091000B6DFC05CDF4F0FB6F894DEBF0FBECDBFB1
-:10092000DF91CF9108950F931F93CF93DF93CDB7AE
-:10093000DEB7C054D0400FB6F894DEBF0FBECDBFB7
-:1009400000E010E040C080E090E0F801E256FF4F88
-:10095000E80FF91F9C013595279547E0E83DF4071E
-:1009600070F0F901EE0FFF1F21E030E02C0F3D1F6A
-:10097000E20FF31F2FEF3FEF318320830DC045912E
-:100980005491F901EE0FFF1F21E030E02C0F3D1FC5
-:10099000E20FF31F40835183029680349105A9F63C
-:1009A0008091600090916100800F911F5EDF8091C7
-:1009B000600090916100800F911FBE016F5F7F4FBB
-:1009C0005EDF005C1F4F37E00034130709F0BBCF38
-:1009D000C05CDF4F0FB6F894DEBF0FBECDBFDF9116
-:1009E000CF911F910F910895CF93DF93CDB7DEB7CD
-:1009F000C054D0400FB6F894DEBF0FBECDBF80E02C
-:100A000090E0BE016F5F7F4F1CDF8FEF9FEF9A83F7
-:100A1000898380E090E029DF80E090E0BE016F5F95
-:100A20007F4F2DDFC05CDF4F0FB6F894DEBF0FBEE7
-:100A3000CDBFDF91CF910895CF9387B3836087BBFC
-:100A4000C198CAEF81E090E0F3DEC19A81E090E0C6
-:100A5000EFDEC198C150B1F7CF910895E0E0F0E02A
-:100A60000995089588B318BA87B38FEF87BB8AEFCB
-:100A700090E0DEDE87B317BA8AEF90E0D9DEF89413
-:100A8000B3DF51DF20DFD8DFE9DF80E090E00895B9
-:040A9000F894FFCF08
-:020A9400C01888
-:040000030000008079
-:00000001FF
diff --git a/upgrade/releases/micronucleus-1.11-ledpb1-upgrade.hex b/upgrade/releases/micronucleus-1.11-ledpb1-upgrade.hex
deleted file mode 100644
index f5944e2..0000000
--- a/upgrade/releases/micronucleus-1.11-ledpb1-upgrade.hex
+++ /dev/null
@@ -1,165 +0,0 @@
-:1000000003C003C003C003C003C003C003C003C0D8
-:10008000A2C3CCC3CBC3CAC3C9C3C8C3C7C3C6C337
-:10009000C5C3C4C3C3C3C2C3C1C3C0C3BFC317C0E6
-:1000A00016C04CC014C009021200010100803209C0
-:1000B000040000000000000012011001FF00000811
-:1000C000D01653070B01000000010403090411249A
-:1000D0001FBECFE5D2E0CDBFDEBF00EB0F9307E040
-:1000E0000F9310E0A0E6B0E0E2EEFFE102C0059061
-:1000F0000D92A636B107D9F720E0A6E6B0E001C020
-:100100001D92A639B207E1F7E2C1A82FB92F80E00E
-:1001100090E041E050EA609530E009C02D918227DF
-:100120009795879510F084279527305EC8F36F5F09
-:10013000A8F30895EADF8D939D930895CF93CFB7E9
-:10014000CF93C0915F02C03B21F4C0915E02C730E3
-:1001500021F0CF91CFBFCF91A1CFCC27C395B39B37
-:10016000E9F7B39B0BC0B39B09C0B39B07C0B39B1C
-:1001700005C0B39B03C0B39B01C0D3C00F92DF93F4
-:10018000C0917900DD27C058DF4F012EB39B03C01B
-:10019000DF910F90E6CF2F930F931F934F932FEF85
-:1001A0004F6F06B303FB20F95F933F9350E03BE0B2
-:1001B00065C016B30126502953FDC89556B30127D3
-:1001C00003FB25F92F7306B3B1F05027102713FB5B
-:1001D00026F906B22230F0F000C016B3012703FB67
-:1001E00027F90126502906B22430E8F54F77206818
-:1001F00016B30000F6CF50274F7D206206B2102FB5
-:10020000000000C006B300265029102713FB26F972
-:1002100006B2E2CF4F7B06B3206400C0DACF0126DE
-:100220005029187106B269F14E7F2160012F16B373
-:1002300028C0002650294D7F06B22260102F29C009
-:10024000012650294B7F06B22460012F2DC016B322
-:1002500001265029477F2860000006B22EC04F7E3D
-:1002600006B3206130C0422706B3499300265029C7
-:10027000102706B24FEF13FB20F9297F16B379F24E
-:10028000187159F10126502906B2012703FB21F903
-:10029000237F06B371F2002650293150D0F006B208
-:1002A000102713FB22F9277E16B351F2012650299D
-:1002B000012703FB06B223F92F7C49F2000006B3A5
-:1002C000102713FB24F90026502906B22F7939F2A2
-:1002D00070CF10E21ABF002717C03B503195C31BE7
-:1002E000D04010E21ABF0881033CF9F00B34E9F06A
-:1002F000209177001981110F1213EDCF093651F1BA
-:100300000D3211F0013E39F700937E003F915F916D
-:100310004F911F910F912F91DF910F90CAB7C5FD9B
-:100320001DCFCF91CFBFCF91189520917E00222372
-:1003300069F310917C00112321F5343022F13093C0
-:100340007C0020937800109179003BE0311B3093C2
-:10035000790019C000917C0001309CF40AE53091CD
-:10036000600034FD11C000936000CCE6D0E010C006
-:10037000052710E000C021C0052710E0C89508BB84
-:1003800014C03AE501C032ED032EC0E0D0E032E007
-:1003900017B31861C39A08B317BB58E120E84FEFB1
-:1003A00020FF052708BB279517951C3F28F700005D
-:1003B0004552B0F720FF0527279508BB17951C3F2E
-:1003C000B8F629913A9561F7077E10917D00110FDB
-:1003D00008BBC250D04011F01093770010E21ABF52
-:1003E000086017B3177E402F477E54E05A95F1F707
-:1003F00008BB17BB48BB8ACFF8942FEFB0E8A0E446
-:100400004AE0B1BF000081EE9CE0B399FECFB39B00
-:10041000FECF0197B399FDCF97FF03C0BA1B81951B
-:1004200001C0BA0FA69529F4281710F031B7282F6C
-:10043000A1E0415031F731BF000078940895F8945D
-:10044000F201329785E080935700E89578940895FB
-:10045000F201309729F4909368008093670007C0F9
-:10046000E430F10539F490936A00809369008FE5D8
-:100470009CEC1FC02CEB421628E1520639F4809107
-:100480006700909168008E559C4F13C02EEB42166A
-:1004900028E1520639F48091690090916A008D55E7
-:1004A0009C4F07C02AEB421628E1520611F481B78F
-:1004B00090E02FB7F89431E00C0130935700E895A5
-:1004C00011242F0182E0480E511C2FBF089514BE45
-:1004D00088E181BD87E081BDBB9A88E893E1ECE9C2
-:1004E000F1E03197F1F70197D1F7BB98AC9A8BB750
-:1004F00080628BBF7894C198712C8CE991E0019750
-:10050000F1F7A895312C60917C00162F135017FD40
-:10051000B2C080917900CCE0D0E0C81BD109C058AE
-:10052000DF4F6150CE01F1DD8E3F9F4409F0A1C045
-:10053000809178008D3209F085C0183009F099C09B
-:1005400083EC80936C008AE58093600010926600D3
-:100550009881292F207689812223D1F0712C811155
-:1005600008C082E690E090937B0080937A0024E0BC
-:100570005FC0813051F481E180935700E8954C8051
-:100580005D8097FD50C02FEF4FC0382E20E050C047
-:100590009A8110927500811106C01092760085E74D
-:1005A00090E022E03BC0853019F490937D002CC090
-:1005B000863009F58B81813019F48AED98E104C009
-:1005C000823041F488EC98E190937B0080937A002C
-:1005D00022E10DC0833051F4911108C08CEE98E1F6
-:1005E00090937B0080937A0024E001C020E080E4B7
-:1005F000809366001DC0883059F0893019F49093BB
-:100600007F0002C08A3039F085E790E020E006C024
-:100610008FE790E002C085E790E021E090937B00B7
-:1006200080937A0005C02E8180E88093660007C021
-:100630008F81811104C08E81821708F4282F2093A6
-:10064000610017C08091660087FF13C080EC4816D8
-:1006500088E1580620F0842D8F7339F00AC0899103
-:100660009991F6DE125091F7F6CF95E0392E10925F
-:10067000610010927C008091600084FF42C08091F4
-:1006800061008F3F09F43DC0182F893008F018E051
-:10069000811B8093610080916C0098E8892780938A
-:1006A0006C00112311F1E0917A00F0917B008091B0
-:1006B000660086FF0BC0ADE6B0E084918D93319665
-:1006C0008DE690E0810F8A13F8CF0BC0EF01ADE605
-:1006D000B0E089918D93FE018DE690E0810F8A1341
-:1006E000F8CFF0937B00E0937A00612F8DE690E0E5
-:1006F00021DD1C5F1C3019F08FEF80936100109397
-:10070000600084E196B3987131F48150D9F710926A
-:100710007D0010927700C1E08111C0E080916B00F4
-:100720008C1729F0C11101C067DEC0936B00C301B3
-:1007300001963C018035934C11F484E0382E872DCE
-:100740008D7011F0B99801C0B99A232D3320E9F0CA
-:100750008AE390E20197F1F72230A9F4F894E0ECF3
-:10076000F8E1E054F10983E080935700E895309771
-:10077000C1F7412C512CC8E08FEF9FEF69DEC150CB
-:10078000D9F75DDE02C02530E1F384E03812B5CE42
-:10079000EDEBF8E1E491EF3F09F4AFCEB998F894AE
-:1007A000BB9A1BBE15BA10925F02EAEBF8E1E49126
-:1007B0008E2F81508E3F10F4E1BF00006ECCFFCF32
-:1007C0005AFF18BA400800000000000000000000B6
-:1007D0000000000000000000000000000000000019
-:1007E00000000000000011241FBECFE5D2E0DEBFF4
-:1007F000CDBF10E0A0E6B0E0E2E8FAE002C005906C
-:100800000D92A236B107D9F710E0A2E6B0E001C020
-:100810001D92A236B107E1F71CD131C131CC05C020
-:10082000EDE1F0E13197F1F701970097C9F70895ED
-:10083000AC01407C80E090E0FC01E40FF51F2591C5
-:100840003491FC01EE7FE60FF71F2083318302967F
-:100850008034910589F70895FC01E07C83E0809362
-:100860005700E89507B600FCFDCF0895CF93DF93BE
-:10087000EC01AB01DB0120E030E0FE01E41BF50BF5
-:10088000EA0FFB1F8D919D9161E00C016093570071
-:10089000E89511242F5F3F4F2032310571F785E035
-:1008A000FE0180935700E89507B600FCFDCFDF916D
-:1008B000CF910895CF93DF93CDB7DEB7C054D0402A
-:1008C0000FB6F894DEBF0FBECDBF8091600090914F
-:1008D00061009695879581509044FE0131969E0166
-:1008E0002F5B3F4F81939193E217F307D9F780E095
-:1008F00090E0B2DF80E090E0BE016F5F7F4FB6DF37
-:10090000C05CDF4F0FB6F894DEBF0FBECDBFDF91E6
-:10091000CF9108950F931F93CF93DF93CDB7DEB799
-:10092000C054D0400FB6F894DEBF0FBECDBF00E07C
-:1009300010E040C080E090E0F801E256FF4FE80F81
-:10094000F91F9C013595279547E0E63CF40770F0C8
-:10095000F901EE0FFF1F21E030E02C0F3D1FE20FE9
-:10096000F31F2FEF3FEF318320830DC0459154914A
-:10097000F901EE0FFF1F21E030E02C0F3D1FE20FC9
-:10098000F31F40835183029680349105A9F680912C
-:10099000600090916100800F911F5EDF8091600088
-:1009A00090916100800F911FBE016F5F7F4F5EDFEE
-:1009B000005C1F4F37E00034130709F0BBCFC05C69
-:1009C000DF4F0FB6F894DEBF0FBECDBFDF91CF91E2
-:1009D0001F910F910895CF93DF93CDB7DEB7C05429
-:1009E000D0400FB6F894DEBF0FBECDBF80E090E0E0
-:1009F000BE016F5F7F4F1CDF8FEF9FEF9A8389836C
-:100A000080E090E029DF80E090E0BE016F5F7F4FE3
-:100A10002DDFC05CDF4F0FB6F894DEBF0FBECDBF39
-:100A2000DF91CF910895CF9387B3836087BBC1983F
-:100A3000CAEF81E090E0F3DEC19A81E090E0EFDE62
-:100A4000C198C150B1F7CF910895E0E0F0E0099569
-:100A5000089588B318BA87B38FEF87BB8AEF90E009
-:100A6000DEDE87B317BA8AEF90E0D9DEF894B3DF01
-:100A700051DF20DFD8DFE9DF80E090E00895F894CF
-:020A8000FFCFA6
-:020A8200C0189A
-:040000030000008079
-:00000001FF
diff --git a/upgrade/releases/micronucleus-1.11-upgrade.hex b/upgrade/releases/micronucleus-1.11-upgrade.hex
deleted file mode 100644
index 11060a0..0000000
--- a/upgrade/releases/micronucleus-1.11-upgrade.hex
+++ /dev/null
@@ -1,164 +0,0 @@
-:1000000003C003C003C003C003C003C003C003C0D8
-:100080009AC3C4C3C3C3C2C3C1C3C0C3BFC3BEC377
-:10009000BDC3BCC3BBC3BAC3B9C3B8C3B7C317C01E
-:1000A00016C04CC014C009021200010100803209C0
-:1000B000040000000000000012011001FF00000811
-:1000C000D01653070B01000000010403090411249A
-:1000D0001FBECFE5D2E0CDBFDEBF00EB0F9307E040
-:1000E0000F9310E0A0E6B0E0E2EDFFE102C0059062
-:1000F0000D92A636B107D9F720E0A6E6B0E001C020
-:100100001D92A639B207E1F7E2C1A82FB92F80E00E
-:1001100090E041E050EA609530E009C02D918227DF
-:100120009795879510F084279527305EC8F36F5F09
-:10013000A8F30895EADF8D939D930895CF93CFB7E9
-:10014000CF93C0915F02C03B21F4C0915E02C730E3
-:1001500021F0CF91CFBFCF91A1CFCC27C395B39B37
-:10016000E9F7B39B0BC0B39B09C0B39B07C0B39B1C
-:1001700005C0B39B03C0B39B01C0D3C00F92DF93F4
-:10018000C0917900DD27C058DF4F012EB39B03C01B
-:10019000DF910F90E6CF2F930F931F934F932FEF85
-:1001A0004F6F06B303FB20F95F933F9350E03BE0B2
-:1001B00065C016B30126502953FDC89556B30127D3
-:1001C00003FB25F92F7306B3B1F05027102713FB5B
-:1001D00026F906B22230F0F000C016B3012703FB67
-:1001E00027F90126502906B22430E8F54F77206818
-:1001F00016B30000F6CF50274F7D206206B2102FB5
-:10020000000000C006B300265029102713FB26F972
-:1002100006B2E2CF4F7B06B3206400C0DACF0126DE
-:100220005029187106B269F14E7F2160012F16B373
-:1002300028C0002650294D7F06B22260102F29C009
-:10024000012650294B7F06B22460012F2DC016B322
-:1002500001265029477F2860000006B22EC04F7E3D
-:1002600006B3206130C0422706B3499300265029C7
-:10027000102706B24FEF13FB20F9297F16B379F24E
-:10028000187159F10126502906B2012703FB21F903
-:10029000237F06B371F2002650293150D0F006B208
-:1002A000102713FB22F9277E16B351F2012650299D
-:1002B000012703FB06B223F92F7C49F2000006B3A5
-:1002C000102713FB24F90026502906B22F7939F2A2
-:1002D00070CF10E21ABF002717C03B503195C31BE7
-:1002E000D04010E21ABF0881033CF9F00B34E9F06A
-:1002F000209177001981110F1213EDCF093651F1BA
-:100300000D3211F0013E39F700937E003F915F916D
-:100310004F911F910F912F91DF910F90CAB7C5FD9B
-:100320001DCFCF91CFBFCF91189520917E00222372
-:1003300069F310917C00112321F5343022F13093C0
-:100340007C0020937800109179003BE0311B3093C2
-:10035000790019C000917C0001309CF40AE53091CD
-:10036000600034FD11C000936000CCE6D0E010C006
-:10037000052710E000C021C0052710E0C89508BB84
-:1003800014C03AE501C032ED032EC0E0D0E032E007
-:1003900017B31861C39A08B317BB58E120E84FEFB1
-:1003A00020FF052708BB279517951C3F28F700005D
-:1003B0004552B0F720FF0527279508BB17951C3F2E
-:1003C000B8F629913A9561F7077E10917D00110FDB
-:1003D00008BBC250D04011F01093770010E21ABF52
-:1003E000086017B3177E402F477E54E05A95F1F707
-:1003F00008BB17BB48BB8ACFF8942FEFB0E8A0E446
-:100400004AE0B1BF000081EE9CE0B399FECFB39B00
-:10041000FECF0197B399FDCF97FF03C0BA1B81951B
-:1004200001C0BA0FA69529F4281710F031B7282F6C
-:10043000A1E0415031F731BF000078940895F8945D
-:10044000F201329785E080935700E89578940895FB
-:10045000F201309729F4909368008093670007C0F9
-:10046000E430F10539F490936A00809369008FE5D8
-:100470009CEC1FC02CEB421628E1520639F4809107
-:100480006700909168008E559C4F13C02EEB42166A
-:1004900028E1520639F48091690090916A008D55E7
-:1004A0009C4F07C02AEB421628E1520611F481B78F
-:1004B00090E02FB7F89431E00C0130935700E895A5
-:1004C00011242F0182E0480E511C2FBF089514BE45
-:1004D00088E181BD87E081BDBB9A88E893E1ECE9C2
-:1004E000F1E03197F1F70197D1F7BB98AC9A8BB750
-:1004F00080628BBF7894712C8CE991E00197F1F7C1
-:10050000A895312C60917C00162F135017FDB2C0B6
-:1005100080917900CCE0D0E0C81BD109C058DF4FF2
-:100520006150CE01F2DD8E3F9F4409F0A1C0809161
-:1005300078008D3209F085C0183009F099C083EC3D
-:1005400080936C008AE58093600010926600988129
-:10055000292F207689812223D1F0712C811108C0A6
-:1005600082E690E090937B0080937A0024E05FC065
-:10057000813051F481E180935700E8954C805D8093
-:1005800097FD50C02FEF4FC0382E20E050C09A8109
-:1005900010927500811106C01092760085E790E0F8
-:1005A00022E03BC0853019F490937D002CC086304A
-:1005B00009F58B81813019F48AED98E104C082300D
-:1005C00041F488EC98E190937B0080937A0022E1DB
-:1005D0000DC0833051F4911108C08CEE98E19093D6
-:1005E0007B0080937A0024E001C020E080E48093C7
-:1005F00066001DC0883059F0893019F490937F004F
-:1006000002C08A3039F085E790E020E006C08FE72D
-:1006100090E002C085E790E021E090937B0080931A
-:100620007A0005C02E8180E88093660007C08F8124
-:10063000811104C08E81821708F4282F2093610055
-:1006400017C08091660087FF13C080EC481688E1D0
-:10065000580620F0842D8F7339F00AC08991999142
-:10066000F7DE125091F7F6CF95E0392E1092610027
-:1006700010927C008091600084FF42C080916100F4
-:100680008F3F09F43DC0182F893008F018E0811B16
-:100690008093610080916C0098E8892780936C00BA
-:1006A000112311F1E0917A00F0917B0080916600B6
-:1006B00086FF0BC0ADE6B0E084918D9331968DE658
-:1006C00090E0810F8A13F8CF0BC0EF01ADE6B0E0E8
-:1006D00089918D93FE018DE690E0810F8A13F8CF0A
-:1006E000F0937B00E0937A00612F8DE690E022DDAD
-:1006F0001C5F1C3019F08FEF809361001093600035
-:1007000084E196B3987131F48150D9F710927D004D
-:1007100010927700C1E08111C0E080916B008C17CE
-:1007200029F0C11101C068DEC0936B00C3010196BE
-:100730003C018035934C11F484E0382E232D332076
-:10074000E9F08AE390E20197F1F72230A9F4F894F6
-:10075000E0ECF8E1E054F10983E080935700E8957C
-:100760003097C1F7412C512CC8E08FEF9FEF70DE1E
-:10077000C150D9F764DE02C02530E1F384E03812BD
-:10078000BBCEEDEBF8E1E491EF3F09F4B5CEF89480
-:10079000BB9A1BBE15BA10925F02EAEBF8E1E49136
-:1007A0008E2F81508E3F10F4E1BF000076CCFFCF3A
-:1007B0005AFF18BA400800000000000000000000C6
-:1007C0000000000000000000000000000000000029
-:1007D00000000000000011241FBECFE5D2E0DEBF04
-:1007E000CDBF10E0A0E6B0E0E2E7FAE002C005907D
-:1007F0000D92A236B107D9F710E0A2E6B0E001C031
-:100800001D92A236B107E1F71CD131C139CC05C028
-:10081000EDE1F0E13197F1F701970097C9F70895FD
-:10082000AC01407C80E090E0FC01E40FF51F2591D5
-:100830003491FC01EE7FE60FF71F2083318302968F
-:100840008034910589F70895FC01E07C83E0809372
-:100850005700E89507B600FCFDCF0895CF93DF93CE
-:10086000EC01AB01DB0120E030E0FE01E41BF50B05
-:10087000EA0FFB1F8D919D9161E00C016093570081
-:10088000E89511242F5F3F4F2032310571F785E045
-:10089000FE0180935700E89507B600FCFDCFDF917D
-:1008A000CF910895CF93DF93CDB7DEB7C054D0403A
-:1008B0000FB6F894DEBF0FBECDBF8091600090915F
-:1008C00061009695879581509044FE0131969E0176
-:1008D0002F5B3F4F81939193E217F307D9F780E0A5
-:1008E00090E0B2DF80E090E0BE016F5F7F4FB6DF47
-:1008F000C05CDF4F0FB6F894DEBF0FBECDBFDF91F7
-:10090000CF9108950F931F93CF93DF93CDB7DEB7A9
-:10091000C054D0400FB6F894DEBF0FBECDBF00E08C
-:1009200010E040C080E090E0F801E256FF4FE80F91
-:10093000F91F9C013595279547E0E63BF40770F0D9
-:10094000F901EE0FFF1F21E030E02C0F3D1FE20FF9
-:10095000F31F2FEF3FEF318320830DC0459154915A
-:10096000F901EE0FFF1F21E030E02C0F3D1FE20FD9
-:10097000F31F40835183029680349105A9F680913C
-:10098000600090916100800F911F5EDF8091600098
-:1009900090916100800F911FBE016F5F7F4F5EDFFE
-:1009A000005C1F4F37E00034130709F0BBCFC05C79
-:1009B000DF4F0FB6F894DEBF0FBECDBFDF91CF91F2
-:1009C0001F910F910895CF93DF93CDB7DEB7C05439
-:1009D000D0400FB6F894DEBF0FBECDBF80E090E0F0
-:1009E000BE016F5F7F4F1CDF8FEF9FEF9A8389837C
-:1009F00080E090E029DF80E090E0BE016F5F7F4FF4
-:100A00002DDFC05CDF4F0FB6F894DEBF0FBECDBF49
-:100A1000DF91CF910895CF9387B3836087BBC1984F
-:100A2000CAEF81E090E0F3DEC19A81E090E0EFDE72
-:100A3000C198C150B1F7CF910895E0E0F0E0099579
-:100A4000089588B318BA87B38FEF87BB8AEF90E019
-:100A5000DEDE87B317BA8AEF90E0D9DEF894B3DF11
-:100A600051DF20DFD8DFE9DF80E090E00895F894DF
-:020A7000FFCFB6
-:020A7200C018AA
-:040000030000008079
-:00000001FF
diff --git a/upgrade/technical details.txt b/upgrade/technical details.txt
deleted file mode 100644
index 45fa7ee..0000000
--- a/upgrade/technical details.txt
+++ /dev/null
@@ -1,51 +0,0 @@
-Technical Details
-=================
-
-A summary of how 'upgrade' works
-
-
--- build process:
-
-1) Manually run the generate-data.rb ruby script with the new bootloader's hex file:
- ruby generate-data.rb new_firmware.hex
- If you have trouble running it, make sure you're using ruby version 1.9. 1.8 is too old!
-
- generate-data.rb creates the bootloader_data.c file, which defines some variables containing
- the entire raw byte data of the bootloader as an array stored in flash memory. It also
- calculates and writes in the start address of the bootloader. The hex file supplied can be any
- bootloader which works similarly to USBaspLoader-tiny85 - which is most (all?) tiny85 bootloaders
- and likely some for other avr chips which lack hardware bootloader stuff.
-
-2) Generate the hex file using make:
- make clean; make
-
- The upgrader hex file is built in the usual way, then combined with upgrade-prefix.hex (which
- I wrote by hand) to prefix a fake interrupt vector table in the start of the upgrader. This is
- necessary because bootloaders like micronucleus and Fast Tiny & Mega Bootloader only work with
- firmwares which begin with an interrupt vector table, because of the way they mangle the table
- to forward some interrupts to themselves.
-
-3) Upload the resulting upgrade.hex file to a chip you have some means of recovering. If all works
- correctly, consider now uploading it to other chips which maybe more difficult to recover but are
- otherwise identical.
-
-
--- how it works:
-
-Taking inspiration from computer viruses, when upgrade runs it goes through this process:
-
-1) Brick the chip:
- The first thing upgrade does is erase the ISR vector table. Erasing it sets the first page to
- 0xFF bytes - creating a NOP sled. If the chip looses power or otherwise resets, it wont enter
- the bootloader, sliding in to the upgrader restarting the process.
-
-2) erase and write bootloader:
- The flash pages for the new bootloader are erased and rewritten from start to finish.
-
-3) install the trampoline:
- The fake ISR table which was erased in step one is now written to - a trampoline is added, simply
- forwarding any requests to the new bootloader's interrupt vector table. At this point the viral
- upgrader has completed it's life cycle and has disabled itself. It should never run again, booting
- directly in to the bootloader instead.
-
-
diff --git a/upgrade/upgrade-prefix.hex b/upgrade/upgrade-prefix.hex
deleted file mode 100644
index bb908dc..0000000
--- a/upgrade/upgrade-prefix.hex
+++ /dev/null
@@ -1 +0,0 @@
-:1000000003C003C003C003C003C003C003C003C0D8
diff --git a/upgrade/utils.h b/upgrade/utils.h
deleted file mode 100644
index c84ee56..0000000
--- a/upgrade/utils.h
+++ /dev/null
@@ -1,90 +0,0 @@
-#include <util/delay_basic.h>
-#include <avr/io.h>
-
-// For the niceness
-typedef unsigned char byte;
-typedef unsigned char boolean;
-
-// make bit & value, eg bit(5) #=> 0b00010000
-#define bit(number) _BV(number)
-#define pin(number) _BV(number)
-
-// USI serial aliases
-#define USIOutputPort PORTE
-#define USIInputPort PINE
-#define USIDirectionPort DDRE
-#define USIClockPin PE4
-#define USIDataInPin PE5
-#define USIDataOutPin PE6
-
-// booleans
-#define on 255
-#define off 0
-#define true 1
-#define false 0
-#define yes true
-#define no false
-
-// ensure a value is within the bounds of a minimum and maximum (inclusive)
-#define constrainUpper(value, max) (value > max ? max : value)
-#define constrainLower(value, min) (value < min ? min : value)
-#define constrain(value, min, max) constrainLower(constrainUpper(value, max), min)
-#define multiplyDecimal(a,b) (((a) * (b)) / 256)
-
-// set a pin on DDRB to be an input or an output - i.e. becomeOutput(pin(3));
-#define inputs(pinmap) DDRB &= ~(pinmap)
-#define outputs(pinmap) DDRB |= (pinmap)
-
-// turn some pins on or off
-#define pinsOn(pinmap) PORTB |= (pinmap)
-#define pinsOff(pinmap) PORTB &= ~(pinmap)
-#define pinsToggle(pinmap) PORTB ^= pinmap
-
-// turn a single pin on or off
-#define pinOn(pin) pinsOn(bit(pin))
-#define pinOff(pin) pinsOff(bit(pin))
-// TODO: Should be called pinToggle
-#define toggle(pin) pinsToggle(bit(pin))
-
-// delay a number of microseconds - or as close as we can get
-#if F_CPU == 16500000
- // special version to deal with half-mhz speed. in a resolution of 2us increments, rounded up
- // this loop has been tuned empirically with an oscilloscope and works in avr-gcc 4.5.1
- static inline void microdelay(int microseconds) {
- while (microseconds > 1) {
- // 16 nops
- asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
- asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
- // 16 nops
- asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
- asm("NOP");asm("NOP");asm("NOP");
-
-
- microseconds -= 2;
- }
- }
-#else
- #define microdelay(microseconds) _delay_loop_2(((microseconds) * (F_CPU / 100000)) / 40)
-#endif
-
-// delay in milliseconds - a custom implementation to avoid util/delay's tendancy to import floating point math libraries
-inline void delay(unsigned int ms) {
- while (ms > 0) {
- // delay for one millisecond (250*4 cycles, multiplied by cpu mhz)
- // subtract number of time taken in while loop and decrement and other bits
- _delay_loop_2((25 * F_CPU / 100000));
- ms--;
- }
-}
-
-
-
-// digital read returns 0 or 1
-#define get(pin) ((PINB >> pin) & 0b00000001)
-#define getBitmap(bitmap) (PINB & bitmap)
-static inline void set(byte pin, byte state) {
- if (state) { pinOn(pin); } else { pinOff(pin); }
- // alternatly:
- // PORTB = (PORTB & ~(bit(pin)) | ((state & 1) << pin);
-}
-
diff --git a/windows_driver/amd64/libusb0.dll b/windows_driver/amd64/libusb0.dll
new file mode 100644
index 0000000..f916b08
--- /dev/null
+++ b/windows_driver/amd64/libusb0.dll
Binary files differ
diff --git a/windows_driver/amd64/libusb0.sys b/windows_driver/amd64/libusb0.sys
new file mode 100644
index 0000000..0718dfb
--- /dev/null
+++ b/windows_driver/amd64/libusb0.sys
Binary files differ
diff --git a/windows_driver/bin/amd64/install-filter-win.exe b/windows_driver/bin/amd64/install-filter-win.exe
new file mode 100644
index 0000000..7bb0373
--- /dev/null
+++ b/windows_driver/bin/amd64/install-filter-win.exe
Binary files differ
diff --git a/windows_driver/bin/amd64/install-filter.exe b/windows_driver/bin/amd64/install-filter.exe
new file mode 100644
index 0000000..e1ca7ad
--- /dev/null
+++ b/windows_driver/bin/amd64/install-filter.exe
Binary files differ
diff --git a/windows_driver/bin/amd64/libusb0.dll b/windows_driver/bin/amd64/libusb0.dll
new file mode 100644
index 0000000..f916b08
--- /dev/null
+++ b/windows_driver/bin/amd64/libusb0.dll
Binary files differ
diff --git a/windows_driver/bin/amd64/libusb0.sys b/windows_driver/bin/amd64/libusb0.sys
new file mode 100644
index 0000000..0718dfb
--- /dev/null
+++ b/windows_driver/bin/amd64/libusb0.sys
Binary files differ
diff --git a/windows_driver/bin/amd64/testlibusb-win.exe b/windows_driver/bin/amd64/testlibusb-win.exe
new file mode 100644
index 0000000..76898de
--- /dev/null
+++ b/windows_driver/bin/amd64/testlibusb-win.exe
Binary files differ
diff --git a/windows_driver/bin/amd64/testlibusb.exe b/windows_driver/bin/amd64/testlibusb.exe
new file mode 100644
index 0000000..ca7896f
--- /dev/null
+++ b/windows_driver/bin/amd64/testlibusb.exe
Binary files differ
diff --git a/windows_driver/bin/ia64/install-filter-win.exe b/windows_driver/bin/ia64/install-filter-win.exe
new file mode 100644
index 0000000..e0dde64
--- /dev/null
+++ b/windows_driver/bin/ia64/install-filter-win.exe
Binary files differ
diff --git a/windows_driver/bin/ia64/install-filter.exe b/windows_driver/bin/ia64/install-filter.exe
new file mode 100644
index 0000000..92c09a8
--- /dev/null
+++ b/windows_driver/bin/ia64/install-filter.exe
Binary files differ
diff --git a/windows_driver/bin/ia64/libusb0.dll b/windows_driver/bin/ia64/libusb0.dll
new file mode 100644
index 0000000..292df27
--- /dev/null
+++ b/windows_driver/bin/ia64/libusb0.dll
Binary files differ
diff --git a/windows_driver/bin/ia64/libusb0.sys b/windows_driver/bin/ia64/libusb0.sys
new file mode 100644
index 0000000..f17914b
--- /dev/null
+++ b/windows_driver/bin/ia64/libusb0.sys
Binary files differ
diff --git a/windows_driver/bin/ia64/testlibusb-win.exe b/windows_driver/bin/ia64/testlibusb-win.exe
new file mode 100644
index 0000000..859d991
--- /dev/null
+++ b/windows_driver/bin/ia64/testlibusb-win.exe
Binary files differ
diff --git a/windows_driver/bin/ia64/testlibusb.exe b/windows_driver/bin/ia64/testlibusb.exe
new file mode 100644
index 0000000..04b8ee0
--- /dev/null
+++ b/windows_driver/bin/ia64/testlibusb.exe
Binary files differ
diff --git a/windows_driver/bin/inf-wizard.exe b/windows_driver/bin/inf-wizard.exe
new file mode 100644
index 0000000..4ead777
--- /dev/null
+++ b/windows_driver/bin/inf-wizard.exe
Binary files differ
diff --git a/windows_driver/bin/libusb-win32-bin-README.txt b/windows_driver/bin/libusb-win32-bin-README.txt
new file mode 100644
index 0000000..455eb6b
--- /dev/null
+++ b/windows_driver/bin/libusb-win32-bin-README.txt
@@ -0,0 +1,27 @@
+libusb-win32-bin v1.2.6.0 (01/17/2012) - [Package Information]
+
+ALL ARCHITECTURES:
+ x86\libusb0_x86.dll: x86 32-bit library. Must be renamed to libusb0.dll
+ On 64 bit, Installs to Windows\syswow64\libusb0.dll.
+ On 32 bit, Installs to Windows\system32\libusb0.dll.
+
+ x86\inf-wizard.exe: inf-wizard application with embedded libusb-win32
+ v1.2.6.0 binaries.
+
+X86 ONLY ARCHITECTURES:
+ x86\libusb0.sys: x86 32-bit driver.
+ Installs to Windows\system32\drivers\libusb0.sys
+
+AMD64-INTEL64 ONLY ARCHITECTURES:
+ amd64\libusb0.sys: x64 64-bit driver.
+ Installs to Windows\system32\drivers\libusb0.sys
+
+ amd64\libusb0.dll: x64 64-bit library.
+ Installs to Windows\system32\libusb0.dll
+
+IA64 ONLY ARCHITECTURES:
+ ia64\libusb0.sys: IA64 64-bit driver.
+ Installs to Windows\system32\drivers\libusb0.sys
+
+ ia64\libusb0.dll: IA64 64-bit library.
+ Installs to Windows\system32\libusb0.dll
diff --git a/windows_driver/bin/x86/install-filter-win.exe b/windows_driver/bin/x86/install-filter-win.exe
new file mode 100644
index 0000000..0cf34d4
--- /dev/null
+++ b/windows_driver/bin/x86/install-filter-win.exe
Binary files differ
diff --git a/windows_driver/bin/x86/install-filter.exe b/windows_driver/bin/x86/install-filter.exe
new file mode 100644
index 0000000..5badbad
--- /dev/null
+++ b/windows_driver/bin/x86/install-filter.exe
Binary files differ
diff --git a/windows_driver/bin/x86/libusb0.sys b/windows_driver/bin/x86/libusb0.sys
new file mode 100644
index 0000000..5322e5b
--- /dev/null
+++ b/windows_driver/bin/x86/libusb0.sys
Binary files differ
diff --git a/windows_driver/bin/x86/libusb0_x86.dll b/windows_driver/bin/x86/libusb0_x86.dll
new file mode 100644
index 0000000..6e475b9
--- /dev/null
+++ b/windows_driver/bin/x86/libusb0_x86.dll
Binary files differ
diff --git a/windows_driver/bin/x86/testlibusb-win.exe b/windows_driver/bin/x86/testlibusb-win.exe
new file mode 100644
index 0000000..05f79c2
--- /dev/null
+++ b/windows_driver/bin/x86/testlibusb-win.exe
Binary files differ
diff --git a/windows_driver/bin/x86/testlibusb.exe b/windows_driver/bin/x86/testlibusb.exe
new file mode 100644
index 0000000..a08b76e
--- /dev/null
+++ b/windows_driver/bin/x86/testlibusb.exe
Binary files differ
diff --git a/windows_driver/ia64/libusb0.dll b/windows_driver/ia64/libusb0.dll
new file mode 100644
index 0000000..292df27
--- /dev/null
+++ b/windows_driver/ia64/libusb0.dll
Binary files differ
diff --git a/windows_driver/ia64/libusb0.sys b/windows_driver/ia64/libusb0.sys
new file mode 100644
index 0000000..f17914b
--- /dev/null
+++ b/windows_driver/ia64/libusb0.sys
Binary files differ
diff --git a/windows_driver/installer_x64.exe b/windows_driver/installer_x64.exe
new file mode 100644
index 0000000..c38919e
--- /dev/null
+++ b/windows_driver/installer_x64.exe
Binary files differ
diff --git a/windows_driver/installer_x86.exe b/windows_driver/installer_x86.exe
new file mode 100644
index 0000000..030ec30
--- /dev/null
+++ b/windows_driver/installer_x86.exe
Binary files differ
diff --git a/windows_driver/license/libusb0/installer_license.txt b/windows_driver/license/libusb0/installer_license.txt
new file mode 100644
index 0000000..56bb2cd
--- /dev/null
+++ b/windows_driver/license/libusb0/installer_license.txt
@@ -0,0 +1,851 @@
+Copyright (c) 2002-2004 Stephan Meyer, <ste_meyer@web.de>
+Copyright (c) 2000-2004 Johannes Erdfelt, <johannes@erdfelt.com>
+Copyright (c) 2000-2004 Thomas Sailer, <sailer@ife.ee.ethz.ch>
+Copyright (c) 2010 Travis Robinson, <libusbdotnet@gmail.com>
+
+This software is distributed under the following licenses:
+Driver: GNU General Public License (GPL)
+Library, Test Files, Installer: GNU Lesser General Public License (LGPL)
+
+***********************************************************************
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/windows_driver/micronucleus_bootloader.cat b/windows_driver/micronucleus_bootloader.cat
new file mode 100644
index 0000000..f39e1be
--- /dev/null
+++ b/windows_driver/micronucleus_bootloader.cat
Binary files differ
diff --git a/windows_driver/micronucleus_bootloader.inf b/windows_driver/micronucleus_bootloader.inf
new file mode 100644
index 0000000..e295cda
--- /dev/null
+++ b/windows_driver/micronucleus_bootloader.inf
Binary files differ
diff --git a/windows_driver/x86/libusb0.sys b/windows_driver/x86/libusb0.sys
new file mode 100644
index 0000000..5322e5b
--- /dev/null
+++ b/windows_driver/x86/libusb0.sys
Binary files differ
diff --git a/windows_driver/x86/libusb0_x86.dll b/windows_driver/x86/libusb0_x86.dll
new file mode 100644
index 0000000..6e475b9
--- /dev/null
+++ b/windows_driver/x86/libusb0_x86.dll
Binary files differ