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 /firmware | |
parent | 2f4e15618806534398887eb4697c1fce380177e5 (diff) | |
download | micronucleus-b3c8d599b16f50aff21938c4ee0dcf3d4a0e47d4.tar.gz micronucleus-b3c8d599b16f50aff21938c4ee0dcf3d4a0e47d4.tar.bz2 micronucleus-b3c8d599b16f50aff21938c4ee0dcf3d4a0e47d4.zip |
firmware: far jmp support for reset vector patching
Diffstat (limited to 'firmware')
-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) { |