]> git.sur5r.net Git - openocd/blobdiff - src/flash/flash.c
simplify XScale debug handler installation
[openocd] / src / flash / flash.c
index c386579d0804132cc604b9e08e1cb32dc8e43fd5..d1b023c55b28e11dd369599f553e133510b6842d 100644 (file)
@@ -47,6 +47,8 @@ static int handle_flash_protect_command(struct command_context_s *cmd_ctx, char
 /* flash drivers
  */
 extern flash_driver_t lpc2000_flash;
+extern flash_driver_t lpc288x_flash;
+extern flash_driver_t lpc2900_flash;
 extern flash_driver_t cfi_flash;
 extern flash_driver_t at91sam3_flash;
 extern flash_driver_t at91sam7_flash;
@@ -58,13 +60,14 @@ extern flash_driver_t str9xpec_flash;
 extern flash_driver_t stm32x_flash;
 extern flash_driver_t tms470_flash;
 extern flash_driver_t ecosflash_flash;
-extern flash_driver_t lpc288x_flash;
 extern flash_driver_t ocl_flash;
 extern flash_driver_t pic32mx_flash;
 extern flash_driver_t avr_flash;
 
 flash_driver_t *flash_drivers[] = {
        &lpc2000_flash,
+       &lpc288x_flash,
+       &lpc2900_flash,
        &cfi_flash,
        &at91sam7_flash,
        &at91sam3_flash,
@@ -76,7 +79,6 @@ flash_driver_t *flash_drivers[] = {
        &stm32x_flash,
        &tms470_flash,
        &ecosflash_flash,
-       &lpc288x_flash,
        &ocl_flash,
        &pic32mx_flash,
        &avr_flash,
@@ -557,82 +559,122 @@ static int handle_flash_protect_check_command(struct command_context_s *cmd_ctx,
        return ERROR_OK;
 }
 
-static int handle_flash_erase_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int flash_check_sector_parameters(struct command_context_s *cmd_ctx,
+               uint32_t first, uint32_t last, uint32_t num_sectors)
+{
+       if (!(first <= last)) {
+               command_print(cmd_ctx, "ERROR: "
+                               "first sector must be <= last sector");
+               return ERROR_FAIL;
+       }
+
+       if (!(last <= (num_sectors - 1))) {
+               command_print(cmd_ctx, "ERROR: last sector must be <= %d",
+                               (int) num_sectors - 1);
+               return ERROR_FAIL;
+       }
+
+       return ERROR_OK;
+}
+
+static int handle_flash_erase_command(struct command_context_s *cmd_ctx,
+               char *cmd, char **args, int argc)
 {
        if (argc > 2)
        {
-               int first = strtoul(args[1], NULL, 0);
-               int last = strtoul(args[2], NULL, 0);
+               uint32_t bank_nr;
+               uint32_t first;
+               uint32_t last;
                int retval;
-               flash_bank_t *p = get_flash_bank_by_num(strtoul(args[0], NULL, 0));
-               duration_t duration;
-               char *duration_text;
 
-               duration_start_measure(&duration);
+               if ((retval = parse_u32(args[0], &bank_nr)) != ERROR_OK)
+                       return retval;
 
+               flash_bank_t *p = get_flash_bank_by_num(bank_nr);
                if (!p)
-               {
-                       return ERROR_COMMAND_SYNTAX_ERROR;
-               }
+                       return ERROR_OK;
 
-               if ((retval = flash_driver_erase(p, first, last)) == ERROR_OK)
-               {
-                       if ((retval = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
-                       {
+               if ((retval = parse_u32(args[1], &first)) != ERROR_OK)
+                       return retval;
+               if (strcmp(args[2], "last") == 0)
+                       last = p->num_sectors - 1;
+               else
+                       if ((retval = parse_u32(args[2], &last)) != ERROR_OK)
                                return retval;
-                       }
 
-                       command_print(cmd_ctx, "erased sectors %i through %i on flash bank %li in %s",
-                               first, last, strtoul(args[0], 0, 0), duration_text);
+               if ((retval = flash_check_sector_parameters(cmd_ctx,
+                               first, last, p->num_sectors)) != ERROR_OK)
+                       return retval;
+
+               duration_t duration;
+               char *duration_text;
+               duration_start_measure(&duration);
+
+               if ((retval = flash_driver_erase(p, first, last)) == ERROR_OK) {
+                       if ((retval = duration_stop_measure(&duration,
+                                               &duration_text)) != ERROR_OK)
+                               return retval;
+                       command_print(cmd_ctx, "erased sectors %i through %i "
+                                       "on flash bank %i in %s",
+                               (int) first, (int) last, (int) bank_nr,
+                               duration_text);
                        free(duration_text);
                }
        }
        else
-       {
                return ERROR_COMMAND_SYNTAX_ERROR;
-       }
 
        return ERROR_OK;
 }
 
-static int handle_flash_protect_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int handle_flash_protect_command(struct command_context_s *cmd_ctx,
+               char *cmd, char **args, int argc)
 {
        if (argc > 3)
        {
-               int first = strtoul(args[1], NULL, 0);
-               int last = strtoul(args[2], NULL, 0);
-               int set;
+               uint32_t bank_nr;
+               uint32_t first;
+               uint32_t last;
                int retval;
-               flash_bank_t *p = get_flash_bank_by_num(strtoul(args[0], NULL, 0));
+               int set;
+
+               if ((retval = parse_u32(args[0], &bank_nr)) != ERROR_OK)
+                       return retval;
+
+               flash_bank_t *p = get_flash_bank_by_num(bank_nr);
                if (!p)
-               {
-                       command_print(cmd_ctx, "flash bank '#%s' is out of bounds", args[0]);
                        return ERROR_OK;
-               }
+
+               if ((retval = parse_u32(args[1], &first)) != ERROR_OK)
+                       return retval;
+               if (strcmp(args[2], "last") == 0)
+                       last = p->num_sectors - 1;
+               else
+                       if ((retval = parse_u32(args[2], &last)) != ERROR_OK)
+                               return retval;
 
                if (strcmp(args[3], "on") == 0)
                        set = 1;
                else if (strcmp(args[3], "off") == 0)
                        set = 0;
                else
-               {
                        return ERROR_COMMAND_SYNTAX_ERROR;
-               }
+
+               if ((retval = flash_check_sector_parameters(cmd_ctx,
+                               first, last, p->num_sectors)) != ERROR_OK)
+                       return retval;
 
                retval = flash_driver_protect(p, set, first, last);
-               if (retval == ERROR_OK)
-               {
-                       command_print(cmd_ctx, "%s protection for sectors %i through %i on flash bank %li",
-                               (set) ? "set" : "cleared", first,
-                               last, strtoul(args[0], 0, 0));
+               if (retval == ERROR_OK) {
+                       command_print(cmd_ctx, "%s protection for sectors %i "
+                                       "through %i on flash bank %i",
+                               (set) ? "set" : "cleared", (int) first,
+                               (int) last, (int) bank_nr);
                }
        }
        else
-       {
                return ERROR_COMMAND_SYNTAX_ERROR;
 
-       }
-
        return ERROR_OK;
 }
 
@@ -708,15 +750,16 @@ static int handle_flash_write_image_command(struct command_context_s *cmd_ctx, c
                image_close(&image);
                return retvaltemp;
        }
-       if (retval == ERROR_OK)
-       {
-               command_print(cmd_ctx,
-                                         "wrote %" PRIu32 " byte from file %s in %s (%f kb/s)",
-                                         written,
-                                         args[0],
-                                         duration_text,
-                                         (float)written / 1024.0 / ((float)duration.duration.tv_sec + ((float)duration.duration.tv_usec / 1000000.0)));
-       }
+
+       float speed;
+
+       speed = written / 1024.0;
+       speed /= ((float)duration.duration.tv_sec
+                       + ((float)duration.duration.tv_usec / 1000000.0));
+       command_print(cmd_ctx,
+                       "wrote %" PRIu32 " byte from file %s in %s (%f kb/s)",
+                       written, args[0], duration_text, speed);
+
        free(duration_text);
 
        image_close(&image);
@@ -828,18 +871,15 @@ static int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cm
                return retval;
        }
 
-       if (err == ERROR_OK)
-       {
-               float speed;
-               speed = wrote / 1024.0;
-               speed/=((float)duration.duration.tv_sec + ((float)duration.duration.tv_usec / 1000000.0));
-               command_print(cmd_ctx,
-                                         "wrote %" PRId32 " bytes to 0x%8.8" PRIx32 " in %s (%f kb/s)",
-                                         count*wordsize,
-                                         address,
-                                         duration_text,
-                                         speed);
-       }
+       float speed;
+
+       speed = wrote / 1024.0;
+       speed /= ((float)duration.duration.tv_sec
+                       + ((float)duration.duration.tv_usec / 1000000.0));
+       command_print(cmd_ctx,
+                       "wrote %" PRIu32 " bytes to 0x%8.8" PRIx32 " in %s (%f kb/s)",
+                       wrote, address, duration_text, speed);
+
        free(duration_text);
        return ERROR_OK;
 }