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
;
66 extern flash_driver_t tms470_flash
;
68 flash_driver_t
*flash_drivers
[] =
82 flash_bank_t
*flash_banks
;
83 static command_t
*flash_cmd
;
84 static int auto_erase
= 0;
86 int flash_register_commands(struct command_context_s
*cmd_ctx
)
88 flash_cmd
= register_command(cmd_ctx
, NULL
, "flash", NULL
, COMMAND_ANY
, NULL
);
90 register_command(cmd_ctx
, flash_cmd
, "bank", handle_flash_bank_command
, COMMAND_CONFIG
, NULL
);
91 register_command(cmd_ctx
, flash_cmd
, "auto_erase", handle_flash_auto_erase_command
, COMMAND_ANY
,
92 "auto erase flash sectors <on|off>");
96 int flash_init_drivers(struct command_context_s
*cmd_ctx
)
100 register_command(cmd_ctx
, flash_cmd
, "banks", handle_flash_banks_command
, COMMAND_EXEC
,
101 "list configured flash banks ");
102 register_command(cmd_ctx
, flash_cmd
, "info", handle_flash_info_command
, COMMAND_EXEC
,
103 "print info about flash bank <num>");
104 register_command(cmd_ctx
, flash_cmd
, "probe", handle_flash_probe_command
, COMMAND_EXEC
,
105 "identify flash bank <num>");
106 register_command(cmd_ctx
, flash_cmd
, "erase_check", handle_flash_erase_check_command
, COMMAND_EXEC
,
107 "check erase state of sectors in flash bank <num>");
108 register_command(cmd_ctx
, flash_cmd
, "protect_check", handle_flash_protect_check_command
, COMMAND_EXEC
,
109 "check protection state of sectors in flash bank <num>");
110 register_command(cmd_ctx
, flash_cmd
, "erase", handle_flash_erase_command
, COMMAND_EXEC
,
111 "DEPRECATED, use 'erase_sector' instead");
112 register_command(cmd_ctx
, flash_cmd
, "erase_sector", handle_flash_erase_command
, COMMAND_EXEC
,
113 "erase sectors at <bank> <first> <last>");
114 register_command(cmd_ctx
, flash_cmd
, "erase_address", handle_flash_erase_address_command
, COMMAND_EXEC
,
115 "erase address range <address> <length>");
116 register_command(cmd_ctx
, flash_cmd
, "write", handle_flash_write_binary_command
, COMMAND_EXEC
,
117 "DEPRECATED, use 'write_binary' instead");
118 register_command(cmd_ctx
, flash_cmd
, "write_binary", handle_flash_write_binary_command
, COMMAND_EXEC
,
119 "write binary <bank> <file> <offset>");
120 register_command(cmd_ctx
, flash_cmd
, "write_image", handle_flash_write_image_command
, COMMAND_EXEC
,
121 "write_image <file> [offset] [type]");
122 register_command(cmd_ctx
, flash_cmd
, "protect", handle_flash_protect_command
, COMMAND_EXEC
,
123 "set protection of sectors at <bank> <first> <last> <on|off>");
129 flash_bank_t
*get_flash_bank_by_num_noprobe(int num
)
134 for (p
= flash_banks
; p
; p
= p
->next
)
145 flash_bank_t
*get_flash_bank_by_num(int num
)
147 flash_bank_t
*p
= get_flash_bank_by_num_noprobe(num
);
153 retval
= p
->driver
->auto_probe(p
);
155 if (retval
!= ERROR_OK
)
157 ERROR("auto_probe failed %d\n", retval
);
163 /* flash_bank <driver> <base> <size> <chip_width> <bus_width> <target> [driver_options ...]
165 int handle_flash_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
173 WARNING("incomplete flash_bank configuration");
174 WARNING("flash_bank <driver> <base> <size> <chip_width> <bus_width> <target> [driver_options ...]");
178 if ((target
= get_target_by_num(strtoul(args
[5], NULL
, 0))) == NULL
)
180 ERROR("target %lu not defined", strtoul(args
[5], NULL
, 0));
184 for (i
= 0; flash_drivers
[i
]; i
++)
186 if (strcmp(args
[0], flash_drivers
[i
]->name
) == 0)
190 /* register flash specific commands */
191 if (flash_drivers
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
193 ERROR("couldn't register '%s' commands", args
[0]);
197 c
= malloc(sizeof(flash_bank_t
));
199 c
->driver
= flash_drivers
[i
];
200 c
->driver_priv
= NULL
;
201 c
->base
= strtoul(args
[1], NULL
, 0);
202 c
->size
= strtoul(args
[2], NULL
, 0);
203 c
->chip_width
= strtoul(args
[3], NULL
, 0);
204 c
->bus_width
= strtoul(args
[4], NULL
, 0);
209 if (flash_drivers
[i
]->flash_bank_command(cmd_ctx
, cmd
, args
, argc
, c
) != ERROR_OK
)
211 ERROR("'%s' driver rejected flash bank at 0x%8.8x", args
[0], c
->base
);
216 /* put flash bank in linked list */
219 /* find last flash bank */
220 for (p
= flash_banks
; p
&& p
->next
; p
= p
->next
);
233 /* no matching flash driver found */
236 ERROR("flash driver '%s' not found", args
[0]);
243 int handle_flash_banks_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
250 command_print(cmd_ctx
, "no flash banks configured");
254 for (p
= flash_banks
; p
; p
= p
->next
)
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
);
263 int handle_flash_info_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
271 command_print(cmd_ctx
, "usage: flash info <num>");
275 for (p
= flash_banks
; p
; p
= p
->next
, i
++)
277 if (i
== strtoul(args
[0], NULL
, 0))
281 /* attempt auto probe */
282 p
->driver
->auto_probe(p
);
284 command_print(cmd_ctx
, "#%i: %s at 0x%8.8x, size 0x%8.8x, buswidth %i, chipwidth %i",
285 i
, p
->driver
->name
, p
->base
, p
->size
, p
->bus_width
, p
->chip_width
);
286 for (j
= 0; j
< p
->num_sectors
; j
++)
288 char *erase_state
, *protect_state
;
290 if (p
->sectors
[j
].is_erased
== 0)
291 erase_state
= "not erased";
292 else if (p
->sectors
[j
].is_erased
== 1)
293 erase_state
= "erased";
295 erase_state
= "erase state unknown";
297 if (p
->sectors
[j
].is_protected
== 0)
298 protect_state
= "not protected";
299 else if (p
->sectors
[j
].is_protected
== 1)
300 protect_state
= "protected";
302 protect_state
= "protection state unknown";
304 command_print(cmd_ctx
, "\t#%i: 0x%8.8x (0x%x %ikB) %s, %s",
305 j
, p
->sectors
[j
].offset
, p
->sectors
[j
].size
, p
->sectors
[j
].size
>>10,
306 erase_state
, protect_state
);
309 p
->driver
->info(p
, buf
, 1024);
310 command_print(cmd_ctx
, "%s", buf
);
317 int handle_flash_probe_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
324 command_print(cmd_ctx
, "usage: flash probe <num>");
328 p
= get_flash_bank_by_num_noprobe(strtoul(args
[0], NULL
, 0));
331 if ((retval
= p
->driver
->probe(p
)) == ERROR_OK
)
333 command_print(cmd_ctx
, "flash '%s' found at 0x%8.8x", p
->driver
->name
, p
->base
);
335 else if (retval
== ERROR_FLASH_BANK_INVALID
)
337 command_print(cmd_ctx
, "probing failed for flash bank '#%s' at 0x%8.8x",
342 command_print(cmd_ctx
, "unknown error when probing flash bank '#%s' at 0x%8.8x",
348 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
354 int handle_flash_erase_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
361 command_print(cmd_ctx
, "usage: flash erase_check <num>");
365 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
368 if ((retval
= p
->driver
->erase_check(p
)) == ERROR_OK
)
370 command_print(cmd_ctx
, "successfully checked erase state", p
->driver
->name
, p
->base
);
374 command_print(cmd_ctx
, "unknown error when checking erase state of flash bank #%s at 0x%8.8x",
380 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
386 int handle_flash_erase_address_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
395 target_t
*target
= get_current_target(cmd_ctx
);
399 command_print(cmd_ctx
, "usage: flash erase_address <address> <length>");
403 address
= strtoul(args
[0], NULL
, 0);
404 length
= strtoul(args
[1], NULL
, 0);
407 command_print(cmd_ctx
, "Length must be >0");
408 return ERROR_INVALID_ARGUMENTS
;
411 p
= get_flash_bank_by_addr(target
, address
);
414 command_print(cmd_ctx
, "No flash at that address");
415 return ERROR_INVALID_ARGUMENTS
;
418 /* We can't know if we did a resume + halt, in which case we no longer know the erased state */
421 duration_start_measure(&duration
);
423 if ((retval
= flash_erase_address_range(target
, address
, length
)) != ERROR_OK
)
427 case ERROR_TARGET_NOT_HALTED
:
428 command_print(cmd_ctx
, "can't work with this flash while target is running");
430 case ERROR_INVALID_ARGUMENTS
:
431 command_print(cmd_ctx
, "usage: flash erase_address <address> <length>");
433 case ERROR_FLASH_BANK_INVALID
:
434 command_print(cmd_ctx
, "no '%s' flash found at 0x%8.8x", p
->driver
->name
, p
->base
);
436 case ERROR_FLASH_OPERATION_FAILED
:
437 command_print(cmd_ctx
, "flash erase error");
439 case ERROR_FLASH_SECTOR_INVALID
:
440 command_print(cmd_ctx
, "sector number(s) invalid");
443 command_print(cmd_ctx
, "unknown error");
448 duration_stop_measure(&duration
, &duration_text
);
449 command_print(cmd_ctx
, "erased address 0x%8.8x length %i in %s", address
, length
, duration_text
);
456 int handle_flash_protect_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
463 command_print(cmd_ctx
, "usage: flash protect_check <num>");
467 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
470 if ((retval
= p
->driver
->protect_check(p
)) == ERROR_OK
)
472 command_print(cmd_ctx
, "successfully checked protect state");
474 else if (retval
== ERROR_FLASH_OPERATION_FAILED
)
476 command_print(cmd_ctx
, "checking protection state failed (possibly unsupported) by flash #%s at 0x%8.8x", args
[0], p
->base
);
480 command_print(cmd_ctx
, "unknown error when checking protection state of flash bank '#%s' at 0x%8.8x", args
[0], p
->base
);
485 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
491 int handle_flash_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
495 int first
= strtoul(args
[1], NULL
, 0);
496 int last
= strtoul(args
[2], NULL
, 0);
498 flash_bank_t
*p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
502 duration_start_measure(&duration
);
506 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
510 if ((retval
= p
->driver
->erase(p
, first
, last
)) != ERROR_OK
)
514 case ERROR_TARGET_NOT_HALTED
:
515 command_print(cmd_ctx
, "can't work with this flash while target is running");
517 case ERROR_INVALID_ARGUMENTS
:
518 command_print(cmd_ctx
, "usage: flash_erase <bank> <first> <last>");
520 case ERROR_FLASH_BANK_INVALID
:
521 command_print(cmd_ctx
, "no '%s' flash found at 0x%8.8x", p
->driver
->name
, p
->base
);
523 case ERROR_FLASH_OPERATION_FAILED
:
524 command_print(cmd_ctx
, "flash erase error");
526 case ERROR_FLASH_SECTOR_INVALID
:
527 command_print(cmd_ctx
, "sector number(s) invalid");
530 command_print(cmd_ctx
, "erased flash sectors %i to %i", first
, last
);
533 command_print(cmd_ctx
, "unknown error");
538 duration_stop_measure(&duration
, &duration_text
);
540 command_print(cmd_ctx
, "erased sectors %i through %i on flash bank %i in %s", first
, last
, strtoul(args
[0], 0, 0), duration_text
);
546 command_print(cmd_ctx
, "usage: flash erase <bank> <first> <last>");
552 int handle_flash_protect_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
556 int first
= strtoul(args
[1], NULL
, 0);
557 int last
= strtoul(args
[2], NULL
, 0);
560 flash_bank_t
*p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
563 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
567 if (strcmp(args
[3], "on") == 0)
569 else if (strcmp(args
[3], "off") == 0)
573 command_print(cmd_ctx
, "usage: flash protect <bank> <first> <last> <on|off>");
577 if ((retval
= p
->driver
->protect(p
, set
, first
, last
)) != ERROR_OK
)
581 case ERROR_TARGET_NOT_HALTED
:
582 command_print(cmd_ctx
, "can't work with this flash while target is running");
584 case ERROR_INVALID_ARGUMENTS
:
585 command_print(cmd_ctx
, "usage: flash protect <bank> <first> <last> <on|off>");
587 case ERROR_FLASH_BANK_INVALID
:
588 command_print(cmd_ctx
, "no '%s' flash found at 0x%8.8x", p
->driver
->name
, p
->base
);
590 case ERROR_FLASH_OPERATION_FAILED
:
591 command_print(cmd_ctx
, "flash program error");
593 case ERROR_FLASH_SECTOR_INVALID
:
594 command_print(cmd_ctx
, "sector number(s) invalid");
597 command_print(cmd_ctx
, "protection of flash sectors %i to %i turned %s", first
, last
, args
[3]);
600 command_print(cmd_ctx
, "unknown error");
605 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));
610 command_print(cmd_ctx
, "usage: flash protect <bank> <first> <last> <on|off>");
616 int handle_flash_write_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
618 target_t
*target
= get_current_target(cmd_ctx
);
634 command_print(cmd_ctx
, "usage: flash %s <file> [offset] [type]", cmd
);
635 return ERROR_INVALID_ARGUMENTS
;
640 ERROR("no target selected");
644 duration_start_measure(&duration
);
648 image
.base_address_set
= 1;
649 image
.base_address
= strtoul(args
[1], NULL
, 0);
653 image
.base_address_set
= 0;
654 image
.base_address
= 0x0;
657 image
.start_address_set
= 0;
659 retval
= image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
);
660 if (retval
!= ERROR_OK
)
662 command_print(cmd_ctx
, "image_open error: %s", image
.error_str
);
666 failed
= malloc(sizeof(int) * image
.num_sections
);
670 retval
= flash_write(target
, &image
, &written
, &error_str
, failed
, auto_erase
);
672 if (retval
!= ERROR_OK
)
676 command_print(cmd_ctx
, "failed writing image %s: %s", args
[0], error_str
);
684 for (i
= 0; i
< image
.num_sections
; i
++)
688 command_print(cmd_ctx
, "didn't write section at 0x%8.8x, size 0x%8.8x",
689 image
.sections
[i
].base_address
, image
.sections
[i
].size
);
693 duration_stop_measure(&duration
, &duration_text
);
694 command_print(cmd_ctx
, "wrote %u byte from file %s in %s (%f kb/s)",
695 written
, args
[0], duration_text
,
696 (float)written
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
705 int handle_flash_write_binary_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
721 command_print(cmd_ctx
, "usage: flash write_binary <bank> <file> <offset>");
725 duration_start_measure(&duration
);
727 offset
= strtoul(args
[2], NULL
, 0);
728 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
731 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
735 if (fileio_open(&fileio
, args
[1], FILEIO_READ
, FILEIO_BINARY
) != ERROR_OK
)
737 command_print(cmd_ctx
, "flash write_binary error: %s", fileio
.error_str
);
741 buffer
= malloc(fileio
.size
);
742 if (fileio_read(&fileio
, fileio
.size
, buffer
, &buf_cnt
) != ERROR_OK
)
744 command_print(cmd_ctx
, "flash write_binary error: %s", fileio
.error_str
);
748 if ((retval
= p
->driver
->write(p
, buffer
, offset
, buf_cnt
)) != ERROR_OK
)
750 command_print(cmd_ctx
, "failed writing file %s to flash bank %i at offset 0x%8.8x",
751 args
[1], strtoul(args
[0], NULL
, 0), strtoul(args
[2], NULL
, 0));
755 case ERROR_TARGET_NOT_HALTED
:
756 command_print(cmd_ctx
, "can't work with this flash while target is running");
758 case ERROR_INVALID_ARGUMENTS
:
759 command_print(cmd_ctx
, "usage: flash write <bank> <file> <offset>");
761 case ERROR_FLASH_BANK_INVALID
:
762 command_print(cmd_ctx
, "no '%s' flash found at 0x%8.8x", p
->driver
->name
, p
->base
);
764 case ERROR_FLASH_OPERATION_FAILED
:
765 command_print(cmd_ctx
, "flash program error");
767 case ERROR_FLASH_DST_BREAKS_ALIGNMENT
:
768 command_print(cmd_ctx
, "offset breaks required alignment");
770 case ERROR_FLASH_DST_OUT_OF_BANK
:
771 command_print(cmd_ctx
, "destination is out of flash bank (offset and/or file too large)");
773 case ERROR_FLASH_SECTOR_NOT_ERASED
:
774 command_print(cmd_ctx
, "destination sector(s) not erased");
777 command_print(cmd_ctx
, "unknown error");
783 duration_stop_measure(&duration
, &duration_text
);
784 command_print(cmd_ctx
, "wrote %"PRIi64
" byte from file %s to flash bank %i at offset 0x%8.8x in %s (%f kb/s)",
785 fileio
.size
, args
[1], strtoul(args
[0], NULL
, 0), offset
, duration_text
,
786 (float)fileio
.size
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
789 fileio_close(&fileio
);
794 void flash_set_dirty(void)
799 /* set all flash to require erasing */
800 for (c
= flash_banks
; c
; c
= c
->next
)
802 for (i
= 0; i
< c
->num_sectors
; i
++)
804 c
->sectors
[i
].is_erased
= 0;
809 /* lookup flash bank by address */
810 flash_bank_t
*get_flash_bank_by_addr(target_t
*target
, u32 addr
)
814 /* cycle through bank list */
815 for (c
= flash_banks
; c
; c
= c
->next
)
818 retval
= c
->driver
->auto_probe(c
);
820 if (retval
!= ERROR_OK
)
822 ERROR("auto_probe failed %d\n", retval
);
825 /* check whether address belongs to this flash bank */
826 if ((addr
>= c
->base
) && (addr
< c
->base
+ c
->size
) && target
== c
->target
)
833 /* erase given flash region, selects proper bank according to target and address */
834 int flash_erase_address_range(target_t
*target
, u32 addr
, u32 length
)
841 if ((c
= get_flash_bank_by_addr(target
, addr
)) == NULL
)
842 return ERROR_FLASH_DST_OUT_OF_BANK
; /* no corresponding bank found */
844 if (c
->size
== 0 || c
->num_sectors
== 0)
845 return ERROR_FLASH_BANK_INVALID
;
849 /* special case, erase whole bank when length is zero */
851 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
853 return c
->driver
->erase(c
, 0, c
->num_sectors
- 1);
856 /* check whether it fits */
857 if (addr
+ length
> c
->base
+ c
->size
)
858 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
862 for (i
= 0; i
< c
->num_sectors
; i
++)
864 /* check whether sector overlaps with the given range and is not yet erased */
865 if (addr
< c
->sectors
[i
].offset
+ c
->sectors
[i
].size
&& addr
+ length
> c
->sectors
[i
].offset
&& c
->sectors
[i
].is_erased
!= 1) {
866 /* if first is not set yet then this is the first sector */
869 last
= i
; /* and it is the last one so far in any case */
873 if( first
== -1 || last
== -1 )
876 return c
->driver
->erase(c
, first
, last
);
879 /* write (optional verify) an image to flash memory of the given target */
880 int flash_write(target_t
*target
, image_t
*image
, u32
*written
, char **error_str
, int *failed
, int erase
)
896 for (i
= 0; i
< image
->num_sections
; i
++)
901 /* assume all sectors need erasing - stops any problems
902 * when flash_write is called multiple times */
907 /* loop until we reach end of the image */
908 while (section
< image
->num_sections
)
914 u32 run_address
= image
->sections
[section
].base_address
+ section_offset
;
915 u32 run_size
= image
->sections
[section
].size
- section_offset
;
917 if (image
->sections
[section
].size
== 0)
919 WARNING("empty section %d", section
);
925 /* find the corresponding flash bank */
926 if ((c
= get_flash_bank_by_addr(target
, run_address
)) == NULL
)
930 if (error_str
== NULL
)
931 return ERROR_FLASH_DST_OUT_OF_BANK
; /* abort operation */
932 *error_str
= malloc(FLASH_MAX_ERROR_STR
);
933 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "no flash mapped at requested address");
934 return ERROR_FLASH_DST_OUT_OF_BANK
; /* abort operation */
936 failed
[section
] = ERROR_FLASH_DST_OUT_OF_BANK
; /* mark the section as failed */
937 section
++; /* and skip it */
942 /* collect consecutive sections which fall into the same bank */
943 section_first
= section
;
944 section_last
= section
;
945 while ((run_address
+ run_size
< c
->base
+ c
->size
)
946 && (section_last
+ 1 < image
->num_sections
))
948 if (image
->sections
[section_last
+ 1].base_address
< (run_address
+ run_size
))
950 DEBUG("section %d out of order(very slightly surprising, but supported)", section_last
+ 1);
953 if (image
->sections
[section_last
+ 1].base_address
!= (run_address
+ run_size
))
955 run_size
+= image
->sections
[++section_last
].size
;
958 /* fit the run into bank constraints */
959 if (run_address
+ run_size
> c
->base
+ c
->size
)
960 run_size
= c
->base
+ c
->size
- run_address
;
962 /* allocate buffer */
963 buffer
= malloc(run_size
);
966 /* read sections to the buffer */
967 while (buffer_size
< run_size
)
971 if (buffer_size
- run_size
<= image
->sections
[section
].size
- section_offset
)
972 size_read
= buffer_size
- run_size
;
974 size_read
= image
->sections
[section
].size
- section_offset
;
976 if ((retval
= image_read_section(image
, section
, section_offset
,
977 size_read
, buffer
+ buffer_size
, &size_read
)) != ERROR_OK
|| size_read
== 0)
981 if (error_str
== NULL
)
982 return ERROR_IMAGE_TEMPORARILY_UNAVAILABLE
;
984 *error_str
= malloc(FLASH_MAX_ERROR_STR
);
986 /* if image_read_section returned an error there's an error string we can pass on */
987 if (retval
!= ERROR_OK
)
988 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "error reading from image: %s", image
->error_str
);
990 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "error reading from image");
992 return ERROR_IMAGE_TEMPORARILY_UNAVAILABLE
;
995 buffer_size
+= size_read
;
996 section_offset
+= size_read
;
998 if (section_offset
>= image
->sections
[section
].size
)
1009 /* calculate and erase sectors */
1010 retval
= flash_erase_address_range( target
, run_address
, run_size
);
1013 if (retval
== ERROR_OK
)
1015 /* write flash sectors */
1016 retval
= c
->driver
->write(c
, buffer
, run_address
- c
->base
, run_size
);
1021 if (retval
!= ERROR_OK
)
1023 if (error_str
== NULL
)
1024 return retval
; /* abort operation */
1026 *error_str
= malloc(FLASH_MAX_ERROR_STR
);
1029 case ERROR_TARGET_NOT_HALTED
:
1030 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "can't flash image while target is running");
1032 case ERROR_INVALID_ARGUMENTS
:
1033 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "flash driver can't fulfill request");
1035 case ERROR_FLASH_OPERATION_FAILED
:
1036 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "flash program error");
1038 case ERROR_FLASH_DST_BREAKS_ALIGNMENT
:
1039 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "offset breaks required alignment");
1041 case ERROR_FLASH_DST_OUT_OF_BANK
:
1042 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "no flash mapped at requested address");
1044 case ERROR_FLASH_SECTOR_NOT_ERASED
:
1045 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "destination sector(s) not erased");
1048 snprintf(*error_str
, FLASH_MAX_ERROR_STR
, "unknown error: %i", retval
);
1051 return retval
; /* abort operation */
1054 if (written
!= NULL
)
1055 *written
+= run_size
; /* add run size to total written counter */
1061 int handle_flash_auto_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1065 command_print(cmd_ctx
, "usage: flash auto_erase <on|off>");
1069 if (strcmp(args
[0], "on") == 0)
1071 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)