diff options
| author | cpldcpu <cpldcpu@gmail.com> | 2014-02-18 14:35:33 +0100 | 
|---|---|---|
| committer | cpldcpu <cpldcpu@gmail.com> | 2014-02-18 14:35:33 +0100 | 
| commit | b3c8d599b16f50aff21938c4ee0dcf3d4a0e47d4 (patch) | |
| tree | 914696f40ab97da4a3e1817657ce1b4da3c93304 | |
| parent | 2f4e15618806534398887eb4697c1fce380177e5 (diff) | |
| download | micronucleus-b3c8d599b16f50aff21938c4ee0dcf3d4a0e47d4.tar.gz micronucleus-b3c8d599b16f50aff21938c4ee0dcf3d4a0e47d4.tar.bz2 micronucleus-b3c8d599b16f50aff21938c4ee0dcf3d4a0e47d4.zip | |
firmware: far jmp support for reset vector patching
| -rw-r--r-- | firmware/main.c | 14 | 
1 files changed, 13 insertions, 1 deletions
| diff --git a/firmware/main.c b/firmware/main.c index 981c8c1..5342498 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -124,6 +124,9 @@ static inline void eraseApplication(void) {    // Write reset vector into first page.    currentAddress.w = 0;     writeWordToPageBuffer(0xffff); +#if BOOTLOADER_ADDRESS >= 8192  +  writeWordToPageBuffer(0xffff);  // far jmp +#endif    command=cmd_write_page;  } @@ -140,10 +143,19 @@ static void writeWordToPageBuffer(uint16_t data) {    // the device can not be bricked.    // Saving user-reset-vector is done in the host tool, starting with    // firmware V2 -    +#if BOOTLOADER_ADDRESS < 8192 +  // rjmp    if (currentAddress.w == RESET_VECTOR_OFFSET * 2) {      data = 0xC000 + (BOOTLOADER_ADDRESS/2) - 1;    } +#else +  // far jmp +  if (currentAddress.w == RESET_VECTOR_OFFSET * 2) { +    data = 0x940c; +  } else if (currentAddress.w == (RESET_VECTOR_OFFSET +1 ) * 2) { +    data = (BOOTLOADER_ADDRESS/2); +  }     +#endif  #if (!OSCCAL_RESTORE) && OSCCAL_16_5MHz        if (currentAddress.w == BOOTLOADER_ADDRESS - TINYVECTOR_OSCCAL_OFFSET) { | 
