From 97408f3fe74d7858c0da3eac2ee063b568062231 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sun, 15 Dec 2013 16:49:09 +0100 Subject: roadmap --- firmware/Roadmap.txt | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 firmware/Roadmap.txt (limited to 'firmware') diff --git a/firmware/Roadmap.txt b/firmware/Roadmap.txt new file mode 100644 index 0000000..523c26c --- /dev/null +++ b/firmware/Roadmap.txt @@ -0,0 +1,26 @@ +Development Roadmap + +1.x Improvements (No protocol change, micronucleus host tool stays the same) + +Changes to client firmware: + - Only time out bootloader if program is loaded + - CRC check + - Move clean boot page to initialization + +2.x Improvements (New Protocol, new command line tool) + +Changes to client firmware: + - New device support (84,841,167,861) + - External oscillator option + - polled USB + - enter bootloader by external reset + +Changes to protocol/command line tool + - Send different delay times for erase and program to support 481 + - Transmit data in value and index field, don't use data payload to reduce code size and improve v-usb stability + - Move writing of tiny vector table to host tool. Reset vector patching stays on client + -> no risk of bricking device, since bootloader will remain active + - erase command + + + \ No newline at end of file -- cgit v1.2.3 From 02224cdc7724d27d04312127af0e249357319d12 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sun, 15 Dec 2013 17:00:59 +0100 Subject: restructure, optimizations by shay #1 -> use register for events --- firmware/Roadmap.txt | 3 ++- firmware/main.c | 55 +++++++++++++++++++++++++++++----------------------- 2 files changed, 33 insertions(+), 25 deletions(-) (limited to 'firmware') diff --git a/firmware/Roadmap.txt b/firmware/Roadmap.txt index 523c26c..564cf12 100644 --- a/firmware/Roadmap.txt +++ b/firmware/Roadmap.txt @@ -6,7 +6,8 @@ Changes to client firmware: - Only time out bootloader if program is loaded - CRC check - Move clean boot page to initialization - + - Integrate blarrgg global optimizations + 2.x Improvements (New Protocol, new command line tool) Changes to client firmware: diff --git a/firmware/main.c b/firmware/main.c index a6af148..b4f57e7 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -16,7 +16,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 8 - // Use the old delay routines without NOP padding. This saves memory. #define __DELAY_BACKWARD_COMPATIBLE__ @@ -26,7 +25,6 @@ #include #include -static void leaveBootloader() __attribute__((__noreturn__)); #include "bootloaderconfig.h" #include "usbdrv/usbdrv.c" @@ -50,7 +48,9 @@ static void leaveBootloader() __attribute__((__noreturn__)); #endif // events system schedules functions to run in the main loop -static uchar events = 0; // bitmap of events to run +// static uchar events = 0; // bitmap of events to run +register uint8_t events asm( "r1" ); // register saves many bytes + #define EVENT_ERASE_APPLICATION 1 #define EVENT_WRITE_PAGE 2 #define EVENT_EXECUTE 4 @@ -156,10 +156,7 @@ static void writeWordToPageBuffer(uint16_t data) { previous_sreg=SREG; cli(); // ensure interrupts are disabled - // clear page buffer as a precaution before filling the buffer on the first page - // in case the bootloader somehow ran after user program and there was something - // in the page buffer already - if (currentAddress == 0x0000) __boot_page_fill_clear(); + boot_page_fill(currentAddress, data); // increment progmem address by one word @@ -235,8 +232,33 @@ void PushMagicWord (void) { asm volatile("push r16"::); } +static void initHardware (void) +{ + MCUSR=0; /* need this to properly disable watchdog */ + wdt_disable(); + + #if LOW_POWER_MODE + // turn off clock prescalling - chip must run at full speed for usb + // if you might run chip at lower voltages, detect that in bootLoaderStartCondition + CLKPR = 1 << CLKPCE; + CLKPR = 0; + #endif + + // clear page buffer as a precaution before filling the buffer on the first page + // in case the bootloader somehow ran after user program and there was something + // in the page buffer already + __boot_page_fill_clear(); + + usbDeviceDisconnect(); /* do this while interrupts are disabled */ + _delay_ms(500); + usbDeviceConnect(); + usbInit(); // Initialize INT settings after reconnect + sei(); +} + /* ------------------------------------------------------------------------ */ // reset system to a normal state and launch user program +static void leaveBootloader(void) __attribute__((__noreturn__)); static inline void leaveBootloader(void) { _delay_ms(10); // removing delay causes USB errors @@ -280,26 +302,11 @@ int main(void) { if (bootLoaderStartCondition()) { - MCUSR=0; /* need this to properly disable watchdog */ - wdt_disable(); - - #if LOW_POWER_MODE - // turn off clock prescalling - chip must run at full speed for usb - // if you might run chip at lower voltages, detect that in bootLoaderStartCondition - CLKPR = 1 << CLKPCE; - CLKPR = 0; - #endif + initHardware(); # if LED_PRESENT LED_INIT(); -# endif - - usbDeviceDisconnect(); /* do this while interrupts are disabled */ - _delay_ms(500); - usbDeviceConnect(); - usbInit(); // Initialize INT settings after reconnect - sei(); - +# endif do { usbPoll(); _delay_us(100); -- cgit v1.2.3 From f6daa493d57a22caf58eb45aaebc978d5c2fa4f7 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sun, 15 Dec 2013 17:03:46 +0100 Subject: C99 types --- firmware/main.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'firmware') diff --git a/firmware/main.c b/firmware/main.c index b4f57e7..401aaa8 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -48,7 +48,7 @@ #endif // events system schedules functions to run in the main loop -// static uchar events = 0; // bitmap of events to run +// static uint8_t events = 0; // bitmap of events to run register uint8_t events asm( "r1" ); // register saves many bytes #define EVENT_ERASE_APPLICATION 1 @@ -77,8 +77,8 @@ static uint16_t currentAddress; // current progmem address, used for erasing and static inline void eraseApplication(void); static void writeFlashPage(void); static void writeWordToPageBuffer(uint16_t data); -static uchar usbFunctionSetup(uchar data[8]); -static uchar usbFunctionWrite(uchar *data, uchar length); +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 @@ -165,11 +165,11 @@ static void writeWordToPageBuffer(uint16_t data) { } /* ------------------------------------------------------------------------ */ -static uchar usbFunctionSetup(uchar data[8]) { +static uint8_t usbFunctionSetup(uint8_t data[8]) { usbRequest_t *rq = (void *)data; ((uint8_t*)&idlePolls)[1] = 0; // reset idle polls when we get usb traffic - static uchar replyBuffer[4] = { + static uint8_t replyBuffer[4] = { (((uint16_t)PROGMEM_SIZE) >> 8) & 0xff, ((uint16_t)PROGMEM_SIZE) & 0xff, SPM_PAGESIZE, @@ -197,7 +197,7 @@ static uchar usbFunctionSetup(uchar data[8]) { } // read in a page over usb, and write it in to the flash write buffer -static uchar usbFunctionWrite(uchar *data, uchar length) { +static uint8_t usbFunctionWrite(uint8_t *data, uint8_t length) { do { // make sure we don't write over the bootloader! if (currentAddress >= BOOTLOADER_ADDRESS) break; @@ -210,9 +210,9 @@ static uchar usbFunctionWrite(uchar *data, uchar length) { // if we have now reached another page boundary, we're done #if SPM_PAGESIZE<256 // Hack to reduce code size - uchar isLast = ((((uchar)currentAddress) % SPM_PAGESIZE) == 0); + uint8_t isLast = ((((uint8_t)currentAddress) % SPM_PAGESIZE) == 0); #else - uchar isLast = ((currentAddress % SPM_PAGESIZE) == 0); + uint8_t isLast = ((currentAddress % SPM_PAGESIZE) == 0); #endif // definitely need this if! seems usbFunctionWrite gets called again in future usbPoll's in the runloop! -- cgit v1.2.3 From 7f1b5e11a801b4c6609870f79bbb93edab3292fd Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sun, 15 Dec 2013 20:19:35 +0100 Subject: don't exit bootloader with clean memory --- firmware/Roadmap.txt | 10 ++++++---- firmware/bootloaderconfig.h | 2 +- firmware/main.c | 37 +++++++++++++++++-------------------- 3 files changed, 24 insertions(+), 25 deletions(-) (limited to 'firmware') diff --git a/firmware/Roadmap.txt b/firmware/Roadmap.txt index 564cf12..1612fcd 100644 --- a/firmware/Roadmap.txt +++ b/firmware/Roadmap.txt @@ -3,10 +3,11 @@ Development Roadmap 1.x Improvements (No protocol change, micronucleus host tool stays the same) Changes to client firmware: - - Only time out bootloader if program is loaded - - CRC check - - Move clean boot page to initialization - - Integrate blarrgg global optimizations + - Only time out bootloader if program is loaded - done + - Move clean boot page to initialization - done + - Integrate blargg optimizations + * turned "event"-variable into register to save memory + * moved flash buffer clean to hardware initialization function 2.x Improvements (New Protocol, new command line tool) @@ -22,6 +23,7 @@ Changes to protocol/command line tool - Move writing of tiny vector table to host tool. Reset vector patching stays on client -> no risk of bricking device, since bootloader will remain active - erase command + - CRC check \ No newline at end of file diff --git a/firmware/bootloaderconfig.h b/firmware/bootloaderconfig.h index e1b2a4c..53c650f 100644 --- a/firmware/bootloaderconfig.h +++ b/firmware/bootloaderconfig.h @@ -282,7 +282,7 @@ these macros are defined, the boot loader uses them. */ #define AUTO_EXIT_NO_USB_MS 0 -#define AUTO_EXIT_MS 6000 +#define AUTO_EXIT_MS 5000 /* * Defines the setting of the RC-oscillator calibration after quitting the bootloader. (OSCCAL) diff --git a/firmware/main.c b/firmware/main.c index 401aaa8..3fca133 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -25,7 +25,6 @@ #include #include - #include "bootloaderconfig.h" #include "usbdrv/usbdrv.c" @@ -49,7 +48,7 @@ // events system schedules functions to run in the main loop // static uint8_t events = 0; // bitmap of events to run -register uint8_t events asm( "r1" ); // register saves many bytes +register uint8_t events asm( "r3" ); // register saves many bytes #define EVENT_ERASE_APPLICATION 1 #define EVENT_WRITE_PAGE 2 @@ -156,7 +155,6 @@ static void writeWordToPageBuffer(uint16_t data) { previous_sreg=SREG; cli(); // ensure interrupts are disabled - boot_page_fill(currentAddress, data); // increment progmem address by one word @@ -260,7 +258,7 @@ static void initHardware (void) // reset system to a normal state and launch user program static void leaveBootloader(void) __attribute__((__noreturn__)); static inline void leaveBootloader(void) { - _delay_ms(10); // removing delay causes USB errors + _delay_ms(10); // removing delay causes USB errors bootLoaderExit(); cli(); @@ -308,28 +306,27 @@ int main(void) { LED_INIT(); # endif do { + clearEvents(); usbPoll(); _delay_us(100); - - // these next two freeze the chip for ~ 4.5ms, breaking usb protocol - // and usually both of these will activate in the same loop, so host - // needs to wait > 9ms before next usb request - if (isEvent(EVENT_ERASE_APPLICATION)) eraseApplication(); - if (isEvent(EVENT_WRITE_PAGE)) { - _delay_us(2000); // Wait for USB traffic to finish before halting CPU with write- - writeFlashPage(); - } - -# if BOOTLOADER_CAN_EXIT - if (isEvent(EVENT_EXECUTE)) break; // when host requests device run uploaded program -# endif - clearEvents(); + + // these next two freeze the chip for ~ 4.5ms, breaking usb protocol + // and usually both of these will activate in the same loop, so host + // needs to wait > 9ms before next usb request + if (isEvent(EVENT_ERASE_APPLICATION)) eraseApplication(); + if (isEvent(EVENT_WRITE_PAGE)) { + _delay_us(2000); // Wait for USB traffic to finish before halting CPU with write- + writeFlashPage(); + } # if LED_PRESENT LED_MACRO( ((uint8_t*)&idlePolls)[1] ) # endif - - } while(bootLoaderCondition()); /* main event loop runs so long as bootLoaderCondition remains truthy */ + + // Only try to execute program if reset vector is set - bootloader will not time out with erased memory + if (!bootLoaderCondition()&&(pgm_read_byte(BOOTLOADER_ADDRESS - TINYVECTOR_RESET_OFFSET)!=0xff)) fireEvent(EVENT_EXECUTE); + + } while(!isEvent(EVENT_EXECUTE)); /* main event loop runs as long as program is not executed */ } // set clock prescaler to desired clock speed (changing from clkdiv8, or no division, depending on fuses) -- cgit v1.2.3 From c6b12b287746ac950f4efcd1e5e872f5fe5acfe2 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sun, 15 Dec 2013 21:16:32 +0100 Subject: clean up osccal --- firmware/Makefile | 4 +- firmware/libs-device/Readme.txt | 22 ---- firmware/libs-device/osccal.c | 183 ------------------------------- firmware/libs-device/osccal.h | 57 ---------- firmware/libs-device/osccalASM.S | 228 --------------------------------------- firmware/libs-device/osctune.h | 88 --------------- firmware/osccal.h | 57 ++++++++++ firmware/osccalASM.S | 228 +++++++++++++++++++++++++++++++++++++++ firmware/osccalASM.o | Bin 0 -> 1684 bytes 9 files changed, 287 insertions(+), 580 deletions(-) delete mode 100644 firmware/libs-device/Readme.txt delete mode 100644 firmware/libs-device/osccal.c delete mode 100644 firmware/libs-device/osccal.h delete mode 100644 firmware/libs-device/osccalASM.S delete mode 100644 firmware/libs-device/osctune.h create mode 100644 firmware/osccal.h create mode 100644 firmware/osccalASM.S create mode 100644 firmware/osccalASM.o (limited to 'firmware') diff --git a/firmware/Makefile b/firmware/Makefile index 0905d0a..9da5be6 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -149,12 +149,12 @@ CC = avr-gcc 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. -Ilibs-device -mmcu=$(DEVICE) -DF_CPU=$(F_CPU) $(DEFINES) +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 OBJECTS = crt1.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o -OBJECTS += libs-device/osccalASM.o +OBJECTS += osccalASM.o # symbolic targets: all: main.hex diff --git a/firmware/libs-device/Readme.txt b/firmware/libs-device/Readme.txt deleted file mode 100644 index 76518dc..0000000 --- a/firmware/libs-device/Readme.txt +++ /dev/null @@ -1,22 +0,0 @@ -This is the Readme file for the libs-device directory. This directory contains -code snippets which may be useful for USB device firmware. - - -WHAT IS INCLUDED IN THIS DIRECTORY? -=================================== - -osccal.c and osccal.h - This module contains a function which calibrates the AVR's built-in RC - oscillator based on the USB frame clock. See osccal.h for a documentation - of the API. - -osctune.h - This header file contains a code snippet for usbconfig.h. With this code, - you can keep the AVR's internal RC oscillator in sync with the USB frame - clock. This is a continuous synchronization, not a single calibration at - USB reset as with osccal.c above. Please note that this code works only - if D- is wired to the interrupt, not D+. - ----------------------------------------------------------------------------- -(c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH. -http://www.obdev.at/ diff --git a/firmware/libs-device/osccal.c b/firmware/libs-device/osccal.c deleted file mode 100644 index 8debe49..0000000 --- a/firmware/libs-device/osccal.c +++ /dev/null @@ -1,183 +0,0 @@ -/* Name: osccal.c - * Author: Christian Starkjohann - * Creation Date: 2008-04-10 - * Tabsize: 4 - * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH - * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) - * This Revision: $Id: osccal.c 762 2009-08-12 17:10:30Z cs $ - */ - -#include -#include -#ifndef uchar -#define uchar unsigned char -#endif - -int usbMeasureFrameLengthDecreasing(int); - -/* ------------------------------------------------------------------------- */ -/* ------------------------ Oscillator Calibration ------------------------- */ -/* ------------------------------------------------------------------------- */ - -/* Calibrate the RC oscillator. Our timing reference is the Start Of Frame - * signal (a single SE0 bit) repeating every millisecond immediately after - * a USB RESET. - * - * - * Optimized version by cpldcpu@gmail.com, Nov 3rd 2013. - * - * Benefits: - * - Codesize reduced by 54 bytes. - * - Improved robustness due to removing timeout from frame length measurement and - * 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 - * 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 - * 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 - * use the watchdog to escape from situations like this. - * - * 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 - * RC oscillator frequency is unusually high. Under normal operation, the highest - * tested frequency setting is 192. This corresponds to ~20 Mhz core frequency and - * is still within spec for a 5V device. - */ - -void calibrateOscillator(void) -{ - uchar step, trialValue, optimumValue; - int x, targetValue; - uchar optimumDev; - uchar i,xl; - - targetValue = (unsigned)((double)F_CPU * 999e-6 / 5.0 + 0.5); /* Time is measured in multiples of 5 cycles. Target is 0.999µs */ - optimumDev = 0xff; - // optimumValue = OSCCAL; - step=64; - trialValue = 128; - - cli(); // disable interrupts - - /* - Performs seven iterations of a binary search (stepwidth decreasing9 - with three additional steps of a neighborhood search (step=1, trialvalue will oscillate around target value to find optimum) - */ - - for(i=0; i<10; i++){ - OSCCAL = trialValue; - asm volatile(" NOP"); - - x = usbMeasureFrameLengthDecreasing(targetValue); - - if(x < 0) /* frequency too high */ - { - trialValue -= step; - xl=(uchar)-x; - } - else /* frequency too low */ - { - trialValue += step; - xl=(uchar)x; - } - - /* - Halve stepwidth to perform binary search. Logical oring with 1 to ensure step is never equal to zero. - This results in a neighborhood search with stepwidth 1 after binary search is finished. - Once the neighbourhood search stage is reached, x will be smaller than +-255, hence more code can be - saved by only working with the lower 8 bits. - */ - - step >>= 1; - - if (step==0) - { - step=1; - if(xl <= optimumDev){ - optimumDev = xl; - optimumValue = OSCCAL; - } - } - - } - - OSCCAL = optimumValue; - asm volatile(" NOP"); - - sei(); // enable interrupts -} - -void calibrateOscillator_old(void) -{ - uchar step, trialValue, optimumValue; - int x, optimumDev, targetValue; - uchar i; - - targetValue = (unsigned)((double)F_CPU * 999e-6 / 5.0 + 0.5); /* Time is measured in multiples of 5 cycles. Target is 0.999µs */ - optimumDev = 0x7f00; // set to high positive value - optimumValue = OSCCAL; - step=64; - trialValue = 128; - - /* - Performs seven iterations of a binary search (stepwidth decreasing9 - with three additional steps of a neighborhood search (step=1, trialvalue will oscillate around target value to find optimum) - */ - - for(i=0; i<10; i++){ - OSCCAL = trialValue; - asm volatile(" NOP"); - - x = usbMeasureFrameLengthDecreasing(targetValue); - - if(x < 0) /* frequency too high */ - { - trialValue -= step; - x = -x; - } - else /* frequency too low */ - { - trialValue += step; - } - - /* - Halve stepwidth to perform binary search. Logical oring with 1 to ensure step is never equal to zero. - This results in a neighborhood search with stepwidth 1 after binary search is finished. - */ - - step >>= 1; - step |=1; - - if(x < optimumDev){ - optimumDev = x; - optimumValue = OSCCAL; - } - } - - OSCCAL = optimumValue; - asm volatile(" NOP"); -} - -/* -Note: This calibration algorithm may try OSCCAL values of up to 192 even if -the optimum value is far below 192. It may therefore exceed the allowed clock -frequency of the CPU in low voltage designs! -You may replace this search algorithm with any other algorithm you like if -you have additional constraints such as a maximum CPU clock. -For version 5.x RC oscillators (those with a split range of 2x128 steps, e.g. -ATTiny25, ATTiny45, ATTiny85), it may be useful to search for the optimum in -both regions. -*/ diff --git a/firmware/libs-device/osccal.h b/firmware/libs-device/osccal.h deleted file mode 100644 index af37a43..0000000 --- a/firmware/libs-device/osccal.h +++ /dev/null @@ -1,57 +0,0 @@ -/* Name: osccal.h - * Author: Christian Starkjohann - * Creation Date: 2008-04-10 - * Changes 2013-11-04 cpldcpu@gmail.com - * Tabsize: 4 - * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH - * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) - */ - -/* -General Description: -This module contains a function which calibrates the AVR's internal RC -oscillator so that the CPU runs at F_CPU (F_CPU is a macro which must be -defined when the module is compiled, best passed in the compiler command -line). The time reference is the USB frame clock of 1 kHz available -immediately after a USB RESET condition. Timing is done by counting CPU -cycles, so all interrupts must be disabled while the calibration runs. -The size optimized assembler implementation includes its own implementation -of usbMeasureFrameLength. Therefore USB_CFG_HAVE_MEASURE_FRAME_LENGTH should -be set to 0 to avoid including unused code sections. It is recommended to call -calibrateOscillatorASM() from the reset hook in usbconfig.h by including osccal.h: - -#include "osccal.h" - -This routine is an alternative to the continuous synchronization described -in osctune.h. - -Algorithm used: See osccalASM.x - -Limitations: -This calibration algorithm may try OSCCAL values of up to 192 even if the -optimum value is far below 192. It may therefore exceed the allowed clock -frequency of the CPU in low voltage designs! -Precision depends on the OSCCAL vs. frequency dependency of the oscillator. -Typical precision for an ATMega168 (derived from the OSCCAL vs. F_RC diagram -in the data sheet) should be in the range of 0.4%. Only the 12.8 MHz and -16.5 MHz versions of V-USB (with built-in receiver PLL) can tolerate this -deviation! All other frequency modules require at least 0.2% precision. -*/ - -#ifndef __OSCCAL_H_INCLUDED__ -#define __OSCCAL_H_INCLUDED__ - -#ifndef __ASSEMBLER__ - void calibrateOscillatorASM(void); -# define USB_RESET_HOOK(resetStarts) if(!resetStarts){ calibrateOscillatorASM();} -# define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0 -#endif -/* This function calibrates the RC oscillator so that the CPU runs at F_CPU. - * It MUST be called immediately after the end of a USB RESET condition! - * Disable all interrupts during the call! - * It is recommended that you store the resulting value in EEPROM so that a - * good guess value is available after the next reset. - */ - - -#endif /* __OSCCAL_H_INCLUDED__ */ diff --git a/firmware/libs-device/osccalASM.S b/firmware/libs-device/osccalASM.S deleted file mode 100644 index 9a317f1..0000000 --- a/firmware/libs-device/osccalASM.S +++ /dev/null @@ -1,228 +0,0 @@ -/* Name: osccalASM.S - * Author: cpldcpu@gmail.com - * Creation Date: 2013-11-3 - * Tabsize: 4 - * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) - */ - -/* Calibrate the RC oscillator. Our timing reference is the Start Of Frame - * signal (a single SE0 bit) repeating every millisecond immediately after - * a USB RESET. - * - * - * Benefits: - * - Codesize reduced by 90 bytes. - * - Improved robustness due to removing timeout from frame length measurement and - * 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 - * 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 - * 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 - * use the watchdog to escape from situations like this. - * - * 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 - * RC oscillator frequency is unusually high. Under normal operation, the highest - * tested frequency setting is 192. This corresponds to ~20 Mhz core frequency and - * is still within spec for a 5V device. - */ - - -#define __SFR_OFFSET 0 /* used by avr-libc's register definitions */ -#include "./usbdrv/usbdrv.h" /* for common defs */ - -#ifdef __IAR_SYSTEMS_ASM__ -/* Register assignments for usbMeasureFrameLengthDecreasing on IAR cc */ -/* Calling conventions on IAR: - * First parameter passed in r16/r17, second in r18/r19 and so on. - * Callee must preserve r4-r15, r24-r29 (r28/r29 is frame pointer) - * Result is passed in r16/r17 - * In case of the "tiny" memory model, pointers are only 8 bit with no - * padding. We therefore pass argument 1 as "16 bit unsigned". - */ - -//Untested - -# define i r20 -# define opV r19 -# define opD r18 -# define try r21 -# define stp r22 - -# define cnt16L r30 -# define cnt16H r31 - - -#else /* __IAR_SYSTEMS_ASM__ */ -/* Register assignments for usbMeasureFrameLength on gcc */ -/* Calling conventions on gcc: - * First parameter passed in r24/r25, second in r22/23 and so on. - * Callee must preserve r1-r17, r28/r29 - * Result is passed in r24/r25 - */ - -# define i r20 -# define opV r19 -# define opD r18 -# define try r27 -# define stp r26 -# define cnt16L r24 -# define cnt16H r25 -#endif -# define cnt16 cnt16L - -; extern void calibrateOscillatorASM(void); - -.global calibrateOscillatorASM -calibrateOscillatorASM: - - cli - ldi opD, 255 - - ldi try, 128 ; calibration start value - ldi stp, 64 ; initial step width - ldi i, 10 ; 10 iterations - -usbCOloop: - - out OSCCAL, try - nop - - ; Delay values = F_CPU * 999e-6 / 5 + 0.5 - -#if (F_CPU == 16500000) - ldi cnt16L, lo8(3297) - ldi cnt16H, hi8(3297) -#elif (F_CPU == 12800000) - ldi cnt16L, lo8(2557) - ldi cnt16H, hi8(2557) -#else - #error "calibrateOscillatorASM: no delayvalues defined for this F_CPU setting" -#endif - -usbCOWaitStrobe: ; first wait for D- == 0 (idle strobe) - sbic USBIN, USBMINUS ; - rjmp usbCOWaitStrobe ; -usbCOWaitIdle: ; then wait until idle again - sbis USBIN, USBMINUS ;1 wait for D- == 1 - rjmp usbCOWaitIdle ;2 -usbCOWaitLoop: - sbiw cnt16,1 ;[0] [5] - sbic USBIN, USBMINUS ;[2] - rjmp usbCOWaitLoop ;[3] - - sbrs cnt16H, 7 ;delay overflow? - rjmp usbCOclocktoolow - sub try, stp - neg cnt16L - rjmp usbCOclocktoohigh -usbCOclocktoolow: - add try, stp -usbCOclocktoohigh: - lsr stp - brne usbCOnoneighborhoodsearch - cp opD, cnt16L - brcs usbCOnoimprovement - in opV, OSCCAL - mov opD, cnt16L -usbCOnoimprovement: - ldi stp, 1 -usbCOnoneighborhoodsearch: - subi i, 1 - brne usbCOloop - - out OSCCAL, opV - nop - sei - ret - -#undef i -#undef opV -#undef opD -#undef try -#undef stp -#undef cnt16 -#undef cnt16L -#undef cnt16H - -/* ------------------------------------------------------------------------- */ -/* ------ Original C Implementation of improved calibrateOscillator -------- */ -/* ---------------------- for Reference only ----------------------------- */ -/* ------------------------------------------------------------------------- */ - -#if 0 -void calibrateOscillator(void) -{ - uchar step, trialValue, optimumValue; - int x, targetValue; - uchar optimumDev; - uchar i,xl; - - targetValue = (unsigned)((double)F_CPU * 999e-6 / 5.0 + 0.5); /* Time is measured in multiples of 5 cycles. Target is 0.999µs */ - optimumDev = 0xff; - // optimumValue = OSCCAL; - step=64; - trialValue = 128; - - cli(); // disable interrupts - - /* - Performs seven iterations of a binary search (stepwidth decreasing9 - with three additional steps of a neighborhood search (step=1, trialvalue will oscillate around target value to find optimum) - */ - - for(i=0; i<10; i++){ - OSCCAL = trialValue; - asm volatile(" NOP"); - - x = usbMeasureFrameLengthDecreasing(targetValue); - - if(x < 0) /* frequency too high */ - { - trialValue -= step; - xl=(uchar)-x; - } - else /* frequency too low */ - { - trialValue += step; - xl=(uchar)x; - } - - /* - Halve stepwidth to perform binary search. At step=1 the mode changes to neighbourhood search. - Once the neighbourhood search stage is reached, x will be smaller than +-255, hence more code can be - saved by only working with the lower 8 bits. - */ - - step >>= 1; - - if (step==0) // Enter neighborhood search mode - { - step=1; - if(xl <= optimumDev){ - optimumDev = xl; - optimumValue = OSCCAL; - } - } - } - - OSCCAL = optimumValue; - asm volatile(" NOP"); - - sei(); // enable interrupts -} -#endif \ No newline at end of file diff --git a/firmware/libs-device/osctune.h b/firmware/libs-device/osctune.h deleted file mode 100644 index c751648..0000000 --- a/firmware/libs-device/osctune.h +++ /dev/null @@ -1,88 +0,0 @@ -/* Name: osctune.h - * Author: Christian Starkjohann - * Creation Date: 2008-10-18 - * Tabsize: 4 - * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH - * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) - * This Revision: $Id: osctune.h 692 2008-11-07 15:07:40Z cs $ - */ - -/* -General Description: -This file is declared as C-header file although it is mostly documentation -how the RC oscillator can be kept in sync to the USB frame rate. The code -shown here must be added to usbconfig.h or this header file is included from -there. This code works only if D- is wired to the interrupt, not D+!!! - -This is an alternative to the osccal routine in osccal.c. It has the advantage -that the synchronization is done continuously and that it has more compact -code size. The disadvantages are slow synchronization (it may take a while -until the driver works), that messages immediately after the SOF pulse may be -lost (and need to be retried by the host) and that the interrupt is on D- -contrary to most examples. - -You may want to store a good calibration value in EEPROM for the next startup. -You know that the calibration value is good when the first USB message is -received. Do not store the value on every received message because the EEPROM -has a limited endurance. - -Notes: -(*) You must declare the global character variable "lastTimer0Value" in your -main code. - -(*) Timer 0 must be free running (not written by your code) and the prescaling -must be consistent with the TIMER0_PRESCALING define. - -(*) Good values for Timer 0 prescaling depend on how precise the clock must -be tuned and how far away from the default clock rate the target clock is. -For precise tuning, choose a low prescaler factor, for a broad range of tuning -choose a high one. A prescaler factor of 64 is good for the entire OSCCAL -range and allows a precision of better than +/-1%. A prescaler factor of 8 -allows tuning to slightly more than +/-6% of the default frequency and is -more precise than one step of OSCCAL. It is therefore not suitable to tune an -8 MHz oscillator to 12.5 MHz. - -Thanks to Henrik Haftmann for the idea to this routine! -*/ - -#define TIMER0_PRESCALING 64 /* must match the configuration for TIMER0 in main */ -#define TOLERATED_DEVIATION_PPT 5 /* max clock deviation before we tune in 1/10 % */ -/* derived constants: */ -#define EXPECTED_TIMER0_INCREMENT ((F_CPU / (1000 * TIMER0_PRESCALING)) & 0xff) -#define TOLERATED_DEVIATION (TOLERATED_DEVIATION_PPT * F_CPU / (1000000 * TIMER0_PRESCALING)) - -#ifdef __ASSEMBLER__ -macro tuneOsccal - push YH ;[0] - in YL, TCNT0 ;[2] - lds YH, lastTimer0Value ;[3] - sts lastTimer0Value, YL ;[5] - sub YL, YH ;[7] time passed since last frame - subi YL, EXPECTED_TIMER0_INCREMENT ;[8] -#if OSCCAL > 0x3f /* outside I/O addressable range */ - lds YH, OSCCAL ;[6] -#else - in YH, OSCCAL ;[6] assembler modle uses __SFR_OFFSET == 0 -#endif - cpi YL, TOLERATED_DEVIATION + 1 ;[10] - brmi notTooHigh ;[11] - subi YH, 1 ;[12] clock rate was too high -; brcs tuningOverflow ; optionally check for overflow - rjmp osctuneDone ;[13] -notTooHigh: - cpi YL, -TOLERATED_DEVIATION ;[13] - brpl osctuneDone ;[14] not too low - inc YH ;[15] clock rate was too low -; breq tuningOverflow ; optionally check for overflow -osctuneDone: -#if OSCCAL > 0x3f /* outside I/O addressable range */ - sts OSCCAL, YH ;[12-13] store tuned value -#else - out OSCCAL, YH ;[12-13] store tuned value -#endif -tuningOverflow: - pop YH ;[17] - endm ;[19] max number of cycles -#endif - -#define USB_SOF_HOOK tuneOsccal diff --git a/firmware/osccal.h b/firmware/osccal.h new file mode 100644 index 0000000..af37a43 --- /dev/null +++ b/firmware/osccal.h @@ -0,0 +1,57 @@ +/* Name: osccal.h + * Author: Christian Starkjohann + * Creation Date: 2008-04-10 + * Changes 2013-11-04 cpldcpu@gmail.com + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + */ + +/* +General Description: +This module contains a function which calibrates the AVR's internal RC +oscillator so that the CPU runs at F_CPU (F_CPU is a macro which must be +defined when the module is compiled, best passed in the compiler command +line). The time reference is the USB frame clock of 1 kHz available +immediately after a USB RESET condition. Timing is done by counting CPU +cycles, so all interrupts must be disabled while the calibration runs. +The size optimized assembler implementation includes its own implementation +of usbMeasureFrameLength. Therefore USB_CFG_HAVE_MEASURE_FRAME_LENGTH should +be set to 0 to avoid including unused code sections. It is recommended to call +calibrateOscillatorASM() from the reset hook in usbconfig.h by including osccal.h: + +#include "osccal.h" + +This routine is an alternative to the continuous synchronization described +in osctune.h. + +Algorithm used: See osccalASM.x + +Limitations: +This calibration algorithm may try OSCCAL values of up to 192 even if the +optimum value is far below 192. It may therefore exceed the allowed clock +frequency of the CPU in low voltage designs! +Precision depends on the OSCCAL vs. frequency dependency of the oscillator. +Typical precision for an ATMega168 (derived from the OSCCAL vs. F_RC diagram +in the data sheet) should be in the range of 0.4%. Only the 12.8 MHz and +16.5 MHz versions of V-USB (with built-in receiver PLL) can tolerate this +deviation! All other frequency modules require at least 0.2% precision. +*/ + +#ifndef __OSCCAL_H_INCLUDED__ +#define __OSCCAL_H_INCLUDED__ + +#ifndef __ASSEMBLER__ + void calibrateOscillatorASM(void); +# define USB_RESET_HOOK(resetStarts) if(!resetStarts){ calibrateOscillatorASM();} +# define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0 +#endif +/* This function calibrates the RC oscillator so that the CPU runs at F_CPU. + * It MUST be called immediately after the end of a USB RESET condition! + * Disable all interrupts during the call! + * It is recommended that you store the resulting value in EEPROM so that a + * good guess value is available after the next reset. + */ + + +#endif /* __OSCCAL_H_INCLUDED__ */ diff --git a/firmware/osccalASM.S b/firmware/osccalASM.S new file mode 100644 index 0000000..9a317f1 --- /dev/null +++ b/firmware/osccalASM.S @@ -0,0 +1,228 @@ +/* Name: osccalASM.S + * Author: cpldcpu@gmail.com + * Creation Date: 2013-11-3 + * Tabsize: 4 + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + */ + +/* Calibrate the RC oscillator. Our timing reference is the Start Of Frame + * signal (a single SE0 bit) repeating every millisecond immediately after + * a USB RESET. + * + * + * Benefits: + * - Codesize reduced by 90 bytes. + * - Improved robustness due to removing timeout from frame length measurement and + * 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 + * 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 + * 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 + * use the watchdog to escape from situations like this. + * + * 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 + * RC oscillator frequency is unusually high. Under normal operation, the highest + * tested frequency setting is 192. This corresponds to ~20 Mhz core frequency and + * is still within spec for a 5V device. + */ + + +#define __SFR_OFFSET 0 /* used by avr-libc's register definitions */ +#include "./usbdrv/usbdrv.h" /* for common defs */ + +#ifdef __IAR_SYSTEMS_ASM__ +/* Register assignments for usbMeasureFrameLengthDecreasing on IAR cc */ +/* Calling conventions on IAR: + * First parameter passed in r16/r17, second in r18/r19 and so on. + * Callee must preserve r4-r15, r24-r29 (r28/r29 is frame pointer) + * Result is passed in r16/r17 + * In case of the "tiny" memory model, pointers are only 8 bit with no + * padding. We therefore pass argument 1 as "16 bit unsigned". + */ + +//Untested + +# define i r20 +# define opV r19 +# define opD r18 +# define try r21 +# define stp r22 + +# define cnt16L r30 +# define cnt16H r31 + + +#else /* __IAR_SYSTEMS_ASM__ */ +/* Register assignments for usbMeasureFrameLength on gcc */ +/* Calling conventions on gcc: + * First parameter passed in r24/r25, second in r22/23 and so on. + * Callee must preserve r1-r17, r28/r29 + * Result is passed in r24/r25 + */ + +# define i r20 +# define opV r19 +# define opD r18 +# define try r27 +# define stp r26 +# define cnt16L r24 +# define cnt16H r25 +#endif +# define cnt16 cnt16L + +; extern void calibrateOscillatorASM(void); + +.global calibrateOscillatorASM +calibrateOscillatorASM: + + cli + ldi opD, 255 + + ldi try, 128 ; calibration start value + ldi stp, 64 ; initial step width + ldi i, 10 ; 10 iterations + +usbCOloop: + + out OSCCAL, try + nop + + ; Delay values = F_CPU * 999e-6 / 5 + 0.5 + +#if (F_CPU == 16500000) + ldi cnt16L, lo8(3297) + ldi cnt16H, hi8(3297) +#elif (F_CPU == 12800000) + ldi cnt16L, lo8(2557) + ldi cnt16H, hi8(2557) +#else + #error "calibrateOscillatorASM: no delayvalues defined for this F_CPU setting" +#endif + +usbCOWaitStrobe: ; first wait for D- == 0 (idle strobe) + sbic USBIN, USBMINUS ; + rjmp usbCOWaitStrobe ; +usbCOWaitIdle: ; then wait until idle again + sbis USBIN, USBMINUS ;1 wait for D- == 1 + rjmp usbCOWaitIdle ;2 +usbCOWaitLoop: + sbiw cnt16,1 ;[0] [5] + sbic USBIN, USBMINUS ;[2] + rjmp usbCOWaitLoop ;[3] + + sbrs cnt16H, 7 ;delay overflow? + rjmp usbCOclocktoolow + sub try, stp + neg cnt16L + rjmp usbCOclocktoohigh +usbCOclocktoolow: + add try, stp +usbCOclocktoohigh: + lsr stp + brne usbCOnoneighborhoodsearch + cp opD, cnt16L + brcs usbCOnoimprovement + in opV, OSCCAL + mov opD, cnt16L +usbCOnoimprovement: + ldi stp, 1 +usbCOnoneighborhoodsearch: + subi i, 1 + brne usbCOloop + + out OSCCAL, opV + nop + sei + ret + +#undef i +#undef opV +#undef opD +#undef try +#undef stp +#undef cnt16 +#undef cnt16L +#undef cnt16H + +/* ------------------------------------------------------------------------- */ +/* ------ Original C Implementation of improved calibrateOscillator -------- */ +/* ---------------------- for Reference only ----------------------------- */ +/* ------------------------------------------------------------------------- */ + +#if 0 +void calibrateOscillator(void) +{ + uchar step, trialValue, optimumValue; + int x, targetValue; + uchar optimumDev; + uchar i,xl; + + targetValue = (unsigned)((double)F_CPU * 999e-6 / 5.0 + 0.5); /* Time is measured in multiples of 5 cycles. Target is 0.999µs */ + optimumDev = 0xff; + // optimumValue = OSCCAL; + step=64; + trialValue = 128; + + cli(); // disable interrupts + + /* + Performs seven iterations of a binary search (stepwidth decreasing9 + with three additional steps of a neighborhood search (step=1, trialvalue will oscillate around target value to find optimum) + */ + + for(i=0; i<10; i++){ + OSCCAL = trialValue; + asm volatile(" NOP"); + + x = usbMeasureFrameLengthDecreasing(targetValue); + + if(x < 0) /* frequency too high */ + { + trialValue -= step; + xl=(uchar)-x; + } + else /* frequency too low */ + { + trialValue += step; + xl=(uchar)x; + } + + /* + Halve stepwidth to perform binary search. At step=1 the mode changes to neighbourhood search. + Once the neighbourhood search stage is reached, x will be smaller than +-255, hence more code can be + saved by only working with the lower 8 bits. + */ + + step >>= 1; + + if (step==0) // Enter neighborhood search mode + { + step=1; + if(xl <= optimumDev){ + optimumDev = xl; + optimumValue = OSCCAL; + } + } + } + + OSCCAL = optimumValue; + asm volatile(" NOP"); + + sei(); // enable interrupts +} +#endif \ No newline at end of file diff --git a/firmware/osccalASM.o b/firmware/osccalASM.o new file mode 100644 index 0000000..2a829d4 Binary files /dev/null and b/firmware/osccalASM.o differ -- cgit v1.2.3 From f32bf1b6c6c5f157f981c111e2ccce2399e4c509 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Mon, 16 Dec 2013 09:34:40 +0100 Subject: firmware: fix condition for EXECUTE read high byte of user programm reset vector --- firmware/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'firmware') diff --git a/firmware/main.c b/firmware/main.c index 3fca133..04b0e33 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -324,7 +324,7 @@ int main(void) { # endif // Only try to execute program if reset vector is set - bootloader will not time out with erased memory - if (!bootLoaderCondition()&&(pgm_read_byte(BOOTLOADER_ADDRESS - TINYVECTOR_RESET_OFFSET)!=0xff)) fireEvent(EVENT_EXECUTE); + if (!bootLoaderCondition()&&(pgm_read_byte(BOOTLOADER_ADDRESS - TINYVECTOR_RESET_OFFSET + 1)!=0xff)) fireEvent(EVENT_EXECUTE); } while(!isEvent(EVENT_EXECUTE)); /* main event loop runs as long as program is not executed */ } -- cgit v1.2.3 From bda177784ad97bd3934bb2359621c5c5460805ef Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Mon, 16 Dec 2013 09:38:22 +0100 Subject: firmware: Clean buffer at begin of write improve robustness --- firmware/Makefile | 2 +- firmware/main.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) (limited to 'firmware') diff --git a/firmware/Makefile b/firmware/Makefile index 9da5be6..459052b 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -190,7 +190,7 @@ read_fuses: $(UISP) --rd_fuses clean: - rm -f main.hex main.bin main.c.lst main.map *.o usbdrv/*.o main.s usbdrv/oddebug.s usbdrv/usbdrv.s libs-device/osccalASM.o *.lss + rm -f main.hex main.bin main.c.lst main.map *.o usbdrv/*.o main.s usbdrv/oddebug.s usbdrv/usbdrv.s *.lss # file targets: main.bin: $(OBJECTS) diff --git a/firmware/main.c b/firmware/main.c index 04b0e33..a7deccc 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -179,6 +179,10 @@ static uint8_t usbFunctionSetup(uint8_t data[8]) { return 4; } else if (rq->bRequest == 1) { // write 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 = rq->wIndex.word; return USB_NO_MSG; // hands off work to usbFunctionWrite @@ -242,10 +246,6 @@ static void initHardware (void) CLKPR = 0; #endif - // clear page buffer as a precaution before filling the buffer on the first page - // in case the bootloader somehow ran after user program and there was something - // in the page buffer already - __boot_page_fill_clear(); usbDeviceDisconnect(); /* do this while interrupts are disabled */ _delay_ms(500); -- cgit v1.2.3 From a6afba324cc7ae49b755a2786104f45aea2b290c Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Tue, 17 Dec 2013 09:41:27 +0100 Subject: firmware: remove o-file from repository --- firmware/osccalASM.o | Bin 1684 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 firmware/osccalASM.o (limited to 'firmware') diff --git a/firmware/osccalASM.o b/firmware/osccalASM.o deleted file mode 100644 index 2a829d4..0000000 Binary files a/firmware/osccalASM.o and /dev/null differ -- cgit v1.2.3 From bd22f84cfae23f84a2d2fee343b937794942b0f1 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Tue, 17 Dec 2013 19:49:02 +0100 Subject: firmware: bootloader will only exit when program was loaded --- firmware/main.c | 56 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 30 insertions(+), 26 deletions(-) (limited to 'firmware') diff --git a/firmware/main.c b/firmware/main.c index a7deccc..36a42be 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -284,20 +284,23 @@ static inline void leaveBootloader(void) { } int main(void) { - /* initialize */ - #if OSCCAL_RESTORE - osccal_default = OSCCAL; - #endif - #if (!SET_CLOCK_PRESCALER) && LOW_POWER_MODE - uint8_t prescaler_default = CLKPR; - #endif + + /* initialize */ + #if OSCCAL_RESTORE + osccal_default = OSCCAL; + #endif + + #if (!SET_CLOCK_PRESCALER) && LOW_POWER_MODE + uint8_t prescaler_default = CLKPR; + #endif - bootLoaderInit(); + bootLoaderInit(); -# if AUTO_EXIT_NO_USB_MS - ((uint8_t*)&idlePolls)[1]=((AUTO_EXIT_MS-AUTO_EXIT_NO_USB_MS) * 10UL)>>8; // write only high byte to save 6 bytes -# endif + #if AUTO_EXIT_NO_USB_MS + ((uint8_t*)&idlePolls)[1]=((AUTO_EXIT_MS-AUTO_EXIT_NO_USB_MS) * 10UL)>>8; // write only high byte to save 6 bytes + #endif + if (bootLoaderStartCondition()) { initHardware(); @@ -319,14 +322,15 @@ int main(void) { writeFlashPage(); } -# if LED_PRESENT - LED_MACRO( ((uint8_t*)&idlePolls)[1] ) -# endif + #if LED_PRESENT + LED_MACRO( ((uint8_t*)&idlePolls)[1] ) + #endif - // Only try to execute program if reset vector is set - bootloader will not time out with erased memory - if (!bootLoaderCondition()&&(pgm_read_byte(BOOTLOADER_ADDRESS - TINYVECTOR_RESET_OFFSET + 1)!=0xff)) fireEvent(EVENT_EXECUTE); - - } while(!isEvent(EVENT_EXECUTE)); /* main event loop runs as long as program is not executed */ + // Try to execute program if bootloader exit condition is met + if (!bootLoaderCondition()) fireEvent(EVENT_EXECUTE); + + /* main event loop runs as long as no problem is uploaded or existing program is not executed */ + } while((!isEvent(EVENT_EXECUTE))||(pgm_read_byte(BOOTLOADER_ADDRESS - TINYVECTOR_RESET_OFFSET + 1)==0xff)); } // set clock prescaler to desired clock speed (changing from clkdiv8, or no division, depending on fuses) @@ -340,15 +344,15 @@ int main(void) { #endif #endif -# if LED_PRESENT - LED_EXIT(); -# endif + #if LED_PRESENT + LED_EXIT(); + #endif -# if OSCCAL_RESTORE - OSCCAL=osccal_default; - asm volatile("nop"); // NOP to avoid CPU hickup during oscillator stabilization -# endif + #if OSCCAL_RESTORE + OSCCAL=osccal_default; + asm volatile("nop"); // NOP to avoid CPU hickup during oscillator stabilization + #endif - leaveBootloader(); + leaveBootloader(); } /* ------------------------------------------------------------------------ */ -- cgit v1.2.3 From 181445ff3a2e28c980d3c6f8dd38578659db5664 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Fri, 27 Dec 2013 18:36:28 +0100 Subject: firmware: clean up nop --- firmware/main.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'firmware') diff --git a/firmware/main.c b/firmware/main.c index 36a42be..83c5538 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -60,8 +60,9 @@ register uint8_t events asm( "r3" ); // register saves many bytes #define clearEvents() events = 0 // 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 sei() asm volatile("sei") +#define cli() asm volatile("cli") +#define nop() asm volatile("nop") uint16_t idlePolls = 0; // how long have we been idle? @@ -276,7 +277,7 @@ static inline void leaveBootloader(void) { 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; - asm volatile("nop"); + nop(); } #endif // jump to application reset vector at end of flash @@ -350,7 +351,7 @@ int main(void) { #if OSCCAL_RESTORE OSCCAL=osccal_default; - asm volatile("nop"); // NOP to avoid CPU hickup during oscillator stabilization + nop(); // NOP to avoid CPU hickup during oscillator stabilization #endif leaveBootloader(); -- cgit v1.2.3 From 7145ca9e88c8dc41561347dfa57ee18169ebb90f Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sat, 28 Dec 2013 11:52:42 +0100 Subject: firmware: delete nync-cat.bin --- firmware/nyan-cat.bin | Bin 1304 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 firmware/nyan-cat.bin (limited to 'firmware') diff --git a/firmware/nyan-cat.bin b/firmware/nyan-cat.bin deleted file mode 100644 index cb463d8..0000000 Binary files a/firmware/nyan-cat.bin and /dev/null differ -- cgit v1.2.3 From 4f3b33a40ec800bc29efeb89ec7ae32b9adbbaf5 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sat, 28 Dec 2013 12:10:51 +0100 Subject: firmware: de-clutter bootloaderconfig --- firmware/bootloaderconfig.h | 114 ++++++++++---------------------------------- 1 file changed, 25 insertions(+), 89 deletions(-) (limited to 'firmware') diff --git a/firmware/bootloaderconfig.h b/firmware/bootloaderconfig.h index 53c650f..7ad4699 100644 --- a/firmware/bootloaderconfig.h +++ b/firmware/bootloaderconfig.h @@ -115,81 +115,21 @@ these macros are defined, the boot loader uses them. /* ---------------------- feature / code size options ---------------------- */ /* ------------------------------------------------------------------------- */ -//#define HAVE_EEPROM_PAGED_ACCESS 0 -/* If HAVE_EEPROM_PAGED_ACCESS is defined to 1, page mode access to EEPROM is - * compiled in. Whether page mode or byte mode access is used by AVRDUDE - * depends on the target device. Page mode is only used if the device supports - * it, e.g. for the ATMega88, 168 etc. You can save quite a bit of memory by - * disabling page mode EEPROM access. Costs ~ 138 bytes. - */ -//#define HAVE_EEPROM_BYTE_ACCESS 0 -/* If HAVE_EEPROM_BYTE_ACCESS is defined to 1, byte mode access to EEPROM is - * compiled in. Byte mode is only used if the device (as identified by its - * signature) does not support page mode for EEPROM. It is required for - * accessing the EEPROM on the ATMega8. Costs ~54 bytes. - */ #define BOOTLOADER_CAN_EXIT 1 /* If this macro is defined to 1, the boot loader will exit shortly after the * programmer closes the connection to the device. Costs ~36 bytes. * Required for TINY85MODE */ -//#define HAVE_CHIP_ERASE 0 -/* If this macro is defined to 1, the boot loader implements the Chip Erase - * ISP command. Otherwise pages are erased on demand before they are written. - */ -//#define SIGNATURE_BYTES 0x1e, 0x93, 0x0b, 0 /* ATtiny85 */ -/* This macro defines the signature bytes returned by the emulated USBasp to - * the programmer software. They should match the actual device at least in - * memory size and features. If you don't define this, values for ATMega8, - * ATMega88, ATMega168 and ATMega328 are guessed correctly. - */ - -/* The following block guesses feature options so that the resulting code - * should fit into 2k bytes boot block with the given device and clock rate. - * Activate by passing "-DUSE_AUTOCONFIG=1" to the compiler. - * This requires gcc 3.4.6 for small enough code size! - */ -// #if USE_AUTOCONFIG -// # undef HAVE_EEPROM_PAGED_ACCESS -// # define HAVE_EEPROM_PAGED_ACCESS (USB_CFG_CLOCK_KHZ >= 16000) -// # undef HAVE_EEPROM_BYTE_ACCESS -// # define HAVE_EEPROM_BYTE_ACCESS 1 -// # undef BOOTLOADER_CAN_EXIT -// # define BOOTLOADER_CAN_EXIT 1 -// # undef SIGNATURE_BYTES -// #endif /* USE_AUTOCONFIG */ - -/* ------------------------------------------------------------------------- */ - -/* Example configuration: Port D bit 3 is connected to a jumper which ties - * this pin to GND if the boot loader is requested. Initialization allows - * several clock cycles for the input voltage to stabilize before - * bootLoaderCondition() samples the value. - * We use a function for bootLoaderInit() for convenience and a macro for - * bootLoaderCondition() for efficiency. - */ - -#define JUMPER_BIT 0 /* jumper is connected to this bit in port B, active low */ +/* ----------------------- Optional MCU Description ------------------------ */ /* tiny85 Architecture Specifics */ #ifndef __AVR_ATtiny85__ # error "uBoot is only designed for attiny85" #endif - #define TINY85MODE -// 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 - -#define RESET_VECTOR_OFFSET 0 -#define USBPLUS_VECTOR_OFFSET 2 - -//#if BOOTLOADER_CAN_EXIT == 0 -//# define BOOTLOADER_CAN_EXIT 1 -//#endif +/* ------------- Set up interrupt configuration (CPU specific) -------------- */ // setup interrupt for Pin Change for D+ #define USB_INTR_CFG PCMSK @@ -201,12 +141,27 @@ these macros are defined, the boot loader uses them. #define USB_INTR_PENDING_BIT PCIF #define USB_INTR_VECTOR PCINT0_vect - -// uncomment for chips with clkdiv8 enabled in fuses -//#define LOW_POWER_MODE 1 +// Microcontroller Vectortable entries in the flash +#define RESET_VECTOR_OFFSET 0 +#define USBPLUS_VECTOR_OFFSET 2 + + +// 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 -// set clock prescaler to a value before running user program -//#define SET_CLOCK_PRESCALER _BV(CLKPS0) /* divide by 2 for 8mhz */ + + +/* Example configuration: Port D bit 3 is connected to a jumper which ties + * this pin to GND if the boot loader is requested. Initialization allows + * several clock cycles for the input voltage to stabilize before + * bootLoaderCondition() samples the value. + * We use a function for bootLoaderInit() for convenience and a macro for + * bootLoaderCondition() for efficiency. + */ + +#define JUMPER_BIT 0 /* jumper is connected to this bit in port B, active low */ #ifdef BUILD_JUMPER_MODE @@ -241,28 +196,7 @@ these macros are defined, the boot loader uses them. #endif #endif -/* ----------------------- Optional MCU Description ------------------------ */ - -/* The following configurations have working defaults in usbdrv.h. You - * usually don't need to set them explicitly. Only if you want to run - * the driver on a device which is not yet supported or with a compiler - * which is not fully supported (such as IAR C) or if you use a different - * interrupt than INT0, you may have to define some of these. - */ -/* #define USB_INTR_CFG MCUCR */ -/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */ -/* #define USB_INTR_CFG_CLR 0 */ -/* #define USB_INTR_ENABLE GIMSK */ -/* #define USB_INTR_ENABLE_BIT INT0 */ -/* #define USB_INTR_PENDING GIFR */ -/* #define USB_INTR_PENDING_BIT INTF0 */ -/* #define USB_INTR_VECTOR INT0_vect */ - -// todo: change to pin 5 -//#define DEUXVIS_JUMPER_PIN 5 -//#define digitalRead(pin) ((PINB >> pin) & 0b00000001) -//#define bootLoaderStartCondition() (!digitalRead(DEUXVIS_JUMPER_PIN)) -//#define bootLoaderCondition() (1) +/* ------------------------------------------------------------------------- */ #ifndef __ASSEMBLER__ /* assembler cannot parse function definitions */ @@ -334,6 +268,8 @@ these macros are defined, the boot loader uses them. #endif /* __ASSEMBLER__ */ + + /* ------------------------------------------------------------------------- */ #endif /* __bootloader_h_included__ */ -- cgit v1.2.3 From cdd64a20189750fcdb5fbdadf131351907f6e712 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sat, 28 Dec 2013 12:13:59 +0100 Subject: firmware: we do not want function definition in a header file anyways --- firmware/bootloaderconfig.h | 6 ------ 1 file changed, 6 deletions(-) (limited to 'firmware') diff --git a/firmware/bootloaderconfig.h b/firmware/bootloaderconfig.h index 7ad4699..a3ae665 100644 --- a/firmware/bootloaderconfig.h +++ b/firmware/bootloaderconfig.h @@ -198,7 +198,6 @@ these macros are defined, the boot loader uses them. /* ------------------------------------------------------------------------- */ -#ifndef __ASSEMBLER__ /* assembler cannot parse function definitions */ /* * Define bootloader timeout value. @@ -265,11 +264,6 @@ these macros are defined, the boot loader uses them. #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);} -#endif /* __ASSEMBLER__ */ - - - - /* ------------------------------------------------------------------------- */ #endif /* __bootloader_h_included__ */ -- cgit v1.2.3 From 713142dceff2f12ebbb62f2196d8aed348504299 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sat, 28 Dec 2013 12:26:53 +0100 Subject: firmware: move increment idlePolls to main again --- firmware/bootloaderconfig.h | 6 ++---- firmware/main.c | 3 ++- 2 files changed, 4 insertions(+), 5 deletions(-) (limited to 'firmware') diff --git a/firmware/bootloaderconfig.h b/firmware/bootloaderconfig.h index a3ae665..479d268 100644 --- a/firmware/bootloaderconfig.h +++ b/firmware/bootloaderconfig.h @@ -141,18 +141,16 @@ 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 +// Microcontroller vectortable entries in the flash #define RESET_VECTOR_OFFSET 0 #define USBPLUS_VECTOR_OFFSET 2 - // 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 - /* Example configuration: Port D bit 3 is connected to a jumper which ties * this pin to GND if the boot loader is requested. Initialization allows * several clock cycles for the input voltage to stabilize before @@ -185,7 +183,7 @@ these macros are defined, the boot loader uses them. #else #define bootLoaderInit() #define bootLoaderExit() - #define bootLoaderCondition() (++idlePolls < (AUTO_EXIT_MS * 10UL)) + #define bootLoaderCondition() (idlePolls < (AUTO_EXIT_MS * 10UL)) #if LOW_POWER_MODE // only starts bootloader if USB D- is pulled high on startup - by putting your pullup in to an external connector // you can avoid ever entering an out of spec clock speed or waiting on bootloader when that pullup isn't there diff --git a/firmware/main.c b/firmware/main.c index 83c5538..0723c3e 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -326,7 +326,8 @@ int main(void) { #if LED_PRESENT LED_MACRO( ((uint8_t*)&idlePolls)[1] ) #endif - + + idlePolls++; // Try to execute program if bootloader exit condition is met if (!bootLoaderCondition()) fireEvent(EVENT_EXECUTE); -- cgit v1.2.3 From 1a38f02b1117442b137a4a210ed250ab8fd3de21 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sat, 28 Dec 2013 12:46:06 +0100 Subject: firmware: clean up LED code --- firmware/bootloaderconfig.h | 14 +++++++--- firmware/main.c | 63 +++++++++++++++++++++------------------------ 2 files changed, 39 insertions(+), 38 deletions(-) (limited to 'firmware') diff --git a/firmware/bootloaderconfig.h b/firmware/bootloaderconfig.h index 479d268..a5b1f7d 100644 --- a/firmware/bootloaderconfig.h +++ b/firmware/bootloaderconfig.h @@ -208,6 +208,7 @@ these macros are defined, the boot loader uses them. * (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 */ @@ -258,10 +259,15 @@ these macros are defined, the boot loader uses them. #define LED_PORT PORTB #define LED_PIN PB1 -#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);} - +#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 /* ------------------------------------------------------------------------- */ #endif /* __bootloader_h_included__ */ diff --git a/firmware/main.c b/firmware/main.c index 0723c3e..88753a8 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -300,40 +300,37 @@ int main(void) { #if AUTO_EXIT_NO_USB_MS ((uint8_t*)&idlePolls)[1]=((AUTO_EXIT_MS-AUTO_EXIT_NO_USB_MS) * 10UL)>>8; // write only high byte to save 6 bytes #endif - - if (bootLoaderStartCondition()) { +// if (bootLoaderStartCondition()||(pgm_read_byte(BOOTLOADER_ADDRESS - TINYVECTOR_RESET_OFFSET + 1)==0xff)) { + if (bootLoaderStartCondition()) { + + initHardware(); + LED_INIT(); - initHardware(); - -# if LED_PRESENT - LED_INIT(); -# endif - do { - clearEvents(); - usbPoll(); - _delay_us(100); - - // these next two freeze the chip for ~ 4.5ms, breaking usb protocol - // and usually both of these will activate in the same loop, so host - // needs to wait > 9ms before next usb request - if (isEvent(EVENT_ERASE_APPLICATION)) eraseApplication(); - if (isEvent(EVENT_WRITE_PAGE)) { - _delay_us(2000); // Wait for USB traffic to finish before halting CPU with write- - writeFlashPage(); - } - - #if LED_PRESENT - LED_MACRO( ((uint8_t*)&idlePolls)[1] ) - #endif + do { + clearEvents(); + usbPoll(); - idlePolls++; - // Try to execute program if bootloader exit condition is met - if (!bootLoaderCondition()) fireEvent(EVENT_EXECUTE); - - /* main event loop runs as long as no problem is uploaded or existing program is not executed */ - } while((!isEvent(EVENT_EXECUTE))||(pgm_read_byte(BOOTLOADER_ADDRESS - TINYVECTOR_RESET_OFFSET + 1)==0xff)); - } + _delay_us(100); + + // these next two freeze the chip for ~ 4.5ms, breaking usb protocol + // and usually both of these will activate in the same loop, so host + // needs to wait > 9ms before next usb request + if (isEvent(EVENT_ERASE_APPLICATION)) eraseApplication(); + if (isEvent(EVENT_WRITE_PAGE)) { + _delay_us(2000); // Wait for USB traffic to finish before halting CPU with write- + writeFlashPage(); + } + + LED_MACRO( ((uint8_t*)&idlePolls)[1] ) + + idlePolls++; + // Try to execute program if bootloader exit condition is met + if (AUTO_EXIT_MS&&(idlePolls>AUTO_EXIT_MS*10)) fireEvent(EVENT_EXECUTE); + + /* main event loop runs as long as no problem is uploaded or existing program is not executed */ + } while((!isEvent(EVENT_EXECUTE))||(pgm_read_byte(BOOTLOADER_ADDRESS - TINYVECTOR_RESET_OFFSET + 1)==0xff)); + } // set clock prescaler to desired clock speed (changing from clkdiv8, or no division, depending on fuses) #if LOW_POWER_MODE @@ -346,9 +343,7 @@ int main(void) { #endif #endif - #if LED_PRESENT - LED_EXIT(); - #endif + LED_EXIT(); #if OSCCAL_RESTORE OSCCAL=osccal_default; -- cgit v1.2.3 From c3de9534f78ff338031516e17f94c44480f25fed Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sat, 28 Dec 2013 13:54:18 +0100 Subject: firmware: clean up entrymode --- firmware/bootloaderconfig.h | 158 +++++++++++++++++++++++--------------------- firmware/main.c | 7 +- 2 files changed, 85 insertions(+), 80 deletions(-) (limited to 'firmware') diff --git a/firmware/bootloaderconfig.h b/firmware/bootloaderconfig.h index a5b1f7d..2425e3d 100644 --- a/firmware/bootloaderconfig.h +++ b/firmware/bootloaderconfig.h @@ -12,13 +12,6 @@ #ifndef __bootloaderconfig_h_included__ #define __bootloaderconfig_h_included__ -// uncomment this to enable the 'jumper from d5 to gnd to enable programming' mode -//#define BUILD_JUMPER_MODE 1 - -#ifndef BOOTLOADER_ADDRESS -#define BOOTLOADER_ADDRESS 0 -#endif - /* General Description: This file (together with some settings in Makefile) configures the boot loader @@ -51,46 +44,46 @@ these macros are defined, the boot loader uses them. #define HARDWARE_CONFIG TINY85_HARDWARE_CONFIG_2 #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. - */ + /* 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! - */ + # 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 + #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 +#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 +#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. */ - #endif +#endif #define USB_CFG_CLOCK_KHZ (F_CPU/1000) -/* Clock rate of the AVR in MHz. Legal values are 12000, 16000 or 16500. +/* 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! @@ -114,12 +107,6 @@ these macros are defined, the boot loader uses them. /* ------------------------------------------------------------------------- */ /* ---------------------- feature / code size options ---------------------- */ /* ------------------------------------------------------------------------- */ - -#define BOOTLOADER_CAN_EXIT 1 -/* If this macro is defined to 1, the boot loader will exit shortly after the - * programmer closes the connection to the device. Costs ~36 bytes. - * Required for TINY85MODE - */ /* ----------------------- Optional MCU Description ------------------------ */ @@ -150,53 +137,72 @@ these macros are defined, the boot loader uses them. #define TINYVECTOR_USBPLUS_OFFSET 2 #define TINYVECTOR_OSCCAL_OFFSET 6 +/* ------------------------------------------------------------------------- */ -/* Example configuration: Port D bit 3 is connected to a jumper which ties - * this pin to GND if the boot loader is requested. Initialization allows - * several clock cycles for the input voltage to stabilize before - * bootLoaderCondition() samples the value. - * We use a function for bootLoaderInit() for convenience and a macro for - * bootLoaderCondition() for efficiency. +/* + * Define Bootloader entry condition + * + * If the entry condition is not met, the bootloader will not be activated and the userprogram + * is executed directly after a reset. If no userprogram has been loaded, the bootloader + * is always active. + * + * ENTRY_ALWAYS Always activate the bootloader after reset. Required 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 issues by + * pulling the reset pin low. It may be necessary to add an external + * resistor to the reset pin in case the bootloader is also entered + * after power up. + * 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 JUMPER_BIT 0 /* jumper is connected to this bit in port B, active low */ +#define ENTRYMODE ENTRY_EXT_RESET +#define JUMPER_PIN PB0 +#define JUMPER_PORT PORTB +#define JUMPER_DDR DDRB +#define JUMPER_INP PINB + +#define ENTRY_ALWAYS 1 +#define ENTRY_WATCHDOG 2 +#define ENTRY_EXT_RESET 3 +#define ENTRY_JUMPER 4 -#ifdef BUILD_JUMPER_MODE - #define START_JUMPER_PIN 5 - #define digitalRead(pin) (PINB & _BV(pin)) - #define bootLoaderStartCondition() (!digitalRead(START_JUMPER_PIN)) - #define bootLoaderCondition() 1 - - #ifndef __ASSEMBLER__ /* assembler cannot parse function definitions */ - static inline void bootLoaderInit(void) { - // DeuxVis pin-5 pullup - PORTB |= _BV(START_JUMPER_PIN); // has pullup enabled - _delay_ms(10); - } - static inline void bootLoaderExit(void) { - // DeuxVis pin-5 pullup - PORTB = 0; - } - #endif /* __ASSEMBLER__ */ - -#else +#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 bootLoaderCondition() (idlePolls < (AUTO_EXIT_MS * 10UL)) - #if LOW_POWER_MODE - // only starts bootloader if USB D- is pulled high on startup - by putting your pullup in to an external connector - // you can avoid ever entering an out of spec clock speed or waiting on bootloader when that pullup isn't there - #define bootLoaderStartCondition() \ - (PINB & (_BV(USB_CFG_DMINUS_BIT) | _BV(USB_CFG_DMINUS_BIT))) == _BV(USB_CFG_DMINUS_BIT) - #else - #define bootLoaderStartCondition() 1 - #endif + #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. * diff --git a/firmware/main.c b/firmware/main.c index 88753a8..0ab0682 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -301,8 +301,7 @@ int main(void) { ((uint8_t*)&idlePolls)[1]=((AUTO_EXIT_MS-AUTO_EXIT_NO_USB_MS) * 10UL)>>8; // write only high byte to save 6 bytes #endif -// if (bootLoaderStartCondition()||(pgm_read_byte(BOOTLOADER_ADDRESS - TINYVECTOR_RESET_OFFSET + 1)==0xff)) { - if (bootLoaderStartCondition()) { + if (bootLoaderStartCondition()||(pgm_read_byte(BOOTLOADER_ADDRESS - TINYVECTOR_RESET_OFFSET + 1)==0xff)) { initHardware(); LED_INIT(); @@ -322,9 +321,9 @@ int main(void) { writeFlashPage(); } - LED_MACRO( ((uint8_t*)&idlePolls)[1] ) - + LED_MACRO( ((uint8_t*)&idlePolls)[1] ); idlePolls++; + // Try to execute program if bootloader exit condition is met if (AUTO_EXIT_MS&&(idlePolls>AUTO_EXIT_MS*10)) fireEvent(EVENT_EXECUTE); -- cgit v1.2.3 From 2e10478426a6f0d04099bdb24fc17102a6abde1b Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sat, 28 Dec 2013 13:56:39 +0100 Subject: firmware: default is entry_always, kill warning --- firmware/bootloaderconfig.h | 2 +- firmware/main.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'firmware') diff --git a/firmware/bootloaderconfig.h b/firmware/bootloaderconfig.h index 2425e3d..392b48b 100644 --- a/firmware/bootloaderconfig.h +++ b/firmware/bootloaderconfig.h @@ -170,7 +170,7 @@ these macros are defined, the boot loader uses them. * */ -#define ENTRYMODE ENTRY_EXT_RESET +#define ENTRYMODE ENTRY_ALWAYS #define JUMPER_PIN PB0 #define JUMPER_PORT PORTB diff --git a/firmware/main.c b/firmware/main.c index 0ab0682..bafb121 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -325,7 +325,7 @@ int main(void) { idlePolls++; // Try to execute program if bootloader exit condition is met - if (AUTO_EXIT_MS&&(idlePolls>AUTO_EXIT_MS*10)) fireEvent(EVENT_EXECUTE); + if (AUTO_EXIT_MS&&(idlePolls>AUTO_EXIT_MS*10L)) fireEvent(EVENT_EXECUTE); /* main event loop runs as long as no problem is uploaded or existing program is not executed */ } while((!isEvent(EVENT_EXECUTE))||(pgm_read_byte(BOOTLOADER_ADDRESS - TINYVECTOR_RESET_OFFSET + 1)==0xff)); -- cgit v1.2.3 From 26b1c45b1145f9b96c4ec90e93a61a3da63e2473 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sat, 28 Dec 2013 14:09:54 +0100 Subject: firmware: removed low power code - was dysfunctional --- firmware/main.c | 40 +++++++++------------------------------- 1 file changed, 9 insertions(+), 31 deletions(-) (limited to 'firmware') diff --git a/firmware/main.c b/firmware/main.c index bafb121..48ac399 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -237,22 +237,15 @@ void PushMagicWord (void) { static void initHardware (void) { - MCUSR=0; /* need this to properly disable watchdog */ - wdt_disable(); - - #if LOW_POWER_MODE - // turn off clock prescalling - chip must run at full speed for usb - // if you might run chip at lower voltages, detect that in bootLoaderStartCondition - CLKPR = 1 << CLKPCE; - CLKPR = 0; - #endif + MCUSR=0; /* need this to properly disable watchdog */ + wdt_disable(); - - usbDeviceDisconnect(); /* do this while interrupts are disabled */ - _delay_ms(500); - usbDeviceConnect(); - usbInit(); // Initialize INT settings after reconnect - sei(); + usbDeviceDisconnect(); /* do this while interrupts are disabled */ + _delay_ms(500); + usbDeviceConnect(); + usbInit(); // Initialize INT settings after reconnect + + sei(); } /* ------------------------------------------------------------------------ */ @@ -290,11 +283,7 @@ int main(void) { #if OSCCAL_RESTORE osccal_default = OSCCAL; #endif - - #if (!SET_CLOCK_PRESCALER) && LOW_POWER_MODE - uint8_t prescaler_default = CLKPR; - #endif - + bootLoaderInit(); #if AUTO_EXIT_NO_USB_MS @@ -331,17 +320,6 @@ int main(void) { } while((!isEvent(EVENT_EXECUTE))||(pgm_read_byte(BOOTLOADER_ADDRESS - TINYVECTOR_RESET_OFFSET + 1)==0xff)); } - // set clock prescaler to desired clock speed (changing from clkdiv8, or no division, depending on fuses) - #if LOW_POWER_MODE - #ifdef SET_CLOCK_PRESCALER - CLKPR = 1 << CLKPCE; - CLKPR = SET_CLOCK_PRESCALER; - #else - CLKPR = 1 << CLKPCE; - CLKPR = prescaler_default; - #endif - #endif - LED_EXIT(); #if OSCCAL_RESTORE -- cgit v1.2.3 From fefbff026f6ab8e3b5bc7d7a317a86c901057124 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sat, 28 Dec 2013 14:44:31 +0100 Subject: firmware: fix tabs --- firmware/main.c | 246 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 122 insertions(+), 124 deletions(-) (limited to 'firmware') diff --git a/firmware/main.c b/firmware/main.c index 48ac399..bec0305 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -70,7 +70,7 @@ static uint16_t vectorTemp[2]; // remember data to create tinyVector table befor static uint16_t currentAddress; // current progmem address, used for erasing and writing #if OSCCAL_RESTORE - static uint8_t osccal_default; // due to compiler insanity, having this as global actually saves memory + static uint8_t osccal_default; // due to compiler insanity, having this as global actually saves memory #endif /* ------------------------------------------------------------------------ */ @@ -86,142 +86,140 @@ static inline void leaveBootloader(void); // - vectors in now, and write in the application stuff around them later. // - if vectors weren't written back in immediately, usb would fail. 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) { - ptr -= SPM_PAGESIZE; - boot_page_erase(ptr); - } + // 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) { + ptr -= SPM_PAGESIZE; + boot_page_erase(ptr); + } currentAddress = 0; - for (i=0; i<8; i++) writeWordToPageBuffer(0xFFFF); // Write first 8 words to fill in vectors. - writeFlashPage(); // enables interrupts + for (i=0; i<8; i++) writeWordToPageBuffer(0xFFFF); // Write first 8 words to fill in vectors. + writeFlashPage(); // enables interrupts } // simply write currently stored page in to already erased flash memory static void writeFlashPage(void) { - cli(); - boot_page_write(currentAddress - 2); // will halt CPU, no waiting required - sei(); + cli(); + boot_page_write(currentAddress - 2); // will halt CPU, no waiting required + sei(); } // 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))) \ - ); \ + __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 static void writeWordToPageBuffer(uint16_t data) { - uint8_t previous_sreg; + 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 == RESET_VECTOR_OFFSET * 2) { + vectorTemp[0] = data; + data = 0xC000 + (BOOTLOADER_ADDRESS/2) - 1; + } + + if (currentAddress == USBPLUS_VECTOR_OFFSET * 2) { + vectorTemp[1] = data; + data = 0xC000 + (BOOTLOADER_ADDRESS/2) - 1; + } - // first two interrupt vectors get replaced with a jump to the bootloader's vector table - // remember vectors or the tinyvector table - if (currentAddress == RESET_VECTOR_OFFSET * 2) { - vectorTemp[0] = data; - data = 0xC000 + (BOOTLOADER_ADDRESS/2) - 1; - } - - if (currentAddress == 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 == BOOTLOADER_ADDRESS - TINYVECTOR_RESET_OFFSET) { - data = vectorTemp[0] + ((FLASHEND + 1) - BOOTLOADER_ADDRESS)/2 + 2 + RESET_VECTOR_OFFSET; - } else if (currentAddress == BOOTLOADER_ADDRESS - TINYVECTOR_USBPLUS_OFFSET) { - data = vectorTemp[1] + ((FLASHEND + 1) - BOOTLOADER_ADDRESS)/2 + 1 + USBPLUS_VECTOR_OFFSET; + // 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 == BOOTLOADER_ADDRESS - TINYVECTOR_RESET_OFFSET) { + data = vectorTemp[0] + ((FLASHEND + 1) - BOOTLOADER_ADDRESS)/2 + 2 + RESET_VECTOR_OFFSET; + } else if (currentAddress == 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 == BOOTLOADER_ADDRESS - TINYVECTOR_OSCCAL_OFFSET) { - data = OSCCAL; + } else if (currentAddress == BOOTLOADER_ADDRESS - TINYVECTOR_OSCCAL_OFFSET) { + data = OSCCAL; #endif - } + } - previous_sreg=SREG; - cli(); // ensure interrupts are disabled - - boot_page_fill(currentAddress, data); - - // increment progmem address by one word - currentAddress += 2; - SREG=previous_sreg; + previous_sreg=SREG; + cli(); // ensure interrupts are disabled + + boot_page_fill(currentAddress, data); + + // increment progmem address by one word + currentAddress += 2; + SREG=previous_sreg; } /* ------------------------------------------------------------------------ */ static uint8_t usbFunctionSetup(uint8_t data[8]) { - usbRequest_t *rq = (void *)data; - ((uint8_t*)&idlePolls)[1] = 0; // reset idle polls when we get usb traffic - - static uint8_t replyBuffer[4] = { - (((uint16_t)PROGMEM_SIZE) >> 8) & 0xff, - ((uint16_t)PROGMEM_SIZE) & 0xff, - SPM_PAGESIZE, - MICRONUCLEUS_WRITE_SLEEP - }; + usbRequest_t *rq = (void *)data; + ((uint8_t*)&idlePolls)[1] = 0; // reset idle polls when we get usb traffic + + static uint8_t replyBuffer[4] = { + (((uint16_t)PROGMEM_SIZE) >> 8) & 0xff, + ((uint16_t)PROGMEM_SIZE) & 0xff, + SPM_PAGESIZE, + MICRONUCLEUS_WRITE_SLEEP + }; - if (rq->bRequest == 0) { // get device info - usbMsgPtr = replyBuffer; - return 4; - - } else if (rq->bRequest == 1) { // write 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 = rq->wIndex.word; - return USB_NO_MSG; // hands off work to usbFunctionWrite - - } else if (rq->bRequest == 2) { // erase application - fireEvent(EVENT_ERASE_APPLICATION); - - } else { // exit bootloader -# if BOOTLOADER_CAN_EXIT - fireEvent(EVENT_EXECUTE); -# endif - } + if (rq->bRequest == 0) { // get device info + usbMsgPtr = replyBuffer; + return 4; + } else if (rq->bRequest == 1) { // write 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 = rq->wIndex.word; + return USB_NO_MSG; // hands off work to usbFunctionWrite - return 0; + } else if (rq->bRequest == 2) { // erase application + fireEvent(EVENT_ERASE_APPLICATION); + + } else { // exit bootloader + fireEvent(EVENT_EXECUTE); + } + + return 0; } // 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 >= BOOTLOADER_ADDRESS) break; - - writeWordToPageBuffer(*(uint16_t *) data); - data += 2; // advance data pointer - length -= 2; - } while(length); + do { + // make sure we don't write over the bootloader! + if (currentAddress >= BOOTLOADER_ADDRESS) break; - // if we have now reached another page boundary, we're done + writeWordToPageBuffer(*(uint16_t *) data); + data += 2; // advance data pointer + length -= 2; + } while(length); + + // if we have now reached another page boundary, we're done #if SPM_PAGESIZE<256 // Hack to reduce code size - uint8_t isLast = ((((uint8_t)currentAddress) % SPM_PAGESIZE) == 0); + uint8_t isLast = ((((uint8_t)currentAddress) % SPM_PAGESIZE) == 0); #else - uint8_t isLast = ((currentAddress % SPM_PAGESIZE) == 0); + uint8_t isLast = ((currentAddress % SPM_PAGESIZE) == 0); #endif - // definitely need this if! seems usbFunctionWrite gets called again in future usbPoll's in the runloop! - if (isLast) fireEvent(EVENT_WRITE_PAGE); // ask runloop to write our page - - return isLast; // let vusb know we're done with this request + // definitely need this if! seems usbFunctionWrite gets called again in future usbPoll's in the runloop! + if (isLast) fireEvent(EVENT_WRITE_PAGE); // ask runloop to write our page + + return isLast; // let vusb know we're done with this request } /* ------------------------------------------------------------------------ */ @@ -229,10 +227,10 @@ void PushMagicWord (void) __attribute__ ((naked)) __attribute__ ((section (".ini // 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"::); + asm volatile("ldi r16, 0xB0"::); + asm volatile("push r16"::); + asm volatile("ldi r16, 0x07"::); + asm volatile("push r16"::); } static void initHardware (void) @@ -252,29 +250,29 @@ static void initHardware (void) // reset system to a normal state and launch user program static void leaveBootloader(void) __attribute__((__noreturn__)); static inline void leaveBootloader(void) { - _delay_ms(10); // removing delay causes USB errors - - bootLoaderExit(); - cli(); + _delay_ms(10); // removing delay causes USB errors + + 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 + 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) && 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(); - } + // 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 - // jump to application reset vector at end of flash - asm volatile ("rjmp __vectors - 4"); + // jump to application reset vector at end of flash + asm volatile ("rjmp __vectors - 4"); } int main(void) { -- cgit v1.2.3 From 0712bc8b3fe71e923e37067242fe43978f6d7db9 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sat, 28 Dec 2013 15:05:19 +0100 Subject: firmware: More robut WDT handling backported optimization by @gblargg --- firmware/main.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) (limited to 'firmware') diff --git a/firmware/main.c b/firmware/main.c index bec0305..4ceb19e 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -113,10 +113,10 @@ static void writeFlashPage(void) { } // clear memory which stores data to be written by next writeFlashPage call -#define __boot_page_fill_clear() \ -(__extension__({ \ - __asm__ __volatile__ \ - ( \ +#define __boot_page_fill_clear() \ +(__extension__({ \ + __asm__ __volatile__ \ + ( \ "sts %0, %1\n\t" \ "spm\n\t" \ : \ @@ -235,9 +235,11 @@ void PushMagicWord (void) { static void initHardware (void) { - MCUSR=0; /* need this to properly disable watchdog */ - wdt_disable(); - + // Disable watchdog and set timeout to maximum in case the WDT is fused on + MCUSR=0; + WDTCR = 1< Date: Sat, 28 Dec 2013 15:11:39 +0100 Subject: firmware: CRC checking of all received data backport of optimizations by @gblargg --- firmware/usbconfig.h | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'firmware') diff --git a/firmware/usbconfig.h b/firmware/usbconfig.h index 560c34d..8ccee36 100644 --- a/firmware/usbconfig.h +++ b/firmware/usbconfig.h @@ -110,6 +110,12 @@ * for long transfers increases the driver size. */ /* #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 -- cgit v1.2.3 From 92c012796d2235e264f6cb3f3082e4a86dd74f59 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sat, 28 Dec 2013 23:06:40 +0100 Subject: firmware: fixed description --- firmware/bootloaderconfig.h | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'firmware') diff --git a/firmware/bootloaderconfig.h b/firmware/bootloaderconfig.h index 392b48b..137fb9b 100644 --- a/firmware/bootloaderconfig.h +++ b/firmware/bootloaderconfig.h @@ -146,17 +146,17 @@ these macros are defined, the boot loader uses them. * is executed directly after a reset. If no userprogram has been loaded, the bootloader * is always active. * - * ENTRY_ALWAYS Always activate the bootloader after reset. Required the least + * 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 issues by + * 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 - * resistor to the reset pin in case the bootloader is also entered - * after power up. + * 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 @@ -206,12 +206,13 @@ these macros are defined, the boot loader uses them. /* * Define bootloader timeout value. * - * These will only be used if is bootLoaderCondition() evaluates idlePolls below! + * 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 -- cgit v1.2.3 From e7d1d1347cd6c220af783972a064d782047e2c56 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sat, 28 Dec 2013 23:24:23 +0100 Subject: firmware: code clean up, consolidated wait loops to save 4 bytes --- firmware/bootloaderconfig.h | 4 +-- firmware/main.c | 65 +++++++++++++++++++++------------------------ 2 files changed, 32 insertions(+), 37 deletions(-) (limited to 'firmware') diff --git a/firmware/bootloaderconfig.h b/firmware/bootloaderconfig.h index 137fb9b..e6c44da 100644 --- a/firmware/bootloaderconfig.h +++ b/firmware/bootloaderconfig.h @@ -142,8 +142,8 @@ these macros are defined, the boot loader uses them. /* * Define Bootloader entry condition * - * If the entry condition is not met, the bootloader will not be activated and the userprogram - * is executed directly after a reset. If no userprogram has been loaded, the bootloader + * 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 diff --git a/firmware/main.c b/firmware/main.c index 4ceb19e..8394e7e 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -239,7 +239,12 @@ static void initHardware (void) MCUSR=0; WDTCR = 1< 9ms before next usb request - if (isEvent(EVENT_ERASE_APPLICATION)) eraseApplication(); - if (isEvent(EVENT_WRITE_PAGE)) { - _delay_us(2000); // Wait for USB traffic to finish before halting CPU with write- - writeFlashPage(); - } - - LED_MACRO( ((uint8_t*)&idlePolls)[1] ); + idlePolls++; // Try to execute program if bootloader exit condition is met if (AUTO_EXIT_MS&&(idlePolls>AUTO_EXIT_MS*10L)) fireEvent(EVENT_EXECUTE); + LED_MACRO( ((uint8_t*)&idlePolls)[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 (events) _delay_ms(2); + if (isEvent(EVENT_ERASE_APPLICATION)) eraseApplication(); + if (isEvent(EVENT_WRITE_PAGE)) writeFlashPage(); + /* main event loop runs as long as no problem is uploaded or existing program is not executed */ } while((!isEvent(EVENT_EXECUTE))||(pgm_read_byte(BOOTLOADER_ADDRESS - TINYVECTOR_RESET_OFFSET + 1)==0xff)); + + LED_EXIT(); } - LED_EXIT(); - - #if OSCCAL_RESTORE - OSCCAL=osccal_default; - nop(); // NOP to avoid CPU hickup during oscillator stabilization - #endif - leaveBootloader(); } /* ------------------------------------------------------------------------ */ -- cgit v1.2.3 From 67039d6a1334e65db2e7dd4d5e97a81474d0ee71 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sun, 29 Dec 2013 18:48:45 +0100 Subject: fireware: Bugfix: no slowndown after timer overflow --- firmware/main.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'firmware') diff --git a/firmware/main.c b/firmware/main.c index 8394e7e..4673384 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -304,17 +304,18 @@ int main(void) { clearEvents(); usbPoll(); - + idlePolls++; // Try to execute program if bootloader exit condition is met - if (AUTO_EXIT_MS&&(idlePolls>AUTO_EXIT_MS*10L)) fireEvent(EVENT_EXECUTE); + if (AUTO_EXIT_MS&&(idlePolls==AUTO_EXIT_MS*10L)) fireEvent(EVENT_EXECUTE); + LED_MACRO( ((uint8_t*)&idlePolls)[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 (events) _delay_ms(2); - + if (isEvent(EVENT_ERASE_APPLICATION)) eraseApplication(); if (isEvent(EVENT_WRITE_PAGE)) writeFlashPage(); -- cgit v1.2.3 From af4391ccca909aa788424d50c1cb3469c3f146ed Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sun, 29 Dec 2013 19:47:55 +0100 Subject: firmware: Replace flag system with single command system to save 12 bytes --- firmware/main.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) (limited to 'firmware') diff --git a/firmware/main.c b/firmware/main.c index 4673384..89e038d 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -1,5 +1,5 @@ /* Name: main.c - * Project: Micronucleus + * Project: Micronucleus * Author: Jenna Fox * Creation Date: 2007-12-08 * Tabsize: 4 @@ -12,7 +12,7 @@ */ #define MICRONUCLEUS_VERSION_MAJOR 1 -#define MICRONUCLEUS_VERSION_MINOR 10 +#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 @@ -48,8 +48,16 @@ // events system schedules functions to run in the main loop // static uint8_t events = 0; // bitmap of events to run -register uint8_t events asm( "r3" ); // register saves many bytes +register uint8_t command asm( "r3" ); // register saves many bytes +enum { + cmd_nop=0, + cmd_erase_application, + cmd_write_page, + cmd_exit +}; + +/* #define EVENT_ERASE_APPLICATION 1 #define EVENT_WRITE_PAGE 2 #define EVENT_EXECUTE 4 @@ -58,7 +66,7 @@ register uint8_t events asm( "r3" ); // register saves many bytes #define fireEvent(event) events |= (event) #define isEvent(event) (events & (event)) #define clearEvents() events = 0 - +*/ // 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") @@ -188,10 +196,10 @@ static uint8_t usbFunctionSetup(uint8_t data[8]) { return USB_NO_MSG; // hands off work to usbFunctionWrite } else if (rq->bRequest == 2) { // erase application - fireEvent(EVENT_ERASE_APPLICATION); + command=cmd_erase_application; } else { // exit bootloader - fireEvent(EVENT_EXECUTE); + command=cmd_exit; } return 0; @@ -217,7 +225,7 @@ static uint8_t usbFunctionWrite(uint8_t *data, uint8_t length) { #endif // definitely need this if! seems usbFunctionWrite gets called again in future usbPoll's in the runloop! - if (isLast) fireEvent(EVENT_WRITE_PAGE); // ask runloop to write our page + if (isLast) command=cmd_write_page; // ask runloop to write our page return isLast; // let vusb know we're done with this request } @@ -302,25 +310,25 @@ int main(void) { _delay_us(100); wdt_reset(); // Only necessary if WDT is fused on - clearEvents(); + command=cmd_nop; usbPoll(); idlePolls++; // Try to execute program if bootloader exit condition is met - if (AUTO_EXIT_MS&&(idlePolls==AUTO_EXIT_MS*10L)) fireEvent(EVENT_EXECUTE); + if (AUTO_EXIT_MS&&(idlePolls==AUTO_EXIT_MS*10L)) command=cmd_exit; LED_MACRO( ((uint8_t*)&idlePolls)[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 (events) _delay_ms(2); + if (command!=cmd_nop) _delay_ms(2); - if (isEvent(EVENT_ERASE_APPLICATION)) eraseApplication(); - if (isEvent(EVENT_WRITE_PAGE)) writeFlashPage(); + if (command==cmd_erase_application) eraseApplication(); + if (command==cmd_write_page) writeFlashPage(); /* main event loop runs as long as no problem is uploaded or existing program is not executed */ - } while((!isEvent(EVENT_EXECUTE))||(pgm_read_byte(BOOTLOADER_ADDRESS - TINYVECTOR_RESET_OFFSET + 1)==0xff)); + } while((command!=cmd_exit)||(pgm_read_byte(BOOTLOADER_ADDRESS - TINYVECTOR_RESET_OFFSET + 1)==0xff)); LED_EXIT(); } -- cgit v1.2.3 From b97b7ecb1633750dafc7cc60d834b510961d6cb1 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sun, 29 Dec 2013 19:48:32 +0100 Subject: firmware: Check is irrelevant - idlecount is not changed during erase --- firmware/main.c | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) (limited to 'firmware') diff --git a/firmware/main.c b/firmware/main.c index 89e038d..78f839a 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -39,15 +39,7 @@ # error "BOOTLOADER_ADDRESS in makefile must be a multiple of chip's pagesize" #endif -#ifdef AUTO_EXIT_MS -# if AUTO_EXIT_MS < (MICRONUCLEUS_WRITE_SLEEP * (BOOTLOADER_ADDRESS / SPM_PAGESIZE)) -# warning "AUTO_EXIT_MS is shorter than the time it takes to perform erase function - might affect reliability?" -# warning "Try increasing AUTO_EXIT_MS if you have stability problems" -# endif -#endif - -// events system schedules functions to run in the main loop -// static uint8_t events = 0; // bitmap of events to run +// command system schedules functions to run in the main loop register uint8_t command asm( "r3" ); // register saves many bytes enum { @@ -57,16 +49,6 @@ enum { cmd_exit }; -/* -#define EVENT_ERASE_APPLICATION 1 -#define EVENT_WRITE_PAGE 2 -#define EVENT_EXECUTE 4 - -// controls state of events -#define fireEvent(event) events |= (event) -#define isEvent(event) (events & (event)) -#define clearEvents() events = 0 -*/ // 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") -- cgit v1.2.3 From b024f8aa4d9247dfaebe41f9f7b8716a2b31df68 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sun, 29 Dec 2013 20:37:22 +0100 Subject: firmware: clean up, updated file header --- firmware/main.c | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) (limited to 'firmware') diff --git a/firmware/main.c b/firmware/main.c index 78f839a..828ea8f 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -1,14 +1,13 @@ -/* Name: main.c - * Project: Micronucleus - * Author: Jenna Fox - * Creation Date: 2007-12-08 - * Tabsize: 4 - * Copyright: (c) 2012 Jenna Fox - * All changes past revision 1.06 authored by http://github.com/cpldcpu - * Portions Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH (USBaspLoader) - * Portions Copyright: (c) 2012 Louis Beaudoin (USBaspLoader-tiny85) - * License: GNU GPL v2 (see License.txt) +/* + * Project: Micronucleus - v1.11 + * + * Author (c) 2012 Jenna Fox + * Optimizations after v1.06 (c) 2013 Tim Bo"scke - cpldcpu@gmail.com + * Further input (c) 2013 Shay Green + * Based on USBaspLoader-tiny85 (c) 2012 Louis Beaudoin + * Based on USBaspLoader (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH * + * License: GNU GPL v2 (see License.txt) */ #define MICRONUCLEUS_VERSION_MAJOR 1 @@ -28,12 +27,6 @@ #include "bootloaderconfig.h" #include "usbdrv/usbdrv.c" -/* ------------------------------------------------------------------------ */ -// postscript are the few bytes at the end of programmable memory which store tinyVectors -// and used to in USBaspLoader-tiny85 store the checksum iirc -#define POSTSCRIPT_SIZE 6 -#define PROGMEM_SIZE (BOOTLOADER_ADDRESS - POSTSCRIPT_SIZE) /* max size of user program */ - // 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" -- cgit v1.2.3 From 7f1acb2ebd7cb8c309680af437ea8bb1ca48e4d8 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sun, 29 Dec 2013 20:53:45 +0100 Subject: firmware: switch saves 2 bytes --- firmware/bootloaderconfig.h | 7 ++++++- firmware/main.c | 8 +++++--- 2 files changed, 11 insertions(+), 4 deletions(-) (limited to 'firmware') diff --git a/firmware/bootloaderconfig.h b/firmware/bootloaderconfig.h index e6c44da..57f15f2 100644 --- a/firmware/bootloaderconfig.h +++ b/firmware/bootloaderconfig.h @@ -137,6 +137,11 @@ these macros are defined, the boot loader uses them. #define TINYVECTOR_USBPLUS_OFFSET 2 #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 */ + /* ------------------------------------------------------------------------- */ /* @@ -264,7 +269,7 @@ these macros are defined, the boot loader uses them. #define LED_DDR DDRB #define LED_PORT PORTB -#define LED_PIN PB1 +#define LED_PIN PB2 #if LED_PRESENT #define LED_INIT(x) LED_PORT &=~_BV(LED_PIN); diff --git a/firmware/main.c b/firmware/main.c index 828ea8f..447ff20 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -299,9 +299,11 @@ int main(void) { // All events will render the MCU unresponsive to USB traffic for a while. if (command!=cmd_nop) _delay_ms(2); - if (command==cmd_erase_application) eraseApplication(); - if (command==cmd_write_page) writeFlashPage(); - + if (command==cmd_erase_application) + eraseApplication(); + else if (command==cmd_write_page) + writeFlashPage(); + /* 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)); -- cgit v1.2.3 From 58514cfadd15985ff3ac279679930d372f705687 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Tue, 31 Dec 2013 00:54:19 +0100 Subject: firmware: Directly mapped command register saves 12 btes --- firmware/bootloaderconfig.h | 2 +- firmware/main.c | 23 ++++++++++------------- 2 files changed, 11 insertions(+), 14 deletions(-) (limited to 'firmware') diff --git a/firmware/bootloaderconfig.h b/firmware/bootloaderconfig.h index 57f15f2..9c06de3 100644 --- a/firmware/bootloaderconfig.h +++ b/firmware/bootloaderconfig.h @@ -269,7 +269,7 @@ these macros are defined, the boot loader uses them. #define LED_DDR DDRB #define LED_PORT PORTB -#define LED_PIN PB2 +#define LED_PIN PB1 #if LED_PRESENT #define LED_INIT(x) LED_PORT &=~_BV(LED_PIN); diff --git a/firmware/main.c b/firmware/main.c index 447ff20..d0a3edd 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -36,10 +36,11 @@ register uint8_t command asm( "r3" ); // register saves many bytes enum { - cmd_nop=0, - cmd_erase_application, - cmd_write_page, - cmd_exit + cmd_nop=0, // also: get device info + cmd_transfer_page=1, + cmd_erase_application=2, + cmd_exit=4, + cmd_write_page=5, }; // Definition of sei and cli without memory barrier keyword to prevent reloading of memory variables @@ -162,22 +163,18 @@ static uint8_t usbFunctionSetup(uint8_t data[8]) { if (rq->bRequest == 0) { // get device info usbMsgPtr = replyBuffer; return 4; - } else if (rq->bRequest == 1) { // write page + } 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 = rq->wIndex.word; return USB_NO_MSG; // hands off work to usbFunctionWrite - - } else if (rq->bRequest == 2) { // erase application - command=cmd_erase_application; - - } else { // exit bootloader - command=cmd_exit; - } - + } else { + // Handle cmd_erase_application and cmd_exit + command=rq->bRequest; return 0; + } } // read in a page over usb, and write it in to the flash write buffer -- cgit v1.2.3 From 5b94559c7226774bda746f640b351bec07fe842f Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Tue, 31 Dec 2013 12:55:24 +0100 Subject: firemware: Clean up command handling --- firmware/main.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) (limited to 'firmware') diff --git a/firmware/main.c b/firmware/main.c index d0a3edd..ad0b7a2 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -36,7 +36,8 @@ register uint8_t command asm( "r3" ); // register saves many bytes enum { - cmd_nop=0, // also: get device info + cmd_local_nop=0, // also: get device info + cmd_device_info=0, cmd_transfer_page=1, cmd_erase_application=2, cmd_exit=4, @@ -151,7 +152,6 @@ static void writeWordToPageBuffer(uint16_t data) { /* ------------------------------------------------------------------------ */ static uint8_t usbFunctionSetup(uint8_t data[8]) { usbRequest_t *rq = (void *)data; - ((uint8_t*)&idlePolls)[1] = 0; // reset idle polls when we get usb traffic static uint8_t replyBuffer[4] = { (((uint16_t)PROGMEM_SIZE) >> 8) & 0xff, @@ -159,21 +159,22 @@ static uint8_t usbFunctionSetup(uint8_t data[8]) { SPM_PAGESIZE, MICRONUCLEUS_WRITE_SLEEP }; - - if (rq->bRequest == 0) { // get device info + + ((uint8_t*)&idlePolls)[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 - + } 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 = rq->wIndex.word; return USB_NO_MSG; // hands off work to usbFunctionWrite } else { - // Handle cmd_erase_application and cmd_exit - command=rq->bRequest; - return 0; + // Handle cmd_erase_application and cmd_exit + command=rq->bRequest; + return 0; } } @@ -263,7 +264,7 @@ static inline void leaveBootloader(void) { // jump to application reset vector at end of flash asm volatile ("rjmp __vectors - 4"); -} + } int main(void) { @@ -282,7 +283,7 @@ int main(void) { _delay_us(100); wdt_reset(); // Only necessary if WDT is fused on - command=cmd_nop; + command=cmd_local_nop; usbPoll(); idlePolls++; @@ -294,7 +295,7 @@ int main(void) { // 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_nop) _delay_ms(2); + if (command!=cmd_local_nop) _delay_ms(2); if (command==cmd_erase_application) eraseApplication(); -- cgit v1.2.3 From 8f6ccdaccf624a3e2c727ff4e6ad2c7dc479b51b Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Tue, 31 Dec 2013 13:34:12 +0100 Subject: firmware: leavebootloader does never return The compiler does only understand this when inserting an infinite loop. Saves two bytes and prevents a warning. --- firmware/main.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'firmware') diff --git a/firmware/main.c b/firmware/main.c index ad0b7a2..efef481 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -261,10 +261,11 @@ static inline void leaveBootloader(void) { nop(); } #endif - - // jump to application reset vector at end of flash - asm volatile ("rjmp __vectors - 4"); - } + + 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 +} int main(void) { -- cgit v1.2.3 From 6d2ac9e09f61d6ff267961ba9ff79b0a07e78e28 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Tue, 31 Dec 2013 15:42:09 +0100 Subject: firmware: more global registers and unions types Saves 70(!) bytes or so.. --- firmware/bootloaderconfig.h | 10 ++++++ firmware/main.c | 78 ++++++++++++++++++++++----------------------- firmware/usbconfig.h | 11 +++++-- 3 files changed, 56 insertions(+), 43 deletions(-) (limited to 'firmware') diff --git a/firmware/bootloaderconfig.h b/firmware/bootloaderconfig.h index 9c06de3..a93e6ff 100644 --- a/firmware/bootloaderconfig.h +++ b/firmware/bootloaderconfig.h @@ -12,6 +12,16 @@ #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 diff --git a/firmware/main.c b/firmware/main.c index efef481..3ad1a14 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -29,11 +29,23 @@ // 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" + #error "BOOTLOADER_ADDRESS in makefile must be a multiple of chip's pagesize" +#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" ); // register saves many bytes +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 OSCCAL_RESTORE + register uint8_t osccal_default asm("r2"); +#endif + +static uint16_t vectorTemp[2]; // remember data to create tinyVector table before BOOTLOADER_ADDRESS enum { cmd_local_nop=0, // also: get device info @@ -49,15 +61,6 @@ enum { #define cli() asm volatile("cli") #define nop() asm volatile("nop") -uint16_t idlePolls = 0; // how long have we been idle? - -static uint16_t vectorTemp[2]; // remember data to create tinyVector table before BOOTLOADER_ADDRESS -static uint16_t currentAddress; // current progmem address, used for erasing and writing - -#if OSCCAL_RESTORE - static uint8_t osccal_default; // due to compiler insanity, having this as global actually saves memory -#endif - /* ------------------------------------------------------------------------ */ static inline void eraseApplication(void); static void writeFlashPage(void); @@ -85,7 +88,7 @@ static inline void eraseApplication(void) { boot_page_erase(ptr); } - currentAddress = 0; + currentAddress.w = 0; for (i=0; i<8; i++) writeWordToPageBuffer(0xFFFF); // Write first 8 words to fill in vectors. writeFlashPage(); // enables interrupts } @@ -93,7 +96,7 @@ static inline void eraseApplication(void) { // simply write currently stored page in to already erased flash memory static void writeFlashPage(void) { cli(); - boot_page_write(currentAddress - 2); // will halt CPU, no waiting required + boot_page_write(currentAddress.w - 2); // will halt CPU, no waiting required sei(); } @@ -116,12 +119,12 @@ static void writeWordToPageBuffer(uint16_t data) { // first two interrupt vectors get replaced with a jump to the bootloader's vector table // remember vectors or the tinyvector table - if (currentAddress == RESET_VECTOR_OFFSET * 2) { + if (currentAddress.w == RESET_VECTOR_OFFSET * 2) { vectorTemp[0] = data; data = 0xC000 + (BOOTLOADER_ADDRESS/2) - 1; } - if (currentAddress == USBPLUS_VECTOR_OFFSET * 2) { + if (currentAddress.w == USBPLUS_VECTOR_OFFSET * 2) { vectorTemp[1] = data; data = 0xC000 + (BOOTLOADER_ADDRESS/2) - 1; } @@ -129,12 +132,12 @@ static void writeWordToPageBuffer(uint16_t data) { // 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 == BOOTLOADER_ADDRESS - TINYVECTOR_RESET_OFFSET) { + if (currentAddress.w == BOOTLOADER_ADDRESS - TINYVECTOR_RESET_OFFSET) { data = vectorTemp[0] + ((FLASHEND + 1) - BOOTLOADER_ADDRESS)/2 + 2 + RESET_VECTOR_OFFSET; - } else if (currentAddress == BOOTLOADER_ADDRESS - TINYVECTOR_USBPLUS_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 == BOOTLOADER_ADDRESS - TINYVECTOR_OSCCAL_OFFSET) { + } else if (currentAddress.w == BOOTLOADER_ADDRESS - TINYVECTOR_OSCCAL_OFFSET) { data = OSCCAL; #endif } @@ -142,10 +145,10 @@ static void writeWordToPageBuffer(uint16_t data) { previous_sreg=SREG; cli(); // ensure interrupts are disabled - boot_page_fill(currentAddress, data); + boot_page_fill(currentAddress.w, data); // increment progmem address by one word - currentAddress += 2; + currentAddress.w += 2; SREG=previous_sreg; } @@ -160,8 +163,8 @@ static uint8_t usbFunctionSetup(uint8_t data[8]) { MICRONUCLEUS_WRITE_SLEEP }; - ((uint8_t*)&idlePolls)[1] = 0; // reset idle polls when we get usb traffic - + 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; @@ -169,7 +172,7 @@ static uint8_t usbFunctionSetup(uint8_t data[8]) { // 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 = rq->wIndex.word; + currentAddress.w = rq->wIndex.word; return USB_NO_MSG; // hands off work to usbFunctionWrite } else { // Handle cmd_erase_application and cmd_exit @@ -182,7 +185,7 @@ static uint8_t usbFunctionSetup(uint8_t data[8]) { static uint8_t usbFunctionWrite(uint8_t *data, uint8_t length) { do { // make sure we don't write over the bootloader! - if (currentAddress >= BOOTLOADER_ADDRESS) break; + if (currentAddress.w >= BOOTLOADER_ADDRESS) break; writeWordToPageBuffer(*(uint16_t *) data); data += 2; // advance data pointer @@ -190,17 +193,10 @@ static uint8_t usbFunctionWrite(uint8_t *data, uint8_t length) { } while(length); // if we have now reached another page boundary, we're done -#if SPM_PAGESIZE<256 - // Hack to reduce code size - uint8_t isLast = ((((uint8_t)currentAddress) % SPM_PAGESIZE) == 0); -#else - uint8_t isLast = ((currentAddress % SPM_PAGESIZE) == 0); -#endif - - // definitely need this if! seems usbFunctionWrite gets called again in future usbPoll's in the runloop! + uint8_t isLast = ((currentAddress.b[0] % SPM_PAGESIZE) == 0); if (isLast) command=cmd_write_page; // ask runloop to write our page - return isLast; // let vusb know we're done with this request + return isLast; // let V-USB know we're done with this request } /* ------------------------------------------------------------------------ */ @@ -271,14 +267,16 @@ int main(void) { bootLoaderInit(); - #if AUTO_EXIT_NO_USB_MS - ((uint8_t*)&idlePolls)[1]=((AUTO_EXIT_MS-AUTO_EXIT_NO_USB_MS) * 10UL)>>8; // write only high byte to save 6 bytes - #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; + } else { + idlePolls.b[1]=0; + } do { _delay_us(100); @@ -287,12 +285,12 @@ int main(void) { command=cmd_local_nop; usbPoll(); - idlePolls++; + idlePolls.w++; // Try to execute program if bootloader exit condition is met - if (AUTO_EXIT_MS&&(idlePolls==AUTO_EXIT_MS*10L)) command=cmd_exit; + if (AUTO_EXIT_MS&&(idlePolls.w==AUTO_EXIT_MS*10L)) command=cmd_exit; - LED_MACRO( ((uint8_t*)&idlePolls)[1] ); + 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. diff --git a/firmware/usbconfig.h b/firmware/usbconfig.h index 8ccee36..dc5cafc 100644 --- a/firmware/usbconfig.h +++ b/firmware/usbconfig.h @@ -169,10 +169,15 @@ return;\ #ifndef __ASSEMBLER__ void calibrateOscillatorASM(void); - extern uint16_t idlePolls; -# define USB_RESET_HOOK(resetStarts) if(!resetStarts){ ((uint8_t*)&idlePolls)[1]= 0;calibrateOscillatorASM();} + + #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 + #define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0 #endif -- cgit v1.2.3 From 7a386003603cb0ef0e2dfe8f1d7175747fcaf806 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Tue, 31 Dec 2013 16:13:53 +0100 Subject: firmware: One more free page for the userprogram --- firmware/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'firmware') diff --git a/firmware/Makefile b/firmware/Makefile index 459052b..941310c 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -24,7 +24,7 @@ LOCKOPT = -U lock:w:0x2f:m # - 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 = 1880 +BOOTLOADER_ADDRESS = 18C0 PROGRAMMER = -c USBasp # PROGRAMMER contains AVRDUDE options to address your programmer -- cgit v1.2.3 From c5e7749f835abf1c40420df212e20e1f1de1201e Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Fri, 3 Jan 2014 16:51:39 +0100 Subject: firmware: remove unused header file --- firmware/osccal.h | 57 ------------------------------------------------------- 1 file changed, 57 deletions(-) delete mode 100644 firmware/osccal.h (limited to 'firmware') diff --git a/firmware/osccal.h b/firmware/osccal.h deleted file mode 100644 index af37a43..0000000 --- a/firmware/osccal.h +++ /dev/null @@ -1,57 +0,0 @@ -/* Name: osccal.h - * Author: Christian Starkjohann - * Creation Date: 2008-04-10 - * Changes 2013-11-04 cpldcpu@gmail.com - * Tabsize: 4 - * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH - * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) - */ - -/* -General Description: -This module contains a function which calibrates the AVR's internal RC -oscillator so that the CPU runs at F_CPU (F_CPU is a macro which must be -defined when the module is compiled, best passed in the compiler command -line). The time reference is the USB frame clock of 1 kHz available -immediately after a USB RESET condition. Timing is done by counting CPU -cycles, so all interrupts must be disabled while the calibration runs. -The size optimized assembler implementation includes its own implementation -of usbMeasureFrameLength. Therefore USB_CFG_HAVE_MEASURE_FRAME_LENGTH should -be set to 0 to avoid including unused code sections. It is recommended to call -calibrateOscillatorASM() from the reset hook in usbconfig.h by including osccal.h: - -#include "osccal.h" - -This routine is an alternative to the continuous synchronization described -in osctune.h. - -Algorithm used: See osccalASM.x - -Limitations: -This calibration algorithm may try OSCCAL values of up to 192 even if the -optimum value is far below 192. It may therefore exceed the allowed clock -frequency of the CPU in low voltage designs! -Precision depends on the OSCCAL vs. frequency dependency of the oscillator. -Typical precision for an ATMega168 (derived from the OSCCAL vs. F_RC diagram -in the data sheet) should be in the range of 0.4%. Only the 12.8 MHz and -16.5 MHz versions of V-USB (with built-in receiver PLL) can tolerate this -deviation! All other frequency modules require at least 0.2% precision. -*/ - -#ifndef __OSCCAL_H_INCLUDED__ -#define __OSCCAL_H_INCLUDED__ - -#ifndef __ASSEMBLER__ - void calibrateOscillatorASM(void); -# define USB_RESET_HOOK(resetStarts) if(!resetStarts){ calibrateOscillatorASM();} -# define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0 -#endif -/* This function calibrates the RC oscillator so that the CPU runs at F_CPU. - * It MUST be called immediately after the end of a USB RESET condition! - * Disable all interrupts during the call! - * It is recommended that you store the resulting value in EEPROM so that a - * good guess value is available after the next reset. - */ - - -#endif /* __OSCCAL_H_INCLUDED__ */ -- cgit v1.2.3 From 8c4f3c3a798936de8126f3ebca8ccb6382ade93f Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Fri, 3 Jan 2014 20:14:31 +0100 Subject: release notes for v1.11 --- firmware/releases/release notes.txt | 43 +++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) (limited to 'firmware') diff --git a/firmware/releases/release notes.txt b/firmware/releases/release notes.txt index 18deb4f..2bf2bff 100644 --- a/firmware/releases/release notes.txt +++ b/firmware/releases/release notes.txt @@ -1,10 +1,45 @@ +== 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 + reenumeration of the bootloader and should make driver installiation much easier. + THe new "--erase-only" function of the commandline tool can be used to erase the + firmware and create a stabile device for easier installiation. + - New entrymodes 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 sourcecode 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 + - Bugixes (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. + - 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 == -- cgit v1.2.3 From be508b4aa482d1677a894318fd4ad9da3a8fe5d4 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Fri, 3 Jan 2014 20:50:08 +0100 Subject: firmware: typo, fix warning --- firmware/main.c | 14 +++++++++++--- firmware/releases/release notes.txt | 8 ++++---- 2 files changed, 15 insertions(+), 7 deletions(-) (limited to 'firmware') diff --git a/firmware/main.c b/firmware/main.c index 3ad1a14..16cca65 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -1,9 +1,11 @@ /* * Project: Micronucleus - v1.11 * - * Author (c) 2012 Jenna Fox - * Optimizations after v1.06 (c) 2013 Tim Bo"scke - cpldcpu@gmail.com - * Further input (c) 2013 Shay Green + * Original author (c) 2012 Jenna Fox + * + * Optimizations v1.10/v1.11 (c) 2013 Tim Bo"scke - cpldcpu@gmail.com + * v1.11 (c) 2013 Shay Green + * * Based on USBaspLoader-tiny85 (c) 2012 Louis Beaudoin * Based on USBaspLoader (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH * @@ -25,6 +27,9 @@ #include #include "bootloaderconfig.h" + + + #include "usbdrv/usbdrv.c" // verify the bootloader address aligns with page size @@ -152,6 +157,9 @@ static void writeWordToPageBuffer(uint16_t data) { 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; diff --git a/firmware/releases/release notes.txt b/firmware/releases/release notes.txt index 2bf2bff..09595aa 100644 --- a/firmware/releases/release notes.txt +++ b/firmware/releases/release notes.txt @@ -4,10 +4,10 @@ Firmware: - 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 - reenumeration of the bootloader and should make driver installiation much easier. + 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 - firmware and create a stabile device for easier installiation. - - New entrymodes can be selected in "bootloader.h". Please read the comments for details. + firmware and create a stable device for easier installiation. + - New entry modes can be selected in "bootloader.h". Please read the comments for details. + ENTRY_ALWAYS + ENTRY_WATCHDOG + ENTRY_EXT_RESET @@ -31,7 +31,7 @@ Commandline tool: - Client firmware version will now be displayed after connecting. o Internal changes: - Clean up of source code - - Bugixes (see commits) + - Bugfixes (see commits) == 1.10rc3 - 2013-12-15 == firmware: -- cgit v1.2.3 From c494d96893b7905ab1908c53bd894b1dd5aabcd0 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Fri, 3 Jan 2014 21:13:17 +0100 Subject: firmware: added hex files for v1.11 --- .../releases/micronucleus-1.11-entry_ext_reset.hex | 119 ++++++++++++++++++++ .../micronucleus-1.11-entry_jumper_pb0.hex | 120 +++++++++++++++++++++ .../micronucleus-1.11-entry_wdt_led_pb5.hex | 120 +++++++++++++++++++++ firmware/releases/micronucleus-1.11-ledpb1.hex | 119 ++++++++++++++++++++ firmware/releases/micronucleus-1.11.hex | 118 ++++++++++++++++++++ 5 files changed, 596 insertions(+) create mode 100644 firmware/releases/micronucleus-1.11-entry_ext_reset.hex create mode 100644 firmware/releases/micronucleus-1.11-entry_jumper_pb0.hex create mode 100644 firmware/releases/micronucleus-1.11-entry_wdt_led_pb5.hex create mode 100644 firmware/releases/micronucleus-1.11-ledpb1.hex create mode 100644 firmware/releases/micronucleus-1.11.hex (limited to 'firmware') diff --git a/firmware/releases/micronucleus-1.11-entry_ext_reset.hex b/firmware/releases/micronucleus-1.11-entry_ext_reset.hex new file mode 100644 index 0000000..7389281 --- /dev/null +++ b/firmware/releases/micronucleus-1.11-entry_ext_reset.hex @@ -0,0 +1,119 @@ +: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 new file mode 100644 index 0000000..96a101c --- /dev/null +++ b/firmware/releases/micronucleus-1.11-entry_jumper_pb0.hex @@ -0,0 +1,120 @@ +: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-entry_wdt_led_pb5.hex b/firmware/releases/micronucleus-1.11-entry_wdt_led_pb5.hex new file mode 100644 index 0000000..192ae39 --- /dev/null +++ b/firmware/releases/micronucleus-1.11-entry_wdt_led_pb5.hex @@ -0,0 +1,120 @@ +: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 +:101CF00004B603FC06C0EDEBF8E1E491EF3F09F018 +:101D000068C114BE88E181BD87E081BDBB9A88E8C7 +:101D100093E1ECE9F1E03197F1F70197D1F7BB9846 +:101D2000AC9A8BB780628BBF7894C598712C8CE984 +:101D300091E00197F1F7A895312C60917C00162F66 +:101D4000135017FDB2C080917900CCE0D0E0C81BE1 +:101D5000D109C058DF4F6150CE01E8DD8E3F9F446E +:101D600009F0A1C0809178008D3209F085C018304B +:101D700009F099C083EC80936C008AE58093600041 +:101D8000109266009881292F207689812223D1F034 +:101D9000712C811108C082E690E090937B008093C3 +:101DA0007A0024E05FC0813051F481E180935700D4 +:101DB000E8954C805D8097FD50C02FEF4FC0382EC6 +:101DC00020E050C09A8110927500811106C01092D7 +:101DD000760085E790E022E03BC0853019F49093CF +:101DE0007D002CC0863009F58B81813019F48AED95 +:101DF00098E104C0823041F488EC98E190937B0034 +:101E000080937A0022E10DC0833051F4911108C013 +:101E10008CEE98E190937B0080937A0024E001C0DF +:101E200020E080E4809366001DC0883059F089303E +:101E300019F490937F0002C08A3039F085E790E072 +:101E400020E006C08FE790E002C085E790E021E047 +:101E500090937B0080937A0005C02E8180E8809368 +:101E6000660007C08F81811104C08E81821708F43B +:101E7000282F2093610017C08091660087FF13C050 +:101E800080EC481688E1580620F0842D8F7339F0D5 +:101E90000AC089919991EDDE125091F7F6CF95E045 +:101EA000392E1092610010927C008091600084FFB6 +:101EB00042C0809161008F3F09F43DC0182F8930E6 +:101EC00008F018E0811B8093610080916C0098E815 +:101ED000892780936C00112311F1E0917A00F09131 +:101EE0007B008091660086FF0BC0ADE6B0E0849178 +:101EF0008D9331968DE690E0810F8A13F8CF0BC059 +:101F0000EF01ADE6B0E089918D93FE018DE690E0A2 +:101F1000810F8A13F8CFF0937B00E0937A00612F52 +:101F20008DE690E018DD1C5F1C3019F08FEF809378 +:101F300061001093600084E196B3987131F4815090 +:101F4000D9F710927D0010927700C1E08111C0E0B6 +:101F500080916B008C1729F0C11101C05EDEC09327 +:101F60006B00C30101963C018035934C11F484E071 +:101F7000382E872D8D7011F0BD9801C0BD9A232D8C +:101F80003320E9F08AE390E20197F1F72230A9F4D7 +:101F9000F894E0ECF8E1E054F10983E08093570015 +:101FA000E8953097C1F7412C512CC8E08FEF9FEF97 +:101FB00060DEC150D9F754DE02C02530E1F384E081 +:101FC0003812B5CEEDEBF8E1E491EF3F09F4AFCE76 +:101FD000BD98F894BB9A1BBE15BA10925F02EAEB4B +:101FE000F8E1E4918E2F81508E3F10F4E1BF0000A4 +:041FF00065CCFFCFEE +:061FF4005AFF18BA400874 +:04000003000018C021 +:00000001FF diff --git a/firmware/releases/micronucleus-1.11-ledpb1.hex b/firmware/releases/micronucleus-1.11-ledpb1.hex new file mode 100644 index 0000000..3397f3e --- /dev/null +++ b/firmware/releases/micronucleus-1.11-ledpb1.hex @@ -0,0 +1,119 @@ +: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 new file mode 100644 index 0000000..dd31260 --- /dev/null +++ b/firmware/releases/micronucleus-1.11.hex @@ -0,0 +1,118 @@ +: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 -- cgit v1.2.3 From 25018868d729d1fc2802d3472817d5c36298f435 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Fri, 3 Jan 2014 22:31:43 +0100 Subject: firmware: hex with different device class --- firmware/releases/micronculeus-1.11-class-ff.hex | 118 +++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 firmware/releases/micronculeus-1.11-class-ff.hex (limited to 'firmware') diff --git a/firmware/releases/micronculeus-1.11-class-ff.hex b/firmware/releases/micronculeus-1.11-class-ff.hex new file mode 100644 index 0000000..e510fa0 --- /dev/null +++ b/firmware/releases/micronculeus-1.11-class-ff.hex @@ -0,0 +1,118 @@ +:0800000077CC76CCACCC74CCBB +:1018C00017C016C04CC014C00902120001010080EC +:1018D000320904000000FF000000120110010000A6 +: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 -- cgit v1.2.3 From 97d38f2549dbb933d69d336b6797eab497e5f8e6 Mon Sep 17 00:00:00 2001 From: Tim Date: Sat, 4 Jan 2014 15:34:51 +0100 Subject: Update release notes.txt --- firmware/releases/release notes.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'firmware') diff --git a/firmware/releases/release notes.txt b/firmware/releases/release notes.txt index 09595aa..0b48044 100644 --- a/firmware/releases/release notes.txt +++ b/firmware/releases/release notes.txt @@ -5,8 +5,8 @@ Firmware: 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 - firmware and create a stable device for easier installiation. + THhe new "--erase-only" function of the commandline tool can be used to erase the + user program and create a stable device for easier installiation. - New entry modes can be selected in "bootloader.h". Please read the comments for details. + ENTRY_ALWAYS + ENTRY_WATCHDOG @@ -155,4 +155,4 @@ commandline's c library: o Most recent build before next release where some subtle protocol changes took place - \ No newline at end of file + -- cgit v1.2.3 From e1ac56e7b3c5588752fd6f32193a068d9197a9f2 Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 13 Jan 2014 20:23:43 +0100 Subject: Delete micronucleus-1.11-entry_wdt_led_pb5.hex --- .../micronucleus-1.11-entry_wdt_led_pb5.hex | 120 --------------------- 1 file changed, 120 deletions(-) delete mode 100644 firmware/releases/micronucleus-1.11-entry_wdt_led_pb5.hex (limited to 'firmware') diff --git a/firmware/releases/micronucleus-1.11-entry_wdt_led_pb5.hex b/firmware/releases/micronucleus-1.11-entry_wdt_led_pb5.hex deleted file mode 100644 index 192ae39..0000000 --- a/firmware/releases/micronucleus-1.11-entry_wdt_led_pb5.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 -:101CF00004B603FC06C0EDEBF8E1E491EF3F09F018 -:101D000068C114BE88E181BD87E081BDBB9A88E8C7 -:101D100093E1ECE9F1E03197F1F70197D1F7BB9846 -:101D2000AC9A8BB780628BBF7894C598712C8CE984 -:101D300091E00197F1F7A895312C60917C00162F66 -:101D4000135017FDB2C080917900CCE0D0E0C81BE1 -:101D5000D109C058DF4F6150CE01E8DD8E3F9F446E -:101D600009F0A1C0809178008D3209F085C018304B -:101D700009F099C083EC80936C008AE58093600041 -:101D8000109266009881292F207689812223D1F034 -:101D9000712C811108C082E690E090937B008093C3 -:101DA0007A0024E05FC0813051F481E180935700D4 -:101DB000E8954C805D8097FD50C02FEF4FC0382EC6 -:101DC00020E050C09A8110927500811106C01092D7 -:101DD000760085E790E022E03BC0853019F49093CF -:101DE0007D002CC0863009F58B81813019F48AED95 -:101DF00098E104C0823041F488EC98E190937B0034 -:101E000080937A0022E10DC0833051F4911108C013 -:101E10008CEE98E190937B0080937A0024E001C0DF -:101E200020E080E4809366001DC0883059F089303E -:101E300019F490937F0002C08A3039F085E790E072 -:101E400020E006C08FE790E002C085E790E021E047 -:101E500090937B0080937A0005C02E8180E8809368 -:101E6000660007C08F81811104C08E81821708F43B -:101E7000282F2093610017C08091660087FF13C050 -:101E800080EC481688E1580620F0842D8F7339F0D5 -:101E90000AC089919991EDDE125091F7F6CF95E045 -:101EA000392E1092610010927C008091600084FFB6 -:101EB00042C0809161008F3F09F43DC0182F8930E6 -:101EC00008F018E0811B8093610080916C0098E815 -:101ED000892780936C00112311F1E0917A00F09131 -:101EE0007B008091660086FF0BC0ADE6B0E0849178 -:101EF0008D9331968DE690E0810F8A13F8CF0BC059 -:101F0000EF01ADE6B0E089918D93FE018DE690E0A2 -:101F1000810F8A13F8CFF0937B00E0937A00612F52 -:101F20008DE690E018DD1C5F1C3019F08FEF809378 -:101F300061001093600084E196B3987131F4815090 -:101F4000D9F710927D0010927700C1E08111C0E0B6 -:101F500080916B008C1729F0C11101C05EDEC09327 -:101F60006B00C30101963C018035934C11F484E071 -:101F7000382E872D8D7011F0BD9801C0BD9A232D8C -:101F80003320E9F08AE390E20197F1F72230A9F4D7 -:101F9000F894E0ECF8E1E054F10983E08093570015 -:101FA000E8953097C1F7412C512CC8E08FEF9FEF97 -:101FB00060DEC150D9F754DE02C02530E1F384E081 -:101FC0003812B5CEEDEBF8E1E491EF3F09F4AFCE76 -:101FD000BD98F894BB9A1BBE15BA10925F02EAEB4B -:101FE000F8E1E4918E2F81508E3F10F4E1BF0000A4 -:041FF00065CCFFCFEE -:061FF4005AFF18BA400874 -:04000003000018C021 -:00000001FF -- cgit v1.2.3 From b4e493a9c9fe7b01d38c80b185656f54efae3674 Mon Sep 17 00:00:00 2001 From: Bluebie Date: Tue, 14 Jan 2014 11:21:15 +1100 Subject: firmware: release 1.11 filename typo - renamed --- firmware/releases/micronculeus-1.11-class-ff.hex | 118 ----------------------- firmware/releases/micronucleus-1.11-class-ff.hex | 118 +++++++++++++++++++++++ 2 files changed, 118 insertions(+), 118 deletions(-) delete mode 100644 firmware/releases/micronculeus-1.11-class-ff.hex create mode 100644 firmware/releases/micronucleus-1.11-class-ff.hex (limited to 'firmware') diff --git a/firmware/releases/micronculeus-1.11-class-ff.hex b/firmware/releases/micronculeus-1.11-class-ff.hex deleted file mode 100644 index e510fa0..0000000 --- a/firmware/releases/micronculeus-1.11-class-ff.hex +++ /dev/null @@ -1,118 +0,0 @@ -:0800000077CC76CCACCC74CCBB -:1018C00017C016C04CC014C00902120001010080EC -:1018D000320904000000FF000000120110010000A6 -: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/micronucleus-1.11-class-ff.hex b/firmware/releases/micronucleus-1.11-class-ff.hex new file mode 100644 index 0000000..e510fa0 --- /dev/null +++ b/firmware/releases/micronucleus-1.11-class-ff.hex @@ -0,0 +1,118 @@ +:0800000077CC76CCACCC74CCBB +:1018C00017C016C04CC014C00902120001010080EC +:1018D000320904000000FF000000120110010000A6 +: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 -- cgit v1.2.3 From fe251a68175a6db7fdb938c6d33f8b7468681c51 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Tue, 14 Jan 2014 06:35:01 +0100 Subject: firmware: Removed class-ff binaries as they did not improve anything --- firmware/releases/micronucleus-1.11-class-ff.hex | 118 ----------------------- 1 file changed, 118 deletions(-) delete mode 100644 firmware/releases/micronucleus-1.11-class-ff.hex (limited to 'firmware') diff --git a/firmware/releases/micronucleus-1.11-class-ff.hex b/firmware/releases/micronucleus-1.11-class-ff.hex deleted file mode 100644 index e510fa0..0000000 --- a/firmware/releases/micronucleus-1.11-class-ff.hex +++ /dev/null @@ -1,118 +0,0 @@ -:0800000077CC76CCACCC74CCBB -:1018C00017C016C04CC014C00902120001010080EC -:1018D000320904000000FF000000120110010000A6 -: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 -- cgit v1.2.3