aboutsummaryrefslogtreecommitdiff
path: root/bootloaders/nuevo_diskloader/src
diff options
context:
space:
mode:
authorZach Eveland <zeveland@blacklabel-development.com>2011-10-21 17:51:04 -0400
committerZach Eveland <zeveland@blacklabel-development.com>2011-10-21 17:51:04 -0400
commit146922e21147baef802aba5cd3eb5ae0f75b545e (patch)
treefbce59a2fb56b902266a3626c4d5b029b7a0ebf1 /bootloaders/nuevo_diskloader/src
parent629788e47c757432178f8a1b6855d10d665e6550 (diff)
added and modified Program() routine
Diffstat (limited to 'bootloaders/nuevo_diskloader/src')
-rw-r--r--bootloaders/nuevo_diskloader/src/DiskLoader.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/bootloaders/nuevo_diskloader/src/DiskLoader.cpp b/bootloaders/nuevo_diskloader/src/DiskLoader.cpp
index 83ffc1b..efd386f 100644
--- a/bootloaders/nuevo_diskloader/src/DiskLoader.cpp
+++ b/bootloaders/nuevo_diskloader/src/DiskLoader.cpp
@@ -19,6 +19,32 @@ void entrypoint(void)
::);
}
+u8 _flashbuf[128];
+
+void Program(u8 ep, u16 page, u8 count)
+{
+ u8 write = page < 30*1024; // Don't write over firmware please
+ if (write)
+ boot_page_erase(page);
+
+ USB_Recv(ep,_flashbuf,count); // Read while page is erasing
+
+ if (!write)
+ return;
+
+ boot_spm_busy_wait(); // Wait until the memory is erased.
+
+ count >>= 1;
+ u16* p = (u16*)page;
+ u16* b = (u16*)_flashbuf;
+ for (u8 i = 0; i < count; i++)
+ boot_page_fill(p++, b[i]);
+
+ boot_page_write(page);
+ boot_spm_busy_wait();
+ boot_rww_enable ();
+}
+
int main(void) __attribute__ ((naked));
int main()
{