1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
27 #include "time_support.h"
35 #include <sys/types.h>
40 /* command handlers */
41 int handle_flash_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
42 int handle_flash_banks_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
43 int handle_flash_info_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
44 int handle_flash_probe_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
45 int handle_flash_erase_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
46 int handle_flash_protect_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
47 int handle_flash_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
48 int handle_flash_write_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
49 int handle_flash_write_binary_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
50 int handle_flash_write_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
51 int handle_flash_protect_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
52 int handle_flash_auto_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
56 extern flash_driver_t lpc2000_flash
;
57 extern flash_driver_t cfi_flash
;
58 extern flash_driver_t at91sam7_flash
;
59 extern flash_driver_t str7x_flash
;
60 extern flash_driver_t str9x_flash
;
61 extern flash_driver_t stellaris_flash
;
62 extern flash_driver_t str9xpec_flash
;
63 extern flash_driver_t stm32x_flash
;
65 flash_driver_t
*flash_drivers
[] =
78 flash_bank_t
*flash_banks
;
79 static command_t
*flash_cmd
;
80 static int auto_erase
= 0;
82 int flash_register_commands(struct command_context_s
*cmd_ctx
)
84 flash_cmd
= register_command(cmd_ctx
, NULL
, "flash", NULL
, COMMAND_ANY
, NULL
);
86 register_command(cmd_ctx
, flash_cmd
, "bank", handle_flash_bank_command
, COMMAND_CONFIG
, NULL
);
91 int flash_init(struct command_context_s
*cmd_ctx
)
95 register_command(cmd_ctx
, flash_cmd
, "banks", handle_flash_banks_command
, COMMAND_EXEC
,
96 "list configured flash banks ");
97 register_command(cmd_ctx
, flash_cmd
, "info", handle_flash_info_command
, COMMAND_EXEC
,
98 "print info about flash bank <num>");
99 register_command(cmd_ctx
, flash_cmd
, "probe", handle_flash_probe_command
, COMMAND_EXEC
,
100 "identify flash bank <num>");
101 register_command(cmd_ctx
, flash_cmd
, "erase_check", handle_flash_erase_check_command
, COMMAND_EXEC
,
102 "check erase state of sectors in flash bank <num>");
103 register_command(cmd_ctx
, flash_cmd
, "protect_check", handle_flash_protect_check_command
, COMMAND_EXEC
,
104 "check protection state of sectors in flash bank <num>");
105 register_command(cmd_ctx
, flash_cmd
, "erase", handle_flash_erase_command
, COMMAND_EXEC
,
106 "erase sectors at <bank> <first> <last>");
107 register_command(cmd_ctx
, flash_cmd
, "write", handle_flash_write_binary_command
, COMMAND_EXEC
,
108 "DEPRECATED, use 'write_binary' or 'write_image' instead");
109 register_command(cmd_ctx
, flash_cmd
, "write_binary", handle_flash_write_binary_command
, COMMAND_EXEC
,
110 "write binary <bank> <file> <offset>");
111 register_command(cmd_ctx
, flash_cmd
, "write_image", handle_flash_write_image_command
, COMMAND_EXEC
,
112 "write image <file> [offset] [type]");
113 register_command(cmd_ctx
, flash_cmd
, "protect", handle_flash_protect_command
, COMMAND_EXEC
,
114 "set protection of sectors at <bank> <first> <last> <on|off>");
115 register_command(cmd_ctx
, flash_cmd
, "auto_erase", handle_flash_auto_erase_command
, COMMAND_EXEC
,
116 "auto erase flash sectors <on|off>");
122 flash_bank_t
*get_flash_bank_by_num(int num
)
127 for (p
= flash_banks
; p
; p
= p
->next
)
138 /* flash_bank <driver> <base> <size> <chip_width> <bus_width> <target> [driver_options ...]
140 int handle_flash_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
148 WARNING("incomplete flash_bank configuration");
149 WARNING("flash_bank <driver> <base> <size> <chip_width> <bus_width> <target> [driver_options ...]");
153 if ((target
= get_target_by_num(strtoul(args
[5], NULL
, 0))) == NULL
)
155 ERROR("target %lu not defined", strtoul(args
[5], NULL
, 0));
159 for (i
= 0; flash_drivers
[i
]; i
++)
161 if (strcmp(args
[0], flash_drivers
[i
]->name
) == 0)
165 /* register flash specific commands */
166 if (flash_drivers
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
168 ERROR("couldn't register '%s' commands", args
[0]);
172 c
= malloc(sizeof(flash_bank_t
));
174 c
->driver
= flash_drivers
[i
];
175 c
->driver_priv
= NULL
;
176 c
->base
= strtoul(args
[1], NULL
, 0);
177 c
->size
= strtoul(args
[2], NULL
, 0);
178 c
->chip_width
= strtoul(args
[3], NULL
, 0);
179 c
->bus_width
= strtoul(args
[4], NULL
, 0);
184 if (flash_drivers
[i
]->flash_bank_command(cmd_ctx
, cmd
, args
, argc
, c
) != ERROR_OK
)
186 ERROR("'%s' driver rejected flash bank at 0x%8.8x", args
[0], c
->base
);
191 /* put flash bank in linked list */
194 /* find last flash bank */
195 for (p
= flash_banks
; p
&& p
->next
; p
= p
->next
);
208 /* no matching flash driver found */
211 ERROR("flash driver '%s' not found", args
[0]);
218 int handle_flash_banks_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
225 command_print(cmd_ctx
, "no flash banks configured");
229 for (p
= flash_banks
; p
; p
= p
->next
)
231 command_print(cmd_ctx
, "#%i: %s at 0x%8.8x, size 0x%8.8x, buswidth %i, chipwidth %i",
232 i
++, p
->driver
->name
, p
->base
, p
->size
, p
->bus_width
, p
->chip_width
);
238 int handle_flash_info_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
246 command_print(cmd_ctx
, "usage: flash info <num>");
250 for (p
= flash_banks
; p
; p
= p
->next
, i
++)
252 if (i
== strtoul(args
[0], NULL
, 0))
256 command_print(cmd_ctx
, "#%i: %s at 0x%8.8x, size 0x%8.8x, buswidth %i, chipwidth %i",
257 i
, p
->driver
->name
, p
->base
, p
->size
, p
->bus_width
, p
->chip_width
);
258 for (j
= 0; j
< p
->num_sectors
; j
++)
260 char *erase_state
, *protect_state
;
262 if (p
->sectors
[j
].is_erased
== 0)
263 erase_state
= "not erased";
264 else if (p
->sectors
[j
].is_erased
== 1)
265 erase_state
= "erased";
267 erase_state
= "erase state unknown";
269 if (p
->sectors
[j
].is_protected
== 0)
270 protect_state
= "not protected";
271 else if (p
->sectors
[j
].is_protected
== 1)
272 protect_state
= "protected";
274 protect_state
= "protection state unknown";
276 command_print(cmd_ctx
, "\t#%i: 0x%8.8x (0x%x %ikB) %s, %s",
277 j
, p
->sectors
[j
].offset
, p
->sectors
[j
].size
, p
->sectors
[j
].size
>>10,
278 erase_state
, protect_state
);
281 p
->driver
->info(p
, buf
, 1024);
282 command_print(cmd_ctx
, "%s", buf
);
289 int handle_flash_probe_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
296 command_print(cmd_ctx
, "usage: flash probe <num>");
300 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
303 if ((retval
= p
->driver
->probe(p
)) == ERROR_OK
)
305 command_print(cmd_ctx
, "flash '%s' found at 0x%8.8x", p
->driver
->name
, p
->base
);
307 else if (retval
== ERROR_FLASH_BANK_INVALID
)
309 command_print(cmd_ctx
, "probing failed for flash bank '#%s' at 0x%8.8x",
314 command_print(cmd_ctx
, "unknown error when probing flash bank '#%s' at 0x%8.8x",
320 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
326 int handle_flash_erase_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
333 command_print(cmd_ctx
, "usage: flash erase_check <num>");
337 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
340 if ((retval
= p
->driver
->erase_check(p
)) == ERROR_OK
)
342 command_print(cmd_ctx
, "successfully checked erase state", p
->driver
->name
, p
->base
);
346 command_print(cmd_ctx
, "unknown error when checking erase state of flash bank #%s at 0x%8.8x",
352 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
358 int handle_flash_protect_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
365 command_print(cmd_ctx
, "usage: flash protect_check <num>");
369 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
372 if ((retval
= p
->driver
->protect_check(p
)) == ERROR_OK
)
374 command_print(cmd_ctx
, "successfully checked protect state");
376 else if (retval
== ERROR_FLASH_OPERATION_FAILED
)
378 command_print(cmd_ctx
, "checking protection state failed (possibly unsupported) by flash #%s at 0x%8.8x", args
[0], p
->base
);
382 command_print(cmd_ctx
, "unknown error when checking protection state of flash bank '#%s' at 0x%8.8x", args
[0], p
->base
);
387 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
393 int handle_flash_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
397 int first
= strtoul(args
[1], NULL
, 0);
398 int last
= strtoul(args
[2], NULL
, 0);
400 flash_bank_t
*p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
404 duration_start_measure(&duration
);
408 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
412 if ((retval
= p
->driver
->erase(p
, first
, last
)) != ERROR_OK
)
416 case ERROR_TARGET_NOT_HALTED
:
417 command_print(cmd_ctx
, "can't work with this flash while target is running");
419 case ERROR_INVALID_ARGUMENTS
:
420 command_print(cmd_ctx
, "usage: flash_erase <bank> <first> <last>");
422 case ERROR_FLASH_BANK_INVALID
:
423 command_print(cmd_ctx
, "no '%s' flash found at 0x%8.8x", p
->driver
->name
, p
->base
);
425 case ERROR_FLASH_OPERATION_FAILED
:
426 command_print(cmd_ctx
, "flash erase error");
428 case ERROR_FLASH_SECTOR_INVALID
:
429 command_print(cmd_ctx
, "sector number(s) invalid");
432 command_print(cmd_ctx
, "erased flash sectors %i to %i", first
, last
);
435 command_print(cmd_ctx
, "unknown error");
440 duration_stop_measure(&duration
, &duration_text
);
442 command_print(cmd_ctx
, "erased sectors %i through %i on flash bank %i in %s", first
, last
, strtoul(args
[0], 0, 0), duration_text
);
448 command_print(cmd_ctx
, "usage: flash erase <bank> <first> <last>");
454 int handle_flash_protect_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
458 int first
= strtoul(args
[1], NULL
, 0);
459 int last
= strtoul(args
[2], NULL
, 0);
462 flash_bank_t
*p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
465 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
469 if (strcmp(args
[3], "on") == 0)
471 else if (strcmp(args
[3], "off") == 0)
475 command_print(cmd_ctx
, "usage: flash protect <bank> <first> <last> <on|off>");
479 if ((retval
= p
->driver
->protect(p
, set
, first
, last
)) != ERROR_OK
)
483 case ERROR_TARGET_NOT_HALTED
:
484 command_print(cmd_ctx
, "can't work with this flash while target is running");
486 case ERROR_INVALID_ARGUMENTS
:
487 command_print(cmd_ctx
, "usage: flash protect <bank> <first> <last> <on|off>");
489 case ERROR_FLASH_BANK_INVALID
:
490 command_print(cmd_ctx
, "no '%s' flash found at 0x%8.8x", p
->driver
->name
, p
->base
);
492 case ERROR_FLASH_OPERATION_FAILED
:
493 command_print(cmd_ctx
, "flash program error");
495 case ERROR_FLASH_SECTOR_INVALID
:
496 command_print(cmd_ctx
, "sector number(s) invalid");
499 command_print(cmd_ctx
, "protection of flash sectors %i to %i turned %s", first
, last
, args
[3]);
502 command_print(cmd_ctx
, "unknown error");
507 command_print(cmd_ctx
, "%s protection for sectors %i through %i on flash bank %i", (set
) ? "set" : "cleared", first
, last
, strtoul(args
[0], 0, 0));
512 command_print(cmd_ctx
, "usage: flash protect <bank> <first> <last> <on|off>");
518 int handle_flash_write_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
520 target_t
*target
= get_current_target(cmd_ctx
);
534 if (!strcmp(cmd
, "write"))
536 command_print(cmd_ctx
, "'flash write' has been deprecated in favor of 'flash write_binary' and 'flash write_image'");
537 DEBUG("'flash write' has been deprecated in favor of 'flash write_binary' and 'flash write_image'");
542 command_print(cmd_ctx
, "usage: flash write <file> [offset] [type]");
548 ERROR("no target selected");
552 duration_start_measure(&duration
);
556 image
.base_address_set
= 1;
557 image
.base_address
= strtoul(args
[1], NULL
, 0);
561 image
.base_address_set
= 0;
562 image
.base_address
= 0x0;
565 image
.start_address_set
= 0;
567 retval
= image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
);
568 if (retval
!= ERROR_OK
)
570 command_print(cmd_ctx
, "image_open error: %s", image
.error_str
);
574 failed
= malloc(sizeof(int) * image
.num_sections
);
577 retval
= flash_write(target
, &image
, &written
, &error_str
, failed
, auto_erase
);
579 if (retval
!= ERROR_OK
)
583 command_print(cmd_ctx
, "failed writing image %s: %s", args
[0], error_str
);
591 for (i
= 0; i
< image
.num_sections
; i
++)
595 command_print(cmd_ctx
, "didn't write section at 0x%8.8x, size 0x%8.8x",
596 image
.sections
[i
].base_address
, image
.sections
[i
].size
);
600 duration_stop_measure(&duration
, &duration_text
);
601 command_print(cmd_ctx
, "wrote %u byte from file %s in %s (%f kb/s)",
602 written
, args
[0], duration_text
,
603 (float)written
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
613 int handle_flash_write_binary_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
629 command_print(cmd_ctx
, "usage: flash write <bank> <file> <offset>");
633 duration_start_measure(&duration
);
635 offset
= strtoul(args
[2], NULL
, 0);
636 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
639 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
643 if (fileio_open(&fileio
, args
[1], FILEIO_READ
, FILEIO_BINARY
) != ERROR_OK
)
645 command_print(cmd_ctx
, "flash write error: %s", fileio
.error_str
);
649 buffer
= malloc(fileio
.size
);
650 if (fileio_read(&fileio
, fileio
.size
, buffer
, &buf_cnt
) != ERROR_OK
)
652 command_print(cmd_ctx
, "flash write error: %s", fileio
.error_str
);
656 if ((retval
= p
->driver
->write(p
, buffer
, offset
, buf_cnt
)) != ERROR_OK
)
658 command_print(cmd_ctx
, "failed writing file %s to flash bank %i at offset 0x%8.8x",
659 args
[1], strtoul(args
[0], NULL
, 0), strtoul(args
[2], NULL
, 0));
662 case ERROR_TARGET_NOT_HALTED
:
663 command_print(cmd_ctx
, "can't work with this flash while target is running");
665 case ERROR_INVALID_ARGUMENTS
:
666 command_print(cmd_ctx
, "usage: flash write <bank> <file> <offset>");
668 case ERROR_FLASH_BANK_INVALID
:
669 command_print(cmd_ctx
, "no '%s' flash found at 0x%8.8x", p
->driver
->name
, p
->base
);
671 case ERROR_FLASH_OPERATION_FAILED
:
672 command_print(cmd_ctx
, "flash program error");
674 case ERROR_FLASH_DST_BREAKS_ALIGNMENT
:
675 command_print(cmd_ctx
, "offset breaks required alignment");
677 case ERROR_FLASH_DST_OUT_OF_BANK
:
678 command_print(cmd_ctx
, "destination is out of flash bank (offset and/or file too large)");
680 case ERROR_FLASH_SECTOR_NOT_ERASED
:
681 command_print(cmd_ctx
, "destination sector(s) not erased");
684 command_print(cmd_ctx
, "unknown error");
690 duration_stop_measure(&duration
, &duration_text
);
691 command_print(cmd_ctx
, "wrote %"PRIi64
" byte from file %s to flash bank %i at offset 0x%8.8x in %s (%f kb/s)",
692 fileio
.size
, args
[1], strtoul(args
[0], NULL
, 0), offset
, duration_text
,
693 (float)fileio
.size
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
696 fileio_close(&fileio
);
701 /* lookup flash bank by address */
702 flash_bank_t
*get_flash_bank_by_addr(target_t
*target
, u32 addr
)
706 /* cycle through bank list */
707 for (c
= flash_banks
; c
; c
= c
->next
)
709 /* check whether address belongs to this flash bank */
710 if ((addr
>= c
->base
) && (addr
< c
->base
+ c
->size
) && target
== c
->target
)
717 /* erase given flash region, selects proper bank according to target and address */
718 int flash_erase(target_t
*target
, u32 addr
, u32 length
)
725 if ((c
= get_flash_bank_by_addr(target
, addr
)) == NULL
)
726 return ERROR_FLASH_DST_OUT_OF_BANK
; /* no corresponding bank found */
728 if (c
->size
== 0 || c
->num_sectors
== 0)
729 return ERROR_FLASH_BANK_INVALID
;
733 /* special case, erase whole bank when length is zero */
735 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
737 return c
->driver
->erase(c
, 0, c
->num_sectors
- 1);
740 /* check whether it fits */
741 if (addr
+ length
> c
->base
+ c
->size
)
742 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
746 for (i
= 0; i
< c
->num_sectors
; i
++)
748 /* check whether sector overlaps with the given range and is not yet erased */
749 if (addr
< c
->sectors
[i
].offset
+ c
->sectors
[i
].size
&& addr
+ length
> c
->sectors
[i
].offset
&& c
->sectors
[i
].is_erased
!= 1) {
750 /* if first is not set yet then this is the first sector */
753 last
= i
; /* and it is the last one so far in any case */
757 if( first
== -1 || last
== -1 )
760 return c
->driver
->erase(c
, first
, last
);
763 /* write an image to flash memory of the given target */
764 int flash_write(target_t
*target
, image_t
*image
, u32
*written
, char **error_str
, int *failed
, int erase
)
779 for (i
= 0; i
< image
->num_sections
; i
++)
782 /* loop until we reach end of the image */
783 while (section
< image
->num_sections
)
790 u32 run_address
= image
->sections
[section
].base_address
+section_offset
;
791 u32 run_size
= image
->sections
[section
].size
-section_offset
;
793 if (image
->sections
[section
].size
== 0)
795 WARNING("empty section %d", section
);
801 /* find the corresponding flash bank */
802 if ((c
= get_flash_bank_by_addr(target
, run_address
)) == NULL
)
806 if (error_str
== NULL
)
807 return ERROR_FLASH_DST_OUT_OF_BANK
; /* abort operation */
808 *error_str
= malloc(FLASH_MAX_ERROR_STR
);
809 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "no flash mapped at requested address");
810 return ERROR_FLASH_DST_OUT_OF_BANK
; /* abort operation */
812 failed
[section
] = ERROR_FLASH_DST_OUT_OF_BANK
; /* mark the section as failed */
813 section
++; /* and skip it */
818 /* collect consecutive sections which fall into the same bank */
819 section_first
= section
;
820 section_last
= section
;
821 while ((run_address
+ run_size
< c
->base
+ c
->size
)
822 && (section_last
+ 1 < image
->num_sections
))
824 if (image
->sections
[section_last
+ 1].base_address
< (run_address
+ run_size
))
826 WARNING("section %d out of order", section_last
+ 1);
829 if (image
->sections
[section_last
+ 1].base_address
!= (run_address
+ run_size
))
831 run_size
+= image
->sections
[++section_last
].size
;
834 /* fit the run into bank constraints */
835 if (run_address
+ run_size
> c
->base
+ c
->size
)
836 run_size
= c
->base
+ c
->size
- run_address
;
838 /* allocate buffer */
839 buffer
= malloc(run_size
);
842 /* read sections to the buffer */
843 while (buffer_size
< run_size
)
847 if (buffer_size
- run_size
<= image
->sections
[section
].size
- section_offset
)
848 size_read
= buffer_size
- run_size
;
850 size_read
= image
->sections
[section
].size
- section_offset
;
852 if ((retval
= image_read_section(image
, section
, section_offset
,
853 size_read
, buffer
+ buffer_size
, &size_read
)) != ERROR_OK
|| size_read
== 0)
857 if (error_str
== NULL
)
858 return ERROR_IMAGE_TEMPORARILY_UNAVAILABLE
;
860 *error_str
= malloc(FLASH_MAX_ERROR_STR
);
862 /* if image_read_section returned an error there's an error string we can pass on */
863 if (retval
!= ERROR_OK
)
864 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "error reading from image: %s", image
->error_str
);
866 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "error reading from image");
868 return ERROR_IMAGE_TEMPORARILY_UNAVAILABLE
;
871 buffer_size
+= size_read
;
872 section_offset
+= size_read
;
874 if (section_offset
>= image
->sections
[section
].size
)
885 /* calculate and erase sectors */
886 retval
= flash_erase( target
, run_address
, run_size
);
889 if (retval
== ERROR_OK
)
891 /* write flash sectors */
892 retval
= c
->driver
->write(c
, buffer
, run_address
- c
->base
, run_size
);
897 if (retval
!= ERROR_OK
)
899 if (error_str
== NULL
)
900 return retval
; /* abort operation */
902 *error_str
= malloc(FLASH_MAX_ERROR_STR
);
905 case ERROR_TARGET_NOT_HALTED
:
906 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "can't flash image while target is running");
908 case ERROR_INVALID_ARGUMENTS
:
909 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "flash driver can't fulfill request");
911 case ERROR_FLASH_OPERATION_FAILED
:
912 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "flash program error");
914 case ERROR_FLASH_DST_BREAKS_ALIGNMENT
:
915 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "offset breaks required alignment");
917 case ERROR_FLASH_DST_OUT_OF_BANK
:
918 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "no flash mapped at requested address");
920 case ERROR_FLASH_SECTOR_NOT_ERASED
:
921 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "destination sector(s) not erased");
924 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "unknown error: %i", retval
);
927 return retval
; /* abort operation */
931 *written
+= run_size
; /* add run size to total written counter */
937 int handle_flash_auto_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
941 command_print(cmd_ctx
, "usage: flash auto_erase <on|off>");
945 if (strcmp(args
[0], "on") == 0)
947 else if (strcmp(args
[0], "off") == 0)
Linking to existing account procedure
If you already have an account and want to add another login method
you
MUST first sign in with your existing account and
then change URL to read
https://review.openocd.org/login/?link
to get to this page again but this time it'll work for linking. Thank you.
SSH host keys fingerprints
1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=.. |
|+o.. . |
|*.o . . |
|+B . . . |
|Bo. = o S |
|Oo.+ + = |
|oB=.* = . o |
| =+=.+ + E |
|. .=o . o |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)