Implement FlashErase GDB command.
authorPeter Zotov <whitequark@whitequark.org>
Tue, 15 Feb 2011 19:35:19 +0000 (22:35 +0300)
committerPeter Zotov <whitequark@whitequark.org>
Tue, 15 Feb 2011 19:35:19 +0000 (22:35 +0300)
src/gdb-server.c
src/stlink-hw.c
src/stlink-hw.h

index 53df7191543a9a8160d4bcbc47fd71a3b24c872d..c6162153adc13ae6f931860dd96ea84e9afadf96 100644 (file)
@@ -184,6 +184,56 @@ int serve(struct stlink* sl, int port) {
                        break;
                }
 
                        break;
                }
 
+               case 'v': {
+                       char *separator = strstr(packet, ":"), *params = "";
+                       if(separator == NULL) {
+                               separator = packet + strlen(packet);
+                       } else {
+                               params = separator + 1;
+                       }
+
+                       unsigned cmdNameLength = (separator - &packet[1]);
+                       char* cmdName = calloc(cmdNameLength + 1, 1);
+                       strncpy(cmdName, &packet[1], cmdNameLength);
+
+                       if(!strcmp(cmdName, "FlashErase")) {
+                               char *s_addr, *s_length;
+                               char *tok = params;
+
+                               s_addr   = strsep(&tok, ",");
+                               s_length = tok;
+
+                               unsigned addr = strtoul(s_addr, NULL, 16),
+                                      length = strtoul(s_length, NULL, 16);
+
+                               #ifdef DEBUG
+                               printf("FlashErase: addr:%08x,len:%04x\n",
+                                       addr, length);
+                               #endif
+
+                               for(stm32_addr_t cur = addr;
+                                               cur < addr + length; cur += 0x400) {
+                                       #ifdef DEBUG
+                                       printf("do_erase: %08x\n", cur);
+                                       #endif
+
+                                       stlink_erase_flash_page(sl, cur);
+                               }
+
+                               reply = strdup("OK");
+                       } else if(!strcmp(cmdName, "FlashWrite")) {
+                       } else if(!strcmp(cmdName, "FlashDone")) {
+                               reply = strdup("OK");
+                       }
+
+                       if(reply == NULL)
+                               reply = strdup("");
+
+                       free(cmdName);
+
+                       break;
+               }
+
                case 'c':
                        stlink_run(sl);
 
                case 'c':
                        stlink_run(sl);
 
index 441b69258bfe8fa46d9b2976fd77a8ce004a3e4d..92cd021e868c68cf5237e9c2a6f8a3ecd435737e 100644 (file)
@@ -1108,7 +1108,7 @@ static int write_flash_mem16
 }
 #endif /* not working */
 
 }
 #endif /* not working */
 
-static int erase_flash_page(struct stlink* sl, stm32_addr_t page)
+int stlink_erase_flash_page(struct stlink* sl, stm32_addr_t page)
 {
   /* page an addr in the page to erase */
 
 {
   /* page an addr in the page to erase */
 
@@ -1138,7 +1138,7 @@ static int erase_flash_page(struct stlink* sl, stm32_addr_t page)
   return 0;
 }
 
   return 0;
 }
 
-static int __attribute__((unused)) erase_flash_mass(struct stlink* sl)
+int stlink_erase_flash_mass(struct stlink* sl)
 {
   /* wait for ongoing op to finish */
   wait_flash_busy(sl);
 {
   /* wait for ongoing op to finish */
   wait_flash_busy(sl);
@@ -1421,7 +1421,7 @@ static int stlink_fwrite_flash
   for (off = 0; off < mf.len; off += sl->flash_pgsz)
   {
     /* addr must be an addr inside the page */
   for (off = 0; off < mf.len; off += sl->flash_pgsz)
   {
     /* addr must be an addr inside the page */
-    if (erase_flash_page(sl, addr + off) == -1)
+    if (stlink_erase_flash_page(sl, addr + off) == -1)
     {
       fprintf(stderr, "erase_flash_page(0x%x) == -1\n", addr + off);
       goto on_error;
     {
       fprintf(stderr, "erase_flash_page(0x%x) == -1\n", addr + off);
       goto on_error;
index 9ce085bc559b91981b7c462dfb7da680295d4fe3..b902c1762073810c69d6bc634555ff281d07d9d9 100644 (file)
@@ -155,4 +155,7 @@ void stlink_write_mem8(struct stlink *sl, uint32_t addr, uint16_t len);
 void stlink_write_mem32(struct stlink *sl, uint32_t addr, uint16_t len);
 void stlink_close(struct stlink *sl);
 
 void stlink_write_mem32(struct stlink *sl, uint32_t addr, uint16_t len);
 void stlink_close(struct stlink *sl);
 
+int stlink_erase_flash_page(struct stlink* sl, stm32_addr_t page);
+int stlink_erase_flash_mass(struct stlink* sl);
+
 #endif
 #endif