diff options
Diffstat (limited to 'bootloaders')
21 files changed, 863 insertions, 752 deletions
diff --git a/bootloaders/optiboot/README.TXT b/bootloaders/optiboot/README.TXT index 9a68e23..7e2f46d 100644 --- a/bootloaders/optiboot/README.TXT +++ b/bootloaders/optiboot/README.TXT @@ -27,7 +27,7 @@ this may change if compiler versions drift apart between CrossPack and the Arduino IDE.) -Building optiboot in the arduino IDE install. +Building Optiboot in the Arduino IDE Install. Work in the .../hardware/arduino/bootloaders/optiboot/ and use the "omake <targets>" command, which just generates a command that uses @@ -44,7 +44,7 @@ the programs it needs, so you need to work in the existing optiboot directory (or something created at the same "level") for it to work. -Building optiboot in the arduino source development install. +Building Optiboot in the Arduino Source Development Install. In this case, there is no special shell script, and you're assumed to have "make" installed somewhere in your path. @@ -53,3 +53,18 @@ expected directory. Work in Arduino/hardware/arduino/bootloaders/optiboot and use make OS=windows ENV=arduinodev <targets> or make OS=macosx ENV=arduinodev <targets> + + +Programming Chips Using the _isp Targets + +The CPU targets have corresponding ISP targets that will actuall +program the bootloader into a chip. "atmega328_isp" for the atmega328, +for example. These will set the fuses and lock bits as appropriate as +well as uploading the bootloader code. + +The makefiles default to using a USB programmer, but you can use +a serial programmer like ArduinoISP by changing the appropriate +variables when you invoke make: + + make ISPTOOL=stk500v1 ISPPORT=/dev/tty.usbserial-A20e1eAN \ + ISPSPEED=-b19200 atmega328_isp diff --git a/bootloaders/optiboot/optiboot.c b/bootloaders/optiboot/optiboot.c index 8dbe1bf..3f4404d 100644 --- a/bootloaders/optiboot/optiboot.c +++ b/bootloaders/optiboot/optiboot.c @@ -132,13 +132,16 @@ /**********************************************************/ /* Edit History: */ /* */ +/* 4.3 WestfW: catch framing errors in getch(), so that */ +/* AVRISP works without HW kludges. */ +/* http://code.google.com/p/arduino/issues/detail?id=368n*/ /* 4.2 WestfW: reduce code size, fix timeouts, change */ /* verifySpace to use WDT instead of appstart */ /* 4.1 WestfW: put version number in binary. */ /**********************************************************/ #define OPTIBOOT_MAJVER 4 -#define OPTIBOOT_MINVER 2 +#define OPTIBOOT_MINVER 3 #define MAKESTR(a) #a #define MAKEVER(a, b) MAKESTR(a*256+b) @@ -512,8 +515,6 @@ void putch(char ch) { uint8_t getch(void) { uint8_t ch; - watchdogReset(); - #ifdef LED_DATA_FLASH #ifdef __AVR_ATmega8__ LED_PORT ^= _BV(LED); @@ -547,7 +548,20 @@ uint8_t getch(void) { "r25" ); #else - while(!(UCSR0A & _BV(RXC0))); + while(!(UCSR0A & _BV(RXC0))) + ; + if (!(UCSR0A & _BV(FE0))) { + /* + * A Framing Error indicates (probably) that something is talking + * to us at the wrong bit rate. Assume that this is because it + * expects to be talking to the application, and DON'T reset the + * watchdog. This should cause the bootloader to abort and run + * the application "soon", if it keeps happening. (Note that we + * don't care that an invalid char is returned...) + */ + watchdogReset(); + } + ch = UDR0; #endif diff --git a/bootloaders/optiboot/optiboot_atmega328.hex b/bootloaders/optiboot/optiboot_atmega328.hex index 10dcd6c..f147e81 100644 --- a/bootloaders/optiboot/optiboot_atmega328.hex +++ b/bootloaders/optiboot/optiboot_atmega328.hex @@ -1,33 +1,34 @@ -:107E0000112484B714BE81FFE3D085E08093810004
+:107E0000112484B714BE81FFE7D085E08093810000
:107E100082E08093C00088E18093C10086E0809377
-:107E2000C20080E18093C4008EE0BCD0259A86E039
+:107E2000C20080E18093C4008EE0C0D0259A86E035
:107E300020E33CEF91E0309385002093840096BBD3
:107E4000B09BFECF1D9AA8958150A9F799249394D1
:107E5000A5E0AA2EF1E1BF2E9DD0813421F481E06E
-:107E6000AFD083E01FC0823411F484E103C08534B5
-:107E700019F485E0A5D083C0853579F48BD0E82E40
+:107E6000B3D083E01FC0823411F484E103C08534B1
+:107E700019F485E0A9D083C0853579F48BD0E82E3C
:107E8000FF2488D0082F10E0102F00270E291F296B
-:107E9000000F111F8DD0680172C0863529F484E06F
-:107EA0008FD080E06FD06BC0843609F042C072D0B2
+:107E9000000F111F91D0680172C0863529F484E06B
+:107EA00093D080E06FD06BC0843609F042C072D0AE
:107EB00071D0082F6FD080E0C81680E7D80620F474
:107EC00083E0F60187BFE895C0E0D1E063D08993F5
:107ED0000C17E1F7F0E0CF16F0E7DF0620F083E0C3
-:107EE000F60187BFE89564D007B600FCFDCFA60178
+:107EE000F60187BFE89568D007B600FCFDCFA60174
:107EF000A0E0B1E02C9130E011968C91119790E0C8
:107F0000982F8827822B932B1296FA010C0197BE8B
:107F1000E89511244E5F5F4FF1E0A038BF0751F79D
:107F2000F601A7BEE89507B600FCFDCFB7BEE89501
-:107F300026C08437B1F42ED02DD0F82E2BD038D0D7
+:107F300026C08437B1F42ED02DD0F82E2BD03CD0D3
:107F4000F601EF2C8F010F5F1F4F84911BD0EA9435
:107F5000F801C1F70894C11CD11CFA94CF0CD11CB4
-:107F60000EC0853739F424D08EE10CD085E90AD0D3
-:107F70008FE098CF813511F488E014D019D080E1DA
+:107F60000EC0853739F428D08EE10CD085E90AD0CF
+:107F70008FE098CF813511F488E018D01DD080E1D2
:107F800001D06ACF982F8091C00085FFFCCF9093DD
-:107F9000C6000895A8958091C00087FFFCCF80910E
-:107FA000C6000895E0E6F0E098E1908380830895AC
-:107FB000F1DF803219F088E0F5DFFFCF84E1E2CF16
-:107FC0001F93182FE7DF1150E9F7F2DF1F91089593
-:0A7FD00080E0E8DFEE27FF270994A8
-:027FFE0002047B
+:107F9000C60008958091C00087FFFCCF8091C0008B
+:107FA00084FD01C0A8958091C6000895E0E6F0E048
+:107FB00098E1908380830895EDDF803219F088E0A6
+:107FC000F5DFFFCF84E1DECF1F93182FE3DF1150E1
+:107FD000E9F7F2DF1F91089580E0E8DFEE27FF2741
+:027FE000099402
+:027FFE0003047A
:0400000300007E007B
:00000001FF
diff --git a/bootloaders/optiboot/optiboot_atmega328.lst b/bootloaders/optiboot/optiboot_atmega328.lst index 89577f6..db45462 100644 --- a/bootloaders/optiboot/optiboot_atmega328.lst +++ b/bootloaders/optiboot/optiboot_atmega328.lst @@ -3,27 +3,27 @@ optiboot_atmega328.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn - 0 .text 000001da 00007e00 00007e00 00000054 2**1 + 0 .text 000001e2 00007e00 00007e00 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .version 00000002 00007ffe 00007ffe 0000022e 2**0 + 1 .version 00000002 00007ffe 00007ffe 00000236 2**0 CONTENTS, READONLY - 2 .debug_aranges 00000028 00000000 00000000 00000230 2**0 + 2 .debug_aranges 00000028 00000000 00000000 00000238 2**0 CONTENTS, READONLY, DEBUGGING - 3 .debug_pubnames 0000005f 00000000 00000000 00000258 2**0 + 3 .debug_pubnames 0000005f 00000000 00000000 00000260 2**0 CONTENTS, READONLY, DEBUGGING - 4 .debug_info 0000028d 00000000 00000000 000002b7 2**0 + 4 .debug_info 0000028e 00000000 00000000 000002bf 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_abbrev 0000018a 00000000 00000000 00000544 2**0 + 5 .debug_abbrev 00000171 00000000 00000000 0000054d 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_line 00000456 00000000 00000000 000006ce 2**0 + 6 .debug_line 0000045e 00000000 00000000 000006be 2**0 CONTENTS, READONLY, DEBUGGING - 7 .debug_frame 00000080 00000000 00000000 00000b24 2**2 + 7 .debug_frame 00000080 00000000 00000000 00000b1c 2**2 CONTENTS, READONLY, DEBUGGING - 8 .debug_str 00000149 00000000 00000000 00000ba4 2**0 + 8 .debug_str 00000149 00000000 00000000 00000b9c 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_loc 0000027e 00000000 00000000 00000ced 2**0 + 9 .debug_loc 0000027e 00000000 00000000 00000ce5 2**0 CONTENTS, READONLY, DEBUGGING - 10 .debug_ranges 00000060 00000000 00000000 00000f6b 2**0 + 10 .debug_ranges 00000060 00000000 00000000 00000f63 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: @@ -47,7 +47,7 @@ int main(void) { 7e04: 14 be out 0x34, r1 ; 52 if (!(ch & _BV(EXTRF))) appStart(); 7e06: 81 ff sbrs r24, 1 - 7e08: e3 d0 rcall .+454 ; 0x7fd0 <appStart> + 7e08: e7 d0 rcall .+462 ; 0x7fd8 <appStart> #if LED_START_FLASHES > 0 // Set up Timer 1 for timeout counter @@ -77,7 +77,7 @@ int main(void) { // Set up watchdog to trigger after 500ms watchdogConfig(WATCHDOG_1S); 7e28: 8e e0 ldi r24, 0x0E ; 14 - 7e2a: bc d0 rcall .+376 ; 0x7fa4 <watchdogConfig> + 7e2a: c0 d0 rcall .+384 ; 0x7fac <watchdogConfig> /* Set LED pin as output */ LED_DDR |= _BV(LED); @@ -163,7 +163,7 @@ void watchdogReset() { // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy getNch(1); 7e5e: 81 e0 ldi r24, 0x01 ; 1 - 7e60: af d0 rcall .+350 ; 0x7fc0 <getNch> + 7e60: b3 d0 rcall .+358 ; 0x7fc8 <getNch> putch(0x03); 7e62: 83 e0 ldi r24, 0x03 ; 3 7e64: 1f c0 rjmp .+62 ; 0x7ea4 <main+0xa4> @@ -182,7 +182,7 @@ void watchdogReset() { // SET DEVICE EXT is ignored getNch(5); 7e72: 85 e0 ldi r24, 0x05 ; 5 - 7e74: a5 d0 rcall .+330 ; 0x7fc0 <getNch> + 7e74: a9 d0 rcall .+338 ; 0x7fc8 <getNch> 7e76: 83 c0 rjmp .+262 ; 0x7f7e <main+0x17e> } else if(ch == STK_LOAD_ADDRESS) { @@ -211,7 +211,7 @@ void watchdogReset() { 7e92: 11 1f adc r17, r17 address = newAddress; verifySpace(); - 7e94: 8d d0 rcall .+282 ; 0x7fb0 <verifySpace> + 7e94: 91 d0 rcall .+290 ; 0x7fb8 <verifySpace> 7e96: 68 01 movw r12, r16 7e98: 72 c0 rjmp .+228 ; 0x7f7e <main+0x17e> } @@ -221,7 +221,7 @@ void watchdogReset() { // UNIVERSAL command is ignored getNch(4); 7e9e: 84 e0 ldi r24, 0x04 ; 4 - 7ea0: 8f d0 rcall .+286 ; 0x7fc0 <getNch> + 7ea0: 93 d0 rcall .+294 ; 0x7fc8 <getNch> putch(0x00); 7ea2: 80 e0 ldi r24, 0x00 ; 0 7ea4: 6f d0 rcall .+222 ; 0x7f84 <putch> @@ -282,7 +282,7 @@ void watchdogReset() { // Read command terminator, start reply verifySpace(); - 7ee6: 64 d0 rcall .+200 ; 0x7fb0 <verifySpace> + 7ee6: 68 d0 rcall .+208 ; 0x7fb8 <verifySpace> // If only a partial page is to be programmed, the erase might not be complete. // So check that here @@ -370,7 +370,7 @@ int main(void) { 7f3c: 2b d0 rcall .+86 ; 0x7f94 <getch> verifySpace(); - 7f3e: 38 d0 rcall .+112 ; 0x7fb0 <verifySpace> + 7f3e: 3c d0 rcall .+120 ; 0x7fb8 <verifySpace> 7f40: f6 01 movw r30, r12 7f42: ef 2c mov r14, r15 putch(result); @@ -411,7 +411,7 @@ int main(void) { 7f64: 39 f4 brne .+14 ; 0x7f74 <main+0x174> // READ SIGN - return what Avrdude wants to hear verifySpace(); - 7f66: 24 d0 rcall .+72 ; 0x7fb0 <verifySpace> + 7f66: 28 d0 rcall .+80 ; 0x7fb8 <verifySpace> putch(SIGNATURE_0); 7f68: 8e e1 ldi r24, 0x1E ; 30 7f6a: 0c d0 rcall .+24 ; 0x7f84 <putch> @@ -428,13 +428,13 @@ int main(void) { // Adaboot no-wait mod watchdogConfig(WATCHDOG_16MS); 7f78: 88 e0 ldi r24, 0x08 ; 8 - 7f7a: 14 d0 rcall .+40 ; 0x7fa4 <watchdogConfig> + 7f7a: 18 d0 rcall .+48 ; 0x7fac <watchdogConfig> verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); - 7f7c: 19 d0 rcall .+50 ; 0x7fb0 <verifySpace> + 7f7c: 1d d0 rcall .+58 ; 0x7fb8 <verifySpace> } putch(STK_OK); 7f7e: 80 e1 ldi r24, 0x10 ; 16 @@ -463,99 +463,109 @@ void putch(char ch) { 7f92: 08 95 ret 00007f94 <getch>: + [uartBit] "I" (UART_RX_BIT) + : + "r25" +); +#else + while(!(UCSR0A & _BV(RXC0))) + 7f94: 80 91 c0 00 lds r24, 0x00C0 + 7f98: 87 ff sbrs r24, 7 + 7f9a: fc cf rjmp .-8 ; 0x7f94 <getch> + ; + if (!(UCSR0A & _BV(FE0))) { + 7f9c: 80 91 c0 00 lds r24, 0x00C0 + 7fa0: 84 fd sbrc r24, 4 + 7fa2: 01 c0 rjmp .+2 ; 0x7fa6 <getch+0x12> } #endif // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( - 7f94: a8 95 wdr - [uartBit] "I" (UART_RX_BIT) - : - "r25" -); -#else - while(!(UCSR0A & _BV(RXC0))); - 7f96: 80 91 c0 00 lds r24, 0x00C0 - 7f9a: 87 ff sbrs r24, 7 - 7f9c: fc cf rjmp .-8 ; 0x7f96 <getch+0x2> + 7fa4: a8 95 wdr + * don't care that an invalid char is returned...) + */ + watchdogReset(); + } + ch = UDR0; - 7f9e: 80 91 c6 00 lds r24, 0x00C6 + 7fa6: 80 91 c6 00 lds r24, 0x00C6 LED_PIN |= _BV(LED); #endif #endif return ch; } - 7fa2: 08 95 ret + 7faa: 08 95 ret -00007fa4 <watchdogConfig>: +00007fac <watchdogConfig>: "wdr\n" ); } void watchdogConfig(uint8_t x) { WDTCSR = _BV(WDCE) | _BV(WDE); - 7fa4: e0 e6 ldi r30, 0x60 ; 96 - 7fa6: f0 e0 ldi r31, 0x00 ; 0 - 7fa8: 98 e1 ldi r25, 0x18 ; 24 - 7faa: 90 83 st Z, r25 + 7fac: e0 e6 ldi r30, 0x60 ; 96 + 7fae: f0 e0 ldi r31, 0x00 ; 0 + 7fb0: 98 e1 ldi r25, 0x18 ; 24 + 7fb2: 90 83 st Z, r25 WDTCSR = x; - 7fac: 80 83 st Z, r24 + 7fb4: 80 83 st Z, r24 } - 7fae: 08 95 ret + 7fb6: 08 95 ret -00007fb0 <verifySpace>: +00007fb8 <verifySpace>: do getch(); while (--count); verifySpace(); } void verifySpace() { if (getch() != CRC_EOP) { - 7fb0: f1 df rcall .-30 ; 0x7f94 <getch> - 7fb2: 80 32 cpi r24, 0x20 ; 32 - 7fb4: 19 f0 breq .+6 ; 0x7fbc <verifySpace+0xc> + 7fb8: ed df rcall .-38 ; 0x7f94 <getch> + 7fba: 80 32 cpi r24, 0x20 ; 32 + 7fbc: 19 f0 breq .+6 ; 0x7fc4 <verifySpace+0xc> watchdogConfig(WATCHDOG_16MS); // shorten WD timeout - 7fb6: 88 e0 ldi r24, 0x08 ; 8 - 7fb8: f5 df rcall .-22 ; 0x7fa4 <watchdogConfig> - 7fba: ff cf rjmp .-2 ; 0x7fba <verifySpace+0xa> + 7fbe: 88 e0 ldi r24, 0x08 ; 8 + 7fc0: f5 df rcall .-22 ; 0x7fac <watchdogConfig> + 7fc2: ff cf rjmp .-2 ; 0x7fc2 <verifySpace+0xa> while (1) // and busy-loop so that WD causes ; // a reset and app start. } putch(STK_INSYNC); - 7fbc: 84 e1 ldi r24, 0x14 ; 20 + 7fc4: 84 e1 ldi r24, 0x14 ; 20 } - 7fbe: e2 cf rjmp .-60 ; 0x7f84 <putch> + 7fc6: de cf rjmp .-68 ; 0x7f84 <putch> -00007fc0 <getNch>: +00007fc8 <getNch>: ::[count] "M" (UART_B_VALUE) ); } #endif void getNch(uint8_t count) { - 7fc0: 1f 93 push r17 - 7fc2: 18 2f mov r17, r24 + 7fc8: 1f 93 push r17 + 7fca: 18 2f mov r17, r24 do getch(); while (--count); - 7fc4: e7 df rcall .-50 ; 0x7f94 <getch> - 7fc6: 11 50 subi r17, 0x01 ; 1 - 7fc8: e9 f7 brne .-6 ; 0x7fc4 <getNch+0x4> + 7fcc: e3 df rcall .-58 ; 0x7f94 <getch> + 7fce: 11 50 subi r17, 0x01 ; 1 + 7fd0: e9 f7 brne .-6 ; 0x7fcc <getNch+0x4> verifySpace(); - 7fca: f2 df rcall .-28 ; 0x7fb0 <verifySpace> + 7fd2: f2 df rcall .-28 ; 0x7fb8 <verifySpace> } - 7fcc: 1f 91 pop r17 - 7fce: 08 95 ret + 7fd4: 1f 91 pop r17 + 7fd6: 08 95 ret -00007fd0 <appStart>: +00007fd8 <appStart>: WDTCSR = _BV(WDCE) | _BV(WDE); WDTCSR = x; } void appStart() { watchdogConfig(WATCHDOG_OFF); - 7fd0: 80 e0 ldi r24, 0x00 ; 0 - 7fd2: e8 df rcall .-48 ; 0x7fa4 <watchdogConfig> + 7fd8: 80 e0 ldi r24, 0x00 ; 0 + 7fda: e8 df rcall .-48 ; 0x7fac <watchdogConfig> __asm__ __volatile__ ( - 7fd4: ee 27 eor r30, r30 - 7fd6: ff 27 eor r31, r31 - 7fd8: 09 94 ijmp + 7fdc: ee 27 eor r30, r30 + 7fde: ff 27 eor r31, r31 + 7fe0: 09 94 ijmp diff --git a/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.hex b/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.hex index 3b543c1..499c631 100644 --- a/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.hex +++ b/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.hex @@ -1,33 +1,34 @@ -:107E0000112484B714BE81FFE3D085E08093810004
+:107E0000112484B714BE81FFE7D085E08093810000
:107E100082E08093C00088E18093C10086E0809377
-:107E2000C20088E08093C4008EE0BCD0259A86E032
+:107E2000C20088E08093C4008EE0C0D0259A86E02E
:107E300028E13EEF91E0309385002093840096BBCB
:107E4000B09BFECF1D9AA8958150A9F799249394D1
:107E5000A5E0AA2EF1E1BF2E9DD0813421F481E06E
-:107E6000AFD083E01FC0823411F484E103C08534B5
-:107E700019F485E0A5D083C0853579F48BD0E82E40
+:107E6000B3D083E01FC0823411F484E103C08534B1
+:107E700019F485E0A9D083C0853579F48BD0E82E3C
:107E8000FF2488D0082F10E0102F00270E291F296B
-:107E9000000F111F8DD0680172C0863529F484E06F
-:107EA0008FD080E06FD06BC0843609F042C072D0B2
+:107E9000000F111F91D0680172C0863529F484E06B
+:107EA00093D080E06FD06BC0843609F042C072D0AE
:107EB00071D0082F6FD080E0C81680E7D80620F474
:107EC00083E0F60187BFE895C0E0D1E063D08993F5
:107ED0000C17E1F7F0E0CF16F0E7DF0620F083E0C3
-:107EE000F60187BFE89564D007B600FCFDCFA60178
+:107EE000F60187BFE89568D007B600FCFDCFA60174
:107EF000A0E0B1E02C9130E011968C91119790E0C8
:107F0000982F8827822B932B1296FA010C0197BE8B
:107F1000E89511244E5F5F4FF1E0A038BF0751F79D
:107F2000F601A7BEE89507B600FCFDCFB7BEE89501
-:107F300026C08437B1F42ED02DD0F82E2BD038D0D7
+:107F300026C08437B1F42ED02DD0F82E2BD03CD0D3
:107F4000F601EF2C8F010F5F1F4F84911BD0EA9435
:107F5000F801C1F70894C11CD11CFA94CF0CD11CB4
-:107F60000EC0853739F424D08EE10CD085E90AD0D3
-:107F70008FE098CF813511F488E014D019D080E1DA
+:107F60000EC0853739F428D08EE10CD085E90AD0CF
+:107F70008FE098CF813511F488E018D01DD080E1D2
:107F800001D06ACF982F8091C00085FFFCCF9093DD
-:107F9000C6000895A8958091C00087FFFCCF80910E
-:107FA000C6000895E0E6F0E098E1908380830895AC
-:107FB000F1DF803219F088E0F5DFFFCF84E1E2CF16
-:107FC0001F93182FE7DF1150E9F7F2DF1F91089593
-:0A7FD00080E0E8DFEE27FF270994A8
-:027FFE0002047B
+:107F9000C60008958091C00087FFFCCF8091C0008B
+:107FA00084FD01C0A8958091C6000895E0E6F0E048
+:107FB00098E1908380830895EDDF803219F088E0A6
+:107FC000F5DFFFCF84E1DECF1F93182FE3DF1150E1
+:107FD000E9F7F2DF1F91089580E0E8DFEE27FF2741
+:027FE000099402
+:027FFE0003047A
:0400000300007E007B
:00000001FF
diff --git a/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.lst b/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.lst index 002f9a3..0577bdc 100644 --- a/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.lst +++ b/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.lst @@ -3,27 +3,27 @@ optiboot_atmega328_pro_8MHz.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn - 0 .text 000001da 00007e00 00007e00 00000054 2**1 + 0 .text 000001e2 00007e00 00007e00 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .version 00000002 00007ffe 00007ffe 0000022e 2**0 + 1 .version 00000002 00007ffe 00007ffe 00000236 2**0 CONTENTS, READONLY - 2 .debug_aranges 00000028 00000000 00000000 00000230 2**0 + 2 .debug_aranges 00000028 00000000 00000000 00000238 2**0 CONTENTS, READONLY, DEBUGGING - 3 .debug_pubnames 0000005f 00000000 00000000 00000258 2**0 + 3 .debug_pubnames 0000005f 00000000 00000000 00000260 2**0 CONTENTS, READONLY, DEBUGGING - 4 .debug_info 0000028d 00000000 00000000 000002b7 2**0 + 4 .debug_info 0000028e 00000000 00000000 000002bf 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_abbrev 0000018a 00000000 00000000 00000544 2**0 + 5 .debug_abbrev 00000171 00000000 00000000 0000054d 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_line 00000456 00000000 00000000 000006ce 2**0 + 6 .debug_line 0000045e 00000000 00000000 000006be 2**0 CONTENTS, READONLY, DEBUGGING - 7 .debug_frame 00000080 00000000 00000000 00000b24 2**2 + 7 .debug_frame 00000080 00000000 00000000 00000b1c 2**2 CONTENTS, READONLY, DEBUGGING - 8 .debug_str 00000149 00000000 00000000 00000ba4 2**0 + 8 .debug_str 00000149 00000000 00000000 00000b9c 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_loc 0000027e 00000000 00000000 00000ced 2**0 + 9 .debug_loc 0000027e 00000000 00000000 00000ce5 2**0 CONTENTS, READONLY, DEBUGGING - 10 .debug_ranges 00000060 00000000 00000000 00000f6b 2**0 + 10 .debug_ranges 00000060 00000000 00000000 00000f63 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: @@ -47,7 +47,7 @@ int main(void) { 7e04: 14 be out 0x34, r1 ; 52 if (!(ch & _BV(EXTRF))) appStart(); 7e06: 81 ff sbrs r24, 1 - 7e08: e3 d0 rcall .+454 ; 0x7fd0 <appStart> + 7e08: e7 d0 rcall .+462 ; 0x7fd8 <appStart> #if LED_START_FLASHES > 0 // Set up Timer 1 for timeout counter @@ -77,7 +77,7 @@ int main(void) { // Set up watchdog to trigger after 500ms watchdogConfig(WATCHDOG_1S); 7e28: 8e e0 ldi r24, 0x0E ; 14 - 7e2a: bc d0 rcall .+376 ; 0x7fa4 <watchdogConfig> + 7e2a: c0 d0 rcall .+384 ; 0x7fac <watchdogConfig> /* Set LED pin as output */ LED_DDR |= _BV(LED); @@ -163,7 +163,7 @@ void watchdogReset() { // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy getNch(1); 7e5e: 81 e0 ldi r24, 0x01 ; 1 - 7e60: af d0 rcall .+350 ; 0x7fc0 <getNch> + 7e60: b3 d0 rcall .+358 ; 0x7fc8 <getNch> putch(0x03); 7e62: 83 e0 ldi r24, 0x03 ; 3 7e64: 1f c0 rjmp .+62 ; 0x7ea4 <main+0xa4> @@ -182,7 +182,7 @@ void watchdogReset() { // SET DEVICE EXT is ignored getNch(5); 7e72: 85 e0 ldi r24, 0x05 ; 5 - 7e74: a5 d0 rcall .+330 ; 0x7fc0 <getNch> + 7e74: a9 d0 rcall .+338 ; 0x7fc8 <getNch> 7e76: 83 c0 rjmp .+262 ; 0x7f7e <main+0x17e> } else if(ch == STK_LOAD_ADDRESS) { @@ -211,7 +211,7 @@ void watchdogReset() { 7e92: 11 1f adc r17, r17 address = newAddress; verifySpace(); - 7e94: 8d d0 rcall .+282 ; 0x7fb0 <verifySpace> + 7e94: 91 d0 rcall .+290 ; 0x7fb8 <verifySpace> 7e96: 68 01 movw r12, r16 7e98: 72 c0 rjmp .+228 ; 0x7f7e <main+0x17e> } @@ -221,7 +221,7 @@ void watchdogReset() { // UNIVERSAL command is ignored getNch(4); 7e9e: 84 e0 ldi r24, 0x04 ; 4 - 7ea0: 8f d0 rcall .+286 ; 0x7fc0 <getNch> + 7ea0: 93 d0 rcall .+294 ; 0x7fc8 <getNch> putch(0x00); 7ea2: 80 e0 ldi r24, 0x00 ; 0 7ea4: 6f d0 rcall .+222 ; 0x7f84 <putch> @@ -282,7 +282,7 @@ void watchdogReset() { // Read command terminator, start reply verifySpace(); - 7ee6: 64 d0 rcall .+200 ; 0x7fb0 <verifySpace> + 7ee6: 68 d0 rcall .+208 ; 0x7fb8 <verifySpace> // If only a partial page is to be programmed, the erase might not be complete. // So check that here @@ -370,7 +370,7 @@ int main(void) { 7f3c: 2b d0 rcall .+86 ; 0x7f94 <getch> verifySpace(); - 7f3e: 38 d0 rcall .+112 ; 0x7fb0 <verifySpace> + 7f3e: 3c d0 rcall .+120 ; 0x7fb8 <verifySpace> 7f40: f6 01 movw r30, r12 7f42: ef 2c mov r14, r15 putch(result); @@ -411,7 +411,7 @@ int main(void) { 7f64: 39 f4 brne .+14 ; 0x7f74 <main+0x174> // READ SIGN - return what Avrdude wants to hear verifySpace(); - 7f66: 24 d0 rcall .+72 ; 0x7fb0 <verifySpace> + 7f66: 28 d0 rcall .+80 ; 0x7fb8 <verifySpace> putch(SIGNATURE_0); 7f68: 8e e1 ldi r24, 0x1E ; 30 7f6a: 0c d0 rcall .+24 ; 0x7f84 <putch> @@ -428,13 +428,13 @@ int main(void) { // Adaboot no-wait mod watchdogConfig(WATCHDOG_16MS); 7f78: 88 e0 ldi r24, 0x08 ; 8 - 7f7a: 14 d0 rcall .+40 ; 0x7fa4 <watchdogConfig> + 7f7a: 18 d0 rcall .+48 ; 0x7fac <watchdogConfig> verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); - 7f7c: 19 d0 rcall .+50 ; 0x7fb0 <verifySpace> + 7f7c: 1d d0 rcall .+58 ; 0x7fb8 <verifySpace> } putch(STK_OK); 7f7e: 80 e1 ldi r24, 0x10 ; 16 @@ -463,99 +463,109 @@ void putch(char ch) { 7f92: 08 95 ret 00007f94 <getch>: + [uartBit] "I" (UART_RX_BIT) + : + "r25" +); +#else + while(!(UCSR0A & _BV(RXC0))) + 7f94: 80 91 c0 00 lds r24, 0x00C0 + 7f98: 87 ff sbrs r24, 7 + 7f9a: fc cf rjmp .-8 ; 0x7f94 <getch> + ; + if (!(UCSR0A & _BV(FE0))) { + 7f9c: 80 91 c0 00 lds r24, 0x00C0 + 7fa0: 84 fd sbrc r24, 4 + 7fa2: 01 c0 rjmp .+2 ; 0x7fa6 <getch+0x12> } #endif // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( - 7f94: a8 95 wdr - [uartBit] "I" (UART_RX_BIT) - : - "r25" -); -#else - while(!(UCSR0A & _BV(RXC0))); - 7f96: 80 91 c0 00 lds r24, 0x00C0 - 7f9a: 87 ff sbrs r24, 7 - 7f9c: fc cf rjmp .-8 ; 0x7f96 <getch+0x2> + 7fa4: a8 95 wdr + * don't care that an invalid char is returned...) + */ + watchdogReset(); + } + ch = UDR0; - 7f9e: 80 91 c6 00 lds r24, 0x00C6 + 7fa6: 80 91 c6 00 lds r24, 0x00C6 LED_PIN |= _BV(LED); #endif #endif return ch; } - 7fa2: 08 95 ret + 7faa: 08 95 ret -00007fa4 <watchdogConfig>: +00007fac <watchdogConfig>: "wdr\n" ); } void watchdogConfig(uint8_t x) { WDTCSR = _BV(WDCE) | _BV(WDE); - 7fa4: e0 e6 ldi r30, 0x60 ; 96 - 7fa6: f0 e0 ldi r31, 0x00 ; 0 - 7fa8: 98 e1 ldi r25, 0x18 ; 24 - 7faa: 90 83 st Z, r25 + 7fac: e0 e6 ldi r30, 0x60 ; 96 + 7fae: f0 e0 ldi r31, 0x00 ; 0 + 7fb0: 98 e1 ldi r25, 0x18 ; 24 + 7fb2: 90 83 st Z, r25 WDTCSR = x; - 7fac: 80 83 st Z, r24 + 7fb4: 80 83 st Z, r24 } - 7fae: 08 95 ret + 7fb6: 08 95 ret -00007fb0 <verifySpace>: +00007fb8 <verifySpace>: do getch(); while (--count); verifySpace(); } void verifySpace() { if (getch() != CRC_EOP) { - 7fb0: f1 df rcall .-30 ; 0x7f94 <getch> - 7fb2: 80 32 cpi r24, 0x20 ; 32 - 7fb4: 19 f0 breq .+6 ; 0x7fbc <verifySpace+0xc> + 7fb8: ed df rcall .-38 ; 0x7f94 <getch> + 7fba: 80 32 cpi r24, 0x20 ; 32 + 7fbc: 19 f0 breq .+6 ; 0x7fc4 <verifySpace+0xc> watchdogConfig(WATCHDOG_16MS); // shorten WD timeout - 7fb6: 88 e0 ldi r24, 0x08 ; 8 - 7fb8: f5 df rcall .-22 ; 0x7fa4 <watchdogConfig> - 7fba: ff cf rjmp .-2 ; 0x7fba <verifySpace+0xa> + 7fbe: 88 e0 ldi r24, 0x08 ; 8 + 7fc0: f5 df rcall .-22 ; 0x7fac <watchdogConfig> + 7fc2: ff cf rjmp .-2 ; 0x7fc2 <verifySpace+0xa> while (1) // and busy-loop so that WD causes ; // a reset and app start. } putch(STK_INSYNC); - 7fbc: 84 e1 ldi r24, 0x14 ; 20 + 7fc4: 84 e1 ldi r24, 0x14 ; 20 } - 7fbe: e2 cf rjmp .-60 ; 0x7f84 <putch> + 7fc6: de cf rjmp .-68 ; 0x7f84 <putch> -00007fc0 <getNch>: +00007fc8 <getNch>: ::[count] "M" (UART_B_VALUE) ); } #endif void getNch(uint8_t count) { - 7fc0: 1f 93 push r17 - 7fc2: 18 2f mov r17, r24 + 7fc8: 1f 93 push r17 + 7fca: 18 2f mov r17, r24 do getch(); while (--count); - 7fc4: e7 df rcall .-50 ; 0x7f94 <getch> - 7fc6: 11 50 subi r17, 0x01 ; 1 - 7fc8: e9 f7 brne .-6 ; 0x7fc4 <getNch+0x4> + 7fcc: e3 df rcall .-58 ; 0x7f94 <getch> + 7fce: 11 50 subi r17, 0x01 ; 1 + 7fd0: e9 f7 brne .-6 ; 0x7fcc <getNch+0x4> verifySpace(); - 7fca: f2 df rcall .-28 ; 0x7fb0 <verifySpace> + 7fd2: f2 df rcall .-28 ; 0x7fb8 <verifySpace> } - 7fcc: 1f 91 pop r17 - 7fce: 08 95 ret + 7fd4: 1f 91 pop r17 + 7fd6: 08 95 ret -00007fd0 <appStart>: +00007fd8 <appStart>: WDTCSR = _BV(WDCE) | _BV(WDE); WDTCSR = x; } void appStart() { watchdogConfig(WATCHDOG_OFF); - 7fd0: 80 e0 ldi r24, 0x00 ; 0 - 7fd2: e8 df rcall .-48 ; 0x7fa4 <watchdogConfig> + 7fd8: 80 e0 ldi r24, 0x00 ; 0 + 7fda: e8 df rcall .-48 ; 0x7fac <watchdogConfig> __asm__ __volatile__ ( - 7fd4: ee 27 eor r30, r30 - 7fd6: ff 27 eor r31, r31 - 7fd8: 09 94 ijmp + 7fdc: ee 27 eor r30, r30 + 7fde: ff 27 eor r31, r31 + 7fe0: 09 94 ijmp diff --git a/bootloaders/optiboot/optiboot_diecimila.hex b/bootloaders/optiboot/optiboot_diecimila.hex index 26bbd4c..b685a4e 100644 --- a/bootloaders/optiboot/optiboot_diecimila.hex +++ b/bootloaders/optiboot/optiboot_diecimila.hex @@ -1,33 +1,34 @@ -:103E0000112484B714BE81FFE3D085E08093810044
+:103E0000112484B714BE81FFE7D085E08093810040
:103E100082E08093C00088E18093C10086E08093B7
-:103E2000C20080E18093C4008EE0BCD0259A86E079
+:103E2000C20080E18093C4008EE0C0D0259A86E075
:103E300020E33CEF91E0309385002093840096BB13
:103E4000B09BFECF1D9AA8958150A9F79924939411
:103E5000A5E0AA2EF1E1BF2E9DD0813421F481E0AE
-:103E6000AFD083E01FC0823411F484E103C08534F5
-:103E700019F485E0A5D083C0853579F48BD0E82E80
+:103E6000B3D083E01FC0823411F484E103C08534F1
+:103E700019F485E0A9D083C0853579F48BD0E82E7C
:103E8000FF2488D0082F10E0102F00270E291F29AB
-:103E9000000F111F8DD0680172C0863529F484E0AF
-:103EA0008FD080E06FD06BC0843609F042C072D0F2
+:103E9000000F111F91D0680172C0863529F484E0AB
+:103EA00093D080E06FD06BC0843609F042C072D0EE
:103EB00071D0082F6FD080E0C81688E3D80620F4B0
:103EC00083E0F60187BFE895C0E0D1E063D0899335
:103ED0000C17E1F7F0E0CF16F8E3DF0620F083E0FF
-:103EE000F60187BFE89564D007B600FCFDCFA601B8
+:103EE000F60187BFE89568D007B600FCFDCFA601B4
:103EF000A0E0B1E02C9130E011968C91119790E008
:103F0000982F8827822B932B1296FA010C0197BECB
:103F1000E89511244E5F5F4FF1E0A038BF0751F7DD
:103F2000F601A7BEE89507B600FCFDCFB7BEE89541
-:103F300026C08437B1F42ED02DD0F82E2BD038D017
+:103F300026C08437B1F42ED02DD0F82E2BD03CD013
:103F4000F601EF2C8F010F5F1F4F84911BD0EA9475
:103F5000F801C1F70894C11CD11CFA94CF0CD11CF4
-:103F60000EC0853739F424D08EE10CD084E90AD014
-:103F700086E098CF813511F488E014D019D080E123
+:103F60000EC0853739F428D08EE10CD084E90AD010
+:103F700086E098CF813511F488E018D01DD080E11B
:103F800001D06ACF982F8091C00085FFFCCF90931D
-:103F9000C6000895A8958091C00087FFFCCF80914E
-:103FA000C6000895E0E6F0E098E1908380830895EC
-:103FB000F1DF803219F088E0F5DFFFCF84E1E2CF56
-:103FC0001F93182FE7DF1150E9F7F2DF1F910895D3
-:0A3FD00080E0E8DFEE27FF270994E8
-:023FFE000204BB
+:103F9000C60008958091C00087FFFCCF8091C000CB
+:103FA00084FD01C0A8958091C6000895E0E6F0E088
+:103FB00098E1908380830895EDDF803219F088E0E6
+:103FC000F5DFFFCF84E1DECF1F93182FE3DF115021
+:103FD000E9F7F2DF1F91089580E0E8DFEE27FF2781
+:023FE000099442
+:023FFE000304BA
:0400000300003E00BB
:00000001FF
diff --git a/bootloaders/optiboot/optiboot_diecimila.lst b/bootloaders/optiboot/optiboot_diecimila.lst index 6e0843d..357dc11 100644 --- a/bootloaders/optiboot/optiboot_diecimila.lst +++ b/bootloaders/optiboot/optiboot_diecimila.lst @@ -3,27 +3,27 @@ optiboot_diecimila.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn - 0 .text 000001da 00003e00 00003e00 00000054 2**1 + 0 .text 000001e2 00003e00 00003e00 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .version 00000002 00003ffe 00003ffe 0000022e 2**0 + 1 .version 00000002 00003ffe 00003ffe 00000236 2**0 CONTENTS, READONLY - 2 .debug_aranges 00000028 00000000 00000000 00000230 2**0 + 2 .debug_aranges 00000028 00000000 00000000 00000238 2**0 CONTENTS, READONLY, DEBUGGING - 3 .debug_pubnames 0000005f 00000000 00000000 00000258 2**0 + 3 .debug_pubnames 0000005f 00000000 00000000 00000260 2**0 CONTENTS, READONLY, DEBUGGING - 4 .debug_info 0000028d 00000000 00000000 000002b7 2**0 + 4 .debug_info 0000028e 00000000 00000000 000002bf 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_abbrev 0000018a 00000000 00000000 00000544 2**0 + 5 .debug_abbrev 00000171 00000000 00000000 0000054d 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_line 00000456 00000000 00000000 000006ce 2**0 + 6 .debug_line 0000045e 00000000 00000000 000006be 2**0 CONTENTS, READONLY, DEBUGGING - 7 .debug_frame 00000080 00000000 00000000 00000b24 2**2 + 7 .debug_frame 00000080 00000000 00000000 00000b1c 2**2 CONTENTS, READONLY, DEBUGGING - 8 .debug_str 00000149 00000000 00000000 00000ba4 2**0 + 8 .debug_str 00000149 00000000 00000000 00000b9c 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_loc 0000027e 00000000 00000000 00000ced 2**0 + 9 .debug_loc 0000027e 00000000 00000000 00000ce5 2**0 CONTENTS, READONLY, DEBUGGING - 10 .debug_ranges 00000060 00000000 00000000 00000f6b 2**0 + 10 .debug_ranges 00000060 00000000 00000000 00000f63 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: @@ -47,7 +47,7 @@ int main(void) { 3e04: 14 be out 0x34, r1 ; 52 if (!(ch & _BV(EXTRF))) appStart(); 3e06: 81 ff sbrs r24, 1 - 3e08: e3 d0 rcall .+454 ; 0x3fd0 <appStart> + 3e08: e7 d0 rcall .+462 ; 0x3fd8 <appStart> #if LED_START_FLASHES > 0 // Set up Timer 1 for timeout counter @@ -77,7 +77,7 @@ int main(void) { // Set up watchdog to trigger after 500ms watchdogConfig(WATCHDOG_1S); 3e28: 8e e0 ldi r24, 0x0E ; 14 - 3e2a: bc d0 rcall .+376 ; 0x3fa4 <watchdogConfig> + 3e2a: c0 d0 rcall .+384 ; 0x3fac <watchdogConfig> /* Set LED pin as output */ LED_DDR |= _BV(LED); @@ -163,7 +163,7 @@ void watchdogReset() { // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy getNch(1); 3e5e: 81 e0 ldi r24, 0x01 ; 1 - 3e60: af d0 rcall .+350 ; 0x3fc0 <getNch> + 3e60: b3 d0 rcall .+358 ; 0x3fc8 <getNch> putch(0x03); 3e62: 83 e0 ldi r24, 0x03 ; 3 3e64: 1f c0 rjmp .+62 ; 0x3ea4 <main+0xa4> @@ -182,7 +182,7 @@ void watchdogReset() { // SET DEVICE EXT is ignored getNch(5); 3e72: 85 e0 ldi r24, 0x05 ; 5 - 3e74: a5 d0 rcall .+330 ; 0x3fc0 <getNch> + 3e74: a9 d0 rcall .+338 ; 0x3fc8 <getNch> 3e76: 83 c0 rjmp .+262 ; 0x3f7e <main+0x17e> } else if(ch == STK_LOAD_ADDRESS) { @@ -211,7 +211,7 @@ void watchdogReset() { 3e92: 11 1f adc r17, r17 address = newAddress; verifySpace(); - 3e94: 8d d0 rcall .+282 ; 0x3fb0 <verifySpace> + 3e94: 91 d0 rcall .+290 ; 0x3fb8 <verifySpace> 3e96: 68 01 movw r12, r16 3e98: 72 c0 rjmp .+228 ; 0x3f7e <main+0x17e> } @@ -221,7 +221,7 @@ void watchdogReset() { // UNIVERSAL command is ignored getNch(4); 3e9e: 84 e0 ldi r24, 0x04 ; 4 - 3ea0: 8f d0 rcall .+286 ; 0x3fc0 <getNch> + 3ea0: 93 d0 rcall .+294 ; 0x3fc8 <getNch> putch(0x00); 3ea2: 80 e0 ldi r24, 0x00 ; 0 3ea4: 6f d0 rcall .+222 ; 0x3f84 <putch> @@ -282,7 +282,7 @@ void watchdogReset() { // Read command terminator, start reply verifySpace(); - 3ee6: 64 d0 rcall .+200 ; 0x3fb0 <verifySpace> + 3ee6: 68 d0 rcall .+208 ; 0x3fb8 <verifySpace> // If only a partial page is to be programmed, the erase might not be complete. // So check that here @@ -370,7 +370,7 @@ int main(void) { 3f3c: 2b d0 rcall .+86 ; 0x3f94 <getch> verifySpace(); - 3f3e: 38 d0 rcall .+112 ; 0x3fb0 <verifySpace> + 3f3e: 3c d0 rcall .+120 ; 0x3fb8 <verifySpace> 3f40: f6 01 movw r30, r12 3f42: ef 2c mov r14, r15 putch(result); @@ -411,7 +411,7 @@ int main(void) { 3f64: 39 f4 brne .+14 ; 0x3f74 <main+0x174> // READ SIGN - return what Avrdude wants to hear verifySpace(); - 3f66: 24 d0 rcall .+72 ; 0x3fb0 <verifySpace> + 3f66: 28 d0 rcall .+80 ; 0x3fb8 <verifySpace> putch(SIGNATURE_0); 3f68: 8e e1 ldi r24, 0x1E ; 30 3f6a: 0c d0 rcall .+24 ; 0x3f84 <putch> @@ -428,13 +428,13 @@ int main(void) { // Adaboot no-wait mod watchdogConfig(WATCHDOG_16MS); 3f78: 88 e0 ldi r24, 0x08 ; 8 - 3f7a: 14 d0 rcall .+40 ; 0x3fa4 <watchdogConfig> + 3f7a: 18 d0 rcall .+48 ; 0x3fac <watchdogConfig> verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); - 3f7c: 19 d0 rcall .+50 ; 0x3fb0 <verifySpace> + 3f7c: 1d d0 rcall .+58 ; 0x3fb8 <verifySpace> } putch(STK_OK); 3f7e: 80 e1 ldi r24, 0x10 ; 16 @@ -463,99 +463,109 @@ void putch(char ch) { 3f92: 08 95 ret 00003f94 <getch>: + [uartBit] "I" (UART_RX_BIT) + : + "r25" +); +#else + while(!(UCSR0A & _BV(RXC0))) + 3f94: 80 91 c0 00 lds r24, 0x00C0 + 3f98: 87 ff sbrs r24, 7 + 3f9a: fc cf rjmp .-8 ; 0x3f94 <getch> + ; + if (!(UCSR0A & _BV(FE0))) { + 3f9c: 80 91 c0 00 lds r24, 0x00C0 + 3fa0: 84 fd sbrc r24, 4 + 3fa2: 01 c0 rjmp .+2 ; 0x3fa6 <getch+0x12> } #endif // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( - 3f94: a8 95 wdr - [uartBit] "I" (UART_RX_BIT) - : - "r25" -); -#else - while(!(UCSR0A & _BV(RXC0))); - 3f96: 80 91 c0 00 lds r24, 0x00C0 - 3f9a: 87 ff sbrs r24, 7 - 3f9c: fc cf rjmp .-8 ; 0x3f96 <getch+0x2> + 3fa4: a8 95 wdr + * don't care that an invalid char is returned...) + */ + watchdogReset(); + } + ch = UDR0; - 3f9e: 80 91 c6 00 lds r24, 0x00C6 + 3fa6: 80 91 c6 00 lds r24, 0x00C6 LED_PIN |= _BV(LED); #endif #endif return ch; } - 3fa2: 08 95 ret + 3faa: 08 95 ret -00003fa4 <watchdogConfig>: +00003fac <watchdogConfig>: "wdr\n" ); } void watchdogConfig(uint8_t x) { WDTCSR = _BV(WDCE) | _BV(WDE); - 3fa4: e0 e6 ldi r30, 0x60 ; 96 - 3fa6: f0 e0 ldi r31, 0x00 ; 0 - 3fa8: 98 e1 ldi r25, 0x18 ; 24 - 3faa: 90 83 st Z, r25 + 3fac: e0 e6 ldi r30, 0x60 ; 96 + 3fae: f0 e0 ldi r31, 0x00 ; 0 + 3fb0: 98 e1 ldi r25, 0x18 ; 24 + 3fb2: 90 83 st Z, r25 WDTCSR = x; - 3fac: 80 83 st Z, r24 + 3fb4: 80 83 st Z, r24 } - 3fae: 08 95 ret + 3fb6: 08 95 ret -00003fb0 <verifySpace>: +00003fb8 <verifySpace>: do getch(); while (--count); verifySpace(); } void verifySpace() { if (getch() != CRC_EOP) { - 3fb0: f1 df rcall .-30 ; 0x3f94 <getch> - 3fb2: 80 32 cpi r24, 0x20 ; 32 - 3fb4: 19 f0 breq .+6 ; 0x3fbc <verifySpace+0xc> + 3fb8: ed df rcall .-38 ; 0x3f94 <getch> + 3fba: 80 32 cpi r24, 0x20 ; 32 + 3fbc: 19 f0 breq .+6 ; 0x3fc4 <verifySpace+0xc> watchdogConfig(WATCHDOG_16MS); // shorten WD timeout - 3fb6: 88 e0 ldi r24, 0x08 ; 8 - 3fb8: f5 df rcall .-22 ; 0x3fa4 <watchdogConfig> - 3fba: ff cf rjmp .-2 ; 0x3fba <verifySpace+0xa> + 3fbe: 88 e0 ldi r24, 0x08 ; 8 + 3fc0: f5 df rcall .-22 ; 0x3fac <watchdogConfig> + 3fc2: ff cf rjmp .-2 ; 0x3fc2 <verifySpace+0xa> while (1) // and busy-loop so that WD causes ; // a reset and app start. } putch(STK_INSYNC); - 3fbc: 84 e1 ldi r24, 0x14 ; 20 + 3fc4: 84 e1 ldi r24, 0x14 ; 20 } - 3fbe: e2 cf rjmp .-60 ; 0x3f84 <putch> + 3fc6: de cf rjmp .-68 ; 0x3f84 <putch> -00003fc0 <getNch>: +00003fc8 <getNch>: ::[count] "M" (UART_B_VALUE) ); } #endif void getNch(uint8_t count) { - 3fc0: 1f 93 push r17 - 3fc2: 18 2f mov r17, r24 + 3fc8: 1f 93 push r17 + 3fca: 18 2f mov r17, r24 do getch(); while (--count); - 3fc4: e7 df rcall .-50 ; 0x3f94 <getch> - 3fc6: 11 50 subi r17, 0x01 ; 1 - 3fc8: e9 f7 brne .-6 ; 0x3fc4 <getNch+0x4> + 3fcc: e3 df rcall .-58 ; 0x3f94 <getch> + 3fce: 11 50 subi r17, 0x01 ; 1 + 3fd0: e9 f7 brne .-6 ; 0x3fcc <getNch+0x4> verifySpace(); - 3fca: f2 df rcall .-28 ; 0x3fb0 <verifySpace> + 3fd2: f2 df rcall .-28 ; 0x3fb8 <verifySpace> } - 3fcc: 1f 91 pop r17 - 3fce: 08 95 ret + 3fd4: 1f 91 pop r17 + 3fd6: 08 95 ret -00003fd0 <appStart>: +00003fd8 <appStart>: WDTCSR = _BV(WDCE) | _BV(WDE); WDTCSR = x; } void appStart() { watchdogConfig(WATCHDOG_OFF); - 3fd0: 80 e0 ldi r24, 0x00 ; 0 - 3fd2: e8 df rcall .-48 ; 0x3fa4 <watchdogConfig> + 3fd8: 80 e0 ldi r24, 0x00 ; 0 + 3fda: e8 df rcall .-48 ; 0x3fac <watchdogConfig> __asm__ __volatile__ ( - 3fd4: ee 27 eor r30, r30 - 3fd6: ff 27 eor r31, r31 - 3fd8: 09 94 ijmp + 3fdc: ee 27 eor r30, r30 + 3fde: ff 27 eor r31, r31 + 3fe0: 09 94 ijmp diff --git a/bootloaders/optiboot/optiboot_lilypad.hex b/bootloaders/optiboot/optiboot_lilypad.hex index 00f7a38..2c63395 100644 --- a/bootloaders/optiboot/optiboot_lilypad.hex +++ b/bootloaders/optiboot/optiboot_lilypad.hex @@ -1,33 +1,34 @@ -:103E0000112484B714BE81FFE3D085E08093810044
+:103E0000112484B714BE81FFE7D085E08093810040
:103E100082E08093C00088E18093C10086E08093B7
-:103E2000C20088E08093C4008EE0BCD0259A86E072
+:103E2000C20088E08093C4008EE0C0D0259A86E06E
:103E300028E13EEF91E0309385002093840096BB0B
:103E4000B09BFECF1D9AA8958150A9F79924939411
:103E5000A5E0AA2EF1E1BF2E9DD0813421F481E0AE
-:103E6000AFD083E01FC0823411F484E103C08534F5
-:103E700019F485E0A5D083C0853579F48BD0E82E80
+:103E6000B3D083E01FC0823411F484E103C08534F1
+:103E700019F485E0A9D083C0853579F48BD0E82E7C
:103E8000FF2488D0082F10E0102F00270E291F29AB
-:103E9000000F111F8DD0680172C0863529F484E0AF
-:103EA0008FD080E06FD06BC0843609F042C072D0F2
+:103E9000000F111F91D0680172C0863529F484E0AB
+:103EA00093D080E06FD06BC0843609F042C072D0EE
:103EB00071D0082F6FD080E0C81688E3D80620F4B0
:103EC00083E0F60187BFE895C0E0D1E063D0899335
:103ED0000C17E1F7F0E0CF16F8E3DF0620F083E0FF
-:103EE000F60187BFE89564D007B600FCFDCFA601B8
+:103EE000F60187BFE89568D007B600FCFDCFA601B4
:103EF000A0E0B1E02C9130E011968C91119790E008
:103F0000982F8827822B932B1296FA010C0197BECB
:103F1000E89511244E5F5F4FF1E0A038BF0751F7DD
:103F2000F601A7BEE89507B600FCFDCFB7BEE89541
-:103F300026C08437B1F42ED02DD0F82E2BD038D017
+:103F300026C08437B1F42ED02DD0F82E2BD03CD013
:103F4000F601EF2C8F010F5F1F4F84911BD0EA9475
:103F5000F801C1F70894C11CD11CFA94CF0CD11CF4
-:103F60000EC0853739F424D08EE10CD084E90AD014
-:103F700086E098CF813511F488E014D019D080E123
+:103F60000EC0853739F428D08EE10CD084E90AD010
+:103F700086E098CF813511F488E018D01DD080E11B
:103F800001D06ACF982F8091C00085FFFCCF90931D
-:103F9000C6000895A8958091C00087FFFCCF80914E
-:103FA000C6000895E0E6F0E098E1908380830895EC
-:103FB000F1DF803219F088E0F5DFFFCF84E1E2CF56
-:103FC0001F93182FE7DF1150E9F7F2DF1F910895D3
-:0A3FD00080E0E8DFEE27FF270994E8
-:023FFE000204BB
+:103F9000C60008958091C00087FFFCCF8091C000CB
+:103FA00084FD01C0A8958091C6000895E0E6F0E088
+:103FB00098E1908380830895EDDF803219F088E0E6
+:103FC000F5DFFFCF84E1DECF1F93182FE3DF115021
+:103FD000E9F7F2DF1F91089580E0E8DFEE27FF2781
+:023FE000099442
+:023FFE000304BA
:0400000300003E00BB
:00000001FF
diff --git a/bootloaders/optiboot/optiboot_lilypad.lst b/bootloaders/optiboot/optiboot_lilypad.lst index 4cebc2e..425cbf4 100644 --- a/bootloaders/optiboot/optiboot_lilypad.lst +++ b/bootloaders/optiboot/optiboot_lilypad.lst @@ -3,27 +3,27 @@ optiboot_lilypad.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn - 0 .text 000001da 00003e00 00003e00 00000054 2**1 + 0 .text 000001e2 00003e00 00003e00 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .version 00000002 00003ffe 00003ffe 0000022e 2**0 + 1 .version 00000002 00003ffe 00003ffe 00000236 2**0 CONTENTS, READONLY - 2 .debug_aranges 00000028 00000000 00000000 00000230 2**0 + 2 .debug_aranges 00000028 00000000 00000000 00000238 2**0 CONTENTS, READONLY, DEBUGGING - 3 .debug_pubnames 0000005f 00000000 00000000 00000258 2**0 + 3 .debug_pubnames 0000005f 00000000 00000000 00000260 2**0 CONTENTS, READONLY, DEBUGGING - 4 .debug_info 0000028d 00000000 00000000 000002b7 2**0 + 4 .debug_info 0000028e 00000000 00000000 000002bf 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_abbrev 0000018a 00000000 00000000 00000544 2**0 + 5 .debug_abbrev 00000171 00000000 00000000 0000054d 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_line 00000456 00000000 00000000 000006ce 2**0 + 6 .debug_line 0000045e 00000000 00000000 000006be 2**0 CONTENTS, READONLY, DEBUGGING - 7 .debug_frame 00000080 00000000 00000000 00000b24 2**2 + 7 .debug_frame 00000080 00000000 00000000 00000b1c 2**2 CONTENTS, READONLY, DEBUGGING - 8 .debug_str 00000149 00000000 00000000 00000ba4 2**0 + 8 .debug_str 00000149 00000000 00000000 00000b9c 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_loc 0000027e 00000000 00000000 00000ced 2**0 + 9 .debug_loc 0000027e 00000000 00000000 00000ce5 2**0 CONTENTS, READONLY, DEBUGGING - 10 .debug_ranges 00000060 00000000 00000000 00000f6b 2**0 + 10 .debug_ranges 00000060 00000000 00000000 00000f63 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: @@ -47,7 +47,7 @@ int main(void) { 3e04: 14 be out 0x34, r1 ; 52 if (!(ch & _BV(EXTRF))) appStart(); 3e06: 81 ff sbrs r24, 1 - 3e08: e3 d0 rcall .+454 ; 0x3fd0 <appStart> + 3e08: e7 d0 rcall .+462 ; 0x3fd8 <appStart> #if LED_START_FLASHES > 0 // Set up Timer 1 for timeout counter @@ -77,7 +77,7 @@ int main(void) { // Set up watchdog to trigger after 500ms watchdogConfig(WATCHDOG_1S); 3e28: 8e e0 ldi r24, 0x0E ; 14 - 3e2a: bc d0 rcall .+376 ; 0x3fa4 <watchdogConfig> + 3e2a: c0 d0 rcall .+384 ; 0x3fac <watchdogConfig> /* Set LED pin as output */ LED_DDR |= _BV(LED); @@ -163,7 +163,7 @@ void watchdogReset() { // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy getNch(1); 3e5e: 81 e0 ldi r24, 0x01 ; 1 - 3e60: af d0 rcall .+350 ; 0x3fc0 <getNch> + 3e60: b3 d0 rcall .+358 ; 0x3fc8 <getNch> putch(0x03); 3e62: 83 e0 ldi r24, 0x03 ; 3 3e64: 1f c0 rjmp .+62 ; 0x3ea4 <main+0xa4> @@ -182,7 +182,7 @@ void watchdogReset() { // SET DEVICE EXT is ignored getNch(5); 3e72: 85 e0 ldi r24, 0x05 ; 5 - 3e74: a5 d0 rcall .+330 ; 0x3fc0 <getNch> + 3e74: a9 d0 rcall .+338 ; 0x3fc8 <getNch> 3e76: 83 c0 rjmp .+262 ; 0x3f7e <main+0x17e> } else if(ch == STK_LOAD_ADDRESS) { @@ -211,7 +211,7 @@ void watchdogReset() { 3e92: 11 1f adc r17, r17 address = newAddress; verifySpace(); - 3e94: 8d d0 rcall .+282 ; 0x3fb0 <verifySpace> + 3e94: 91 d0 rcall .+290 ; 0x3fb8 <verifySpace> 3e96: 68 01 movw r12, r16 3e98: 72 c0 rjmp .+228 ; 0x3f7e <main+0x17e> } @@ -221,7 +221,7 @@ void watchdogReset() { // UNIVERSAL command is ignored getNch(4); 3e9e: 84 e0 ldi r24, 0x04 ; 4 - 3ea0: 8f d0 rcall .+286 ; 0x3fc0 <getNch> + 3ea0: 93 d0 rcall .+294 ; 0x3fc8 <getNch> putch(0x00); 3ea2: 80 e0 ldi r24, 0x00 ; 0 3ea4: 6f d0 rcall .+222 ; 0x3f84 <putch> @@ -282,7 +282,7 @@ void watchdogReset() { // Read command terminator, start reply verifySpace(); - 3ee6: 64 d0 rcall .+200 ; 0x3fb0 <verifySpace> + 3ee6: 68 d0 rcall .+208 ; 0x3fb8 <verifySpace> // If only a partial page is to be programmed, the erase might not be complete. // So check that here @@ -370,7 +370,7 @@ int main(void) { 3f3c: 2b d0 rcall .+86 ; 0x3f94 <getch> verifySpace(); - 3f3e: 38 d0 rcall .+112 ; 0x3fb0 <verifySpace> + 3f3e: 3c d0 rcall .+120 ; 0x3fb8 <verifySpace> 3f40: f6 01 movw r30, r12 3f42: ef 2c mov r14, r15 putch(result); @@ -411,7 +411,7 @@ int main(void) { 3f64: 39 f4 brne .+14 ; 0x3f74 <main+0x174> // READ SIGN - return what Avrdude wants to hear verifySpace(); - 3f66: 24 d0 rcall .+72 ; 0x3fb0 <verifySpace> + 3f66: 28 d0 rcall .+80 ; 0x3fb8 <verifySpace> putch(SIGNATURE_0); 3f68: 8e e1 ldi r24, 0x1E ; 30 3f6a: 0c d0 rcall .+24 ; 0x3f84 <putch> @@ -428,13 +428,13 @@ int main(void) { // Adaboot no-wait mod watchdogConfig(WATCHDOG_16MS); 3f78: 88 e0 ldi r24, 0x08 ; 8 - 3f7a: 14 d0 rcall .+40 ; 0x3fa4 <watchdogConfig> + 3f7a: 18 d0 rcall .+48 ; 0x3fac <watchdogConfig> verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); - 3f7c: 19 d0 rcall .+50 ; 0x3fb0 <verifySpace> + 3f7c: 1d d0 rcall .+58 ; 0x3fb8 <verifySpace> } putch(STK_OK); 3f7e: 80 e1 ldi r24, 0x10 ; 16 @@ -463,99 +463,109 @@ void putch(char ch) { 3f92: 08 95 ret 00003f94 <getch>: + [uartBit] "I" (UART_RX_BIT) + : + "r25" +); +#else + while(!(UCSR0A & _BV(RXC0))) + 3f94: 80 91 c0 00 lds r24, 0x00C0 + 3f98: 87 ff sbrs r24, 7 + 3f9a: fc cf rjmp .-8 ; 0x3f94 <getch> + ; + if (!(UCSR0A & _BV(FE0))) { + 3f9c: 80 91 c0 00 lds r24, 0x00C0 + 3fa0: 84 fd sbrc r24, 4 + 3fa2: 01 c0 rjmp .+2 ; 0x3fa6 <getch+0x12> } #endif // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( - 3f94: a8 95 wdr - [uartBit] "I" (UART_RX_BIT) - : - "r25" -); -#else - while(!(UCSR0A & _BV(RXC0))); - 3f96: 80 91 c0 00 lds r24, 0x00C0 - 3f9a: 87 ff sbrs r24, 7 - 3f9c: fc cf rjmp .-8 ; 0x3f96 <getch+0x2> + 3fa4: a8 95 wdr + * don't care that an invalid char is returned...) + */ + watchdogReset(); + } + ch = UDR0; - 3f9e: 80 91 c6 00 lds r24, 0x00C6 + 3fa6: 80 91 c6 00 lds r24, 0x00C6 LED_PIN |= _BV(LED); #endif #endif return ch; } - 3fa2: 08 95 ret + 3faa: 08 95 ret -00003fa4 <watchdogConfig>: +00003fac <watchdogConfig>: "wdr\n" ); } void watchdogConfig(uint8_t x) { WDTCSR = _BV(WDCE) | _BV(WDE); - 3fa4: e0 e6 ldi r30, 0x60 ; 96 - 3fa6: f0 e0 ldi r31, 0x00 ; 0 - 3fa8: 98 e1 ldi r25, 0x18 ; 24 - 3faa: 90 83 st Z, r25 + 3fac: e0 e6 ldi r30, 0x60 ; 96 + 3fae: f0 e0 ldi r31, 0x00 ; 0 + 3fb0: 98 e1 ldi r25, 0x18 ; 24 + 3fb2: 90 83 st Z, r25 WDTCSR = x; - 3fac: 80 83 st Z, r24 + 3fb4: 80 83 st Z, r24 } - 3fae: 08 95 ret + 3fb6: 08 95 ret -00003fb0 <verifySpace>: +00003fb8 <verifySpace>: do getch(); while (--count); verifySpace(); } void verifySpace() { if (getch() != CRC_EOP) { - 3fb0: f1 df rcall .-30 ; 0x3f94 <getch> - 3fb2: 80 32 cpi r24, 0x20 ; 32 - 3fb4: 19 f0 breq .+6 ; 0x3fbc <verifySpace+0xc> + 3fb8: ed df rcall .-38 ; 0x3f94 <getch> + 3fba: 80 32 cpi r24, 0x20 ; 32 + 3fbc: 19 f0 breq .+6 ; 0x3fc4 <verifySpace+0xc> watchdogConfig(WATCHDOG_16MS); // shorten WD timeout - 3fb6: 88 e0 ldi r24, 0x08 ; 8 - 3fb8: f5 df rcall .-22 ; 0x3fa4 <watchdogConfig> - 3fba: ff cf rjmp .-2 ; 0x3fba <verifySpace+0xa> + 3fbe: 88 e0 ldi r24, 0x08 ; 8 + 3fc0: f5 df rcall .-22 ; 0x3fac <watchdogConfig> + 3fc2: ff cf rjmp .-2 ; 0x3fc2 <verifySpace+0xa> while (1) // and busy-loop so that WD causes ; // a reset and app start. } putch(STK_INSYNC); - 3fbc: 84 e1 ldi r24, 0x14 ; 20 + 3fc4: 84 e1 ldi r24, 0x14 ; 20 } - 3fbe: e2 cf rjmp .-60 ; 0x3f84 <putch> + 3fc6: de cf rjmp .-68 ; 0x3f84 <putch> -00003fc0 <getNch>: +00003fc8 <getNch>: ::[count] "M" (UART_B_VALUE) ); } #endif void getNch(uint8_t count) { - 3fc0: 1f 93 push r17 - 3fc2: 18 2f mov r17, r24 + 3fc8: 1f 93 push r17 + 3fca: 18 2f mov r17, r24 do getch(); while (--count); - 3fc4: e7 df rcall .-50 ; 0x3f94 <getch> - 3fc6: 11 50 subi r17, 0x01 ; 1 - 3fc8: e9 f7 brne .-6 ; 0x3fc4 <getNch+0x4> + 3fcc: e3 df rcall .-58 ; 0x3f94 <getch> + 3fce: 11 50 subi r17, 0x01 ; 1 + 3fd0: e9 f7 brne .-6 ; 0x3fcc <getNch+0x4> verifySpace(); - 3fca: f2 df rcall .-28 ; 0x3fb0 <verifySpace> + 3fd2: f2 df rcall .-28 ; 0x3fb8 <verifySpace> } - 3fcc: 1f 91 pop r17 - 3fce: 08 95 ret + 3fd4: 1f 91 pop r17 + 3fd6: 08 95 ret -00003fd0 <appStart>: +00003fd8 <appStart>: WDTCSR = _BV(WDCE) | _BV(WDE); WDTCSR = x; } void appStart() { watchdogConfig(WATCHDOG_OFF); - 3fd0: 80 e0 ldi r24, 0x00 ; 0 - 3fd2: e8 df rcall .-48 ; 0x3fa4 <watchdogConfig> + 3fd8: 80 e0 ldi r24, 0x00 ; 0 + 3fda: e8 df rcall .-48 ; 0x3fac <watchdogConfig> __asm__ __volatile__ ( - 3fd4: ee 27 eor r30, r30 - 3fd6: ff 27 eor r31, r31 - 3fd8: 09 94 ijmp + 3fdc: ee 27 eor r30, r30 + 3fde: ff 27 eor r31, r31 + 3fe0: 09 94 ijmp diff --git a/bootloaders/optiboot/optiboot_lilypad_resonator.hex b/bootloaders/optiboot/optiboot_lilypad_resonator.hex index 00f7a38..2c63395 100644 --- a/bootloaders/optiboot/optiboot_lilypad_resonator.hex +++ b/bootloaders/optiboot/optiboot_lilypad_resonator.hex @@ -1,33 +1,34 @@ -:103E0000112484B714BE81FFE3D085E08093810044
+:103E0000112484B714BE81FFE7D085E08093810040
:103E100082E08093C00088E18093C10086E08093B7
-:103E2000C20088E08093C4008EE0BCD0259A86E072
+:103E2000C20088E08093C4008EE0C0D0259A86E06E
:103E300028E13EEF91E0309385002093840096BB0B
:103E4000B09BFECF1D9AA8958150A9F79924939411
:103E5000A5E0AA2EF1E1BF2E9DD0813421F481E0AE
-:103E6000AFD083E01FC0823411F484E103C08534F5
-:103E700019F485E0A5D083C0853579F48BD0E82E80
+:103E6000B3D083E01FC0823411F484E103C08534F1
+:103E700019F485E0A9D083C0853579F48BD0E82E7C
:103E8000FF2488D0082F10E0102F00270E291F29AB
-:103E9000000F111F8DD0680172C0863529F484E0AF
-:103EA0008FD080E06FD06BC0843609F042C072D0F2
+:103E9000000F111F91D0680172C0863529F484E0AB
+:103EA00093D080E06FD06BC0843609F042C072D0EE
:103EB00071D0082F6FD080E0C81688E3D80620F4B0
:103EC00083E0F60187BFE895C0E0D1E063D0899335
:103ED0000C17E1F7F0E0CF16F8E3DF0620F083E0FF
-:103EE000F60187BFE89564D007B600FCFDCFA601B8
+:103EE000F60187BFE89568D007B600FCFDCFA601B4
:103EF000A0E0B1E02C9130E011968C91119790E008
:103F0000982F8827822B932B1296FA010C0197BECB
:103F1000E89511244E5F5F4FF1E0A038BF0751F7DD
:103F2000F601A7BEE89507B600FCFDCFB7BEE89541
-:103F300026C08437B1F42ED02DD0F82E2BD038D017
+:103F300026C08437B1F42ED02DD0F82E2BD03CD013
:103F4000F601EF2C8F010F5F1F4F84911BD0EA9475
:103F5000F801C1F70894C11CD11CFA94CF0CD11CF4
-:103F60000EC0853739F424D08EE10CD084E90AD014
-:103F700086E098CF813511F488E014D019D080E123
+:103F60000EC0853739F428D08EE10CD084E90AD010
+:103F700086E098CF813511F488E018D01DD080E11B
:103F800001D06ACF982F8091C00085FFFCCF90931D
-:103F9000C6000895A8958091C00087FFFCCF80914E
-:103FA000C6000895E0E6F0E098E1908380830895EC
-:103FB000F1DF803219F088E0F5DFFFCF84E1E2CF56
-:103FC0001F93182FE7DF1150E9F7F2DF1F910895D3
-:0A3FD00080E0E8DFEE27FF270994E8
-:023FFE000204BB
+:103F9000C60008958091C00087FFFCCF8091C000CB
+:103FA00084FD01C0A8958091C6000895E0E6F0E088
+:103FB00098E1908380830895EDDF803219F088E0E6
+:103FC000F5DFFFCF84E1DECF1F93182FE3DF115021
+:103FD000E9F7F2DF1F91089580E0E8DFEE27FF2781
+:023FE000099442
+:023FFE000304BA
:0400000300003E00BB
:00000001FF
diff --git a/bootloaders/optiboot/optiboot_lilypad_resonator.lst b/bootloaders/optiboot/optiboot_lilypad_resonator.lst index c8d0743..cb0ea83 100644 --- a/bootloaders/optiboot/optiboot_lilypad_resonator.lst +++ b/bootloaders/optiboot/optiboot_lilypad_resonator.lst @@ -3,27 +3,27 @@ optiboot_lilypad_resonator.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn - 0 .text 000001da 00003e00 00003e00 00000054 2**1 + 0 .text 000001e2 00003e00 00003e00 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .version 00000002 00003ffe 00003ffe 0000022e 2**0 + 1 .version 00000002 00003ffe 00003ffe 00000236 2**0 CONTENTS, READONLY - 2 .debug_aranges 00000028 00000000 00000000 00000230 2**0 + 2 .debug_aranges 00000028 00000000 00000000 00000238 2**0 CONTENTS, READONLY, DEBUGGING - 3 .debug_pubnames 0000005f 00000000 00000000 00000258 2**0 + 3 .debug_pubnames 0000005f 00000000 00000000 00000260 2**0 CONTENTS, READONLY, DEBUGGING - 4 .debug_info 0000028d 00000000 00000000 000002b7 2**0 + 4 .debug_info 0000028e 00000000 00000000 000002bf 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_abbrev 0000018a 00000000 00000000 00000544 2**0 + 5 .debug_abbrev 00000171 00000000 00000000 0000054d 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_line 00000456 00000000 00000000 000006ce 2**0 + 6 .debug_line 0000045e 00000000 00000000 000006be 2**0 CONTENTS, READONLY, DEBUGGING - 7 .debug_frame 00000080 00000000 00000000 00000b24 2**2 + 7 .debug_frame 00000080 00000000 00000000 00000b1c 2**2 CONTENTS, READONLY, DEBUGGING - 8 .debug_str 00000149 00000000 00000000 00000ba4 2**0 + 8 .debug_str 00000149 00000000 00000000 00000b9c 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_loc 0000027e 00000000 00000000 00000ced 2**0 + 9 .debug_loc 0000027e 00000000 00000000 00000ce5 2**0 CONTENTS, READONLY, DEBUGGING - 10 .debug_ranges 00000060 00000000 00000000 00000f6b 2**0 + 10 .debug_ranges 00000060 00000000 00000000 00000f63 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: @@ -47,7 +47,7 @@ int main(void) { 3e04: 14 be out 0x34, r1 ; 52 if (!(ch & _BV(EXTRF))) appStart(); 3e06: 81 ff sbrs r24, 1 - 3e08: e3 d0 rcall .+454 ; 0x3fd0 <appStart> + 3e08: e7 d0 rcall .+462 ; 0x3fd8 <appStart> #if LED_START_FLASHES > 0 // Set up Timer 1 for timeout counter @@ -77,7 +77,7 @@ int main(void) { // Set up watchdog to trigger after 500ms watchdogConfig(WATCHDOG_1S); 3e28: 8e e0 ldi r24, 0x0E ; 14 - 3e2a: bc d0 rcall .+376 ; 0x3fa4 <watchdogConfig> + 3e2a: c0 d0 rcall .+384 ; 0x3fac <watchdogConfig> /* Set LED pin as output */ LED_DDR |= _BV(LED); @@ -163,7 +163,7 @@ void watchdogReset() { // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy getNch(1); 3e5e: 81 e0 ldi r24, 0x01 ; 1 - 3e60: af d0 rcall .+350 ; 0x3fc0 <getNch> + 3e60: b3 d0 rcall .+358 ; 0x3fc8 <getNch> putch(0x03); 3e62: 83 e0 ldi r24, 0x03 ; 3 3e64: 1f c0 rjmp .+62 ; 0x3ea4 <main+0xa4> @@ -182,7 +182,7 @@ void watchdogReset() { // SET DEVICE EXT is ignored getNch(5); 3e72: 85 e0 ldi r24, 0x05 ; 5 - 3e74: a5 d0 rcall .+330 ; 0x3fc0 <getNch> + 3e74: a9 d0 rcall .+338 ; 0x3fc8 <getNch> 3e76: 83 c0 rjmp .+262 ; 0x3f7e <main+0x17e> } else if(ch == STK_LOAD_ADDRESS) { @@ -211,7 +211,7 @@ void watchdogReset() { 3e92: 11 1f adc r17, r17 address = newAddress; verifySpace(); - 3e94: 8d d0 rcall .+282 ; 0x3fb0 <verifySpace> + 3e94: 91 d0 rcall .+290 ; 0x3fb8 <verifySpace> 3e96: 68 01 movw r12, r16 3e98: 72 c0 rjmp .+228 ; 0x3f7e <main+0x17e> } @@ -221,7 +221,7 @@ void watchdogReset() { // UNIVERSAL command is ignored getNch(4); 3e9e: 84 e0 ldi r24, 0x04 ; 4 - 3ea0: 8f d0 rcall .+286 ; 0x3fc0 <getNch> + 3ea0: 93 d0 rcall .+294 ; 0x3fc8 <getNch> putch(0x00); 3ea2: 80 e0 ldi r24, 0x00 ; 0 3ea4: 6f d0 rcall .+222 ; 0x3f84 <putch> @@ -282,7 +282,7 @@ void watchdogReset() { // Read command terminator, start reply verifySpace(); - 3ee6: 64 d0 rcall .+200 ; 0x3fb0 <verifySpace> + 3ee6: 68 d0 rcall .+208 ; 0x3fb8 <verifySpace> // If only a partial page is to be programmed, the erase might not be complete. // So check that here @@ -370,7 +370,7 @@ int main(void) { 3f3c: 2b d0 rcall .+86 ; 0x3f94 <getch> verifySpace(); - 3f3e: 38 d0 rcall .+112 ; 0x3fb0 <verifySpace> + 3f3e: 3c d0 rcall .+120 ; 0x3fb8 <verifySpace> 3f40: f6 01 movw r30, r12 3f42: ef 2c mov r14, r15 putch(result); @@ -411,7 +411,7 @@ int main(void) { 3f64: 39 f4 brne .+14 ; 0x3f74 <main+0x174> // READ SIGN - return what Avrdude wants to hear verifySpace(); - 3f66: 24 d0 rcall .+72 ; 0x3fb0 <verifySpace> + 3f66: 28 d0 rcall .+80 ; 0x3fb8 <verifySpace> putch(SIGNATURE_0); 3f68: 8e e1 ldi r24, 0x1E ; 30 3f6a: 0c d0 rcall .+24 ; 0x3f84 <putch> @@ -428,13 +428,13 @@ int main(void) { // Adaboot no-wait mod watchdogConfig(WATCHDOG_16MS); 3f78: 88 e0 ldi r24, 0x08 ; 8 - 3f7a: 14 d0 rcall .+40 ; 0x3fa4 <watchdogConfig> + 3f7a: 18 d0 rcall .+48 ; 0x3fac <watchdogConfig> verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); - 3f7c: 19 d0 rcall .+50 ; 0x3fb0 <verifySpace> + 3f7c: 1d d0 rcall .+58 ; 0x3fb8 <verifySpace> } putch(STK_OK); 3f7e: 80 e1 ldi r24, 0x10 ; 16 @@ -463,99 +463,109 @@ void putch(char ch) { 3f92: 08 95 ret 00003f94 <getch>: + [uartBit] "I" (UART_RX_BIT) + : + "r25" +); +#else + while(!(UCSR0A & _BV(RXC0))) + 3f94: 80 91 c0 00 lds r24, 0x00C0 + 3f98: 87 ff sbrs r24, 7 + 3f9a: fc cf rjmp .-8 ; 0x3f94 <getch> + ; + if (!(UCSR0A & _BV(FE0))) { + 3f9c: 80 91 c0 00 lds r24, 0x00C0 + 3fa0: 84 fd sbrc r24, 4 + 3fa2: 01 c0 rjmp .+2 ; 0x3fa6 <getch+0x12> } #endif // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( - 3f94: a8 95 wdr - [uartBit] "I" (UART_RX_BIT) - : - "r25" -); -#else - while(!(UCSR0A & _BV(RXC0))); - 3f96: 80 91 c0 00 lds r24, 0x00C0 - 3f9a: 87 ff sbrs r24, 7 - 3f9c: fc cf rjmp .-8 ; 0x3f96 <getch+0x2> + 3fa4: a8 95 wdr + * don't care that an invalid char is returned...) + */ + watchdogReset(); + } + ch = UDR0; - 3f9e: 80 91 c6 00 lds r24, 0x00C6 + 3fa6: 80 91 c6 00 lds r24, 0x00C6 LED_PIN |= _BV(LED); #endif #endif return ch; } - 3fa2: 08 95 ret + 3faa: 08 95 ret -00003fa4 <watchdogConfig>: +00003fac <watchdogConfig>: "wdr\n" ); } void watchdogConfig(uint8_t x) { WDTCSR = _BV(WDCE) | _BV(WDE); - 3fa4: e0 e6 ldi r30, 0x60 ; 96 - 3fa6: f0 e0 ldi r31, 0x00 ; 0 - 3fa8: 98 e1 ldi r25, 0x18 ; 24 - 3faa: 90 83 st Z, r25 + 3fac: e0 e6 ldi r30, 0x60 ; 96 + 3fae: f0 e0 ldi r31, 0x00 ; 0 + 3fb0: 98 e1 ldi r25, 0x18 ; 24 + 3fb2: 90 83 st Z, r25 WDTCSR = x; - 3fac: 80 83 st Z, r24 + 3fb4: 80 83 st Z, r24 } - 3fae: 08 95 ret + 3fb6: 08 95 ret -00003fb0 <verifySpace>: +00003fb8 <verifySpace>: do getch(); while (--count); verifySpace(); } void verifySpace() { if (getch() != CRC_EOP) { - 3fb0: f1 df rcall .-30 ; 0x3f94 <getch> - 3fb2: 80 32 cpi r24, 0x20 ; 32 - 3fb4: 19 f0 breq .+6 ; 0x3fbc <verifySpace+0xc> + 3fb8: ed df rcall .-38 ; 0x3f94 <getch> + 3fba: 80 32 cpi r24, 0x20 ; 32 + 3fbc: 19 f0 breq .+6 ; 0x3fc4 <verifySpace+0xc> watchdogConfig(WATCHDOG_16MS); // shorten WD timeout - 3fb6: 88 e0 ldi r24, 0x08 ; 8 - 3fb8: f5 df rcall .-22 ; 0x3fa4 <watchdogConfig> - 3fba: ff cf rjmp .-2 ; 0x3fba <verifySpace+0xa> + 3fbe: 88 e0 ldi r24, 0x08 ; 8 + 3fc0: f5 df rcall .-22 ; 0x3fac <watchdogConfig> + 3fc2: ff cf rjmp .-2 ; 0x3fc2 <verifySpace+0xa> while (1) // and busy-loop so that WD causes ; // a reset and app start. } putch(STK_INSYNC); - 3fbc: 84 e1 ldi r24, 0x14 ; 20 + 3fc4: 84 e1 ldi r24, 0x14 ; 20 } - 3fbe: e2 cf rjmp .-60 ; 0x3f84 <putch> + 3fc6: de cf rjmp .-68 ; 0x3f84 <putch> -00003fc0 <getNch>: +00003fc8 <getNch>: ::[count] "M" (UART_B_VALUE) ); } #endif void getNch(uint8_t count) { - 3fc0: 1f 93 push r17 - 3fc2: 18 2f mov r17, r24 + 3fc8: 1f 93 push r17 + 3fca: 18 2f mov r17, r24 do getch(); while (--count); - 3fc4: e7 df rcall .-50 ; 0x3f94 <getch> - 3fc6: 11 50 subi r17, 0x01 ; 1 - 3fc8: e9 f7 brne .-6 ; 0x3fc4 <getNch+0x4> + 3fcc: e3 df rcall .-58 ; 0x3f94 <getch> + 3fce: 11 50 subi r17, 0x01 ; 1 + 3fd0: e9 f7 brne .-6 ; 0x3fcc <getNch+0x4> verifySpace(); - 3fca: f2 df rcall .-28 ; 0x3fb0 <verifySpace> + 3fd2: f2 df rcall .-28 ; 0x3fb8 <verifySpace> } - 3fcc: 1f 91 pop r17 - 3fce: 08 95 ret + 3fd4: 1f 91 pop r17 + 3fd6: 08 95 ret -00003fd0 <appStart>: +00003fd8 <appStart>: WDTCSR = _BV(WDCE) | _BV(WDE); WDTCSR = x; } void appStart() { watchdogConfig(WATCHDOG_OFF); - 3fd0: 80 e0 ldi r24, 0x00 ; 0 - 3fd2: e8 df rcall .-48 ; 0x3fa4 <watchdogConfig> + 3fd8: 80 e0 ldi r24, 0x00 ; 0 + 3fda: e8 df rcall .-48 ; 0x3fac <watchdogConfig> __asm__ __volatile__ ( - 3fd4: ee 27 eor r30, r30 - 3fd6: ff 27 eor r31, r31 - 3fd8: 09 94 ijmp + 3fdc: ee 27 eor r30, r30 + 3fde: ff 27 eor r31, r31 + 3fe0: 09 94 ijmp diff --git a/bootloaders/optiboot/optiboot_luminet.hex b/bootloaders/optiboot/optiboot_luminet.hex index 78fdc70..45b4dcd 100644 --- a/bootloaders/optiboot/optiboot_luminet.hex +++ b/bootloaders/optiboot/optiboot_luminet.hex @@ -1,14 +1,14 @@ -:101D0000112484B714BE81FF18D185E08EBD8EE00A
-:101D100000D1D49AD29A86E023EC3FEF91E03DBD0A
+:101D0000112484B714BE81FF17D185E08EBD8EE00B
+:101D1000FFD0D49AD29A86E023EC3FEF91E03DBD0C
:101D20002CBD9BB9589BFECFCC9AA8958150B9F792
:101D3000BB24B39425E0A22E9FE7D92E8EECC82EAB
-:101D4000D4D0813421F481E0F0D083E0B5C0823476
-:101D500011F484E103C0853419F485E0E6D0B3C002
+:101D4000D4D0813421F481E0EFD083E0B5C0823477
+:101D500011F484E103C0853419F485E0E5D0B3C003
:101D6000853569F4C2D0E82EFF24BFD0082F10E0DB
:101D7000102F00270E291F29000F111FA3C0863521
-:101D800021F484E0D2D080E097C0843609F060C0AE
+:101D800021F484E0D1D080E097C0843609F060C0AF
:101D9000ACD0ABD0F82EA9D0C0E0D1E0A6D08993CA
-:101DA000FC16E1F783E0F80187BFE895B6D007B6E7
+:101DA000FC16E1F783E0F80187BFE895B5D007B6E8
:101DB00000FCFDCF0115110511F0A8012AC080918A
:101DC00000012091010130E0322F222790E0282BE2
:101DD000392B309385012093840140910801809133
@@ -19,22 +19,22 @@ :101E200090E0982F8827822B932B1296FA010C01B1
:101E3000B7BEE89511244E5F5F4FF1E0A034BF07B5
:101E400051F7F801A7BEE89507B600FCFDCF3BC0EF
-:101E5000843751F54AD049D0F82E47D05ED0E801FA
+:101E5000843751F54AD049D0F82E47D05DD0E801FB
:101E6000EF2C209719F48091840114C0C130D10562
:101E700019F4809185010EC0C830D10519F4809104
:101E8000860108C0C930D10519F48091870102C0CC
:101E9000FE01849121961AD0EA9419F70F5F1F4F23
-:101EA000FA940F0D111D0FC0853741F436D08EE125
+:101EA000FA940F0D111D0FC0853741F435D08EE126
:101EB0000DD083E90BD08CE009D005C0813511F439
-:101EC00088E027D02AD080E101D03ACF2AE030E064
-:101ED0008095089410F4DA9802C0DA9A000015D0C0
-:101EE00014D086952A95B1F70895A89529E030E099
-:101EF000CB99FECF0AD009D008D08894CB9908940A
-:101F00002A9511F08795F7CF08959EE09A95F1F7FD
-:101F1000089598E191BD81BD0895E7DF803219F001
-:101F200088E0F7DFFFCF84E1D1CF1F93182FDDDFEB
-:101F30001150E9F7F2DF1F91089580E0EADFE4E055
-:041F4000FF270994DA
-:021EFE000204DC
+:101EC00088E026D029D080E101D03ACF2AE030E066
+:101ED0008095089410F4DA9802C0DA9A000014D0C1
+:101EE00013D086952A95B1F7089529E030E0CB9973
+:101EF000FECF0AD009D008D08894CB9908942A95AF
+:101F000011F08795F7CF08959EE09A95F1F708951F
+:101F100098E191BD81BD0895E8DF803219F088E035
+:101F2000F7DFFFCF84E1D2CF1F93182FDEDF1150F0
+:101F3000E9F7F2DF1F91089580E0EADFE4E0FF2790
+:021F4000099402
+:021EFE000304DB
:0400000300001D00DC
:00000001FF
diff --git a/bootloaders/optiboot/optiboot_luminet.lst b/bootloaders/optiboot/optiboot_luminet.lst index 447349d..e40e0ef 100644 --- a/bootloaders/optiboot/optiboot_luminet.lst +++ b/bootloaders/optiboot/optiboot_luminet.lst @@ -3,27 +3,27 @@ optiboot_luminet.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn - 0 .text 00000244 00001d00 00001d00 00000054 2**1 + 0 .text 00000242 00001d00 00001d00 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .version 00000002 00001efe 00001efe 00000298 2**0 + 1 .version 00000002 00001efe 00001efe 00000296 2**0 CONTENTS, READONLY - 2 .debug_aranges 00000028 00000000 00000000 0000029a 2**0 + 2 .debug_aranges 00000028 00000000 00000000 00000298 2**0 CONTENTS, READONLY, DEBUGGING - 3 .debug_pubnames 0000006d 00000000 00000000 000002c2 2**0 + 3 .debug_pubnames 0000006d 00000000 00000000 000002c0 2**0 CONTENTS, READONLY, DEBUGGING - 4 .debug_info 000002b1 00000000 00000000 0000032f 2**0 + 4 .debug_info 000002a2 00000000 00000000 0000032d 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_abbrev 00000188 00000000 00000000 000005e0 2**0 + 5 .debug_abbrev 0000016f 00000000 00000000 000005cf 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_line 000004a7 00000000 00000000 00000768 2**0 + 6 .debug_line 0000049d 00000000 00000000 0000073e 2**0 CONTENTS, READONLY, DEBUGGING - 7 .debug_frame 00000090 00000000 00000000 00000c10 2**2 + 7 .debug_frame 00000090 00000000 00000000 00000bdc 2**2 CONTENTS, READONLY, DEBUGGING - 8 .debug_str 00000158 00000000 00000000 00000ca0 2**0 + 8 .debug_str 00000158 00000000 00000000 00000c6c 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_loc 00000268 00000000 00000000 00000df8 2**0 + 9 .debug_loc 00000268 00000000 00000000 00000dc4 2**0 CONTENTS, READONLY, DEBUGGING - 10 .debug_ranges 00000080 00000000 00000000 00001060 2**0 + 10 .debug_ranges 00000080 00000000 00000000 0000102c 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: @@ -47,7 +47,7 @@ int main(void) { 1d04: 14 be out 0x34, r1 ; 52 if (!(ch & _BV(EXTRF))) appStart(); 1d06: 81 ff sbrs r24, 1 - 1d08: 18 d1 rcall .+560 ; 0x1f3a <appStart> + 1d08: 17 d1 rcall .+558 ; 0x1f38 <appStart> #if LED_START_FLASHES > 0 // Set up Timer 1 for timeout counter @@ -61,7 +61,7 @@ int main(void) { // Set up watchdog to trigger after 500ms watchdogConfig(WATCHDOG_1S); 1d0e: 8e e0 ldi r24, 0x0E ; 14 - 1d10: 00 d1 rcall .+512 ; 0x1f12 <watchdogConfig> + 1d10: ff d0 rcall .+510 ; 0x1f10 <watchdogConfig> /* Set LED pin as output */ LED_DDR |= _BV(LED); @@ -156,7 +156,7 @@ void watchdogReset() { // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy getNch(1); 1d46: 81 e0 ldi r24, 0x01 ; 1 - 1d48: f0 d0 rcall .+480 ; 0x1f2a <getNch> + 1d48: ef d0 rcall .+478 ; 0x1f28 <getNch> putch(0x03); 1d4a: 83 e0 ldi r24, 0x03 ; 3 1d4c: b5 c0 rjmp .+362 ; 0x1eb8 <main+0x1b8> @@ -175,7 +175,7 @@ void watchdogReset() { // SET DEVICE EXT is ignored getNch(5); 1d5a: 85 e0 ldi r24, 0x05 ; 5 - 1d5c: e6 d0 rcall .+460 ; 0x1f2a <getNch> + 1d5c: e5 d0 rcall .+458 ; 0x1f28 <getNch> 1d5e: b3 c0 rjmp .+358 ; 0x1ec6 <main+0x1c6> } else if(ch == STK_LOAD_ADDRESS) { @@ -212,7 +212,7 @@ void watchdogReset() { // UNIVERSAL command is ignored getNch(4); 1d82: 84 e0 ldi r24, 0x04 ; 4 - 1d84: d2 d0 rcall .+420 ; 0x1f2a <getNch> + 1d84: d1 d0 rcall .+418 ; 0x1f28 <getNch> putch(0x00); 1d86: 80 e0 ldi r24, 0x00 ; 0 1d88: 97 c0 rjmp .+302 ; 0x1eb8 <main+0x1b8> @@ -257,7 +257,7 @@ void watchdogReset() { // Read command terminator, start reply verifySpace(); - 1dac: b6 d0 rcall .+364 ; 0x1f1a <verifySpace> + 1dac: b5 d0 rcall .+362 ; 0x1f18 <verifySpace> // If only a partial page is to be programmed, the erase might not be complete. // So check that here @@ -391,7 +391,7 @@ int main(void) { 1e5a: 47 d0 rcall .+142 ; 0x1eea <getch> verifySpace(); - 1e5c: 5e d0 rcall .+188 ; 0x1f1a <verifySpace> + 1e5c: 5d d0 rcall .+186 ; 0x1f18 <verifySpace> 1e5e: e8 01 movw r28, r16 1e60: ef 2c mov r14, r15 #ifdef VIRTUAL_BOOT_PARTITION @@ -452,7 +452,7 @@ int main(void) { 1eaa: 41 f4 brne .+16 ; 0x1ebc <main+0x1bc> // READ SIGN - return what Avrdude wants to hear verifySpace(); - 1eac: 36 d0 rcall .+108 ; 0x1f1a <verifySpace> + 1eac: 35 d0 rcall .+106 ; 0x1f18 <verifySpace> putch(SIGNATURE_0); 1eae: 8e e1 ldi r24, 0x1E ; 30 1eb0: 0d d0 rcall .+26 ; 0x1ecc <putch> @@ -470,13 +470,13 @@ int main(void) { // Adaboot no-wait mod watchdogConfig(WATCHDOG_16MS); 1ec0: 88 e0 ldi r24, 0x08 ; 8 - 1ec2: 27 d0 rcall .+78 ; 0x1f12 <watchdogConfig> + 1ec2: 26 d0 rcall .+76 ; 0x1f10 <watchdogConfig> verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); - 1ec4: 2a d0 rcall .+84 ; 0x1f1a <verifySpace> + 1ec4: 29 d0 rcall .+82 ; 0x1f18 <verifySpace> } putch(STK_OK); 1ec6: 80 e1 ldi r24, 0x10 ; 16 @@ -499,8 +499,8 @@ void putch(char ch) { 1ed8: 02 c0 rjmp .+4 ; 0x1ede <putch+0x12> 1eda: da 9a sbi 0x1b, 2 ; 27 1edc: 00 00 nop - 1ede: 15 d0 rcall .+42 ; 0x1f0a <uartDelay> - 1ee0: 14 d0 rcall .+40 ; 0x1f0a <uartDelay> + 1ede: 14 d0 rcall .+40 ; 0x1f08 <uartDelay> + 1ee0: 13 d0 rcall .+38 ; 0x1f08 <uartDelay> 1ee2: 86 95 lsr r24 1ee4: 2a 95 dec r18 1ee6: b1 f7 brne .-20 ; 0x1ed4 <putch+0x8> @@ -513,112 +513,105 @@ void putch(char ch) { 1ee8: 08 95 ret 00001eea <getch>: -} -#endif - -// Watchdog functions. These are only safe with interrupts turned off. -void watchdogReset() { - __asm__ __volatile__ ( - 1eea: a8 95 wdr LED_PIN |= _BV(LED); #endif #endif return ch; } - 1eec: 29 e0 ldi r18, 0x09 ; 9 - 1eee: 30 e0 ldi r19, 0x00 ; 0 - 1ef0: cb 99 sbic 0x19, 3 ; 25 - 1ef2: fe cf rjmp .-4 ; 0x1ef0 <getch+0x6> - 1ef4: 0a d0 rcall .+20 ; 0x1f0a <uartDelay> - 1ef6: 09 d0 rcall .+18 ; 0x1f0a <uartDelay> - 1ef8: 08 d0 rcall .+16 ; 0x1f0a <uartDelay> - 1efa: 88 94 clc - 1efc: cb 99 sbic 0x19, 3 ; 25 - 1efe: 08 94 sec - 1f00: 2a 95 dec r18 - 1f02: 11 f0 breq .+4 ; 0x1f08 <optiboot_version+0xa> - 1f04: 87 95 ror r24 - 1f06: f7 cf rjmp .-18 ; 0x1ef6 <getch+0xc> - 1f08: 08 95 ret - -00001f0a <uartDelay>: + 1eea: 29 e0 ldi r18, 0x09 ; 9 + 1eec: 30 e0 ldi r19, 0x00 ; 0 + 1eee: cb 99 sbic 0x19, 3 ; 25 + 1ef0: fe cf rjmp .-4 ; 0x1eee <getch+0x4> + 1ef2: 0a d0 rcall .+20 ; 0x1f08 <uartDelay> + 1ef4: 09 d0 rcall .+18 ; 0x1f08 <uartDelay> + 1ef6: 08 d0 rcall .+16 ; 0x1f08 <uartDelay> + 1ef8: 88 94 clc + 1efa: cb 99 sbic 0x19, 3 ; 25 + 1efc: 08 94 sec + 1efe: 2a 95 dec r18 + 1f00: 11 f0 breq .+4 ; 0x1f06 <optiboot_version+0x8> + 1f02: 87 95 ror r24 + 1f04: f7 cf rjmp .-18 ; 0x1ef4 <getch+0xa> + 1f06: 08 95 ret + +00001f08 <uartDelay>: #if UART_B_VALUE > 255 #error Baud rate too slow for soft UART #endif void uartDelay() { __asm__ __volatile__ ( - 1f0a: 9e e0 ldi r25, 0x0E ; 14 - 1f0c: 9a 95 dec r25 - 1f0e: f1 f7 brne .-4 ; 0x1f0c <uartDelay+0x2> - 1f10: 08 95 ret + 1f08: 9e e0 ldi r25, 0x0E ; 14 + 1f0a: 9a 95 dec r25 + 1f0c: f1 f7 brne .-4 ; 0x1f0a <uartDelay+0x2> + 1f0e: 08 95 ret -00001f12 <watchdogConfig>: +00001f10 <watchdogConfig>: "wdr\n" ); } void watchdogConfig(uint8_t x) { WDTCSR = _BV(WDCE) | _BV(WDE); - 1f12: 98 e1 ldi r25, 0x18 ; 24 - 1f14: 91 bd out 0x21, r25 ; 33 + 1f10: 98 e1 ldi r25, 0x18 ; 24 + 1f12: 91 bd out 0x21, r25 ; 33 WDTCSR = x; - 1f16: 81 bd out 0x21, r24 ; 33 + 1f14: 81 bd out 0x21, r24 ; 33 } - 1f18: 08 95 ret + 1f16: 08 95 ret -00001f1a <verifySpace>: +00001f18 <verifySpace>: do getch(); while (--count); verifySpace(); } void verifySpace() { if (getch() != CRC_EOP) { - 1f1a: e7 df rcall .-50 ; 0x1eea <getch> - 1f1c: 80 32 cpi r24, 0x20 ; 32 - 1f1e: 19 f0 breq .+6 ; 0x1f26 <verifySpace+0xc> + 1f18: e8 df rcall .-48 ; 0x1eea <getch> + 1f1a: 80 32 cpi r24, 0x20 ; 32 + 1f1c: 19 f0 breq .+6 ; 0x1f24 <verifySpace+0xc> watchdogConfig(WATCHDOG_16MS); // shorten WD timeout - 1f20: 88 e0 ldi r24, 0x08 ; 8 - 1f22: f7 df rcall .-18 ; 0x1f12 <watchdogConfig> - 1f24: ff cf rjmp .-2 ; 0x1f24 <verifySpace+0xa> + 1f1e: 88 e0 ldi r24, 0x08 ; 8 + 1f20: f7 df rcall .-18 ; 0x1f10 <watchdogConfig> + 1f22: ff cf rjmp .-2 ; 0x1f22 <verifySpace+0xa> while (1) // and busy-loop so that WD causes ; // a reset and app start. } putch(STK_INSYNC); - 1f26: 84 e1 ldi r24, 0x14 ; 20 + 1f24: 84 e1 ldi r24, 0x14 ; 20 } - 1f28: d1 cf rjmp .-94 ; 0x1ecc <putch> + 1f26: d2 cf rjmp .-92 ; 0x1ecc <putch> -00001f2a <getNch>: +00001f28 <getNch>: ::[count] "M" (UART_B_VALUE) ); } #endif void getNch(uint8_t count) { - 1f2a: 1f 93 push r17 - 1f2c: 18 2f mov r17, r24 + 1f28: 1f 93 push r17 + 1f2a: 18 2f mov r17, r24 do getch(); while (--count); - 1f2e: dd df rcall .-70 ; 0x1eea <getch> - 1f30: 11 50 subi r17, 0x01 ; 1 - 1f32: e9 f7 brne .-6 ; 0x1f2e <getNch+0x4> + 1f2c: de df rcall .-68 ; 0x1eea <getch> + 1f2e: 11 50 subi r17, 0x01 ; 1 + 1f30: e9 f7 brne .-6 ; 0x1f2c <getNch+0x4> verifySpace(); - 1f34: f2 df rcall .-28 ; 0x1f1a <verifySpace> + 1f32: f2 df rcall .-28 ; 0x1f18 <verifySpace> } - 1f36: 1f 91 pop r17 - 1f38: 08 95 ret + 1f34: 1f 91 pop r17 + 1f36: 08 95 ret -00001f3a <appStart>: +00001f38 <appStart>: WDTCSR = _BV(WDCE) | _BV(WDE); WDTCSR = x; } void appStart() { watchdogConfig(WATCHDOG_OFF); - 1f3a: 80 e0 ldi r24, 0x00 ; 0 - 1f3c: ea df rcall .-44 ; 0x1f12 <watchdogConfig> + 1f38: 80 e0 ldi r24, 0x00 ; 0 + 1f3a: ea df rcall .-44 ; 0x1f10 <watchdogConfig> __asm__ __volatile__ ( - 1f3e: e4 e0 ldi r30, 0x04 ; 4 - 1f40: ff 27 eor r31, r31 - 1f42: 09 94 ijmp + 1f3c: e4 e0 ldi r30, 0x04 ; 4 + 1f3e: ff 27 eor r31, r31 + 1f40: 09 94 ijmp diff --git a/bootloaders/optiboot/optiboot_pro_16MHz.hex b/bootloaders/optiboot/optiboot_pro_16MHz.hex index 26bbd4c..b685a4e 100644 --- a/bootloaders/optiboot/optiboot_pro_16MHz.hex +++ b/bootloaders/optiboot/optiboot_pro_16MHz.hex @@ -1,33 +1,34 @@ -:103E0000112484B714BE81FFE3D085E08093810044
+:103E0000112484B714BE81FFE7D085E08093810040
:103E100082E08093C00088E18093C10086E08093B7
-:103E2000C20080E18093C4008EE0BCD0259A86E079
+:103E2000C20080E18093C4008EE0C0D0259A86E075
:103E300020E33CEF91E0309385002093840096BB13
:103E4000B09BFECF1D9AA8958150A9F79924939411
:103E5000A5E0AA2EF1E1BF2E9DD0813421F481E0AE
-:103E6000AFD083E01FC0823411F484E103C08534F5
-:103E700019F485E0A5D083C0853579F48BD0E82E80
+:103E6000B3D083E01FC0823411F484E103C08534F1
+:103E700019F485E0A9D083C0853579F48BD0E82E7C
:103E8000FF2488D0082F10E0102F00270E291F29AB
-:103E9000000F111F8DD0680172C0863529F484E0AF
-:103EA0008FD080E06FD06BC0843609F042C072D0F2
+:103E9000000F111F91D0680172C0863529F484E0AB
+:103EA00093D080E06FD06BC0843609F042C072D0EE
:103EB00071D0082F6FD080E0C81688E3D80620F4B0
:103EC00083E0F60187BFE895C0E0D1E063D0899335
:103ED0000C17E1F7F0E0CF16F8E3DF0620F083E0FF
-:103EE000F60187BFE89564D007B600FCFDCFA601B8
+:103EE000F60187BFE89568D007B600FCFDCFA601B4
:103EF000A0E0B1E02C9130E011968C91119790E008
:103F0000982F8827822B932B1296FA010C0197BECB
:103F1000E89511244E5F5F4FF1E0A038BF0751F7DD
:103F2000F601A7BEE89507B600FCFDCFB7BEE89541
-:103F300026C08437B1F42ED02DD0F82E2BD038D017
+:103F300026C08437B1F42ED02DD0F82E2BD03CD013
:103F4000F601EF2C8F010F5F1F4F84911BD0EA9475
:103F5000F801C1F70894C11CD11CFA94CF0CD11CF4
-:103F60000EC0853739F424D08EE10CD084E90AD014
-:103F700086E098CF813511F488E014D019D080E123
+:103F60000EC0853739F428D08EE10CD084E90AD010
+:103F700086E098CF813511F488E018D01DD080E11B
:103F800001D06ACF982F8091C00085FFFCCF90931D
-:103F9000C6000895A8958091C00087FFFCCF80914E
-:103FA000C6000895E0E6F0E098E1908380830895EC
-:103FB000F1DF803219F088E0F5DFFFCF84E1E2CF56
-:103FC0001F93182FE7DF1150E9F7F2DF1F910895D3
-:0A3FD00080E0E8DFEE27FF270994E8
-:023FFE000204BB
+:103F9000C60008958091C00087FFFCCF8091C000CB
+:103FA00084FD01C0A8958091C6000895E0E6F0E088
+:103FB00098E1908380830895EDDF803219F088E0E6
+:103FC000F5DFFFCF84E1DECF1F93182FE3DF115021
+:103FD000E9F7F2DF1F91089580E0E8DFEE27FF2781
+:023FE000099442
+:023FFE000304BA
:0400000300003E00BB
:00000001FF
diff --git a/bootloaders/optiboot/optiboot_pro_16MHz.lst b/bootloaders/optiboot/optiboot_pro_16MHz.lst index e615a8e..2c6bea1 100644 --- a/bootloaders/optiboot/optiboot_pro_16MHz.lst +++ b/bootloaders/optiboot/optiboot_pro_16MHz.lst @@ -3,27 +3,27 @@ optiboot_pro_16MHz.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn - 0 .text 000001da 00003e00 00003e00 00000054 2**1 + 0 .text 000001e2 00003e00 00003e00 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .version 00000002 00003ffe 00003ffe 0000022e 2**0 + 1 .version 00000002 00003ffe 00003ffe 00000236 2**0 CONTENTS, READONLY - 2 .debug_aranges 00000028 00000000 00000000 00000230 2**0 + 2 .debug_aranges 00000028 00000000 00000000 00000238 2**0 CONTENTS, READONLY, DEBUGGING - 3 .debug_pubnames 0000005f 00000000 00000000 00000258 2**0 + 3 .debug_pubnames 0000005f 00000000 00000000 00000260 2**0 CONTENTS, READONLY, DEBUGGING - 4 .debug_info 0000028d 00000000 00000000 000002b7 2**0 + 4 .debug_info 0000028e 00000000 00000000 000002bf 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_abbrev 0000018a 00000000 00000000 00000544 2**0 + 5 .debug_abbrev 00000171 00000000 00000000 0000054d 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_line 00000456 00000000 00000000 000006ce 2**0 + 6 .debug_line 0000045e 00000000 00000000 000006be 2**0 CONTENTS, READONLY, DEBUGGING - 7 .debug_frame 00000080 00000000 00000000 00000b24 2**2 + 7 .debug_frame 00000080 00000000 00000000 00000b1c 2**2 CONTENTS, READONLY, DEBUGGING - 8 .debug_str 00000149 00000000 00000000 00000ba4 2**0 + 8 .debug_str 00000149 00000000 00000000 00000b9c 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_loc 0000027e 00000000 00000000 00000ced 2**0 + 9 .debug_loc 0000027e 00000000 00000000 00000ce5 2**0 CONTENTS, READONLY, DEBUGGING - 10 .debug_ranges 00000060 00000000 00000000 00000f6b 2**0 + 10 .debug_ranges 00000060 00000000 00000000 00000f63 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: @@ -47,7 +47,7 @@ int main(void) { 3e04: 14 be out 0x34, r1 ; 52 if (!(ch & _BV(EXTRF))) appStart(); 3e06: 81 ff sbrs r24, 1 - 3e08: e3 d0 rcall .+454 ; 0x3fd0 <appStart> + 3e08: e7 d0 rcall .+462 ; 0x3fd8 <appStart> #if LED_START_FLASHES > 0 // Set up Timer 1 for timeout counter @@ -77,7 +77,7 @@ int main(void) { // Set up watchdog to trigger after 500ms watchdogConfig(WATCHDOG_1S); 3e28: 8e e0 ldi r24, 0x0E ; 14 - 3e2a: bc d0 rcall .+376 ; 0x3fa4 <watchdogConfig> + 3e2a: c0 d0 rcall .+384 ; 0x3fac <watchdogConfig> /* Set LED pin as output */ LED_DDR |= _BV(LED); @@ -163,7 +163,7 @@ void watchdogReset() { // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy getNch(1); 3e5e: 81 e0 ldi r24, 0x01 ; 1 - 3e60: af d0 rcall .+350 ; 0x3fc0 <getNch> + 3e60: b3 d0 rcall .+358 ; 0x3fc8 <getNch> putch(0x03); 3e62: 83 e0 ldi r24, 0x03 ; 3 3e64: 1f c0 rjmp .+62 ; 0x3ea4 <main+0xa4> @@ -182,7 +182,7 @@ void watchdogReset() { // SET DEVICE EXT is ignored getNch(5); 3e72: 85 e0 ldi r24, 0x05 ; 5 - 3e74: a5 d0 rcall .+330 ; 0x3fc0 <getNch> + 3e74: a9 d0 rcall .+338 ; 0x3fc8 <getNch> 3e76: 83 c0 rjmp .+262 ; 0x3f7e <main+0x17e> } else if(ch == STK_LOAD_ADDRESS) { @@ -211,7 +211,7 @@ void watchdogReset() { 3e92: 11 1f adc r17, r17 address = newAddress; verifySpace(); - 3e94: 8d d0 rcall .+282 ; 0x3fb0 <verifySpace> + 3e94: 91 d0 rcall .+290 ; 0x3fb8 <verifySpace> 3e96: 68 01 movw r12, r16 3e98: 72 c0 rjmp .+228 ; 0x3f7e <main+0x17e> } @@ -221,7 +221,7 @@ void watchdogReset() { // UNIVERSAL command is ignored getNch(4); 3e9e: 84 e0 ldi r24, 0x04 ; 4 - 3ea0: 8f d0 rcall .+286 ; 0x3fc0 <getNch> + 3ea0: 93 d0 rcall .+294 ; 0x3fc8 <getNch> putch(0x00); 3ea2: 80 e0 ldi r24, 0x00 ; 0 3ea4: 6f d0 rcall .+222 ; 0x3f84 <putch> @@ -282,7 +282,7 @@ void watchdogReset() { // Read command terminator, start reply verifySpace(); - 3ee6: 64 d0 rcall .+200 ; 0x3fb0 <verifySpace> + 3ee6: 68 d0 rcall .+208 ; 0x3fb8 <verifySpace> // If only a partial page is to be programmed, the erase might not be complete. // So check that here @@ -370,7 +370,7 @@ int main(void) { 3f3c: 2b d0 rcall .+86 ; 0x3f94 <getch> verifySpace(); - 3f3e: 38 d0 rcall .+112 ; 0x3fb0 <verifySpace> + 3f3e: 3c d0 rcall .+120 ; 0x3fb8 <verifySpace> 3f40: f6 01 movw r30, r12 3f42: ef 2c mov r14, r15 putch(result); @@ -411,7 +411,7 @@ int main(void) { 3f64: 39 f4 brne .+14 ; 0x3f74 <main+0x174> // READ SIGN - return what Avrdude wants to hear verifySpace(); - 3f66: 24 d0 rcall .+72 ; 0x3fb0 <verifySpace> + 3f66: 28 d0 rcall .+80 ; 0x3fb8 <verifySpace> putch(SIGNATURE_0); 3f68: 8e e1 ldi r24, 0x1E ; 30 3f6a: 0c d0 rcall .+24 ; 0x3f84 <putch> @@ -428,13 +428,13 @@ int main(void) { // Adaboot no-wait mod watchdogConfig(WATCHDOG_16MS); 3f78: 88 e0 ldi r24, 0x08 ; 8 - 3f7a: 14 d0 rcall .+40 ; 0x3fa4 <watchdogConfig> + 3f7a: 18 d0 rcall .+48 ; 0x3fac <watchdogConfig> verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); - 3f7c: 19 d0 rcall .+50 ; 0x3fb0 <verifySpace> + 3f7c: 1d d0 rcall .+58 ; 0x3fb8 <verifySpace> } putch(STK_OK); 3f7e: 80 e1 ldi r24, 0x10 ; 16 @@ -463,99 +463,109 @@ void putch(char ch) { 3f92: 08 95 ret 00003f94 <getch>: + [uartBit] "I" (UART_RX_BIT) + : + "r25" +); +#else + while(!(UCSR0A & _BV(RXC0))) + 3f94: 80 91 c0 00 lds r24, 0x00C0 + 3f98: 87 ff sbrs r24, 7 + 3f9a: fc cf rjmp .-8 ; 0x3f94 <getch> + ; + if (!(UCSR0A & _BV(FE0))) { + 3f9c: 80 91 c0 00 lds r24, 0x00C0 + 3fa0: 84 fd sbrc r24, 4 + 3fa2: 01 c0 rjmp .+2 ; 0x3fa6 <getch+0x12> } #endif // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( - 3f94: a8 95 wdr - [uartBit] "I" (UART_RX_BIT) - : - "r25" -); -#else - while(!(UCSR0A & _BV(RXC0))); - 3f96: 80 91 c0 00 lds r24, 0x00C0 - 3f9a: 87 ff sbrs r24, 7 - 3f9c: fc cf rjmp .-8 ; 0x3f96 <getch+0x2> + 3fa4: a8 95 wdr + * don't care that an invalid char is returned...) + */ + watchdogReset(); + } + ch = UDR0; - 3f9e: 80 91 c6 00 lds r24, 0x00C6 + 3fa6: 80 91 c6 00 lds r24, 0x00C6 LED_PIN |= _BV(LED); #endif #endif return ch; } - 3fa2: 08 95 ret + 3faa: 08 95 ret -00003fa4 <watchdogConfig>: +00003fac <watchdogConfig>: "wdr\n" ); } void watchdogConfig(uint8_t x) { WDTCSR = _BV(WDCE) | _BV(WDE); - 3fa4: e0 e6 ldi r30, 0x60 ; 96 - 3fa6: f0 e0 ldi r31, 0x00 ; 0 - 3fa8: 98 e1 ldi r25, 0x18 ; 24 - 3faa: 90 83 st Z, r25 + 3fac: e0 e6 ldi r30, 0x60 ; 96 + 3fae: f0 e0 ldi r31, 0x00 ; 0 + 3fb0: 98 e1 ldi r25, 0x18 ; 24 + 3fb2: 90 83 st Z, r25 WDTCSR = x; - 3fac: 80 83 st Z, r24 + 3fb4: 80 83 st Z, r24 } - 3fae: 08 95 ret + 3fb6: 08 95 ret -00003fb0 <verifySpace>: +00003fb8 <verifySpace>: do getch(); while (--count); verifySpace(); } void verifySpace() { if (getch() != CRC_EOP) { - 3fb0: f1 df rcall .-30 ; 0x3f94 <getch> - 3fb2: 80 32 cpi r24, 0x20 ; 32 - 3fb4: 19 f0 breq .+6 ; 0x3fbc <verifySpace+0xc> + 3fb8: ed df rcall .-38 ; 0x3f94 <getch> + 3fba: 80 32 cpi r24, 0x20 ; 32 + 3fbc: 19 f0 breq .+6 ; 0x3fc4 <verifySpace+0xc> watchdogConfig(WATCHDOG_16MS); // shorten WD timeout - 3fb6: 88 e0 ldi r24, 0x08 ; 8 - 3fb8: f5 df rcall .-22 ; 0x3fa4 <watchdogConfig> - 3fba: ff cf rjmp .-2 ; 0x3fba <verifySpace+0xa> + 3fbe: 88 e0 ldi r24, 0x08 ; 8 + 3fc0: f5 df rcall .-22 ; 0x3fac <watchdogConfig> + 3fc2: ff cf rjmp .-2 ; 0x3fc2 <verifySpace+0xa> while (1) // and busy-loop so that WD causes ; // a reset and app start. } putch(STK_INSYNC); - 3fbc: 84 e1 ldi r24, 0x14 ; 20 + 3fc4: 84 e1 ldi r24, 0x14 ; 20 } - 3fbe: e2 cf rjmp .-60 ; 0x3f84 <putch> + 3fc6: de cf rjmp .-68 ; 0x3f84 <putch> -00003fc0 <getNch>: +00003fc8 <getNch>: ::[count] "M" (UART_B_VALUE) ); } #endif void getNch(uint8_t count) { - 3fc0: 1f 93 push r17 - 3fc2: 18 2f mov r17, r24 + 3fc8: 1f 93 push r17 + 3fca: 18 2f mov r17, r24 do getch(); while (--count); - 3fc4: e7 df rcall .-50 ; 0x3f94 <getch> - 3fc6: 11 50 subi r17, 0x01 ; 1 - 3fc8: e9 f7 brne .-6 ; 0x3fc4 <getNch+0x4> + 3fcc: e3 df rcall .-58 ; 0x3f94 <getch> + 3fce: 11 50 subi r17, 0x01 ; 1 + 3fd0: e9 f7 brne .-6 ; 0x3fcc <getNch+0x4> verifySpace(); - 3fca: f2 df rcall .-28 ; 0x3fb0 <verifySpace> + 3fd2: f2 df rcall .-28 ; 0x3fb8 <verifySpace> } - 3fcc: 1f 91 pop r17 - 3fce: 08 95 ret + 3fd4: 1f 91 pop r17 + 3fd6: 08 95 ret -00003fd0 <appStart>: +00003fd8 <appStart>: WDTCSR = _BV(WDCE) | _BV(WDE); WDTCSR = x; } void appStart() { watchdogConfig(WATCHDOG_OFF); - 3fd0: 80 e0 ldi r24, 0x00 ; 0 - 3fd2: e8 df rcall .-48 ; 0x3fa4 <watchdogConfig> + 3fd8: 80 e0 ldi r24, 0x00 ; 0 + 3fda: e8 df rcall .-48 ; 0x3fac <watchdogConfig> __asm__ __volatile__ ( - 3fd4: ee 27 eor r30, r30 - 3fd6: ff 27 eor r31, r31 - 3fd8: 09 94 ijmp + 3fdc: ee 27 eor r30, r30 + 3fde: ff 27 eor r31, r31 + 3fe0: 09 94 ijmp diff --git a/bootloaders/optiboot/optiboot_pro_20mhz.hex b/bootloaders/optiboot/optiboot_pro_20mhz.hex index dbd29c1..451a99c 100644 --- a/bootloaders/optiboot/optiboot_pro_20mhz.hex +++ b/bootloaders/optiboot/optiboot_pro_20mhz.hex @@ -1,33 +1,34 @@ -:103E0000112484B714BE81FFE3D085E08093810044
+:103E0000112484B714BE81FFE7D085E08093810040
:103E100082E08093C00088E18093C10086E08093B7
-:103E2000C20085E18093C4008EE0BCD0259A86E074
+:103E2000C20085E18093C4008EE0C0D0259A86E070
:103E30002CE33BEF91E0309385002093840096BB08
:103E4000B09BFECF1D9AA8958150A9F79924939411
:103E5000A5E0AA2EF1E1BF2E9DD0813421F481E0AE
-:103E6000AFD083E01FC0823411F484E103C08534F5
-:103E700019F485E0A5D083C0853579F48BD0E82E80
+:103E6000B3D083E01FC0823411F484E103C08534F1
+:103E700019F485E0A9D083C0853579F48BD0E82E7C
:103E8000FF2488D0082F10E0102F00270E291F29AB
-:103E9000000F111F8DD0680172C0863529F484E0AF
-:103EA0008FD080E06FD06BC0843609F042C072D0F2
+:103E9000000F111F91D0680172C0863529F484E0AB
+:103EA00093D080E06FD06BC0843609F042C072D0EE
:103EB00071D0082F6FD080E0C81688E3D80620F4B0
:103EC00083E0F60187BFE895C0E0D1E063D0899335
:103ED0000C17E1F7F0E0CF16F8E3DF0620F083E0FF
-:103EE000F60187BFE89564D007B600FCFDCFA601B8
+:103EE000F60187BFE89568D007B600FCFDCFA601B4
:103EF000A0E0B1E02C9130E011968C91119790E008
:103F0000982F8827822B932B1296FA010C0197BECB
:103F1000E89511244E5F5F4FF1E0A038BF0751F7DD
:103F2000F601A7BEE89507B600FCFDCFB7BEE89541
-:103F300026C08437B1F42ED02DD0F82E2BD038D017
+:103F300026C08437B1F42ED02DD0F82E2BD03CD013
:103F4000F601EF2C8F010F5F1F4F84911BD0EA9475
:103F5000F801C1F70894C11CD11CFA94CF0CD11CF4
-:103F60000EC0853739F424D08EE10CD084E90AD014
-:103F700086E098CF813511F488E014D019D080E123
+:103F60000EC0853739F428D08EE10CD084E90AD010
+:103F700086E098CF813511F488E018D01DD080E11B
:103F800001D06ACF982F8091C00085FFFCCF90931D
-:103F9000C6000895A8958091C00087FFFCCF80914E
-:103FA000C6000895E0E6F0E098E1908380830895EC
-:103FB000F1DF803219F088E0F5DFFFCF84E1E2CF56
-:103FC0001F93182FE7DF1150E9F7F2DF1F910895D3
-:0A3FD00080E0E8DFEE27FF270994E8
-:023FFE000204BB
+:103F9000C60008958091C00087FFFCCF8091C000CB
+:103FA00084FD01C0A8958091C6000895E0E6F0E088
+:103FB00098E1908380830895EDDF803219F088E0E6
+:103FC000F5DFFFCF84E1DECF1F93182FE3DF115021
+:103FD000E9F7F2DF1F91089580E0E8DFEE27FF2781
+:023FE000099442
+:023FFE000304BA
:0400000300003E00BB
:00000001FF
diff --git a/bootloaders/optiboot/optiboot_pro_20mhz.lst b/bootloaders/optiboot/optiboot_pro_20mhz.lst index 20d4db6..8314647 100644 --- a/bootloaders/optiboot/optiboot_pro_20mhz.lst +++ b/bootloaders/optiboot/optiboot_pro_20mhz.lst @@ -3,27 +3,27 @@ optiboot_pro_20mhz.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn - 0 .text 000001da 00003e00 00003e00 00000054 2**1 + 0 .text 000001e2 00003e00 00003e00 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .version 00000002 00003ffe 00003ffe 0000022e 2**0 + 1 .version 00000002 00003ffe 00003ffe 00000236 2**0 CONTENTS, READONLY - 2 .debug_aranges 00000028 00000000 00000000 00000230 2**0 + 2 .debug_aranges 00000028 00000000 00000000 00000238 2**0 CONTENTS, READONLY, DEBUGGING - 3 .debug_pubnames 0000005f 00000000 00000000 00000258 2**0 + 3 .debug_pubnames 0000005f 00000000 00000000 00000260 2**0 CONTENTS, READONLY, DEBUGGING - 4 .debug_info 0000028d 00000000 00000000 000002b7 2**0 + 4 .debug_info 0000028e 00000000 00000000 000002bf 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_abbrev 0000018a 00000000 00000000 00000544 2**0 + 5 .debug_abbrev 00000171 00000000 00000000 0000054d 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_line 00000456 00000000 00000000 000006ce 2**0 + 6 .debug_line 0000045e 00000000 00000000 000006be 2**0 CONTENTS, READONLY, DEBUGGING - 7 .debug_frame 00000080 00000000 00000000 00000b24 2**2 + 7 .debug_frame 00000080 00000000 00000000 00000b1c 2**2 CONTENTS, READONLY, DEBUGGING - 8 .debug_str 00000149 00000000 00000000 00000ba4 2**0 + 8 .debug_str 00000149 00000000 00000000 00000b9c 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_loc 0000027e 00000000 00000000 00000ced 2**0 + 9 .debug_loc 0000027e 00000000 00000000 00000ce5 2**0 CONTENTS, READONLY, DEBUGGING - 10 .debug_ranges 00000060 00000000 00000000 00000f6b 2**0 + 10 .debug_ranges 00000060 00000000 00000000 00000f63 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: @@ -47,7 +47,7 @@ int main(void) { 3e04: 14 be out 0x34, r1 ; 52 if (!(ch & _BV(EXTRF))) appStart(); 3e06: 81 ff sbrs r24, 1 - 3e08: e3 d0 rcall .+454 ; 0x3fd0 <appStart> + 3e08: e7 d0 rcall .+462 ; 0x3fd8 <appStart> #if LED_START_FLASHES > 0 // Set up Timer 1 for timeout counter @@ -77,7 +77,7 @@ int main(void) { // Set up watchdog to trigger after 500ms watchdogConfig(WATCHDOG_1S); 3e28: 8e e0 ldi r24, 0x0E ; 14 - 3e2a: bc d0 rcall .+376 ; 0x3fa4 <watchdogConfig> + 3e2a: c0 d0 rcall .+384 ; 0x3fac <watchdogConfig> /* Set LED pin as output */ LED_DDR |= _BV(LED); @@ -163,7 +163,7 @@ void watchdogReset() { // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy getNch(1); 3e5e: 81 e0 ldi r24, 0x01 ; 1 - 3e60: af d0 rcall .+350 ; 0x3fc0 <getNch> + 3e60: b3 d0 rcall .+358 ; 0x3fc8 <getNch> putch(0x03); 3e62: 83 e0 ldi r24, 0x03 ; 3 3e64: 1f c0 rjmp .+62 ; 0x3ea4 <main+0xa4> @@ -182,7 +182,7 @@ void watchdogReset() { // SET DEVICE EXT is ignored getNch(5); 3e72: 85 e0 ldi r24, 0x05 ; 5 - 3e74: a5 d0 rcall .+330 ; 0x3fc0 <getNch> + 3e74: a9 d0 rcall .+338 ; 0x3fc8 <getNch> 3e76: 83 c0 rjmp .+262 ; 0x3f7e <main+0x17e> } else if(ch == STK_LOAD_ADDRESS) { @@ -211,7 +211,7 @@ void watchdogReset() { 3e92: 11 1f adc r17, r17 address = newAddress; verifySpace(); - 3e94: 8d d0 rcall .+282 ; 0x3fb0 <verifySpace> + 3e94: 91 d0 rcall .+290 ; 0x3fb8 <verifySpace> 3e96: 68 01 movw r12, r16 3e98: 72 c0 rjmp .+228 ; 0x3f7e <main+0x17e> } @@ -221,7 +221,7 @@ void watchdogReset() { // UNIVERSAL command is ignored getNch(4); 3e9e: 84 e0 ldi r24, 0x04 ; 4 - 3ea0: 8f d0 rcall .+286 ; 0x3fc0 <getNch> + 3ea0: 93 d0 rcall .+294 ; 0x3fc8 <getNch> putch(0x00); 3ea2: 80 e0 ldi r24, 0x00 ; 0 3ea4: 6f d0 rcall .+222 ; 0x3f84 <putch> @@ -282,7 +282,7 @@ void watchdogReset() { // Read command terminator, start reply verifySpace(); - 3ee6: 64 d0 rcall .+200 ; 0x3fb0 <verifySpace> + 3ee6: 68 d0 rcall .+208 ; 0x3fb8 <verifySpace> // If only a partial page is to be programmed, the erase might not be complete. // So check that here @@ -370,7 +370,7 @@ int main(void) { 3f3c: 2b d0 rcall .+86 ; 0x3f94 <getch> verifySpace(); - 3f3e: 38 d0 rcall .+112 ; 0x3fb0 <verifySpace> + 3f3e: 3c d0 rcall .+120 ; 0x3fb8 <verifySpace> 3f40: f6 01 movw r30, r12 3f42: ef 2c mov r14, r15 putch(result); @@ -411,7 +411,7 @@ int main(void) { 3f64: 39 f4 brne .+14 ; 0x3f74 <main+0x174> // READ SIGN - return what Avrdude wants to hear verifySpace(); - 3f66: 24 d0 rcall .+72 ; 0x3fb0 <verifySpace> + 3f66: 28 d0 rcall .+80 ; 0x3fb8 <verifySpace> putch(SIGNATURE_0); 3f68: 8e e1 ldi r24, 0x1E ; 30 3f6a: 0c d0 rcall .+24 ; 0x3f84 <putch> @@ -428,13 +428,13 @@ int main(void) { // Adaboot no-wait mod watchdogConfig(WATCHDOG_16MS); 3f78: 88 e0 ldi r24, 0x08 ; 8 - 3f7a: 14 d0 rcall .+40 ; 0x3fa4 <watchdogConfig> + 3f7a: 18 d0 rcall .+48 ; 0x3fac <watchdogConfig> verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); - 3f7c: 19 d0 rcall .+50 ; 0x3fb0 <verifySpace> + 3f7c: 1d d0 rcall .+58 ; 0x3fb8 <verifySpace> } putch(STK_OK); 3f7e: 80 e1 ldi r24, 0x10 ; 16 @@ -463,99 +463,109 @@ void putch(char ch) { 3f92: 08 95 ret 00003f94 <getch>: + [uartBit] "I" (UART_RX_BIT) + : + "r25" +); +#else + while(!(UCSR0A & _BV(RXC0))) + 3f94: 80 91 c0 00 lds r24, 0x00C0 + 3f98: 87 ff sbrs r24, 7 + 3f9a: fc cf rjmp .-8 ; 0x3f94 <getch> + ; + if (!(UCSR0A & _BV(FE0))) { + 3f9c: 80 91 c0 00 lds r24, 0x00C0 + 3fa0: 84 fd sbrc r24, 4 + 3fa2: 01 c0 rjmp .+2 ; 0x3fa6 <getch+0x12> } #endif // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( - 3f94: a8 95 wdr - [uartBit] "I" (UART_RX_BIT) - : - "r25" -); -#else - while(!(UCSR0A & _BV(RXC0))); - 3f96: 80 91 c0 00 lds r24, 0x00C0 - 3f9a: 87 ff sbrs r24, 7 - 3f9c: fc cf rjmp .-8 ; 0x3f96 <getch+0x2> + 3fa4: a8 95 wdr + * don't care that an invalid char is returned...) + */ + watchdogReset(); + } + ch = UDR0; - 3f9e: 80 91 c6 00 lds r24, 0x00C6 + 3fa6: 80 91 c6 00 lds r24, 0x00C6 LED_PIN |= _BV(LED); #endif #endif return ch; } - 3fa2: 08 95 ret + 3faa: 08 95 ret -00003fa4 <watchdogConfig>: +00003fac <watchdogConfig>: "wdr\n" ); } void watchdogConfig(uint8_t x) { WDTCSR = _BV(WDCE) | _BV(WDE); - 3fa4: e0 e6 ldi r30, 0x60 ; 96 - 3fa6: f0 e0 ldi r31, 0x00 ; 0 - 3fa8: 98 e1 ldi r25, 0x18 ; 24 - 3faa: 90 83 st Z, r25 + 3fac: e0 e6 ldi r30, 0x60 ; 96 + 3fae: f0 e0 ldi r31, 0x00 ; 0 + 3fb0: 98 e1 ldi r25, 0x18 ; 24 + 3fb2: 90 83 st Z, r25 WDTCSR = x; - 3fac: 80 83 st Z, r24 + 3fb4: 80 83 st Z, r24 } - 3fae: 08 95 ret + 3fb6: 08 95 ret -00003fb0 <verifySpace>: +00003fb8 <verifySpace>: do getch(); while (--count); verifySpace(); } void verifySpace() { if (getch() != CRC_EOP) { - 3fb0: f1 df rcall .-30 ; 0x3f94 <getch> - 3fb2: 80 32 cpi r24, 0x20 ; 32 - 3fb4: 19 f0 breq .+6 ; 0x3fbc <verifySpace+0xc> + 3fb8: ed df rcall .-38 ; 0x3f94 <getch> + 3fba: 80 32 cpi r24, 0x20 ; 32 + 3fbc: 19 f0 breq .+6 ; 0x3fc4 <verifySpace+0xc> watchdogConfig(WATCHDOG_16MS); // shorten WD timeout - 3fb6: 88 e0 ldi r24, 0x08 ; 8 - 3fb8: f5 df rcall .-22 ; 0x3fa4 <watchdogConfig> - 3fba: ff cf rjmp .-2 ; 0x3fba <verifySpace+0xa> + 3fbe: 88 e0 ldi r24, 0x08 ; 8 + 3fc0: f5 df rcall .-22 ; 0x3fac <watchdogConfig> + 3fc2: ff cf rjmp .-2 ; 0x3fc2 <verifySpace+0xa> while (1) // and busy-loop so that WD causes ; // a reset and app start. } putch(STK_INSYNC); - 3fbc: 84 e1 ldi r24, 0x14 ; 20 + 3fc4: 84 e1 ldi r24, 0x14 ; 20 } - 3fbe: e2 cf rjmp .-60 ; 0x3f84 <putch> + 3fc6: de cf rjmp .-68 ; 0x3f84 <putch> -00003fc0 <getNch>: +00003fc8 <getNch>: ::[count] "M" (UART_B_VALUE) ); } #endif void getNch(uint8_t count) { - 3fc0: 1f 93 push r17 - 3fc2: 18 2f mov r17, r24 + 3fc8: 1f 93 push r17 + 3fca: 18 2f mov r17, r24 do getch(); while (--count); - 3fc4: e7 df rcall .-50 ; 0x3f94 <getch> - 3fc6: 11 50 subi r17, 0x01 ; 1 - 3fc8: e9 f7 brne .-6 ; 0x3fc4 <getNch+0x4> + 3fcc: e3 df rcall .-58 ; 0x3f94 <getch> + 3fce: 11 50 subi r17, 0x01 ; 1 + 3fd0: e9 f7 brne .-6 ; 0x3fcc <getNch+0x4> verifySpace(); - 3fca: f2 df rcall .-28 ; 0x3fb0 <verifySpace> + 3fd2: f2 df rcall .-28 ; 0x3fb8 <verifySpace> } - 3fcc: 1f 91 pop r17 - 3fce: 08 95 ret + 3fd4: 1f 91 pop r17 + 3fd6: 08 95 ret -00003fd0 <appStart>: +00003fd8 <appStart>: WDTCSR = _BV(WDCE) | _BV(WDE); WDTCSR = x; } void appStart() { watchdogConfig(WATCHDOG_OFF); - 3fd0: 80 e0 ldi r24, 0x00 ; 0 - 3fd2: e8 df rcall .-48 ; 0x3fa4 <watchdogConfig> + 3fd8: 80 e0 ldi r24, 0x00 ; 0 + 3fda: e8 df rcall .-48 ; 0x3fac <watchdogConfig> __asm__ __volatile__ ( - 3fd4: ee 27 eor r30, r30 - 3fd6: ff 27 eor r31, r31 - 3fd8: 09 94 ijmp + 3fdc: ee 27 eor r30, r30 + 3fde: ff 27 eor r31, r31 + 3fe0: 09 94 ijmp diff --git a/bootloaders/optiboot/optiboot_pro_8MHz.hex b/bootloaders/optiboot/optiboot_pro_8MHz.hex index 00f7a38..2c63395 100644 --- a/bootloaders/optiboot/optiboot_pro_8MHz.hex +++ b/bootloaders/optiboot/optiboot_pro_8MHz.hex @@ -1,33 +1,34 @@ -:103E0000112484B714BE81FFE3D085E08093810044
+:103E0000112484B714BE81FFE7D085E08093810040
:103E100082E08093C00088E18093C10086E08093B7
-:103E2000C20088E08093C4008EE0BCD0259A86E072
+:103E2000C20088E08093C4008EE0C0D0259A86E06E
:103E300028E13EEF91E0309385002093840096BB0B
:103E4000B09BFECF1D9AA8958150A9F79924939411
:103E5000A5E0AA2EF1E1BF2E9DD0813421F481E0AE
-:103E6000AFD083E01FC0823411F484E103C08534F5
-:103E700019F485E0A5D083C0853579F48BD0E82E80
+:103E6000B3D083E01FC0823411F484E103C08534F1
+:103E700019F485E0A9D083C0853579F48BD0E82E7C
:103E8000FF2488D0082F10E0102F00270E291F29AB
-:103E9000000F111F8DD0680172C0863529F484E0AF
-:103EA0008FD080E06FD06BC0843609F042C072D0F2
+:103E9000000F111F91D0680172C0863529F484E0AB
+:103EA00093D080E06FD06BC0843609F042C072D0EE
:103EB00071D0082F6FD080E0C81688E3D80620F4B0
:103EC00083E0F60187BFE895C0E0D1E063D0899335
:103ED0000C17E1F7F0E0CF16F8E3DF0620F083E0FF
-:103EE000F60187BFE89564D007B600FCFDCFA601B8
+:103EE000F60187BFE89568D007B600FCFDCFA601B4
:103EF000A0E0B1E02C9130E011968C91119790E008
:103F0000982F8827822B932B1296FA010C0197BECB
:103F1000E89511244E5F5F4FF1E0A038BF0751F7DD
:103F2000F601A7BEE89507B600FCFDCFB7BEE89541
-:103F300026C08437B1F42ED02DD0F82E2BD038D017
+:103F300026C08437B1F42ED02DD0F82E2BD03CD013
:103F4000F601EF2C8F010F5F1F4F84911BD0EA9475
:103F5000F801C1F70894C11CD11CFA94CF0CD11CF4
-:103F60000EC0853739F424D08EE10CD084E90AD014
-:103F700086E098CF813511F488E014D019D080E123
+:103F60000EC0853739F428D08EE10CD084E90AD010
+:103F700086E098CF813511F488E018D01DD080E11B
:103F800001D06ACF982F8091C00085FFFCCF90931D
-:103F9000C6000895A8958091C00087FFFCCF80914E
-:103FA000C6000895E0E6F0E098E1908380830895EC
-:103FB000F1DF803219F088E0F5DFFFCF84E1E2CF56
-:103FC0001F93182FE7DF1150E9F7F2DF1F910895D3
-:0A3FD00080E0E8DFEE27FF270994E8
-:023FFE000204BB
+:103F9000C60008958091C00087FFFCCF8091C000CB
+:103FA00084FD01C0A8958091C6000895E0E6F0E088
+:103FB00098E1908380830895EDDF803219F088E0E6
+:103FC000F5DFFFCF84E1DECF1F93182FE3DF115021
+:103FD000E9F7F2DF1F91089580E0E8DFEE27FF2781
+:023FE000099442
+:023FFE000304BA
:0400000300003E00BB
:00000001FF
diff --git a/bootloaders/optiboot/optiboot_pro_8MHz.lst b/bootloaders/optiboot/optiboot_pro_8MHz.lst index 6c117ca..1fb903c 100644 --- a/bootloaders/optiboot/optiboot_pro_8MHz.lst +++ b/bootloaders/optiboot/optiboot_pro_8MHz.lst @@ -3,27 +3,27 @@ optiboot_pro_8MHz.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn - 0 .text 000001da 00003e00 00003e00 00000054 2**1 + 0 .text 000001e2 00003e00 00003e00 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .version 00000002 00003ffe 00003ffe 0000022e 2**0 + 1 .version 00000002 00003ffe 00003ffe 00000236 2**0 CONTENTS, READONLY - 2 .debug_aranges 00000028 00000000 00000000 00000230 2**0 + 2 .debug_aranges 00000028 00000000 00000000 00000238 2**0 CONTENTS, READONLY, DEBUGGING - 3 .debug_pubnames 0000005f 00000000 00000000 00000258 2**0 + 3 .debug_pubnames 0000005f 00000000 00000000 00000260 2**0 CONTENTS, READONLY, DEBUGGING - 4 .debug_info 0000028d 00000000 00000000 000002b7 2**0 + 4 .debug_info 0000028e 00000000 00000000 000002bf 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_abbrev 0000018a 00000000 00000000 00000544 2**0 + 5 .debug_abbrev 00000171 00000000 00000000 0000054d 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_line 00000456 00000000 00000000 000006ce 2**0 + 6 .debug_line 0000045e 00000000 00000000 000006be 2**0 CONTENTS, READONLY, DEBUGGING - 7 .debug_frame 00000080 00000000 00000000 00000b24 2**2 + 7 .debug_frame 00000080 00000000 00000000 00000b1c 2**2 CONTENTS, READONLY, DEBUGGING - 8 .debug_str 00000149 00000000 00000000 00000ba4 2**0 + 8 .debug_str 00000149 00000000 00000000 00000b9c 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_loc 0000027e 00000000 00000000 00000ced 2**0 + 9 .debug_loc 0000027e 00000000 00000000 00000ce5 2**0 CONTENTS, READONLY, DEBUGGING - 10 .debug_ranges 00000060 00000000 00000000 00000f6b 2**0 + 10 .debug_ranges 00000060 00000000 00000000 00000f63 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: @@ -47,7 +47,7 @@ int main(void) { 3e04: 14 be out 0x34, r1 ; 52 if (!(ch & _BV(EXTRF))) appStart(); 3e06: 81 ff sbrs r24, 1 - 3e08: e3 d0 rcall .+454 ; 0x3fd0 <appStart> + 3e08: e7 d0 rcall .+462 ; 0x3fd8 <appStart> #if LED_START_FLASHES > 0 // Set up Timer 1 for timeout counter @@ -77,7 +77,7 @@ int main(void) { // Set up watchdog to trigger after 500ms watchdogConfig(WATCHDOG_1S); 3e28: 8e e0 ldi r24, 0x0E ; 14 - 3e2a: bc d0 rcall .+376 ; 0x3fa4 <watchdogConfig> + 3e2a: c0 d0 rcall .+384 ; 0x3fac <watchdogConfig> /* Set LED pin as output */ LED_DDR |= _BV(LED); @@ -163,7 +163,7 @@ void watchdogReset() { // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy getNch(1); 3e5e: 81 e0 ldi r24, 0x01 ; 1 - 3e60: af d0 rcall .+350 ; 0x3fc0 <getNch> + 3e60: b3 d0 rcall .+358 ; 0x3fc8 <getNch> putch(0x03); 3e62: 83 e0 ldi r24, 0x03 ; 3 3e64: 1f c0 rjmp .+62 ; 0x3ea4 <main+0xa4> @@ -182,7 +182,7 @@ void watchdogReset() { // SET DEVICE EXT is ignored getNch(5); 3e72: 85 e0 ldi r24, 0x05 ; 5 - 3e74: a5 d0 rcall .+330 ; 0x3fc0 <getNch> + 3e74: a9 d0 rcall .+338 ; 0x3fc8 <getNch> 3e76: 83 c0 rjmp .+262 ; 0x3f7e <main+0x17e> } else if(ch == STK_LOAD_ADDRESS) { @@ -211,7 +211,7 @@ void watchdogReset() { 3e92: 11 1f adc r17, r17 address = newAddress; verifySpace(); - 3e94: 8d d0 rcall .+282 ; 0x3fb0 <verifySpace> + 3e94: 91 d0 rcall .+290 ; 0x3fb8 <verifySpace> 3e96: 68 01 movw r12, r16 3e98: 72 c0 rjmp .+228 ; 0x3f7e <main+0x17e> } @@ -221,7 +221,7 @@ void watchdogReset() { // UNIVERSAL command is ignored getNch(4); 3e9e: 84 e0 ldi r24, 0x04 ; 4 - 3ea0: 8f d0 rcall .+286 ; 0x3fc0 <getNch> + 3ea0: 93 d0 rcall .+294 ; 0x3fc8 <getNch> putch(0x00); 3ea2: 80 e0 ldi r24, 0x00 ; 0 3ea4: 6f d0 rcall .+222 ; 0x3f84 <putch> @@ -282,7 +282,7 @@ void watchdogReset() { // Read command terminator, start reply verifySpace(); - 3ee6: 64 d0 rcall .+200 ; 0x3fb0 <verifySpace> + 3ee6: 68 d0 rcall .+208 ; 0x3fb8 <verifySpace> // If only a partial page is to be programmed, the erase might not be complete. // So check that here @@ -370,7 +370,7 @@ int main(void) { 3f3c: 2b d0 rcall .+86 ; 0x3f94 <getch> verifySpace(); - 3f3e: 38 d0 rcall .+112 ; 0x3fb0 <verifySpace> + 3f3e: 3c d0 rcall .+120 ; 0x3fb8 <verifySpace> 3f40: f6 01 movw r30, r12 3f42: ef 2c mov r14, r15 putch(result); @@ -411,7 +411,7 @@ int main(void) { 3f64: 39 f4 brne .+14 ; 0x3f74 <main+0x174> // READ SIGN - return what Avrdude wants to hear verifySpace(); - 3f66: 24 d0 rcall .+72 ; 0x3fb0 <verifySpace> + 3f66: 28 d0 rcall .+80 ; 0x3fb8 <verifySpace> putch(SIGNATURE_0); 3f68: 8e e1 ldi r24, 0x1E ; 30 3f6a: 0c d0 rcall .+24 ; 0x3f84 <putch> @@ -428,13 +428,13 @@ int main(void) { // Adaboot no-wait mod watchdogConfig(WATCHDOG_16MS); 3f78: 88 e0 ldi r24, 0x08 ; 8 - 3f7a: 14 d0 rcall .+40 ; 0x3fa4 <watchdogConfig> + 3f7a: 18 d0 rcall .+48 ; 0x3fac <watchdogConfig> verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); - 3f7c: 19 d0 rcall .+50 ; 0x3fb0 <verifySpace> + 3f7c: 1d d0 rcall .+58 ; 0x3fb8 <verifySpace> } putch(STK_OK); 3f7e: 80 e1 ldi r24, 0x10 ; 16 @@ -463,99 +463,109 @@ void putch(char ch) { 3f92: 08 95 ret 00003f94 <getch>: + [uartBit] "I" (UART_RX_BIT) + : + "r25" +); +#else + while(!(UCSR0A & _BV(RXC0))) + 3f94: 80 91 c0 00 lds r24, 0x00C0 + 3f98: 87 ff sbrs r24, 7 + 3f9a: fc cf rjmp .-8 ; 0x3f94 <getch> + ; + if (!(UCSR0A & _BV(FE0))) { + 3f9c: 80 91 c0 00 lds r24, 0x00C0 + 3fa0: 84 fd sbrc r24, 4 + 3fa2: 01 c0 rjmp .+2 ; 0x3fa6 <getch+0x12> } #endif // Watchdog functions. These are only safe with interrupts turned off. void watchdogReset() { __asm__ __volatile__ ( - 3f94: a8 95 wdr - [uartBit] "I" (UART_RX_BIT) - : - "r25" -); -#else - while(!(UCSR0A & _BV(RXC0))); - 3f96: 80 91 c0 00 lds r24, 0x00C0 - 3f9a: 87 ff sbrs r24, 7 - 3f9c: fc cf rjmp .-8 ; 0x3f96 <getch+0x2> + 3fa4: a8 95 wdr + * don't care that an invalid char is returned...) + */ + watchdogReset(); + } + ch = UDR0; - 3f9e: 80 91 c6 00 lds r24, 0x00C6 + 3fa6: 80 91 c6 00 lds r24, 0x00C6 LED_PIN |= _BV(LED); #endif #endif return ch; } - 3fa2: 08 95 ret + 3faa: 08 95 ret -00003fa4 <watchdogConfig>: +00003fac <watchdogConfig>: "wdr\n" ); } void watchdogConfig(uint8_t x) { WDTCSR = _BV(WDCE) | _BV(WDE); - 3fa4: e0 e6 ldi r30, 0x60 ; 96 - 3fa6: f0 e0 ldi r31, 0x00 ; 0 - 3fa8: 98 e1 ldi r25, 0x18 ; 24 - 3faa: 90 83 st Z, r25 + 3fac: e0 e6 ldi r30, 0x60 ; 96 + 3fae: f0 e0 ldi r31, 0x00 ; 0 + 3fb0: 98 e1 ldi r25, 0x18 ; 24 + 3fb2: 90 83 st Z, r25 WDTCSR = x; - 3fac: 80 83 st Z, r24 + 3fb4: 80 83 st Z, r24 } - 3fae: 08 95 ret + 3fb6: 08 95 ret -00003fb0 <verifySpace>: +00003fb8 <verifySpace>: do getch(); while (--count); verifySpace(); } void verifySpace() { if (getch() != CRC_EOP) { - 3fb0: f1 df rcall .-30 ; 0x3f94 <getch> - 3fb2: 80 32 cpi r24, 0x20 ; 32 - 3fb4: 19 f0 breq .+6 ; 0x3fbc <verifySpace+0xc> + 3fb8: ed df rcall .-38 ; 0x3f94 <getch> + 3fba: 80 32 cpi r24, 0x20 ; 32 + 3fbc: 19 f0 breq .+6 ; 0x3fc4 <verifySpace+0xc> watchdogConfig(WATCHDOG_16MS); // shorten WD timeout - 3fb6: 88 e0 ldi r24, 0x08 ; 8 - 3fb8: f5 df rcall .-22 ; 0x3fa4 <watchdogConfig> - 3fba: ff cf rjmp .-2 ; 0x3fba <verifySpace+0xa> + 3fbe: 88 e0 ldi r24, 0x08 ; 8 + 3fc0: f5 df rcall .-22 ; 0x3fac <watchdogConfig> + 3fc2: ff cf rjmp .-2 ; 0x3fc2 <verifySpace+0xa> while (1) // and busy-loop so that WD causes ; // a reset and app start. } putch(STK_INSYNC); - 3fbc: 84 e1 ldi r24, 0x14 ; 20 + 3fc4: 84 e1 ldi r24, 0x14 ; 20 } - 3fbe: e2 cf rjmp .-60 ; 0x3f84 <putch> + 3fc6: de cf rjmp .-68 ; 0x3f84 <putch> -00003fc0 <getNch>: +00003fc8 <getNch>: ::[count] "M" (UART_B_VALUE) ); } #endif void getNch(uint8_t count) { - 3fc0: 1f 93 push r17 - 3fc2: 18 2f mov r17, r24 + 3fc8: 1f 93 push r17 + 3fca: 18 2f mov r17, r24 do getch(); while (--count); - 3fc4: e7 df rcall .-50 ; 0x3f94 <getch> - 3fc6: 11 50 subi r17, 0x01 ; 1 - 3fc8: e9 f7 brne .-6 ; 0x3fc4 <getNch+0x4> + 3fcc: e3 df rcall .-58 ; 0x3f94 <getch> + 3fce: 11 50 subi r17, 0x01 ; 1 + 3fd0: e9 f7 brne .-6 ; 0x3fcc <getNch+0x4> verifySpace(); - 3fca: f2 df rcall .-28 ; 0x3fb0 <verifySpace> + 3fd2: f2 df rcall .-28 ; 0x3fb8 <verifySpace> } - 3fcc: 1f 91 pop r17 - 3fce: 08 95 ret + 3fd4: 1f 91 pop r17 + 3fd6: 08 95 ret -00003fd0 <appStart>: +00003fd8 <appStart>: WDTCSR = _BV(WDCE) | _BV(WDE); WDTCSR = x; } void appStart() { watchdogConfig(WATCHDOG_OFF); - 3fd0: 80 e0 ldi r24, 0x00 ; 0 - 3fd2: e8 df rcall .-48 ; 0x3fa4 <watchdogConfig> + 3fd8: 80 e0 ldi r24, 0x00 ; 0 + 3fda: e8 df rcall .-48 ; 0x3fac <watchdogConfig> __asm__ __volatile__ ( - 3fd4: ee 27 eor r30, r30 - 3fd6: ff 27 eor r31, r31 - 3fd8: 09 94 ijmp + 3fdc: ee 27 eor r30, r30 + 3fde: ff 27 eor r31, r31 + 3fe0: 09 94 ijmp diff --git a/bootloaders/optiboot/pin_defs.h b/bootloaders/optiboot/pin_defs.h index 313e453..27d7772 100644 --- a/bootloaders/optiboot/pin_defs.h +++ b/bootloaders/optiboot/pin_defs.h @@ -21,6 +21,7 @@ #define UDR0 UDR #define UDRE0 UDRE #define RXC0 RXC + #define FE0 FE #define TIFR1 TIFR #define WDTCSR WDTCR #endif |