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_erase_address_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
47 int handle_flash_protect_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
48 int handle_flash_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
49 int handle_flash_write_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
50 int handle_flash_write_binary_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
51 int handle_flash_write_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
52 int handle_flash_protect_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
53 int handle_flash_auto_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
54 flash_bank_t
*get_flash_bank_by_addr(target_t
*target
, u32 addr
);
58 extern flash_driver_t lpc2000_flash
;
59 extern flash_driver_t cfi_flash
;
60 extern flash_driver_t at91sam7_flash
;
61 extern flash_driver_t str7x_flash
;
62 extern flash_driver_t str9x_flash
;
63 extern flash_driver_t stellaris_flash
;
64 extern flash_driver_t str9xpec_flash
;
65 extern flash_driver_t stm32x_flash
;
67 flash_driver_t
*flash_drivers
[] =
80 flash_bank_t
*flash_banks
;
81 static command_t
*flash_cmd
;
82 static int auto_erase
= 0;
84 int flash_register_commands(struct command_context_s
*cmd_ctx
)
86 flash_cmd
= register_command(cmd_ctx
, NULL
, "flash", NULL
, COMMAND_ANY
, NULL
);
88 register_command(cmd_ctx
, flash_cmd
, "bank", handle_flash_bank_command
, COMMAND_CONFIG
, NULL
);
93 int flash_init(struct command_context_s
*cmd_ctx
)
97 register_command(cmd_ctx
, flash_cmd
, "banks", handle_flash_banks_command
, COMMAND_EXEC
,
98 "list configured flash banks ");
99 register_command(cmd_ctx
, flash_cmd
, "info", handle_flash_info_command
, COMMAND_EXEC
,
100 "print info about flash bank <num>");
101 register_command(cmd_ctx
, flash_cmd
, "probe", handle_flash_probe_command
, COMMAND_EXEC
,
102 "identify flash bank <num>");
103 register_command(cmd_ctx
, flash_cmd
, "erase_check", handle_flash_erase_check_command
, COMMAND_EXEC
,
104 "check erase state of sectors in flash bank <num>");
105 register_command(cmd_ctx
, flash_cmd
, "protect_check", handle_flash_protect_check_command
, COMMAND_EXEC
,
106 "check protection state of sectors in flash bank <num>");
107 register_command(cmd_ctx
, flash_cmd
, "erase", handle_flash_erase_command
, COMMAND_EXEC
,
108 "DEPRECATED, use 'erase_sector' instead");
109 register_command(cmd_ctx
, flash_cmd
, "erase_sector", handle_flash_erase_command
, COMMAND_EXEC
,
110 "erase sectors at <bank> <first> <last>");
111 register_command(cmd_ctx
, flash_cmd
, "erase_address", handle_flash_erase_address_command
, COMMAND_EXEC
,
112 "erase address range <address> <length>");
113 register_command(cmd_ctx
, flash_cmd
, "write", handle_flash_write_binary_command
, COMMAND_EXEC
,
114 "DEPRECATED, use 'write_binary' instead");
115 register_command(cmd_ctx
, flash_cmd
, "write_binary", handle_flash_write_binary_command
, COMMAND_EXEC
,
116 "write binary <bank> <file> <offset>");
117 register_command(cmd_ctx
, flash_cmd
, "write_image", handle_flash_write_image_command
, COMMAND_EXEC
,
118 "write_image <file> [offset] [type]");
119 register_command(cmd_ctx
, flash_cmd
, "protect", handle_flash_protect_command
, COMMAND_EXEC
,
120 "set protection of sectors at <bank> <first> <last> <on|off>");
121 register_command(cmd_ctx
, flash_cmd
, "auto_erase", handle_flash_auto_erase_command
, COMMAND_EXEC
,
122 "auto erase flash sectors <on|off>");
128 flash_bank_t
*get_flash_bank_by_num(int num
)
133 for (p
= flash_banks
; p
; p
= p
->next
)
144 /* flash_bank <driver> <base> <size> <chip_width> <bus_width> <target> [driver_options ...]
146 int handle_flash_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
154 WARNING("incomplete flash_bank configuration");
155 WARNING("flash_bank <driver> <base> <size> <chip_width> <bus_width> <target> [driver_options ...]");
159 if ((target
= get_target_by_num(strtoul(args
[5], NULL
, 0))) == NULL
)
161 ERROR("target %lu not defined", strtoul(args
[5], NULL
, 0));
165 for (i
= 0; flash_drivers
[i
]; i
++)
167 if (strcmp(args
[0], flash_drivers
[i
]->name
) == 0)
171 /* register flash specific commands */
172 if (flash_drivers
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
174 ERROR("couldn't register '%s' commands", args
[0]);
178 c
= malloc(sizeof(flash_bank_t
));
180 c
->driver
= flash_drivers
[i
];
181 c
->driver_priv
= NULL
;
182 c
->base
= strtoul(args
[1], NULL
, 0);
183 c
->size
= strtoul(args
[2], NULL
, 0);
184 c
->chip_width
= strtoul(args
[3], NULL
, 0);
185 c
->bus_width
= strtoul(args
[4], NULL
, 0);
190 if (flash_drivers
[i
]->flash_bank_command(cmd_ctx
, cmd
, args
, argc
, c
) != ERROR_OK
)
192 ERROR("'%s' driver rejected flash bank at 0x%8.8x", args
[0], c
->base
);
197 /* put flash bank in linked list */
200 /* find last flash bank */
201 for (p
= flash_banks
; p
&& p
->next
; p
= p
->next
);
214 /* no matching flash driver found */
217 ERROR("flash driver '%s' not found", args
[0]);
224 int handle_flash_banks_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
231 command_print(cmd_ctx
, "no flash banks configured");
235 for (p
= flash_banks
; p
; p
= p
->next
)
237 command_print(cmd_ctx
, "#%i: %s at 0x%8.8x, size 0x%8.8x, buswidth %i, chipwidth %i",
238 i
++, p
->driver
->name
, p
->base
, p
->size
, p
->bus_width
, p
->chip_width
);
244 int handle_flash_info_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
252 command_print(cmd_ctx
, "usage: flash info <num>");
256 for (p
= flash_banks
; p
; p
= p
->next
, i
++)
258 if (i
== strtoul(args
[0], NULL
, 0))
262 command_print(cmd_ctx
, "#%i: %s at 0x%8.8x, size 0x%8.8x, buswidth %i, chipwidth %i",
263 i
, p
->driver
->name
, p
->base
, p
->size
, p
->bus_width
, p
->chip_width
);
264 for (j
= 0; j
< p
->num_sectors
; j
++)
266 char *erase_state
, *protect_state
;
268 if (p
->sectors
[j
].is_erased
== 0)
269 erase_state
= "not erased";
270 else if (p
->sectors
[j
].is_erased
== 1)
271 erase_state
= "erased";
273 erase_state
= "erase state unknown";
275 if (p
->sectors
[j
].is_protected
== 0)
276 protect_state
= "not protected";
277 else if (p
->sectors
[j
].is_protected
== 1)
278 protect_state
= "protected";
280 protect_state
= "protection state unknown";
282 command_print(cmd_ctx
, "\t#%i: 0x%8.8x (0x%x %ikB) %s, %s",
283 j
, p
->sectors
[j
].offset
, p
->sectors
[j
].size
, p
->sectors
[j
].size
>>10,
284 erase_state
, protect_state
);
287 p
->driver
->info(p
, buf
, 1024);
288 command_print(cmd_ctx
, "%s", buf
);
295 int handle_flash_probe_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
302 command_print(cmd_ctx
, "usage: flash probe <num>");
306 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
309 if ((retval
= p
->driver
->probe(p
)) == ERROR_OK
)
311 command_print(cmd_ctx
, "flash '%s' found at 0x%8.8x", p
->driver
->name
, p
->base
);
313 else if (retval
== ERROR_FLASH_BANK_INVALID
)
315 command_print(cmd_ctx
, "probing failed for flash bank '#%s' at 0x%8.8x",
320 command_print(cmd_ctx
, "unknown error when probing flash bank '#%s' at 0x%8.8x",
326 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
332 int handle_flash_erase_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
339 command_print(cmd_ctx
, "usage: flash erase_check <num>");
343 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
346 if ((retval
= p
->driver
->erase_check(p
)) == ERROR_OK
)
348 command_print(cmd_ctx
, "successfully checked erase state", p
->driver
->name
, p
->base
);
352 command_print(cmd_ctx
, "unknown error when checking erase state of flash bank #%s at 0x%8.8x",
358 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
364 int handle_flash_erase_address_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
373 target_t
*target
= get_current_target(cmd_ctx
);
377 command_print(cmd_ctx
, "usage: flash erase_address <address> <length>");
381 address
= strtoul(args
[0], NULL
, 0);
382 length
= strtoul(args
[1], NULL
, 0);
385 command_print(cmd_ctx
, "Length must be >0");
386 return ERROR_INVALID_ARGUMENTS
;
389 p
= get_flash_bank_by_addr(target
, address
);
392 command_print(cmd_ctx
, "No flash at that address");
393 return ERROR_INVALID_ARGUMENTS
;
396 duration_start_measure(&duration
);
398 if ((retval
= flash_erase(target
, address
, length
)) != ERROR_OK
)
402 case ERROR_TARGET_NOT_HALTED
:
403 command_print(cmd_ctx
, "can't work with this flash while target is running");
405 case ERROR_INVALID_ARGUMENTS
:
406 command_print(cmd_ctx
, "usage: flash erase_address <address> <length>");
408 case ERROR_FLASH_BANK_INVALID
:
409 command_print(cmd_ctx
, "no '%s' flash found at 0x%8.8x", p
->driver
->name
, p
->base
);
411 case ERROR_FLASH_OPERATION_FAILED
:
412 command_print(cmd_ctx
, "flash erase error");
414 case ERROR_FLASH_SECTOR_INVALID
:
415 command_print(cmd_ctx
, "sector number(s) invalid");
418 command_print(cmd_ctx
, "unknown error");
423 duration_stop_measure(&duration
, &duration_text
);
424 command_print(cmd_ctx
, "erased address 0x%8.8x length %i in %s", address
, length
, duration_text
);
431 int handle_flash_protect_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
438 command_print(cmd_ctx
, "usage: flash protect_check <num>");
442 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
445 if ((retval
= p
->driver
->protect_check(p
)) == ERROR_OK
)
447 command_print(cmd_ctx
, "successfully checked protect state");
449 else if (retval
== ERROR_FLASH_OPERATION_FAILED
)
451 command_print(cmd_ctx
, "checking protection state failed (possibly unsupported) by flash #%s at 0x%8.8x", args
[0], p
->base
);
455 command_print(cmd_ctx
, "unknown error when checking protection state of flash bank '#%s' at 0x%8.8x", args
[0], p
->base
);
460 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
466 int handle_flash_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
470 int first
= strtoul(args
[1], NULL
, 0);
471 int last
= strtoul(args
[2], NULL
, 0);
473 flash_bank_t
*p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
477 duration_start_measure(&duration
);
481 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
485 if ((retval
= p
->driver
->erase(p
, first
, last
)) != ERROR_OK
)
489 case ERROR_TARGET_NOT_HALTED
:
490 command_print(cmd_ctx
, "can't work with this flash while target is running");
492 case ERROR_INVALID_ARGUMENTS
:
493 command_print(cmd_ctx
, "usage: flash_erase <bank> <first> <last>");
495 case ERROR_FLASH_BANK_INVALID
:
496 command_print(cmd_ctx
, "no '%s' flash found at 0x%8.8x", p
->driver
->name
, p
->base
);
498 case ERROR_FLASH_OPERATION_FAILED
:
499 command_print(cmd_ctx
, "flash erase error");
501 case ERROR_FLASH_SECTOR_INVALID
:
502 command_print(cmd_ctx
, "sector number(s) invalid");
505 command_print(cmd_ctx
, "erased flash sectors %i to %i", first
, last
);
508 command_print(cmd_ctx
, "unknown error");
513 duration_stop_measure(&duration
, &duration_text
);
515 command_print(cmd_ctx
, "erased sectors %i through %i on flash bank %i in %s", first
, last
, strtoul(args
[0], 0, 0), duration_text
);
521 command_print(cmd_ctx
, "usage: flash erase <bank> <first> <last>");
527 int handle_flash_protect_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
531 int first
= strtoul(args
[1], NULL
, 0);
532 int last
= strtoul(args
[2], NULL
, 0);
535 flash_bank_t
*p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
538 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
542 if (strcmp(args
[3], "on") == 0)
544 else if (strcmp(args
[3], "off") == 0)
548 command_print(cmd_ctx
, "usage: flash protect <bank> <first> <last> <on|off>");
552 if ((retval
= p
->driver
->protect(p
, set
, first
, last
)) != ERROR_OK
)
556 case ERROR_TARGET_NOT_HALTED
:
557 command_print(cmd_ctx
, "can't work with this flash while target is running");
559 case ERROR_INVALID_ARGUMENTS
:
560 command_print(cmd_ctx
, "usage: flash protect <bank> <first> <last> <on|off>");
562 case ERROR_FLASH_BANK_INVALID
:
563 command_print(cmd_ctx
, "no '%s' flash found at 0x%8.8x", p
->driver
->name
, p
->base
);
565 case ERROR_FLASH_OPERATION_FAILED
:
566 command_print(cmd_ctx
, "flash program error");
568 case ERROR_FLASH_SECTOR_INVALID
:
569 command_print(cmd_ctx
, "sector number(s) invalid");
572 command_print(cmd_ctx
, "protection of flash sectors %i to %i turned %s", first
, last
, args
[3]);
575 command_print(cmd_ctx
, "unknown error");
580 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));
585 command_print(cmd_ctx
, "usage: flash protect <bank> <first> <last> <on|off>");
591 int handle_flash_write_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
593 target_t
*target
= get_current_target(cmd_ctx
);
609 command_print(cmd_ctx
, "usage: flash %s <file> [offset] [type]", cmd
);
610 return ERROR_INVALID_ARGUMENTS
;
615 ERROR("no target selected");
619 duration_start_measure(&duration
);
623 image
.base_address_set
= 1;
624 image
.base_address
= strtoul(args
[1], NULL
, 0);
628 image
.base_address_set
= 0;
629 image
.base_address
= 0x0;
632 image
.start_address_set
= 0;
634 retval
= image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
);
635 if (retval
!= ERROR_OK
)
637 command_print(cmd_ctx
, "image_open error: %s", image
.error_str
);
641 failed
= malloc(sizeof(int) * image
.num_sections
);
645 retval
= flash_write(target
, &image
, &written
, &error_str
, failed
, auto_erase
);
647 if (retval
!= ERROR_OK
)
651 command_print(cmd_ctx
, "failed writing image %s: %s", args
[0], error_str
);
659 for (i
= 0; i
< image
.num_sections
; i
++)
663 command_print(cmd_ctx
, "didn't write section at 0x%8.8x, size 0x%8.8x",
664 image
.sections
[i
].base_address
, image
.sections
[i
].size
);
668 duration_stop_measure(&duration
, &duration_text
);
669 command_print(cmd_ctx
, "wrote %u byte from file %s in %s (%f kb/s)",
670 written
, args
[0], duration_text
,
671 (float)written
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
680 int handle_flash_write_binary_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
696 command_print(cmd_ctx
, "usage: flash write_binary <bank> <file> <offset>");
700 duration_start_measure(&duration
);
702 offset
= strtoul(args
[2], NULL
, 0);
703 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
706 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
710 if (fileio_open(&fileio
, args
[1], FILEIO_READ
, FILEIO_BINARY
) != ERROR_OK
)
712 command_print(cmd_ctx
, "flash write_binary error: %s", fileio
.error_str
);
716 buffer
= malloc(fileio
.size
);
717 if (fileio_read(&fileio
, fileio
.size
, buffer
, &buf_cnt
) != ERROR_OK
)
719 command_print(cmd_ctx
, "flash write_binary error: %s", fileio
.error_str
);
723 if ((retval
= p
->driver
->write(p
, buffer
, offset
, buf_cnt
)) != ERROR_OK
)
725 command_print(cmd_ctx
, "failed writing file %s to flash bank %i at offset 0x%8.8x",
726 args
[1], strtoul(args
[0], NULL
, 0), strtoul(args
[2], NULL
, 0));
730 case ERROR_TARGET_NOT_HALTED
:
731 command_print(cmd_ctx
, "can't work with this flash while target is running");
733 case ERROR_INVALID_ARGUMENTS
:
734 command_print(cmd_ctx
, "usage: flash write <bank> <file> <offset>");
736 case ERROR_FLASH_BANK_INVALID
:
737 command_print(cmd_ctx
, "no '%s' flash found at 0x%8.8x", p
->driver
->name
, p
->base
);
739 case ERROR_FLASH_OPERATION_FAILED
:
740 command_print(cmd_ctx
, "flash program error");
742 case ERROR_FLASH_DST_BREAKS_ALIGNMENT
:
743 command_print(cmd_ctx
, "offset breaks required alignment");
745 case ERROR_FLASH_DST_OUT_OF_BANK
:
746 command_print(cmd_ctx
, "destination is out of flash bank (offset and/or file too large)");
748 case ERROR_FLASH_SECTOR_NOT_ERASED
:
749 command_print(cmd_ctx
, "destination sector(s) not erased");
752 command_print(cmd_ctx
, "unknown error");
758 duration_stop_measure(&duration
, &duration_text
);
759 command_print(cmd_ctx
, "wrote %"PRIi64
" byte from file %s to flash bank %i at offset 0x%8.8x in %s (%f kb/s)",
760 fileio
.size
, args
[1], strtoul(args
[0], NULL
, 0), offset
, duration_text
,
761 (float)fileio
.size
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
764 fileio_close(&fileio
);
769 /* lookup flash bank by address */
770 flash_bank_t
*get_flash_bank_by_addr(target_t
*target
, u32 addr
)
774 /* cycle through bank list */
775 for (c
= flash_banks
; c
; c
= c
->next
)
777 /* check whether address belongs to this flash bank */
778 if ((addr
>= c
->base
) && (addr
< c
->base
+ c
->size
) && target
== c
->target
)
785 /* erase given flash region, selects proper bank according to target and address */
786 int flash_erase(target_t
*target
, u32 addr
, u32 length
)
793 if ((c
= get_flash_bank_by_addr(target
, addr
)) == NULL
)
794 return ERROR_FLASH_DST_OUT_OF_BANK
; /* no corresponding bank found */
796 if (c
->size
== 0 || c
->num_sectors
== 0)
797 return ERROR_FLASH_BANK_INVALID
;
801 /* special case, erase whole bank when length is zero */
803 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
805 return c
->driver
->erase(c
, 0, c
->num_sectors
- 1);
808 /* check whether it fits */
809 if (addr
+ length
> c
->base
+ c
->size
)
810 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
814 for (i
= 0; i
< c
->num_sectors
; i
++)
816 /* check whether sector overlaps with the given range and is not yet erased */
817 if (addr
< c
->sectors
[i
].offset
+ c
->sectors
[i
].size
&& addr
+ length
> c
->sectors
[i
].offset
&& c
->sectors
[i
].is_erased
!= 1) {
818 /* if first is not set yet then this is the first sector */
821 last
= i
; /* and it is the last one so far in any case */
825 if( first
== -1 || last
== -1 )
828 return c
->driver
->erase(c
, first
, last
);
831 /* write (optional verify) an image to flash memory of the given target */
832 int flash_write(target_t
*target
, image_t
*image
, u32
*written
, char **error_str
, int *failed
, int erase
)
847 for (i
= 0; i
< image
->num_sections
; i
++)
850 /* loop until we reach end of the image */
851 while (section
< image
->num_sections
)
858 u32 run_address
= image
->sections
[section
].base_address
+ section_offset
;
859 u32 run_size
= image
->sections
[section
].size
- section_offset
;
861 if (image
->sections
[section
].size
== 0)
863 WARNING("empty section %d", section
);
869 /* find the corresponding flash bank */
870 if ((c
= get_flash_bank_by_addr(target
, run_address
)) == NULL
)
874 if (error_str
== NULL
)
875 return ERROR_FLASH_DST_OUT_OF_BANK
; /* abort operation */
876 *error_str
= malloc(FLASH_MAX_ERROR_STR
);
877 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "no flash mapped at requested address");
878 return ERROR_FLASH_DST_OUT_OF_BANK
; /* abort operation */
880 failed
[section
] = ERROR_FLASH_DST_OUT_OF_BANK
; /* mark the section as failed */
881 section
++; /* and skip it */
886 /* collect consecutive sections which fall into the same bank */
887 section_first
= section
;
888 section_last
= section
;
889 while ((run_address
+ run_size
< c
->base
+ c
->size
)
890 && (section_last
+ 1 < image
->num_sections
))
892 if (image
->sections
[section_last
+ 1].base_address
< (run_address
+ run_size
))
894 DEBUG("section %d out of order(very slightly surprising, but supported)", section_last
+ 1);
897 if (image
->sections
[section_last
+ 1].base_address
!= (run_address
+ run_size
))
899 run_size
+= image
->sections
[++section_last
].size
;
902 /* fit the run into bank constraints */
903 if (run_address
+ run_size
> c
->base
+ c
->size
)
904 run_size
= c
->base
+ c
->size
- run_address
;
906 /* allocate buffer */
907 buffer
= malloc(run_size
);
910 /* read sections to the buffer */
911 while (buffer_size
< run_size
)
915 if (buffer_size
- run_size
<= image
->sections
[section
].size
- section_offset
)
916 size_read
= buffer_size
- run_size
;
918 size_read
= image
->sections
[section
].size
- section_offset
;
920 if ((retval
= image_read_section(image
, section
, section_offset
,
921 size_read
, buffer
+ buffer_size
, &size_read
)) != ERROR_OK
|| size_read
== 0)
925 if (error_str
== NULL
)
926 return ERROR_IMAGE_TEMPORARILY_UNAVAILABLE
;
928 *error_str
= malloc(FLASH_MAX_ERROR_STR
);
930 /* if image_read_section returned an error there's an error string we can pass on */
931 if (retval
!= ERROR_OK
)
932 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "error reading from image: %s", image
->error_str
);
934 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "error reading from image");
936 return ERROR_IMAGE_TEMPORARILY_UNAVAILABLE
;
939 buffer_size
+= size_read
;
940 section_offset
+= size_read
;
942 if (section_offset
>= image
->sections
[section
].size
)
953 /* calculate and erase sectors */
954 retval
= flash_erase( target
, run_address
, run_size
);
957 if (retval
== ERROR_OK
)
959 /* write flash sectors */
960 retval
= c
->driver
->write(c
, buffer
, run_address
- c
->base
, run_size
);
965 if (retval
!= ERROR_OK
)
967 if (error_str
== NULL
)
968 return retval
; /* abort operation */
970 *error_str
= malloc(FLASH_MAX_ERROR_STR
);
973 case ERROR_TARGET_NOT_HALTED
:
974 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "can't flash image while target is running");
976 case ERROR_INVALID_ARGUMENTS
:
977 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "flash driver can't fulfill request");
979 case ERROR_FLASH_OPERATION_FAILED
:
980 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "flash program error");
982 case ERROR_FLASH_DST_BREAKS_ALIGNMENT
:
983 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "offset breaks required alignment");
985 case ERROR_FLASH_DST_OUT_OF_BANK
:
986 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "no flash mapped at requested address");
988 case ERROR_FLASH_SECTOR_NOT_ERASED
:
989 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "destination sector(s) not erased");
992 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "unknown error: %i", retval
);
995 return retval
; /* abort operation */
999 *written
+= run_size
; /* add run size to total written counter */
1005 int handle_flash_auto_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1009 command_print(cmd_ctx
, "usage: flash auto_erase <on|off>");
1013 if (strcmp(args
[0], "on") == 0)
1015 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)