summaryrefslogtreecommitdiffstats
path: root/firmware/main.c
diff options
context:
space:
mode:
authorcpldcpu <cpldcpu@gmail.com>2014-02-18 14:35:33 +0100
committercpldcpu <cpldcpu@gmail.com>2014-02-18 14:35:33 +0100
commitb3c8d599b16f50aff21938c4ee0dcf3d4a0e47d4 (patch)
tree914696f40ab97da4a3e1817657ce1b4da3c93304 /firmware/main.c
parent2f4e15618806534398887eb4697c1fce380177e5 (diff)
downloadmicronucleus-b3c8d599b16f50aff21938c4ee0dcf3d4a0e47d4.tar.gz
micronucleus-b3c8d599b16f50aff21938c4ee0dcf3d4a0e47d4.tar.bz2
micronucleus-b3c8d599b16f50aff21938c4ee0dcf3d4a0e47d4.zip
firmware: far jmp support for reset vector patching
Diffstat (limited to 'firmware/main.c')
-rw-r--r--firmware/main.c14
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) {