summaryrefslogtreecommitdiffstats
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-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.c176
-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
44 files changed, 3052 insertions, 2833 deletions
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/firmware/upgrade.c b/firmware/upgrade.c
new file mode 100644
index 0000000..698ed28
--- /dev/null
+++ b/firmware/upgrade.c
@@ -0,0 +1,176 @@
+// Upgrade is an in-place firmware upgrader for tiny85 chips - just fill in the
+// 'bootloaderAddress' variable in bootloader_data.h, and the bootloaderData
+// progmem array with the bootloader data, and you're ready to go.
+//
+// Upgrade will firstly rewrite the interrupt vector table to disable the bootloader,
+// rewriting it to just run the upgrade app. Next it erases and writes each page of the
+// bootloader in sequence, erasing over any remaining pages leaving them set to 0xFFFF
+// Finally upgrader erases it's interrupt table again and fills it with RJMPs to
+// bootloaderAddress, effectively bridging the interrupts in to the new bootloader's
+// interrupts table.
+//
+// While upgrade has been written with attiny85 and micronucleus in mind, it should
+// work with other bootloaders and other chips with flash self program but no hardware
+// bootloader protection, where the bootloader exists at the end of flash
+//
+// Be very careful to not power down the AVR while upgrader is running.
+// If you connect a piezo between pb0 and pb1 you'll hear a bleep when the update
+// is complete. You can also connect an LED with pb0 positive and pb1 or gnd negative and
+// it will blink
+
+#include "./utils.h"
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <avr/pgmspace.h>
+#include <avr/wdt.h>
+#include <avr/boot.h>
+#include "./bootloader_data.c"
+
+void secure_interrupt_vector_table(void);
+void write_new_bootloader(void);
+void forward_interrupt_vector_table(void);
+void beep(void);
+void reboot(void);
+
+void load_table(uint16_t address, uint16_t words[SPM_PAGESIZE / 2]);
+void erase_page(uint16_t address);
+void write_page(uint16_t address, uint16_t words[SPM_PAGESIZE / 2]);
+
+
+int main(void) {
+ pinsOff(0xFF); // pull down all pins
+ outputs(0xFF); // all to ground - force usb disconnect
+ delay(250); // milliseconds
+ inputs(0xFF); // let them float
+ delay(250);
+ cli();
+
+ secure_interrupt_vector_table(); // reset our vector table to it's original state
+ write_new_bootloader();
+ forward_interrupt_vector_table();
+
+ beep();
+
+ reboot();
+
+ return 0;
+}
+
+// erase first page, removing any interrupt table hooks the bootloader added when
+// upgrade was uploaded
+void secure_interrupt_vector_table(void) {
+ uint16_t table[SPM_PAGESIZE / 2];
+
+ load_table(0, table);
+
+ // wipe out any interrupt hooks the bootloader rewrote
+ int i = 0;
+ while (i < SPM_PAGESIZE / 2) {
+ table[0] = 0xFFFF;
+ i++;
+ }
+
+ erase_page(0);
+ write_page(0, table);
+}
+
+// erase bootloader's section and write over it with new bootloader code
+void write_new_bootloader(void) {
+ uint16_t outgoing_page[SPM_PAGESIZE / 2];
+ int iter = 0;
+ while (iter < sizeof(bootloader_data)) {
+
+ // read in one page's worth of data from progmem
+ int word_addr = 0;
+ while (word_addr < SPM_PAGESIZE) {
+ int subaddress = ((int) bootloader_data) + iter + word_addr;
+ if (subaddress >= ((int) bootloader_data) + sizeof(bootloader_data)) {
+ outgoing_page[word_addr / 2] = 0xFFFF;
+ } else {
+ outgoing_page[word_addr / 2] = pgm_read_word(subaddress);
+ }
+
+ word_addr += 2;
+ }
+
+ // erase page in destination
+ erase_page(bootloader_address + iter);
+ // write updated page
+ write_page(bootloader_address + iter, outgoing_page);
+
+ iter += 64;
+ }
+}
+
+// write in forwarding interrupt vector table
+void forward_interrupt_vector_table(void) {
+ uint16_t vector_table[SPM_PAGESIZE / 2];
+
+ int iter = 0;
+ while (iter < SPM_PAGESIZE / 2) {
+ // rjmp to bootloader_address's interrupt table
+ vector_table[iter] = 0xC000 + (bootloader_address / 2) - 1;
+ iter++;
+ }
+
+ erase_page(0);
+ write_page(0, vector_table);
+}
+
+void load_table(uint16_t address, uint16_t words[SPM_PAGESIZE / 2]) {
+ uint16_t subaddress = 0;
+ address -= address % SPM_PAGESIZE; // round down to nearest page start
+
+ while (subaddress < SPM_PAGESIZE) {
+ words[subaddress / 2] = pgm_read_word(address + subaddress);
+ subaddress += 2;
+ }
+}
+
+void erase_page(uint16_t address) {
+ boot_page_erase(address - (address % SPM_PAGESIZE));
+ boot_spm_busy_wait();
+}
+
+void write_page(uint16_t address, uint16_t words[SPM_PAGESIZE / 2]) {
+ // fill buffer
+ uint16_t iter = 0;
+ while (iter < SPM_PAGESIZE / 2) {
+ boot_page_fill(address + (iter * 2), words[iter]);
+ iter++;
+ }
+
+ boot_page_write(address);
+ boot_spm_busy_wait(); // Wait until the memory is written.
+}
+
+// beep for a quarter of a second
+void beep(void) {
+ outputs(pin(0) | pin(1));
+ pinOff(1);
+
+ byte i = 0;
+ while (i < 250) {
+ delay(1);
+ pinOn(pin(0));
+ delay(1);
+ pinOff(pin(0));
+ i++;
+ }
+}
+
+void reboot(void) {
+ void (*ptrToFunction)(); // pointer to a function
+ ptrToFunction = 0x0000;
+ (*ptrToFunction)(); // reset!
+}
+
+
+////////////// Add padding to start of program so no program code could reasonably be erased while program is running
+// this never needs to be called - avr-gcc stuff happening: http://www.nongnu.org/avr-libc/user-manual/mem_sections.html
+volatile void FakeISR (void) __attribute__ ((naked)) __attribute__ ((section (".init0")));
+volatile void FakeISR (void) {
+ // 16 nops to pad out first section of program
+ 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");
+}
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]