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