Make stlink_erase_flash_mass device dependant and implement mass erase for L1
[fw/stlink] / src / stlink-common.c
index 626c86d6d476186ea48dfa58a45bae1914a1008d..5cbf7febbfa03c74c816cef681ba8a259e338eee 100644 (file)
@@ -799,6 +799,11 @@ int stlink_fwrite_sram
 
     /* success */
     error = 0;
+    /* set stack*/
+    stlink_write_reg(sl, stlink_read_debug32(sl, addr    ),13);
+    /* Set PC to the reset routine*/
+    stlink_write_reg(sl, stlink_read_debug32(sl, addr + 4),15);
+    stlink_run(sl);
 
 on_error:
     unmap_file(&mf);
@@ -1048,26 +1053,44 @@ int stlink_erase_flash_page(stlink_t *sl, stm32_addr_t flashaddr)
 }
 
 int stlink_erase_flash_mass(stlink_t *sl) {
-    /* wait for ongoing op to finish */
-    wait_flash_busy(sl);
-
-    /* unlock if locked */
-    unlock_flash_if(sl);
-
-    /* set the mass erase bit */
-    set_flash_cr_mer(sl);
-
-    /* start erase operation, reset by hw with bsy bit */
-    set_flash_cr_strt(sl);
-
-    /* wait for completion */
-    wait_flash_busy(sl);
-
-    /* relock the flash */
-    lock_flash(sl);
-
-    /* todo: verify the erased memory */
-
+     if (sl->chip_id == STM32_CHIPID_F4) {
+        DLOG("(FIXME) Mass erase of STM32F4\n");
+      }
+     else if (sl->chip_id == STM32_CHIPID_L1_MEDIUM) {
+        /* erase each page */
+        int i = 0, num_pages = sl->flash_size/sl->flash_pgsz;
+        for (i = 0; i < num_pages; i++) {
+            /* addr must be an addr inside the page */
+            stm32_addr_t addr = sl->flash_base + i * sl->flash_pgsz;
+            if (stlink_erase_flash_page(sl, addr) == -1) {
+                WLOG("Failed to erase_flash_page(%#zx) == -1\n", addr);
+                return -1;
+            }
+            fprintf(stdout,"\rFlash page at %5d/%5d erased", i, num_pages);
+            fflush(stdout);
+        }
+     }
+     else {
+        /* wait for ongoing op to finish */
+        wait_flash_busy(sl);
+        
+        /* unlock if locked */
+        unlock_flash_if(sl);
+        
+        /* set the mass erase bit */
+        set_flash_cr_mer(sl);
+        
+        /* start erase operation, reset by hw with bsy bit */
+        set_flash_cr_strt(sl);
+        
+        /* wait for completion */
+        wait_flash_busy(sl);
+        
+        /* relock the flash */
+        lock_flash(sl);
+        
+        /* todo: verify the erased memory */
+     }
     return 0;
 }
 
@@ -1514,6 +1537,11 @@ int stlink_fwrite_flash(stlink_t *sl, const char* path, stm32_addr_t addr) {
        mf.len -= num_empty;
     }
     err = stlink_write_flash(sl, addr, mf.base, mf.len);
+    /* set stack*/
+    stlink_write_reg(sl, stlink_read_debug32(sl, addr    ),13);
+    /* Set PC to the reset routine*/
+    stlink_write_reg(sl, stlink_read_debug32(sl, addr + 4),15);
+    stlink_run(sl);
     unmap_file(&mf);
     return err;
 }