aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUwe Bonnes2013-01-15 15:20:42 +0100
committerUwe Bonnes2013-01-21 11:02:43 +0100
commit313a24b31676e4d74362f9280e54d467815e7514 (patch)
treed808cbc39b5acbc92d6cd85de00c9f3285c5e78b
parent1eb9bfc6509efdcd722d17b1fe3fe97efc93593c (diff)
usbdfu: Allow for different, but constant flash page sizes
-rw-r--r--src/platforms/stm32/usbdfu.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/platforms/stm32/usbdfu.c b/src/platforms/stm32/usbdfu.c
index 12bb26c..f809a2a 100644
--- a/src/platforms/stm32/usbdfu.c
+++ b/src/platforms/stm32/usbdfu.c
@@ -158,6 +158,13 @@ static u8 usbdfu_getstatus(u32 *bwPollTimeout)
}
}
+#if defined (STM32_CAN)
+#define FLASHBLOCKSIZE 2048
+#else
+#define FLASHBLOCKSIZE 1024
+#endif
+static uint32_t last_erased_pages=0xffffffff;
+
static void
usbdfu_getstatus_complete(usbd_device *dev, struct usb_setup_data *req)
{
@@ -175,8 +182,15 @@ usbdfu_getstatus_complete(usbd_device *dev, struct usb_setup_data *req)
return;
}
switch(prog.buf[0]) {
- case CMD_ERASE:
- flash_erase_page(*(u32*)(prog.buf+1));
+ case CMD_ERASE: {
+ u32 page_start = *(u32*)(prog.buf+1);
+
+ page_start &= (~(FLASHBLOCKSIZE-1));
+ if (page_start != last_erased_pages) {
+ flash_erase_page(page_start);
+ last_erased_pages = page_start;
+ }
+ }
case CMD_SETADDR:
prog.addr = *(u32*)(prog.buf+1);
}