X-Git-Url: http://git.linex4red.de/pub/USBaspLoader.git/blobdiff_plain/206b8f6f5fc48e9cc2b3432314191ffc0fc7804f..dda3e71306415ec5fd744d0daa2fafeddec99961:/firmware/main.c diff --git a/firmware/main.c b/firmware/main.c index 2c029b8..c609439 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -112,7 +112,18 @@ typedef union longConverter{ }longConverter_t; -#if BOOTLOADER_CAN_EXIT +#if (BOOTLOADER_CAN_EXIT) +# if (BOOTLOADER_LOOPCYCLES_TIMEOUT) +# if (BOOTLOADER_LOOPCYCLES_TIMEOUT < 256) +# if ((HAVE_UNPRECISEWAIT)) +volatile register uint8_t timeout_remaining __asm__("r2"); +# else +static volatile uint8_t timeout_remaining; +# endif +# else +static volatile uint16_t timeout_remaining; +# endif +# endif # if ((HAVE_UNPRECISEWAIT)) /* here we have to assume we need to optimize for every byte */ #define __REGISTER_stayinloader_initialValue 0xfe @@ -425,7 +436,7 @@ defined (__AVR_ATmega2561__) # endif } #endif -#if (HAVE_BOOTLOADER_HIDDENEXITCOMMAND) +#if ((HAVE_BOOTLOADER_HIDDENEXITCOMMAND) && (BOOTLOADER_CAN_EXIT)) # if ((HAVE_BOOTLOADER_HIDDENEXITCOMMAND != 0xac) && \ (HAVE_BOOTLOADER_HIDDENEXITCOMMAND != 0x20) && (HAVE_BOOTLOADER_HIDDENEXITCOMMAND != 0x28) && \ (HAVE_BOOTLOADER_HIDDENEXITCOMMAND != 0x40) && (HAVE_BOOTLOADER_HIDDENEXITCOMMAND != 0x48) && \ @@ -721,6 +732,10 @@ static void initForUsbConnectivity(void) int __attribute__((__noreturn__)) main(void) { +#if ((BOOTLOADER_LOOPCYCLES_TIMEOUT) && (BOOTLOADER_CAN_EXIT)) + uint16_t __loopscycles; + timeout_remaining = BOOTLOADER_LOOPCYCLES_TIMEOUT; +#endif /* initialize */ bootLoaderInit(); odDebugInit(); @@ -745,6 +760,17 @@ int __attribute__((__noreturn__)) main(void) MCUCSR = 0; /* clear all reset flags for next time */ initForUsbConnectivity(); do{ +#if ((BOOTLOADER_LOOPCYCLES_TIMEOUT) && (BOOTLOADER_CAN_EXIT)) + if (stayinloader & 0x1) { + timeout_remaining = BOOTLOADER_LOOPCYCLES_TIMEOUT; + } else { + __loopscycles++; + if (!(__loopscycles)) { + if(timeout_remaining) timeout_remaining--; + else stayinloader&=0xf1; + } + } +#endif usbPoll(); #if BOOTLOADER_CAN_EXIT #if USE_EXCESSIVE_ASSEMBLER