ocd_flash_banks now returns empty list when no flash banks are configured instead...
[fw/openocd] / src / flash / flash.c
index 5f09c72dd7b8f57497f1ac579d063a2c3873eb53..d5a9210ca7db6c04590752942362cebd0ed5fbdc 100644 (file)
@@ -188,10 +188,10 @@ static int jim_flash_banks(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 
 int flash_init_drivers(struct command_context_s *cmd_ctx)
 {
+       register_jim(cmd_ctx, "ocd_flash_banks", jim_flash_banks, "return information about the flash banks");
+
        if (flash_banks)
        {
-               register_jim(cmd_ctx, "ocd_flash_banks", jim_flash_banks, "return information about the flash banks");
-
                register_command(cmd_ctx, flash_cmd, "info", handle_flash_info_command, COMMAND_EXEC,
                                                 "print info about flash bank <num>");
                register_command(cmd_ctx, flash_cmd, "probe", handle_flash_probe_command, COMMAND_EXEC,
@@ -206,7 +206,7 @@ int flash_init_drivers(struct command_context_s *cmd_ctx)
                                                 "erase address range <address> <length>");
 
                register_command(cmd_ctx, flash_cmd, "fillw", handle_flash_fill_command, COMMAND_EXEC,
-                                                "fill with pattern <address> <word_pattern> <count>");
+                                                "fill with pattern (no autoerase) <address> <word_pattern> <count>");
                register_command(cmd_ctx, flash_cmd, "fillh", handle_flash_fill_command, COMMAND_EXEC,
                                                 "fill with pattern <address> <halfword_pattern> <count>");
                register_command(cmd_ctx, flash_cmd, "fillb", handle_flash_fill_command, COMMAND_EXEC,
@@ -514,7 +514,10 @@ int handle_flash_erase_address_command(struct command_context_s *cmd_ctx, char *
 
        if ((retval = flash_erase_address_range(target, address, length)) == ERROR_OK)
        {
-               duration_stop_measure(&duration, &duration_text);
+               if ((retval = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
+               {
+                       return retval;
+               }
                command_print(cmd_ctx, "erased address 0x%8.8x length %i in %s", address, length, duration_text);
                free(duration_text);
        }
@@ -576,7 +579,10 @@ int handle_flash_erase_command(struct command_context_s *cmd_ctx, char *cmd, cha
 
                if ((retval = flash_driver_erase(p, first, last)) == ERROR_OK)
                {
-                       duration_stop_measure(&duration, &duration_text);
+                       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", first, last, strtoul(args[0], 0, 0), duration_text);
                        free(duration_text);
@@ -639,7 +645,7 @@ int handle_flash_write_image_command(struct command_context_s *cmd_ctx, char *cm
        duration_t duration;
        char *duration_text;
 
-       int retval;
+       int retval, retvaltemp;
 
        if (argc < 1)
        {
@@ -697,7 +703,11 @@ int handle_flash_write_image_command(struct command_context_s *cmd_ctx, char *cm
                return retval;
        }
 
-       duration_stop_measure(&duration, &duration_text);
+       if ((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
+       {
+               image_close(&image);
+               return retvaltemp;
+       }
        if (retval == ERROR_OK)
        {
                command_print(cmd_ctx, "wrote %u byte from file %s in %s (%f kb/s)",
@@ -713,7 +723,7 @@ int handle_flash_write_image_command(struct command_context_s *cmd_ctx, char *cm
 
 int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
-       int err = ERROR_OK;
+       int err = ERROR_OK, retval;
        u32 address;
        u32 pattern;
        u32 count;
@@ -779,31 +789,26 @@ int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cmd, char
 
        duration_start_measure(&duration);
 
-       flash_set_dirty();
-       err = flash_erase_address_range( target, address, count*wordsize );
-       if (err == ERROR_OK)
+       for (wrote=0; wrote<(count*wordsize); wrote+=sizeof(chunk))
        {
-               for (wrote=0; wrote<(count*wordsize); wrote+=sizeof(chunk))
+               int cur_size = MIN( (count*wordsize - wrote) , 1024 );
+               flash_bank_t *bank;
+               bank = get_flash_bank_by_addr(target, address);
+               if(bank == NULL)
                {
-                       int cur_size = MIN( (count*wordsize - wrote) , 1024 );
-                       if (err == ERROR_OK)
-                       {
-                               flash_bank_t *bank;
-                               bank = get_flash_bank_by_addr(target, address);
-                               if(bank == NULL)
-                               {
-                                       err = ERROR_FAIL;
-                                       break;
-                               }
-                               err = flash_driver_write(bank, chunk, address - bank->base + wrote, cur_size);
-                               wrote += cur_size;
-                       }
-                       if (err!=ERROR_OK)
-                               break;
+                       return ERROR_FAIL;
                }
+               err = flash_driver_write(bank, chunk, address - bank->base + wrote, cur_size);
+               if (err!=ERROR_OK)
+                       return err;
+               wrote += cur_size;
+       }
+
+       if ((retval = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
+       {
+               return retval;
        }
 
-       duration_stop_measure(&duration, &duration_text);
 
        if(err == ERROR_OK)
        {
@@ -829,7 +834,7 @@ int handle_flash_write_bank_command(struct command_context_s *cmd_ctx, char *cmd
        duration_t duration;
        char *duration_text;
 
-       int retval;
+       int retval, retvaltemp;
        flash_bank_t *p;
 
        if (argc != 3)
@@ -865,8 +870,12 @@ int handle_flash_write_bank_command(struct command_context_s *cmd_ctx, char *cmd
        free(buffer);
        buffer = NULL;
 
-       duration_stop_measure(&duration, &duration_text);
-       if (retval!=ERROR_OK)
+       if ((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
+       {
+               fileio_close(&fileio);
+               return retvaltemp;
+       }
+       if (retval==ERROR_OK)
        {
        command_print(cmd_ctx, "wrote  %"PRIi64" byte from file %s to flash bank %i at offset 0x%8.8x in %s (%f kb/s)",
                fileio.size, args[1], strtoul(args[0], NULL, 0), offset, duration_text,
@@ -1169,7 +1178,7 @@ int default_flash_blank_check(struct flash_bank_s *bank)
        int i;
        int retval;
        int fast_check = 0;
-       int blank;
+       u32 blank;
 
        if (bank->target->state != TARGET_HALTED)
        {