printf format warning fixes
[fw/openocd] / src / flash / flash.c
index a850ced94fa5f2ae163c0d48577d46573eae937e..d1b023c55b28e11dd369599f553e133510b6842d 100644 (file)
@@ -2,7 +2,7 @@
  *   Copyright (C) 2005 by Dominic Rath                                    *
  *   Dominic.Rath@gmx.de                                                   *
  *                                                                         *
- *   Copyright (C) 2007,2008 Øyvind Harboe                                 *
+ *   Copyright (C) 2007,2008 Øyvind Harboe                                 *
  *   oyvind.harboe@zylin.com                                               *
  *                                                                         *
  *   Copyright (C) 2008 by Spencer Oliver                                  *
@@ -47,7 +47,10 @@ 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;
 extern flash_driver_t str7x_flash;
 extern flash_driver_t str9x_flash;
@@ -57,15 +60,17 @@ 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,
        &str7x_flash,
        &str9x_flash,
        &aduc702x_flash,
@@ -74,7 +79,6 @@ flash_driver_t *flash_drivers[] = {
        &stm32x_flash,
        &tms470_flash,
        &ecosflash_flash,
-       &lpc288x_flash,
        &ocl_flash,
        &pic32mx_flash,
        &avr_flash,
@@ -92,7 +96,7 @@ static int flash_driver_write(struct flash_bank_s *bank, uint8_t *buffer, uint32
        retval = bank->driver->write(bank, buffer, offset, count);
        if (retval != ERROR_OK)
        {
-               LOG_ERROR("error writing to flash at address 0x%08" PRIx32 " at offset 0x%8.8" PRIx32 " (%d)", 
+               LOG_ERROR("error writing to flash at address 0x%08" PRIx32 " at offset 0x%8.8" PRIx32 " (%d)",
                          bank->base, offset, retval);
        }
 
@@ -350,13 +354,13 @@ static int handle_flash_info_command(struct command_context_s *cmd_ctx, char *cm
                        if ((retval = p->driver->auto_probe(p)) != ERROR_OK)
                                return retval;
 
-                       command_print(cmd_ctx, 
+                       command_print(cmd_ctx,
                                      "#%" PRIi32 " : %s at 0x%8.8" PRIx32 ", size 0x%8.8" PRIx32 ", buswidth %i, chipwidth %i",
                                      i,
-                                     p->driver->name, 
-                                     p->base, 
-                                     p->size, 
-                                     p->bus_width, 
+                                     p->driver->name,
+                                     p->base,
+                                     p->size,
+                                     p->bus_width,
                                      p->chip_width);
                        for (j = 0; j < p->num_sectors; j++)
                        {
@@ -369,11 +373,11 @@ static int handle_flash_info_command(struct command_context_s *cmd_ctx, char *cm
                                else
                                        protect_state = "protection state unknown";
 
-                               command_print(cmd_ctx, 
+                               command_print(cmd_ctx,
                                              "\t#%3i: 0x%8.8" PRIx32 " (0x%" PRIx32 " %" PRIi32 "kB) %s",
                                              j,
-                                             p->sectors[j].offset, 
-                                             p->sectors[j].size, 
+                                             p->sectors[j].offset,
+                                             p->sectors[j].size,
                                              p->sectors[j].size >> 10,
                                              protect_state);
                        }
@@ -462,9 +466,9 @@ static int handle_flash_erase_check_command(struct command_context_s *cmd_ctx, c
 
                        command_print(cmd_ctx,
                                      "\t#%3i: 0x%8.8" PRIx32 " (0x%" PRIx32 " %" PRIi32 "kB) %s",
-                                     j, 
-                                     p->sectors[j].offset, 
-                                     p->sectors[j].size, 
+                                     j,
+                                     p->sectors[j].offset,
+                                     p->sectors[j].size,
                                      p->sectors[j].size >> 10,
                                      erase_state);
                }
@@ -555,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;
 }
 
@@ -706,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);
@@ -791,9 +836,9 @@ static int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cm
 
        duration_start_measure(&duration);
 
-       for (wrote = 0; wrote<(count*wordsize); wrote += cur_size)
+       for (wrote = 0; wrote < (count*wordsize); wrote += cur_size)
        {
-               cur_size = MIN( (count*wordsize - wrote), sizeof(chunk) );
+               cur_size = MIN((count*wordsize - wrote), sizeof(chunk));
                flash_bank_t *bank;
                bank = get_flash_bank_by_addr(target, address);
                if (bank == NULL)
@@ -809,11 +854,11 @@ static int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cm
                        return err;
 
                unsigned i;
-               for (i = 0; i<cur_size; i++)
+               for (i = 0; i < cur_size; i++)
                {
                        if (readback[i]!=chunk[i])
                        {
-                               LOG_ERROR("Verfication error address 0x%08" PRIx32 ", read back 0x%02x, expected 0x%02x", 
+                               LOG_ERROR("Verfication error address 0x%08" PRIx32 ", read back 0x%02x, expected 0x%02x",
                                                  address + wrote + i, readback[i], chunk[i]);
                                return ERROR_FAIL;
                        }
@@ -826,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;
 }
@@ -896,12 +938,12 @@ static int handle_flash_write_bank_command(struct command_context_s *cmd_ctx, ch
        }
        if (retval == ERROR_OK)
        {
-       command_print(cmd_ctx, 
+       command_print(cmd_ctx,
                                  "wrote  %lld byte from file %s to flash bank %li at offset 0x%8.8" PRIx32 " in %s (%f kb/s)",
-                                 fileio.size, 
-                                 args[1], 
-                                 strtoul(args[0], NULL, 0), 
-                                 offset, 
+                                 fileio.size,
+                                 args[1],
+                                 strtoul(args[0], NULL, 0),
+                                 offset,
                                  duration_text,
                                  (float)fileio.size / 1024.0 / ((float)duration.duration.tv_sec + ((float)duration.duration.tv_usec / 1000000.0)));
        }
@@ -994,7 +1036,7 @@ int flash_erase_address_range(target_t *target, uint32_t addr, uint32_t length)
                }
        }
 
-       if ( first == -1 || last == -1 )
+       if (first == -1 || last == -1)
                return ERROR_OK;
 
        return flash_driver_erase(c, first, last);
@@ -1076,7 +1118,7 @@ int flash_write(target_t *target, image_t *image, uint32_t *written, int erase)
                        run_size += pad_bytes;
                        padding[section_last] = 0;
 
-                       LOG_INFO("Padding image section %d with %d bytes", section_last-1, pad_bytes );
+                       LOG_INFO("Padding image section %d with %d bytes", section_last-1, pad_bytes);
                }
 
                /* fit the run into bank constraints */
@@ -1127,7 +1169,7 @@ int flash_write(target_t *target, image_t *image, uint32_t *written, int erase)
                if (erase)
                {
                        /* calculate and erase sectors */
-                       retval = flash_erase_address_range( target, run_address, run_size );
+                       retval = flash_erase_address_range(target, run_address, run_size);
                }
 
                if (retval == ERROR_OK)