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"
32 #include "algorithm.h"
33 #include "binarybuffer.h"
39 #include <sys/types.h>
46 extern Jim_Interp
*interp
;
49 /* command handlers */
50 int handle_flash_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
51 int handle_flash_banks_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
52 int handle_flash_info_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
53 int handle_flash_probe_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
54 int handle_flash_erase_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
55 int handle_flash_erase_address_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
56 int handle_flash_protect_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
57 int handle_flash_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
58 int handle_flash_write_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
59 int handle_flash_write_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
60 int handle_flash_write_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
61 int handle_flash_fill_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
62 int handle_flash_protect_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
63 flash_bank_t
*get_flash_bank_by_addr(target_t
*target
, u32 addr
);
67 extern flash_driver_t lpc2000_flash
;
68 extern flash_driver_t cfi_flash
;
69 extern flash_driver_t at91sam7_flash
;
70 extern flash_driver_t str7x_flash
;
71 extern flash_driver_t str9x_flash
;
72 extern flash_driver_t stellaris_flash
;
73 extern flash_driver_t str9xpec_flash
;
74 extern flash_driver_t stm32x_flash
;
75 extern flash_driver_t tms470_flash
;
76 extern flash_driver_t ecosflash_flash
;
77 extern flash_driver_t lpc288x_flash
;
78 extern flash_driver_t ocl_flash
;
80 flash_driver_t
*flash_drivers
[] =
97 flash_bank_t
*flash_banks
;
98 static command_t
*flash_cmd
;
100 /* wafer thin wrapper for invoking the flash driver */
101 static int flash_driver_write(struct flash_bank_s
*bank
, u8
*buffer
, u32 offset
, u32 count
)
105 retval
=bank
->driver
->write(bank
, buffer
, offset
, count
);
106 if (retval
!=ERROR_OK
)
108 LOG_ERROR("error writing to flash at address 0x%08x at offset 0x%8.8x (%d)", bank
->base
, offset
, retval
);
114 static int flash_driver_erase(struct flash_bank_s
*bank
, int first
, int last
)
118 retval
=bank
->driver
->erase(bank
, first
, last
);
119 if (retval
!=ERROR_OK
)
121 LOG_ERROR("failed erasing sectors %d to %d (%d)", first
, last
, retval
);
127 int flash_driver_protect(struct flash_bank_s
*bank
, int set
, int first
, int last
)
131 retval
=bank
->driver
->protect(bank
, set
, first
, last
);
132 if (retval
!=ERROR_OK
)
134 LOG_ERROR("failed setting protection for areas %d to %d (%d)", first
, last
, retval
);
140 int flash_register_commands(struct command_context_s
*cmd_ctx
)
142 flash_cmd
= register_command(cmd_ctx
, NULL
, "flash", NULL
, COMMAND_ANY
, NULL
);
144 register_command(cmd_ctx
, flash_cmd
, "bank", handle_flash_bank_command
, COMMAND_CONFIG
, "flash_bank <driver> <base> <size> <chip_width> <bus_width> <target> [driver_options ...]");
148 static int Jim_Command_flash_banks(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
151 Jim_WrongNumArgs(interp
, 1, argv
, "no arguments to flash_banks command");
162 Jim_Obj
*list
=Jim_NewListObj(interp
, NULL
, 0);
163 for (p
= flash_banks
; p
; p
= p
->next
)
165 Jim_Obj
*elem
=Jim_NewListObj(interp
, NULL
, 0);
168 Jim_ListAppendElement(interp
, elem
, Jim_NewStringObj(interp
, p
->driver
->name
, -1));
169 Jim_ListAppendElement(interp
, elem
, Jim_NewIntObj(interp
, p
->base
));
170 Jim_ListAppendElement(interp
, elem
, Jim_NewIntObj(interp
, p
->size
));
171 Jim_ListAppendElement(interp
, elem
, Jim_NewIntObj(interp
, p
->bus_width
));
172 Jim_ListAppendElement(interp
, elem
, Jim_NewIntObj(interp
, p
->chip_width
));
174 Jim_ListAppendElement(interp
, list
, elem
);
177 Jim_SetResult(interp
, list
);
183 int flash_init_drivers(struct command_context_s
*cmd_ctx
)
187 Jim_CreateCommand(interp
, "flash_banks", Jim_Command_flash_banks
, NULL
, NULL
);
189 register_command(cmd_ctx
, flash_cmd
, "banks", handle_flash_banks_command
, COMMAND_EXEC
,
190 "list configured flash banks ");
191 register_command(cmd_ctx
, flash_cmd
, "info", handle_flash_info_command
, COMMAND_EXEC
,
192 "print info about flash bank <num>");
193 register_command(cmd_ctx
, flash_cmd
, "probe", handle_flash_probe_command
, COMMAND_EXEC
,
194 "identify flash bank <num>");
195 register_command(cmd_ctx
, flash_cmd
, "erase_check", handle_flash_erase_check_command
, COMMAND_EXEC
,
196 "check erase state of sectors in flash bank <num>");
197 register_command(cmd_ctx
, flash_cmd
, "protect_check", handle_flash_protect_check_command
, COMMAND_EXEC
,
198 "check protection state of sectors in flash bank <num>");
199 register_command(cmd_ctx
, flash_cmd
, "erase_sector", handle_flash_erase_command
, COMMAND_EXEC
,
200 "erase sectors at <bank> <first> <last>");
201 register_command(cmd_ctx
, flash_cmd
, "erase_address", handle_flash_erase_address_command
, COMMAND_EXEC
,
202 "erase address range <address> <length>");
204 register_command(cmd_ctx
, flash_cmd
, "fillw", handle_flash_fill_command
, COMMAND_EXEC
,
205 "fill with pattern <address> <word_pattern> <count>");
206 register_command(cmd_ctx
, flash_cmd
, "fillh", handle_flash_fill_command
, COMMAND_EXEC
,
207 "fill with pattern <address> <halfword_pattern> <count>");
208 register_command(cmd_ctx
, flash_cmd
, "fillb", handle_flash_fill_command
, COMMAND_EXEC
,
209 "fill with pattern <address> <byte_pattern> <count>");
211 register_command(cmd_ctx
, flash_cmd
, "write_bank", handle_flash_write_bank_command
, COMMAND_EXEC
,
212 "write binary data to <bank> <file> <offset>");
213 register_command(cmd_ctx
, flash_cmd
, "write_image", handle_flash_write_image_command
, COMMAND_EXEC
,
214 "write_image [erase] <file> [offset] [type]");
215 register_command(cmd_ctx
, flash_cmd
, "protect", handle_flash_protect_command
, COMMAND_EXEC
,
216 "set protection of sectors at <bank> <first> <last> <on|off>");
222 flash_bank_t
*get_flash_bank_by_num_noprobe(int num
)
227 for (p
= flash_banks
; p
; p
= p
->next
)
234 LOG_ERROR("flash bank %d does not exist", num
);
238 int flash_get_bank_count()
242 for (p
= flash_banks
; p
; p
= p
->next
)
249 flash_bank_t
*get_flash_bank_by_num(int num
)
251 flash_bank_t
*p
= get_flash_bank_by_num_noprobe(num
);
257 retval
= p
->driver
->auto_probe(p
);
259 if (retval
!= ERROR_OK
)
261 LOG_ERROR("auto_probe failed %d\n", retval
);
267 int handle_flash_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
275 return ERROR_COMMAND_SYNTAX_ERROR
;
278 if ((target
= get_target_by_num(strtoul(args
[5], NULL
, 0))) == NULL
)
280 LOG_ERROR("target %lu not defined", strtoul(args
[5], NULL
, 0));
284 for (i
= 0; flash_drivers
[i
]; i
++)
286 if (strcmp(args
[0], flash_drivers
[i
]->name
) == 0)
290 /* register flash specific commands */
291 if (flash_drivers
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
293 LOG_ERROR("couldn't register '%s' commands", args
[0]);
297 c
= malloc(sizeof(flash_bank_t
));
299 c
->driver
= flash_drivers
[i
];
300 c
->driver_priv
= NULL
;
301 c
->base
= strtoul(args
[1], NULL
, 0);
302 c
->size
= strtoul(args
[2], NULL
, 0);
303 c
->chip_width
= strtoul(args
[3], NULL
, 0);
304 c
->bus_width
= strtoul(args
[4], NULL
, 0);
309 if (flash_drivers
[i
]->flash_bank_command(cmd_ctx
, cmd
, args
, argc
, c
) != ERROR_OK
)
311 LOG_ERROR("'%s' driver rejected flash bank at 0x%8.8x", args
[0], c
->base
);
316 /* put flash bank in linked list */
319 /* find last flash bank */
320 for (p
= flash_banks
; p
&& p
->next
; p
= p
->next
);
333 /* no matching flash driver found */
336 LOG_ERROR("flash driver '%s' not found", args
[0]);
343 int handle_flash_banks_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
350 command_print(cmd_ctx
, "no flash banks configured");
354 for (p
= flash_banks
; p
; p
= p
->next
)
356 command_print(cmd_ctx
, "#%i: %s at 0x%8.8x, size 0x%8.8x, buswidth %i, chipwidth %i",
357 i
++, p
->driver
->name
, p
->base
, p
->size
, p
->bus_width
, p
->chip_width
);
363 int handle_flash_info_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
372 return ERROR_COMMAND_SYNTAX_ERROR
;
375 for (p
= flash_banks
; p
; p
= p
->next
, i
++)
377 if (i
== strtoul(args
[0], NULL
, 0))
381 /* attempt auto probe */
382 if ((retval
= p
->driver
->auto_probe(p
)) != ERROR_OK
)
385 command_print(cmd_ctx
, "#%i: %s at 0x%8.8x, size 0x%8.8x, buswidth %i, chipwidth %i",
386 i
, p
->driver
->name
, p
->base
, p
->size
, p
->bus_width
, p
->chip_width
);
387 for (j
= 0; j
< p
->num_sectors
; j
++)
391 if (p
->sectors
[j
].is_protected
== 0)
392 protect_state
= "not protected";
393 else if (p
->sectors
[j
].is_protected
== 1)
394 protect_state
= "protected";
396 protect_state
= "protection state unknown";
398 command_print(cmd_ctx
, "\t#%i: 0x%8.8x (0x%x %ikB) %s",
399 j
, p
->sectors
[j
].offset
, p
->sectors
[j
].size
, p
->sectors
[j
].size
>>10,
403 *buf
= '\0'; /* initialize buffer, otherwise it migh contain garbage if driver function fails */
404 retval
= p
->driver
->info(p
, buf
, sizeof(buf
));
405 command_print(cmd_ctx
, "%s", buf
);
406 if (retval
!= ERROR_OK
)
407 LOG_ERROR("error retrieving flash info (%d)", retval
);
414 int handle_flash_probe_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
421 return ERROR_COMMAND_SYNTAX_ERROR
;
424 p
= get_flash_bank_by_num_noprobe(strtoul(args
[0], NULL
, 0));
427 if ((retval
= p
->driver
->probe(p
)) == ERROR_OK
)
429 command_print(cmd_ctx
, "flash '%s' found at 0x%8.8x", p
->driver
->name
, p
->base
);
431 else if (retval
== ERROR_FLASH_BANK_INVALID
)
433 command_print(cmd_ctx
, "probing failed for flash bank '#%s' at 0x%8.8x",
438 command_print(cmd_ctx
, "unknown error when probing flash bank '#%s' at 0x%8.8x",
444 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
450 int handle_flash_erase_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
457 return ERROR_COMMAND_SYNTAX_ERROR
;
460 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
464 if ((retval
= p
->driver
->erase_check(p
)) == ERROR_OK
)
466 command_print(cmd_ctx
, "successfully checked erase state", p
->driver
->name
, p
->base
);
470 command_print(cmd_ctx
, "unknown error when checking erase state of flash bank #%s at 0x%8.8x",
474 for (j
= 0; j
< p
->num_sectors
; j
++)
478 if (p
->sectors
[j
].is_erased
== 0)
479 erase_state
= "not erased";
480 else if (p
->sectors
[j
].is_erased
== 1)
481 erase_state
= "erased";
483 erase_state
= "erase state unknown";
485 command_print(cmd_ctx
, "\t#%i: 0x%8.8x (0x%x %ikB) %s",
486 j
, p
->sectors
[j
].offset
, p
->sectors
[j
].size
, p
->sectors
[j
].size
>>10,
495 int handle_flash_erase_address_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
504 target_t
*target
= get_current_target(cmd_ctx
);
508 return ERROR_COMMAND_SYNTAX_ERROR
;
511 address
= strtoul(args
[0], NULL
, 0);
512 length
= strtoul(args
[1], NULL
, 0);
515 command_print(cmd_ctx
, "Length must be >0");
516 return ERROR_COMMAND_SYNTAX_ERROR
;
519 p
= get_flash_bank_by_addr(target
, address
);
525 /* We can't know if we did a resume + halt, in which case we no longer know the erased state */
528 duration_start_measure(&duration
);
530 if ((retval
= flash_erase_address_range(target
, address
, length
)) == ERROR_OK
)
532 duration_stop_measure(&duration
, &duration_text
);
533 command_print(cmd_ctx
, "erased address 0x%8.8x length %i in %s", address
, length
, duration_text
);
540 int handle_flash_protect_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
547 return ERROR_COMMAND_SYNTAX_ERROR
;
550 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
553 if ((retval
= p
->driver
->protect_check(p
)) == ERROR_OK
)
555 command_print(cmd_ctx
, "successfully checked protect state");
557 else if (retval
== ERROR_FLASH_OPERATION_FAILED
)
559 command_print(cmd_ctx
, "checking protection state failed (possibly unsupported) by flash #%s at 0x%8.8x", args
[0], p
->base
);
563 command_print(cmd_ctx
, "unknown error when checking protection state of flash bank '#%s' at 0x%8.8x", args
[0], p
->base
);
568 return ERROR_COMMAND_SYNTAX_ERROR
;
574 int handle_flash_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
578 int first
= strtoul(args
[1], NULL
, 0);
579 int last
= strtoul(args
[2], NULL
, 0);
581 flash_bank_t
*p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
585 duration_start_measure(&duration
);
589 return ERROR_COMMAND_SYNTAX_ERROR
;
592 if ((retval
= flash_driver_erase(p
, first
, last
)) == ERROR_OK
)
594 duration_stop_measure(&duration
, &duration_text
);
596 command_print(cmd_ctx
, "erased sectors %i through %i on flash bank %i in %s", first
, last
, strtoul(args
[0], 0, 0), duration_text
);
602 return ERROR_COMMAND_SYNTAX_ERROR
;
608 int handle_flash_protect_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
612 int first
= strtoul(args
[1], NULL
, 0);
613 int last
= strtoul(args
[2], NULL
, 0);
616 flash_bank_t
*p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
619 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
623 if (strcmp(args
[3], "on") == 0)
625 else if (strcmp(args
[3], "off") == 0)
629 return ERROR_COMMAND_SYNTAX_ERROR
;
632 retval
= flash_driver_protect(p
, set
, first
, last
);
633 if (retval
== ERROR_OK
)
635 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));
640 return ERROR_COMMAND_SYNTAX_ERROR
;
647 int handle_flash_write_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
649 target_t
*target
= get_current_target(cmd_ctx
);
661 return ERROR_COMMAND_SYNTAX_ERROR
;
664 /* flash auto-erase is disabled by default*/
667 if (strcmp(args
[0], "erase")==0)
672 command_print(cmd_ctx
, "auto erase enabled");
678 return ERROR_COMMAND_SYNTAX_ERROR
;
683 LOG_ERROR("no target selected");
687 duration_start_measure(&duration
);
691 image
.base_address_set
= 1;
692 image
.base_address
= strtoul(args
[1], NULL
, 0);
696 image
.base_address_set
= 0;
697 image
.base_address
= 0x0;
700 image
.start_address_set
= 0;
702 retval
= image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
);
703 if (retval
!= ERROR_OK
)
708 retval
= flash_write(target
, &image
, &written
, auto_erase
);
709 if (retval
!= ERROR_OK
)
715 duration_stop_measure(&duration
, &duration_text
);
716 if (retval
== ERROR_OK
)
718 command_print(cmd_ctx
, "wrote %u byte from file %s in %s (%f kb/s)",
719 written
, args
[0], duration_text
,
720 (float)written
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
729 int handle_flash_fill_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
740 target_t
*target
= get_current_target(cmd_ctx
);
746 return ERROR_COMMAND_SYNTAX_ERROR
;
749 address
= strtoul(args
[0], NULL
, 0);
750 pattern
= strtoul(args
[1], NULL
, 0);
751 count
= strtoul(args
[2], NULL
, 0);
769 return ERROR_COMMAND_SYNTAX_ERROR
;
772 chunk_count
= MIN(count
, (1024 / wordsize
));
776 for(i
= 0; i
< chunk_count
; i
++)
778 target_buffer_set_u32(target
, chunk
+ i
* wordsize
, pattern
);
782 for(i
= 0; i
< chunk_count
; i
++)
784 target_buffer_set_u16(target
, chunk
+ i
* wordsize
, pattern
);
788 memset(chunk
, pattern
, chunk_count
);
791 LOG_ERROR("BUG: can't happen");
795 duration_start_measure(&duration
);
798 err
= flash_erase_address_range( target
, address
, count
*wordsize
);
801 for (wrote
=0; wrote
<(count
*wordsize
); wrote
+=sizeof(chunk
))
803 int cur_size
= MIN( (count
*wordsize
- wrote
) , 1024 );
807 bank
= get_flash_bank_by_addr(target
, address
);
813 err
= flash_driver_write(bank
, chunk
, address
- bank
->base
+ wrote
, cur_size
);
821 duration_stop_measure(&duration
, &duration_text
);
826 speed
=wrote
/ 1024.0;
827 speed
/=((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0));
828 command_print(cmd_ctx
, "wrote %d bytes to 0x%8.8x in %s (%f kb/s)",
829 count
*wordsize
, address
, duration_text
,
836 int handle_flash_write_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
852 return ERROR_COMMAND_SYNTAX_ERROR
;
855 duration_start_measure(&duration
);
857 offset
= strtoul(args
[2], NULL
, 0);
858 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
861 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
865 if (fileio_open(&fileio
, args
[1], FILEIO_READ
, FILEIO_BINARY
) != ERROR_OK
)
870 buffer
= malloc(fileio
.size
);
871 if (fileio_read(&fileio
, fileio
.size
, buffer
, &buf_cnt
) != ERROR_OK
)
874 fileio_close(&fileio
);
878 retval
= flash_driver_write(p
, buffer
, offset
, buf_cnt
);
883 duration_stop_measure(&duration
, &duration_text
);
884 if (retval
!=ERROR_OK
)
886 command_print(cmd_ctx
, "wrote %"PRIi64
" byte from file %s to flash bank %i at offset 0x%8.8x in %s (%f kb/s)",
887 fileio
.size
, args
[1], strtoul(args
[0], NULL
, 0), offset
, duration_text
,
888 (float)fileio
.size
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
892 fileio_close(&fileio
);
897 void flash_set_dirty(void)
902 /* set all flash to require erasing */
903 for (c
= flash_banks
; c
; c
= c
->next
)
905 for (i
= 0; i
< c
->num_sectors
; i
++)
907 c
->sectors
[i
].is_erased
= 0;
912 /* lookup flash bank by address */
913 flash_bank_t
*get_flash_bank_by_addr(target_t
*target
, u32 addr
)
917 /* cycle through bank list */
918 for (c
= flash_banks
; c
; c
= c
->next
)
921 retval
= c
->driver
->auto_probe(c
);
923 if (retval
!= ERROR_OK
)
925 LOG_ERROR("auto_probe failed %d\n", retval
);
928 /* check whether address belongs to this flash bank */
929 if ((addr
>= c
->base
) && (addr
< c
->base
+ c
->size
) && target
== c
->target
)
932 LOG_ERROR("No flash at address 0x%08x\n", addr
);
936 /* erase given flash region, selects proper bank according to target and address */
937 int flash_erase_address_range(target_t
*target
, u32 addr
, u32 length
)
944 if ((c
= get_flash_bank_by_addr(target
, addr
)) == NULL
)
945 return ERROR_FLASH_DST_OUT_OF_BANK
; /* no corresponding bank found */
947 if (c
->size
== 0 || c
->num_sectors
== 0)
949 LOG_ERROR("Bank is invalid");
950 return ERROR_FLASH_BANK_INVALID
;
955 /* special case, erase whole bank when length is zero */
957 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
959 return flash_driver_erase(c
, 0, c
->num_sectors
- 1);
962 /* check whether it fits */
963 if (addr
+ length
> c
->base
+ c
->size
)
964 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
968 for (i
= 0; i
< c
->num_sectors
; i
++)
970 /* check whether sector overlaps with the given range and is not yet erased */
971 if (addr
< c
->sectors
[i
].offset
+ c
->sectors
[i
].size
&& addr
+ length
> c
->sectors
[i
].offset
&& c
->sectors
[i
].is_erased
!= 1) {
972 /* if first is not set yet then this is the first sector */
975 last
= i
; /* and it is the last one so far in any case */
979 if( first
== -1 || last
== -1 )
982 return flash_driver_erase(c
, first
, last
);
985 /* write (optional verify) an image to flash memory of the given target */
986 int flash_write(target_t
*target
, image_t
*image
, u32
*written
, int erase
)
1003 /* assume all sectors need erasing - stops any problems
1004 * when flash_write is called multiple times */
1009 /* allocate padding array */
1010 padding
= malloc(image
->num_sections
* sizeof(padding
));
1012 /* loop until we reach end of the image */
1013 while (section
< image
->num_sections
)
1019 u32 run_address
= image
->sections
[section
].base_address
+ section_offset
;
1020 u32 run_size
= image
->sections
[section
].size
- section_offset
;
1023 if (image
->sections
[section
].size
== 0)
1025 LOG_WARNING("empty section %d", section
);
1031 /* find the corresponding flash bank */
1032 if ((c
= get_flash_bank_by_addr(target
, run_address
)) == NULL
)
1034 section
++; /* and skip it */
1039 /* collect consecutive sections which fall into the same bank */
1040 section_first
= section
;
1041 section_last
= section
;
1042 padding
[section
] = 0;
1043 while ((run_address
+ run_size
< c
->base
+ c
->size
)
1044 && (section_last
+ 1 < image
->num_sections
))
1046 if (image
->sections
[section_last
+ 1].base_address
< (run_address
+ run_size
))
1048 LOG_DEBUG("section %d out of order(very slightly surprising, but supported)", section_last
+ 1);
1051 /* if we have multiple sections within our image, flash programming could fail due to alignment issues
1052 * attempt to rebuild a consecutive buffer for the flash loader */
1053 pad_bytes
= (image
->sections
[section_last
+ 1].base_address
) - (run_address
+ run_size
);
1054 if ((run_address
+ run_size
+ pad_bytes
) > (c
->base
+ c
->size
))
1056 padding
[section_last
] = pad_bytes
;
1057 run_size
+= image
->sections
[++section_last
].size
;
1058 run_size
+= pad_bytes
;
1059 padding
[section_last
] = 0;
1061 LOG_INFO("Padding image section %d with %d bytes", section_last
-1, pad_bytes
);
1064 /* fit the run into bank constraints */
1065 if (run_address
+ run_size
> c
->base
+ c
->size
)
1066 run_size
= c
->base
+ c
->size
- run_address
;
1068 /* allocate buffer */
1069 buffer
= malloc(run_size
);
1072 /* read sections to the buffer */
1073 while (buffer_size
< run_size
)
1077 if (buffer_size
- run_size
<= image
->sections
[section
].size
- section_offset
)
1078 size_read
= buffer_size
- run_size
;
1080 size_read
= image
->sections
[section
].size
- section_offset
;
1082 if ((retval
= image_read_section(image
, section
, section_offset
,
1083 size_read
, buffer
+ buffer_size
, &size_read
)) != ERROR_OK
|| size_read
== 0)
1090 /* see if we need to pad the section */
1091 while (padding
[section
]--)
1092 buffer
[size_read
++] = 0xff;
1094 buffer_size
+= size_read
;
1095 section_offset
+= size_read
;
1097 if (section_offset
>= image
->sections
[section
].size
)
1108 /* calculate and erase sectors */
1109 retval
= flash_erase_address_range( target
, run_address
, run_size
);
1112 if (retval
== ERROR_OK
)
1114 /* write flash sectors */
1115 retval
= flash_driver_write(c
, buffer
, run_address
- c
->base
, run_size
);
1120 if (retval
!= ERROR_OK
)
1123 return retval
; /* abort operation */
1126 if (written
!= NULL
)
1127 *written
+= run_size
; /* add run size to total written counter */
1135 int default_flash_mem_blank_check(struct flash_bank_s
*bank
)
1137 target_t
*target
= bank
->target
;
1139 int buffer_size
= sizeof(buffer
);
1143 if (bank
->target
->state
!= TARGET_HALTED
)
1145 return ERROR_TARGET_NOT_HALTED
;
1148 for (i
= 0; i
< bank
->num_sectors
; i
++)
1151 bank
->sectors
[i
].is_erased
= 1;
1153 for (j
= 0; j
< bank
->sectors
[i
].size
; j
+= buffer_size
)
1157 chunk
= buffer_size
;
1158 if (chunk
> (j
- bank
->sectors
[i
].size
))
1160 chunk
= (j
- bank
->sectors
[i
].size
);
1163 retval
= target
->type
->read_memory(target
, bank
->base
+ bank
->sectors
[i
].offset
+ j
, 4, chunk
/4, buffer
);
1164 if (retval
!= ERROR_OK
)
1167 for (nBytes
= 0; nBytes
< chunk
; nBytes
++)
1169 if (buffer
[nBytes
] != 0xFF)
1171 bank
->sectors
[i
].is_erased
= 0;
1181 int default_flash_blank_check(struct flash_bank_s
*bank
)
1183 target_t
*target
= bank
->target
;
1189 if (bank
->target
->state
!= TARGET_HALTED
)
1191 return ERROR_TARGET_NOT_HALTED
;
1194 for (i
= 0; i
< bank
->num_sectors
; i
++)
1196 u32 address
= bank
->base
+ bank
->sectors
[i
].offset
;
1197 u32 size
= bank
->sectors
[i
].size
;
1199 if ((retval
= target_blank_check_memory(target
, address
, size
, &blank
)) != ERROR_OK
)
1205 bank
->sectors
[i
].is_erased
= 1;
1207 bank
->sectors
[i
].is_erased
= 0;
1213 LOG_USER("Running slow fallback erase check - add working memory");
1214 return default_flash_mem_blank_check(bank
);
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)