diff --git a/optiboot/bootloaders/optiboot/Makefile b/optiboot/bootloaders/optiboot/Makefile index 34d68c0..d97e6d1 100644 --- a/optiboot/bootloaders/optiboot/Makefile +++ b/optiboot/bootloaders/optiboot/Makefile @@ -63,6 +63,16 @@ override LDFLAGS = -Wl,$(LDSECTION) -Wl,--relax -nostartfiles OBJCOPY = avr-objcopy OBJDUMP = avr-objdump +# Test platforms +# Virtual boot block test +virboot328: TARGET = atmega328 +virboot328: MCU_TARGET = atmega328p +virboot328: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' '-DVIRTUAL_BOOT +virboot328: AVR_FREQ = 16000000L +virboot328: LDSECTION = --section-start=.text=0x7e00 +virboot328: $(PROGRAM)_atmega328.hex +virboot328: $(PROGRAM)_atmega328.lst + # 20MHz clocked platforms # # These are capable of 230400 baud, or 115200 baud on PC (Arduino Avrdude issue) diff --git a/optiboot/bootloaders/optiboot/optiboot.c b/optiboot/bootloaders/optiboot/optiboot.c index d77699d..993b786 100644 --- a/optiboot/bootloaders/optiboot/optiboot.c +++ b/optiboot/bootloaders/optiboot/optiboot.c @@ -184,10 +184,21 @@ void uartDelay() __attribute__ ((naked)); #endif void appStart() __attribute__ ((naked)); -#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || (__AVR_ATmega644P__) || defined(__AVR_ATtiny84__) +#if defined(__AVR_ATmega168__) #define RAMSTART (0x100) +#define NRWWSTART (0x3800) +#elif defined(__AVR_ATmega328P__) +#define RAMSTART (0x100) +#define NRWWSTART (0x7000) +#elif defined (__AVR_ATmega644P__) +#define RAMSTART (0x100) +#define NRWWSTART (0xE000) +#elif defined(__AVR_ATtiny84__) +#define RAMSTART (0x100) +#define NRWWSTART (0x0000) #elif defined(__AVR_ATmega1280__) #define RAMSTART (0x200) +#define NRWWSTART (0xE000) #endif /* C zero initialises all global variables. However, that requires */ @@ -293,14 +304,18 @@ int main(void) { getLen(); - // Immediately start page erase - this will 4.5ms - __boot_page_erase_short((uint16_t)(void*)address); + // If we are in RWW section, immediately start page erase + if (address < NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); // While that is going on, read in page contents bufPtr = buff; do *bufPtr++ = getch(); while (--length); + // If we are in NRWW section, page erase has to be delayed until now. + // Todo: Take RAMPZ into account + if (address >= NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); + // Read command terminator, start reply verifySpace(); diff --git a/optiboot/bootloaders/optiboot/optiboot_atmega1280.hex b/optiboot/bootloaders/optiboot/optiboot_atmega1280.hex index 3f104e9..1ec4204 100644 --- a/optiboot/bootloaders/optiboot/optiboot_atmega1280.hex +++ b/optiboot/bootloaders/optiboot/optiboot_atmega1280.hex @@ -1,34 +1,36 @@ :020000021000EC :10FC000085E08093810082E08093C00088E180934A :10FC1000C10086E08093C20080E18093C40084B775 -:10FC200014BE81FFCFD08DE0C7D0279A86E020E3B5 +:10FC200014BE81FFDED08DE0D6D0279A86E020E397 :10FC30003CEF91E0309385002093840096BBB09B0D -:10FC4000FECF1F9AA8958150A9F7DD24D394A5E093 -:10FC5000EA2EF1E1FF2EA3D0813419F481E0BDD06A -:10FC60008CC0823411F484E103C0853419F485E03A -:10FC7000B4D08AC08535A9F492D0082F10E08FD077 +:10FC4000FECF1F9AA8958150A9F7EE24E394A5E072 +:10FC5000DA2EF1E1FF2EB2D0813419F481E0CCD05C +:10FC60009BC0823411F484E103C0853419F485E02B +:10FC7000C3D099C08535A9F4A1D0082F10E09ED03B :10FC800090E0982F8827802B912B292F221F222745 :10FC9000221F2BBF880F991F9093010480930004AB -:10FCA00072C0863529F484E098D080E070D06CC0B2 -:10FCB000843609F03FC07BD0E0910004F09101044C -:10FCC00083E087BFE895C0E0D2E069D08993809156 -:10FCD00002048150809302048823B9F778D007B6D4 -:10FCE00000FCFDCF4091000450910104A0E0B2E07F -:10FCF0002C9130E011968C91119790E0982F8827E5 -:10FD0000822B932B1296FA010C01D7BEE895112491 -:10FD10004E5F5F4FF3E0A030BF0751F7E091000462 -:10FD2000F0910104E7BEE89507B600FCFDCFF7BEF1 -:10FD3000E8952AC08437D1F43AD049D0E091000444 -:10FD4000F0910104E6918E2F22D0809100049091D1 -:10FD500001040196909301048093000480910204B1 -:10FD6000815080930204882349F70EC0853739F407 -:10FD70002ED08EE10CD087E90AD083E097CF813571 -:10FD800011F488E019D023D080E101D064CF982FFE -:10FD90008091C00085FFFCCF9093C6000895A89580 -:10FDA0008091C00087FFFCCF8091C6000895F7DFE7 -:10FDB000F6DF80930204F3CFE0E6F0E098E1908371 -:10FDC0008083089580E0F8DFEE27FF270994E7DFBE -:10FDD000803209F0F7DF84E1DACF1F93182FDFDFDD -:0AFDE0001150E9F7F4DF1F910895B8 +:10FCA00081C0863529F484E0A7D080E07FD07BC076 +:10FCB000843609F04EC08AD0E0910004F09101042E +:10FCC00080EEE030F80718F483E087BFE895C0E0E5 +:10FCD000D2E074D089938091020481508093020411 +:10FCE0008823B9F7E0910004F091010480EEE03040 +:10FCF000F80718F083E087BFE89578D007B600FCD6 +:10FD0000FDCF4091000450910104A0E0B2E02C919D +:10FD100030E011968C91119790E0982F8827822BD4 +:10FD2000932B1296FA010C01E7BEE89511244E5F61 +:10FD30005F4FF3E0A030BF0751F7E0910004F0916E +:10FD40000104D7BEE89507B600FCFDCFF7BEE895E5 +:10FD50002AC08437D1F43AD049D0E0910004F09120 +:10FD60000104E6918E2F22D080910004909101042D +:10FD700001969093010480930004809102048150C5 +:10FD800080930204882349F70EC0853739F42ED0BA +:10FD90008EE10CD087E90AD083E088CF813511F459 +:10FDA00088E019D023D080E101D055CF982F8091E1 +:10FDB000C00085FFFCCF9093C6000895A895809160 +:10FDC000C00087FFFCCF8091C6000895F7DFF6DF03 +:10FDD00080930204F3CFE0E6F0E098E19083808323 +:10FDE000089580E0F8DFEE27FF270994E7DF8032EF +:10FDF00009F0F7DF84E1DACF1F93182FDFDF11500E +:08FE0000E9F7F4DF1F910895FA :040000031000FC00ED :00000001FF diff --git a/optiboot/bootloaders/optiboot/optiboot_atmega1280.lst b/optiboot/bootloaders/optiboot/optiboot_atmega1280.lst index 2098297..9730bbe 100644 --- a/optiboot/bootloaders/optiboot/optiboot_atmega1280.lst +++ b/optiboot/bootloaders/optiboot/optiboot_atmega1280.lst @@ -3,25 +3,25 @@ optiboot_atmega1280.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn - 0 .text 000001ea 0001fc00 0001fc00 00000054 2**1 + 0 .text 00000208 0001fc00 0001fc00 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .debug_aranges 00000028 00000000 00000000 0000023e 2**0 + 1 .debug_aranges 00000028 00000000 00000000 0000025c 2**0 CONTENTS, READONLY, DEBUGGING - 2 .debug_pubnames 0000006a 00000000 00000000 00000266 2**0 + 2 .debug_pubnames 0000006a 00000000 00000000 00000284 2**0 CONTENTS, READONLY, DEBUGGING - 3 .debug_info 00000277 00000000 00000000 000002d0 2**0 + 3 .debug_info 00000278 00000000 00000000 000002ee 2**0 CONTENTS, READONLY, DEBUGGING - 4 .debug_abbrev 000001a1 00000000 00000000 00000547 2**0 + 4 .debug_abbrev 000001a1 00000000 00000000 00000566 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_line 000003eb 00000000 00000000 000006e8 2**0 + 5 .debug_line 000003f3 00000000 00000000 00000707 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_frame 00000090 00000000 00000000 00000ad4 2**2 + 6 .debug_frame 00000090 00000000 00000000 00000afc 2**2 CONTENTS, READONLY, DEBUGGING - 7 .debug_str 00000135 00000000 00000000 00000b64 2**0 + 7 .debug_str 00000135 00000000 00000000 00000b8c 2**0 CONTENTS, READONLY, DEBUGGING - 8 .debug_loc 000001b1 00000000 00000000 00000c99 2**0 + 8 .debug_loc 000001b1 00000000 00000000 00000cc1 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_ranges 00000068 00000000 00000000 00000e4a 2**0 + 9 .debug_ranges 00000068 00000000 00000000 00000e72 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: @@ -61,12 +61,12 @@ int main(void) { 1fc20: 14 be out 0x34, r1 ; 52 if (!(ch & _BV(EXTRF))) appStart(); 1fc22: 81 ff sbrs r24, 1 - 1fc24: cf d0 rcall .+414 ; 0x1fdc4 + 1fc24: de d0 rcall .+444 ; 0x1fde2 // Set up watchdog to trigger after 500ms watchdogConfig(WATCHDOG_500MS); 1fc26: 8d e0 ldi r24, 0x0D ; 13 - 1fc28: c7 d0 rcall .+398 ; 0x1fdb8 + 1fc28: d6 d0 rcall .+428 ; 0x1fdd6 /* Set LED pin as output */ LED_DDR |= _BV(LED); @@ -118,8 +118,8 @@ void watchdogReset() { if(ch == STK_GET_PARAMETER) { // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy getNch(1); - 1fc4a: dd 24 eor r13, r13 - 1fc4c: d3 94 inc r13 + 1fc4a: ee 24 eor r14, r14 + 1fc4c: e3 94 inc r14 __boot_page_fill_short((uint16_t)(void*)addrPtr,a); addrPtr += 2; } while (--ch); @@ -127,7 +127,7 @@ void watchdogReset() { // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); 1fc4e: a5 e0 ldi r26, 0x05 ; 5 - 1fc50: ea 2e mov r14, r26 + 1fc50: da 2e mov r13, r26 boot_spm_busy_wait(); #if defined(RWWSRE) @@ -141,7 +141,7 @@ void watchdogReset() { for (;;) { /* get character from UART */ ch = getch(); - 1fc56: a3 d0 rcall .+326 ; 0x1fd9e + 1fc56: b2 d0 rcall .+356 ; 0x1fdbc if(ch == STK_GET_PARAMETER) { 1fc58: 81 34 cpi r24, 0x41 ; 65 @@ -149,8 +149,8 @@ void watchdogReset() { // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy getNch(1); 1fc5c: 81 e0 ldi r24, 0x01 ; 1 - 1fc5e: bd d0 rcall .+378 ; 0x1fdda - 1fc60: 8c c0 rjmp .+280 ; 0x1fd7a + 1fc5e: cc d0 rcall .+408 ; 0x1fdf8 + 1fc60: 9b c0 rjmp .+310 ; 0x1fd98 putch(0x03); } else if(ch == STK_SET_DEVICE) { @@ -167,8 +167,8 @@ void watchdogReset() { // SET DEVICE EXT is ignored getNch(5); 1fc6e: 85 e0 ldi r24, 0x05 ; 5 - 1fc70: b4 d0 rcall .+360 ; 0x1fdda - 1fc72: 8a c0 rjmp .+276 ; 0x1fd88 + 1fc70: c3 d0 rcall .+390 ; 0x1fdf8 + 1fc72: 99 c0 rjmp .+306 ; 0x1fda6 } else if(ch == STK_LOAD_ADDRESS) { 1fc74: 85 35 cpi r24, 0x55 ; 85 @@ -176,11 +176,11 @@ void watchdogReset() { // LOAD ADDRESS uint16_t newAddress; newAddress = getch(); - 1fc78: 92 d0 rcall .+292 ; 0x1fd9e + 1fc78: a1 d0 rcall .+322 ; 0x1fdbc newAddress = (newAddress & 0xff) | (getch() << 8); 1fc7a: 08 2f mov r16, r24 1fc7c: 10 e0 ldi r17, 0x00 ; 0 - 1fc7e: 8f d0 rcall .+286 ; 0x1fd9e + 1fc7e: 9e d0 rcall .+316 ; 0x1fdbc 1fc80: 90 e0 ldi r25, 0x00 ; 0 1fc82: 98 2f mov r25, r24 1fc84: 88 27 eor r24, r24 @@ -201,7 +201,7 @@ void watchdogReset() { address = newAddress; 1fc98: 90 93 01 04 sts 0x0401, r25 1fc9c: 80 93 00 04 sts 0x0400, r24 - 1fca0: 72 c0 rjmp .+228 ; 0x1fd86 + 1fca0: 81 c0 rjmp .+258 ; 0x1fda4 verifySpace(); } else if(ch == STK_UNIVERSAL) { @@ -210,324 +210,341 @@ void watchdogReset() { // UNIVERSAL command is ignored getNch(4); 1fca6: 84 e0 ldi r24, 0x04 ; 4 - 1fca8: 98 d0 rcall .+304 ; 0x1fdda + 1fca8: a7 d0 rcall .+334 ; 0x1fdf8 putch(0x00); 1fcaa: 80 e0 ldi r24, 0x00 ; 0 - 1fcac: 70 d0 rcall .+224 ; 0x1fd8e - 1fcae: 6c c0 rjmp .+216 ; 0x1fd88 + 1fcac: 7f d0 rcall .+254 ; 0x1fdac + 1fcae: 7b c0 rjmp .+246 ; 0x1fda6 } /* Write memory, length is big endian and is in bytes */ else if(ch == STK_PROG_PAGE) { 1fcb0: 84 36 cpi r24, 0x64 ; 100 1fcb2: 09 f0 breq .+2 ; 0x1fcb6 - 1fcb4: 3f c0 rjmp .+126 ; 0x1fd34 + 1fcb4: 4e c0 rjmp .+156 ; 0x1fd52 // PROGRAM PAGE - we support flash programming only, not EEPROM uint8_t *bufPtr; uint16_t addrPtr; getLen(); - 1fcb6: 7b d0 rcall .+246 ; 0x1fdae + 1fcb6: 8a d0 rcall .+276 ; 0x1fdcc - // Immediately start page erase - this will 4.5ms - __boot_page_erase_short((uint16_t)(void*)address); + // If we are in RWW section, immediately start page erase + if (address < NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); 1fcb8: e0 91 00 04 lds r30, 0x0400 1fcbc: f0 91 01 04 lds r31, 0x0401 - 1fcc0: 83 e0 ldi r24, 0x03 ; 3 - 1fcc2: 87 bf out 0x37, r24 ; 55 - 1fcc4: e8 95 spm - 1fcc6: c0 e0 ldi r28, 0x00 ; 0 - 1fcc8: d2 e0 ldi r29, 0x02 ; 2 + 1fcc0: 80 ee ldi r24, 0xE0 ; 224 + 1fcc2: e0 30 cpi r30, 0x00 ; 0 + 1fcc4: f8 07 cpc r31, r24 + 1fcc6: 18 f4 brcc .+6 ; 0x1fcce + 1fcc8: 83 e0 ldi r24, 0x03 ; 3 + 1fcca: 87 bf out 0x37, r24 ; 55 + 1fccc: e8 95 spm + 1fcce: c0 e0 ldi r28, 0x00 ; 0 + 1fcd0: d2 e0 ldi r29, 0x02 ; 2 // While that is going on, read in page contents bufPtr = buff; do *bufPtr++ = getch(); - 1fcca: 69 d0 rcall .+210 ; 0x1fd9e - 1fccc: 89 93 st Y+, r24 + 1fcd2: 74 d0 rcall .+232 ; 0x1fdbc + 1fcd4: 89 93 st Y+, r24 while (--length); - 1fcce: 80 91 02 04 lds r24, 0x0402 - 1fcd2: 81 50 subi r24, 0x01 ; 1 - 1fcd4: 80 93 02 04 sts 0x0402, r24 - 1fcd8: 88 23 and r24, r24 - 1fcda: b9 f7 brne .-18 ; 0x1fcca + 1fcd6: 80 91 02 04 lds r24, 0x0402 + 1fcda: 81 50 subi r24, 0x01 ; 1 + 1fcdc: 80 93 02 04 sts 0x0402, r24 + 1fce0: 88 23 and r24, r24 + 1fce2: b9 f7 brne .-18 ; 0x1fcd2 + + // If we are in NRWW section, page erase has to be delayed until now. + // Todo: Take RAMPZ into account + if (address >= NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); + 1fce4: e0 91 00 04 lds r30, 0x0400 + 1fce8: f0 91 01 04 lds r31, 0x0401 + 1fcec: 80 ee ldi r24, 0xE0 ; 224 + 1fcee: e0 30 cpi r30, 0x00 ; 0 + 1fcf0: f8 07 cpc r31, r24 + 1fcf2: 18 f0 brcs .+6 ; 0x1fcfa + 1fcf4: 83 e0 ldi r24, 0x03 ; 3 + 1fcf6: 87 bf out 0x37, r24 ; 55 + 1fcf8: e8 95 spm // Read command terminator, start reply verifySpace(); - 1fcdc: 78 d0 rcall .+240 ; 0x1fdce + 1fcfa: 78 d0 rcall .+240 ; 0x1fdec // If only a partial page is to be programmed, the erase might not be complete. // So check that here boot_spm_busy_wait(); - 1fcde: 07 b6 in r0, 0x37 ; 55 - 1fce0: 00 fc sbrc r0, 0 - 1fce2: fd cf rjmp .-6 ; 0x1fcde + 1fcfc: 07 b6 in r0, 0x37 ; 55 + 1fcfe: 00 fc sbrc r0, 0 + 1fd00: fd cf rjmp .-6 ; 0x1fcfc } #endif // Copy buffer into programming buffer bufPtr = buff; addrPtr = (uint16_t)(void*)address; - 1fce4: 40 91 00 04 lds r20, 0x0400 - 1fce8: 50 91 01 04 lds r21, 0x0401 - 1fcec: a0 e0 ldi r26, 0x00 ; 0 - 1fcee: b2 e0 ldi r27, 0x02 ; 2 + 1fd02: 40 91 00 04 lds r20, 0x0400 + 1fd06: 50 91 01 04 lds r21, 0x0401 + 1fd0a: a0 e0 ldi r26, 0x00 ; 0 + 1fd0c: b2 e0 ldi r27, 0x02 ; 2 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; - 1fcf0: 2c 91 ld r18, X - 1fcf2: 30 e0 ldi r19, 0x00 ; 0 + 1fd0e: 2c 91 ld r18, X + 1fd10: 30 e0 ldi r19, 0x00 ; 0 a |= (*bufPtr++) << 8; - 1fcf4: 11 96 adiw r26, 0x01 ; 1 - 1fcf6: 8c 91 ld r24, X - 1fcf8: 11 97 sbiw r26, 0x01 ; 1 - 1fcfa: 90 e0 ldi r25, 0x00 ; 0 - 1fcfc: 98 2f mov r25, r24 - 1fcfe: 88 27 eor r24, r24 - 1fd00: 82 2b or r24, r18 - 1fd02: 93 2b or r25, r19 + 1fd12: 11 96 adiw r26, 0x01 ; 1 + 1fd14: 8c 91 ld r24, X + 1fd16: 11 97 sbiw r26, 0x01 ; 1 + 1fd18: 90 e0 ldi r25, 0x00 ; 0 + 1fd1a: 98 2f mov r25, r24 + 1fd1c: 88 27 eor r24, r24 + 1fd1e: 82 2b or r24, r18 + 1fd20: 93 2b or r25, r19 #define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #endif /* main program starts here */ int main(void) { - 1fd04: 12 96 adiw r26, 0x02 ; 2 + 1fd22: 12 96 adiw r26, 0x02 ; 2 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; a |= (*bufPtr++) << 8; __boot_page_fill_short((uint16_t)(void*)addrPtr,a); - 1fd06: fa 01 movw r30, r20 - 1fd08: 0c 01 movw r0, r24 - 1fd0a: d7 be out 0x37, r13 ; 55 - 1fd0c: e8 95 spm - 1fd0e: 11 24 eor r1, r1 + 1fd24: fa 01 movw r30, r20 + 1fd26: 0c 01 movw r0, r24 + 1fd28: e7 be out 0x37, r14 ; 55 + 1fd2a: e8 95 spm + 1fd2c: 11 24 eor r1, r1 addrPtr += 2; - 1fd10: 4e 5f subi r20, 0xFE ; 254 - 1fd12: 5f 4f sbci r21, 0xFF ; 255 + 1fd2e: 4e 5f subi r20, 0xFE ; 254 + 1fd30: 5f 4f sbci r21, 0xFF ; 255 } while (--ch); - 1fd14: f3 e0 ldi r31, 0x03 ; 3 - 1fd16: a0 30 cpi r26, 0x00 ; 0 - 1fd18: bf 07 cpc r27, r31 - 1fd1a: 51 f7 brne .-44 ; 0x1fcf0 + 1fd32: f3 e0 ldi r31, 0x03 ; 3 + 1fd34: a0 30 cpi r26, 0x00 ; 0 + 1fd36: bf 07 cpc r27, r31 + 1fd38: 51 f7 brne .-44 ; 0x1fd0e // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); - 1fd1c: e0 91 00 04 lds r30, 0x0400 - 1fd20: f0 91 01 04 lds r31, 0x0401 - 1fd24: e7 be out 0x37, r14 ; 55 - 1fd26: e8 95 spm + 1fd3a: e0 91 00 04 lds r30, 0x0400 + 1fd3e: f0 91 01 04 lds r31, 0x0401 + 1fd42: d7 be out 0x37, r13 ; 55 + 1fd44: e8 95 spm boot_spm_busy_wait(); - 1fd28: 07 b6 in r0, 0x37 ; 55 - 1fd2a: 00 fc sbrc r0, 0 - 1fd2c: fd cf rjmp .-6 ; 0x1fd28 + 1fd46: 07 b6 in r0, 0x37 ; 55 + 1fd48: 00 fc sbrc r0, 0 + 1fd4a: fd cf rjmp .-6 ; 0x1fd46 #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); - 1fd2e: f7 be out 0x37, r15 ; 55 - 1fd30: e8 95 spm - 1fd32: 2a c0 rjmp .+84 ; 0x1fd88 + 1fd4c: f7 be out 0x37, r15 ; 55 + 1fd4e: e8 95 spm + 1fd50: 2a c0 rjmp .+84 ; 0x1fda6 #endif } /* Read memory block mode, length is big endian. */ else if(ch == STK_READ_PAGE) { - 1fd34: 84 37 cpi r24, 0x74 ; 116 - 1fd36: d1 f4 brne .+52 ; 0x1fd6c + 1fd52: 84 37 cpi r24, 0x74 ; 116 + 1fd54: d1 f4 brne .+52 ; 0x1fd8a // READ PAGE - we only read flash getLen(); - 1fd38: 3a d0 rcall .+116 ; 0x1fdae + 1fd56: 3a d0 rcall .+116 ; 0x1fdcc verifySpace(); - 1fd3a: 49 d0 rcall .+146 ; 0x1fdce + 1fd58: 49 d0 rcall .+146 ; 0x1fdec #ifdef __AVR_ATmega1280__ // do putch(pgm_read_byte_near(address++)); // while (--length); do { uint8_t result; __asm__ ("elpm %0,Z\n":"=r"(result):"z"(address)); - 1fd3c: e0 91 00 04 lds r30, 0x0400 - 1fd40: f0 91 01 04 lds r31, 0x0401 - 1fd44: e6 91 elpm r30, Z+ + 1fd5a: e0 91 00 04 lds r30, 0x0400 + 1fd5e: f0 91 01 04 lds r31, 0x0401 + 1fd62: e6 91 elpm r30, Z+ putch(result); - 1fd46: 8e 2f mov r24, r30 - 1fd48: 22 d0 rcall .+68 ; 0x1fd8e + 1fd64: 8e 2f mov r24, r30 + 1fd66: 22 d0 rcall .+68 ; 0x1fdac address++; - 1fd4a: 80 91 00 04 lds r24, 0x0400 - 1fd4e: 90 91 01 04 lds r25, 0x0401 - 1fd52: 01 96 adiw r24, 0x01 ; 1 - 1fd54: 90 93 01 04 sts 0x0401, r25 - 1fd58: 80 93 00 04 sts 0x0400, r24 + 1fd68: 80 91 00 04 lds r24, 0x0400 + 1fd6c: 90 91 01 04 lds r25, 0x0401 + 1fd70: 01 96 adiw r24, 0x01 ; 1 + 1fd72: 90 93 01 04 sts 0x0401, r25 + 1fd76: 80 93 00 04 sts 0x0400, r24 } while (--length); - 1fd5c: 80 91 02 04 lds r24, 0x0402 - 1fd60: 81 50 subi r24, 0x01 ; 1 - 1fd62: 80 93 02 04 sts 0x0402, r24 - 1fd66: 88 23 and r24, r24 - 1fd68: 49 f7 brne .-46 ; 0x1fd3c - 1fd6a: 0e c0 rjmp .+28 ; 0x1fd88 + 1fd7a: 80 91 02 04 lds r24, 0x0402 + 1fd7e: 81 50 subi r24, 0x01 ; 1 + 1fd80: 80 93 02 04 sts 0x0402, r24 + 1fd84: 88 23 and r24, r24 + 1fd86: 49 f7 brne .-46 ; 0x1fd5a + 1fd88: 0e c0 rjmp .+28 ; 0x1fda6 #endif #endif } /* Get device signature bytes */ else if(ch == STK_READ_SIGN) { - 1fd6c: 85 37 cpi r24, 0x75 ; 117 - 1fd6e: 39 f4 brne .+14 ; 0x1fd7e + 1fd8a: 85 37 cpi r24, 0x75 ; 117 + 1fd8c: 39 f4 brne .+14 ; 0x1fd9c // READ SIGN - return what Avrdude wants to hear verifySpace(); - 1fd70: 2e d0 rcall .+92 ; 0x1fdce + 1fd8e: 2e d0 rcall .+92 ; 0x1fdec putch(SIGNATURE_0); - 1fd72: 8e e1 ldi r24, 0x1E ; 30 - 1fd74: 0c d0 rcall .+24 ; 0x1fd8e + 1fd90: 8e e1 ldi r24, 0x1E ; 30 + 1fd92: 0c d0 rcall .+24 ; 0x1fdac putch(SIGNATURE_1); - 1fd76: 87 e9 ldi r24, 0x97 ; 151 - 1fd78: 0a d0 rcall .+20 ; 0x1fd8e + 1fd94: 87 e9 ldi r24, 0x97 ; 151 + 1fd96: 0a d0 rcall .+20 ; 0x1fdac putch(SIGNATURE_2); - 1fd7a: 83 e0 ldi r24, 0x03 ; 3 - 1fd7c: 97 cf rjmp .-210 ; 0x1fcac + 1fd98: 83 e0 ldi r24, 0x03 ; 3 + 1fd9a: 88 cf rjmp .-240 ; 0x1fcac } else if (ch == 'Q') { - 1fd7e: 81 35 cpi r24, 0x51 ; 81 - 1fd80: 11 f4 brne .+4 ; 0x1fd86 + 1fd9c: 81 35 cpi r24, 0x51 ; 81 + 1fd9e: 11 f4 brne .+4 ; 0x1fda4 // Adaboot no-wait mod watchdogConfig(WATCHDOG_16MS); - 1fd82: 88 e0 ldi r24, 0x08 ; 8 - 1fd84: 19 d0 rcall .+50 ; 0x1fdb8 + 1fda0: 88 e0 ldi r24, 0x08 ; 8 + 1fda2: 19 d0 rcall .+50 ; 0x1fdd6 verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); - 1fd86: 23 d0 rcall .+70 ; 0x1fdce + 1fda4: 23 d0 rcall .+70 ; 0x1fdec } putch(STK_OK); - 1fd88: 80 e1 ldi r24, 0x10 ; 16 - 1fd8a: 01 d0 rcall .+2 ; 0x1fd8e - 1fd8c: 64 cf rjmp .-312 ; 0x1fc56 + 1fda6: 80 e1 ldi r24, 0x10 ; 16 + 1fda8: 01 d0 rcall .+2 ; 0x1fdac + 1fdaa: 55 cf rjmp .-342 ; 0x1fc56 -0001fd8e : +0001fdac : } } void putch(char ch) { - 1fd8e: 98 2f mov r25, r24 + 1fdac: 98 2f mov r25, r24 #ifndef SOFT_UART while (!(UCSR0A & _BV(UDRE0))); - 1fd90: 80 91 c0 00 lds r24, 0x00C0 - 1fd94: 85 ff sbrs r24, 5 - 1fd96: fc cf rjmp .-8 ; 0x1fd90 + 1fdae: 80 91 c0 00 lds r24, 0x00C0 + 1fdb2: 85 ff sbrs r24, 5 + 1fdb4: fc cf rjmp .-8 ; 0x1fdae UDR0 = ch; - 1fd98: 90 93 c6 00 sts 0x00C6, r25 + 1fdb6: 90 93 c6 00 sts 0x00C6, r25 [uartBit] "I" (UART_TX_BIT) : "r25" ); #endif } - 1fd9c: 08 95 ret + 1fdba: 08 95 ret -0001fd9e : +0001fdbc : return getch(); } // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( - 1fd9e: a8 95 wdr + 1fdbc: a8 95 wdr [uartBit] "I" (UART_RX_BIT) : "r25" ); #else while(!(UCSR0A & _BV(RXC0))); - 1fda0: 80 91 c0 00 lds r24, 0x00C0 - 1fda4: 87 ff sbrs r24, 7 - 1fda6: fc cf rjmp .-8 ; 0x1fda0 + 1fdbe: 80 91 c0 00 lds r24, 0x00C0 + 1fdc2: 87 ff sbrs r24, 7 + 1fdc4: fc cf rjmp .-8 ; 0x1fdbe ch = UDR0; - 1fda8: 80 91 c6 00 lds r24, 0x00C6 + 1fdc6: 80 91 c6 00 lds r24, 0x00C6 #ifdef LED_DATA_FLASH LED_PIN |= _BV(LED); #endif return ch; } - 1fdac: 08 95 ret + 1fdca: 08 95 ret -0001fdae : +0001fdcc : } while (--count); } #endif uint8_t getLen() { getch(); - 1fdae: f7 df rcall .-18 ; 0x1fd9e + 1fdcc: f7 df rcall .-18 ; 0x1fdbc length = getch(); - 1fdb0: f6 df rcall .-20 ; 0x1fd9e - 1fdb2: 80 93 02 04 sts 0x0402, r24 + 1fdce: f6 df rcall .-20 ; 0x1fdbc + 1fdd0: 80 93 02 04 sts 0x0402, r24 return getch(); } - 1fdb6: f3 cf rjmp .-26 ; 0x1fd9e + 1fdd4: f3 cf rjmp .-26 ; 0x1fdbc -0001fdb8 : +0001fdd6 : "wdr\n" ); } void watchdogConfig(uint8_t x) { WDTCSR = _BV(WDCE) | _BV(WDE); - 1fdb8: e0 e6 ldi r30, 0x60 ; 96 - 1fdba: f0 e0 ldi r31, 0x00 ; 0 - 1fdbc: 98 e1 ldi r25, 0x18 ; 24 - 1fdbe: 90 83 st Z, r25 + 1fdd6: e0 e6 ldi r30, 0x60 ; 96 + 1fdd8: f0 e0 ldi r31, 0x00 ; 0 + 1fdda: 98 e1 ldi r25, 0x18 ; 24 + 1fddc: 90 83 st Z, r25 WDTCSR = x; - 1fdc0: 80 83 st Z, r24 + 1fdde: 80 83 st Z, r24 } - 1fdc2: 08 95 ret + 1fde0: 08 95 ret -0001fdc4 : +0001fde2 : void appStart() { watchdogConfig(WATCHDOG_OFF); - 1fdc4: 80 e0 ldi r24, 0x00 ; 0 - 1fdc6: f8 df rcall .-16 ; 0x1fdb8 + 1fde2: 80 e0 ldi r24, 0x00 ; 0 + 1fde4: f8 df rcall .-16 ; 0x1fdd6 __asm__ __volatile__ ( - 1fdc8: ee 27 eor r30, r30 - 1fdca: ff 27 eor r31, r31 - 1fdcc: 09 94 ijmp + 1fde6: ee 27 eor r30, r30 + 1fde8: ff 27 eor r31, r31 + 1fdea: 09 94 ijmp -0001fdce : +0001fdec : do getch(); while (--count); verifySpace(); } void verifySpace() { if (getch() != CRC_EOP) appStart(); - 1fdce: e7 df rcall .-50 ; 0x1fd9e - 1fdd0: 80 32 cpi r24, 0x20 ; 32 - 1fdd2: 09 f0 breq .+2 ; 0x1fdd6 - 1fdd4: f7 df rcall .-18 ; 0x1fdc4 + 1fdec: e7 df rcall .-50 ; 0x1fdbc + 1fdee: 80 32 cpi r24, 0x20 ; 32 + 1fdf0: 09 f0 breq .+2 ; 0x1fdf4 + 1fdf2: f7 df rcall .-18 ; 0x1fde2 putch(STK_INSYNC); - 1fdd6: 84 e1 ldi r24, 0x14 ; 20 + 1fdf4: 84 e1 ldi r24, 0x14 ; 20 } - 1fdd8: da cf rjmp .-76 ; 0x1fd8e + 1fdf6: da cf rjmp .-76 ; 0x1fdac ::[count] "M" (UART_B_VALUE) ); } #endif void getNch(uint8_t count) { - 1fdda: 1f 93 push r17 - 1fddc: 18 2f mov r17, r24 + 1fdf8: 1f 93 push r17 + 1fdfa: 18 2f mov r17, r24 -0001fdde : +0001fdfc : do getch(); while (--count); - 1fdde: df df rcall .-66 ; 0x1fd9e - 1fde0: 11 50 subi r17, 0x01 ; 1 - 1fde2: e9 f7 brne .-6 ; 0x1fdde + 1fdfc: df df rcall .-66 ; 0x1fdbc + 1fdfe: 11 50 subi r17, 0x01 ; 1 + 1fe00: e9 f7 brne .-6 ; 0x1fdfc verifySpace(); - 1fde4: f4 df rcall .-24 ; 0x1fdce + 1fe02: f4 df rcall .-24 ; 0x1fdec } - 1fde6: 1f 91 pop r17 - 1fde8: 08 95 ret + 1fe04: 1f 91 pop r17 + 1fe06: 08 95 ret diff --git a/optiboot/bootloaders/optiboot/optiboot_atmega328.hex b/optiboot/bootloaders/optiboot/optiboot_atmega328.hex index 3017ee9..6870cfe 100644 --- a/optiboot/bootloaders/optiboot/optiboot_atmega328.hex +++ b/optiboot/bootloaders/optiboot/optiboot_atmega328.hex @@ -1,32 +1,34 @@ :107E000085E08093810082E08093C00088E18093C8 :107E1000C10086E08093C20080E18093C40084B7F3 -:107E200014BE81FFC8D08DE0C0D0259A86E020E343 +:107E200014BE81FFD7D08DE0CFD0259A86E020E325 :107E30003CEF91E0309385002093840096BBB09B8B :107E4000FECF1D9AA8958150A9F7DD24D394A5E013 -:107E5000FA2EF1E1EF2E9CD0813421F481E0B6D0EE +:107E5000EA2EF1E1FF2EABD0813421F481E0C5D0D0 :107E600083E020C0823411F484E103C0853419F426 -:107E700085E0ACD082C0853581F48AD0082F10E02F -:107E800087D090E0982F8827802B912B880F991FFF -:107E900090930102809300026FC0863529F484E03C -:107EA00095D080E06DD069C0843609F03FC078D0AD -:107EB000E0910002F091010283E087BFE895C0E005 -:107EC000D1E066D0899380910202815080930202B2 -:107ED0008823B9F775D007B600FCFDCF40910002AA -:107EE00050910102A0E0B1E02C9130E011968C910C -:107EF000119790E0982F8827822B932B1296FA01E6 -:107F00000C01D7BEE89511244E5F5F4FF1E0A03819 -:107F1000BF0751F7E0910002F0910102F7BEE8952A -:107F200007B600FCFDCFE7BEE89527C08437B9F45B -:107F300037D046D0E0910002F09101023196F093E3 -:107F40000102E09300023197E4918E2F19D08091C5 -:107F50000202815080930202882361F70EC08537A8 -:107F600039F42ED08EE10CD085E90AD08FE09ACF7B -:107F7000813511F488E019D023D080E101D06BCF96 -:107F8000982F8091C00085FFFCCF9093C600089584 -:107F9000A8958091C00087FFFCCF8091C60008950E -:107FA000F7DFF6DF80930202F3CFE0E6F0E098E13E -:107FB00090838083089580E0F8DFEE27FF270994FF -:107FC000E7DF803209F0F7DF84E1DACF1F93182F63 -:0C7FD000DFDF1150E9F7F4DF1F91089586 +:107E700085E0BBD091C0853581F499D0082F10E002 +:107E800096D090E0982F8827802B912B880F991FF0 +:107E900090930102809300027EC0863529F484E02D +:107EA000A4D080E07CD078C0843609F04EC087D062 +:107EB000E0910002F091010280E7E030F80718F449 +:107EC00083E087BFE895C0E0D1E071D089938091CD +:107ED00002028150809302028823B9F7E0910002E8 +:107EE000F091010280E7E030F80718F083E087BFE7 +:107EF000E89575D007B600FCFDCF40910002509187 +:107F00000102A0E0B1E02C9130E011968C91119724 +:107F100090E0982F8827822B932B1296FA010C0160 +:107F2000D7BEE89511244E5F5F4FF1E0A038BF0740 +:107F300051F7E0910002F0910102E7BEE89507B623 +:107F400000FCFDCFF7BEE89527C08437B9F437D0E1 +:107F500046D0E0910002F09101023196F0930102C7 +:107F6000E09300023197E4918E2F19D080910202A4 +:107F7000815080930202882361F70EC0853739F45F +:107F80002ED08EE10CD085E90AD08FE08BCF8135E1 +:107F900011F488E019D023D080E101D05CCF982F74 +:107FA0008091C00085FFFCCF9093C6000895A895EE +:107FB0008091C00087FFFCCF8091C6000895F7DF55 +:107FC000F6DF80930202F3CFE0E6F0E098E19083E1 +:107FD0008083089580E0F8DFEE27FF270994E7DF2C +:107FE000803209F0F7DF84E1DACF1F93182FDFDF4B +:0A7FF0001150E9F7F4DF1F91089526 :0400000300007E007B :00000001FF diff --git a/optiboot/bootloaders/optiboot/optiboot_atmega328.lst b/optiboot/bootloaders/optiboot/optiboot_atmega328.lst index 52af293..75dad85 100644 --- a/optiboot/bootloaders/optiboot/optiboot_atmega328.lst +++ b/optiboot/bootloaders/optiboot/optiboot_atmega328.lst @@ -3,25 +3,25 @@ optiboot_atmega328.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn - 0 .text 000001dc 00007e00 00007e00 00000054 2**1 + 0 .text 000001fa 00007e00 00007e00 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .debug_aranges 00000028 00000000 00000000 00000230 2**0 + 1 .debug_aranges 00000028 00000000 00000000 0000024e 2**0 CONTENTS, READONLY, DEBUGGING - 2 .debug_pubnames 0000006a 00000000 00000000 00000258 2**0 + 2 .debug_pubnames 0000006a 00000000 00000000 00000276 2**0 CONTENTS, READONLY, DEBUGGING - 3 .debug_info 00000283 00000000 00000000 000002c2 2**0 + 3 .debug_info 00000284 00000000 00000000 000002e0 2**0 CONTENTS, READONLY, DEBUGGING - 4 .debug_abbrev 000001ae 00000000 00000000 00000545 2**0 + 4 .debug_abbrev 000001ae 00000000 00000000 00000564 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_line 000003db 00000000 00000000 000006f3 2**0 + 5 .debug_line 000003e3 00000000 00000000 00000712 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_frame 00000090 00000000 00000000 00000ad0 2**2 + 6 .debug_frame 00000090 00000000 00000000 00000af8 2**2 CONTENTS, READONLY, DEBUGGING - 7 .debug_str 00000140 00000000 00000000 00000b60 2**0 + 7 .debug_str 00000140 00000000 00000000 00000b88 2**0 CONTENTS, READONLY, DEBUGGING - 8 .debug_loc 000001d1 00000000 00000000 00000ca0 2**0 + 8 .debug_loc 000001e1 00000000 00000000 00000cc8 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_ranges 00000068 00000000 00000000 00000e71 2**0 + 9 .debug_ranges 00000068 00000000 00000000 00000ea9 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: @@ -61,12 +61,12 @@ int main(void) { 7e20: 14 be out 0x34, r1 ; 52 if (!(ch & _BV(EXTRF))) appStart(); 7e22: 81 ff sbrs r24, 1 - 7e24: c8 d0 rcall .+400 ; 0x7fb6 + 7e24: d7 d0 rcall .+430 ; 0x7fd4 // Set up watchdog to trigger after 500ms watchdogConfig(WATCHDOG_500MS); 7e26: 8d e0 ldi r24, 0x0D ; 13 - 7e28: c0 d0 rcall .+384 ; 0x7faa + 7e28: cf d0 rcall .+414 ; 0x7fc8 /* Set LED pin as output */ LED_DDR |= _BV(LED); @@ -127,21 +127,21 @@ void watchdogReset() { // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); 7e4e: a5 e0 ldi r26, 0x05 ; 5 - 7e50: fa 2e mov r15, r26 + 7e50: ea 2e mov r14, r26 boot_spm_busy_wait(); #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); 7e52: f1 e1 ldi r31, 0x11 ; 17 - 7e54: ef 2e mov r14, r31 + 7e54: ff 2e mov r15, r31 #endif /* Forever loop */ for (;;) { /* get character from UART */ ch = getch(); - 7e56: 9c d0 rcall .+312 ; 0x7f90 + 7e56: ab d0 rcall .+342 ; 0x7fae if(ch == STK_GET_PARAMETER) { 7e58: 81 34 cpi r24, 0x41 ; 65 @@ -149,7 +149,7 @@ void watchdogReset() { // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy getNch(1); 7e5c: 81 e0 ldi r24, 0x01 ; 1 - 7e5e: b6 d0 rcall .+364 ; 0x7fcc + 7e5e: c5 d0 rcall .+394 ; 0x7fea putch(0x03); 7e60: 83 e0 ldi r24, 0x03 ; 3 7e62: 20 c0 rjmp .+64 ; 0x7ea4 @@ -168,8 +168,8 @@ void watchdogReset() { // SET DEVICE EXT is ignored getNch(5); 7e70: 85 e0 ldi r24, 0x05 ; 5 - 7e72: ac d0 rcall .+344 ; 0x7fcc - 7e74: 82 c0 rjmp .+260 ; 0x7f7a + 7e72: bb d0 rcall .+374 ; 0x7fea + 7e74: 91 c0 rjmp .+290 ; 0x7f98 } else if(ch == STK_LOAD_ADDRESS) { 7e76: 85 35 cpi r24, 0x55 ; 85 @@ -177,11 +177,11 @@ void watchdogReset() { // LOAD ADDRESS uint16_t newAddress; newAddress = getch(); - 7e7a: 8a d0 rcall .+276 ; 0x7f90 + 7e7a: 99 d0 rcall .+306 ; 0x7fae newAddress = (newAddress & 0xff) | (getch() << 8); 7e7c: 08 2f mov r16, r24 7e7e: 10 e0 ldi r17, 0x00 ; 0 - 7e80: 87 d0 rcall .+270 ; 0x7f90 + 7e80: 96 d0 rcall .+300 ; 0x7fae 7e82: 90 e0 ldi r25, 0x00 ; 0 7e84: 98 2f mov r25, r24 7e86: 88 27 eor r24, r24 @@ -197,7 +197,7 @@ void watchdogReset() { address = newAddress; 7e90: 90 93 01 02 sts 0x0201, r25 7e94: 80 93 00 02 sts 0x0200, r24 - 7e98: 6f c0 rjmp .+222 ; 0x7f78 + 7e98: 7e c0 rjmp .+252 ; 0x7f96 verifySpace(); } else if(ch == STK_UNIVERSAL) { @@ -206,320 +206,337 @@ void watchdogReset() { // UNIVERSAL command is ignored getNch(4); 7e9e: 84 e0 ldi r24, 0x04 ; 4 - 7ea0: 95 d0 rcall .+298 ; 0x7fcc + 7ea0: a4 d0 rcall .+328 ; 0x7fea putch(0x00); 7ea2: 80 e0 ldi r24, 0x00 ; 0 - 7ea4: 6d d0 rcall .+218 ; 0x7f80 - 7ea6: 69 c0 rjmp .+210 ; 0x7f7a + 7ea4: 7c d0 rcall .+248 ; 0x7f9e + 7ea6: 78 c0 rjmp .+240 ; 0x7f98 } /* Write memory, length is big endian and is in bytes */ else if(ch == STK_PROG_PAGE) { 7ea8: 84 36 cpi r24, 0x64 ; 100 7eaa: 09 f0 breq .+2 ; 0x7eae - 7eac: 3f c0 rjmp .+126 ; 0x7f2c + 7eac: 4e c0 rjmp .+156 ; 0x7f4a // PROGRAM PAGE - we support flash programming only, not EEPROM uint8_t *bufPtr; uint16_t addrPtr; getLen(); - 7eae: 78 d0 rcall .+240 ; 0x7fa0 + 7eae: 87 d0 rcall .+270 ; 0x7fbe - // Immediately start page erase - this will 4.5ms - __boot_page_erase_short((uint16_t)(void*)address); + // If we are in RWW section, immediately start page erase + if (address < NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); 7eb0: e0 91 00 02 lds r30, 0x0200 7eb4: f0 91 01 02 lds r31, 0x0201 - 7eb8: 83 e0 ldi r24, 0x03 ; 3 - 7eba: 87 bf out 0x37, r24 ; 55 - 7ebc: e8 95 spm - 7ebe: c0 e0 ldi r28, 0x00 ; 0 - 7ec0: d1 e0 ldi r29, 0x01 ; 1 + 7eb8: 80 e7 ldi r24, 0x70 ; 112 + 7eba: e0 30 cpi r30, 0x00 ; 0 + 7ebc: f8 07 cpc r31, r24 + 7ebe: 18 f4 brcc .+6 ; 0x7ec6 + 7ec0: 83 e0 ldi r24, 0x03 ; 3 + 7ec2: 87 bf out 0x37, r24 ; 55 + 7ec4: e8 95 spm + 7ec6: c0 e0 ldi r28, 0x00 ; 0 + 7ec8: d1 e0 ldi r29, 0x01 ; 1 // While that is going on, read in page contents bufPtr = buff; do *bufPtr++ = getch(); - 7ec2: 66 d0 rcall .+204 ; 0x7f90 - 7ec4: 89 93 st Y+, r24 + 7eca: 71 d0 rcall .+226 ; 0x7fae + 7ecc: 89 93 st Y+, r24 while (--length); - 7ec6: 80 91 02 02 lds r24, 0x0202 - 7eca: 81 50 subi r24, 0x01 ; 1 - 7ecc: 80 93 02 02 sts 0x0202, r24 - 7ed0: 88 23 and r24, r24 - 7ed2: b9 f7 brne .-18 ; 0x7ec2 + 7ece: 80 91 02 02 lds r24, 0x0202 + 7ed2: 81 50 subi r24, 0x01 ; 1 + 7ed4: 80 93 02 02 sts 0x0202, r24 + 7ed8: 88 23 and r24, r24 + 7eda: b9 f7 brne .-18 ; 0x7eca + + // If we are in NRWW section, page erase has to be delayed until now. + // Todo: Take RAMPZ into account + if (address >= NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); + 7edc: e0 91 00 02 lds r30, 0x0200 + 7ee0: f0 91 01 02 lds r31, 0x0201 + 7ee4: 80 e7 ldi r24, 0x70 ; 112 + 7ee6: e0 30 cpi r30, 0x00 ; 0 + 7ee8: f8 07 cpc r31, r24 + 7eea: 18 f0 brcs .+6 ; 0x7ef2 + 7eec: 83 e0 ldi r24, 0x03 ; 3 + 7eee: 87 bf out 0x37, r24 ; 55 + 7ef0: e8 95 spm // Read command terminator, start reply verifySpace(); - 7ed4: 75 d0 rcall .+234 ; 0x7fc0 + 7ef2: 75 d0 rcall .+234 ; 0x7fde // If only a partial page is to be programmed, the erase might not be complete. // So check that here boot_spm_busy_wait(); - 7ed6: 07 b6 in r0, 0x37 ; 55 - 7ed8: 00 fc sbrc r0, 0 - 7eda: fd cf rjmp .-6 ; 0x7ed6 + 7ef4: 07 b6 in r0, 0x37 ; 55 + 7ef6: 00 fc sbrc r0, 0 + 7ef8: fd cf rjmp .-6 ; 0x7ef4 } #endif // Copy buffer into programming buffer bufPtr = buff; addrPtr = (uint16_t)(void*)address; - 7edc: 40 91 00 02 lds r20, 0x0200 - 7ee0: 50 91 01 02 lds r21, 0x0201 - 7ee4: a0 e0 ldi r26, 0x00 ; 0 - 7ee6: b1 e0 ldi r27, 0x01 ; 1 + 7efa: 40 91 00 02 lds r20, 0x0200 + 7efe: 50 91 01 02 lds r21, 0x0201 + 7f02: a0 e0 ldi r26, 0x00 ; 0 + 7f04: b1 e0 ldi r27, 0x01 ; 1 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; - 7ee8: 2c 91 ld r18, X - 7eea: 30 e0 ldi r19, 0x00 ; 0 + 7f06: 2c 91 ld r18, X + 7f08: 30 e0 ldi r19, 0x00 ; 0 a |= (*bufPtr++) << 8; - 7eec: 11 96 adiw r26, 0x01 ; 1 - 7eee: 8c 91 ld r24, X - 7ef0: 11 97 sbiw r26, 0x01 ; 1 - 7ef2: 90 e0 ldi r25, 0x00 ; 0 - 7ef4: 98 2f mov r25, r24 - 7ef6: 88 27 eor r24, r24 - 7ef8: 82 2b or r24, r18 - 7efa: 93 2b or r25, r19 + 7f0a: 11 96 adiw r26, 0x01 ; 1 + 7f0c: 8c 91 ld r24, X + 7f0e: 11 97 sbiw r26, 0x01 ; 1 + 7f10: 90 e0 ldi r25, 0x00 ; 0 + 7f12: 98 2f mov r25, r24 + 7f14: 88 27 eor r24, r24 + 7f16: 82 2b or r24, r18 + 7f18: 93 2b or r25, r19 #define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #endif /* main program starts here */ int main(void) { - 7efc: 12 96 adiw r26, 0x02 ; 2 + 7f1a: 12 96 adiw r26, 0x02 ; 2 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; a |= (*bufPtr++) << 8; __boot_page_fill_short((uint16_t)(void*)addrPtr,a); - 7efe: fa 01 movw r30, r20 - 7f00: 0c 01 movw r0, r24 - 7f02: d7 be out 0x37, r13 ; 55 - 7f04: e8 95 spm - 7f06: 11 24 eor r1, r1 + 7f1c: fa 01 movw r30, r20 + 7f1e: 0c 01 movw r0, r24 + 7f20: d7 be out 0x37, r13 ; 55 + 7f22: e8 95 spm + 7f24: 11 24 eor r1, r1 addrPtr += 2; - 7f08: 4e 5f subi r20, 0xFE ; 254 - 7f0a: 5f 4f sbci r21, 0xFF ; 255 + 7f26: 4e 5f subi r20, 0xFE ; 254 + 7f28: 5f 4f sbci r21, 0xFF ; 255 } while (--ch); - 7f0c: f1 e0 ldi r31, 0x01 ; 1 - 7f0e: a0 38 cpi r26, 0x80 ; 128 - 7f10: bf 07 cpc r27, r31 - 7f12: 51 f7 brne .-44 ; 0x7ee8 + 7f2a: f1 e0 ldi r31, 0x01 ; 1 + 7f2c: a0 38 cpi r26, 0x80 ; 128 + 7f2e: bf 07 cpc r27, r31 + 7f30: 51 f7 brne .-44 ; 0x7f06 // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); - 7f14: e0 91 00 02 lds r30, 0x0200 - 7f18: f0 91 01 02 lds r31, 0x0201 - 7f1c: f7 be out 0x37, r15 ; 55 - 7f1e: e8 95 spm + 7f32: e0 91 00 02 lds r30, 0x0200 + 7f36: f0 91 01 02 lds r31, 0x0201 + 7f3a: e7 be out 0x37, r14 ; 55 + 7f3c: e8 95 spm boot_spm_busy_wait(); - 7f20: 07 b6 in r0, 0x37 ; 55 - 7f22: 00 fc sbrc r0, 0 - 7f24: fd cf rjmp .-6 ; 0x7f20 + 7f3e: 07 b6 in r0, 0x37 ; 55 + 7f40: 00 fc sbrc r0, 0 + 7f42: fd cf rjmp .-6 ; 0x7f3e #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); - 7f26: e7 be out 0x37, r14 ; 55 - 7f28: e8 95 spm - 7f2a: 27 c0 rjmp .+78 ; 0x7f7a + 7f44: f7 be out 0x37, r15 ; 55 + 7f46: e8 95 spm + 7f48: 27 c0 rjmp .+78 ; 0x7f98 #endif } /* Read memory block mode, length is big endian. */ else if(ch == STK_READ_PAGE) { - 7f2c: 84 37 cpi r24, 0x74 ; 116 - 7f2e: b9 f4 brne .+46 ; 0x7f5e + 7f4a: 84 37 cpi r24, 0x74 ; 116 + 7f4c: b9 f4 brne .+46 ; 0x7f7c // READ PAGE - we only read flash getLen(); - 7f30: 37 d0 rcall .+110 ; 0x7fa0 + 7f4e: 37 d0 rcall .+110 ; 0x7fbe verifySpace(); - 7f32: 46 d0 rcall .+140 ; 0x7fc0 + 7f50: 46 d0 rcall .+140 ; 0x7fde putch(result); address++; } while (--length); #else do putch(pgm_read_byte_near(address++)); - 7f34: e0 91 00 02 lds r30, 0x0200 - 7f38: f0 91 01 02 lds r31, 0x0201 - 7f3c: 31 96 adiw r30, 0x01 ; 1 - 7f3e: f0 93 01 02 sts 0x0201, r31 - 7f42: e0 93 00 02 sts 0x0200, r30 - 7f46: 31 97 sbiw r30, 0x01 ; 1 - 7f48: e4 91 lpm r30, Z+ - 7f4a: 8e 2f mov r24, r30 - 7f4c: 19 d0 rcall .+50 ; 0x7f80 + 7f52: e0 91 00 02 lds r30, 0x0200 + 7f56: f0 91 01 02 lds r31, 0x0201 + 7f5a: 31 96 adiw r30, 0x01 ; 1 + 7f5c: f0 93 01 02 sts 0x0201, r31 + 7f60: e0 93 00 02 sts 0x0200, r30 + 7f64: 31 97 sbiw r30, 0x01 ; 1 + 7f66: e4 91 lpm r30, Z+ + 7f68: 8e 2f mov r24, r30 + 7f6a: 19 d0 rcall .+50 ; 0x7f9e while (--length); - 7f4e: 80 91 02 02 lds r24, 0x0202 - 7f52: 81 50 subi r24, 0x01 ; 1 - 7f54: 80 93 02 02 sts 0x0202, r24 - 7f58: 88 23 and r24, r24 - 7f5a: 61 f7 brne .-40 ; 0x7f34 - 7f5c: 0e c0 rjmp .+28 ; 0x7f7a + 7f6c: 80 91 02 02 lds r24, 0x0202 + 7f70: 81 50 subi r24, 0x01 ; 1 + 7f72: 80 93 02 02 sts 0x0202, r24 + 7f76: 88 23 and r24, r24 + 7f78: 61 f7 brne .-40 ; 0x7f52 + 7f7a: 0e c0 rjmp .+28 ; 0x7f98 #endif #endif } /* Get device signature bytes */ else if(ch == STK_READ_SIGN) { - 7f5e: 85 37 cpi r24, 0x75 ; 117 - 7f60: 39 f4 brne .+14 ; 0x7f70 + 7f7c: 85 37 cpi r24, 0x75 ; 117 + 7f7e: 39 f4 brne .+14 ; 0x7f8e // READ SIGN - return what Avrdude wants to hear verifySpace(); - 7f62: 2e d0 rcall .+92 ; 0x7fc0 + 7f80: 2e d0 rcall .+92 ; 0x7fde putch(SIGNATURE_0); - 7f64: 8e e1 ldi r24, 0x1E ; 30 - 7f66: 0c d0 rcall .+24 ; 0x7f80 + 7f82: 8e e1 ldi r24, 0x1E ; 30 + 7f84: 0c d0 rcall .+24 ; 0x7f9e putch(SIGNATURE_1); - 7f68: 85 e9 ldi r24, 0x95 ; 149 - 7f6a: 0a d0 rcall .+20 ; 0x7f80 + 7f86: 85 e9 ldi r24, 0x95 ; 149 + 7f88: 0a d0 rcall .+20 ; 0x7f9e putch(SIGNATURE_2); - 7f6c: 8f e0 ldi r24, 0x0F ; 15 - 7f6e: 9a cf rjmp .-204 ; 0x7ea4 + 7f8a: 8f e0 ldi r24, 0x0F ; 15 + 7f8c: 8b cf rjmp .-234 ; 0x7ea4 } else if (ch == 'Q') { - 7f70: 81 35 cpi r24, 0x51 ; 81 - 7f72: 11 f4 brne .+4 ; 0x7f78 + 7f8e: 81 35 cpi r24, 0x51 ; 81 + 7f90: 11 f4 brne .+4 ; 0x7f96 // Adaboot no-wait mod watchdogConfig(WATCHDOG_16MS); - 7f74: 88 e0 ldi r24, 0x08 ; 8 - 7f76: 19 d0 rcall .+50 ; 0x7faa + 7f92: 88 e0 ldi r24, 0x08 ; 8 + 7f94: 19 d0 rcall .+50 ; 0x7fc8 verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); - 7f78: 23 d0 rcall .+70 ; 0x7fc0 + 7f96: 23 d0 rcall .+70 ; 0x7fde } putch(STK_OK); - 7f7a: 80 e1 ldi r24, 0x10 ; 16 - 7f7c: 01 d0 rcall .+2 ; 0x7f80 - 7f7e: 6b cf rjmp .-298 ; 0x7e56 + 7f98: 80 e1 ldi r24, 0x10 ; 16 + 7f9a: 01 d0 rcall .+2 ; 0x7f9e + 7f9c: 5c cf rjmp .-328 ; 0x7e56 -00007f80 : +00007f9e : } } void putch(char ch) { - 7f80: 98 2f mov r25, r24 + 7f9e: 98 2f mov r25, r24 #ifndef SOFT_UART while (!(UCSR0A & _BV(UDRE0))); - 7f82: 80 91 c0 00 lds r24, 0x00C0 - 7f86: 85 ff sbrs r24, 5 - 7f88: fc cf rjmp .-8 ; 0x7f82 + 7fa0: 80 91 c0 00 lds r24, 0x00C0 + 7fa4: 85 ff sbrs r24, 5 + 7fa6: fc cf rjmp .-8 ; 0x7fa0 UDR0 = ch; - 7f8a: 90 93 c6 00 sts 0x00C6, r25 + 7fa8: 90 93 c6 00 sts 0x00C6, r25 [uartBit] "I" (UART_TX_BIT) : "r25" ); #endif } - 7f8e: 08 95 ret + 7fac: 08 95 ret -00007f90 : +00007fae : return getch(); } // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( - 7f90: a8 95 wdr + 7fae: a8 95 wdr [uartBit] "I" (UART_RX_BIT) : "r25" ); #else while(!(UCSR0A & _BV(RXC0))); - 7f92: 80 91 c0 00 lds r24, 0x00C0 - 7f96: 87 ff sbrs r24, 7 - 7f98: fc cf rjmp .-8 ; 0x7f92 + 7fb0: 80 91 c0 00 lds r24, 0x00C0 + 7fb4: 87 ff sbrs r24, 7 + 7fb6: fc cf rjmp .-8 ; 0x7fb0 ch = UDR0; - 7f9a: 80 91 c6 00 lds r24, 0x00C6 + 7fb8: 80 91 c6 00 lds r24, 0x00C6 #ifdef LED_DATA_FLASH LED_PIN |= _BV(LED); #endif return ch; } - 7f9e: 08 95 ret + 7fbc: 08 95 ret -00007fa0 : +00007fbe : } while (--count); } #endif uint8_t getLen() { getch(); - 7fa0: f7 df rcall .-18 ; 0x7f90 + 7fbe: f7 df rcall .-18 ; 0x7fae length = getch(); - 7fa2: f6 df rcall .-20 ; 0x7f90 - 7fa4: 80 93 02 02 sts 0x0202, r24 + 7fc0: f6 df rcall .-20 ; 0x7fae + 7fc2: 80 93 02 02 sts 0x0202, r24 return getch(); } - 7fa8: f3 cf rjmp .-26 ; 0x7f90 + 7fc6: f3 cf rjmp .-26 ; 0x7fae -00007faa : +00007fc8 : "wdr\n" ); } void watchdogConfig(uint8_t x) { WDTCSR = _BV(WDCE) | _BV(WDE); - 7faa: e0 e6 ldi r30, 0x60 ; 96 - 7fac: f0 e0 ldi r31, 0x00 ; 0 - 7fae: 98 e1 ldi r25, 0x18 ; 24 - 7fb0: 90 83 st Z, r25 + 7fc8: e0 e6 ldi r30, 0x60 ; 96 + 7fca: f0 e0 ldi r31, 0x00 ; 0 + 7fcc: 98 e1 ldi r25, 0x18 ; 24 + 7fce: 90 83 st Z, r25 WDTCSR = x; - 7fb2: 80 83 st Z, r24 + 7fd0: 80 83 st Z, r24 } - 7fb4: 08 95 ret + 7fd2: 08 95 ret -00007fb6 : +00007fd4 : void appStart() { watchdogConfig(WATCHDOG_OFF); - 7fb6: 80 e0 ldi r24, 0x00 ; 0 - 7fb8: f8 df rcall .-16 ; 0x7faa + 7fd4: 80 e0 ldi r24, 0x00 ; 0 + 7fd6: f8 df rcall .-16 ; 0x7fc8 __asm__ __volatile__ ( - 7fba: ee 27 eor r30, r30 - 7fbc: ff 27 eor r31, r31 - 7fbe: 09 94 ijmp + 7fd8: ee 27 eor r30, r30 + 7fda: ff 27 eor r31, r31 + 7fdc: 09 94 ijmp -00007fc0 : +00007fde : do getch(); while (--count); verifySpace(); } void verifySpace() { if (getch() != CRC_EOP) appStart(); - 7fc0: e7 df rcall .-50 ; 0x7f90 - 7fc2: 80 32 cpi r24, 0x20 ; 32 - 7fc4: 09 f0 breq .+2 ; 0x7fc8 - 7fc6: f7 df rcall .-18 ; 0x7fb6 + 7fde: e7 df rcall .-50 ; 0x7fae + 7fe0: 80 32 cpi r24, 0x20 ; 32 + 7fe2: 09 f0 breq .+2 ; 0x7fe6 + 7fe4: f7 df rcall .-18 ; 0x7fd4 putch(STK_INSYNC); - 7fc8: 84 e1 ldi r24, 0x14 ; 20 + 7fe6: 84 e1 ldi r24, 0x14 ; 20 } - 7fca: da cf rjmp .-76 ; 0x7f80 + 7fe8: da cf rjmp .-76 ; 0x7f9e ::[count] "M" (UART_B_VALUE) ); } #endif void getNch(uint8_t count) { - 7fcc: 1f 93 push r17 - 7fce: 18 2f mov r17, r24 + 7fea: 1f 93 push r17 + 7fec: 18 2f mov r17, r24 -00007fd0 : +00007fee : do getch(); while (--count); - 7fd0: df df rcall .-66 ; 0x7f90 - 7fd2: 11 50 subi r17, 0x01 ; 1 - 7fd4: e9 f7 brne .-6 ; 0x7fd0 + 7fee: df df rcall .-66 ; 0x7fae + 7ff0: 11 50 subi r17, 0x01 ; 1 + 7ff2: e9 f7 brne .-6 ; 0x7fee verifySpace(); - 7fd6: f4 df rcall .-24 ; 0x7fc0 + 7ff4: f4 df rcall .-24 ; 0x7fde } - 7fd8: 1f 91 pop r17 - 7fda: 08 95 ret + 7ff6: 1f 91 pop r17 + 7ff8: 08 95 ret diff --git a/optiboot/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.hex b/optiboot/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.hex index fc70213..35dc74f 100644 --- a/optiboot/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.hex +++ b/optiboot/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.hex @@ -1,32 +1,34 @@ :107E000085E08093810082E08093C00088E18093C8 :107E1000C10086E08093C20088E08093C40084B7EC -:107E200014BE81FFC8D08DE0C0D0259A86E028E13D +:107E200014BE81FFD7D08DE0CFD0259A86E028E11F :107E30003EEF91E0309385002093840096BBB09B89 :107E4000FECF1D9AA8958150A9F7DD24D394A5E013 -:107E5000FA2EF1E1EF2E9CD0813421F481E0B6D0EE +:107E5000EA2EF1E1FF2EABD0813421F481E0C5D0D0 :107E600083E020C0823411F484E103C0853419F426 -:107E700085E0ACD082C0853581F48AD0082F10E02F -:107E800087D090E0982F8827802B912B880F991FFF -:107E900090930102809300026FC0863529F484E03C -:107EA00095D080E06DD069C0843609F03FC078D0AD -:107EB000E0910002F091010283E087BFE895C0E005 -:107EC000D1E066D0899380910202815080930202B2 -:107ED0008823B9F775D007B600FCFDCF40910002AA -:107EE00050910102A0E0B1E02C9130E011968C910C -:107EF000119790E0982F8827822B932B1296FA01E6 -:107F00000C01D7BEE89511244E5F5F4FF1E0A03819 -:107F1000BF0751F7E0910002F0910102F7BEE8952A -:107F200007B600FCFDCFE7BEE89527C08437B9F45B -:107F300037D046D0E0910002F09101023196F093E3 -:107F40000102E09300023197E4918E2F19D08091C5 -:107F50000202815080930202882361F70EC08537A8 -:107F600039F42ED08EE10CD085E90AD08FE09ACF7B -:107F7000813511F488E019D023D080E101D06BCF96 -:107F8000982F8091C00085FFFCCF9093C600089584 -:107F9000A8958091C00087FFFCCF8091C60008950E -:107FA000F7DFF6DF80930202F3CFE0E6F0E098E13E -:107FB00090838083089580E0F8DFEE27FF270994FF -:107FC000E7DF803209F0F7DF84E1DACF1F93182F63 -:0C7FD000DFDF1150E9F7F4DF1F91089586 +:107E700085E0BBD091C0853581F499D0082F10E002 +:107E800096D090E0982F8827802B912B880F991FF0 +:107E900090930102809300027EC0863529F484E02D +:107EA000A4D080E07CD078C0843609F04EC087D062 +:107EB000E0910002F091010280E7E030F80718F449 +:107EC00083E087BFE895C0E0D1E071D089938091CD +:107ED00002028150809302028823B9F7E0910002E8 +:107EE000F091010280E7E030F80718F083E087BFE7 +:107EF000E89575D007B600FCFDCF40910002509187 +:107F00000102A0E0B1E02C9130E011968C91119724 +:107F100090E0982F8827822B932B1296FA010C0160 +:107F2000D7BEE89511244E5F5F4FF1E0A038BF0740 +:107F300051F7E0910002F0910102E7BEE89507B623 +:107F400000FCFDCFF7BEE89527C08437B9F437D0E1 +:107F500046D0E0910002F09101023196F0930102C7 +:107F6000E09300023197E4918E2F19D080910202A4 +:107F7000815080930202882361F70EC0853739F45F +:107F80002ED08EE10CD085E90AD08FE08BCF8135E1 +:107F900011F488E019D023D080E101D05CCF982F74 +:107FA0008091C00085FFFCCF9093C6000895A895EE +:107FB0008091C00087FFFCCF8091C6000895F7DF55 +:107FC000F6DF80930202F3CFE0E6F0E098E19083E1 +:107FD0008083089580E0F8DFEE27FF270994E7DF2C +:107FE000803209F0F7DF84E1DACF1F93182FDFDF4B +:0A7FF0001150E9F7F4DF1F91089526 :0400000300007E007B :00000001FF diff --git a/optiboot/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.lst b/optiboot/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.lst index 6ec7f16..5498879 100644 --- a/optiboot/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.lst +++ b/optiboot/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.lst @@ -3,25 +3,25 @@ optiboot_atmega328_pro_8MHz.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn - 0 .text 000001dc 00007e00 00007e00 00000054 2**1 + 0 .text 000001fa 00007e00 00007e00 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .debug_aranges 00000028 00000000 00000000 00000230 2**0 + 1 .debug_aranges 00000028 00000000 00000000 0000024e 2**0 CONTENTS, READONLY, DEBUGGING - 2 .debug_pubnames 0000006a 00000000 00000000 00000258 2**0 + 2 .debug_pubnames 0000006a 00000000 00000000 00000276 2**0 CONTENTS, READONLY, DEBUGGING - 3 .debug_info 00000283 00000000 00000000 000002c2 2**0 + 3 .debug_info 00000284 00000000 00000000 000002e0 2**0 CONTENTS, READONLY, DEBUGGING - 4 .debug_abbrev 000001ae 00000000 00000000 00000545 2**0 + 4 .debug_abbrev 000001ae 00000000 00000000 00000564 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_line 000003db 00000000 00000000 000006f3 2**0 + 5 .debug_line 000003e3 00000000 00000000 00000712 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_frame 00000090 00000000 00000000 00000ad0 2**2 + 6 .debug_frame 00000090 00000000 00000000 00000af8 2**2 CONTENTS, READONLY, DEBUGGING - 7 .debug_str 00000140 00000000 00000000 00000b60 2**0 + 7 .debug_str 00000140 00000000 00000000 00000b88 2**0 CONTENTS, READONLY, DEBUGGING - 8 .debug_loc 000001d1 00000000 00000000 00000ca0 2**0 + 8 .debug_loc 000001e1 00000000 00000000 00000cc8 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_ranges 00000068 00000000 00000000 00000e71 2**0 + 9 .debug_ranges 00000068 00000000 00000000 00000ea9 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: @@ -61,12 +61,12 @@ int main(void) { 7e20: 14 be out 0x34, r1 ; 52 if (!(ch & _BV(EXTRF))) appStart(); 7e22: 81 ff sbrs r24, 1 - 7e24: c8 d0 rcall .+400 ; 0x7fb6 + 7e24: d7 d0 rcall .+430 ; 0x7fd4 // Set up watchdog to trigger after 500ms watchdogConfig(WATCHDOG_500MS); 7e26: 8d e0 ldi r24, 0x0D ; 13 - 7e28: c0 d0 rcall .+384 ; 0x7faa + 7e28: cf d0 rcall .+414 ; 0x7fc8 /* Set LED pin as output */ LED_DDR |= _BV(LED); @@ -127,21 +127,21 @@ void watchdogReset() { // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); 7e4e: a5 e0 ldi r26, 0x05 ; 5 - 7e50: fa 2e mov r15, r26 + 7e50: ea 2e mov r14, r26 boot_spm_busy_wait(); #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); 7e52: f1 e1 ldi r31, 0x11 ; 17 - 7e54: ef 2e mov r14, r31 + 7e54: ff 2e mov r15, r31 #endif /* Forever loop */ for (;;) { /* get character from UART */ ch = getch(); - 7e56: 9c d0 rcall .+312 ; 0x7f90 + 7e56: ab d0 rcall .+342 ; 0x7fae if(ch == STK_GET_PARAMETER) { 7e58: 81 34 cpi r24, 0x41 ; 65 @@ -149,7 +149,7 @@ void watchdogReset() { // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy getNch(1); 7e5c: 81 e0 ldi r24, 0x01 ; 1 - 7e5e: b6 d0 rcall .+364 ; 0x7fcc + 7e5e: c5 d0 rcall .+394 ; 0x7fea putch(0x03); 7e60: 83 e0 ldi r24, 0x03 ; 3 7e62: 20 c0 rjmp .+64 ; 0x7ea4 @@ -168,8 +168,8 @@ void watchdogReset() { // SET DEVICE EXT is ignored getNch(5); 7e70: 85 e0 ldi r24, 0x05 ; 5 - 7e72: ac d0 rcall .+344 ; 0x7fcc - 7e74: 82 c0 rjmp .+260 ; 0x7f7a + 7e72: bb d0 rcall .+374 ; 0x7fea + 7e74: 91 c0 rjmp .+290 ; 0x7f98 } else if(ch == STK_LOAD_ADDRESS) { 7e76: 85 35 cpi r24, 0x55 ; 85 @@ -177,11 +177,11 @@ void watchdogReset() { // LOAD ADDRESS uint16_t newAddress; newAddress = getch(); - 7e7a: 8a d0 rcall .+276 ; 0x7f90 + 7e7a: 99 d0 rcall .+306 ; 0x7fae newAddress = (newAddress & 0xff) | (getch() << 8); 7e7c: 08 2f mov r16, r24 7e7e: 10 e0 ldi r17, 0x00 ; 0 - 7e80: 87 d0 rcall .+270 ; 0x7f90 + 7e80: 96 d0 rcall .+300 ; 0x7fae 7e82: 90 e0 ldi r25, 0x00 ; 0 7e84: 98 2f mov r25, r24 7e86: 88 27 eor r24, r24 @@ -197,7 +197,7 @@ void watchdogReset() { address = newAddress; 7e90: 90 93 01 02 sts 0x0201, r25 7e94: 80 93 00 02 sts 0x0200, r24 - 7e98: 6f c0 rjmp .+222 ; 0x7f78 + 7e98: 7e c0 rjmp .+252 ; 0x7f96 verifySpace(); } else if(ch == STK_UNIVERSAL) { @@ -206,320 +206,337 @@ void watchdogReset() { // UNIVERSAL command is ignored getNch(4); 7e9e: 84 e0 ldi r24, 0x04 ; 4 - 7ea0: 95 d0 rcall .+298 ; 0x7fcc + 7ea0: a4 d0 rcall .+328 ; 0x7fea putch(0x00); 7ea2: 80 e0 ldi r24, 0x00 ; 0 - 7ea4: 6d d0 rcall .+218 ; 0x7f80 - 7ea6: 69 c0 rjmp .+210 ; 0x7f7a + 7ea4: 7c d0 rcall .+248 ; 0x7f9e + 7ea6: 78 c0 rjmp .+240 ; 0x7f98 } /* Write memory, length is big endian and is in bytes */ else if(ch == STK_PROG_PAGE) { 7ea8: 84 36 cpi r24, 0x64 ; 100 7eaa: 09 f0 breq .+2 ; 0x7eae - 7eac: 3f c0 rjmp .+126 ; 0x7f2c + 7eac: 4e c0 rjmp .+156 ; 0x7f4a // PROGRAM PAGE - we support flash programming only, not EEPROM uint8_t *bufPtr; uint16_t addrPtr; getLen(); - 7eae: 78 d0 rcall .+240 ; 0x7fa0 + 7eae: 87 d0 rcall .+270 ; 0x7fbe - // Immediately start page erase - this will 4.5ms - __boot_page_erase_short((uint16_t)(void*)address); + // If we are in RWW section, immediately start page erase + if (address < NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); 7eb0: e0 91 00 02 lds r30, 0x0200 7eb4: f0 91 01 02 lds r31, 0x0201 - 7eb8: 83 e0 ldi r24, 0x03 ; 3 - 7eba: 87 bf out 0x37, r24 ; 55 - 7ebc: e8 95 spm - 7ebe: c0 e0 ldi r28, 0x00 ; 0 - 7ec0: d1 e0 ldi r29, 0x01 ; 1 + 7eb8: 80 e7 ldi r24, 0x70 ; 112 + 7eba: e0 30 cpi r30, 0x00 ; 0 + 7ebc: f8 07 cpc r31, r24 + 7ebe: 18 f4 brcc .+6 ; 0x7ec6 + 7ec0: 83 e0 ldi r24, 0x03 ; 3 + 7ec2: 87 bf out 0x37, r24 ; 55 + 7ec4: e8 95 spm + 7ec6: c0 e0 ldi r28, 0x00 ; 0 + 7ec8: d1 e0 ldi r29, 0x01 ; 1 // While that is going on, read in page contents bufPtr = buff; do *bufPtr++ = getch(); - 7ec2: 66 d0 rcall .+204 ; 0x7f90 - 7ec4: 89 93 st Y+, r24 + 7eca: 71 d0 rcall .+226 ; 0x7fae + 7ecc: 89 93 st Y+, r24 while (--length); - 7ec6: 80 91 02 02 lds r24, 0x0202 - 7eca: 81 50 subi r24, 0x01 ; 1 - 7ecc: 80 93 02 02 sts 0x0202, r24 - 7ed0: 88 23 and r24, r24 - 7ed2: b9 f7 brne .-18 ; 0x7ec2 + 7ece: 80 91 02 02 lds r24, 0x0202 + 7ed2: 81 50 subi r24, 0x01 ; 1 + 7ed4: 80 93 02 02 sts 0x0202, r24 + 7ed8: 88 23 and r24, r24 + 7eda: b9 f7 brne .-18 ; 0x7eca + + // If we are in NRWW section, page erase has to be delayed until now. + // Todo: Take RAMPZ into account + if (address >= NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); + 7edc: e0 91 00 02 lds r30, 0x0200 + 7ee0: f0 91 01 02 lds r31, 0x0201 + 7ee4: 80 e7 ldi r24, 0x70 ; 112 + 7ee6: e0 30 cpi r30, 0x00 ; 0 + 7ee8: f8 07 cpc r31, r24 + 7eea: 18 f0 brcs .+6 ; 0x7ef2 + 7eec: 83 e0 ldi r24, 0x03 ; 3 + 7eee: 87 bf out 0x37, r24 ; 55 + 7ef0: e8 95 spm // Read command terminator, start reply verifySpace(); - 7ed4: 75 d0 rcall .+234 ; 0x7fc0 + 7ef2: 75 d0 rcall .+234 ; 0x7fde // If only a partial page is to be programmed, the erase might not be complete. // So check that here boot_spm_busy_wait(); - 7ed6: 07 b6 in r0, 0x37 ; 55 - 7ed8: 00 fc sbrc r0, 0 - 7eda: fd cf rjmp .-6 ; 0x7ed6 + 7ef4: 07 b6 in r0, 0x37 ; 55 + 7ef6: 00 fc sbrc r0, 0 + 7ef8: fd cf rjmp .-6 ; 0x7ef4 } #endif // Copy buffer into programming buffer bufPtr = buff; addrPtr = (uint16_t)(void*)address; - 7edc: 40 91 00 02 lds r20, 0x0200 - 7ee0: 50 91 01 02 lds r21, 0x0201 - 7ee4: a0 e0 ldi r26, 0x00 ; 0 - 7ee6: b1 e0 ldi r27, 0x01 ; 1 + 7efa: 40 91 00 02 lds r20, 0x0200 + 7efe: 50 91 01 02 lds r21, 0x0201 + 7f02: a0 e0 ldi r26, 0x00 ; 0 + 7f04: b1 e0 ldi r27, 0x01 ; 1 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; - 7ee8: 2c 91 ld r18, X - 7eea: 30 e0 ldi r19, 0x00 ; 0 + 7f06: 2c 91 ld r18, X + 7f08: 30 e0 ldi r19, 0x00 ; 0 a |= (*bufPtr++) << 8; - 7eec: 11 96 adiw r26, 0x01 ; 1 - 7eee: 8c 91 ld r24, X - 7ef0: 11 97 sbiw r26, 0x01 ; 1 - 7ef2: 90 e0 ldi r25, 0x00 ; 0 - 7ef4: 98 2f mov r25, r24 - 7ef6: 88 27 eor r24, r24 - 7ef8: 82 2b or r24, r18 - 7efa: 93 2b or r25, r19 + 7f0a: 11 96 adiw r26, 0x01 ; 1 + 7f0c: 8c 91 ld r24, X + 7f0e: 11 97 sbiw r26, 0x01 ; 1 + 7f10: 90 e0 ldi r25, 0x00 ; 0 + 7f12: 98 2f mov r25, r24 + 7f14: 88 27 eor r24, r24 + 7f16: 82 2b or r24, r18 + 7f18: 93 2b or r25, r19 #define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #endif /* main program starts here */ int main(void) { - 7efc: 12 96 adiw r26, 0x02 ; 2 + 7f1a: 12 96 adiw r26, 0x02 ; 2 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; a |= (*bufPtr++) << 8; __boot_page_fill_short((uint16_t)(void*)addrPtr,a); - 7efe: fa 01 movw r30, r20 - 7f00: 0c 01 movw r0, r24 - 7f02: d7 be out 0x37, r13 ; 55 - 7f04: e8 95 spm - 7f06: 11 24 eor r1, r1 + 7f1c: fa 01 movw r30, r20 + 7f1e: 0c 01 movw r0, r24 + 7f20: d7 be out 0x37, r13 ; 55 + 7f22: e8 95 spm + 7f24: 11 24 eor r1, r1 addrPtr += 2; - 7f08: 4e 5f subi r20, 0xFE ; 254 - 7f0a: 5f 4f sbci r21, 0xFF ; 255 + 7f26: 4e 5f subi r20, 0xFE ; 254 + 7f28: 5f 4f sbci r21, 0xFF ; 255 } while (--ch); - 7f0c: f1 e0 ldi r31, 0x01 ; 1 - 7f0e: a0 38 cpi r26, 0x80 ; 128 - 7f10: bf 07 cpc r27, r31 - 7f12: 51 f7 brne .-44 ; 0x7ee8 + 7f2a: f1 e0 ldi r31, 0x01 ; 1 + 7f2c: a0 38 cpi r26, 0x80 ; 128 + 7f2e: bf 07 cpc r27, r31 + 7f30: 51 f7 brne .-44 ; 0x7f06 // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); - 7f14: e0 91 00 02 lds r30, 0x0200 - 7f18: f0 91 01 02 lds r31, 0x0201 - 7f1c: f7 be out 0x37, r15 ; 55 - 7f1e: e8 95 spm + 7f32: e0 91 00 02 lds r30, 0x0200 + 7f36: f0 91 01 02 lds r31, 0x0201 + 7f3a: e7 be out 0x37, r14 ; 55 + 7f3c: e8 95 spm boot_spm_busy_wait(); - 7f20: 07 b6 in r0, 0x37 ; 55 - 7f22: 00 fc sbrc r0, 0 - 7f24: fd cf rjmp .-6 ; 0x7f20 + 7f3e: 07 b6 in r0, 0x37 ; 55 + 7f40: 00 fc sbrc r0, 0 + 7f42: fd cf rjmp .-6 ; 0x7f3e #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); - 7f26: e7 be out 0x37, r14 ; 55 - 7f28: e8 95 spm - 7f2a: 27 c0 rjmp .+78 ; 0x7f7a + 7f44: f7 be out 0x37, r15 ; 55 + 7f46: e8 95 spm + 7f48: 27 c0 rjmp .+78 ; 0x7f98 #endif } /* Read memory block mode, length is big endian. */ else if(ch == STK_READ_PAGE) { - 7f2c: 84 37 cpi r24, 0x74 ; 116 - 7f2e: b9 f4 brne .+46 ; 0x7f5e + 7f4a: 84 37 cpi r24, 0x74 ; 116 + 7f4c: b9 f4 brne .+46 ; 0x7f7c // READ PAGE - we only read flash getLen(); - 7f30: 37 d0 rcall .+110 ; 0x7fa0 + 7f4e: 37 d0 rcall .+110 ; 0x7fbe verifySpace(); - 7f32: 46 d0 rcall .+140 ; 0x7fc0 + 7f50: 46 d0 rcall .+140 ; 0x7fde putch(result); address++; } while (--length); #else do putch(pgm_read_byte_near(address++)); - 7f34: e0 91 00 02 lds r30, 0x0200 - 7f38: f0 91 01 02 lds r31, 0x0201 - 7f3c: 31 96 adiw r30, 0x01 ; 1 - 7f3e: f0 93 01 02 sts 0x0201, r31 - 7f42: e0 93 00 02 sts 0x0200, r30 - 7f46: 31 97 sbiw r30, 0x01 ; 1 - 7f48: e4 91 lpm r30, Z+ - 7f4a: 8e 2f mov r24, r30 - 7f4c: 19 d0 rcall .+50 ; 0x7f80 + 7f52: e0 91 00 02 lds r30, 0x0200 + 7f56: f0 91 01 02 lds r31, 0x0201 + 7f5a: 31 96 adiw r30, 0x01 ; 1 + 7f5c: f0 93 01 02 sts 0x0201, r31 + 7f60: e0 93 00 02 sts 0x0200, r30 + 7f64: 31 97 sbiw r30, 0x01 ; 1 + 7f66: e4 91 lpm r30, Z+ + 7f68: 8e 2f mov r24, r30 + 7f6a: 19 d0 rcall .+50 ; 0x7f9e while (--length); - 7f4e: 80 91 02 02 lds r24, 0x0202 - 7f52: 81 50 subi r24, 0x01 ; 1 - 7f54: 80 93 02 02 sts 0x0202, r24 - 7f58: 88 23 and r24, r24 - 7f5a: 61 f7 brne .-40 ; 0x7f34 - 7f5c: 0e c0 rjmp .+28 ; 0x7f7a + 7f6c: 80 91 02 02 lds r24, 0x0202 + 7f70: 81 50 subi r24, 0x01 ; 1 + 7f72: 80 93 02 02 sts 0x0202, r24 + 7f76: 88 23 and r24, r24 + 7f78: 61 f7 brne .-40 ; 0x7f52 + 7f7a: 0e c0 rjmp .+28 ; 0x7f98 #endif #endif } /* Get device signature bytes */ else if(ch == STK_READ_SIGN) { - 7f5e: 85 37 cpi r24, 0x75 ; 117 - 7f60: 39 f4 brne .+14 ; 0x7f70 + 7f7c: 85 37 cpi r24, 0x75 ; 117 + 7f7e: 39 f4 brne .+14 ; 0x7f8e // READ SIGN - return what Avrdude wants to hear verifySpace(); - 7f62: 2e d0 rcall .+92 ; 0x7fc0 + 7f80: 2e d0 rcall .+92 ; 0x7fde putch(SIGNATURE_0); - 7f64: 8e e1 ldi r24, 0x1E ; 30 - 7f66: 0c d0 rcall .+24 ; 0x7f80 + 7f82: 8e e1 ldi r24, 0x1E ; 30 + 7f84: 0c d0 rcall .+24 ; 0x7f9e putch(SIGNATURE_1); - 7f68: 85 e9 ldi r24, 0x95 ; 149 - 7f6a: 0a d0 rcall .+20 ; 0x7f80 + 7f86: 85 e9 ldi r24, 0x95 ; 149 + 7f88: 0a d0 rcall .+20 ; 0x7f9e putch(SIGNATURE_2); - 7f6c: 8f e0 ldi r24, 0x0F ; 15 - 7f6e: 9a cf rjmp .-204 ; 0x7ea4 + 7f8a: 8f e0 ldi r24, 0x0F ; 15 + 7f8c: 8b cf rjmp .-234 ; 0x7ea4 } else if (ch == 'Q') { - 7f70: 81 35 cpi r24, 0x51 ; 81 - 7f72: 11 f4 brne .+4 ; 0x7f78 + 7f8e: 81 35 cpi r24, 0x51 ; 81 + 7f90: 11 f4 brne .+4 ; 0x7f96 // Adaboot no-wait mod watchdogConfig(WATCHDOG_16MS); - 7f74: 88 e0 ldi r24, 0x08 ; 8 - 7f76: 19 d0 rcall .+50 ; 0x7faa + 7f92: 88 e0 ldi r24, 0x08 ; 8 + 7f94: 19 d0 rcall .+50 ; 0x7fc8 verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); - 7f78: 23 d0 rcall .+70 ; 0x7fc0 + 7f96: 23 d0 rcall .+70 ; 0x7fde } putch(STK_OK); - 7f7a: 80 e1 ldi r24, 0x10 ; 16 - 7f7c: 01 d0 rcall .+2 ; 0x7f80 - 7f7e: 6b cf rjmp .-298 ; 0x7e56 + 7f98: 80 e1 ldi r24, 0x10 ; 16 + 7f9a: 01 d0 rcall .+2 ; 0x7f9e + 7f9c: 5c cf rjmp .-328 ; 0x7e56 -00007f80 : +00007f9e : } } void putch(char ch) { - 7f80: 98 2f mov r25, r24 + 7f9e: 98 2f mov r25, r24 #ifndef SOFT_UART while (!(UCSR0A & _BV(UDRE0))); - 7f82: 80 91 c0 00 lds r24, 0x00C0 - 7f86: 85 ff sbrs r24, 5 - 7f88: fc cf rjmp .-8 ; 0x7f82 + 7fa0: 80 91 c0 00 lds r24, 0x00C0 + 7fa4: 85 ff sbrs r24, 5 + 7fa6: fc cf rjmp .-8 ; 0x7fa0 UDR0 = ch; - 7f8a: 90 93 c6 00 sts 0x00C6, r25 + 7fa8: 90 93 c6 00 sts 0x00C6, r25 [uartBit] "I" (UART_TX_BIT) : "r25" ); #endif } - 7f8e: 08 95 ret + 7fac: 08 95 ret -00007f90 : +00007fae : return getch(); } // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( - 7f90: a8 95 wdr + 7fae: a8 95 wdr [uartBit] "I" (UART_RX_BIT) : "r25" ); #else while(!(UCSR0A & _BV(RXC0))); - 7f92: 80 91 c0 00 lds r24, 0x00C0 - 7f96: 87 ff sbrs r24, 7 - 7f98: fc cf rjmp .-8 ; 0x7f92 + 7fb0: 80 91 c0 00 lds r24, 0x00C0 + 7fb4: 87 ff sbrs r24, 7 + 7fb6: fc cf rjmp .-8 ; 0x7fb0 ch = UDR0; - 7f9a: 80 91 c6 00 lds r24, 0x00C6 + 7fb8: 80 91 c6 00 lds r24, 0x00C6 #ifdef LED_DATA_FLASH LED_PIN |= _BV(LED); #endif return ch; } - 7f9e: 08 95 ret + 7fbc: 08 95 ret -00007fa0 : +00007fbe : } while (--count); } #endif uint8_t getLen() { getch(); - 7fa0: f7 df rcall .-18 ; 0x7f90 + 7fbe: f7 df rcall .-18 ; 0x7fae length = getch(); - 7fa2: f6 df rcall .-20 ; 0x7f90 - 7fa4: 80 93 02 02 sts 0x0202, r24 + 7fc0: f6 df rcall .-20 ; 0x7fae + 7fc2: 80 93 02 02 sts 0x0202, r24 return getch(); } - 7fa8: f3 cf rjmp .-26 ; 0x7f90 + 7fc6: f3 cf rjmp .-26 ; 0x7fae -00007faa : +00007fc8 : "wdr\n" ); } void watchdogConfig(uint8_t x) { WDTCSR = _BV(WDCE) | _BV(WDE); - 7faa: e0 e6 ldi r30, 0x60 ; 96 - 7fac: f0 e0 ldi r31, 0x00 ; 0 - 7fae: 98 e1 ldi r25, 0x18 ; 24 - 7fb0: 90 83 st Z, r25 + 7fc8: e0 e6 ldi r30, 0x60 ; 96 + 7fca: f0 e0 ldi r31, 0x00 ; 0 + 7fcc: 98 e1 ldi r25, 0x18 ; 24 + 7fce: 90 83 st Z, r25 WDTCSR = x; - 7fb2: 80 83 st Z, r24 + 7fd0: 80 83 st Z, r24 } - 7fb4: 08 95 ret + 7fd2: 08 95 ret -00007fb6 : +00007fd4 : void appStart() { watchdogConfig(WATCHDOG_OFF); - 7fb6: 80 e0 ldi r24, 0x00 ; 0 - 7fb8: f8 df rcall .-16 ; 0x7faa + 7fd4: 80 e0 ldi r24, 0x00 ; 0 + 7fd6: f8 df rcall .-16 ; 0x7fc8 __asm__ __volatile__ ( - 7fba: ee 27 eor r30, r30 - 7fbc: ff 27 eor r31, r31 - 7fbe: 09 94 ijmp + 7fd8: ee 27 eor r30, r30 + 7fda: ff 27 eor r31, r31 + 7fdc: 09 94 ijmp -00007fc0 : +00007fde : do getch(); while (--count); verifySpace(); } void verifySpace() { if (getch() != CRC_EOP) appStart(); - 7fc0: e7 df rcall .-50 ; 0x7f90 - 7fc2: 80 32 cpi r24, 0x20 ; 32 - 7fc4: 09 f0 breq .+2 ; 0x7fc8 - 7fc6: f7 df rcall .-18 ; 0x7fb6 + 7fde: e7 df rcall .-50 ; 0x7fae + 7fe0: 80 32 cpi r24, 0x20 ; 32 + 7fe2: 09 f0 breq .+2 ; 0x7fe6 + 7fe4: f7 df rcall .-18 ; 0x7fd4 putch(STK_INSYNC); - 7fc8: 84 e1 ldi r24, 0x14 ; 20 + 7fe6: 84 e1 ldi r24, 0x14 ; 20 } - 7fca: da cf rjmp .-76 ; 0x7f80 + 7fe8: da cf rjmp .-76 ; 0x7f9e ::[count] "M" (UART_B_VALUE) ); } #endif void getNch(uint8_t count) { - 7fcc: 1f 93 push r17 - 7fce: 18 2f mov r17, r24 + 7fea: 1f 93 push r17 + 7fec: 18 2f mov r17, r24 -00007fd0 : +00007fee : do getch(); while (--count); - 7fd0: df df rcall .-66 ; 0x7f90 - 7fd2: 11 50 subi r17, 0x01 ; 1 - 7fd4: e9 f7 brne .-6 ; 0x7fd0 + 7fee: df df rcall .-66 ; 0x7fae + 7ff0: 11 50 subi r17, 0x01 ; 1 + 7ff2: e9 f7 brne .-6 ; 0x7fee verifySpace(); - 7fd6: f4 df rcall .-24 ; 0x7fc0 + 7ff4: f4 df rcall .-24 ; 0x7fde } - 7fd8: 1f 91 pop r17 - 7fda: 08 95 ret + 7ff6: 1f 91 pop r17 + 7ff8: 08 95 ret diff --git a/optiboot/bootloaders/optiboot/optiboot_atmega644p.hex b/optiboot/bootloaders/optiboot/optiboot_atmega644p.hex index f2d67a1..48f0bdb 100644 --- a/optiboot/bootloaders/optiboot/optiboot_atmega644p.hex +++ b/optiboot/bootloaders/optiboot/optiboot_atmega644p.hex @@ -1,32 +1,34 @@ :10FC000085E08093810082E08093C00088E180934A :10FC1000C10086E08093C20080E18093C40084B775 -:10FC200014BE81FFC8D08DE0C0D0209A86E020E3CA +:10FC200014BE81FFD7D08DE0CFD0209A86E020E3AC :10FC30003CEF91E0309385002093840096BBB09B0D :10FC4000FECF189AA8958150A9F7DD24D394A5E09A -:10FC5000FA2EF1E1EF2E9CD0813421F481E0B6D070 +:10FC5000EA2EF1E1FF2EABD0813421F481E0C5D052 :10FC600083E020C0823411F484E103C0853419F4A8 -:10FC700085E0ACD082C0853581F48AD0082F10E0B1 -:10FC800087D090E0982F8827802B912B880F991F81 -:10FC900090930103809300036FC0863529F484E0BC -:10FCA00095D080E06DD069C0843609F03FC078D02F -:10FCB000E0910003F091010383E087BFE895C0E085 -:10FCC000D1E066D089938091020381508093020332 -:10FCD0008823B9F775D007B600FCFDCF409100032B -:10FCE00050910103A0E0B1E02C9130E011968C918D -:10FCF000119790E0982F8827822B932B1296FA0168 -:10FD00000C01D7BEE89511244E5F5F4FF2E0A030A2 -:10FD1000BF0751F7E0910003F0910103F7BEE895AA -:10FD200007B600FCFDCFE7BEE89527C08437B9F4DD -:10FD300037D046D0E0910003F09101033196F09363 -:10FD40000103E09300033197E4918E2F19D0809145 -:10FD50000203815080930203882361F70EC0853728 -:10FD600039F42ED08EE10CD086E90AD08AE09ACF01 -:10FD7000813511F488E019D023D080E101D06BCF18 -:10FD8000982F8091C00085FFFCCF9093C600089506 -:10FD9000A8958091C00087FFFCCF8091C600089590 -:10FDA000F7DFF6DF80930203F3CFE0E6F0E098E1BF -:10FDB00090838083089580E0F8DFEE27FF27099481 -:10FDC000E7DF803209F0F7DF84E1DACF1F93182FE5 -:0CFDD000DFDF1150E9F7F4DF1F91089508 +:10FC700085E0BBD091C0853581F499D0082F10E084 +:10FC800096D090E0982F8827802B912B880F991F72 +:10FC900090930103809300037EC0863529F484E0AD +:10FCA000A4D080E07CD078C0843609F04EC087D0E4 +:10FCB000E0910003F091010380EEE030F80718F4C2 +:10FCC00083E087BFE895C0E0D1E071D0899380914F +:10FCD00002038150809302038823B9F7E091000367 +:10FCE000F091010380EEE030F80718F083E087BF61 +:10FCF000E89575D007B600FCFDCF40910003509108 +:10FD00000103A0E0B1E02C9130E011968C911197A5 +:10FD100090E0982F8827822B932B1296FA010C01E2 +:10FD2000D7BEE89511244E5F5F4FF2E0A030BF07C9 +:10FD300051F7E0910003F0910103E7BEE89507B6A3 +:10FD400000FCFDCFF7BEE89527C08437B9F437D063 +:10FD500046D0E0910003F09101033196F093010346 +:10FD6000E09300033197E4918E2F19D08091020324 +:10FD7000815080930203882361F70EC0853739F4E0 +:10FD80002ED08EE10CD086E90AD08AE08BCF813567 +:10FD900011F488E019D023D080E101D05CCF982FF6 +:10FDA0008091C00085FFFCCF9093C6000895A89570 +:10FDB0008091C00087FFFCCF8091C6000895F7DFD7 +:10FDC000F6DF80930203F3CFE0E6F0E098E1908362 +:10FDD0008083089580E0F8DFEE27FF270994E7DFAE +:10FDE000803209F0F7DF84E1DACF1F93182FDFDFCD +:0AFDF0001150E9F7F4DF1F910895A8 :040000030000FC00FD :00000001FF diff --git a/optiboot/bootloaders/optiboot/optiboot_atmega644p.lst b/optiboot/bootloaders/optiboot/optiboot_atmega644p.lst index c2b22b8..0036381 100644 --- a/optiboot/bootloaders/optiboot/optiboot_atmega644p.lst +++ b/optiboot/bootloaders/optiboot/optiboot_atmega644p.lst @@ -3,25 +3,25 @@ optiboot_atmega644p.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn - 0 .text 000001dc 0000fc00 0000fc00 00000054 2**1 + 0 .text 000001fa 0000fc00 0000fc00 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .debug_aranges 00000028 00000000 00000000 00000230 2**0 + 1 .debug_aranges 00000028 00000000 00000000 0000024e 2**0 CONTENTS, READONLY, DEBUGGING - 2 .debug_pubnames 0000006a 00000000 00000000 00000258 2**0 + 2 .debug_pubnames 0000006a 00000000 00000000 00000276 2**0 CONTENTS, READONLY, DEBUGGING - 3 .debug_info 00000283 00000000 00000000 000002c2 2**0 + 3 .debug_info 00000284 00000000 00000000 000002e0 2**0 CONTENTS, READONLY, DEBUGGING - 4 .debug_abbrev 000001ae 00000000 00000000 00000545 2**0 + 4 .debug_abbrev 000001ae 00000000 00000000 00000564 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_line 000003db 00000000 00000000 000006f3 2**0 + 5 .debug_line 000003e3 00000000 00000000 00000712 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_frame 00000090 00000000 00000000 00000ad0 2**2 + 6 .debug_frame 00000090 00000000 00000000 00000af8 2**2 CONTENTS, READONLY, DEBUGGING - 7 .debug_str 00000140 00000000 00000000 00000b60 2**0 + 7 .debug_str 00000140 00000000 00000000 00000b88 2**0 CONTENTS, READONLY, DEBUGGING - 8 .debug_loc 000001d1 00000000 00000000 00000ca0 2**0 + 8 .debug_loc 000001e1 00000000 00000000 00000cc8 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_ranges 00000068 00000000 00000000 00000e71 2**0 + 9 .debug_ranges 00000068 00000000 00000000 00000ea9 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: @@ -61,12 +61,12 @@ int main(void) { fc20: 14 be out 0x34, r1 ; 52 if (!(ch & _BV(EXTRF))) appStart(); fc22: 81 ff sbrs r24, 1 - fc24: c8 d0 rcall .+400 ; 0xfdb6 + fc24: d7 d0 rcall .+430 ; 0xfdd4 // Set up watchdog to trigger after 500ms watchdogConfig(WATCHDOG_500MS); fc26: 8d e0 ldi r24, 0x0D ; 13 - fc28: c0 d0 rcall .+384 ; 0xfdaa + fc28: cf d0 rcall .+414 ; 0xfdc8 /* Set LED pin as output */ LED_DDR |= _BV(LED); @@ -127,21 +127,21 @@ void watchdogReset() { // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); fc4e: a5 e0 ldi r26, 0x05 ; 5 - fc50: fa 2e mov r15, r26 + fc50: ea 2e mov r14, r26 boot_spm_busy_wait(); #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); fc52: f1 e1 ldi r31, 0x11 ; 17 - fc54: ef 2e mov r14, r31 + fc54: ff 2e mov r15, r31 #endif /* Forever loop */ for (;;) { /* get character from UART */ ch = getch(); - fc56: 9c d0 rcall .+312 ; 0xfd90 + fc56: ab d0 rcall .+342 ; 0xfdae if(ch == STK_GET_PARAMETER) { fc58: 81 34 cpi r24, 0x41 ; 65 @@ -149,7 +149,7 @@ void watchdogReset() { // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy getNch(1); fc5c: 81 e0 ldi r24, 0x01 ; 1 - fc5e: b6 d0 rcall .+364 ; 0xfdcc + fc5e: c5 d0 rcall .+394 ; 0xfdea putch(0x03); fc60: 83 e0 ldi r24, 0x03 ; 3 fc62: 20 c0 rjmp .+64 ; 0xfca4 @@ -168,8 +168,8 @@ void watchdogReset() { // SET DEVICE EXT is ignored getNch(5); fc70: 85 e0 ldi r24, 0x05 ; 5 - fc72: ac d0 rcall .+344 ; 0xfdcc - fc74: 82 c0 rjmp .+260 ; 0xfd7a + fc72: bb d0 rcall .+374 ; 0xfdea + fc74: 91 c0 rjmp .+290 ; 0xfd98 } else if(ch == STK_LOAD_ADDRESS) { fc76: 85 35 cpi r24, 0x55 ; 85 @@ -177,11 +177,11 @@ void watchdogReset() { // LOAD ADDRESS uint16_t newAddress; newAddress = getch(); - fc7a: 8a d0 rcall .+276 ; 0xfd90 + fc7a: 99 d0 rcall .+306 ; 0xfdae newAddress = (newAddress & 0xff) | (getch() << 8); fc7c: 08 2f mov r16, r24 fc7e: 10 e0 ldi r17, 0x00 ; 0 - fc80: 87 d0 rcall .+270 ; 0xfd90 + fc80: 96 d0 rcall .+300 ; 0xfdae fc82: 90 e0 ldi r25, 0x00 ; 0 fc84: 98 2f mov r25, r24 fc86: 88 27 eor r24, r24 @@ -197,7 +197,7 @@ void watchdogReset() { address = newAddress; fc90: 90 93 01 03 sts 0x0301, r25 fc94: 80 93 00 03 sts 0x0300, r24 - fc98: 6f c0 rjmp .+222 ; 0xfd78 + fc98: 7e c0 rjmp .+252 ; 0xfd96 verifySpace(); } else if(ch == STK_UNIVERSAL) { @@ -206,320 +206,337 @@ void watchdogReset() { // UNIVERSAL command is ignored getNch(4); fc9e: 84 e0 ldi r24, 0x04 ; 4 - fca0: 95 d0 rcall .+298 ; 0xfdcc + fca0: a4 d0 rcall .+328 ; 0xfdea putch(0x00); fca2: 80 e0 ldi r24, 0x00 ; 0 - fca4: 6d d0 rcall .+218 ; 0xfd80 - fca6: 69 c0 rjmp .+210 ; 0xfd7a + fca4: 7c d0 rcall .+248 ; 0xfd9e + fca6: 78 c0 rjmp .+240 ; 0xfd98 } /* Write memory, length is big endian and is in bytes */ else if(ch == STK_PROG_PAGE) { fca8: 84 36 cpi r24, 0x64 ; 100 fcaa: 09 f0 breq .+2 ; 0xfcae - fcac: 3f c0 rjmp .+126 ; 0xfd2c + fcac: 4e c0 rjmp .+156 ; 0xfd4a // PROGRAM PAGE - we support flash programming only, not EEPROM uint8_t *bufPtr; uint16_t addrPtr; getLen(); - fcae: 78 d0 rcall .+240 ; 0xfda0 + fcae: 87 d0 rcall .+270 ; 0xfdbe - // Immediately start page erase - this will 4.5ms - __boot_page_erase_short((uint16_t)(void*)address); + // If we are in RWW section, immediately start page erase + if (address < NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); fcb0: e0 91 00 03 lds r30, 0x0300 fcb4: f0 91 01 03 lds r31, 0x0301 - fcb8: 83 e0 ldi r24, 0x03 ; 3 - fcba: 87 bf out 0x37, r24 ; 55 - fcbc: e8 95 spm - fcbe: c0 e0 ldi r28, 0x00 ; 0 - fcc0: d1 e0 ldi r29, 0x01 ; 1 + fcb8: 80 ee ldi r24, 0xE0 ; 224 + fcba: e0 30 cpi r30, 0x00 ; 0 + fcbc: f8 07 cpc r31, r24 + fcbe: 18 f4 brcc .+6 ; 0xfcc6 + fcc0: 83 e0 ldi r24, 0x03 ; 3 + fcc2: 87 bf out 0x37, r24 ; 55 + fcc4: e8 95 spm + fcc6: c0 e0 ldi r28, 0x00 ; 0 + fcc8: d1 e0 ldi r29, 0x01 ; 1 // While that is going on, read in page contents bufPtr = buff; do *bufPtr++ = getch(); - fcc2: 66 d0 rcall .+204 ; 0xfd90 - fcc4: 89 93 st Y+, r24 + fcca: 71 d0 rcall .+226 ; 0xfdae + fccc: 89 93 st Y+, r24 while (--length); - fcc6: 80 91 02 03 lds r24, 0x0302 - fcca: 81 50 subi r24, 0x01 ; 1 - fccc: 80 93 02 03 sts 0x0302, r24 - fcd0: 88 23 and r24, r24 - fcd2: b9 f7 brne .-18 ; 0xfcc2 + fcce: 80 91 02 03 lds r24, 0x0302 + fcd2: 81 50 subi r24, 0x01 ; 1 + fcd4: 80 93 02 03 sts 0x0302, r24 + fcd8: 88 23 and r24, r24 + fcda: b9 f7 brne .-18 ; 0xfcca + + // If we are in NRWW section, page erase has to be delayed until now. + // Todo: Take RAMPZ into account + if (address >= NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); + fcdc: e0 91 00 03 lds r30, 0x0300 + fce0: f0 91 01 03 lds r31, 0x0301 + fce4: 80 ee ldi r24, 0xE0 ; 224 + fce6: e0 30 cpi r30, 0x00 ; 0 + fce8: f8 07 cpc r31, r24 + fcea: 18 f0 brcs .+6 ; 0xfcf2 + fcec: 83 e0 ldi r24, 0x03 ; 3 + fcee: 87 bf out 0x37, r24 ; 55 + fcf0: e8 95 spm // Read command terminator, start reply verifySpace(); - fcd4: 75 d0 rcall .+234 ; 0xfdc0 + fcf2: 75 d0 rcall .+234 ; 0xfdde // If only a partial page is to be programmed, the erase might not be complete. // So check that here boot_spm_busy_wait(); - fcd6: 07 b6 in r0, 0x37 ; 55 - fcd8: 00 fc sbrc r0, 0 - fcda: fd cf rjmp .-6 ; 0xfcd6 + fcf4: 07 b6 in r0, 0x37 ; 55 + fcf6: 00 fc sbrc r0, 0 + fcf8: fd cf rjmp .-6 ; 0xfcf4 } #endif // Copy buffer into programming buffer bufPtr = buff; addrPtr = (uint16_t)(void*)address; - fcdc: 40 91 00 03 lds r20, 0x0300 - fce0: 50 91 01 03 lds r21, 0x0301 - fce4: a0 e0 ldi r26, 0x00 ; 0 - fce6: b1 e0 ldi r27, 0x01 ; 1 + fcfa: 40 91 00 03 lds r20, 0x0300 + fcfe: 50 91 01 03 lds r21, 0x0301 + fd02: a0 e0 ldi r26, 0x00 ; 0 + fd04: b1 e0 ldi r27, 0x01 ; 1 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; - fce8: 2c 91 ld r18, X - fcea: 30 e0 ldi r19, 0x00 ; 0 + fd06: 2c 91 ld r18, X + fd08: 30 e0 ldi r19, 0x00 ; 0 a |= (*bufPtr++) << 8; - fcec: 11 96 adiw r26, 0x01 ; 1 - fcee: 8c 91 ld r24, X - fcf0: 11 97 sbiw r26, 0x01 ; 1 - fcf2: 90 e0 ldi r25, 0x00 ; 0 - fcf4: 98 2f mov r25, r24 - fcf6: 88 27 eor r24, r24 - fcf8: 82 2b or r24, r18 - fcfa: 93 2b or r25, r19 + fd0a: 11 96 adiw r26, 0x01 ; 1 + fd0c: 8c 91 ld r24, X + fd0e: 11 97 sbiw r26, 0x01 ; 1 + fd10: 90 e0 ldi r25, 0x00 ; 0 + fd12: 98 2f mov r25, r24 + fd14: 88 27 eor r24, r24 + fd16: 82 2b or r24, r18 + fd18: 93 2b or r25, r19 #define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #endif /* main program starts here */ int main(void) { - fcfc: 12 96 adiw r26, 0x02 ; 2 + fd1a: 12 96 adiw r26, 0x02 ; 2 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; a |= (*bufPtr++) << 8; __boot_page_fill_short((uint16_t)(void*)addrPtr,a); - fcfe: fa 01 movw r30, r20 - fd00: 0c 01 movw r0, r24 - fd02: d7 be out 0x37, r13 ; 55 - fd04: e8 95 spm - fd06: 11 24 eor r1, r1 + fd1c: fa 01 movw r30, r20 + fd1e: 0c 01 movw r0, r24 + fd20: d7 be out 0x37, r13 ; 55 + fd22: e8 95 spm + fd24: 11 24 eor r1, r1 addrPtr += 2; - fd08: 4e 5f subi r20, 0xFE ; 254 - fd0a: 5f 4f sbci r21, 0xFF ; 255 + fd26: 4e 5f subi r20, 0xFE ; 254 + fd28: 5f 4f sbci r21, 0xFF ; 255 } while (--ch); - fd0c: f2 e0 ldi r31, 0x02 ; 2 - fd0e: a0 30 cpi r26, 0x00 ; 0 - fd10: bf 07 cpc r27, r31 - fd12: 51 f7 brne .-44 ; 0xfce8 + fd2a: f2 e0 ldi r31, 0x02 ; 2 + fd2c: a0 30 cpi r26, 0x00 ; 0 + fd2e: bf 07 cpc r27, r31 + fd30: 51 f7 brne .-44 ; 0xfd06 // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); - fd14: e0 91 00 03 lds r30, 0x0300 - fd18: f0 91 01 03 lds r31, 0x0301 - fd1c: f7 be out 0x37, r15 ; 55 - fd1e: e8 95 spm + fd32: e0 91 00 03 lds r30, 0x0300 + fd36: f0 91 01 03 lds r31, 0x0301 + fd3a: e7 be out 0x37, r14 ; 55 + fd3c: e8 95 spm boot_spm_busy_wait(); - fd20: 07 b6 in r0, 0x37 ; 55 - fd22: 00 fc sbrc r0, 0 - fd24: fd cf rjmp .-6 ; 0xfd20 + fd3e: 07 b6 in r0, 0x37 ; 55 + fd40: 00 fc sbrc r0, 0 + fd42: fd cf rjmp .-6 ; 0xfd3e #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); - fd26: e7 be out 0x37, r14 ; 55 - fd28: e8 95 spm - fd2a: 27 c0 rjmp .+78 ; 0xfd7a + fd44: f7 be out 0x37, r15 ; 55 + fd46: e8 95 spm + fd48: 27 c0 rjmp .+78 ; 0xfd98 #endif } /* Read memory block mode, length is big endian. */ else if(ch == STK_READ_PAGE) { - fd2c: 84 37 cpi r24, 0x74 ; 116 - fd2e: b9 f4 brne .+46 ; 0xfd5e + fd4a: 84 37 cpi r24, 0x74 ; 116 + fd4c: b9 f4 brne .+46 ; 0xfd7c // READ PAGE - we only read flash getLen(); - fd30: 37 d0 rcall .+110 ; 0xfda0 + fd4e: 37 d0 rcall .+110 ; 0xfdbe verifySpace(); - fd32: 46 d0 rcall .+140 ; 0xfdc0 + fd50: 46 d0 rcall .+140 ; 0xfdde putch(result); address++; } while (--length); #else do putch(pgm_read_byte_near(address++)); - fd34: e0 91 00 03 lds r30, 0x0300 - fd38: f0 91 01 03 lds r31, 0x0301 - fd3c: 31 96 adiw r30, 0x01 ; 1 - fd3e: f0 93 01 03 sts 0x0301, r31 - fd42: e0 93 00 03 sts 0x0300, r30 - fd46: 31 97 sbiw r30, 0x01 ; 1 - fd48: e4 91 lpm r30, Z+ - fd4a: 8e 2f mov r24, r30 - fd4c: 19 d0 rcall .+50 ; 0xfd80 + fd52: e0 91 00 03 lds r30, 0x0300 + fd56: f0 91 01 03 lds r31, 0x0301 + fd5a: 31 96 adiw r30, 0x01 ; 1 + fd5c: f0 93 01 03 sts 0x0301, r31 + fd60: e0 93 00 03 sts 0x0300, r30 + fd64: 31 97 sbiw r30, 0x01 ; 1 + fd66: e4 91 lpm r30, Z+ + fd68: 8e 2f mov r24, r30 + fd6a: 19 d0 rcall .+50 ; 0xfd9e while (--length); - fd4e: 80 91 02 03 lds r24, 0x0302 - fd52: 81 50 subi r24, 0x01 ; 1 - fd54: 80 93 02 03 sts 0x0302, r24 - fd58: 88 23 and r24, r24 - fd5a: 61 f7 brne .-40 ; 0xfd34 - fd5c: 0e c0 rjmp .+28 ; 0xfd7a + fd6c: 80 91 02 03 lds r24, 0x0302 + fd70: 81 50 subi r24, 0x01 ; 1 + fd72: 80 93 02 03 sts 0x0302, r24 + fd76: 88 23 and r24, r24 + fd78: 61 f7 brne .-40 ; 0xfd52 + fd7a: 0e c0 rjmp .+28 ; 0xfd98 #endif #endif } /* Get device signature bytes */ else if(ch == STK_READ_SIGN) { - fd5e: 85 37 cpi r24, 0x75 ; 117 - fd60: 39 f4 brne .+14 ; 0xfd70 + fd7c: 85 37 cpi r24, 0x75 ; 117 + fd7e: 39 f4 brne .+14 ; 0xfd8e // READ SIGN - return what Avrdude wants to hear verifySpace(); - fd62: 2e d0 rcall .+92 ; 0xfdc0 + fd80: 2e d0 rcall .+92 ; 0xfdde putch(SIGNATURE_0); - fd64: 8e e1 ldi r24, 0x1E ; 30 - fd66: 0c d0 rcall .+24 ; 0xfd80 + fd82: 8e e1 ldi r24, 0x1E ; 30 + fd84: 0c d0 rcall .+24 ; 0xfd9e putch(SIGNATURE_1); - fd68: 86 e9 ldi r24, 0x96 ; 150 - fd6a: 0a d0 rcall .+20 ; 0xfd80 + fd86: 86 e9 ldi r24, 0x96 ; 150 + fd88: 0a d0 rcall .+20 ; 0xfd9e putch(SIGNATURE_2); - fd6c: 8a e0 ldi r24, 0x0A ; 10 - fd6e: 9a cf rjmp .-204 ; 0xfca4 + fd8a: 8a e0 ldi r24, 0x0A ; 10 + fd8c: 8b cf rjmp .-234 ; 0xfca4 } else if (ch == 'Q') { - fd70: 81 35 cpi r24, 0x51 ; 81 - fd72: 11 f4 brne .+4 ; 0xfd78 + fd8e: 81 35 cpi r24, 0x51 ; 81 + fd90: 11 f4 brne .+4 ; 0xfd96 // Adaboot no-wait mod watchdogConfig(WATCHDOG_16MS); - fd74: 88 e0 ldi r24, 0x08 ; 8 - fd76: 19 d0 rcall .+50 ; 0xfdaa + fd92: 88 e0 ldi r24, 0x08 ; 8 + fd94: 19 d0 rcall .+50 ; 0xfdc8 verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); - fd78: 23 d0 rcall .+70 ; 0xfdc0 + fd96: 23 d0 rcall .+70 ; 0xfdde } putch(STK_OK); - fd7a: 80 e1 ldi r24, 0x10 ; 16 - fd7c: 01 d0 rcall .+2 ; 0xfd80 - fd7e: 6b cf rjmp .-298 ; 0xfc56 + fd98: 80 e1 ldi r24, 0x10 ; 16 + fd9a: 01 d0 rcall .+2 ; 0xfd9e + fd9c: 5c cf rjmp .-328 ; 0xfc56 -0000fd80 : +0000fd9e : } } void putch(char ch) { - fd80: 98 2f mov r25, r24 + fd9e: 98 2f mov r25, r24 #ifndef SOFT_UART while (!(UCSR0A & _BV(UDRE0))); - fd82: 80 91 c0 00 lds r24, 0x00C0 - fd86: 85 ff sbrs r24, 5 - fd88: fc cf rjmp .-8 ; 0xfd82 + fda0: 80 91 c0 00 lds r24, 0x00C0 + fda4: 85 ff sbrs r24, 5 + fda6: fc cf rjmp .-8 ; 0xfda0 UDR0 = ch; - fd8a: 90 93 c6 00 sts 0x00C6, r25 + fda8: 90 93 c6 00 sts 0x00C6, r25 [uartBit] "I" (UART_TX_BIT) : "r25" ); #endif } - fd8e: 08 95 ret + fdac: 08 95 ret -0000fd90 : +0000fdae : return getch(); } // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( - fd90: a8 95 wdr + fdae: a8 95 wdr [uartBit] "I" (UART_RX_BIT) : "r25" ); #else while(!(UCSR0A & _BV(RXC0))); - fd92: 80 91 c0 00 lds r24, 0x00C0 - fd96: 87 ff sbrs r24, 7 - fd98: fc cf rjmp .-8 ; 0xfd92 + fdb0: 80 91 c0 00 lds r24, 0x00C0 + fdb4: 87 ff sbrs r24, 7 + fdb6: fc cf rjmp .-8 ; 0xfdb0 ch = UDR0; - fd9a: 80 91 c6 00 lds r24, 0x00C6 + fdb8: 80 91 c6 00 lds r24, 0x00C6 #ifdef LED_DATA_FLASH LED_PIN |= _BV(LED); #endif return ch; } - fd9e: 08 95 ret + fdbc: 08 95 ret -0000fda0 : +0000fdbe : } while (--count); } #endif uint8_t getLen() { getch(); - fda0: f7 df rcall .-18 ; 0xfd90 + fdbe: f7 df rcall .-18 ; 0xfdae length = getch(); - fda2: f6 df rcall .-20 ; 0xfd90 - fda4: 80 93 02 03 sts 0x0302, r24 + fdc0: f6 df rcall .-20 ; 0xfdae + fdc2: 80 93 02 03 sts 0x0302, r24 return getch(); } - fda8: f3 cf rjmp .-26 ; 0xfd90 + fdc6: f3 cf rjmp .-26 ; 0xfdae -0000fdaa : +0000fdc8 : "wdr\n" ); } void watchdogConfig(uint8_t x) { WDTCSR = _BV(WDCE) | _BV(WDE); - fdaa: e0 e6 ldi r30, 0x60 ; 96 - fdac: f0 e0 ldi r31, 0x00 ; 0 - fdae: 98 e1 ldi r25, 0x18 ; 24 - fdb0: 90 83 st Z, r25 + fdc8: e0 e6 ldi r30, 0x60 ; 96 + fdca: f0 e0 ldi r31, 0x00 ; 0 + fdcc: 98 e1 ldi r25, 0x18 ; 24 + fdce: 90 83 st Z, r25 WDTCSR = x; - fdb2: 80 83 st Z, r24 + fdd0: 80 83 st Z, r24 } - fdb4: 08 95 ret + fdd2: 08 95 ret -0000fdb6 : +0000fdd4 : void appStart() { watchdogConfig(WATCHDOG_OFF); - fdb6: 80 e0 ldi r24, 0x00 ; 0 - fdb8: f8 df rcall .-16 ; 0xfdaa + fdd4: 80 e0 ldi r24, 0x00 ; 0 + fdd6: f8 df rcall .-16 ; 0xfdc8 __asm__ __volatile__ ( - fdba: ee 27 eor r30, r30 - fdbc: ff 27 eor r31, r31 - fdbe: 09 94 ijmp + fdd8: ee 27 eor r30, r30 + fdda: ff 27 eor r31, r31 + fddc: 09 94 ijmp -0000fdc0 : +0000fdde : do getch(); while (--count); verifySpace(); } void verifySpace() { if (getch() != CRC_EOP) appStart(); - fdc0: e7 df rcall .-50 ; 0xfd90 - fdc2: 80 32 cpi r24, 0x20 ; 32 - fdc4: 09 f0 breq .+2 ; 0xfdc8 - fdc6: f7 df rcall .-18 ; 0xfdb6 + fdde: e7 df rcall .-50 ; 0xfdae + fde0: 80 32 cpi r24, 0x20 ; 32 + fde2: 09 f0 breq .+2 ; 0xfde6 + fde4: f7 df rcall .-18 ; 0xfdd4 putch(STK_INSYNC); - fdc8: 84 e1 ldi r24, 0x14 ; 20 + fde6: 84 e1 ldi r24, 0x14 ; 20 } - fdca: da cf rjmp .-76 ; 0xfd80 + fde8: da cf rjmp .-76 ; 0xfd9e ::[count] "M" (UART_B_VALUE) ); } #endif void getNch(uint8_t count) { - fdcc: 1f 93 push r17 - fdce: 18 2f mov r17, r24 + fdea: 1f 93 push r17 + fdec: 18 2f mov r17, r24 -0000fdd0 : +0000fdee : do getch(); while (--count); - fdd0: df df rcall .-66 ; 0xfd90 - fdd2: 11 50 subi r17, 0x01 ; 1 - fdd4: e9 f7 brne .-6 ; 0xfdd0 + fdee: df df rcall .-66 ; 0xfdae + fdf0: 11 50 subi r17, 0x01 ; 1 + fdf2: e9 f7 brne .-6 ; 0xfdee verifySpace(); - fdd6: f4 df rcall .-24 ; 0xfdc0 + fdf4: f4 df rcall .-24 ; 0xfdde } - fdd8: 1f 91 pop r17 - fdda: 08 95 ret + fdf6: 1f 91 pop r17 + fdf8: 08 95 ret diff --git a/optiboot/bootloaders/optiboot/optiboot_diecimila.hex b/optiboot/bootloaders/optiboot/optiboot_diecimila.hex index aefcee6..15c02ec 100644 --- a/optiboot/bootloaders/optiboot/optiboot_diecimila.hex +++ b/optiboot/bootloaders/optiboot/optiboot_diecimila.hex @@ -1,32 +1,34 @@ :103E000085E08093810082E08093C00088E1809308 :103E1000C10086E08093C20080E18093C40084B733 -:103E200014BE81FFC8D08DE0C0D0259A86E020E383 +:103E200014BE81FFD7D08DE0CFD0259A86E020E365 :103E30003CEF91E0309385002093840096BBB09BCB :103E4000FECF1D9AA8958150A9F7DD24D394A5E053 -:103E5000FA2EF1E1EF2E9CD0813421F481E0B6D02E +:103E5000EA2EF1E1FF2EABD0813421F481E0C5D010 :103E600083E020C0823411F484E103C0853419F466 -:103E700085E0ACD082C0853581F48AD0082F10E06F -:103E800087D090E0982F8827802B912B880F991F3F -:103E900090930102809300026FC0863529F484E07C -:103EA00095D080E06DD069C0843609F03FC078D0ED -:103EB000E0910002F091010283E087BFE895C0E045 -:103EC000D1E066D0899380910202815080930202F2 -:103ED0008823B9F775D007B600FCFDCF40910002EA -:103EE00050910102A0E0B1E02C9130E011968C914C -:103EF000119790E0982F8827822B932B1296FA0126 -:103F00000C01D7BEE89511244E5F5F4FF1E0A03859 -:103F1000BF0751F7E0910002F0910102F7BEE8956A -:103F200007B600FCFDCFE7BEE89527C08437B9F49B -:103F300037D046D0E0910002F09101023196F09323 -:103F40000102E09300023197E4918E2F19D0809105 -:103F50000202815080930202882361F70EC08537E8 -:103F600039F42ED08EE10CD084E90AD086E09ACFC5 -:103F7000813511F488E019D023D080E101D06BCFD6 -:103F8000982F8091C00085FFFCCF9093C6000895C4 -:103F9000A8958091C00087FFFCCF8091C60008954E -:103FA000F7DFF6DF80930202F3CFE0E6F0E098E17E -:103FB00090838083089580E0F8DFEE27FF2709943F -:103FC000E7DF803209F0F7DF84E1DACF1F93182FA3 -:0C3FD000DFDF1150E9F7F4DF1F910895C6 +:103E700085E0BBD091C0853581F499D0082F10E042 +:103E800096D090E0982F8827802B912B880F991F30 +:103E900090930102809300027EC0863529F484E06D +:103EA000A4D080E07CD078C0843609F04EC087D0A2 +:103EB000E0910002F091010288E3E030F80718F485 +:103EC00083E087BFE895C0E0D1E071D0899380910D +:103ED00002028150809302028823B9F7E091000228 +:103EE000F091010288E3E030F80718F083E087BF23 +:103EF000E89575D007B600FCFDCF409100025091C7 +:103F00000102A0E0B1E02C9130E011968C91119764 +:103F100090E0982F8827822B932B1296FA010C01A0 +:103F2000D7BEE89511244E5F5F4FF1E0A038BF0780 +:103F300051F7E0910002F0910102E7BEE89507B663 +:103F400000FCFDCFF7BEE89527C08437B9F437D021 +:103F500046D0E0910002F09101023196F093010207 +:103F6000E09300023197E4918E2F19D080910202E4 +:103F7000815080930202882361F70EC0853739F49F +:103F80002ED08EE10CD084E90AD086E08BCF81352B +:103F900011F488E019D023D080E101D05CCF982FB4 +:103FA0008091C00085FFFCCF9093C6000895A8952E +:103FB0008091C00087FFFCCF8091C6000895F7DF95 +:103FC000F6DF80930202F3CFE0E6F0E098E1908321 +:103FD0008083089580E0F8DFEE27FF270994E7DF6C +:103FE000803209F0F7DF84E1DACF1F93182FDFDF8B +:0A3FF0001150E9F7F4DF1F91089566 :0400000300003E00BB :00000001FF diff --git a/optiboot/bootloaders/optiboot/optiboot_diecimila.lst b/optiboot/bootloaders/optiboot/optiboot_diecimila.lst index 2abeee2..7ab5b0a 100644 --- a/optiboot/bootloaders/optiboot/optiboot_diecimila.lst +++ b/optiboot/bootloaders/optiboot/optiboot_diecimila.lst @@ -3,25 +3,25 @@ optiboot_diecimila.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn - 0 .text 000001dc 00003e00 00003e00 00000054 2**1 + 0 .text 000001fa 00003e00 00003e00 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .debug_aranges 00000028 00000000 00000000 00000230 2**0 + 1 .debug_aranges 00000028 00000000 00000000 0000024e 2**0 CONTENTS, READONLY, DEBUGGING - 2 .debug_pubnames 0000006a 00000000 00000000 00000258 2**0 + 2 .debug_pubnames 0000006a 00000000 00000000 00000276 2**0 CONTENTS, READONLY, DEBUGGING - 3 .debug_info 00000283 00000000 00000000 000002c2 2**0 + 3 .debug_info 00000284 00000000 00000000 000002e0 2**0 CONTENTS, READONLY, DEBUGGING - 4 .debug_abbrev 000001ae 00000000 00000000 00000545 2**0 + 4 .debug_abbrev 000001ae 00000000 00000000 00000564 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_line 000003db 00000000 00000000 000006f3 2**0 + 5 .debug_line 000003e3 00000000 00000000 00000712 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_frame 00000090 00000000 00000000 00000ad0 2**2 + 6 .debug_frame 00000090 00000000 00000000 00000af8 2**2 CONTENTS, READONLY, DEBUGGING - 7 .debug_str 00000140 00000000 00000000 00000b60 2**0 + 7 .debug_str 00000140 00000000 00000000 00000b88 2**0 CONTENTS, READONLY, DEBUGGING - 8 .debug_loc 000001d1 00000000 00000000 00000ca0 2**0 + 8 .debug_loc 000001e1 00000000 00000000 00000cc8 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_ranges 00000068 00000000 00000000 00000e71 2**0 + 9 .debug_ranges 00000068 00000000 00000000 00000ea9 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: @@ -61,12 +61,12 @@ int main(void) { 3e20: 14 be out 0x34, r1 ; 52 if (!(ch & _BV(EXTRF))) appStart(); 3e22: 81 ff sbrs r24, 1 - 3e24: c8 d0 rcall .+400 ; 0x3fb6 + 3e24: d7 d0 rcall .+430 ; 0x3fd4 // Set up watchdog to trigger after 500ms watchdogConfig(WATCHDOG_500MS); 3e26: 8d e0 ldi r24, 0x0D ; 13 - 3e28: c0 d0 rcall .+384 ; 0x3faa + 3e28: cf d0 rcall .+414 ; 0x3fc8 /* Set LED pin as output */ LED_DDR |= _BV(LED); @@ -127,21 +127,21 @@ void watchdogReset() { // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); 3e4e: a5 e0 ldi r26, 0x05 ; 5 - 3e50: fa 2e mov r15, r26 + 3e50: ea 2e mov r14, r26 boot_spm_busy_wait(); #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); 3e52: f1 e1 ldi r31, 0x11 ; 17 - 3e54: ef 2e mov r14, r31 + 3e54: ff 2e mov r15, r31 #endif /* Forever loop */ for (;;) { /* get character from UART */ ch = getch(); - 3e56: 9c d0 rcall .+312 ; 0x3f90 + 3e56: ab d0 rcall .+342 ; 0x3fae if(ch == STK_GET_PARAMETER) { 3e58: 81 34 cpi r24, 0x41 ; 65 @@ -149,7 +149,7 @@ void watchdogReset() { // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy getNch(1); 3e5c: 81 e0 ldi r24, 0x01 ; 1 - 3e5e: b6 d0 rcall .+364 ; 0x3fcc + 3e5e: c5 d0 rcall .+394 ; 0x3fea putch(0x03); 3e60: 83 e0 ldi r24, 0x03 ; 3 3e62: 20 c0 rjmp .+64 ; 0x3ea4 @@ -168,8 +168,8 @@ void watchdogReset() { // SET DEVICE EXT is ignored getNch(5); 3e70: 85 e0 ldi r24, 0x05 ; 5 - 3e72: ac d0 rcall .+344 ; 0x3fcc - 3e74: 82 c0 rjmp .+260 ; 0x3f7a + 3e72: bb d0 rcall .+374 ; 0x3fea + 3e74: 91 c0 rjmp .+290 ; 0x3f98 } else if(ch == STK_LOAD_ADDRESS) { 3e76: 85 35 cpi r24, 0x55 ; 85 @@ -177,11 +177,11 @@ void watchdogReset() { // LOAD ADDRESS uint16_t newAddress; newAddress = getch(); - 3e7a: 8a d0 rcall .+276 ; 0x3f90 + 3e7a: 99 d0 rcall .+306 ; 0x3fae newAddress = (newAddress & 0xff) | (getch() << 8); 3e7c: 08 2f mov r16, r24 3e7e: 10 e0 ldi r17, 0x00 ; 0 - 3e80: 87 d0 rcall .+270 ; 0x3f90 + 3e80: 96 d0 rcall .+300 ; 0x3fae 3e82: 90 e0 ldi r25, 0x00 ; 0 3e84: 98 2f mov r25, r24 3e86: 88 27 eor r24, r24 @@ -197,7 +197,7 @@ void watchdogReset() { address = newAddress; 3e90: 90 93 01 02 sts 0x0201, r25 3e94: 80 93 00 02 sts 0x0200, r24 - 3e98: 6f c0 rjmp .+222 ; 0x3f78 + 3e98: 7e c0 rjmp .+252 ; 0x3f96 verifySpace(); } else if(ch == STK_UNIVERSAL) { @@ -206,320 +206,337 @@ void watchdogReset() { // UNIVERSAL command is ignored getNch(4); 3e9e: 84 e0 ldi r24, 0x04 ; 4 - 3ea0: 95 d0 rcall .+298 ; 0x3fcc + 3ea0: a4 d0 rcall .+328 ; 0x3fea putch(0x00); 3ea2: 80 e0 ldi r24, 0x00 ; 0 - 3ea4: 6d d0 rcall .+218 ; 0x3f80 - 3ea6: 69 c0 rjmp .+210 ; 0x3f7a + 3ea4: 7c d0 rcall .+248 ; 0x3f9e + 3ea6: 78 c0 rjmp .+240 ; 0x3f98 } /* Write memory, length is big endian and is in bytes */ else if(ch == STK_PROG_PAGE) { 3ea8: 84 36 cpi r24, 0x64 ; 100 3eaa: 09 f0 breq .+2 ; 0x3eae - 3eac: 3f c0 rjmp .+126 ; 0x3f2c + 3eac: 4e c0 rjmp .+156 ; 0x3f4a // PROGRAM PAGE - we support flash programming only, not EEPROM uint8_t *bufPtr; uint16_t addrPtr; getLen(); - 3eae: 78 d0 rcall .+240 ; 0x3fa0 + 3eae: 87 d0 rcall .+270 ; 0x3fbe - // Immediately start page erase - this will 4.5ms - __boot_page_erase_short((uint16_t)(void*)address); + // If we are in RWW section, immediately start page erase + if (address < NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); 3eb0: e0 91 00 02 lds r30, 0x0200 3eb4: f0 91 01 02 lds r31, 0x0201 - 3eb8: 83 e0 ldi r24, 0x03 ; 3 - 3eba: 87 bf out 0x37, r24 ; 55 - 3ebc: e8 95 spm - 3ebe: c0 e0 ldi r28, 0x00 ; 0 - 3ec0: d1 e0 ldi r29, 0x01 ; 1 + 3eb8: 88 e3 ldi r24, 0x38 ; 56 + 3eba: e0 30 cpi r30, 0x00 ; 0 + 3ebc: f8 07 cpc r31, r24 + 3ebe: 18 f4 brcc .+6 ; 0x3ec6 + 3ec0: 83 e0 ldi r24, 0x03 ; 3 + 3ec2: 87 bf out 0x37, r24 ; 55 + 3ec4: e8 95 spm + 3ec6: c0 e0 ldi r28, 0x00 ; 0 + 3ec8: d1 e0 ldi r29, 0x01 ; 1 // While that is going on, read in page contents bufPtr = buff; do *bufPtr++ = getch(); - 3ec2: 66 d0 rcall .+204 ; 0x3f90 - 3ec4: 89 93 st Y+, r24 + 3eca: 71 d0 rcall .+226 ; 0x3fae + 3ecc: 89 93 st Y+, r24 while (--length); - 3ec6: 80 91 02 02 lds r24, 0x0202 - 3eca: 81 50 subi r24, 0x01 ; 1 - 3ecc: 80 93 02 02 sts 0x0202, r24 - 3ed0: 88 23 and r24, r24 - 3ed2: b9 f7 brne .-18 ; 0x3ec2 + 3ece: 80 91 02 02 lds r24, 0x0202 + 3ed2: 81 50 subi r24, 0x01 ; 1 + 3ed4: 80 93 02 02 sts 0x0202, r24 + 3ed8: 88 23 and r24, r24 + 3eda: b9 f7 brne .-18 ; 0x3eca + + // If we are in NRWW section, page erase has to be delayed until now. + // Todo: Take RAMPZ into account + if (address >= NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); + 3edc: e0 91 00 02 lds r30, 0x0200 + 3ee0: f0 91 01 02 lds r31, 0x0201 + 3ee4: 88 e3 ldi r24, 0x38 ; 56 + 3ee6: e0 30 cpi r30, 0x00 ; 0 + 3ee8: f8 07 cpc r31, r24 + 3eea: 18 f0 brcs .+6 ; 0x3ef2 + 3eec: 83 e0 ldi r24, 0x03 ; 3 + 3eee: 87 bf out 0x37, r24 ; 55 + 3ef0: e8 95 spm // Read command terminator, start reply verifySpace(); - 3ed4: 75 d0 rcall .+234 ; 0x3fc0 + 3ef2: 75 d0 rcall .+234 ; 0x3fde // If only a partial page is to be programmed, the erase might not be complete. // So check that here boot_spm_busy_wait(); - 3ed6: 07 b6 in r0, 0x37 ; 55 - 3ed8: 00 fc sbrc r0, 0 - 3eda: fd cf rjmp .-6 ; 0x3ed6 + 3ef4: 07 b6 in r0, 0x37 ; 55 + 3ef6: 00 fc sbrc r0, 0 + 3ef8: fd cf rjmp .-6 ; 0x3ef4 } #endif // Copy buffer into programming buffer bufPtr = buff; addrPtr = (uint16_t)(void*)address; - 3edc: 40 91 00 02 lds r20, 0x0200 - 3ee0: 50 91 01 02 lds r21, 0x0201 - 3ee4: a0 e0 ldi r26, 0x00 ; 0 - 3ee6: b1 e0 ldi r27, 0x01 ; 1 + 3efa: 40 91 00 02 lds r20, 0x0200 + 3efe: 50 91 01 02 lds r21, 0x0201 + 3f02: a0 e0 ldi r26, 0x00 ; 0 + 3f04: b1 e0 ldi r27, 0x01 ; 1 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; - 3ee8: 2c 91 ld r18, X - 3eea: 30 e0 ldi r19, 0x00 ; 0 + 3f06: 2c 91 ld r18, X + 3f08: 30 e0 ldi r19, 0x00 ; 0 a |= (*bufPtr++) << 8; - 3eec: 11 96 adiw r26, 0x01 ; 1 - 3eee: 8c 91 ld r24, X - 3ef0: 11 97 sbiw r26, 0x01 ; 1 - 3ef2: 90 e0 ldi r25, 0x00 ; 0 - 3ef4: 98 2f mov r25, r24 - 3ef6: 88 27 eor r24, r24 - 3ef8: 82 2b or r24, r18 - 3efa: 93 2b or r25, r19 + 3f0a: 11 96 adiw r26, 0x01 ; 1 + 3f0c: 8c 91 ld r24, X + 3f0e: 11 97 sbiw r26, 0x01 ; 1 + 3f10: 90 e0 ldi r25, 0x00 ; 0 + 3f12: 98 2f mov r25, r24 + 3f14: 88 27 eor r24, r24 + 3f16: 82 2b or r24, r18 + 3f18: 93 2b or r25, r19 #define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #endif /* main program starts here */ int main(void) { - 3efc: 12 96 adiw r26, 0x02 ; 2 + 3f1a: 12 96 adiw r26, 0x02 ; 2 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; a |= (*bufPtr++) << 8; __boot_page_fill_short((uint16_t)(void*)addrPtr,a); - 3efe: fa 01 movw r30, r20 - 3f00: 0c 01 movw r0, r24 - 3f02: d7 be out 0x37, r13 ; 55 - 3f04: e8 95 spm - 3f06: 11 24 eor r1, r1 + 3f1c: fa 01 movw r30, r20 + 3f1e: 0c 01 movw r0, r24 + 3f20: d7 be out 0x37, r13 ; 55 + 3f22: e8 95 spm + 3f24: 11 24 eor r1, r1 addrPtr += 2; - 3f08: 4e 5f subi r20, 0xFE ; 254 - 3f0a: 5f 4f sbci r21, 0xFF ; 255 + 3f26: 4e 5f subi r20, 0xFE ; 254 + 3f28: 5f 4f sbci r21, 0xFF ; 255 } while (--ch); - 3f0c: f1 e0 ldi r31, 0x01 ; 1 - 3f0e: a0 38 cpi r26, 0x80 ; 128 - 3f10: bf 07 cpc r27, r31 - 3f12: 51 f7 brne .-44 ; 0x3ee8 + 3f2a: f1 e0 ldi r31, 0x01 ; 1 + 3f2c: a0 38 cpi r26, 0x80 ; 128 + 3f2e: bf 07 cpc r27, r31 + 3f30: 51 f7 brne .-44 ; 0x3f06 // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); - 3f14: e0 91 00 02 lds r30, 0x0200 - 3f18: f0 91 01 02 lds r31, 0x0201 - 3f1c: f7 be out 0x37, r15 ; 55 - 3f1e: e8 95 spm + 3f32: e0 91 00 02 lds r30, 0x0200 + 3f36: f0 91 01 02 lds r31, 0x0201 + 3f3a: e7 be out 0x37, r14 ; 55 + 3f3c: e8 95 spm boot_spm_busy_wait(); - 3f20: 07 b6 in r0, 0x37 ; 55 - 3f22: 00 fc sbrc r0, 0 - 3f24: fd cf rjmp .-6 ; 0x3f20 + 3f3e: 07 b6 in r0, 0x37 ; 55 + 3f40: 00 fc sbrc r0, 0 + 3f42: fd cf rjmp .-6 ; 0x3f3e #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); - 3f26: e7 be out 0x37, r14 ; 55 - 3f28: e8 95 spm - 3f2a: 27 c0 rjmp .+78 ; 0x3f7a + 3f44: f7 be out 0x37, r15 ; 55 + 3f46: e8 95 spm + 3f48: 27 c0 rjmp .+78 ; 0x3f98 #endif } /* Read memory block mode, length is big endian. */ else if(ch == STK_READ_PAGE) { - 3f2c: 84 37 cpi r24, 0x74 ; 116 - 3f2e: b9 f4 brne .+46 ; 0x3f5e + 3f4a: 84 37 cpi r24, 0x74 ; 116 + 3f4c: b9 f4 brne .+46 ; 0x3f7c // READ PAGE - we only read flash getLen(); - 3f30: 37 d0 rcall .+110 ; 0x3fa0 + 3f4e: 37 d0 rcall .+110 ; 0x3fbe verifySpace(); - 3f32: 46 d0 rcall .+140 ; 0x3fc0 + 3f50: 46 d0 rcall .+140 ; 0x3fde putch(result); address++; } while (--length); #else do putch(pgm_read_byte_near(address++)); - 3f34: e0 91 00 02 lds r30, 0x0200 - 3f38: f0 91 01 02 lds r31, 0x0201 - 3f3c: 31 96 adiw r30, 0x01 ; 1 - 3f3e: f0 93 01 02 sts 0x0201, r31 - 3f42: e0 93 00 02 sts 0x0200, r30 - 3f46: 31 97 sbiw r30, 0x01 ; 1 - 3f48: e4 91 lpm r30, Z+ - 3f4a: 8e 2f mov r24, r30 - 3f4c: 19 d0 rcall .+50 ; 0x3f80 + 3f52: e0 91 00 02 lds r30, 0x0200 + 3f56: f0 91 01 02 lds r31, 0x0201 + 3f5a: 31 96 adiw r30, 0x01 ; 1 + 3f5c: f0 93 01 02 sts 0x0201, r31 + 3f60: e0 93 00 02 sts 0x0200, r30 + 3f64: 31 97 sbiw r30, 0x01 ; 1 + 3f66: e4 91 lpm r30, Z+ + 3f68: 8e 2f mov r24, r30 + 3f6a: 19 d0 rcall .+50 ; 0x3f9e while (--length); - 3f4e: 80 91 02 02 lds r24, 0x0202 - 3f52: 81 50 subi r24, 0x01 ; 1 - 3f54: 80 93 02 02 sts 0x0202, r24 - 3f58: 88 23 and r24, r24 - 3f5a: 61 f7 brne .-40 ; 0x3f34 - 3f5c: 0e c0 rjmp .+28 ; 0x3f7a + 3f6c: 80 91 02 02 lds r24, 0x0202 + 3f70: 81 50 subi r24, 0x01 ; 1 + 3f72: 80 93 02 02 sts 0x0202, r24 + 3f76: 88 23 and r24, r24 + 3f78: 61 f7 brne .-40 ; 0x3f52 + 3f7a: 0e c0 rjmp .+28 ; 0x3f98 #endif #endif } /* Get device signature bytes */ else if(ch == STK_READ_SIGN) { - 3f5e: 85 37 cpi r24, 0x75 ; 117 - 3f60: 39 f4 brne .+14 ; 0x3f70 + 3f7c: 85 37 cpi r24, 0x75 ; 117 + 3f7e: 39 f4 brne .+14 ; 0x3f8e // READ SIGN - return what Avrdude wants to hear verifySpace(); - 3f62: 2e d0 rcall .+92 ; 0x3fc0 + 3f80: 2e d0 rcall .+92 ; 0x3fde putch(SIGNATURE_0); - 3f64: 8e e1 ldi r24, 0x1E ; 30 - 3f66: 0c d0 rcall .+24 ; 0x3f80 + 3f82: 8e e1 ldi r24, 0x1E ; 30 + 3f84: 0c d0 rcall .+24 ; 0x3f9e putch(SIGNATURE_1); - 3f68: 84 e9 ldi r24, 0x94 ; 148 - 3f6a: 0a d0 rcall .+20 ; 0x3f80 + 3f86: 84 e9 ldi r24, 0x94 ; 148 + 3f88: 0a d0 rcall .+20 ; 0x3f9e putch(SIGNATURE_2); - 3f6c: 86 e0 ldi r24, 0x06 ; 6 - 3f6e: 9a cf rjmp .-204 ; 0x3ea4 + 3f8a: 86 e0 ldi r24, 0x06 ; 6 + 3f8c: 8b cf rjmp .-234 ; 0x3ea4 } else if (ch == 'Q') { - 3f70: 81 35 cpi r24, 0x51 ; 81 - 3f72: 11 f4 brne .+4 ; 0x3f78 + 3f8e: 81 35 cpi r24, 0x51 ; 81 + 3f90: 11 f4 brne .+4 ; 0x3f96 // Adaboot no-wait mod watchdogConfig(WATCHDOG_16MS); - 3f74: 88 e0 ldi r24, 0x08 ; 8 - 3f76: 19 d0 rcall .+50 ; 0x3faa + 3f92: 88 e0 ldi r24, 0x08 ; 8 + 3f94: 19 d0 rcall .+50 ; 0x3fc8 verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); - 3f78: 23 d0 rcall .+70 ; 0x3fc0 + 3f96: 23 d0 rcall .+70 ; 0x3fde } putch(STK_OK); - 3f7a: 80 e1 ldi r24, 0x10 ; 16 - 3f7c: 01 d0 rcall .+2 ; 0x3f80 - 3f7e: 6b cf rjmp .-298 ; 0x3e56 + 3f98: 80 e1 ldi r24, 0x10 ; 16 + 3f9a: 01 d0 rcall .+2 ; 0x3f9e + 3f9c: 5c cf rjmp .-328 ; 0x3e56 -00003f80 : +00003f9e : } } void putch(char ch) { - 3f80: 98 2f mov r25, r24 + 3f9e: 98 2f mov r25, r24 #ifndef SOFT_UART while (!(UCSR0A & _BV(UDRE0))); - 3f82: 80 91 c0 00 lds r24, 0x00C0 - 3f86: 85 ff sbrs r24, 5 - 3f88: fc cf rjmp .-8 ; 0x3f82 + 3fa0: 80 91 c0 00 lds r24, 0x00C0 + 3fa4: 85 ff sbrs r24, 5 + 3fa6: fc cf rjmp .-8 ; 0x3fa0 UDR0 = ch; - 3f8a: 90 93 c6 00 sts 0x00C6, r25 + 3fa8: 90 93 c6 00 sts 0x00C6, r25 [uartBit] "I" (UART_TX_BIT) : "r25" ); #endif } - 3f8e: 08 95 ret + 3fac: 08 95 ret -00003f90 : +00003fae : return getch(); } // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( - 3f90: a8 95 wdr + 3fae: a8 95 wdr [uartBit] "I" (UART_RX_BIT) : "r25" ); #else while(!(UCSR0A & _BV(RXC0))); - 3f92: 80 91 c0 00 lds r24, 0x00C0 - 3f96: 87 ff sbrs r24, 7 - 3f98: fc cf rjmp .-8 ; 0x3f92 + 3fb0: 80 91 c0 00 lds r24, 0x00C0 + 3fb4: 87 ff sbrs r24, 7 + 3fb6: fc cf rjmp .-8 ; 0x3fb0 ch = UDR0; - 3f9a: 80 91 c6 00 lds r24, 0x00C6 + 3fb8: 80 91 c6 00 lds r24, 0x00C6 #ifdef LED_DATA_FLASH LED_PIN |= _BV(LED); #endif return ch; } - 3f9e: 08 95 ret + 3fbc: 08 95 ret -00003fa0 : +00003fbe : } while (--count); } #endif uint8_t getLen() { getch(); - 3fa0: f7 df rcall .-18 ; 0x3f90 + 3fbe: f7 df rcall .-18 ; 0x3fae length = getch(); - 3fa2: f6 df rcall .-20 ; 0x3f90 - 3fa4: 80 93 02 02 sts 0x0202, r24 + 3fc0: f6 df rcall .-20 ; 0x3fae + 3fc2: 80 93 02 02 sts 0x0202, r24 return getch(); } - 3fa8: f3 cf rjmp .-26 ; 0x3f90 + 3fc6: f3 cf rjmp .-26 ; 0x3fae -00003faa : +00003fc8 : "wdr\n" ); } void watchdogConfig(uint8_t x) { WDTCSR = _BV(WDCE) | _BV(WDE); - 3faa: e0 e6 ldi r30, 0x60 ; 96 - 3fac: f0 e0 ldi r31, 0x00 ; 0 - 3fae: 98 e1 ldi r25, 0x18 ; 24 - 3fb0: 90 83 st Z, r25 + 3fc8: e0 e6 ldi r30, 0x60 ; 96 + 3fca: f0 e0 ldi r31, 0x00 ; 0 + 3fcc: 98 e1 ldi r25, 0x18 ; 24 + 3fce: 90 83 st Z, r25 WDTCSR = x; - 3fb2: 80 83 st Z, r24 + 3fd0: 80 83 st Z, r24 } - 3fb4: 08 95 ret + 3fd2: 08 95 ret -00003fb6 : +00003fd4 : void appStart() { watchdogConfig(WATCHDOG_OFF); - 3fb6: 80 e0 ldi r24, 0x00 ; 0 - 3fb8: f8 df rcall .-16 ; 0x3faa + 3fd4: 80 e0 ldi r24, 0x00 ; 0 + 3fd6: f8 df rcall .-16 ; 0x3fc8 __asm__ __volatile__ ( - 3fba: ee 27 eor r30, r30 - 3fbc: ff 27 eor r31, r31 - 3fbe: 09 94 ijmp + 3fd8: ee 27 eor r30, r30 + 3fda: ff 27 eor r31, r31 + 3fdc: 09 94 ijmp -00003fc0 : +00003fde : do getch(); while (--count); verifySpace(); } void verifySpace() { if (getch() != CRC_EOP) appStart(); - 3fc0: e7 df rcall .-50 ; 0x3f90 - 3fc2: 80 32 cpi r24, 0x20 ; 32 - 3fc4: 09 f0 breq .+2 ; 0x3fc8 - 3fc6: f7 df rcall .-18 ; 0x3fb6 + 3fde: e7 df rcall .-50 ; 0x3fae + 3fe0: 80 32 cpi r24, 0x20 ; 32 + 3fe2: 09 f0 breq .+2 ; 0x3fe6 + 3fe4: f7 df rcall .-18 ; 0x3fd4 putch(STK_INSYNC); - 3fc8: 84 e1 ldi r24, 0x14 ; 20 + 3fe6: 84 e1 ldi r24, 0x14 ; 20 } - 3fca: da cf rjmp .-76 ; 0x3f80 + 3fe8: da cf rjmp .-76 ; 0x3f9e ::[count] "M" (UART_B_VALUE) ); } #endif void getNch(uint8_t count) { - 3fcc: 1f 93 push r17 - 3fce: 18 2f mov r17, r24 + 3fea: 1f 93 push r17 + 3fec: 18 2f mov r17, r24 -00003fd0 : +00003fee : do getch(); while (--count); - 3fd0: df df rcall .-66 ; 0x3f90 - 3fd2: 11 50 subi r17, 0x01 ; 1 - 3fd4: e9 f7 brne .-6 ; 0x3fd0 + 3fee: df df rcall .-66 ; 0x3fae + 3ff0: 11 50 subi r17, 0x01 ; 1 + 3ff2: e9 f7 brne .-6 ; 0x3fee verifySpace(); - 3fd6: f4 df rcall .-24 ; 0x3fc0 + 3ff4: f4 df rcall .-24 ; 0x3fde } - 3fd8: 1f 91 pop r17 - 3fda: 08 95 ret + 3ff6: 1f 91 pop r17 + 3ff8: 08 95 ret diff --git a/optiboot/bootloaders/optiboot/optiboot_lilypad.hex b/optiboot/bootloaders/optiboot/optiboot_lilypad.hex index 6fc5c98..4053242 100644 --- a/optiboot/bootloaders/optiboot/optiboot_lilypad.hex +++ b/optiboot/bootloaders/optiboot/optiboot_lilypad.hex @@ -1,32 +1,34 @@ :103E000085E08093810082E08093C00088E1809308 :103E1000C10086E08093C20088E08093C40084B72C -:103E200014BE81FFC8D08DE0C0D0259A86E028E17D +:103E200014BE81FFD7D08DE0CFD0259A86E028E15F :103E30003EEF91E0309385002093840096BBB09BC9 :103E4000FECF1D9AA8958150A9F7DD24D394A5E053 -:103E5000FA2EF1E1EF2E9CD0813421F481E0B6D02E +:103E5000EA2EF1E1FF2EABD0813421F481E0C5D010 :103E600083E020C0823411F484E103C0853419F466 -:103E700085E0ACD082C0853581F48AD0082F10E06F -:103E800087D090E0982F8827802B912B880F991F3F -:103E900090930102809300026FC0863529F484E07C -:103EA00095D080E06DD069C0843609F03FC078D0ED -:103EB000E0910002F091010283E087BFE895C0E045 -:103EC000D1E066D0899380910202815080930202F2 -:103ED0008823B9F775D007B600FCFDCF40910002EA -:103EE00050910102A0E0B1E02C9130E011968C914C -:103EF000119790E0982F8827822B932B1296FA0126 -:103F00000C01D7BEE89511244E5F5F4FF1E0A03859 -:103F1000BF0751F7E0910002F0910102F7BEE8956A -:103F200007B600FCFDCFE7BEE89527C08437B9F49B -:103F300037D046D0E0910002F09101023196F09323 -:103F40000102E09300023197E4918E2F19D0809105 -:103F50000202815080930202882361F70EC08537E8 -:103F600039F42ED08EE10CD084E90AD086E09ACFC5 -:103F7000813511F488E019D023D080E101D06BCFD6 -:103F8000982F8091C00085FFFCCF9093C6000895C4 -:103F9000A8958091C00087FFFCCF8091C60008954E -:103FA000F7DFF6DF80930202F3CFE0E6F0E098E17E -:103FB00090838083089580E0F8DFEE27FF2709943F -:103FC000E7DF803209F0F7DF84E1DACF1F93182FA3 -:0C3FD000DFDF1150E9F7F4DF1F910895C6 +:103E700085E0BBD091C0853581F499D0082F10E042 +:103E800096D090E0982F8827802B912B880F991F30 +:103E900090930102809300027EC0863529F484E06D +:103EA000A4D080E07CD078C0843609F04EC087D0A2 +:103EB000E0910002F091010288E3E030F80718F485 +:103EC00083E087BFE895C0E0D1E071D0899380910D +:103ED00002028150809302028823B9F7E091000228 +:103EE000F091010288E3E030F80718F083E087BF23 +:103EF000E89575D007B600FCFDCF409100025091C7 +:103F00000102A0E0B1E02C9130E011968C91119764 +:103F100090E0982F8827822B932B1296FA010C01A0 +:103F2000D7BEE89511244E5F5F4FF1E0A038BF0780 +:103F300051F7E0910002F0910102E7BEE89507B663 +:103F400000FCFDCFF7BEE89527C08437B9F437D021 +:103F500046D0E0910002F09101023196F093010207 +:103F6000E09300023197E4918E2F19D080910202E4 +:103F7000815080930202882361F70EC0853739F49F +:103F80002ED08EE10CD084E90AD086E08BCF81352B +:103F900011F488E019D023D080E101D05CCF982FB4 +:103FA0008091C00085FFFCCF9093C6000895A8952E +:103FB0008091C00087FFFCCF8091C6000895F7DF95 +:103FC000F6DF80930202F3CFE0E6F0E098E1908321 +:103FD0008083089580E0F8DFEE27FF270994E7DF6C +:103FE000803209F0F7DF84E1DACF1F93182FDFDF8B +:0A3FF0001150E9F7F4DF1F91089566 :0400000300003E00BB :00000001FF diff --git a/optiboot/bootloaders/optiboot/optiboot_lilypad.lst b/optiboot/bootloaders/optiboot/optiboot_lilypad.lst index 12652a3..1c330be 100644 --- a/optiboot/bootloaders/optiboot/optiboot_lilypad.lst +++ b/optiboot/bootloaders/optiboot/optiboot_lilypad.lst @@ -3,25 +3,25 @@ optiboot_lilypad.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn - 0 .text 000001dc 00003e00 00003e00 00000054 2**1 + 0 .text 000001fa 00003e00 00003e00 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .debug_aranges 00000028 00000000 00000000 00000230 2**0 + 1 .debug_aranges 00000028 00000000 00000000 0000024e 2**0 CONTENTS, READONLY, DEBUGGING - 2 .debug_pubnames 0000006a 00000000 00000000 00000258 2**0 + 2 .debug_pubnames 0000006a 00000000 00000000 00000276 2**0 CONTENTS, READONLY, DEBUGGING - 3 .debug_info 00000283 00000000 00000000 000002c2 2**0 + 3 .debug_info 00000284 00000000 00000000 000002e0 2**0 CONTENTS, READONLY, DEBUGGING - 4 .debug_abbrev 000001ae 00000000 00000000 00000545 2**0 + 4 .debug_abbrev 000001ae 00000000 00000000 00000564 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_line 000003db 00000000 00000000 000006f3 2**0 + 5 .debug_line 000003e3 00000000 00000000 00000712 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_frame 00000090 00000000 00000000 00000ad0 2**2 + 6 .debug_frame 00000090 00000000 00000000 00000af8 2**2 CONTENTS, READONLY, DEBUGGING - 7 .debug_str 00000140 00000000 00000000 00000b60 2**0 + 7 .debug_str 00000140 00000000 00000000 00000b88 2**0 CONTENTS, READONLY, DEBUGGING - 8 .debug_loc 000001d1 00000000 00000000 00000ca0 2**0 + 8 .debug_loc 000001e1 00000000 00000000 00000cc8 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_ranges 00000068 00000000 00000000 00000e71 2**0 + 9 .debug_ranges 00000068 00000000 00000000 00000ea9 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: @@ -61,12 +61,12 @@ int main(void) { 3e20: 14 be out 0x34, r1 ; 52 if (!(ch & _BV(EXTRF))) appStart(); 3e22: 81 ff sbrs r24, 1 - 3e24: c8 d0 rcall .+400 ; 0x3fb6 + 3e24: d7 d0 rcall .+430 ; 0x3fd4 // Set up watchdog to trigger after 500ms watchdogConfig(WATCHDOG_500MS); 3e26: 8d e0 ldi r24, 0x0D ; 13 - 3e28: c0 d0 rcall .+384 ; 0x3faa + 3e28: cf d0 rcall .+414 ; 0x3fc8 /* Set LED pin as output */ LED_DDR |= _BV(LED); @@ -127,21 +127,21 @@ void watchdogReset() { // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); 3e4e: a5 e0 ldi r26, 0x05 ; 5 - 3e50: fa 2e mov r15, r26 + 3e50: ea 2e mov r14, r26 boot_spm_busy_wait(); #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); 3e52: f1 e1 ldi r31, 0x11 ; 17 - 3e54: ef 2e mov r14, r31 + 3e54: ff 2e mov r15, r31 #endif /* Forever loop */ for (;;) { /* get character from UART */ ch = getch(); - 3e56: 9c d0 rcall .+312 ; 0x3f90 + 3e56: ab d0 rcall .+342 ; 0x3fae if(ch == STK_GET_PARAMETER) { 3e58: 81 34 cpi r24, 0x41 ; 65 @@ -149,7 +149,7 @@ void watchdogReset() { // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy getNch(1); 3e5c: 81 e0 ldi r24, 0x01 ; 1 - 3e5e: b6 d0 rcall .+364 ; 0x3fcc + 3e5e: c5 d0 rcall .+394 ; 0x3fea putch(0x03); 3e60: 83 e0 ldi r24, 0x03 ; 3 3e62: 20 c0 rjmp .+64 ; 0x3ea4 @@ -168,8 +168,8 @@ void watchdogReset() { // SET DEVICE EXT is ignored getNch(5); 3e70: 85 e0 ldi r24, 0x05 ; 5 - 3e72: ac d0 rcall .+344 ; 0x3fcc - 3e74: 82 c0 rjmp .+260 ; 0x3f7a + 3e72: bb d0 rcall .+374 ; 0x3fea + 3e74: 91 c0 rjmp .+290 ; 0x3f98 } else if(ch == STK_LOAD_ADDRESS) { 3e76: 85 35 cpi r24, 0x55 ; 85 @@ -177,11 +177,11 @@ void watchdogReset() { // LOAD ADDRESS uint16_t newAddress; newAddress = getch(); - 3e7a: 8a d0 rcall .+276 ; 0x3f90 + 3e7a: 99 d0 rcall .+306 ; 0x3fae newAddress = (newAddress & 0xff) | (getch() << 8); 3e7c: 08 2f mov r16, r24 3e7e: 10 e0 ldi r17, 0x00 ; 0 - 3e80: 87 d0 rcall .+270 ; 0x3f90 + 3e80: 96 d0 rcall .+300 ; 0x3fae 3e82: 90 e0 ldi r25, 0x00 ; 0 3e84: 98 2f mov r25, r24 3e86: 88 27 eor r24, r24 @@ -197,7 +197,7 @@ void watchdogReset() { address = newAddress; 3e90: 90 93 01 02 sts 0x0201, r25 3e94: 80 93 00 02 sts 0x0200, r24 - 3e98: 6f c0 rjmp .+222 ; 0x3f78 + 3e98: 7e c0 rjmp .+252 ; 0x3f96 verifySpace(); } else if(ch == STK_UNIVERSAL) { @@ -206,320 +206,337 @@ void watchdogReset() { // UNIVERSAL command is ignored getNch(4); 3e9e: 84 e0 ldi r24, 0x04 ; 4 - 3ea0: 95 d0 rcall .+298 ; 0x3fcc + 3ea0: a4 d0 rcall .+328 ; 0x3fea putch(0x00); 3ea2: 80 e0 ldi r24, 0x00 ; 0 - 3ea4: 6d d0 rcall .+218 ; 0x3f80 - 3ea6: 69 c0 rjmp .+210 ; 0x3f7a + 3ea4: 7c d0 rcall .+248 ; 0x3f9e + 3ea6: 78 c0 rjmp .+240 ; 0x3f98 } /* Write memory, length is big endian and is in bytes */ else if(ch == STK_PROG_PAGE) { 3ea8: 84 36 cpi r24, 0x64 ; 100 3eaa: 09 f0 breq .+2 ; 0x3eae - 3eac: 3f c0 rjmp .+126 ; 0x3f2c + 3eac: 4e c0 rjmp .+156 ; 0x3f4a // PROGRAM PAGE - we support flash programming only, not EEPROM uint8_t *bufPtr; uint16_t addrPtr; getLen(); - 3eae: 78 d0 rcall .+240 ; 0x3fa0 + 3eae: 87 d0 rcall .+270 ; 0x3fbe - // Immediately start page erase - this will 4.5ms - __boot_page_erase_short((uint16_t)(void*)address); + // If we are in RWW section, immediately start page erase + if (address < NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); 3eb0: e0 91 00 02 lds r30, 0x0200 3eb4: f0 91 01 02 lds r31, 0x0201 - 3eb8: 83 e0 ldi r24, 0x03 ; 3 - 3eba: 87 bf out 0x37, r24 ; 55 - 3ebc: e8 95 spm - 3ebe: c0 e0 ldi r28, 0x00 ; 0 - 3ec0: d1 e0 ldi r29, 0x01 ; 1 + 3eb8: 88 e3 ldi r24, 0x38 ; 56 + 3eba: e0 30 cpi r30, 0x00 ; 0 + 3ebc: f8 07 cpc r31, r24 + 3ebe: 18 f4 brcc .+6 ; 0x3ec6 + 3ec0: 83 e0 ldi r24, 0x03 ; 3 + 3ec2: 87 bf out 0x37, r24 ; 55 + 3ec4: e8 95 spm + 3ec6: c0 e0 ldi r28, 0x00 ; 0 + 3ec8: d1 e0 ldi r29, 0x01 ; 1 // While that is going on, read in page contents bufPtr = buff; do *bufPtr++ = getch(); - 3ec2: 66 d0 rcall .+204 ; 0x3f90 - 3ec4: 89 93 st Y+, r24 + 3eca: 71 d0 rcall .+226 ; 0x3fae + 3ecc: 89 93 st Y+, r24 while (--length); - 3ec6: 80 91 02 02 lds r24, 0x0202 - 3eca: 81 50 subi r24, 0x01 ; 1 - 3ecc: 80 93 02 02 sts 0x0202, r24 - 3ed0: 88 23 and r24, r24 - 3ed2: b9 f7 brne .-18 ; 0x3ec2 + 3ece: 80 91 02 02 lds r24, 0x0202 + 3ed2: 81 50 subi r24, 0x01 ; 1 + 3ed4: 80 93 02 02 sts 0x0202, r24 + 3ed8: 88 23 and r24, r24 + 3eda: b9 f7 brne .-18 ; 0x3eca + + // If we are in NRWW section, page erase has to be delayed until now. + // Todo: Take RAMPZ into account + if (address >= NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); + 3edc: e0 91 00 02 lds r30, 0x0200 + 3ee0: f0 91 01 02 lds r31, 0x0201 + 3ee4: 88 e3 ldi r24, 0x38 ; 56 + 3ee6: e0 30 cpi r30, 0x00 ; 0 + 3ee8: f8 07 cpc r31, r24 + 3eea: 18 f0 brcs .+6 ; 0x3ef2 + 3eec: 83 e0 ldi r24, 0x03 ; 3 + 3eee: 87 bf out 0x37, r24 ; 55 + 3ef0: e8 95 spm // Read command terminator, start reply verifySpace(); - 3ed4: 75 d0 rcall .+234 ; 0x3fc0 + 3ef2: 75 d0 rcall .+234 ; 0x3fde // If only a partial page is to be programmed, the erase might not be complete. // So check that here boot_spm_busy_wait(); - 3ed6: 07 b6 in r0, 0x37 ; 55 - 3ed8: 00 fc sbrc r0, 0 - 3eda: fd cf rjmp .-6 ; 0x3ed6 + 3ef4: 07 b6 in r0, 0x37 ; 55 + 3ef6: 00 fc sbrc r0, 0 + 3ef8: fd cf rjmp .-6 ; 0x3ef4 } #endif // Copy buffer into programming buffer bufPtr = buff; addrPtr = (uint16_t)(void*)address; - 3edc: 40 91 00 02 lds r20, 0x0200 - 3ee0: 50 91 01 02 lds r21, 0x0201 - 3ee4: a0 e0 ldi r26, 0x00 ; 0 - 3ee6: b1 e0 ldi r27, 0x01 ; 1 + 3efa: 40 91 00 02 lds r20, 0x0200 + 3efe: 50 91 01 02 lds r21, 0x0201 + 3f02: a0 e0 ldi r26, 0x00 ; 0 + 3f04: b1 e0 ldi r27, 0x01 ; 1 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; - 3ee8: 2c 91 ld r18, X - 3eea: 30 e0 ldi r19, 0x00 ; 0 + 3f06: 2c 91 ld r18, X + 3f08: 30 e0 ldi r19, 0x00 ; 0 a |= (*bufPtr++) << 8; - 3eec: 11 96 adiw r26, 0x01 ; 1 - 3eee: 8c 91 ld r24, X - 3ef0: 11 97 sbiw r26, 0x01 ; 1 - 3ef2: 90 e0 ldi r25, 0x00 ; 0 - 3ef4: 98 2f mov r25, r24 - 3ef6: 88 27 eor r24, r24 - 3ef8: 82 2b or r24, r18 - 3efa: 93 2b or r25, r19 + 3f0a: 11 96 adiw r26, 0x01 ; 1 + 3f0c: 8c 91 ld r24, X + 3f0e: 11 97 sbiw r26, 0x01 ; 1 + 3f10: 90 e0 ldi r25, 0x00 ; 0 + 3f12: 98 2f mov r25, r24 + 3f14: 88 27 eor r24, r24 + 3f16: 82 2b or r24, r18 + 3f18: 93 2b or r25, r19 #define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #endif /* main program starts here */ int main(void) { - 3efc: 12 96 adiw r26, 0x02 ; 2 + 3f1a: 12 96 adiw r26, 0x02 ; 2 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; a |= (*bufPtr++) << 8; __boot_page_fill_short((uint16_t)(void*)addrPtr,a); - 3efe: fa 01 movw r30, r20 - 3f00: 0c 01 movw r0, r24 - 3f02: d7 be out 0x37, r13 ; 55 - 3f04: e8 95 spm - 3f06: 11 24 eor r1, r1 + 3f1c: fa 01 movw r30, r20 + 3f1e: 0c 01 movw r0, r24 + 3f20: d7 be out 0x37, r13 ; 55 + 3f22: e8 95 spm + 3f24: 11 24 eor r1, r1 addrPtr += 2; - 3f08: 4e 5f subi r20, 0xFE ; 254 - 3f0a: 5f 4f sbci r21, 0xFF ; 255 + 3f26: 4e 5f subi r20, 0xFE ; 254 + 3f28: 5f 4f sbci r21, 0xFF ; 255 } while (--ch); - 3f0c: f1 e0 ldi r31, 0x01 ; 1 - 3f0e: a0 38 cpi r26, 0x80 ; 128 - 3f10: bf 07 cpc r27, r31 - 3f12: 51 f7 brne .-44 ; 0x3ee8 + 3f2a: f1 e0 ldi r31, 0x01 ; 1 + 3f2c: a0 38 cpi r26, 0x80 ; 128 + 3f2e: bf 07 cpc r27, r31 + 3f30: 51 f7 brne .-44 ; 0x3f06 // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); - 3f14: e0 91 00 02 lds r30, 0x0200 - 3f18: f0 91 01 02 lds r31, 0x0201 - 3f1c: f7 be out 0x37, r15 ; 55 - 3f1e: e8 95 spm + 3f32: e0 91 00 02 lds r30, 0x0200 + 3f36: f0 91 01 02 lds r31, 0x0201 + 3f3a: e7 be out 0x37, r14 ; 55 + 3f3c: e8 95 spm boot_spm_busy_wait(); - 3f20: 07 b6 in r0, 0x37 ; 55 - 3f22: 00 fc sbrc r0, 0 - 3f24: fd cf rjmp .-6 ; 0x3f20 + 3f3e: 07 b6 in r0, 0x37 ; 55 + 3f40: 00 fc sbrc r0, 0 + 3f42: fd cf rjmp .-6 ; 0x3f3e #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); - 3f26: e7 be out 0x37, r14 ; 55 - 3f28: e8 95 spm - 3f2a: 27 c0 rjmp .+78 ; 0x3f7a + 3f44: f7 be out 0x37, r15 ; 55 + 3f46: e8 95 spm + 3f48: 27 c0 rjmp .+78 ; 0x3f98 #endif } /* Read memory block mode, length is big endian. */ else if(ch == STK_READ_PAGE) { - 3f2c: 84 37 cpi r24, 0x74 ; 116 - 3f2e: b9 f4 brne .+46 ; 0x3f5e + 3f4a: 84 37 cpi r24, 0x74 ; 116 + 3f4c: b9 f4 brne .+46 ; 0x3f7c // READ PAGE - we only read flash getLen(); - 3f30: 37 d0 rcall .+110 ; 0x3fa0 + 3f4e: 37 d0 rcall .+110 ; 0x3fbe verifySpace(); - 3f32: 46 d0 rcall .+140 ; 0x3fc0 + 3f50: 46 d0 rcall .+140 ; 0x3fde putch(result); address++; } while (--length); #else do putch(pgm_read_byte_near(address++)); - 3f34: e0 91 00 02 lds r30, 0x0200 - 3f38: f0 91 01 02 lds r31, 0x0201 - 3f3c: 31 96 adiw r30, 0x01 ; 1 - 3f3e: f0 93 01 02 sts 0x0201, r31 - 3f42: e0 93 00 02 sts 0x0200, r30 - 3f46: 31 97 sbiw r30, 0x01 ; 1 - 3f48: e4 91 lpm r30, Z+ - 3f4a: 8e 2f mov r24, r30 - 3f4c: 19 d0 rcall .+50 ; 0x3f80 + 3f52: e0 91 00 02 lds r30, 0x0200 + 3f56: f0 91 01 02 lds r31, 0x0201 + 3f5a: 31 96 adiw r30, 0x01 ; 1 + 3f5c: f0 93 01 02 sts 0x0201, r31 + 3f60: e0 93 00 02 sts 0x0200, r30 + 3f64: 31 97 sbiw r30, 0x01 ; 1 + 3f66: e4 91 lpm r30, Z+ + 3f68: 8e 2f mov r24, r30 + 3f6a: 19 d0 rcall .+50 ; 0x3f9e while (--length); - 3f4e: 80 91 02 02 lds r24, 0x0202 - 3f52: 81 50 subi r24, 0x01 ; 1 - 3f54: 80 93 02 02 sts 0x0202, r24 - 3f58: 88 23 and r24, r24 - 3f5a: 61 f7 brne .-40 ; 0x3f34 - 3f5c: 0e c0 rjmp .+28 ; 0x3f7a + 3f6c: 80 91 02 02 lds r24, 0x0202 + 3f70: 81 50 subi r24, 0x01 ; 1 + 3f72: 80 93 02 02 sts 0x0202, r24 + 3f76: 88 23 and r24, r24 + 3f78: 61 f7 brne .-40 ; 0x3f52 + 3f7a: 0e c0 rjmp .+28 ; 0x3f98 #endif #endif } /* Get device signature bytes */ else if(ch == STK_READ_SIGN) { - 3f5e: 85 37 cpi r24, 0x75 ; 117 - 3f60: 39 f4 brne .+14 ; 0x3f70 + 3f7c: 85 37 cpi r24, 0x75 ; 117 + 3f7e: 39 f4 brne .+14 ; 0x3f8e // READ SIGN - return what Avrdude wants to hear verifySpace(); - 3f62: 2e d0 rcall .+92 ; 0x3fc0 + 3f80: 2e d0 rcall .+92 ; 0x3fde putch(SIGNATURE_0); - 3f64: 8e e1 ldi r24, 0x1E ; 30 - 3f66: 0c d0 rcall .+24 ; 0x3f80 + 3f82: 8e e1 ldi r24, 0x1E ; 30 + 3f84: 0c d0 rcall .+24 ; 0x3f9e putch(SIGNATURE_1); - 3f68: 84 e9 ldi r24, 0x94 ; 148 - 3f6a: 0a d0 rcall .+20 ; 0x3f80 + 3f86: 84 e9 ldi r24, 0x94 ; 148 + 3f88: 0a d0 rcall .+20 ; 0x3f9e putch(SIGNATURE_2); - 3f6c: 86 e0 ldi r24, 0x06 ; 6 - 3f6e: 9a cf rjmp .-204 ; 0x3ea4 + 3f8a: 86 e0 ldi r24, 0x06 ; 6 + 3f8c: 8b cf rjmp .-234 ; 0x3ea4 } else if (ch == 'Q') { - 3f70: 81 35 cpi r24, 0x51 ; 81 - 3f72: 11 f4 brne .+4 ; 0x3f78 + 3f8e: 81 35 cpi r24, 0x51 ; 81 + 3f90: 11 f4 brne .+4 ; 0x3f96 // Adaboot no-wait mod watchdogConfig(WATCHDOG_16MS); - 3f74: 88 e0 ldi r24, 0x08 ; 8 - 3f76: 19 d0 rcall .+50 ; 0x3faa + 3f92: 88 e0 ldi r24, 0x08 ; 8 + 3f94: 19 d0 rcall .+50 ; 0x3fc8 verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); - 3f78: 23 d0 rcall .+70 ; 0x3fc0 + 3f96: 23 d0 rcall .+70 ; 0x3fde } putch(STK_OK); - 3f7a: 80 e1 ldi r24, 0x10 ; 16 - 3f7c: 01 d0 rcall .+2 ; 0x3f80 - 3f7e: 6b cf rjmp .-298 ; 0x3e56 + 3f98: 80 e1 ldi r24, 0x10 ; 16 + 3f9a: 01 d0 rcall .+2 ; 0x3f9e + 3f9c: 5c cf rjmp .-328 ; 0x3e56 -00003f80 : +00003f9e : } } void putch(char ch) { - 3f80: 98 2f mov r25, r24 + 3f9e: 98 2f mov r25, r24 #ifndef SOFT_UART while (!(UCSR0A & _BV(UDRE0))); - 3f82: 80 91 c0 00 lds r24, 0x00C0 - 3f86: 85 ff sbrs r24, 5 - 3f88: fc cf rjmp .-8 ; 0x3f82 + 3fa0: 80 91 c0 00 lds r24, 0x00C0 + 3fa4: 85 ff sbrs r24, 5 + 3fa6: fc cf rjmp .-8 ; 0x3fa0 UDR0 = ch; - 3f8a: 90 93 c6 00 sts 0x00C6, r25 + 3fa8: 90 93 c6 00 sts 0x00C6, r25 [uartBit] "I" (UART_TX_BIT) : "r25" ); #endif } - 3f8e: 08 95 ret + 3fac: 08 95 ret -00003f90 : +00003fae : return getch(); } // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( - 3f90: a8 95 wdr + 3fae: a8 95 wdr [uartBit] "I" (UART_RX_BIT) : "r25" ); #else while(!(UCSR0A & _BV(RXC0))); - 3f92: 80 91 c0 00 lds r24, 0x00C0 - 3f96: 87 ff sbrs r24, 7 - 3f98: fc cf rjmp .-8 ; 0x3f92 + 3fb0: 80 91 c0 00 lds r24, 0x00C0 + 3fb4: 87 ff sbrs r24, 7 + 3fb6: fc cf rjmp .-8 ; 0x3fb0 ch = UDR0; - 3f9a: 80 91 c6 00 lds r24, 0x00C6 + 3fb8: 80 91 c6 00 lds r24, 0x00C6 #ifdef LED_DATA_FLASH LED_PIN |= _BV(LED); #endif return ch; } - 3f9e: 08 95 ret + 3fbc: 08 95 ret -00003fa0 : +00003fbe : } while (--count); } #endif uint8_t getLen() { getch(); - 3fa0: f7 df rcall .-18 ; 0x3f90 + 3fbe: f7 df rcall .-18 ; 0x3fae length = getch(); - 3fa2: f6 df rcall .-20 ; 0x3f90 - 3fa4: 80 93 02 02 sts 0x0202, r24 + 3fc0: f6 df rcall .-20 ; 0x3fae + 3fc2: 80 93 02 02 sts 0x0202, r24 return getch(); } - 3fa8: f3 cf rjmp .-26 ; 0x3f90 + 3fc6: f3 cf rjmp .-26 ; 0x3fae -00003faa : +00003fc8 : "wdr\n" ); } void watchdogConfig(uint8_t x) { WDTCSR = _BV(WDCE) | _BV(WDE); - 3faa: e0 e6 ldi r30, 0x60 ; 96 - 3fac: f0 e0 ldi r31, 0x00 ; 0 - 3fae: 98 e1 ldi r25, 0x18 ; 24 - 3fb0: 90 83 st Z, r25 + 3fc8: e0 e6 ldi r30, 0x60 ; 96 + 3fca: f0 e0 ldi r31, 0x00 ; 0 + 3fcc: 98 e1 ldi r25, 0x18 ; 24 + 3fce: 90 83 st Z, r25 WDTCSR = x; - 3fb2: 80 83 st Z, r24 + 3fd0: 80 83 st Z, r24 } - 3fb4: 08 95 ret + 3fd2: 08 95 ret -00003fb6 : +00003fd4 : void appStart() { watchdogConfig(WATCHDOG_OFF); - 3fb6: 80 e0 ldi r24, 0x00 ; 0 - 3fb8: f8 df rcall .-16 ; 0x3faa + 3fd4: 80 e0 ldi r24, 0x00 ; 0 + 3fd6: f8 df rcall .-16 ; 0x3fc8 __asm__ __volatile__ ( - 3fba: ee 27 eor r30, r30 - 3fbc: ff 27 eor r31, r31 - 3fbe: 09 94 ijmp + 3fd8: ee 27 eor r30, r30 + 3fda: ff 27 eor r31, r31 + 3fdc: 09 94 ijmp -00003fc0 : +00003fde : do getch(); while (--count); verifySpace(); } void verifySpace() { if (getch() != CRC_EOP) appStart(); - 3fc0: e7 df rcall .-50 ; 0x3f90 - 3fc2: 80 32 cpi r24, 0x20 ; 32 - 3fc4: 09 f0 breq .+2 ; 0x3fc8 - 3fc6: f7 df rcall .-18 ; 0x3fb6 + 3fde: e7 df rcall .-50 ; 0x3fae + 3fe0: 80 32 cpi r24, 0x20 ; 32 + 3fe2: 09 f0 breq .+2 ; 0x3fe6 + 3fe4: f7 df rcall .-18 ; 0x3fd4 putch(STK_INSYNC); - 3fc8: 84 e1 ldi r24, 0x14 ; 20 + 3fe6: 84 e1 ldi r24, 0x14 ; 20 } - 3fca: da cf rjmp .-76 ; 0x3f80 + 3fe8: da cf rjmp .-76 ; 0x3f9e ::[count] "M" (UART_B_VALUE) ); } #endif void getNch(uint8_t count) { - 3fcc: 1f 93 push r17 - 3fce: 18 2f mov r17, r24 + 3fea: 1f 93 push r17 + 3fec: 18 2f mov r17, r24 -00003fd0 : +00003fee : do getch(); while (--count); - 3fd0: df df rcall .-66 ; 0x3f90 - 3fd2: 11 50 subi r17, 0x01 ; 1 - 3fd4: e9 f7 brne .-6 ; 0x3fd0 + 3fee: df df rcall .-66 ; 0x3fae + 3ff0: 11 50 subi r17, 0x01 ; 1 + 3ff2: e9 f7 brne .-6 ; 0x3fee verifySpace(); - 3fd6: f4 df rcall .-24 ; 0x3fc0 + 3ff4: f4 df rcall .-24 ; 0x3fde } - 3fd8: 1f 91 pop r17 - 3fda: 08 95 ret + 3ff6: 1f 91 pop r17 + 3ff8: 08 95 ret diff --git a/optiboot/bootloaders/optiboot/optiboot_lilypad_resonator.hex b/optiboot/bootloaders/optiboot/optiboot_lilypad_resonator.hex index 6fc5c98..4053242 100644 --- a/optiboot/bootloaders/optiboot/optiboot_lilypad_resonator.hex +++ b/optiboot/bootloaders/optiboot/optiboot_lilypad_resonator.hex @@ -1,32 +1,34 @@ :103E000085E08093810082E08093C00088E1809308 :103E1000C10086E08093C20088E08093C40084B72C -:103E200014BE81FFC8D08DE0C0D0259A86E028E17D +:103E200014BE81FFD7D08DE0CFD0259A86E028E15F :103E30003EEF91E0309385002093840096BBB09BC9 :103E4000FECF1D9AA8958150A9F7DD24D394A5E053 -:103E5000FA2EF1E1EF2E9CD0813421F481E0B6D02E +:103E5000EA2EF1E1FF2EABD0813421F481E0C5D010 :103E600083E020C0823411F484E103C0853419F466 -:103E700085E0ACD082C0853581F48AD0082F10E06F -:103E800087D090E0982F8827802B912B880F991F3F -:103E900090930102809300026FC0863529F484E07C -:103EA00095D080E06DD069C0843609F03FC078D0ED -:103EB000E0910002F091010283E087BFE895C0E045 -:103EC000D1E066D0899380910202815080930202F2 -:103ED0008823B9F775D007B600FCFDCF40910002EA -:103EE00050910102A0E0B1E02C9130E011968C914C -:103EF000119790E0982F8827822B932B1296FA0126 -:103F00000C01D7BEE89511244E5F5F4FF1E0A03859 -:103F1000BF0751F7E0910002F0910102F7BEE8956A -:103F200007B600FCFDCFE7BEE89527C08437B9F49B -:103F300037D046D0E0910002F09101023196F09323 -:103F40000102E09300023197E4918E2F19D0809105 -:103F50000202815080930202882361F70EC08537E8 -:103F600039F42ED08EE10CD084E90AD086E09ACFC5 -:103F7000813511F488E019D023D080E101D06BCFD6 -:103F8000982F8091C00085FFFCCF9093C6000895C4 -:103F9000A8958091C00087FFFCCF8091C60008954E -:103FA000F7DFF6DF80930202F3CFE0E6F0E098E17E -:103FB00090838083089580E0F8DFEE27FF2709943F -:103FC000E7DF803209F0F7DF84E1DACF1F93182FA3 -:0C3FD000DFDF1150E9F7F4DF1F910895C6 +:103E700085E0BBD091C0853581F499D0082F10E042 +:103E800096D090E0982F8827802B912B880F991F30 +:103E900090930102809300027EC0863529F484E06D +:103EA000A4D080E07CD078C0843609F04EC087D0A2 +:103EB000E0910002F091010288E3E030F80718F485 +:103EC00083E087BFE895C0E0D1E071D0899380910D +:103ED00002028150809302028823B9F7E091000228 +:103EE000F091010288E3E030F80718F083E087BF23 +:103EF000E89575D007B600FCFDCF409100025091C7 +:103F00000102A0E0B1E02C9130E011968C91119764 +:103F100090E0982F8827822B932B1296FA010C01A0 +:103F2000D7BEE89511244E5F5F4FF1E0A038BF0780 +:103F300051F7E0910002F0910102E7BEE89507B663 +:103F400000FCFDCFF7BEE89527C08437B9F437D021 +:103F500046D0E0910002F09101023196F093010207 +:103F6000E09300023197E4918E2F19D080910202E4 +:103F7000815080930202882361F70EC0853739F49F +:103F80002ED08EE10CD084E90AD086E08BCF81352B +:103F900011F488E019D023D080E101D05CCF982FB4 +:103FA0008091C00085FFFCCF9093C6000895A8952E +:103FB0008091C00087FFFCCF8091C6000895F7DF95 +:103FC000F6DF80930202F3CFE0E6F0E098E1908321 +:103FD0008083089580E0F8DFEE27FF270994E7DF6C +:103FE000803209F0F7DF84E1DACF1F93182FDFDF8B +:0A3FF0001150E9F7F4DF1F91089566 :0400000300003E00BB :00000001FF diff --git a/optiboot/bootloaders/optiboot/optiboot_lilypad_resonator.lst b/optiboot/bootloaders/optiboot/optiboot_lilypad_resonator.lst index 7e4fdeb..246887f 100644 --- a/optiboot/bootloaders/optiboot/optiboot_lilypad_resonator.lst +++ b/optiboot/bootloaders/optiboot/optiboot_lilypad_resonator.lst @@ -3,25 +3,25 @@ optiboot_lilypad_resonator.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn - 0 .text 000001dc 00003e00 00003e00 00000054 2**1 + 0 .text 000001fa 00003e00 00003e00 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .debug_aranges 00000028 00000000 00000000 00000230 2**0 + 1 .debug_aranges 00000028 00000000 00000000 0000024e 2**0 CONTENTS, READONLY, DEBUGGING - 2 .debug_pubnames 0000006a 00000000 00000000 00000258 2**0 + 2 .debug_pubnames 0000006a 00000000 00000000 00000276 2**0 CONTENTS, READONLY, DEBUGGING - 3 .debug_info 00000283 00000000 00000000 000002c2 2**0 + 3 .debug_info 00000284 00000000 00000000 000002e0 2**0 CONTENTS, READONLY, DEBUGGING - 4 .debug_abbrev 000001ae 00000000 00000000 00000545 2**0 + 4 .debug_abbrev 000001ae 00000000 00000000 00000564 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_line 000003db 00000000 00000000 000006f3 2**0 + 5 .debug_line 000003e3 00000000 00000000 00000712 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_frame 00000090 00000000 00000000 00000ad0 2**2 + 6 .debug_frame 00000090 00000000 00000000 00000af8 2**2 CONTENTS, READONLY, DEBUGGING - 7 .debug_str 00000140 00000000 00000000 00000b60 2**0 + 7 .debug_str 00000140 00000000 00000000 00000b88 2**0 CONTENTS, READONLY, DEBUGGING - 8 .debug_loc 000001d1 00000000 00000000 00000ca0 2**0 + 8 .debug_loc 000001e1 00000000 00000000 00000cc8 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_ranges 00000068 00000000 00000000 00000e71 2**0 + 9 .debug_ranges 00000068 00000000 00000000 00000ea9 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: @@ -61,12 +61,12 @@ int main(void) { 3e20: 14 be out 0x34, r1 ; 52 if (!(ch & _BV(EXTRF))) appStart(); 3e22: 81 ff sbrs r24, 1 - 3e24: c8 d0 rcall .+400 ; 0x3fb6 + 3e24: d7 d0 rcall .+430 ; 0x3fd4 // Set up watchdog to trigger after 500ms watchdogConfig(WATCHDOG_500MS); 3e26: 8d e0 ldi r24, 0x0D ; 13 - 3e28: c0 d0 rcall .+384 ; 0x3faa + 3e28: cf d0 rcall .+414 ; 0x3fc8 /* Set LED pin as output */ LED_DDR |= _BV(LED); @@ -127,21 +127,21 @@ void watchdogReset() { // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); 3e4e: a5 e0 ldi r26, 0x05 ; 5 - 3e50: fa 2e mov r15, r26 + 3e50: ea 2e mov r14, r26 boot_spm_busy_wait(); #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); 3e52: f1 e1 ldi r31, 0x11 ; 17 - 3e54: ef 2e mov r14, r31 + 3e54: ff 2e mov r15, r31 #endif /* Forever loop */ for (;;) { /* get character from UART */ ch = getch(); - 3e56: 9c d0 rcall .+312 ; 0x3f90 + 3e56: ab d0 rcall .+342 ; 0x3fae if(ch == STK_GET_PARAMETER) { 3e58: 81 34 cpi r24, 0x41 ; 65 @@ -149,7 +149,7 @@ void watchdogReset() { // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy getNch(1); 3e5c: 81 e0 ldi r24, 0x01 ; 1 - 3e5e: b6 d0 rcall .+364 ; 0x3fcc + 3e5e: c5 d0 rcall .+394 ; 0x3fea putch(0x03); 3e60: 83 e0 ldi r24, 0x03 ; 3 3e62: 20 c0 rjmp .+64 ; 0x3ea4 @@ -168,8 +168,8 @@ void watchdogReset() { // SET DEVICE EXT is ignored getNch(5); 3e70: 85 e0 ldi r24, 0x05 ; 5 - 3e72: ac d0 rcall .+344 ; 0x3fcc - 3e74: 82 c0 rjmp .+260 ; 0x3f7a + 3e72: bb d0 rcall .+374 ; 0x3fea + 3e74: 91 c0 rjmp .+290 ; 0x3f98 } else if(ch == STK_LOAD_ADDRESS) { 3e76: 85 35 cpi r24, 0x55 ; 85 @@ -177,11 +177,11 @@ void watchdogReset() { // LOAD ADDRESS uint16_t newAddress; newAddress = getch(); - 3e7a: 8a d0 rcall .+276 ; 0x3f90 + 3e7a: 99 d0 rcall .+306 ; 0x3fae newAddress = (newAddress & 0xff) | (getch() << 8); 3e7c: 08 2f mov r16, r24 3e7e: 10 e0 ldi r17, 0x00 ; 0 - 3e80: 87 d0 rcall .+270 ; 0x3f90 + 3e80: 96 d0 rcall .+300 ; 0x3fae 3e82: 90 e0 ldi r25, 0x00 ; 0 3e84: 98 2f mov r25, r24 3e86: 88 27 eor r24, r24 @@ -197,7 +197,7 @@ void watchdogReset() { address = newAddress; 3e90: 90 93 01 02 sts 0x0201, r25 3e94: 80 93 00 02 sts 0x0200, r24 - 3e98: 6f c0 rjmp .+222 ; 0x3f78 + 3e98: 7e c0 rjmp .+252 ; 0x3f96 verifySpace(); } else if(ch == STK_UNIVERSAL) { @@ -206,320 +206,337 @@ void watchdogReset() { // UNIVERSAL command is ignored getNch(4); 3e9e: 84 e0 ldi r24, 0x04 ; 4 - 3ea0: 95 d0 rcall .+298 ; 0x3fcc + 3ea0: a4 d0 rcall .+328 ; 0x3fea putch(0x00); 3ea2: 80 e0 ldi r24, 0x00 ; 0 - 3ea4: 6d d0 rcall .+218 ; 0x3f80 - 3ea6: 69 c0 rjmp .+210 ; 0x3f7a + 3ea4: 7c d0 rcall .+248 ; 0x3f9e + 3ea6: 78 c0 rjmp .+240 ; 0x3f98 } /* Write memory, length is big endian and is in bytes */ else if(ch == STK_PROG_PAGE) { 3ea8: 84 36 cpi r24, 0x64 ; 100 3eaa: 09 f0 breq .+2 ; 0x3eae - 3eac: 3f c0 rjmp .+126 ; 0x3f2c + 3eac: 4e c0 rjmp .+156 ; 0x3f4a // PROGRAM PAGE - we support flash programming only, not EEPROM uint8_t *bufPtr; uint16_t addrPtr; getLen(); - 3eae: 78 d0 rcall .+240 ; 0x3fa0 + 3eae: 87 d0 rcall .+270 ; 0x3fbe - // Immediately start page erase - this will 4.5ms - __boot_page_erase_short((uint16_t)(void*)address); + // If we are in RWW section, immediately start page erase + if (address < NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); 3eb0: e0 91 00 02 lds r30, 0x0200 3eb4: f0 91 01 02 lds r31, 0x0201 - 3eb8: 83 e0 ldi r24, 0x03 ; 3 - 3eba: 87 bf out 0x37, r24 ; 55 - 3ebc: e8 95 spm - 3ebe: c0 e0 ldi r28, 0x00 ; 0 - 3ec0: d1 e0 ldi r29, 0x01 ; 1 + 3eb8: 88 e3 ldi r24, 0x38 ; 56 + 3eba: e0 30 cpi r30, 0x00 ; 0 + 3ebc: f8 07 cpc r31, r24 + 3ebe: 18 f4 brcc .+6 ; 0x3ec6 + 3ec0: 83 e0 ldi r24, 0x03 ; 3 + 3ec2: 87 bf out 0x37, r24 ; 55 + 3ec4: e8 95 spm + 3ec6: c0 e0 ldi r28, 0x00 ; 0 + 3ec8: d1 e0 ldi r29, 0x01 ; 1 // While that is going on, read in page contents bufPtr = buff; do *bufPtr++ = getch(); - 3ec2: 66 d0 rcall .+204 ; 0x3f90 - 3ec4: 89 93 st Y+, r24 + 3eca: 71 d0 rcall .+226 ; 0x3fae + 3ecc: 89 93 st Y+, r24 while (--length); - 3ec6: 80 91 02 02 lds r24, 0x0202 - 3eca: 81 50 subi r24, 0x01 ; 1 - 3ecc: 80 93 02 02 sts 0x0202, r24 - 3ed0: 88 23 and r24, r24 - 3ed2: b9 f7 brne .-18 ; 0x3ec2 + 3ece: 80 91 02 02 lds r24, 0x0202 + 3ed2: 81 50 subi r24, 0x01 ; 1 + 3ed4: 80 93 02 02 sts 0x0202, r24 + 3ed8: 88 23 and r24, r24 + 3eda: b9 f7 brne .-18 ; 0x3eca + + // If we are in NRWW section, page erase has to be delayed until now. + // Todo: Take RAMPZ into account + if (address >= NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); + 3edc: e0 91 00 02 lds r30, 0x0200 + 3ee0: f0 91 01 02 lds r31, 0x0201 + 3ee4: 88 e3 ldi r24, 0x38 ; 56 + 3ee6: e0 30 cpi r30, 0x00 ; 0 + 3ee8: f8 07 cpc r31, r24 + 3eea: 18 f0 brcs .+6 ; 0x3ef2 + 3eec: 83 e0 ldi r24, 0x03 ; 3 + 3eee: 87 bf out 0x37, r24 ; 55 + 3ef0: e8 95 spm // Read command terminator, start reply verifySpace(); - 3ed4: 75 d0 rcall .+234 ; 0x3fc0 + 3ef2: 75 d0 rcall .+234 ; 0x3fde // If only a partial page is to be programmed, the erase might not be complete. // So check that here boot_spm_busy_wait(); - 3ed6: 07 b6 in r0, 0x37 ; 55 - 3ed8: 00 fc sbrc r0, 0 - 3eda: fd cf rjmp .-6 ; 0x3ed6 + 3ef4: 07 b6 in r0, 0x37 ; 55 + 3ef6: 00 fc sbrc r0, 0 + 3ef8: fd cf rjmp .-6 ; 0x3ef4 } #endif // Copy buffer into programming buffer bufPtr = buff; addrPtr = (uint16_t)(void*)address; - 3edc: 40 91 00 02 lds r20, 0x0200 - 3ee0: 50 91 01 02 lds r21, 0x0201 - 3ee4: a0 e0 ldi r26, 0x00 ; 0 - 3ee6: b1 e0 ldi r27, 0x01 ; 1 + 3efa: 40 91 00 02 lds r20, 0x0200 + 3efe: 50 91 01 02 lds r21, 0x0201 + 3f02: a0 e0 ldi r26, 0x00 ; 0 + 3f04: b1 e0 ldi r27, 0x01 ; 1 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; - 3ee8: 2c 91 ld r18, X - 3eea: 30 e0 ldi r19, 0x00 ; 0 + 3f06: 2c 91 ld r18, X + 3f08: 30 e0 ldi r19, 0x00 ; 0 a |= (*bufPtr++) << 8; - 3eec: 11 96 adiw r26, 0x01 ; 1 - 3eee: 8c 91 ld r24, X - 3ef0: 11 97 sbiw r26, 0x01 ; 1 - 3ef2: 90 e0 ldi r25, 0x00 ; 0 - 3ef4: 98 2f mov r25, r24 - 3ef6: 88 27 eor r24, r24 - 3ef8: 82 2b or r24, r18 - 3efa: 93 2b or r25, r19 + 3f0a: 11 96 adiw r26, 0x01 ; 1 + 3f0c: 8c 91 ld r24, X + 3f0e: 11 97 sbiw r26, 0x01 ; 1 + 3f10: 90 e0 ldi r25, 0x00 ; 0 + 3f12: 98 2f mov r25, r24 + 3f14: 88 27 eor r24, r24 + 3f16: 82 2b or r24, r18 + 3f18: 93 2b or r25, r19 #define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #endif /* main program starts here */ int main(void) { - 3efc: 12 96 adiw r26, 0x02 ; 2 + 3f1a: 12 96 adiw r26, 0x02 ; 2 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; a |= (*bufPtr++) << 8; __boot_page_fill_short((uint16_t)(void*)addrPtr,a); - 3efe: fa 01 movw r30, r20 - 3f00: 0c 01 movw r0, r24 - 3f02: d7 be out 0x37, r13 ; 55 - 3f04: e8 95 spm - 3f06: 11 24 eor r1, r1 + 3f1c: fa 01 movw r30, r20 + 3f1e: 0c 01 movw r0, r24 + 3f20: d7 be out 0x37, r13 ; 55 + 3f22: e8 95 spm + 3f24: 11 24 eor r1, r1 addrPtr += 2; - 3f08: 4e 5f subi r20, 0xFE ; 254 - 3f0a: 5f 4f sbci r21, 0xFF ; 255 + 3f26: 4e 5f subi r20, 0xFE ; 254 + 3f28: 5f 4f sbci r21, 0xFF ; 255 } while (--ch); - 3f0c: f1 e0 ldi r31, 0x01 ; 1 - 3f0e: a0 38 cpi r26, 0x80 ; 128 - 3f10: bf 07 cpc r27, r31 - 3f12: 51 f7 brne .-44 ; 0x3ee8 + 3f2a: f1 e0 ldi r31, 0x01 ; 1 + 3f2c: a0 38 cpi r26, 0x80 ; 128 + 3f2e: bf 07 cpc r27, r31 + 3f30: 51 f7 brne .-44 ; 0x3f06 // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); - 3f14: e0 91 00 02 lds r30, 0x0200 - 3f18: f0 91 01 02 lds r31, 0x0201 - 3f1c: f7 be out 0x37, r15 ; 55 - 3f1e: e8 95 spm + 3f32: e0 91 00 02 lds r30, 0x0200 + 3f36: f0 91 01 02 lds r31, 0x0201 + 3f3a: e7 be out 0x37, r14 ; 55 + 3f3c: e8 95 spm boot_spm_busy_wait(); - 3f20: 07 b6 in r0, 0x37 ; 55 - 3f22: 00 fc sbrc r0, 0 - 3f24: fd cf rjmp .-6 ; 0x3f20 + 3f3e: 07 b6 in r0, 0x37 ; 55 + 3f40: 00 fc sbrc r0, 0 + 3f42: fd cf rjmp .-6 ; 0x3f3e #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); - 3f26: e7 be out 0x37, r14 ; 55 - 3f28: e8 95 spm - 3f2a: 27 c0 rjmp .+78 ; 0x3f7a + 3f44: f7 be out 0x37, r15 ; 55 + 3f46: e8 95 spm + 3f48: 27 c0 rjmp .+78 ; 0x3f98 #endif } /* Read memory block mode, length is big endian. */ else if(ch == STK_READ_PAGE) { - 3f2c: 84 37 cpi r24, 0x74 ; 116 - 3f2e: b9 f4 brne .+46 ; 0x3f5e + 3f4a: 84 37 cpi r24, 0x74 ; 116 + 3f4c: b9 f4 brne .+46 ; 0x3f7c // READ PAGE - we only read flash getLen(); - 3f30: 37 d0 rcall .+110 ; 0x3fa0 + 3f4e: 37 d0 rcall .+110 ; 0x3fbe verifySpace(); - 3f32: 46 d0 rcall .+140 ; 0x3fc0 + 3f50: 46 d0 rcall .+140 ; 0x3fde putch(result); address++; } while (--length); #else do putch(pgm_read_byte_near(address++)); - 3f34: e0 91 00 02 lds r30, 0x0200 - 3f38: f0 91 01 02 lds r31, 0x0201 - 3f3c: 31 96 adiw r30, 0x01 ; 1 - 3f3e: f0 93 01 02 sts 0x0201, r31 - 3f42: e0 93 00 02 sts 0x0200, r30 - 3f46: 31 97 sbiw r30, 0x01 ; 1 - 3f48: e4 91 lpm r30, Z+ - 3f4a: 8e 2f mov r24, r30 - 3f4c: 19 d0 rcall .+50 ; 0x3f80 + 3f52: e0 91 00 02 lds r30, 0x0200 + 3f56: f0 91 01 02 lds r31, 0x0201 + 3f5a: 31 96 adiw r30, 0x01 ; 1 + 3f5c: f0 93 01 02 sts 0x0201, r31 + 3f60: e0 93 00 02 sts 0x0200, r30 + 3f64: 31 97 sbiw r30, 0x01 ; 1 + 3f66: e4 91 lpm r30, Z+ + 3f68: 8e 2f mov r24, r30 + 3f6a: 19 d0 rcall .+50 ; 0x3f9e while (--length); - 3f4e: 80 91 02 02 lds r24, 0x0202 - 3f52: 81 50 subi r24, 0x01 ; 1 - 3f54: 80 93 02 02 sts 0x0202, r24 - 3f58: 88 23 and r24, r24 - 3f5a: 61 f7 brne .-40 ; 0x3f34 - 3f5c: 0e c0 rjmp .+28 ; 0x3f7a + 3f6c: 80 91 02 02 lds r24, 0x0202 + 3f70: 81 50 subi r24, 0x01 ; 1 + 3f72: 80 93 02 02 sts 0x0202, r24 + 3f76: 88 23 and r24, r24 + 3f78: 61 f7 brne .-40 ; 0x3f52 + 3f7a: 0e c0 rjmp .+28 ; 0x3f98 #endif #endif } /* Get device signature bytes */ else if(ch == STK_READ_SIGN) { - 3f5e: 85 37 cpi r24, 0x75 ; 117 - 3f60: 39 f4 brne .+14 ; 0x3f70 + 3f7c: 85 37 cpi r24, 0x75 ; 117 + 3f7e: 39 f4 brne .+14 ; 0x3f8e // READ SIGN - return what Avrdude wants to hear verifySpace(); - 3f62: 2e d0 rcall .+92 ; 0x3fc0 + 3f80: 2e d0 rcall .+92 ; 0x3fde putch(SIGNATURE_0); - 3f64: 8e e1 ldi r24, 0x1E ; 30 - 3f66: 0c d0 rcall .+24 ; 0x3f80 + 3f82: 8e e1 ldi r24, 0x1E ; 30 + 3f84: 0c d0 rcall .+24 ; 0x3f9e putch(SIGNATURE_1); - 3f68: 84 e9 ldi r24, 0x94 ; 148 - 3f6a: 0a d0 rcall .+20 ; 0x3f80 + 3f86: 84 e9 ldi r24, 0x94 ; 148 + 3f88: 0a d0 rcall .+20 ; 0x3f9e putch(SIGNATURE_2); - 3f6c: 86 e0 ldi r24, 0x06 ; 6 - 3f6e: 9a cf rjmp .-204 ; 0x3ea4 + 3f8a: 86 e0 ldi r24, 0x06 ; 6 + 3f8c: 8b cf rjmp .-234 ; 0x3ea4 } else if (ch == 'Q') { - 3f70: 81 35 cpi r24, 0x51 ; 81 - 3f72: 11 f4 brne .+4 ; 0x3f78 + 3f8e: 81 35 cpi r24, 0x51 ; 81 + 3f90: 11 f4 brne .+4 ; 0x3f96 // Adaboot no-wait mod watchdogConfig(WATCHDOG_16MS); - 3f74: 88 e0 ldi r24, 0x08 ; 8 - 3f76: 19 d0 rcall .+50 ; 0x3faa + 3f92: 88 e0 ldi r24, 0x08 ; 8 + 3f94: 19 d0 rcall .+50 ; 0x3fc8 verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); - 3f78: 23 d0 rcall .+70 ; 0x3fc0 + 3f96: 23 d0 rcall .+70 ; 0x3fde } putch(STK_OK); - 3f7a: 80 e1 ldi r24, 0x10 ; 16 - 3f7c: 01 d0 rcall .+2 ; 0x3f80 - 3f7e: 6b cf rjmp .-298 ; 0x3e56 + 3f98: 80 e1 ldi r24, 0x10 ; 16 + 3f9a: 01 d0 rcall .+2 ; 0x3f9e + 3f9c: 5c cf rjmp .-328 ; 0x3e56 -00003f80 : +00003f9e : } } void putch(char ch) { - 3f80: 98 2f mov r25, r24 + 3f9e: 98 2f mov r25, r24 #ifndef SOFT_UART while (!(UCSR0A & _BV(UDRE0))); - 3f82: 80 91 c0 00 lds r24, 0x00C0 - 3f86: 85 ff sbrs r24, 5 - 3f88: fc cf rjmp .-8 ; 0x3f82 + 3fa0: 80 91 c0 00 lds r24, 0x00C0 + 3fa4: 85 ff sbrs r24, 5 + 3fa6: fc cf rjmp .-8 ; 0x3fa0 UDR0 = ch; - 3f8a: 90 93 c6 00 sts 0x00C6, r25 + 3fa8: 90 93 c6 00 sts 0x00C6, r25 [uartBit] "I" (UART_TX_BIT) : "r25" ); #endif } - 3f8e: 08 95 ret + 3fac: 08 95 ret -00003f90 : +00003fae : return getch(); } // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( - 3f90: a8 95 wdr + 3fae: a8 95 wdr [uartBit] "I" (UART_RX_BIT) : "r25" ); #else while(!(UCSR0A & _BV(RXC0))); - 3f92: 80 91 c0 00 lds r24, 0x00C0 - 3f96: 87 ff sbrs r24, 7 - 3f98: fc cf rjmp .-8 ; 0x3f92 + 3fb0: 80 91 c0 00 lds r24, 0x00C0 + 3fb4: 87 ff sbrs r24, 7 + 3fb6: fc cf rjmp .-8 ; 0x3fb0 ch = UDR0; - 3f9a: 80 91 c6 00 lds r24, 0x00C6 + 3fb8: 80 91 c6 00 lds r24, 0x00C6 #ifdef LED_DATA_FLASH LED_PIN |= _BV(LED); #endif return ch; } - 3f9e: 08 95 ret + 3fbc: 08 95 ret -00003fa0 : +00003fbe : } while (--count); } #endif uint8_t getLen() { getch(); - 3fa0: f7 df rcall .-18 ; 0x3f90 + 3fbe: f7 df rcall .-18 ; 0x3fae length = getch(); - 3fa2: f6 df rcall .-20 ; 0x3f90 - 3fa4: 80 93 02 02 sts 0x0202, r24 + 3fc0: f6 df rcall .-20 ; 0x3fae + 3fc2: 80 93 02 02 sts 0x0202, r24 return getch(); } - 3fa8: f3 cf rjmp .-26 ; 0x3f90 + 3fc6: f3 cf rjmp .-26 ; 0x3fae -00003faa : +00003fc8 : "wdr\n" ); } void watchdogConfig(uint8_t x) { WDTCSR = _BV(WDCE) | _BV(WDE); - 3faa: e0 e6 ldi r30, 0x60 ; 96 - 3fac: f0 e0 ldi r31, 0x00 ; 0 - 3fae: 98 e1 ldi r25, 0x18 ; 24 - 3fb0: 90 83 st Z, r25 + 3fc8: e0 e6 ldi r30, 0x60 ; 96 + 3fca: f0 e0 ldi r31, 0x00 ; 0 + 3fcc: 98 e1 ldi r25, 0x18 ; 24 + 3fce: 90 83 st Z, r25 WDTCSR = x; - 3fb2: 80 83 st Z, r24 + 3fd0: 80 83 st Z, r24 } - 3fb4: 08 95 ret + 3fd2: 08 95 ret -00003fb6 : +00003fd4 : void appStart() { watchdogConfig(WATCHDOG_OFF); - 3fb6: 80 e0 ldi r24, 0x00 ; 0 - 3fb8: f8 df rcall .-16 ; 0x3faa + 3fd4: 80 e0 ldi r24, 0x00 ; 0 + 3fd6: f8 df rcall .-16 ; 0x3fc8 __asm__ __volatile__ ( - 3fba: ee 27 eor r30, r30 - 3fbc: ff 27 eor r31, r31 - 3fbe: 09 94 ijmp + 3fd8: ee 27 eor r30, r30 + 3fda: ff 27 eor r31, r31 + 3fdc: 09 94 ijmp -00003fc0 : +00003fde : do getch(); while (--count); verifySpace(); } void verifySpace() { if (getch() != CRC_EOP) appStart(); - 3fc0: e7 df rcall .-50 ; 0x3f90 - 3fc2: 80 32 cpi r24, 0x20 ; 32 - 3fc4: 09 f0 breq .+2 ; 0x3fc8 - 3fc6: f7 df rcall .-18 ; 0x3fb6 + 3fde: e7 df rcall .-50 ; 0x3fae + 3fe0: 80 32 cpi r24, 0x20 ; 32 + 3fe2: 09 f0 breq .+2 ; 0x3fe6 + 3fe4: f7 df rcall .-18 ; 0x3fd4 putch(STK_INSYNC); - 3fc8: 84 e1 ldi r24, 0x14 ; 20 + 3fe6: 84 e1 ldi r24, 0x14 ; 20 } - 3fca: da cf rjmp .-76 ; 0x3f80 + 3fe8: da cf rjmp .-76 ; 0x3f9e ::[count] "M" (UART_B_VALUE) ); } #endif void getNch(uint8_t count) { - 3fcc: 1f 93 push r17 - 3fce: 18 2f mov r17, r24 + 3fea: 1f 93 push r17 + 3fec: 18 2f mov r17, r24 -00003fd0 : +00003fee : do getch(); while (--count); - 3fd0: df df rcall .-66 ; 0x3f90 - 3fd2: 11 50 subi r17, 0x01 ; 1 - 3fd4: e9 f7 brne .-6 ; 0x3fd0 + 3fee: df df rcall .-66 ; 0x3fae + 3ff0: 11 50 subi r17, 0x01 ; 1 + 3ff2: e9 f7 brne .-6 ; 0x3fee verifySpace(); - 3fd6: f4 df rcall .-24 ; 0x3fc0 + 3ff4: f4 df rcall .-24 ; 0x3fde } - 3fd8: 1f 91 pop r17 - 3fda: 08 95 ret + 3ff6: 1f 91 pop r17 + 3ff8: 08 95 ret diff --git a/optiboot/bootloaders/optiboot/optiboot_luminet.hex b/optiboot/bootloaders/optiboot/optiboot_luminet.hex index f6e844f..a65c2c4 100644 --- a/optiboot/bootloaders/optiboot/optiboot_luminet.hex +++ b/optiboot/bootloaders/optiboot/optiboot_luminet.hex @@ -7,9 +7,9 @@ :101D600081F4D7D0082F10E0D4D090E0982F8827A6 :101D7000802B912B880F991F909381018093800174 :101D8000B5C0863529F484E0ECD080E0B3D0AFC094 -:101D9000843609F06BC0D1D0E0918001F0918101CF -:101DA00083E087BFE895C0E0D1E0B3D0899380910C -:101DB00082018150809382018823B9F7CCD007B685 +:101D9000843609F06BC0D1D0C0E0D1E0BAD08993CD +:101DA000809182018150809382018823B9F7E0916C +:101DB0008001F091810183E087BFE895CCD007B620 :101DC00000FCFDCF8091800190918101892B41F52C :101DD000809100012091010130E0322F222790E014 :101DE000282B392B309385012093840140910801E1 diff --git a/optiboot/bootloaders/optiboot/optiboot_luminet.lst b/optiboot/bootloaders/optiboot/optiboot_luminet.lst index 875e702..5a8f626 100644 --- a/optiboot/bootloaders/optiboot/optiboot_luminet.lst +++ b/optiboot/bootloaders/optiboot/optiboot_luminet.lst @@ -9,11 +9,11 @@ Idx Name Size VMA LMA File off Algn CONTENTS, READONLY, DEBUGGING 2 .debug_pubnames 00000078 00000000 00000000 000002ee 2**0 CONTENTS, READONLY, DEBUGGING - 3 .debug_info 000002a3 00000000 00000000 00000366 2**0 + 3 .debug_info 000002a4 00000000 00000000 00000366 2**0 CONTENTS, READONLY, DEBUGGING - 4 .debug_abbrev 000001ac 00000000 00000000 00000609 2**0 + 4 .debug_abbrev 000001ac 00000000 00000000 0000060a 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_line 0000043d 00000000 00000000 000007b5 2**0 + 5 .debug_line 0000043d 00000000 00000000 000007b6 2**0 CONTENTS, READONLY, DEBUGGING 6 .debug_frame 000000a0 00000000 00000000 00000bf4 2**2 CONTENTS, READONLY, DEBUGGING @@ -217,28 +217,31 @@ void watchdogReset() { getLen(); 1d96: d1 d0 rcall .+418 ; 0x1f3a - - // Immediately start page erase - this will 4.5ms - __boot_page_erase_short((uint16_t)(void*)address); - 1d98: e0 91 80 01 lds r30, 0x0180 - 1d9c: f0 91 81 01 lds r31, 0x0181 - 1da0: 83 e0 ldi r24, 0x03 ; 3 - 1da2: 87 bf out 0x37, r24 ; 55 - 1da4: e8 95 spm - 1da6: c0 e0 ldi r28, 0x00 ; 0 - 1da8: d1 e0 ldi r29, 0x01 ; 1 + 1d98: c0 e0 ldi r28, 0x00 ; 0 + 1d9a: d1 e0 ldi r29, 0x01 ; 1 + // If we are in RWW section, immediately start page erase + if (address < NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); // While that is going on, read in page contents bufPtr = buff; do *bufPtr++ = getch(); - 1daa: b3 d0 rcall .+358 ; 0x1f12 - 1dac: 89 93 st Y+, r24 + 1d9c: ba d0 rcall .+372 ; 0x1f12 + 1d9e: 89 93 st Y+, r24 while (--length); - 1dae: 80 91 82 01 lds r24, 0x0182 - 1db2: 81 50 subi r24, 0x01 ; 1 - 1db4: 80 93 82 01 sts 0x0182, r24 - 1db8: 88 23 and r24, r24 - 1dba: b9 f7 brne .-18 ; 0x1daa + 1da0: 80 91 82 01 lds r24, 0x0182 + 1da4: 81 50 subi r24, 0x01 ; 1 + 1da6: 80 93 82 01 sts 0x0182, r24 + 1daa: 88 23 and r24, r24 + 1dac: b9 f7 brne .-18 ; 0x1d9c + + // If we are in NRWW section, page erase has to be delayed until now. + // Todo: Take RAMPZ into account + if (address >= NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); + 1dae: e0 91 80 01 lds r30, 0x0180 + 1db2: f0 91 81 01 lds r31, 0x0181 + 1db6: 83 e0 ldi r24, 0x03 ; 3 + 1db8: 87 bf out 0x37, r24 ; 55 + 1dba: e8 95 spm // Read command terminator, start reply verifySpace(); diff --git a/optiboot/bootloaders/optiboot/optiboot_pro_16MHz.hex b/optiboot/bootloaders/optiboot/optiboot_pro_16MHz.hex index aefcee6..15c02ec 100644 --- a/optiboot/bootloaders/optiboot/optiboot_pro_16MHz.hex +++ b/optiboot/bootloaders/optiboot/optiboot_pro_16MHz.hex @@ -1,32 +1,34 @@ :103E000085E08093810082E08093C00088E1809308 :103E1000C10086E08093C20080E18093C40084B733 -:103E200014BE81FFC8D08DE0C0D0259A86E020E383 +:103E200014BE81FFD7D08DE0CFD0259A86E020E365 :103E30003CEF91E0309385002093840096BBB09BCB :103E4000FECF1D9AA8958150A9F7DD24D394A5E053 -:103E5000FA2EF1E1EF2E9CD0813421F481E0B6D02E +:103E5000EA2EF1E1FF2EABD0813421F481E0C5D010 :103E600083E020C0823411F484E103C0853419F466 -:103E700085E0ACD082C0853581F48AD0082F10E06F -:103E800087D090E0982F8827802B912B880F991F3F -:103E900090930102809300026FC0863529F484E07C -:103EA00095D080E06DD069C0843609F03FC078D0ED -:103EB000E0910002F091010283E087BFE895C0E045 -:103EC000D1E066D0899380910202815080930202F2 -:103ED0008823B9F775D007B600FCFDCF40910002EA -:103EE00050910102A0E0B1E02C9130E011968C914C -:103EF000119790E0982F8827822B932B1296FA0126 -:103F00000C01D7BEE89511244E5F5F4FF1E0A03859 -:103F1000BF0751F7E0910002F0910102F7BEE8956A -:103F200007B600FCFDCFE7BEE89527C08437B9F49B -:103F300037D046D0E0910002F09101023196F09323 -:103F40000102E09300023197E4918E2F19D0809105 -:103F50000202815080930202882361F70EC08537E8 -:103F600039F42ED08EE10CD084E90AD086E09ACFC5 -:103F7000813511F488E019D023D080E101D06BCFD6 -:103F8000982F8091C00085FFFCCF9093C6000895C4 -:103F9000A8958091C00087FFFCCF8091C60008954E -:103FA000F7DFF6DF80930202F3CFE0E6F0E098E17E -:103FB00090838083089580E0F8DFEE27FF2709943F -:103FC000E7DF803209F0F7DF84E1DACF1F93182FA3 -:0C3FD000DFDF1150E9F7F4DF1F910895C6 +:103E700085E0BBD091C0853581F499D0082F10E042 +:103E800096D090E0982F8827802B912B880F991F30 +:103E900090930102809300027EC0863529F484E06D +:103EA000A4D080E07CD078C0843609F04EC087D0A2 +:103EB000E0910002F091010288E3E030F80718F485 +:103EC00083E087BFE895C0E0D1E071D0899380910D +:103ED00002028150809302028823B9F7E091000228 +:103EE000F091010288E3E030F80718F083E087BF23 +:103EF000E89575D007B600FCFDCF409100025091C7 +:103F00000102A0E0B1E02C9130E011968C91119764 +:103F100090E0982F8827822B932B1296FA010C01A0 +:103F2000D7BEE89511244E5F5F4FF1E0A038BF0780 +:103F300051F7E0910002F0910102E7BEE89507B663 +:103F400000FCFDCFF7BEE89527C08437B9F437D021 +:103F500046D0E0910002F09101023196F093010207 +:103F6000E09300023197E4918E2F19D080910202E4 +:103F7000815080930202882361F70EC0853739F49F +:103F80002ED08EE10CD084E90AD086E08BCF81352B +:103F900011F488E019D023D080E101D05CCF982FB4 +:103FA0008091C00085FFFCCF9093C6000895A8952E +:103FB0008091C00087FFFCCF8091C6000895F7DF95 +:103FC000F6DF80930202F3CFE0E6F0E098E1908321 +:103FD0008083089580E0F8DFEE27FF270994E7DF6C +:103FE000803209F0F7DF84E1DACF1F93182FDFDF8B +:0A3FF0001150E9F7F4DF1F91089566 :0400000300003E00BB :00000001FF diff --git a/optiboot/bootloaders/optiboot/optiboot_pro_16MHz.lst b/optiboot/bootloaders/optiboot/optiboot_pro_16MHz.lst index 512a32c..22bc7c0 100644 --- a/optiboot/bootloaders/optiboot/optiboot_pro_16MHz.lst +++ b/optiboot/bootloaders/optiboot/optiboot_pro_16MHz.lst @@ -3,25 +3,25 @@ optiboot_pro_16MHz.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn - 0 .text 000001dc 00003e00 00003e00 00000054 2**1 + 0 .text 000001fa 00003e00 00003e00 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .debug_aranges 00000028 00000000 00000000 00000230 2**0 + 1 .debug_aranges 00000028 00000000 00000000 0000024e 2**0 CONTENTS, READONLY, DEBUGGING - 2 .debug_pubnames 0000006a 00000000 00000000 00000258 2**0 + 2 .debug_pubnames 0000006a 00000000 00000000 00000276 2**0 CONTENTS, READONLY, DEBUGGING - 3 .debug_info 00000283 00000000 00000000 000002c2 2**0 + 3 .debug_info 00000284 00000000 00000000 000002e0 2**0 CONTENTS, READONLY, DEBUGGING - 4 .debug_abbrev 000001ae 00000000 00000000 00000545 2**0 + 4 .debug_abbrev 000001ae 00000000 00000000 00000564 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_line 000003db 00000000 00000000 000006f3 2**0 + 5 .debug_line 000003e3 00000000 00000000 00000712 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_frame 00000090 00000000 00000000 00000ad0 2**2 + 6 .debug_frame 00000090 00000000 00000000 00000af8 2**2 CONTENTS, READONLY, DEBUGGING - 7 .debug_str 00000140 00000000 00000000 00000b60 2**0 + 7 .debug_str 00000140 00000000 00000000 00000b88 2**0 CONTENTS, READONLY, DEBUGGING - 8 .debug_loc 000001d1 00000000 00000000 00000ca0 2**0 + 8 .debug_loc 000001e1 00000000 00000000 00000cc8 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_ranges 00000068 00000000 00000000 00000e71 2**0 + 9 .debug_ranges 00000068 00000000 00000000 00000ea9 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: @@ -61,12 +61,12 @@ int main(void) { 3e20: 14 be out 0x34, r1 ; 52 if (!(ch & _BV(EXTRF))) appStart(); 3e22: 81 ff sbrs r24, 1 - 3e24: c8 d0 rcall .+400 ; 0x3fb6 + 3e24: d7 d0 rcall .+430 ; 0x3fd4 // Set up watchdog to trigger after 500ms watchdogConfig(WATCHDOG_500MS); 3e26: 8d e0 ldi r24, 0x0D ; 13 - 3e28: c0 d0 rcall .+384 ; 0x3faa + 3e28: cf d0 rcall .+414 ; 0x3fc8 /* Set LED pin as output */ LED_DDR |= _BV(LED); @@ -127,21 +127,21 @@ void watchdogReset() { // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); 3e4e: a5 e0 ldi r26, 0x05 ; 5 - 3e50: fa 2e mov r15, r26 + 3e50: ea 2e mov r14, r26 boot_spm_busy_wait(); #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); 3e52: f1 e1 ldi r31, 0x11 ; 17 - 3e54: ef 2e mov r14, r31 + 3e54: ff 2e mov r15, r31 #endif /* Forever loop */ for (;;) { /* get character from UART */ ch = getch(); - 3e56: 9c d0 rcall .+312 ; 0x3f90 + 3e56: ab d0 rcall .+342 ; 0x3fae if(ch == STK_GET_PARAMETER) { 3e58: 81 34 cpi r24, 0x41 ; 65 @@ -149,7 +149,7 @@ void watchdogReset() { // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy getNch(1); 3e5c: 81 e0 ldi r24, 0x01 ; 1 - 3e5e: b6 d0 rcall .+364 ; 0x3fcc + 3e5e: c5 d0 rcall .+394 ; 0x3fea putch(0x03); 3e60: 83 e0 ldi r24, 0x03 ; 3 3e62: 20 c0 rjmp .+64 ; 0x3ea4 @@ -168,8 +168,8 @@ void watchdogReset() { // SET DEVICE EXT is ignored getNch(5); 3e70: 85 e0 ldi r24, 0x05 ; 5 - 3e72: ac d0 rcall .+344 ; 0x3fcc - 3e74: 82 c0 rjmp .+260 ; 0x3f7a + 3e72: bb d0 rcall .+374 ; 0x3fea + 3e74: 91 c0 rjmp .+290 ; 0x3f98 } else if(ch == STK_LOAD_ADDRESS) { 3e76: 85 35 cpi r24, 0x55 ; 85 @@ -177,11 +177,11 @@ void watchdogReset() { // LOAD ADDRESS uint16_t newAddress; newAddress = getch(); - 3e7a: 8a d0 rcall .+276 ; 0x3f90 + 3e7a: 99 d0 rcall .+306 ; 0x3fae newAddress = (newAddress & 0xff) | (getch() << 8); 3e7c: 08 2f mov r16, r24 3e7e: 10 e0 ldi r17, 0x00 ; 0 - 3e80: 87 d0 rcall .+270 ; 0x3f90 + 3e80: 96 d0 rcall .+300 ; 0x3fae 3e82: 90 e0 ldi r25, 0x00 ; 0 3e84: 98 2f mov r25, r24 3e86: 88 27 eor r24, r24 @@ -197,7 +197,7 @@ void watchdogReset() { address = newAddress; 3e90: 90 93 01 02 sts 0x0201, r25 3e94: 80 93 00 02 sts 0x0200, r24 - 3e98: 6f c0 rjmp .+222 ; 0x3f78 + 3e98: 7e c0 rjmp .+252 ; 0x3f96 verifySpace(); } else if(ch == STK_UNIVERSAL) { @@ -206,320 +206,337 @@ void watchdogReset() { // UNIVERSAL command is ignored getNch(4); 3e9e: 84 e0 ldi r24, 0x04 ; 4 - 3ea0: 95 d0 rcall .+298 ; 0x3fcc + 3ea0: a4 d0 rcall .+328 ; 0x3fea putch(0x00); 3ea2: 80 e0 ldi r24, 0x00 ; 0 - 3ea4: 6d d0 rcall .+218 ; 0x3f80 - 3ea6: 69 c0 rjmp .+210 ; 0x3f7a + 3ea4: 7c d0 rcall .+248 ; 0x3f9e + 3ea6: 78 c0 rjmp .+240 ; 0x3f98 } /* Write memory, length is big endian and is in bytes */ else if(ch == STK_PROG_PAGE) { 3ea8: 84 36 cpi r24, 0x64 ; 100 3eaa: 09 f0 breq .+2 ; 0x3eae - 3eac: 3f c0 rjmp .+126 ; 0x3f2c + 3eac: 4e c0 rjmp .+156 ; 0x3f4a // PROGRAM PAGE - we support flash programming only, not EEPROM uint8_t *bufPtr; uint16_t addrPtr; getLen(); - 3eae: 78 d0 rcall .+240 ; 0x3fa0 + 3eae: 87 d0 rcall .+270 ; 0x3fbe - // Immediately start page erase - this will 4.5ms - __boot_page_erase_short((uint16_t)(void*)address); + // If we are in RWW section, immediately start page erase + if (address < NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); 3eb0: e0 91 00 02 lds r30, 0x0200 3eb4: f0 91 01 02 lds r31, 0x0201 - 3eb8: 83 e0 ldi r24, 0x03 ; 3 - 3eba: 87 bf out 0x37, r24 ; 55 - 3ebc: e8 95 spm - 3ebe: c0 e0 ldi r28, 0x00 ; 0 - 3ec0: d1 e0 ldi r29, 0x01 ; 1 + 3eb8: 88 e3 ldi r24, 0x38 ; 56 + 3eba: e0 30 cpi r30, 0x00 ; 0 + 3ebc: f8 07 cpc r31, r24 + 3ebe: 18 f4 brcc .+6 ; 0x3ec6 + 3ec0: 83 e0 ldi r24, 0x03 ; 3 + 3ec2: 87 bf out 0x37, r24 ; 55 + 3ec4: e8 95 spm + 3ec6: c0 e0 ldi r28, 0x00 ; 0 + 3ec8: d1 e0 ldi r29, 0x01 ; 1 // While that is going on, read in page contents bufPtr = buff; do *bufPtr++ = getch(); - 3ec2: 66 d0 rcall .+204 ; 0x3f90 - 3ec4: 89 93 st Y+, r24 + 3eca: 71 d0 rcall .+226 ; 0x3fae + 3ecc: 89 93 st Y+, r24 while (--length); - 3ec6: 80 91 02 02 lds r24, 0x0202 - 3eca: 81 50 subi r24, 0x01 ; 1 - 3ecc: 80 93 02 02 sts 0x0202, r24 - 3ed0: 88 23 and r24, r24 - 3ed2: b9 f7 brne .-18 ; 0x3ec2 + 3ece: 80 91 02 02 lds r24, 0x0202 + 3ed2: 81 50 subi r24, 0x01 ; 1 + 3ed4: 80 93 02 02 sts 0x0202, r24 + 3ed8: 88 23 and r24, r24 + 3eda: b9 f7 brne .-18 ; 0x3eca + + // If we are in NRWW section, page erase has to be delayed until now. + // Todo: Take RAMPZ into account + if (address >= NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); + 3edc: e0 91 00 02 lds r30, 0x0200 + 3ee0: f0 91 01 02 lds r31, 0x0201 + 3ee4: 88 e3 ldi r24, 0x38 ; 56 + 3ee6: e0 30 cpi r30, 0x00 ; 0 + 3ee8: f8 07 cpc r31, r24 + 3eea: 18 f0 brcs .+6 ; 0x3ef2 + 3eec: 83 e0 ldi r24, 0x03 ; 3 + 3eee: 87 bf out 0x37, r24 ; 55 + 3ef0: e8 95 spm // Read command terminator, start reply verifySpace(); - 3ed4: 75 d0 rcall .+234 ; 0x3fc0 + 3ef2: 75 d0 rcall .+234 ; 0x3fde // If only a partial page is to be programmed, the erase might not be complete. // So check that here boot_spm_busy_wait(); - 3ed6: 07 b6 in r0, 0x37 ; 55 - 3ed8: 00 fc sbrc r0, 0 - 3eda: fd cf rjmp .-6 ; 0x3ed6 + 3ef4: 07 b6 in r0, 0x37 ; 55 + 3ef6: 00 fc sbrc r0, 0 + 3ef8: fd cf rjmp .-6 ; 0x3ef4 } #endif // Copy buffer into programming buffer bufPtr = buff; addrPtr = (uint16_t)(void*)address; - 3edc: 40 91 00 02 lds r20, 0x0200 - 3ee0: 50 91 01 02 lds r21, 0x0201 - 3ee4: a0 e0 ldi r26, 0x00 ; 0 - 3ee6: b1 e0 ldi r27, 0x01 ; 1 + 3efa: 40 91 00 02 lds r20, 0x0200 + 3efe: 50 91 01 02 lds r21, 0x0201 + 3f02: a0 e0 ldi r26, 0x00 ; 0 + 3f04: b1 e0 ldi r27, 0x01 ; 1 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; - 3ee8: 2c 91 ld r18, X - 3eea: 30 e0 ldi r19, 0x00 ; 0 + 3f06: 2c 91 ld r18, X + 3f08: 30 e0 ldi r19, 0x00 ; 0 a |= (*bufPtr++) << 8; - 3eec: 11 96 adiw r26, 0x01 ; 1 - 3eee: 8c 91 ld r24, X - 3ef0: 11 97 sbiw r26, 0x01 ; 1 - 3ef2: 90 e0 ldi r25, 0x00 ; 0 - 3ef4: 98 2f mov r25, r24 - 3ef6: 88 27 eor r24, r24 - 3ef8: 82 2b or r24, r18 - 3efa: 93 2b or r25, r19 + 3f0a: 11 96 adiw r26, 0x01 ; 1 + 3f0c: 8c 91 ld r24, X + 3f0e: 11 97 sbiw r26, 0x01 ; 1 + 3f10: 90 e0 ldi r25, 0x00 ; 0 + 3f12: 98 2f mov r25, r24 + 3f14: 88 27 eor r24, r24 + 3f16: 82 2b or r24, r18 + 3f18: 93 2b or r25, r19 #define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #endif /* main program starts here */ int main(void) { - 3efc: 12 96 adiw r26, 0x02 ; 2 + 3f1a: 12 96 adiw r26, 0x02 ; 2 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; a |= (*bufPtr++) << 8; __boot_page_fill_short((uint16_t)(void*)addrPtr,a); - 3efe: fa 01 movw r30, r20 - 3f00: 0c 01 movw r0, r24 - 3f02: d7 be out 0x37, r13 ; 55 - 3f04: e8 95 spm - 3f06: 11 24 eor r1, r1 + 3f1c: fa 01 movw r30, r20 + 3f1e: 0c 01 movw r0, r24 + 3f20: d7 be out 0x37, r13 ; 55 + 3f22: e8 95 spm + 3f24: 11 24 eor r1, r1 addrPtr += 2; - 3f08: 4e 5f subi r20, 0xFE ; 254 - 3f0a: 5f 4f sbci r21, 0xFF ; 255 + 3f26: 4e 5f subi r20, 0xFE ; 254 + 3f28: 5f 4f sbci r21, 0xFF ; 255 } while (--ch); - 3f0c: f1 e0 ldi r31, 0x01 ; 1 - 3f0e: a0 38 cpi r26, 0x80 ; 128 - 3f10: bf 07 cpc r27, r31 - 3f12: 51 f7 brne .-44 ; 0x3ee8 + 3f2a: f1 e0 ldi r31, 0x01 ; 1 + 3f2c: a0 38 cpi r26, 0x80 ; 128 + 3f2e: bf 07 cpc r27, r31 + 3f30: 51 f7 brne .-44 ; 0x3f06 // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); - 3f14: e0 91 00 02 lds r30, 0x0200 - 3f18: f0 91 01 02 lds r31, 0x0201 - 3f1c: f7 be out 0x37, r15 ; 55 - 3f1e: e8 95 spm + 3f32: e0 91 00 02 lds r30, 0x0200 + 3f36: f0 91 01 02 lds r31, 0x0201 + 3f3a: e7 be out 0x37, r14 ; 55 + 3f3c: e8 95 spm boot_spm_busy_wait(); - 3f20: 07 b6 in r0, 0x37 ; 55 - 3f22: 00 fc sbrc r0, 0 - 3f24: fd cf rjmp .-6 ; 0x3f20 + 3f3e: 07 b6 in r0, 0x37 ; 55 + 3f40: 00 fc sbrc r0, 0 + 3f42: fd cf rjmp .-6 ; 0x3f3e #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); - 3f26: e7 be out 0x37, r14 ; 55 - 3f28: e8 95 spm - 3f2a: 27 c0 rjmp .+78 ; 0x3f7a + 3f44: f7 be out 0x37, r15 ; 55 + 3f46: e8 95 spm + 3f48: 27 c0 rjmp .+78 ; 0x3f98 #endif } /* Read memory block mode, length is big endian. */ else if(ch == STK_READ_PAGE) { - 3f2c: 84 37 cpi r24, 0x74 ; 116 - 3f2e: b9 f4 brne .+46 ; 0x3f5e + 3f4a: 84 37 cpi r24, 0x74 ; 116 + 3f4c: b9 f4 brne .+46 ; 0x3f7c // READ PAGE - we only read flash getLen(); - 3f30: 37 d0 rcall .+110 ; 0x3fa0 + 3f4e: 37 d0 rcall .+110 ; 0x3fbe verifySpace(); - 3f32: 46 d0 rcall .+140 ; 0x3fc0 + 3f50: 46 d0 rcall .+140 ; 0x3fde putch(result); address++; } while (--length); #else do putch(pgm_read_byte_near(address++)); - 3f34: e0 91 00 02 lds r30, 0x0200 - 3f38: f0 91 01 02 lds r31, 0x0201 - 3f3c: 31 96 adiw r30, 0x01 ; 1 - 3f3e: f0 93 01 02 sts 0x0201, r31 - 3f42: e0 93 00 02 sts 0x0200, r30 - 3f46: 31 97 sbiw r30, 0x01 ; 1 - 3f48: e4 91 lpm r30, Z+ - 3f4a: 8e 2f mov r24, r30 - 3f4c: 19 d0 rcall .+50 ; 0x3f80 + 3f52: e0 91 00 02 lds r30, 0x0200 + 3f56: f0 91 01 02 lds r31, 0x0201 + 3f5a: 31 96 adiw r30, 0x01 ; 1 + 3f5c: f0 93 01 02 sts 0x0201, r31 + 3f60: e0 93 00 02 sts 0x0200, r30 + 3f64: 31 97 sbiw r30, 0x01 ; 1 + 3f66: e4 91 lpm r30, Z+ + 3f68: 8e 2f mov r24, r30 + 3f6a: 19 d0 rcall .+50 ; 0x3f9e while (--length); - 3f4e: 80 91 02 02 lds r24, 0x0202 - 3f52: 81 50 subi r24, 0x01 ; 1 - 3f54: 80 93 02 02 sts 0x0202, r24 - 3f58: 88 23 and r24, r24 - 3f5a: 61 f7 brne .-40 ; 0x3f34 - 3f5c: 0e c0 rjmp .+28 ; 0x3f7a + 3f6c: 80 91 02 02 lds r24, 0x0202 + 3f70: 81 50 subi r24, 0x01 ; 1 + 3f72: 80 93 02 02 sts 0x0202, r24 + 3f76: 88 23 and r24, r24 + 3f78: 61 f7 brne .-40 ; 0x3f52 + 3f7a: 0e c0 rjmp .+28 ; 0x3f98 #endif #endif } /* Get device signature bytes */ else if(ch == STK_READ_SIGN) { - 3f5e: 85 37 cpi r24, 0x75 ; 117 - 3f60: 39 f4 brne .+14 ; 0x3f70 + 3f7c: 85 37 cpi r24, 0x75 ; 117 + 3f7e: 39 f4 brne .+14 ; 0x3f8e // READ SIGN - return what Avrdude wants to hear verifySpace(); - 3f62: 2e d0 rcall .+92 ; 0x3fc0 + 3f80: 2e d0 rcall .+92 ; 0x3fde putch(SIGNATURE_0); - 3f64: 8e e1 ldi r24, 0x1E ; 30 - 3f66: 0c d0 rcall .+24 ; 0x3f80 + 3f82: 8e e1 ldi r24, 0x1E ; 30 + 3f84: 0c d0 rcall .+24 ; 0x3f9e putch(SIGNATURE_1); - 3f68: 84 e9 ldi r24, 0x94 ; 148 - 3f6a: 0a d0 rcall .+20 ; 0x3f80 + 3f86: 84 e9 ldi r24, 0x94 ; 148 + 3f88: 0a d0 rcall .+20 ; 0x3f9e putch(SIGNATURE_2); - 3f6c: 86 e0 ldi r24, 0x06 ; 6 - 3f6e: 9a cf rjmp .-204 ; 0x3ea4 + 3f8a: 86 e0 ldi r24, 0x06 ; 6 + 3f8c: 8b cf rjmp .-234 ; 0x3ea4 } else if (ch == 'Q') { - 3f70: 81 35 cpi r24, 0x51 ; 81 - 3f72: 11 f4 brne .+4 ; 0x3f78 + 3f8e: 81 35 cpi r24, 0x51 ; 81 + 3f90: 11 f4 brne .+4 ; 0x3f96 // Adaboot no-wait mod watchdogConfig(WATCHDOG_16MS); - 3f74: 88 e0 ldi r24, 0x08 ; 8 - 3f76: 19 d0 rcall .+50 ; 0x3faa + 3f92: 88 e0 ldi r24, 0x08 ; 8 + 3f94: 19 d0 rcall .+50 ; 0x3fc8 verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); - 3f78: 23 d0 rcall .+70 ; 0x3fc0 + 3f96: 23 d0 rcall .+70 ; 0x3fde } putch(STK_OK); - 3f7a: 80 e1 ldi r24, 0x10 ; 16 - 3f7c: 01 d0 rcall .+2 ; 0x3f80 - 3f7e: 6b cf rjmp .-298 ; 0x3e56 + 3f98: 80 e1 ldi r24, 0x10 ; 16 + 3f9a: 01 d0 rcall .+2 ; 0x3f9e + 3f9c: 5c cf rjmp .-328 ; 0x3e56 -00003f80 : +00003f9e : } } void putch(char ch) { - 3f80: 98 2f mov r25, r24 + 3f9e: 98 2f mov r25, r24 #ifndef SOFT_UART while (!(UCSR0A & _BV(UDRE0))); - 3f82: 80 91 c0 00 lds r24, 0x00C0 - 3f86: 85 ff sbrs r24, 5 - 3f88: fc cf rjmp .-8 ; 0x3f82 + 3fa0: 80 91 c0 00 lds r24, 0x00C0 + 3fa4: 85 ff sbrs r24, 5 + 3fa6: fc cf rjmp .-8 ; 0x3fa0 UDR0 = ch; - 3f8a: 90 93 c6 00 sts 0x00C6, r25 + 3fa8: 90 93 c6 00 sts 0x00C6, r25 [uartBit] "I" (UART_TX_BIT) : "r25" ); #endif } - 3f8e: 08 95 ret + 3fac: 08 95 ret -00003f90 : +00003fae : return getch(); } // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( - 3f90: a8 95 wdr + 3fae: a8 95 wdr [uartBit] "I" (UART_RX_BIT) : "r25" ); #else while(!(UCSR0A & _BV(RXC0))); - 3f92: 80 91 c0 00 lds r24, 0x00C0 - 3f96: 87 ff sbrs r24, 7 - 3f98: fc cf rjmp .-8 ; 0x3f92 + 3fb0: 80 91 c0 00 lds r24, 0x00C0 + 3fb4: 87 ff sbrs r24, 7 + 3fb6: fc cf rjmp .-8 ; 0x3fb0 ch = UDR0; - 3f9a: 80 91 c6 00 lds r24, 0x00C6 + 3fb8: 80 91 c6 00 lds r24, 0x00C6 #ifdef LED_DATA_FLASH LED_PIN |= _BV(LED); #endif return ch; } - 3f9e: 08 95 ret + 3fbc: 08 95 ret -00003fa0 : +00003fbe : } while (--count); } #endif uint8_t getLen() { getch(); - 3fa0: f7 df rcall .-18 ; 0x3f90 + 3fbe: f7 df rcall .-18 ; 0x3fae length = getch(); - 3fa2: f6 df rcall .-20 ; 0x3f90 - 3fa4: 80 93 02 02 sts 0x0202, r24 + 3fc0: f6 df rcall .-20 ; 0x3fae + 3fc2: 80 93 02 02 sts 0x0202, r24 return getch(); } - 3fa8: f3 cf rjmp .-26 ; 0x3f90 + 3fc6: f3 cf rjmp .-26 ; 0x3fae -00003faa : +00003fc8 : "wdr\n" ); } void watchdogConfig(uint8_t x) { WDTCSR = _BV(WDCE) | _BV(WDE); - 3faa: e0 e6 ldi r30, 0x60 ; 96 - 3fac: f0 e0 ldi r31, 0x00 ; 0 - 3fae: 98 e1 ldi r25, 0x18 ; 24 - 3fb0: 90 83 st Z, r25 + 3fc8: e0 e6 ldi r30, 0x60 ; 96 + 3fca: f0 e0 ldi r31, 0x00 ; 0 + 3fcc: 98 e1 ldi r25, 0x18 ; 24 + 3fce: 90 83 st Z, r25 WDTCSR = x; - 3fb2: 80 83 st Z, r24 + 3fd0: 80 83 st Z, r24 } - 3fb4: 08 95 ret + 3fd2: 08 95 ret -00003fb6 : +00003fd4 : void appStart() { watchdogConfig(WATCHDOG_OFF); - 3fb6: 80 e0 ldi r24, 0x00 ; 0 - 3fb8: f8 df rcall .-16 ; 0x3faa + 3fd4: 80 e0 ldi r24, 0x00 ; 0 + 3fd6: f8 df rcall .-16 ; 0x3fc8 __asm__ __volatile__ ( - 3fba: ee 27 eor r30, r30 - 3fbc: ff 27 eor r31, r31 - 3fbe: 09 94 ijmp + 3fd8: ee 27 eor r30, r30 + 3fda: ff 27 eor r31, r31 + 3fdc: 09 94 ijmp -00003fc0 : +00003fde : do getch(); while (--count); verifySpace(); } void verifySpace() { if (getch() != CRC_EOP) appStart(); - 3fc0: e7 df rcall .-50 ; 0x3f90 - 3fc2: 80 32 cpi r24, 0x20 ; 32 - 3fc4: 09 f0 breq .+2 ; 0x3fc8 - 3fc6: f7 df rcall .-18 ; 0x3fb6 + 3fde: e7 df rcall .-50 ; 0x3fae + 3fe0: 80 32 cpi r24, 0x20 ; 32 + 3fe2: 09 f0 breq .+2 ; 0x3fe6 + 3fe4: f7 df rcall .-18 ; 0x3fd4 putch(STK_INSYNC); - 3fc8: 84 e1 ldi r24, 0x14 ; 20 + 3fe6: 84 e1 ldi r24, 0x14 ; 20 } - 3fca: da cf rjmp .-76 ; 0x3f80 + 3fe8: da cf rjmp .-76 ; 0x3f9e ::[count] "M" (UART_B_VALUE) ); } #endif void getNch(uint8_t count) { - 3fcc: 1f 93 push r17 - 3fce: 18 2f mov r17, r24 + 3fea: 1f 93 push r17 + 3fec: 18 2f mov r17, r24 -00003fd0 : +00003fee : do getch(); while (--count); - 3fd0: df df rcall .-66 ; 0x3f90 - 3fd2: 11 50 subi r17, 0x01 ; 1 - 3fd4: e9 f7 brne .-6 ; 0x3fd0 + 3fee: df df rcall .-66 ; 0x3fae + 3ff0: 11 50 subi r17, 0x01 ; 1 + 3ff2: e9 f7 brne .-6 ; 0x3fee verifySpace(); - 3fd6: f4 df rcall .-24 ; 0x3fc0 + 3ff4: f4 df rcall .-24 ; 0x3fde } - 3fd8: 1f 91 pop r17 - 3fda: 08 95 ret + 3ff6: 1f 91 pop r17 + 3ff8: 08 95 ret diff --git a/optiboot/bootloaders/optiboot/optiboot_pro_20mhz.hex b/optiboot/bootloaders/optiboot/optiboot_pro_20mhz.hex index 354f904..951be6b 100644 --- a/optiboot/bootloaders/optiboot/optiboot_pro_20mhz.hex +++ b/optiboot/bootloaders/optiboot/optiboot_pro_20mhz.hex @@ -1,32 +1,34 @@ :103E000085E08093810082E08093C00088E1809308 :103E1000C10086E08093C20085E18093C40084B72E -:103E200014BE81FFC8D08DE0C0D0259A86E02CE377 +:103E200014BE81FFD7D08DE0CFD0259A86E02CE359 :103E30003BEF91E0309385002093840096BBB09BCC :103E4000FECF1D9AA8958150A9F7DD24D394A5E053 -:103E5000FA2EF1E1EF2E9CD0813421F481E0B6D02E +:103E5000EA2EF1E1FF2EABD0813421F481E0C5D010 :103E600083E020C0823411F484E103C0853419F466 -:103E700085E0ACD082C0853581F48AD0082F10E06F -:103E800087D090E0982F8827802B912B880F991F3F -:103E900090930102809300026FC0863529F484E07C -:103EA00095D080E06DD069C0843609F03FC078D0ED -:103EB000E0910002F091010283E087BFE895C0E045 -:103EC000D1E066D0899380910202815080930202F2 -:103ED0008823B9F775D007B600FCFDCF40910002EA -:103EE00050910102A0E0B1E02C9130E011968C914C -:103EF000119790E0982F8827822B932B1296FA0126 -:103F00000C01D7BEE89511244E5F5F4FF1E0A03859 -:103F1000BF0751F7E0910002F0910102F7BEE8956A -:103F200007B600FCFDCFE7BEE89527C08437B9F49B -:103F300037D046D0E0910002F09101023196F09323 -:103F40000102E09300023197E4918E2F19D0809105 -:103F50000202815080930202882361F70EC08537E8 -:103F600039F42ED08EE10CD084E90AD086E09ACFC5 -:103F7000813511F488E019D023D080E101D06BCFD6 -:103F8000982F8091C00085FFFCCF9093C6000895C4 -:103F9000A8958091C00087FFFCCF8091C60008954E -:103FA000F7DFF6DF80930202F3CFE0E6F0E098E17E -:103FB00090838083089580E0F8DFEE27FF2709943F -:103FC000E7DF803209F0F7DF84E1DACF1F93182FA3 -:0C3FD000DFDF1150E9F7F4DF1F910895C6 +:103E700085E0BBD091C0853581F499D0082F10E042 +:103E800096D090E0982F8827802B912B880F991F30 +:103E900090930102809300027EC0863529F484E06D +:103EA000A4D080E07CD078C0843609F04EC087D0A2 +:103EB000E0910002F091010288E3E030F80718F485 +:103EC00083E087BFE895C0E0D1E071D0899380910D +:103ED00002028150809302028823B9F7E091000228 +:103EE000F091010288E3E030F80718F083E087BF23 +:103EF000E89575D007B600FCFDCF409100025091C7 +:103F00000102A0E0B1E02C9130E011968C91119764 +:103F100090E0982F8827822B932B1296FA010C01A0 +:103F2000D7BEE89511244E5F5F4FF1E0A038BF0780 +:103F300051F7E0910002F0910102E7BEE89507B663 +:103F400000FCFDCFF7BEE89527C08437B9F437D021 +:103F500046D0E0910002F09101023196F093010207 +:103F6000E09300023197E4918E2F19D080910202E4 +:103F7000815080930202882361F70EC0853739F49F +:103F80002ED08EE10CD084E90AD086E08BCF81352B +:103F900011F488E019D023D080E101D05CCF982FB4 +:103FA0008091C00085FFFCCF9093C6000895A8952E +:103FB0008091C00087FFFCCF8091C6000895F7DF95 +:103FC000F6DF80930202F3CFE0E6F0E098E1908321 +:103FD0008083089580E0F8DFEE27FF270994E7DF6C +:103FE000803209F0F7DF84E1DACF1F93182FDFDF8B +:0A3FF0001150E9F7F4DF1F91089566 :0400000300003E00BB :00000001FF diff --git a/optiboot/bootloaders/optiboot/optiboot_pro_20mhz.lst b/optiboot/bootloaders/optiboot/optiboot_pro_20mhz.lst index a7f81c6..19fee60 100644 --- a/optiboot/bootloaders/optiboot/optiboot_pro_20mhz.lst +++ b/optiboot/bootloaders/optiboot/optiboot_pro_20mhz.lst @@ -3,25 +3,25 @@ optiboot_pro_20mhz.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn - 0 .text 000001dc 00003e00 00003e00 00000054 2**1 + 0 .text 000001fa 00003e00 00003e00 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .debug_aranges 00000028 00000000 00000000 00000230 2**0 + 1 .debug_aranges 00000028 00000000 00000000 0000024e 2**0 CONTENTS, READONLY, DEBUGGING - 2 .debug_pubnames 0000006a 00000000 00000000 00000258 2**0 + 2 .debug_pubnames 0000006a 00000000 00000000 00000276 2**0 CONTENTS, READONLY, DEBUGGING - 3 .debug_info 00000283 00000000 00000000 000002c2 2**0 + 3 .debug_info 00000284 00000000 00000000 000002e0 2**0 CONTENTS, READONLY, DEBUGGING - 4 .debug_abbrev 000001ae 00000000 00000000 00000545 2**0 + 4 .debug_abbrev 000001ae 00000000 00000000 00000564 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_line 000003db 00000000 00000000 000006f3 2**0 + 5 .debug_line 000003e3 00000000 00000000 00000712 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_frame 00000090 00000000 00000000 00000ad0 2**2 + 6 .debug_frame 00000090 00000000 00000000 00000af8 2**2 CONTENTS, READONLY, DEBUGGING - 7 .debug_str 00000140 00000000 00000000 00000b60 2**0 + 7 .debug_str 00000140 00000000 00000000 00000b88 2**0 CONTENTS, READONLY, DEBUGGING - 8 .debug_loc 000001d1 00000000 00000000 00000ca0 2**0 + 8 .debug_loc 000001e1 00000000 00000000 00000cc8 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_ranges 00000068 00000000 00000000 00000e71 2**0 + 9 .debug_ranges 00000068 00000000 00000000 00000ea9 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: @@ -61,12 +61,12 @@ int main(void) { 3e20: 14 be out 0x34, r1 ; 52 if (!(ch & _BV(EXTRF))) appStart(); 3e22: 81 ff sbrs r24, 1 - 3e24: c8 d0 rcall .+400 ; 0x3fb6 + 3e24: d7 d0 rcall .+430 ; 0x3fd4 // Set up watchdog to trigger after 500ms watchdogConfig(WATCHDOG_500MS); 3e26: 8d e0 ldi r24, 0x0D ; 13 - 3e28: c0 d0 rcall .+384 ; 0x3faa + 3e28: cf d0 rcall .+414 ; 0x3fc8 /* Set LED pin as output */ LED_DDR |= _BV(LED); @@ -127,21 +127,21 @@ void watchdogReset() { // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); 3e4e: a5 e0 ldi r26, 0x05 ; 5 - 3e50: fa 2e mov r15, r26 + 3e50: ea 2e mov r14, r26 boot_spm_busy_wait(); #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); 3e52: f1 e1 ldi r31, 0x11 ; 17 - 3e54: ef 2e mov r14, r31 + 3e54: ff 2e mov r15, r31 #endif /* Forever loop */ for (;;) { /* get character from UART */ ch = getch(); - 3e56: 9c d0 rcall .+312 ; 0x3f90 + 3e56: ab d0 rcall .+342 ; 0x3fae if(ch == STK_GET_PARAMETER) { 3e58: 81 34 cpi r24, 0x41 ; 65 @@ -149,7 +149,7 @@ void watchdogReset() { // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy getNch(1); 3e5c: 81 e0 ldi r24, 0x01 ; 1 - 3e5e: b6 d0 rcall .+364 ; 0x3fcc + 3e5e: c5 d0 rcall .+394 ; 0x3fea putch(0x03); 3e60: 83 e0 ldi r24, 0x03 ; 3 3e62: 20 c0 rjmp .+64 ; 0x3ea4 @@ -168,8 +168,8 @@ void watchdogReset() { // SET DEVICE EXT is ignored getNch(5); 3e70: 85 e0 ldi r24, 0x05 ; 5 - 3e72: ac d0 rcall .+344 ; 0x3fcc - 3e74: 82 c0 rjmp .+260 ; 0x3f7a + 3e72: bb d0 rcall .+374 ; 0x3fea + 3e74: 91 c0 rjmp .+290 ; 0x3f98 } else if(ch == STK_LOAD_ADDRESS) { 3e76: 85 35 cpi r24, 0x55 ; 85 @@ -177,11 +177,11 @@ void watchdogReset() { // LOAD ADDRESS uint16_t newAddress; newAddress = getch(); - 3e7a: 8a d0 rcall .+276 ; 0x3f90 + 3e7a: 99 d0 rcall .+306 ; 0x3fae newAddress = (newAddress & 0xff) | (getch() << 8); 3e7c: 08 2f mov r16, r24 3e7e: 10 e0 ldi r17, 0x00 ; 0 - 3e80: 87 d0 rcall .+270 ; 0x3f90 + 3e80: 96 d0 rcall .+300 ; 0x3fae 3e82: 90 e0 ldi r25, 0x00 ; 0 3e84: 98 2f mov r25, r24 3e86: 88 27 eor r24, r24 @@ -197,7 +197,7 @@ void watchdogReset() { address = newAddress; 3e90: 90 93 01 02 sts 0x0201, r25 3e94: 80 93 00 02 sts 0x0200, r24 - 3e98: 6f c0 rjmp .+222 ; 0x3f78 + 3e98: 7e c0 rjmp .+252 ; 0x3f96 verifySpace(); } else if(ch == STK_UNIVERSAL) { @@ -206,320 +206,337 @@ void watchdogReset() { // UNIVERSAL command is ignored getNch(4); 3e9e: 84 e0 ldi r24, 0x04 ; 4 - 3ea0: 95 d0 rcall .+298 ; 0x3fcc + 3ea0: a4 d0 rcall .+328 ; 0x3fea putch(0x00); 3ea2: 80 e0 ldi r24, 0x00 ; 0 - 3ea4: 6d d0 rcall .+218 ; 0x3f80 - 3ea6: 69 c0 rjmp .+210 ; 0x3f7a + 3ea4: 7c d0 rcall .+248 ; 0x3f9e + 3ea6: 78 c0 rjmp .+240 ; 0x3f98 } /* Write memory, length is big endian and is in bytes */ else if(ch == STK_PROG_PAGE) { 3ea8: 84 36 cpi r24, 0x64 ; 100 3eaa: 09 f0 breq .+2 ; 0x3eae - 3eac: 3f c0 rjmp .+126 ; 0x3f2c + 3eac: 4e c0 rjmp .+156 ; 0x3f4a // PROGRAM PAGE - we support flash programming only, not EEPROM uint8_t *bufPtr; uint16_t addrPtr; getLen(); - 3eae: 78 d0 rcall .+240 ; 0x3fa0 + 3eae: 87 d0 rcall .+270 ; 0x3fbe - // Immediately start page erase - this will 4.5ms - __boot_page_erase_short((uint16_t)(void*)address); + // If we are in RWW section, immediately start page erase + if (address < NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); 3eb0: e0 91 00 02 lds r30, 0x0200 3eb4: f0 91 01 02 lds r31, 0x0201 - 3eb8: 83 e0 ldi r24, 0x03 ; 3 - 3eba: 87 bf out 0x37, r24 ; 55 - 3ebc: e8 95 spm - 3ebe: c0 e0 ldi r28, 0x00 ; 0 - 3ec0: d1 e0 ldi r29, 0x01 ; 1 + 3eb8: 88 e3 ldi r24, 0x38 ; 56 + 3eba: e0 30 cpi r30, 0x00 ; 0 + 3ebc: f8 07 cpc r31, r24 + 3ebe: 18 f4 brcc .+6 ; 0x3ec6 + 3ec0: 83 e0 ldi r24, 0x03 ; 3 + 3ec2: 87 bf out 0x37, r24 ; 55 + 3ec4: e8 95 spm + 3ec6: c0 e0 ldi r28, 0x00 ; 0 + 3ec8: d1 e0 ldi r29, 0x01 ; 1 // While that is going on, read in page contents bufPtr = buff; do *bufPtr++ = getch(); - 3ec2: 66 d0 rcall .+204 ; 0x3f90 - 3ec4: 89 93 st Y+, r24 + 3eca: 71 d0 rcall .+226 ; 0x3fae + 3ecc: 89 93 st Y+, r24 while (--length); - 3ec6: 80 91 02 02 lds r24, 0x0202 - 3eca: 81 50 subi r24, 0x01 ; 1 - 3ecc: 80 93 02 02 sts 0x0202, r24 - 3ed0: 88 23 and r24, r24 - 3ed2: b9 f7 brne .-18 ; 0x3ec2 + 3ece: 80 91 02 02 lds r24, 0x0202 + 3ed2: 81 50 subi r24, 0x01 ; 1 + 3ed4: 80 93 02 02 sts 0x0202, r24 + 3ed8: 88 23 and r24, r24 + 3eda: b9 f7 brne .-18 ; 0x3eca + + // If we are in NRWW section, page erase has to be delayed until now. + // Todo: Take RAMPZ into account + if (address >= NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); + 3edc: e0 91 00 02 lds r30, 0x0200 + 3ee0: f0 91 01 02 lds r31, 0x0201 + 3ee4: 88 e3 ldi r24, 0x38 ; 56 + 3ee6: e0 30 cpi r30, 0x00 ; 0 + 3ee8: f8 07 cpc r31, r24 + 3eea: 18 f0 brcs .+6 ; 0x3ef2 + 3eec: 83 e0 ldi r24, 0x03 ; 3 + 3eee: 87 bf out 0x37, r24 ; 55 + 3ef0: e8 95 spm // Read command terminator, start reply verifySpace(); - 3ed4: 75 d0 rcall .+234 ; 0x3fc0 + 3ef2: 75 d0 rcall .+234 ; 0x3fde // If only a partial page is to be programmed, the erase might not be complete. // So check that here boot_spm_busy_wait(); - 3ed6: 07 b6 in r0, 0x37 ; 55 - 3ed8: 00 fc sbrc r0, 0 - 3eda: fd cf rjmp .-6 ; 0x3ed6 + 3ef4: 07 b6 in r0, 0x37 ; 55 + 3ef6: 00 fc sbrc r0, 0 + 3ef8: fd cf rjmp .-6 ; 0x3ef4 } #endif // Copy buffer into programming buffer bufPtr = buff; addrPtr = (uint16_t)(void*)address; - 3edc: 40 91 00 02 lds r20, 0x0200 - 3ee0: 50 91 01 02 lds r21, 0x0201 - 3ee4: a0 e0 ldi r26, 0x00 ; 0 - 3ee6: b1 e0 ldi r27, 0x01 ; 1 + 3efa: 40 91 00 02 lds r20, 0x0200 + 3efe: 50 91 01 02 lds r21, 0x0201 + 3f02: a0 e0 ldi r26, 0x00 ; 0 + 3f04: b1 e0 ldi r27, 0x01 ; 1 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; - 3ee8: 2c 91 ld r18, X - 3eea: 30 e0 ldi r19, 0x00 ; 0 + 3f06: 2c 91 ld r18, X + 3f08: 30 e0 ldi r19, 0x00 ; 0 a |= (*bufPtr++) << 8; - 3eec: 11 96 adiw r26, 0x01 ; 1 - 3eee: 8c 91 ld r24, X - 3ef0: 11 97 sbiw r26, 0x01 ; 1 - 3ef2: 90 e0 ldi r25, 0x00 ; 0 - 3ef4: 98 2f mov r25, r24 - 3ef6: 88 27 eor r24, r24 - 3ef8: 82 2b or r24, r18 - 3efa: 93 2b or r25, r19 + 3f0a: 11 96 adiw r26, 0x01 ; 1 + 3f0c: 8c 91 ld r24, X + 3f0e: 11 97 sbiw r26, 0x01 ; 1 + 3f10: 90 e0 ldi r25, 0x00 ; 0 + 3f12: 98 2f mov r25, r24 + 3f14: 88 27 eor r24, r24 + 3f16: 82 2b or r24, r18 + 3f18: 93 2b or r25, r19 #define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #endif /* main program starts here */ int main(void) { - 3efc: 12 96 adiw r26, 0x02 ; 2 + 3f1a: 12 96 adiw r26, 0x02 ; 2 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; a |= (*bufPtr++) << 8; __boot_page_fill_short((uint16_t)(void*)addrPtr,a); - 3efe: fa 01 movw r30, r20 - 3f00: 0c 01 movw r0, r24 - 3f02: d7 be out 0x37, r13 ; 55 - 3f04: e8 95 spm - 3f06: 11 24 eor r1, r1 + 3f1c: fa 01 movw r30, r20 + 3f1e: 0c 01 movw r0, r24 + 3f20: d7 be out 0x37, r13 ; 55 + 3f22: e8 95 spm + 3f24: 11 24 eor r1, r1 addrPtr += 2; - 3f08: 4e 5f subi r20, 0xFE ; 254 - 3f0a: 5f 4f sbci r21, 0xFF ; 255 + 3f26: 4e 5f subi r20, 0xFE ; 254 + 3f28: 5f 4f sbci r21, 0xFF ; 255 } while (--ch); - 3f0c: f1 e0 ldi r31, 0x01 ; 1 - 3f0e: a0 38 cpi r26, 0x80 ; 128 - 3f10: bf 07 cpc r27, r31 - 3f12: 51 f7 brne .-44 ; 0x3ee8 + 3f2a: f1 e0 ldi r31, 0x01 ; 1 + 3f2c: a0 38 cpi r26, 0x80 ; 128 + 3f2e: bf 07 cpc r27, r31 + 3f30: 51 f7 brne .-44 ; 0x3f06 // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); - 3f14: e0 91 00 02 lds r30, 0x0200 - 3f18: f0 91 01 02 lds r31, 0x0201 - 3f1c: f7 be out 0x37, r15 ; 55 - 3f1e: e8 95 spm + 3f32: e0 91 00 02 lds r30, 0x0200 + 3f36: f0 91 01 02 lds r31, 0x0201 + 3f3a: e7 be out 0x37, r14 ; 55 + 3f3c: e8 95 spm boot_spm_busy_wait(); - 3f20: 07 b6 in r0, 0x37 ; 55 - 3f22: 00 fc sbrc r0, 0 - 3f24: fd cf rjmp .-6 ; 0x3f20 + 3f3e: 07 b6 in r0, 0x37 ; 55 + 3f40: 00 fc sbrc r0, 0 + 3f42: fd cf rjmp .-6 ; 0x3f3e #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); - 3f26: e7 be out 0x37, r14 ; 55 - 3f28: e8 95 spm - 3f2a: 27 c0 rjmp .+78 ; 0x3f7a + 3f44: f7 be out 0x37, r15 ; 55 + 3f46: e8 95 spm + 3f48: 27 c0 rjmp .+78 ; 0x3f98 #endif } /* Read memory block mode, length is big endian. */ else if(ch == STK_READ_PAGE) { - 3f2c: 84 37 cpi r24, 0x74 ; 116 - 3f2e: b9 f4 brne .+46 ; 0x3f5e + 3f4a: 84 37 cpi r24, 0x74 ; 116 + 3f4c: b9 f4 brne .+46 ; 0x3f7c // READ PAGE - we only read flash getLen(); - 3f30: 37 d0 rcall .+110 ; 0x3fa0 + 3f4e: 37 d0 rcall .+110 ; 0x3fbe verifySpace(); - 3f32: 46 d0 rcall .+140 ; 0x3fc0 + 3f50: 46 d0 rcall .+140 ; 0x3fde putch(result); address++; } while (--length); #else do putch(pgm_read_byte_near(address++)); - 3f34: e0 91 00 02 lds r30, 0x0200 - 3f38: f0 91 01 02 lds r31, 0x0201 - 3f3c: 31 96 adiw r30, 0x01 ; 1 - 3f3e: f0 93 01 02 sts 0x0201, r31 - 3f42: e0 93 00 02 sts 0x0200, r30 - 3f46: 31 97 sbiw r30, 0x01 ; 1 - 3f48: e4 91 lpm r30, Z+ - 3f4a: 8e 2f mov r24, r30 - 3f4c: 19 d0 rcall .+50 ; 0x3f80 + 3f52: e0 91 00 02 lds r30, 0x0200 + 3f56: f0 91 01 02 lds r31, 0x0201 + 3f5a: 31 96 adiw r30, 0x01 ; 1 + 3f5c: f0 93 01 02 sts 0x0201, r31 + 3f60: e0 93 00 02 sts 0x0200, r30 + 3f64: 31 97 sbiw r30, 0x01 ; 1 + 3f66: e4 91 lpm r30, Z+ + 3f68: 8e 2f mov r24, r30 + 3f6a: 19 d0 rcall .+50 ; 0x3f9e while (--length); - 3f4e: 80 91 02 02 lds r24, 0x0202 - 3f52: 81 50 subi r24, 0x01 ; 1 - 3f54: 80 93 02 02 sts 0x0202, r24 - 3f58: 88 23 and r24, r24 - 3f5a: 61 f7 brne .-40 ; 0x3f34 - 3f5c: 0e c0 rjmp .+28 ; 0x3f7a + 3f6c: 80 91 02 02 lds r24, 0x0202 + 3f70: 81 50 subi r24, 0x01 ; 1 + 3f72: 80 93 02 02 sts 0x0202, r24 + 3f76: 88 23 and r24, r24 + 3f78: 61 f7 brne .-40 ; 0x3f52 + 3f7a: 0e c0 rjmp .+28 ; 0x3f98 #endif #endif } /* Get device signature bytes */ else if(ch == STK_READ_SIGN) { - 3f5e: 85 37 cpi r24, 0x75 ; 117 - 3f60: 39 f4 brne .+14 ; 0x3f70 + 3f7c: 85 37 cpi r24, 0x75 ; 117 + 3f7e: 39 f4 brne .+14 ; 0x3f8e // READ SIGN - return what Avrdude wants to hear verifySpace(); - 3f62: 2e d0 rcall .+92 ; 0x3fc0 + 3f80: 2e d0 rcall .+92 ; 0x3fde putch(SIGNATURE_0); - 3f64: 8e e1 ldi r24, 0x1E ; 30 - 3f66: 0c d0 rcall .+24 ; 0x3f80 + 3f82: 8e e1 ldi r24, 0x1E ; 30 + 3f84: 0c d0 rcall .+24 ; 0x3f9e putch(SIGNATURE_1); - 3f68: 84 e9 ldi r24, 0x94 ; 148 - 3f6a: 0a d0 rcall .+20 ; 0x3f80 + 3f86: 84 e9 ldi r24, 0x94 ; 148 + 3f88: 0a d0 rcall .+20 ; 0x3f9e putch(SIGNATURE_2); - 3f6c: 86 e0 ldi r24, 0x06 ; 6 - 3f6e: 9a cf rjmp .-204 ; 0x3ea4 + 3f8a: 86 e0 ldi r24, 0x06 ; 6 + 3f8c: 8b cf rjmp .-234 ; 0x3ea4 } else if (ch == 'Q') { - 3f70: 81 35 cpi r24, 0x51 ; 81 - 3f72: 11 f4 brne .+4 ; 0x3f78 + 3f8e: 81 35 cpi r24, 0x51 ; 81 + 3f90: 11 f4 brne .+4 ; 0x3f96 // Adaboot no-wait mod watchdogConfig(WATCHDOG_16MS); - 3f74: 88 e0 ldi r24, 0x08 ; 8 - 3f76: 19 d0 rcall .+50 ; 0x3faa + 3f92: 88 e0 ldi r24, 0x08 ; 8 + 3f94: 19 d0 rcall .+50 ; 0x3fc8 verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); - 3f78: 23 d0 rcall .+70 ; 0x3fc0 + 3f96: 23 d0 rcall .+70 ; 0x3fde } putch(STK_OK); - 3f7a: 80 e1 ldi r24, 0x10 ; 16 - 3f7c: 01 d0 rcall .+2 ; 0x3f80 - 3f7e: 6b cf rjmp .-298 ; 0x3e56 + 3f98: 80 e1 ldi r24, 0x10 ; 16 + 3f9a: 01 d0 rcall .+2 ; 0x3f9e + 3f9c: 5c cf rjmp .-328 ; 0x3e56 -00003f80 : +00003f9e : } } void putch(char ch) { - 3f80: 98 2f mov r25, r24 + 3f9e: 98 2f mov r25, r24 #ifndef SOFT_UART while (!(UCSR0A & _BV(UDRE0))); - 3f82: 80 91 c0 00 lds r24, 0x00C0 - 3f86: 85 ff sbrs r24, 5 - 3f88: fc cf rjmp .-8 ; 0x3f82 + 3fa0: 80 91 c0 00 lds r24, 0x00C0 + 3fa4: 85 ff sbrs r24, 5 + 3fa6: fc cf rjmp .-8 ; 0x3fa0 UDR0 = ch; - 3f8a: 90 93 c6 00 sts 0x00C6, r25 + 3fa8: 90 93 c6 00 sts 0x00C6, r25 [uartBit] "I" (UART_TX_BIT) : "r25" ); #endif } - 3f8e: 08 95 ret + 3fac: 08 95 ret -00003f90 : +00003fae : return getch(); } // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( - 3f90: a8 95 wdr + 3fae: a8 95 wdr [uartBit] "I" (UART_RX_BIT) : "r25" ); #else while(!(UCSR0A & _BV(RXC0))); - 3f92: 80 91 c0 00 lds r24, 0x00C0 - 3f96: 87 ff sbrs r24, 7 - 3f98: fc cf rjmp .-8 ; 0x3f92 + 3fb0: 80 91 c0 00 lds r24, 0x00C0 + 3fb4: 87 ff sbrs r24, 7 + 3fb6: fc cf rjmp .-8 ; 0x3fb0 ch = UDR0; - 3f9a: 80 91 c6 00 lds r24, 0x00C6 + 3fb8: 80 91 c6 00 lds r24, 0x00C6 #ifdef LED_DATA_FLASH LED_PIN |= _BV(LED); #endif return ch; } - 3f9e: 08 95 ret + 3fbc: 08 95 ret -00003fa0 : +00003fbe : } while (--count); } #endif uint8_t getLen() { getch(); - 3fa0: f7 df rcall .-18 ; 0x3f90 + 3fbe: f7 df rcall .-18 ; 0x3fae length = getch(); - 3fa2: f6 df rcall .-20 ; 0x3f90 - 3fa4: 80 93 02 02 sts 0x0202, r24 + 3fc0: f6 df rcall .-20 ; 0x3fae + 3fc2: 80 93 02 02 sts 0x0202, r24 return getch(); } - 3fa8: f3 cf rjmp .-26 ; 0x3f90 + 3fc6: f3 cf rjmp .-26 ; 0x3fae -00003faa : +00003fc8 : "wdr\n" ); } void watchdogConfig(uint8_t x) { WDTCSR = _BV(WDCE) | _BV(WDE); - 3faa: e0 e6 ldi r30, 0x60 ; 96 - 3fac: f0 e0 ldi r31, 0x00 ; 0 - 3fae: 98 e1 ldi r25, 0x18 ; 24 - 3fb0: 90 83 st Z, r25 + 3fc8: e0 e6 ldi r30, 0x60 ; 96 + 3fca: f0 e0 ldi r31, 0x00 ; 0 + 3fcc: 98 e1 ldi r25, 0x18 ; 24 + 3fce: 90 83 st Z, r25 WDTCSR = x; - 3fb2: 80 83 st Z, r24 + 3fd0: 80 83 st Z, r24 } - 3fb4: 08 95 ret + 3fd2: 08 95 ret -00003fb6 : +00003fd4 : void appStart() { watchdogConfig(WATCHDOG_OFF); - 3fb6: 80 e0 ldi r24, 0x00 ; 0 - 3fb8: f8 df rcall .-16 ; 0x3faa + 3fd4: 80 e0 ldi r24, 0x00 ; 0 + 3fd6: f8 df rcall .-16 ; 0x3fc8 __asm__ __volatile__ ( - 3fba: ee 27 eor r30, r30 - 3fbc: ff 27 eor r31, r31 - 3fbe: 09 94 ijmp + 3fd8: ee 27 eor r30, r30 + 3fda: ff 27 eor r31, r31 + 3fdc: 09 94 ijmp -00003fc0 : +00003fde : do getch(); while (--count); verifySpace(); } void verifySpace() { if (getch() != CRC_EOP) appStart(); - 3fc0: e7 df rcall .-50 ; 0x3f90 - 3fc2: 80 32 cpi r24, 0x20 ; 32 - 3fc4: 09 f0 breq .+2 ; 0x3fc8 - 3fc6: f7 df rcall .-18 ; 0x3fb6 + 3fde: e7 df rcall .-50 ; 0x3fae + 3fe0: 80 32 cpi r24, 0x20 ; 32 + 3fe2: 09 f0 breq .+2 ; 0x3fe6 + 3fe4: f7 df rcall .-18 ; 0x3fd4 putch(STK_INSYNC); - 3fc8: 84 e1 ldi r24, 0x14 ; 20 + 3fe6: 84 e1 ldi r24, 0x14 ; 20 } - 3fca: da cf rjmp .-76 ; 0x3f80 + 3fe8: da cf rjmp .-76 ; 0x3f9e ::[count] "M" (UART_B_VALUE) ); } #endif void getNch(uint8_t count) { - 3fcc: 1f 93 push r17 - 3fce: 18 2f mov r17, r24 + 3fea: 1f 93 push r17 + 3fec: 18 2f mov r17, r24 -00003fd0 : +00003fee : do getch(); while (--count); - 3fd0: df df rcall .-66 ; 0x3f90 - 3fd2: 11 50 subi r17, 0x01 ; 1 - 3fd4: e9 f7 brne .-6 ; 0x3fd0 + 3fee: df df rcall .-66 ; 0x3fae + 3ff0: 11 50 subi r17, 0x01 ; 1 + 3ff2: e9 f7 brne .-6 ; 0x3fee verifySpace(); - 3fd6: f4 df rcall .-24 ; 0x3fc0 + 3ff4: f4 df rcall .-24 ; 0x3fde } - 3fd8: 1f 91 pop r17 - 3fda: 08 95 ret + 3ff6: 1f 91 pop r17 + 3ff8: 08 95 ret diff --git a/optiboot/bootloaders/optiboot/optiboot_pro_8MHz.hex b/optiboot/bootloaders/optiboot/optiboot_pro_8MHz.hex index 6fc5c98..4053242 100644 --- a/optiboot/bootloaders/optiboot/optiboot_pro_8MHz.hex +++ b/optiboot/bootloaders/optiboot/optiboot_pro_8MHz.hex @@ -1,32 +1,34 @@ :103E000085E08093810082E08093C00088E1809308 :103E1000C10086E08093C20088E08093C40084B72C -:103E200014BE81FFC8D08DE0C0D0259A86E028E17D +:103E200014BE81FFD7D08DE0CFD0259A86E028E15F :103E30003EEF91E0309385002093840096BBB09BC9 :103E4000FECF1D9AA8958150A9F7DD24D394A5E053 -:103E5000FA2EF1E1EF2E9CD0813421F481E0B6D02E +:103E5000EA2EF1E1FF2EABD0813421F481E0C5D010 :103E600083E020C0823411F484E103C0853419F466 -:103E700085E0ACD082C0853581F48AD0082F10E06F -:103E800087D090E0982F8827802B912B880F991F3F -:103E900090930102809300026FC0863529F484E07C -:103EA00095D080E06DD069C0843609F03FC078D0ED -:103EB000E0910002F091010283E087BFE895C0E045 -:103EC000D1E066D0899380910202815080930202F2 -:103ED0008823B9F775D007B600FCFDCF40910002EA -:103EE00050910102A0E0B1E02C9130E011968C914C -:103EF000119790E0982F8827822B932B1296FA0126 -:103F00000C01D7BEE89511244E5F5F4FF1E0A03859 -:103F1000BF0751F7E0910002F0910102F7BEE8956A -:103F200007B600FCFDCFE7BEE89527C08437B9F49B -:103F300037D046D0E0910002F09101023196F09323 -:103F40000102E09300023197E4918E2F19D0809105 -:103F50000202815080930202882361F70EC08537E8 -:103F600039F42ED08EE10CD084E90AD086E09ACFC5 -:103F7000813511F488E019D023D080E101D06BCFD6 -:103F8000982F8091C00085FFFCCF9093C6000895C4 -:103F9000A8958091C00087FFFCCF8091C60008954E -:103FA000F7DFF6DF80930202F3CFE0E6F0E098E17E -:103FB00090838083089580E0F8DFEE27FF2709943F -:103FC000E7DF803209F0F7DF84E1DACF1F93182FA3 -:0C3FD000DFDF1150E9F7F4DF1F910895C6 +:103E700085E0BBD091C0853581F499D0082F10E042 +:103E800096D090E0982F8827802B912B880F991F30 +:103E900090930102809300027EC0863529F484E06D +:103EA000A4D080E07CD078C0843609F04EC087D0A2 +:103EB000E0910002F091010288E3E030F80718F485 +:103EC00083E087BFE895C0E0D1E071D0899380910D +:103ED00002028150809302028823B9F7E091000228 +:103EE000F091010288E3E030F80718F083E087BF23 +:103EF000E89575D007B600FCFDCF409100025091C7 +:103F00000102A0E0B1E02C9130E011968C91119764 +:103F100090E0982F8827822B932B1296FA010C01A0 +:103F2000D7BEE89511244E5F5F4FF1E0A038BF0780 +:103F300051F7E0910002F0910102E7BEE89507B663 +:103F400000FCFDCFF7BEE89527C08437B9F437D021 +:103F500046D0E0910002F09101023196F093010207 +:103F6000E09300023197E4918E2F19D080910202E4 +:103F7000815080930202882361F70EC0853739F49F +:103F80002ED08EE10CD084E90AD086E08BCF81352B +:103F900011F488E019D023D080E101D05CCF982FB4 +:103FA0008091C00085FFFCCF9093C6000895A8952E +:103FB0008091C00087FFFCCF8091C6000895F7DF95 +:103FC000F6DF80930202F3CFE0E6F0E098E1908321 +:103FD0008083089580E0F8DFEE27FF270994E7DF6C +:103FE000803209F0F7DF84E1DACF1F93182FDFDF8B +:0A3FF0001150E9F7F4DF1F91089566 :0400000300003E00BB :00000001FF diff --git a/optiboot/bootloaders/optiboot/optiboot_pro_8MHz.lst b/optiboot/bootloaders/optiboot/optiboot_pro_8MHz.lst index f40ffff..5ff46e5 100644 --- a/optiboot/bootloaders/optiboot/optiboot_pro_8MHz.lst +++ b/optiboot/bootloaders/optiboot/optiboot_pro_8MHz.lst @@ -3,25 +3,25 @@ optiboot_pro_8MHz.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn - 0 .text 000001dc 00003e00 00003e00 00000054 2**1 + 0 .text 000001fa 00003e00 00003e00 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .debug_aranges 00000028 00000000 00000000 00000230 2**0 + 1 .debug_aranges 00000028 00000000 00000000 0000024e 2**0 CONTENTS, READONLY, DEBUGGING - 2 .debug_pubnames 0000006a 00000000 00000000 00000258 2**0 + 2 .debug_pubnames 0000006a 00000000 00000000 00000276 2**0 CONTENTS, READONLY, DEBUGGING - 3 .debug_info 00000283 00000000 00000000 000002c2 2**0 + 3 .debug_info 00000284 00000000 00000000 000002e0 2**0 CONTENTS, READONLY, DEBUGGING - 4 .debug_abbrev 000001ae 00000000 00000000 00000545 2**0 + 4 .debug_abbrev 000001ae 00000000 00000000 00000564 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_line 000003db 00000000 00000000 000006f3 2**0 + 5 .debug_line 000003e3 00000000 00000000 00000712 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_frame 00000090 00000000 00000000 00000ad0 2**2 + 6 .debug_frame 00000090 00000000 00000000 00000af8 2**2 CONTENTS, READONLY, DEBUGGING - 7 .debug_str 00000140 00000000 00000000 00000b60 2**0 + 7 .debug_str 00000140 00000000 00000000 00000b88 2**0 CONTENTS, READONLY, DEBUGGING - 8 .debug_loc 000001d1 00000000 00000000 00000ca0 2**0 + 8 .debug_loc 000001e1 00000000 00000000 00000cc8 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_ranges 00000068 00000000 00000000 00000e71 2**0 + 9 .debug_ranges 00000068 00000000 00000000 00000ea9 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: @@ -61,12 +61,12 @@ int main(void) { 3e20: 14 be out 0x34, r1 ; 52 if (!(ch & _BV(EXTRF))) appStart(); 3e22: 81 ff sbrs r24, 1 - 3e24: c8 d0 rcall .+400 ; 0x3fb6 + 3e24: d7 d0 rcall .+430 ; 0x3fd4 // Set up watchdog to trigger after 500ms watchdogConfig(WATCHDOG_500MS); 3e26: 8d e0 ldi r24, 0x0D ; 13 - 3e28: c0 d0 rcall .+384 ; 0x3faa + 3e28: cf d0 rcall .+414 ; 0x3fc8 /* Set LED pin as output */ LED_DDR |= _BV(LED); @@ -127,21 +127,21 @@ void watchdogReset() { // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); 3e4e: a5 e0 ldi r26, 0x05 ; 5 - 3e50: fa 2e mov r15, r26 + 3e50: ea 2e mov r14, r26 boot_spm_busy_wait(); #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); 3e52: f1 e1 ldi r31, 0x11 ; 17 - 3e54: ef 2e mov r14, r31 + 3e54: ff 2e mov r15, r31 #endif /* Forever loop */ for (;;) { /* get character from UART */ ch = getch(); - 3e56: 9c d0 rcall .+312 ; 0x3f90 + 3e56: ab d0 rcall .+342 ; 0x3fae if(ch == STK_GET_PARAMETER) { 3e58: 81 34 cpi r24, 0x41 ; 65 @@ -149,7 +149,7 @@ void watchdogReset() { // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy getNch(1); 3e5c: 81 e0 ldi r24, 0x01 ; 1 - 3e5e: b6 d0 rcall .+364 ; 0x3fcc + 3e5e: c5 d0 rcall .+394 ; 0x3fea putch(0x03); 3e60: 83 e0 ldi r24, 0x03 ; 3 3e62: 20 c0 rjmp .+64 ; 0x3ea4 @@ -168,8 +168,8 @@ void watchdogReset() { // SET DEVICE EXT is ignored getNch(5); 3e70: 85 e0 ldi r24, 0x05 ; 5 - 3e72: ac d0 rcall .+344 ; 0x3fcc - 3e74: 82 c0 rjmp .+260 ; 0x3f7a + 3e72: bb d0 rcall .+374 ; 0x3fea + 3e74: 91 c0 rjmp .+290 ; 0x3f98 } else if(ch == STK_LOAD_ADDRESS) { 3e76: 85 35 cpi r24, 0x55 ; 85 @@ -177,11 +177,11 @@ void watchdogReset() { // LOAD ADDRESS uint16_t newAddress; newAddress = getch(); - 3e7a: 8a d0 rcall .+276 ; 0x3f90 + 3e7a: 99 d0 rcall .+306 ; 0x3fae newAddress = (newAddress & 0xff) | (getch() << 8); 3e7c: 08 2f mov r16, r24 3e7e: 10 e0 ldi r17, 0x00 ; 0 - 3e80: 87 d0 rcall .+270 ; 0x3f90 + 3e80: 96 d0 rcall .+300 ; 0x3fae 3e82: 90 e0 ldi r25, 0x00 ; 0 3e84: 98 2f mov r25, r24 3e86: 88 27 eor r24, r24 @@ -197,7 +197,7 @@ void watchdogReset() { address = newAddress; 3e90: 90 93 01 02 sts 0x0201, r25 3e94: 80 93 00 02 sts 0x0200, r24 - 3e98: 6f c0 rjmp .+222 ; 0x3f78 + 3e98: 7e c0 rjmp .+252 ; 0x3f96 verifySpace(); } else if(ch == STK_UNIVERSAL) { @@ -206,320 +206,337 @@ void watchdogReset() { // UNIVERSAL command is ignored getNch(4); 3e9e: 84 e0 ldi r24, 0x04 ; 4 - 3ea0: 95 d0 rcall .+298 ; 0x3fcc + 3ea0: a4 d0 rcall .+328 ; 0x3fea putch(0x00); 3ea2: 80 e0 ldi r24, 0x00 ; 0 - 3ea4: 6d d0 rcall .+218 ; 0x3f80 - 3ea6: 69 c0 rjmp .+210 ; 0x3f7a + 3ea4: 7c d0 rcall .+248 ; 0x3f9e + 3ea6: 78 c0 rjmp .+240 ; 0x3f98 } /* Write memory, length is big endian and is in bytes */ else if(ch == STK_PROG_PAGE) { 3ea8: 84 36 cpi r24, 0x64 ; 100 3eaa: 09 f0 breq .+2 ; 0x3eae - 3eac: 3f c0 rjmp .+126 ; 0x3f2c + 3eac: 4e c0 rjmp .+156 ; 0x3f4a // PROGRAM PAGE - we support flash programming only, not EEPROM uint8_t *bufPtr; uint16_t addrPtr; getLen(); - 3eae: 78 d0 rcall .+240 ; 0x3fa0 + 3eae: 87 d0 rcall .+270 ; 0x3fbe - // Immediately start page erase - this will 4.5ms - __boot_page_erase_short((uint16_t)(void*)address); + // If we are in RWW section, immediately start page erase + if (address < NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); 3eb0: e0 91 00 02 lds r30, 0x0200 3eb4: f0 91 01 02 lds r31, 0x0201 - 3eb8: 83 e0 ldi r24, 0x03 ; 3 - 3eba: 87 bf out 0x37, r24 ; 55 - 3ebc: e8 95 spm - 3ebe: c0 e0 ldi r28, 0x00 ; 0 - 3ec0: d1 e0 ldi r29, 0x01 ; 1 + 3eb8: 88 e3 ldi r24, 0x38 ; 56 + 3eba: e0 30 cpi r30, 0x00 ; 0 + 3ebc: f8 07 cpc r31, r24 + 3ebe: 18 f4 brcc .+6 ; 0x3ec6 + 3ec0: 83 e0 ldi r24, 0x03 ; 3 + 3ec2: 87 bf out 0x37, r24 ; 55 + 3ec4: e8 95 spm + 3ec6: c0 e0 ldi r28, 0x00 ; 0 + 3ec8: d1 e0 ldi r29, 0x01 ; 1 // While that is going on, read in page contents bufPtr = buff; do *bufPtr++ = getch(); - 3ec2: 66 d0 rcall .+204 ; 0x3f90 - 3ec4: 89 93 st Y+, r24 + 3eca: 71 d0 rcall .+226 ; 0x3fae + 3ecc: 89 93 st Y+, r24 while (--length); - 3ec6: 80 91 02 02 lds r24, 0x0202 - 3eca: 81 50 subi r24, 0x01 ; 1 - 3ecc: 80 93 02 02 sts 0x0202, r24 - 3ed0: 88 23 and r24, r24 - 3ed2: b9 f7 brne .-18 ; 0x3ec2 + 3ece: 80 91 02 02 lds r24, 0x0202 + 3ed2: 81 50 subi r24, 0x01 ; 1 + 3ed4: 80 93 02 02 sts 0x0202, r24 + 3ed8: 88 23 and r24, r24 + 3eda: b9 f7 brne .-18 ; 0x3eca + + // If we are in NRWW section, page erase has to be delayed until now. + // Todo: Take RAMPZ into account + if (address >= NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); + 3edc: e0 91 00 02 lds r30, 0x0200 + 3ee0: f0 91 01 02 lds r31, 0x0201 + 3ee4: 88 e3 ldi r24, 0x38 ; 56 + 3ee6: e0 30 cpi r30, 0x00 ; 0 + 3ee8: f8 07 cpc r31, r24 + 3eea: 18 f0 brcs .+6 ; 0x3ef2 + 3eec: 83 e0 ldi r24, 0x03 ; 3 + 3eee: 87 bf out 0x37, r24 ; 55 + 3ef0: e8 95 spm // Read command terminator, start reply verifySpace(); - 3ed4: 75 d0 rcall .+234 ; 0x3fc0 + 3ef2: 75 d0 rcall .+234 ; 0x3fde // If only a partial page is to be programmed, the erase might not be complete. // So check that here boot_spm_busy_wait(); - 3ed6: 07 b6 in r0, 0x37 ; 55 - 3ed8: 00 fc sbrc r0, 0 - 3eda: fd cf rjmp .-6 ; 0x3ed6 + 3ef4: 07 b6 in r0, 0x37 ; 55 + 3ef6: 00 fc sbrc r0, 0 + 3ef8: fd cf rjmp .-6 ; 0x3ef4 } #endif // Copy buffer into programming buffer bufPtr = buff; addrPtr = (uint16_t)(void*)address; - 3edc: 40 91 00 02 lds r20, 0x0200 - 3ee0: 50 91 01 02 lds r21, 0x0201 - 3ee4: a0 e0 ldi r26, 0x00 ; 0 - 3ee6: b1 e0 ldi r27, 0x01 ; 1 + 3efa: 40 91 00 02 lds r20, 0x0200 + 3efe: 50 91 01 02 lds r21, 0x0201 + 3f02: a0 e0 ldi r26, 0x00 ; 0 + 3f04: b1 e0 ldi r27, 0x01 ; 1 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; - 3ee8: 2c 91 ld r18, X - 3eea: 30 e0 ldi r19, 0x00 ; 0 + 3f06: 2c 91 ld r18, X + 3f08: 30 e0 ldi r19, 0x00 ; 0 a |= (*bufPtr++) << 8; - 3eec: 11 96 adiw r26, 0x01 ; 1 - 3eee: 8c 91 ld r24, X - 3ef0: 11 97 sbiw r26, 0x01 ; 1 - 3ef2: 90 e0 ldi r25, 0x00 ; 0 - 3ef4: 98 2f mov r25, r24 - 3ef6: 88 27 eor r24, r24 - 3ef8: 82 2b or r24, r18 - 3efa: 93 2b or r25, r19 + 3f0a: 11 96 adiw r26, 0x01 ; 1 + 3f0c: 8c 91 ld r24, X + 3f0e: 11 97 sbiw r26, 0x01 ; 1 + 3f10: 90 e0 ldi r25, 0x00 ; 0 + 3f12: 98 2f mov r25, r24 + 3f14: 88 27 eor r24, r24 + 3f16: 82 2b or r24, r18 + 3f18: 93 2b or r25, r19 #define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #endif /* main program starts here */ int main(void) { - 3efc: 12 96 adiw r26, 0x02 ; 2 + 3f1a: 12 96 adiw r26, 0x02 ; 2 ch = SPM_PAGESIZE / 2; do { uint16_t a; a = *bufPtr++; a |= (*bufPtr++) << 8; __boot_page_fill_short((uint16_t)(void*)addrPtr,a); - 3efe: fa 01 movw r30, r20 - 3f00: 0c 01 movw r0, r24 - 3f02: d7 be out 0x37, r13 ; 55 - 3f04: e8 95 spm - 3f06: 11 24 eor r1, r1 + 3f1c: fa 01 movw r30, r20 + 3f1e: 0c 01 movw r0, r24 + 3f20: d7 be out 0x37, r13 ; 55 + 3f22: e8 95 spm + 3f24: 11 24 eor r1, r1 addrPtr += 2; - 3f08: 4e 5f subi r20, 0xFE ; 254 - 3f0a: 5f 4f sbci r21, 0xFF ; 255 + 3f26: 4e 5f subi r20, 0xFE ; 254 + 3f28: 5f 4f sbci r21, 0xFF ; 255 } while (--ch); - 3f0c: f1 e0 ldi r31, 0x01 ; 1 - 3f0e: a0 38 cpi r26, 0x80 ; 128 - 3f10: bf 07 cpc r27, r31 - 3f12: 51 f7 brne .-44 ; 0x3ee8 + 3f2a: f1 e0 ldi r31, 0x01 ; 1 + 3f2c: a0 38 cpi r26, 0x80 ; 128 + 3f2e: bf 07 cpc r27, r31 + 3f30: 51 f7 brne .-44 ; 0x3f06 // Write from programming buffer __boot_page_write_short((uint16_t)(void*)address); - 3f14: e0 91 00 02 lds r30, 0x0200 - 3f18: f0 91 01 02 lds r31, 0x0201 - 3f1c: f7 be out 0x37, r15 ; 55 - 3f1e: e8 95 spm + 3f32: e0 91 00 02 lds r30, 0x0200 + 3f36: f0 91 01 02 lds r31, 0x0201 + 3f3a: e7 be out 0x37, r14 ; 55 + 3f3c: e8 95 spm boot_spm_busy_wait(); - 3f20: 07 b6 in r0, 0x37 ; 55 - 3f22: 00 fc sbrc r0, 0 - 3f24: fd cf rjmp .-6 ; 0x3f20 + 3f3e: 07 b6 in r0, 0x37 ; 55 + 3f40: 00 fc sbrc r0, 0 + 3f42: fd cf rjmp .-6 ; 0x3f3e #if defined(RWWSRE) // Reenable read access to flash boot_rww_enable(); - 3f26: e7 be out 0x37, r14 ; 55 - 3f28: e8 95 spm - 3f2a: 27 c0 rjmp .+78 ; 0x3f7a + 3f44: f7 be out 0x37, r15 ; 55 + 3f46: e8 95 spm + 3f48: 27 c0 rjmp .+78 ; 0x3f98 #endif } /* Read memory block mode, length is big endian. */ else if(ch == STK_READ_PAGE) { - 3f2c: 84 37 cpi r24, 0x74 ; 116 - 3f2e: b9 f4 brne .+46 ; 0x3f5e + 3f4a: 84 37 cpi r24, 0x74 ; 116 + 3f4c: b9 f4 brne .+46 ; 0x3f7c // READ PAGE - we only read flash getLen(); - 3f30: 37 d0 rcall .+110 ; 0x3fa0 + 3f4e: 37 d0 rcall .+110 ; 0x3fbe verifySpace(); - 3f32: 46 d0 rcall .+140 ; 0x3fc0 + 3f50: 46 d0 rcall .+140 ; 0x3fde putch(result); address++; } while (--length); #else do putch(pgm_read_byte_near(address++)); - 3f34: e0 91 00 02 lds r30, 0x0200 - 3f38: f0 91 01 02 lds r31, 0x0201 - 3f3c: 31 96 adiw r30, 0x01 ; 1 - 3f3e: f0 93 01 02 sts 0x0201, r31 - 3f42: e0 93 00 02 sts 0x0200, r30 - 3f46: 31 97 sbiw r30, 0x01 ; 1 - 3f48: e4 91 lpm r30, Z+ - 3f4a: 8e 2f mov r24, r30 - 3f4c: 19 d0 rcall .+50 ; 0x3f80 + 3f52: e0 91 00 02 lds r30, 0x0200 + 3f56: f0 91 01 02 lds r31, 0x0201 + 3f5a: 31 96 adiw r30, 0x01 ; 1 + 3f5c: f0 93 01 02 sts 0x0201, r31 + 3f60: e0 93 00 02 sts 0x0200, r30 + 3f64: 31 97 sbiw r30, 0x01 ; 1 + 3f66: e4 91 lpm r30, Z+ + 3f68: 8e 2f mov r24, r30 + 3f6a: 19 d0 rcall .+50 ; 0x3f9e while (--length); - 3f4e: 80 91 02 02 lds r24, 0x0202 - 3f52: 81 50 subi r24, 0x01 ; 1 - 3f54: 80 93 02 02 sts 0x0202, r24 - 3f58: 88 23 and r24, r24 - 3f5a: 61 f7 brne .-40 ; 0x3f34 - 3f5c: 0e c0 rjmp .+28 ; 0x3f7a + 3f6c: 80 91 02 02 lds r24, 0x0202 + 3f70: 81 50 subi r24, 0x01 ; 1 + 3f72: 80 93 02 02 sts 0x0202, r24 + 3f76: 88 23 and r24, r24 + 3f78: 61 f7 brne .-40 ; 0x3f52 + 3f7a: 0e c0 rjmp .+28 ; 0x3f98 #endif #endif } /* Get device signature bytes */ else if(ch == STK_READ_SIGN) { - 3f5e: 85 37 cpi r24, 0x75 ; 117 - 3f60: 39 f4 brne .+14 ; 0x3f70 + 3f7c: 85 37 cpi r24, 0x75 ; 117 + 3f7e: 39 f4 brne .+14 ; 0x3f8e // READ SIGN - return what Avrdude wants to hear verifySpace(); - 3f62: 2e d0 rcall .+92 ; 0x3fc0 + 3f80: 2e d0 rcall .+92 ; 0x3fde putch(SIGNATURE_0); - 3f64: 8e e1 ldi r24, 0x1E ; 30 - 3f66: 0c d0 rcall .+24 ; 0x3f80 + 3f82: 8e e1 ldi r24, 0x1E ; 30 + 3f84: 0c d0 rcall .+24 ; 0x3f9e putch(SIGNATURE_1); - 3f68: 84 e9 ldi r24, 0x94 ; 148 - 3f6a: 0a d0 rcall .+20 ; 0x3f80 + 3f86: 84 e9 ldi r24, 0x94 ; 148 + 3f88: 0a d0 rcall .+20 ; 0x3f9e putch(SIGNATURE_2); - 3f6c: 86 e0 ldi r24, 0x06 ; 6 - 3f6e: 9a cf rjmp .-204 ; 0x3ea4 + 3f8a: 86 e0 ldi r24, 0x06 ; 6 + 3f8c: 8b cf rjmp .-234 ; 0x3ea4 } else if (ch == 'Q') { - 3f70: 81 35 cpi r24, 0x51 ; 81 - 3f72: 11 f4 brne .+4 ; 0x3f78 + 3f8e: 81 35 cpi r24, 0x51 ; 81 + 3f90: 11 f4 brne .+4 ; 0x3f96 // Adaboot no-wait mod watchdogConfig(WATCHDOG_16MS); - 3f74: 88 e0 ldi r24, 0x08 ; 8 - 3f76: 19 d0 rcall .+50 ; 0x3faa + 3f92: 88 e0 ldi r24, 0x08 ; 8 + 3f94: 19 d0 rcall .+50 ; 0x3fc8 verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); - 3f78: 23 d0 rcall .+70 ; 0x3fc0 + 3f96: 23 d0 rcall .+70 ; 0x3fde } putch(STK_OK); - 3f7a: 80 e1 ldi r24, 0x10 ; 16 - 3f7c: 01 d0 rcall .+2 ; 0x3f80 - 3f7e: 6b cf rjmp .-298 ; 0x3e56 + 3f98: 80 e1 ldi r24, 0x10 ; 16 + 3f9a: 01 d0 rcall .+2 ; 0x3f9e + 3f9c: 5c cf rjmp .-328 ; 0x3e56 -00003f80 : +00003f9e : } } void putch(char ch) { - 3f80: 98 2f mov r25, r24 + 3f9e: 98 2f mov r25, r24 #ifndef SOFT_UART while (!(UCSR0A & _BV(UDRE0))); - 3f82: 80 91 c0 00 lds r24, 0x00C0 - 3f86: 85 ff sbrs r24, 5 - 3f88: fc cf rjmp .-8 ; 0x3f82 + 3fa0: 80 91 c0 00 lds r24, 0x00C0 + 3fa4: 85 ff sbrs r24, 5 + 3fa6: fc cf rjmp .-8 ; 0x3fa0 UDR0 = ch; - 3f8a: 90 93 c6 00 sts 0x00C6, r25 + 3fa8: 90 93 c6 00 sts 0x00C6, r25 [uartBit] "I" (UART_TX_BIT) : "r25" ); #endif } - 3f8e: 08 95 ret + 3fac: 08 95 ret -00003f90 : +00003fae : return getch(); } // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( - 3f90: a8 95 wdr + 3fae: a8 95 wdr [uartBit] "I" (UART_RX_BIT) : "r25" ); #else while(!(UCSR0A & _BV(RXC0))); - 3f92: 80 91 c0 00 lds r24, 0x00C0 - 3f96: 87 ff sbrs r24, 7 - 3f98: fc cf rjmp .-8 ; 0x3f92 + 3fb0: 80 91 c0 00 lds r24, 0x00C0 + 3fb4: 87 ff sbrs r24, 7 + 3fb6: fc cf rjmp .-8 ; 0x3fb0 ch = UDR0; - 3f9a: 80 91 c6 00 lds r24, 0x00C6 + 3fb8: 80 91 c6 00 lds r24, 0x00C6 #ifdef LED_DATA_FLASH LED_PIN |= _BV(LED); #endif return ch; } - 3f9e: 08 95 ret + 3fbc: 08 95 ret -00003fa0 : +00003fbe : } while (--count); } #endif uint8_t getLen() { getch(); - 3fa0: f7 df rcall .-18 ; 0x3f90 + 3fbe: f7 df rcall .-18 ; 0x3fae length = getch(); - 3fa2: f6 df rcall .-20 ; 0x3f90 - 3fa4: 80 93 02 02 sts 0x0202, r24 + 3fc0: f6 df rcall .-20 ; 0x3fae + 3fc2: 80 93 02 02 sts 0x0202, r24 return getch(); } - 3fa8: f3 cf rjmp .-26 ; 0x3f90 + 3fc6: f3 cf rjmp .-26 ; 0x3fae -00003faa : +00003fc8 : "wdr\n" ); } void watchdogConfig(uint8_t x) { WDTCSR = _BV(WDCE) | _BV(WDE); - 3faa: e0 e6 ldi r30, 0x60 ; 96 - 3fac: f0 e0 ldi r31, 0x00 ; 0 - 3fae: 98 e1 ldi r25, 0x18 ; 24 - 3fb0: 90 83 st Z, r25 + 3fc8: e0 e6 ldi r30, 0x60 ; 96 + 3fca: f0 e0 ldi r31, 0x00 ; 0 + 3fcc: 98 e1 ldi r25, 0x18 ; 24 + 3fce: 90 83 st Z, r25 WDTCSR = x; - 3fb2: 80 83 st Z, r24 + 3fd0: 80 83 st Z, r24 } - 3fb4: 08 95 ret + 3fd2: 08 95 ret -00003fb6 : +00003fd4 : void appStart() { watchdogConfig(WATCHDOG_OFF); - 3fb6: 80 e0 ldi r24, 0x00 ; 0 - 3fb8: f8 df rcall .-16 ; 0x3faa + 3fd4: 80 e0 ldi r24, 0x00 ; 0 + 3fd6: f8 df rcall .-16 ; 0x3fc8 __asm__ __volatile__ ( - 3fba: ee 27 eor r30, r30 - 3fbc: ff 27 eor r31, r31 - 3fbe: 09 94 ijmp + 3fd8: ee 27 eor r30, r30 + 3fda: ff 27 eor r31, r31 + 3fdc: 09 94 ijmp -00003fc0 : +00003fde : do getch(); while (--count); verifySpace(); } void verifySpace() { if (getch() != CRC_EOP) appStart(); - 3fc0: e7 df rcall .-50 ; 0x3f90 - 3fc2: 80 32 cpi r24, 0x20 ; 32 - 3fc4: 09 f0 breq .+2 ; 0x3fc8 - 3fc6: f7 df rcall .-18 ; 0x3fb6 + 3fde: e7 df rcall .-50 ; 0x3fae + 3fe0: 80 32 cpi r24, 0x20 ; 32 + 3fe2: 09 f0 breq .+2 ; 0x3fe6 + 3fe4: f7 df rcall .-18 ; 0x3fd4 putch(STK_INSYNC); - 3fc8: 84 e1 ldi r24, 0x14 ; 20 + 3fe6: 84 e1 ldi r24, 0x14 ; 20 } - 3fca: da cf rjmp .-76 ; 0x3f80 + 3fe8: da cf rjmp .-76 ; 0x3f9e ::[count] "M" (UART_B_VALUE) ); } #endif void getNch(uint8_t count) { - 3fcc: 1f 93 push r17 - 3fce: 18 2f mov r17, r24 + 3fea: 1f 93 push r17 + 3fec: 18 2f mov r17, r24 -00003fd0 : +00003fee : do getch(); while (--count); - 3fd0: df df rcall .-66 ; 0x3f90 - 3fd2: 11 50 subi r17, 0x01 ; 1 - 3fd4: e9 f7 brne .-6 ; 0x3fd0 + 3fee: df df rcall .-66 ; 0x3fae + 3ff0: 11 50 subi r17, 0x01 ; 1 + 3ff2: e9 f7 brne .-6 ; 0x3fee verifySpace(); - 3fd6: f4 df rcall .-24 ; 0x3fc0 + 3ff4: f4 df rcall .-24 ; 0x3fde } - 3fd8: 1f 91 pop r17 - 3fda: 08 95 ret + 3ff6: 1f 91 pop r17 + 3ff8: 08 95 ret