From: Stephan Baerwolf Date: Tue, 13 Nov 2012 17:25:48 +0000 (+0100) Subject: new feature "HAVE_UNPRECISEWAIT" for save some flash X-Git-Tag: v0.9~6 X-Git-Url: http://git.linex4red.de/pub/USBaspLoader.git/commitdiff_plain/c2df4584d6bc82ef8c793eaaffc0acead7f8410c?hp=5546d9fccf53bd10d2b185da2da00e7047cec7e1 new feature "HAVE_UNPRECISEWAIT" for save some flash Signed-off-by: Stephan Baerwolf --- diff --git a/firmware/bootloaderconfig.h b/firmware/bootloaderconfig.h index a54adab..c9676a6 100644 --- a/firmware/bootloaderconfig.h +++ b/firmware/bootloaderconfig.h @@ -179,6 +179,17 @@ these macros are defined, the boot loader usees them. * If the used MCU is fused not to enable watchdog after reset (WDTON is 1 - safty level 1) * then "NEED_WATCHDOG" may be deactivated in order to save some memory. */ +#ifndef CONFIG_NO__PRECISESLEEP + #define HAVE_UNPRECISEWAIT 0 +#else + #define HAVE_UNPRECISEWAIT 1 +#endif +/* This macro enables hand-optimized assembler code + * instead to use _sleep_ms for delaying USB enumeration. + * Because normally these timings do not need to be exact, + * the optimized assembler code does not need to be precise. + * Therefore it is very small, which saves some PROGMEM bytes! + */ //#define SIGNATURE_BYTES 0x1e, 0x93, 0x07, 0 /* ATMega8 */ /* This macro defines the signature bytes returned by the emulated USBasp to * the programmer software. They should match the actual device at least in diff --git a/firmware/main.c b/firmware/main.c index fda58a2..8012e20 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -386,10 +386,33 @@ uchar i; static void initForUsbConnectivity(void) { +#if HAVE_UNPRECISEWAIT + /* (0.25s*F_CPU)/(4 cycles per loop) ~ (65536*waitloopcnt) + * F_CPU/(16*65536) ~ waitloopcnt + * F_CPU / 1048576 ~ waitloopcnt + */ + uint8_t waitloopcnt = 1 + (F_CPU/1048576); +#endif usbInit(); /* enforce USB re-enumerate: */ usbDeviceDisconnect(); /* do this while interrupts are disabled */ +#if HAVE_UNPRECISEWAIT + asm volatile ( + /*we really don't care what value Z has... + * ...if we loop 65536/F_CPU more or less... + * ...unimportant - just save some opcodes + */ +"initForUsbConnectivity_sleeploop: \n\t" + "sbiw r30, 1 \n\t" + "sbci %0, 0 \n\t" + "brne initForUsbConnectivity_sleeploop \n\t" + : "+d" (waitloopcnt) + : + : "r30","r31" + ); +#else _delay_ms(260); /* fake USB disconnect for > 250 ms */ +#endif usbDeviceConnect(); sei(); }