summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcpldcpu <cpldcpu@gmail.com>2015-05-30 18:39:45 +0200
committercpldcpu <cpldcpu@gmail.com>2015-05-30 18:39:45 +0200
commit616f5810f1ba98f3f963e4e8b947ad3c6bd9ea57 (patch)
treecfab3078f83d8d6e52d91ad8d55939854863a7ae
parenta7aa590a8965516ad0f0865be2c87b794127a8e0 (diff)
downloadmicronucleus-616f5810f1ba98f3f963e4e8b947ad3c6bd9ea57.tar.gz
micronucleus-616f5810f1ba98f3f963e4e8b947ad3c6bd9ea57.tar.bz2
micronucleus-616f5810f1ba98f3f963e4e8b947ad3c6bd9ea57.zip
firmware: added OSCCAL_SLOW_PROGRAMMING
-rw-r--r--firmware/configuration/Nanite841/Makefile.inc2
-rw-r--r--firmware/configuration/Nanite841/bootloaderconfig.h5
-rw-r--r--firmware/main.c14
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 {