X-Git-Url: http://git.linex4red.de/pub/USBaspLoader.git/blobdiff_plain/4119cc56252693004c761cd621aa09ffa3957de0..a93ee833f02abfd9cbd22cc14be1cbe630f9103e:/firmware/main.c diff --git a/firmware/main.c b/firmware/main.c index 18de036..c80ab7d 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -1,7 +1,9 @@ /* Name: main.c * Project: USBaspLoader * Author: Christian Starkjohann + * Author: Stephan Baerwolf * Creation Date: 2007-12-08 + * Modification Date: 2012-11-10 * Tabsize: 4 * Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH * License: GNU GPL v2 (see License.txt) @@ -80,16 +82,6 @@ static void leaveBootloader() __attribute__((__noreturn__)); # define uint unsigned int #endif -/* defaults if not in config file: */ -#ifndef HAVE_EEPROM_PAGED_ACCESS -# define HAVE_EEPROM_PAGED_ACCESS 0 -#endif -#ifndef HAVE_EEPROM_BYTE_ACCESS -# define HAVE_EEPROM_BYTE_ACCESS 0 -#endif -#ifndef BOOTLOADER_CAN_EXIT -# define BOOTLOADER_CAN_EXIT 0 -#endif /* allow compatibility with avrusbboot's bootloaderconfig.h: */ #ifdef BOOTLOADER_INIT @@ -123,9 +115,8 @@ typedef union longConverter{ #if BOOTLOADER_CAN_EXIT -static uchar requestBootLoaderExit; -#endif static volatile unsigned char stayinloader = 0xfe; +#endif static longConverter_t currentAddress; /* in bytes */ static uchar bytesRemaining; @@ -141,9 +132,13 @@ static const uchar signatureBytes[4] = { SIGNATURE_BYTES #elif defined (__AVR_ATmega8__) || defined (__AVR_ATmega8A__) || defined (__AVR_ATmega8HVA__) 0x1e, 0x93, 0x07, 0 +#elif defined (__AVR_ATmega32__) + 0x1e, 0x95, 0x02, 0 #elif defined (__AVR_ATmega48__) || defined (__AVR_ATmega48A__) || defined (__AVR_ATmega48P__) + #error ATmega48 does not support bootloaders! 0x1e, 0x92, 0x05, 0 #elif defined (__AVR_ATmega48PA__) + #error ATmega48 does not support bootloaders! 0x1e, 0x92, 0x0A, 0 #elif defined (__AVR_ATmega88__) || defined (__AVR_ATmega88A__) || defined (__AVR_ATmega88P__) 0x1e, 0x93, 0x0a, 0 @@ -157,8 +152,6 @@ static const uchar signatureBytes[4] = { 0x1e, 0x94, 0x06, 0 #elif defined (__AVR_ATmega168PA__) 0x1e, 0x94, 0x0B, 0 -#elif defined (__AVR_ATmega32__) - 0x1e, 0x95, 0x02, 0 #elif defined (__AVR_ATmega324A__) 0x1e, 0x95, 0x15, 0 #elif defined (__AVR_ATmega324P__) @@ -223,13 +216,33 @@ static uchar replyBuffer[4]; rval = rq->wIndex.bytes[0] & 3; rval = signatureBytes[rval]; #if HAVE_READ_LOCK_FUSE -#if defined (__AVR_ATmega8__) +#if defined (__AVR_ATmega8__) || defined (__AVR_ATmega8A__) || defined (__AVR_ATmega32__) }else if(rq->wValue.bytes[0] == 0x58 && rq->wValue.bytes[1] == 0x00){ /* read lock bits */ rval = boot_lock_fuse_bits_get(GET_LOCK_BITS); }else if(rq->wValue.bytes[0] == 0x50 && rq->wValue.bytes[1] == 0x00){ /* read lfuse bits */ rval = boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS); }else if(rq->wValue.bytes[0] == 0x58 && rq->wValue.bytes[1] == 0x08){ /* read hfuse bits */ rval = boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS); + +#elif defined (__AVR_ATmega48__) || defined (__AVR_ATmega48A__) || defined (__AVR_ATmega48P__) || defined (__AVR_ATmega48PA__) || \ + defined (__AVR_ATmega88__) || defined (__AVR_ATmega88A__) || defined (__AVR_ATmega88P__) || defined (__AVR_ATmega88PA__) || \ + defined (__AVR_ATmega164A__) || defined (__AVR_ATmega164P__) || \ + defined (__AVR_ATmega168__) || defined (__AVR_ATmega168A__) || defined (__AVR_ATmega168P__) || defined (__AVR_ATmega168PA__) || \ + defined (__AVR_ATmega324A__) || defined (__AVR_ATmega324P__) || \ + defined (__AVR_ATmega328__) || defined (__AVR_ATmega328P__) || \ + defined (__AVR_ATmega644__) || defined (__AVR_ATmega644A__) || defined (__AVR_ATmega644P__) || defined (__AVR_ATmega644PA__) || \ + defined (__AVR_ATmega128__) || \ + defined (__AVR_ATmega1284__) || defined (__AVR_ATmega1284P__) + }else if(rq->wValue.bytes[0] == 0x58 && rq->wValue.bytes[1] == 0x00){ /* read lock bits */ + rval = boot_lock_fuse_bits_get(GET_LOCK_BITS); + }else if(rq->wValue.bytes[0] == 0x50 && rq->wValue.bytes[1] == 0x00){ /* read lfuse bits */ + rval = boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS); + }else if(rq->wValue.bytes[0] == 0x58 && rq->wValue.bytes[1] == 0x08){ /* read hfuse bits */ + rval = boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS); + }else if(rq->wValue.bytes[0] == 0x50 && rq->wValue.bytes[1] == 0x08){ /* read efuse bits */ + rval = boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS ); +#else + #warning "HAVE_READ_LOCK_FUSE is activated but MCU unknown -> will not support this feature" #endif #endif #if HAVE_EEPROM_BYTE_ACCESS @@ -277,13 +290,15 @@ static uchar replyBuffer[4]; } }else if(rq->bRequest == USBASP_FUNC_DISCONNECT){ - stayinloader &= (0xfe); + #if BOOTLOADER_CAN_EXIT - requestBootLoaderExit = 1; /* allow proper shutdown/close of connection */ + stayinloader &= (0xfe); #endif }else{ /* ignore: others, but could be USBASP_FUNC_CONNECT */ +#if BOOTLOADER_CAN_EXIT stayinloader |= (0x01); +#endif } return len; } @@ -391,21 +406,13 @@ int __attribute__((noreturn)) main(void) GICR = (1 << IVSEL); /* move interrupts to boot flash section */ #endif if(bootLoaderCondition()){ +#if NEED_WATCHDOG wdt_disable(); /* main app may have enabled watchdog */ -#if BOOTLOADER_CAN_EXIT - uchar i = 0, j = 0; #endif initForUsbConnectivity(); do{ usbPoll(); #if BOOTLOADER_CAN_EXIT - if(requestBootLoaderExit){ - if(--i == 0){ - if(--j == 0) - break; - } - } -#endif if (stayinloader >= 0x10) { if (!bootLoaderCondition()) { stayinloader-=0x10; @@ -415,8 +422,13 @@ int __attribute__((noreturn)) main(void) if (stayinloader > 1) stayinloader-=2; } } +#endif - }while (stayinloader); /* main event loop */ +#if BOOTLOADER_CAN_EXIT + }while (stayinloader); /* main event loop, if BOOTLOADER_CAN_EXIT*/ +#else + }while (1); /* main event loop */ +#endif } leaveBootloader(); }