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 /* We can't know if we did a resume + halt, in which case we no longer know the erased state */
399 duration_start_measure(&duration
);
401 if ((retval
= flash_erase(target
, address
, length
)) != ERROR_OK
)
405 case ERROR_TARGET_NOT_HALTED
:
406 command_print(cmd_ctx
, "can't work with this flash while target is running");
408 case ERROR_INVALID_ARGUMENTS
:
409 command_print(cmd_ctx
, "usage: flash erase_address <address> <length>");
411 case ERROR_FLASH_BANK_INVALID
:
412 command_print(cmd_ctx
, "no '%s' flash found at 0x%8.8x", p
->driver
->name
, p
->base
);
414 case ERROR_FLASH_OPERATION_FAILED
:
415 command_print(cmd_ctx
, "flash erase error");
417 case ERROR_FLASH_SECTOR_INVALID
:
418 command_print(cmd_ctx
, "sector number(s) invalid");
421 command_print(cmd_ctx
, "unknown error");
426 duration_stop_measure(&duration
, &duration_text
);
427 command_print(cmd_ctx
, "erased address 0x%8.8x length %i in %s", address
, length
, duration_text
);
434 int handle_flash_protect_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
441 command_print(cmd_ctx
, "usage: flash protect_check <num>");
445 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
448 if ((retval
= p
->driver
->protect_check(p
)) == ERROR_OK
)
450 command_print(cmd_ctx
, "successfully checked protect state");
452 else if (retval
== ERROR_FLASH_OPERATION_FAILED
)
454 command_print(cmd_ctx
, "checking protection state failed (possibly unsupported) by flash #%s at 0x%8.8x", args
[0], p
->base
);
458 command_print(cmd_ctx
, "unknown error when checking protection state of flash bank '#%s' at 0x%8.8x", args
[0], p
->base
);
463 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
469 int handle_flash_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
473 int first
= strtoul(args
[1], NULL
, 0);
474 int last
= strtoul(args
[2], NULL
, 0);
476 flash_bank_t
*p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
480 duration_start_measure(&duration
);
484 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
488 if ((retval
= p
->driver
->erase(p
, first
, last
)) != ERROR_OK
)
492 case ERROR_TARGET_NOT_HALTED
:
493 command_print(cmd_ctx
, "can't work with this flash while target is running");
495 case ERROR_INVALID_ARGUMENTS
:
496 command_print(cmd_ctx
, "usage: flash_erase <bank> <first> <last>");
498 case ERROR_FLASH_BANK_INVALID
:
499 command_print(cmd_ctx
, "no '%s' flash found at 0x%8.8x", p
->driver
->name
, p
->base
);
501 case ERROR_FLASH_OPERATION_FAILED
:
502 command_print(cmd_ctx
, "flash erase error");
504 case ERROR_FLASH_SECTOR_INVALID
:
505 command_print(cmd_ctx
, "sector number(s) invalid");
508 command_print(cmd_ctx
, "erased flash sectors %i to %i", first
, last
);
511 command_print(cmd_ctx
, "unknown error");
516 duration_stop_measure(&duration
, &duration_text
);
518 command_print(cmd_ctx
, "erased sectors %i through %i on flash bank %i in %s", first
, last
, strtoul(args
[0], 0, 0), duration_text
);
524 command_print(cmd_ctx
, "usage: flash erase <bank> <first> <last>");
530 int handle_flash_protect_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
534 int first
= strtoul(args
[1], NULL
, 0);
535 int last
= strtoul(args
[2], NULL
, 0);
538 flash_bank_t
*p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
541 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
545 if (strcmp(args
[3], "on") == 0)
547 else if (strcmp(args
[3], "off") == 0)
551 command_print(cmd_ctx
, "usage: flash protect <bank> <first> <last> <on|off>");
555 if ((retval
= p
->driver
->protect(p
, set
, first
, last
)) != ERROR_OK
)
559 case ERROR_TARGET_NOT_HALTED
:
560 command_print(cmd_ctx
, "can't work with this flash while target is running");
562 case ERROR_INVALID_ARGUMENTS
:
563 command_print(cmd_ctx
, "usage: flash protect <bank> <first> <last> <on|off>");
565 case ERROR_FLASH_BANK_INVALID
:
566 command_print(cmd_ctx
, "no '%s' flash found at 0x%8.8x", p
->driver
->name
, p
->base
);
568 case ERROR_FLASH_OPERATION_FAILED
:
569 command_print(cmd_ctx
, "flash program error");
571 case ERROR_FLASH_SECTOR_INVALID
:
572 command_print(cmd_ctx
, "sector number(s) invalid");
575 command_print(cmd_ctx
, "protection of flash sectors %i to %i turned %s", first
, last
, args
[3]);
578 command_print(cmd_ctx
, "unknown error");
583 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));
588 command_print(cmd_ctx
, "usage: flash protect <bank> <first> <last> <on|off>");
594 int handle_flash_write_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
596 target_t
*target
= get_current_target(cmd_ctx
);
612 command_print(cmd_ctx
, "usage: flash %s <file> [offset] [type]", cmd
);
613 return ERROR_INVALID_ARGUMENTS
;
618 ERROR("no target selected");
622 duration_start_measure(&duration
);
626 image
.base_address_set
= 1;
627 image
.base_address
= strtoul(args
[1], NULL
, 0);
631 image
.base_address_set
= 0;
632 image
.base_address
= 0x0;
635 image
.start_address_set
= 0;
637 retval
= image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
);
638 if (retval
!= ERROR_OK
)
640 command_print(cmd_ctx
, "image_open error: %s", image
.error_str
);
644 failed
= malloc(sizeof(int) * image
.num_sections
);
648 retval
= flash_write(target
, &image
, &written
, &error_str
, failed
, auto_erase
);
650 if (retval
!= ERROR_OK
)
654 command_print(cmd_ctx
, "failed writing image %s: %s", args
[0], error_str
);
662 for (i
= 0; i
< image
.num_sections
; i
++)
666 command_print(cmd_ctx
, "didn't write section at 0x%8.8x, size 0x%8.8x",
667 image
.sections
[i
].base_address
, image
.sections
[i
].size
);
671 duration_stop_measure(&duration
, &duration_text
);
672 command_print(cmd_ctx
, "wrote %u byte from file %s in %s (%f kb/s)",
673 written
, args
[0], duration_text
,
674 (float)written
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
683 int handle_flash_write_binary_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
699 command_print(cmd_ctx
, "usage: flash write_binary <bank> <file> <offset>");
703 duration_start_measure(&duration
);
705 offset
= strtoul(args
[2], NULL
, 0);
706 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
709 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
713 if (fileio_open(&fileio
, args
[1], FILEIO_READ
, FILEIO_BINARY
) != ERROR_OK
)
715 command_print(cmd_ctx
, "flash write_binary error: %s", fileio
.error_str
);
719 buffer
= malloc(fileio
.size
);
720 if (fileio_read(&fileio
, fileio
.size
, buffer
, &buf_cnt
) != ERROR_OK
)
722 command_print(cmd_ctx
, "flash write_binary error: %s", fileio
.error_str
);
726 if ((retval
= p
->driver
->write(p
, buffer
, offset
, buf_cnt
)) != ERROR_OK
)
728 command_print(cmd_ctx
, "failed writing file %s to flash bank %i at offset 0x%8.8x",
729 args
[1], strtoul(args
[0], NULL
, 0), strtoul(args
[2], NULL
, 0));
733 case ERROR_TARGET_NOT_HALTED
:
734 command_print(cmd_ctx
, "can't work with this flash while target is running");
736 case ERROR_INVALID_ARGUMENTS
:
737 command_print(cmd_ctx
, "usage: flash write <bank> <file> <offset>");
739 case ERROR_FLASH_BANK_INVALID
:
740 command_print(cmd_ctx
, "no '%s' flash found at 0x%8.8x", p
->driver
->name
, p
->base
);
742 case ERROR_FLASH_OPERATION_FAILED
:
743 command_print(cmd_ctx
, "flash program error");
745 case ERROR_FLASH_DST_BREAKS_ALIGNMENT
:
746 command_print(cmd_ctx
, "offset breaks required alignment");
748 case ERROR_FLASH_DST_OUT_OF_BANK
:
749 command_print(cmd_ctx
, "destination is out of flash bank (offset and/or file too large)");
751 case ERROR_FLASH_SECTOR_NOT_ERASED
:
752 command_print(cmd_ctx
, "destination sector(s) not erased");
755 command_print(cmd_ctx
, "unknown error");
761 duration_stop_measure(&duration
, &duration_text
);
762 command_print(cmd_ctx
, "wrote %"PRIi64
" byte from file %s to flash bank %i at offset 0x%8.8x in %s (%f kb/s)",
763 fileio
.size
, args
[1], strtoul(args
[0], NULL
, 0), offset
, duration_text
,
764 (float)fileio
.size
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
767 fileio_close(&fileio
);
772 void flash_set_dirty(void)
777 /* set all flash to require erasing */
778 for (c
= flash_banks
; c
; c
= c
->next
)
780 for (i
= 0; i
< c
->num_sectors
; i
++)
782 c
->sectors
[i
].is_erased
= 0;
787 /* lookup flash bank by address */
788 flash_bank_t
*get_flash_bank_by_addr(target_t
*target
, u32 addr
)
792 /* cycle through bank list */
793 for (c
= flash_banks
; c
; c
= c
->next
)
795 /* check whether address belongs to this flash bank */
796 if ((addr
>= c
->base
) && (addr
< c
->base
+ c
->size
) && target
== c
->target
)
803 /* erase given flash region, selects proper bank according to target and address */
804 int flash_erase(target_t
*target
, u32 addr
, u32 length
)
811 if ((c
= get_flash_bank_by_addr(target
, addr
)) == NULL
)
812 return ERROR_FLASH_DST_OUT_OF_BANK
; /* no corresponding bank found */
814 if (c
->size
== 0 || c
->num_sectors
== 0)
815 return ERROR_FLASH_BANK_INVALID
;
819 /* special case, erase whole bank when length is zero */
821 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
823 return c
->driver
->erase(c
, 0, c
->num_sectors
- 1);
826 /* check whether it fits */
827 if (addr
+ length
> c
->base
+ c
->size
)
828 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
832 for (i
= 0; i
< c
->num_sectors
; i
++)
834 /* check whether sector overlaps with the given range and is not yet erased */
835 if (addr
< c
->sectors
[i
].offset
+ c
->sectors
[i
].size
&& addr
+ length
> c
->sectors
[i
].offset
&& c
->sectors
[i
].is_erased
!= 1) {
836 /* if first is not set yet then this is the first sector */
839 last
= i
; /* and it is the last one so far in any case */
843 if( first
== -1 || last
== -1 )
846 return c
->driver
->erase(c
, first
, last
);
849 /* write (optional verify) an image to flash memory of the given target */
850 int flash_write(target_t
*target
, image_t
*image
, u32
*written
, char **error_str
, int *failed
, int erase
)
866 for (i
= 0; i
< image
->num_sections
; i
++)
871 /* assume all sectors need erasing - stops any problems
872 * when flash_write is called multiple times */
877 /* loop until we reach end of the image */
878 while (section
< image
->num_sections
)
884 u32 run_address
= image
->sections
[section
].base_address
+ section_offset
;
885 u32 run_size
= image
->sections
[section
].size
- section_offset
;
887 if (image
->sections
[section
].size
== 0)
889 WARNING("empty section %d", section
);
895 /* find the corresponding flash bank */
896 if ((c
= get_flash_bank_by_addr(target
, run_address
)) == NULL
)
900 if (error_str
== NULL
)
901 return ERROR_FLASH_DST_OUT_OF_BANK
; /* abort operation */
902 *error_str
= malloc(FLASH_MAX_ERROR_STR
);
903 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "no flash mapped at requested address");
904 return ERROR_FLASH_DST_OUT_OF_BANK
; /* abort operation */
906 failed
[section
] = ERROR_FLASH_DST_OUT_OF_BANK
; /* mark the section as failed */
907 section
++; /* and skip it */
912 /* collect consecutive sections which fall into the same bank */
913 section_first
= section
;
914 section_last
= section
;
915 while ((run_address
+ run_size
< c
->base
+ c
->size
)
916 && (section_last
+ 1 < image
->num_sections
))
918 if (image
->sections
[section_last
+ 1].base_address
< (run_address
+ run_size
))
920 DEBUG("section %d out of order(very slightly surprising, but supported)", section_last
+ 1);
923 if (image
->sections
[section_last
+ 1].base_address
!= (run_address
+ run_size
))
925 run_size
+= image
->sections
[++section_last
].size
;
928 /* fit the run into bank constraints */
929 if (run_address
+ run_size
> c
->base
+ c
->size
)
930 run_size
= c
->base
+ c
->size
- run_address
;
932 /* allocate buffer */
933 buffer
= malloc(run_size
);
936 /* read sections to the buffer */
937 while (buffer_size
< run_size
)
941 if (buffer_size
- run_size
<= image
->sections
[section
].size
- section_offset
)
942 size_read
= buffer_size
- run_size
;
944 size_read
= image
->sections
[section
].size
- section_offset
;
946 if ((retval
= image_read_section(image
, section
, section_offset
,
947 size_read
, buffer
+ buffer_size
, &size_read
)) != ERROR_OK
|| size_read
== 0)
951 if (error_str
== NULL
)
952 return ERROR_IMAGE_TEMPORARILY_UNAVAILABLE
;
954 *error_str
= malloc(FLASH_MAX_ERROR_STR
);
956 /* if image_read_section returned an error there's an error string we can pass on */
957 if (retval
!= ERROR_OK
)
958 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "error reading from image: %s", image
->error_str
);
960 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "error reading from image");
962 return ERROR_IMAGE_TEMPORARILY_UNAVAILABLE
;
965 buffer_size
+= size_read
;
966 section_offset
+= size_read
;
968 if (section_offset
>= image
->sections
[section
].size
)
979 /* calculate and erase sectors */
980 retval
= flash_erase( target
, run_address
, run_size
);
983 if (retval
== ERROR_OK
)
985 /* write flash sectors */
986 retval
= c
->driver
->write(c
, buffer
, run_address
- c
->base
, run_size
);
991 if (retval
!= ERROR_OK
)
993 if (error_str
== NULL
)
994 return retval
; /* abort operation */
996 *error_str
= malloc(FLASH_MAX_ERROR_STR
);
999 case ERROR_TARGET_NOT_HALTED
:
1000 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "can't flash image while target is running");
1002 case ERROR_INVALID_ARGUMENTS
:
1003 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "flash driver can't fulfill request");
1005 case ERROR_FLASH_OPERATION_FAILED
:
1006 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "flash program error");
1008 case ERROR_FLASH_DST_BREAKS_ALIGNMENT
:
1009 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "offset breaks required alignment");
1011 case ERROR_FLASH_DST_OUT_OF_BANK
:
1012 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "no flash mapped at requested address");
1014 case ERROR_FLASH_SECTOR_NOT_ERASED
:
1015 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "destination sector(s) not erased");
1018 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "unknown error: %i", retval
);
1021 return retval
; /* abort operation */
1024 if (written
!= NULL
)
1025 *written
+= run_size
; /* add run size to total written counter */
1031 int handle_flash_auto_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1035 command_print(cmd_ctx
, "usage: flash auto_erase <on|off>");
1039 if (strcmp(args
[0], "on") == 0)
1041 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)