summaryrefslogtreecommitdiffstats
path: root/firmware/main.c
diff options
context:
space:
mode:
authorBluebie <a@creativepony.com>2012-10-04 13:59:25 +1000
committerBluebie <a@creativepony.com>2012-10-04 13:59:25 +1000
commit66b662fc71061e874bef879820112b397f04e746 (patch)
tree77f1b9b44964e29064a75936e28126f36b6a6cd8 /firmware/main.c
parent239ed251b8adbeff9225e1fbabf04a73ecd9f1a1 (diff)
downloadmicronucleus-66b662fc71061e874bef879820112b397f04e746.tar.gz
micronucleus-66b662fc71061e874bef879820112b397f04e746.tar.bz2
micronucleus-66b662fc71061e874bef879820112b397f04e746.zip
Added low power mode, for chips which need to start with clkdiv8 and only switch to 16.5mhz when usb connection is detected somehow.
Diffstat (limited to 'firmware/main.c')
-rw-r--r--firmware/main.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/firmware/main.c b/firmware/main.c
index 08ec1db..62097b8 100644
--- a/firmware/main.c
+++ b/firmware/main.c
@@ -375,12 +375,26 @@ static inline void leaveBootloader(void) {
int __attribute__((noreturn)) main(void) {
/* initialize */
+ #ifdef RESTORE_OSCCAL
+ uint8_t osccal_default = OSCCAL;
+ #endif
+ #if (!SET_CLOCK_PRESCALER) && LOW_POWER_MODE
+ uint8_t prescaler_default = CLKPR;
+ #endif
+
wdt_disable(); /* main app may have enabled watchdog */
tiny85FlashInit();
bootLoaderInit();
- if (bootLoaderCondition()) {
+ if (bootLoaderStartCondition()) {
+ #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
+
initForUsbConnectivity();
do {
usbPoll();
@@ -404,6 +418,21 @@ int __attribute__((noreturn)) main(void) {
} while(bootLoaderCondition()); /* main event loop runs so long as bootLoaderCondition remains truthy */
}
+ // 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
+
+ // slowly bring down OSCCAL to it's original value before launching in to user program
+ #ifdef RESTORE_OSCCAL
+ while (OSCCAL > osccal_default) { OSCCAL -= 1; }
+ #endif
leaveBootloader();
}