X-Git-Url: http://git.linex4red.de/pub/USBaspLoader.git/blobdiff_plain/206b8f6f5fc48e9cc2b3432314191ffc0fc7804f..3e8387dcfe45fa59d9ceab898a163d5630e247b9:/firmware/main.c diff --git a/firmware/main.c b/firmware/main.c index 2c029b8..9558089 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -112,13 +112,25 @@ 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 + +# define stayinloader_initialValue 0xfe # if ((HAVE_UNPRECISEWAIT)) /* here we have to assume we need to optimize for every byte */ -#define __REGISTER_stayinloader_initialValue 0xfe volatile register uint8_t stayinloader __asm__("r17"); # else -static volatile uint8_t stayinloader = 0xfe; +static volatile uint8_t stayinloader; # endif #endif @@ -202,18 +214,6 @@ static const uchar signatureBytes[4] = { /* ------------------------------------------------------------------------ */ -#if (__REGISTER_stayinloader_initialValue) -/* need to put it after libc init - otherwise it fucks up the register */ -void __attribute__ ((section(".init8"),naked,used,no_instrument_function)) __REGISTER_stayinloader_initialValue_INITIALIZATION(void); -void __REGISTER_stayinloader_initialValue_INITIALIZATION(void) { - asm volatile ( - "ldi %[silreg] , %[silval]\n\t" - : [silreg] "=a" (stayinloader) - : [silval] "M" (__REGISTER_stayinloader_initialValue) - ); -} -#endif - #if (HAVE_BOOTLOADERENTRY_FROMSOFTWARE) void __attribute__ ((section(".init3"),naked,used,no_instrument_function)) __BOOTLOADERENTRY_FROMSOFTWARE__bootup_investigate_RAMEND(void); void __BOOTLOADERENTRY_FROMSOFTWARE__bootup_investigate_RAMEND(void) { @@ -425,7 +425,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) && \ @@ -482,7 +482,12 @@ static uchar replyBuffer[4]; }else if(rq->bRequest == USBASP_FUNC_DISCONNECT){ #if BOOTLOADER_CAN_EXIT +# ifdef CONFIG_HAVE__BOOTLOADER_ABORTTIMEOUTONACT + /* let the main loop know for ever that here was activity */ + stayinloader &= (0xfc); +# else stayinloader &= (0xfe); +# endif #endif }else{ /* ignore: others, but could be USBASP_FUNC_CONNECT */ @@ -721,6 +726,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(); @@ -730,6 +739,31 @@ int __attribute__((__noreturn__)) main(void) GICR = (1 << IVSEL); /* move interrupts to boot flash section */ #endif if(bootLoaderCondition()){ +#if (BOOTLOADER_CAN_EXIT) +# if (USE_EXCESSIVE_ASSEMBLER) +asm volatile ( + "ldi %[sil], %[normval]\n\t" +# if ((defined(CONFIG_HAVE__BOOTLOADER_ABORTTIMEOUTONACT)) && (!(BOOTLOADER_IGNOREPROGBUTTON)) && (BOOTLOADER_LOOPCYCLES_TIMEOUT)) + "sbis %[pin], %[bit]\n\t" + "subi %[sil], 0x02\n\t" +# endif + : [sil] "=d" (stayinloader) + : [normval] "M" (stayinloader_initialValue) +# if (!(BOOTLOADER_IGNOREPROGBUTTON)) + , + [pin] "I" (_SFR_IO_ADDR(PIN_PIN(JUMPER_PORT))), + [bit] "I" (PIN(JUMPER_PORT, JUMPER_BIT)) +# endif +); +# else +# if ((defined(CONFIG_HAVE__BOOTLOADER_ABORTTIMEOUTONACT)) && (!(BOOTLOADER_IGNOREPROGBUTTON)) && (BOOTLOADER_LOOPCYCLES_TIMEOUT)) + if (bootLoaderConditionSimple()) { + stayinloader = stayinloader_initialValue - 0x02; + } else +# endif + stayinloader = stayinloader_initialValue; +# endif +#endif #if NEED_WATCHDOG # if (defined(MCUSR) && defined(WDRF)) /* @@ -745,8 +779,39 @@ int __attribute__((__noreturn__)) main(void) MCUCSR = 0; /* clear all reset flags for next time */ initForUsbConnectivity(); do{ +#if ((BOOTLOADER_LOOPCYCLES_TIMEOUT) && (BOOTLOADER_CAN_EXIT)) +# ifdef CONFIG_HAVE__BOOTLOADER_ABORTTIMEOUTONACT + if (stayinloader != 0x0e) { + /* can be reached, since high-nibble is decreased every cycle... */ +#else + if (stayinloader & 0x01) { +#endif + timeout_remaining = BOOTLOADER_LOOPCYCLES_TIMEOUT; + } else { + __loopscycles++; + if (!(__loopscycles)) { + if(timeout_remaining) timeout_remaining--; + else stayinloader&=0xf1; + } + } +#endif usbPoll(); #if BOOTLOADER_CAN_EXIT +#if BOOTLOADER_IGNOREPROGBUTTON + /* + * remove the high nibble as it would be subtracted due to: + * "(!bootLoaderConditionSimple())" + */ +#if USE_EXCESSIVE_ASSEMBLER +asm volatile ( + "andi %[sil], 0x0f\n\t" + : [sil] "+d" (stayinloader) + : +); +#else + stayinloader &= 0x0f; +#endif +#else #if USE_EXCESSIVE_ASSEMBLER asm volatile ( "cpi %[sil], 0x10\n\t" @@ -778,6 +843,7 @@ asm volatile ( } #endif #endif +#endif #if BOOTLOADER_CAN_EXIT }while (stayinloader); /* main event loop, if BOOTLOADER_CAN_EXIT*/