X-Git-Url: http://git.linex4red.de/pub/USBaspLoader.git/blobdiff_plain/46cd9d4a9468b30ee8e456eadee7aed61e6830c1..c9b428fa91b18645750a15b50e6cc2a972c53c9c:/firmware/main.c?ds=sidebyside diff --git a/firmware/main.c b/firmware/main.c index 8114dda..8eb785b 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -113,7 +113,13 @@ typedef union longConverter{ #if BOOTLOADER_CAN_EXIT -static volatile unsigned char stayinloader = 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; +# endif #endif static longConverter_t currentAddress; /* in bytes */ @@ -196,6 +202,18 @@ 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) { @@ -407,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) && \