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 if (image_open(&image
, args
[0], (argc
== 4) ? args
[2] : NULL
) != ERROR_OK
)
569 command_print(cmd_ctx
, "flash write error: %s", image
.error_str
);
573 failed
= malloc(sizeof(int) * image
.num_sections
);
576 retval
= flash_write(target
, &image
, &written
, &error_str
, failed
, auto_erase
);
578 if (retval
!= ERROR_OK
)
582 command_print(cmd_ctx
, "failed writing image %s: %s", args
[0], error_str
);
590 for (i
= 0; i
< image
.num_sections
; i
++)
594 command_print(cmd_ctx
, "didn't write section at 0x%8.8x, size 0x%8.8x",
595 image
.sections
[i
].base_address
, image
.sections
[i
].size
);
599 duration_stop_measure(&duration
, &duration_text
);
600 command_print(cmd_ctx
, "wrote %u byte from file %s in %s (%f kb/s)",
601 written
, args
[0], duration_text
,
602 (float)written
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
612 int handle_flash_write_binary_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
628 command_print(cmd_ctx
, "usage: flash write <bank> <file> <offset>");
632 duration_start_measure(&duration
);
634 offset
= strtoul(args
[2], NULL
, 0);
635 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
638 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
642 if (fileio_open(&fileio
, args
[1], FILEIO_READ
, FILEIO_BINARY
) != ERROR_OK
)
644 command_print(cmd_ctx
, "flash write error: %s", fileio
.error_str
);
648 buffer
= malloc(fileio
.size
);
649 if (fileio_read(&fileio
, fileio
.size
, buffer
, &buf_cnt
) != ERROR_OK
)
651 command_print(cmd_ctx
, "flash write error: %s", fileio
.error_str
);
655 if ((retval
= p
->driver
->write(p
, buffer
, offset
, buf_cnt
)) != ERROR_OK
)
657 command_print(cmd_ctx
, "failed writing file %s to flash bank %i at offset 0x%8.8x",
658 args
[1], strtoul(args
[0], NULL
, 0), strtoul(args
[2], NULL
, 0));
661 case ERROR_TARGET_NOT_HALTED
:
662 command_print(cmd_ctx
, "can't work with this flash while target is running");
664 case ERROR_INVALID_ARGUMENTS
:
665 command_print(cmd_ctx
, "usage: flash write <bank> <file> <offset>");
667 case ERROR_FLASH_BANK_INVALID
:
668 command_print(cmd_ctx
, "no '%s' flash found at 0x%8.8x", p
->driver
->name
, p
->base
);
670 case ERROR_FLASH_OPERATION_FAILED
:
671 command_print(cmd_ctx
, "flash program error");
673 case ERROR_FLASH_DST_BREAKS_ALIGNMENT
:
674 command_print(cmd_ctx
, "offset breaks required alignment");
676 case ERROR_FLASH_DST_OUT_OF_BANK
:
677 command_print(cmd_ctx
, "destination is out of flash bank (offset and/or file too large)");
679 case ERROR_FLASH_SECTOR_NOT_ERASED
:
680 command_print(cmd_ctx
, "destination sector(s) not erased");
683 command_print(cmd_ctx
, "unknown error");
689 duration_stop_measure(&duration
, &duration_text
);
690 command_print(cmd_ctx
, "wrote %"PRIi64
" byte from file %s to flash bank %i at offset 0x%8.8x in %s (%f kb/s)",
691 fileio
.size
, args
[1], strtoul(args
[0], NULL
, 0), offset
, duration_text
,
692 (float)fileio
.size
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
695 fileio_close(&fileio
);
700 /* lookup flash bank by address */
701 flash_bank_t
*get_flash_bank_by_addr(target_t
*target
, u32 addr
)
705 /* cycle through bank list */
706 for (c
= flash_banks
; c
; c
= c
->next
)
708 /* check whether address belongs to this flash bank */
709 if ((addr
>= c
->base
) && (addr
< c
->base
+ c
->size
) && target
== c
->target
)
716 /* erase given flash region, selects proper bank according to target and address */
717 int flash_erase(target_t
*target
, u32 addr
, u32 length
)
724 if ((c
= get_flash_bank_by_addr(target
, addr
)) == NULL
)
725 return ERROR_FLASH_DST_OUT_OF_BANK
; /* no corresponding bank found */
727 if (c
->size
== 0 || c
->num_sectors
== 0)
728 return ERROR_FLASH_BANK_INVALID
;
732 /* special case, erase whole bank when length is zero */
734 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
736 return c
->driver
->erase(c
, 0, c
->num_sectors
- 1);
739 /* check whether it fits */
740 if (addr
+ length
> c
->base
+ c
->size
)
741 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
745 for (i
= 0; i
< c
->num_sectors
; i
++)
747 /* check whether sector overlaps with the given range and is not yet erased */
748 if (addr
< c
->sectors
[i
].offset
+ c
->sectors
[i
].size
&& addr
+ length
> c
->sectors
[i
].offset
&& c
->sectors
[i
].is_erased
!= 1) {
749 /* if first is not set yet then this is the first sector */
752 last
= i
; /* and it is the last one so far in any case */
756 if( first
== -1 || last
== -1 )
759 return c
->driver
->erase(c
, first
, last
);
762 /* write an image to flash memory of the given target */
763 int flash_write(target_t
*target
, image_t
*image
, u32
*written
, char **error_str
, int *failed
, int erase
)
778 for (i
= 0; i
< image
->num_sections
; i
++)
781 /* loop until we reach end of the image */
782 while (section
< image
->num_sections
)
789 u32 run_address
= image
->sections
[section
].base_address
+section_offset
;
790 u32 run_size
= image
->sections
[section
].size
-section_offset
;
792 if (image
->sections
[section
].size
== 0)
794 WARNING("empty section %d", section
);
800 /* find the corresponding flash bank */
801 if ((c
= get_flash_bank_by_addr(target
, run_address
)) == NULL
)
805 if (error_str
== NULL
)
806 return ERROR_FLASH_DST_OUT_OF_BANK
; /* abort operation */
807 *error_str
= malloc(FLASH_MAX_ERROR_STR
);
808 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "no flash mapped at requested address");
809 return ERROR_FLASH_DST_OUT_OF_BANK
; /* abort operation */
811 failed
[section
] = ERROR_FLASH_DST_OUT_OF_BANK
; /* mark the section as failed */
812 section
++; /* and skip it */
817 /* collect consecutive sections which fall into the same bank */
818 section_first
= section
;
819 section_last
= section
;
820 while ((run_address
+ run_size
< c
->base
+ c
->size
)
821 && (section_last
+ 1 < image
->num_sections
))
823 if (image
->sections
[section_last
+ 1].base_address
< (run_address
+ run_size
))
825 WARNING("section %d out of order", section_last
+ 1);
828 if (image
->sections
[section_last
+ 1].base_address
!= (run_address
+ run_size
))
830 run_size
+= image
->sections
[++section_last
].size
;
833 /* fit the run into bank constraints */
834 if (run_address
+ run_size
> c
->base
+ c
->size
)
835 run_size
= c
->base
+ c
->size
- run_address
;
837 /* allocate buffer */
838 buffer
= malloc(run_size
);
841 /* read sections to the buffer */
842 while (buffer_size
< run_size
)
846 if (buffer_size
- run_size
<= image
->sections
[section
].size
- section_offset
)
847 size_read
= buffer_size
- run_size
;
849 size_read
= image
->sections
[section
].size
- section_offset
;
851 if ((retval
= image_read_section(image
, section
, section_offset
,
852 run_size
, buffer
+ buffer_size
, &size_read
)) != ERROR_OK
|| size_read
== 0)
856 if (error_str
== NULL
)
857 return ERROR_IMAGE_TEMPORARILY_UNAVAILABLE
;
859 *error_str
= malloc(FLASH_MAX_ERROR_STR
);
861 /* if image_read_section returned an error there's an error string we can pass on */
862 if (retval
!= ERROR_OK
)
863 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "error reading from image: %s", image
->error_str
);
865 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "error reading from image");
867 return ERROR_IMAGE_TEMPORARILY_UNAVAILABLE
;
870 buffer_size
+= size_read
;
871 section_offset
+= size_read
;
873 if (section_offset
>= image
->sections
[section
].size
)
884 /* calculate and erase sectors */
885 retval
= flash_erase( target
, run_address
, run_size
);
888 if (retval
== ERROR_OK
)
890 /* write flash sectors */
891 retval
= c
->driver
->write(c
, buffer
, run_address
- c
->base
, run_size
);
896 if (retval
!= ERROR_OK
)
898 if (error_str
== NULL
)
899 return retval
; /* abort operation */
901 *error_str
= malloc(FLASH_MAX_ERROR_STR
);
904 case ERROR_TARGET_NOT_HALTED
:
905 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "can't flash image while target is running");
907 case ERROR_INVALID_ARGUMENTS
:
908 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "flash driver can't fulfill request");
910 case ERROR_FLASH_OPERATION_FAILED
:
911 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "flash program error");
913 case ERROR_FLASH_DST_BREAKS_ALIGNMENT
:
914 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "offset breaks required alignment");
916 case ERROR_FLASH_DST_OUT_OF_BANK
:
917 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "no flash mapped at requested address");
919 case ERROR_FLASH_SECTOR_NOT_ERASED
:
920 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "destination sector(s) not erased");
923 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "unknown error: %i", retval
);
926 return retval
; /* abort operation */
930 *written
+= run_size
; /* add run size to total written counter */
936 int handle_flash_auto_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
940 command_print(cmd_ctx
, "usage: flash auto_erase <on|off>");
944 if (strcmp(args
[0], "on") == 0)
946 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)