From 616f5810f1ba98f3f963e4e8b947ad3c6bd9ea57 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sat, 30 May 2015 18:39:45 +0200 Subject: firmware: added OSCCAL_SLOW_PROGRAMMING --- firmware/configuration/Nanite841/Makefile.inc | 2 +- firmware/configuration/Nanite841/bootloaderconfig.h | 5 +++++ firmware/main.c | 14 +++++++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/firmware/configuration/Nanite841/Makefile.inc b/firmware/configuration/Nanite841/Makefile.inc index 9601a69..e147248 100644 --- a/firmware/configuration/Nanite841/Makefile.inc +++ b/firmware/configuration/Nanite841/Makefile.inc @@ -15,7 +15,7 @@ DEVICE = attiny841 # - for the size of your device (8kb = 1024 * 8 = 8192) subtract above value 2124... = 6068 # - How many pages in is that? 6068 / 64 (tiny85 page size in bytes) = 94.8125 # - round that down to 94 - our new bootloader address is 94 * 64 = 6016, in hex = 1780 -BOOTLOADER_ADDRESS = 19C0 +BOOTLOADER_ADDRESS = 1980 FUSEOPT = -U lfuse:w:0xe2:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m FUSEOPT_DISABLERESET = # TODO diff --git a/firmware/configuration/Nanite841/bootloaderconfig.h b/firmware/configuration/Nanite841/bootloaderconfig.h index 20be3f6..5812ace 100644 --- a/firmware/configuration/Nanite841/bootloaderconfig.h +++ b/firmware/configuration/Nanite841/bootloaderconfig.h @@ -190,6 +190,10 @@ * will be made to calibrate the oscillator. You should deactivate both options above * if you use this to avoid redundant code. * + * OSCCAL_SLOW_PROGRAMMING Setting this to '1' will set OSCCAL back to the factory calibration during programming to make + * sure correct timing is used for the flash writes. This is needed if the micronucleus clock + * speed significantly deviated from the default clock. E.g. 12 Mhz on ATtiny841 vs. 8Mhz default. + * * If both options are selected, OSCCAL_RESTORE_DEFAULT takes precedence. * * If no option is selected, OSCCAL will be left untouched and stays at either factory calibration or F_CPU depending @@ -200,6 +204,7 @@ #define OSCCAL_RESTORE_DEFAULT 1 #define OSCCAL_SAVE_CALIB 1 #define OSCCAL_HAVE_XTAL 0 +#define OSCCAL_SLOW_PROGRAMMING 1 /* * Defines handling of an indicator LED while the bootloader is active. diff --git a/firmware/main.c b/firmware/main.c index a6bb8c6..fdf22e4 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -229,6 +229,8 @@ static inline void leaveBootloader(void) { void USB_INTR_VECTOR(void); int main(void) { + uint8_t osccal_tmp; + bootLoaderInit(); /* save default OSCCAL calibration */ @@ -286,12 +288,22 @@ int main(void) { } while(--fastctr); wdr(); - + + #if OSCCAL_SLOW_PROGRAMMING + osccal_tmp = OSCCAL; + OSCCAL = osccal_default; + #endif // commands are only evaluated after next USB transmission or after 5 ms passed if (command==cmd_erase_application) eraseApplication(); if (command==cmd_write_page) writeFlashPage(); + #if OSCCAL_SLOW_PROGRAMMING + OSCCAL = osccal_tmp; + #endif + + + if (command==cmd_exit) { if (!fastctr) break; // Only exit after 5 ms timeout } else { -- cgit v1.2.3