1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * Copyright (C) 2007,2008 Øyvind Harboe *
6 * oyvind.harboe@zylin.com *
8 * Copyright (C) 2008 by Spencer Oliver *
9 * spen@spen-soft.co.uk *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
16 * This program is distributed in the hope that it will be useful, *
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
19 * GNU General Public License for more details. *
21 * You should have received a copy of the GNU General Public License *
22 * along with this program; if not, write to the *
23 * Free Software Foundation, Inc., *
24 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
25 ***************************************************************************/
33 #include "time_support.h"
38 #include "algorithm.h"
39 #include "binarybuffer.h"
45 #include <sys/types.h>
50 /* command handlers */
51 int handle_flash_bank_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 at91sam7_old_flash
;
71 extern flash_driver_t str7x_flash
;
72 extern flash_driver_t str9x_flash
;
73 extern flash_driver_t aduc702x_flash
;
74 extern flash_driver_t stellaris_flash
;
75 extern flash_driver_t str9xpec_flash
;
76 extern flash_driver_t stm32x_flash
;
77 extern flash_driver_t tms470_flash
;
78 extern flash_driver_t ecosflash_flash
;
79 extern flash_driver_t lpc288x_flash
;
80 extern flash_driver_t ocl_flash
;
82 flash_driver_t
*flash_drivers
[] = {
100 flash_bank_t
*flash_banks
;
101 static command_t
*flash_cmd
;
103 /* wafer thin wrapper for invoking the flash driver */
104 static int flash_driver_write(struct flash_bank_s
*bank
, u8
*buffer
, u32 offset
, u32 count
)
108 retval
=bank
->driver
->write(bank
, buffer
, offset
, count
);
109 if (retval
!=ERROR_OK
)
111 LOG_ERROR("error writing to flash at address 0x%08x at offset 0x%8.8x (%d)", bank
->base
, offset
, retval
);
117 static int flash_driver_erase(struct flash_bank_s
*bank
, int first
, int last
)
121 retval
=bank
->driver
->erase(bank
, first
, last
);
122 if (retval
!=ERROR_OK
)
124 LOG_ERROR("failed erasing sectors %d to %d (%d)", first
, last
, retval
);
130 int flash_driver_protect(struct flash_bank_s
*bank
, int set
, int first
, int last
)
134 retval
=bank
->driver
->protect(bank
, set
, first
, last
);
135 if (retval
!=ERROR_OK
)
137 LOG_ERROR("failed setting protection for areas %d to %d (%d)", first
, last
, retval
);
143 int flash_register_commands(struct command_context_s
*cmd_ctx
)
145 flash_cmd
= register_command(cmd_ctx
, NULL
, "flash", NULL
, COMMAND_ANY
, NULL
);
147 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 ...]");
151 static int jim_flash_banks(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
156 Jim_WrongNumArgs(interp
, 1, argv
, "no arguments to flash_banks command");
165 Jim_Obj
*list
=Jim_NewListObj(interp
, NULL
, 0);
166 for (p
= flash_banks
; p
; p
= p
->next
)
168 Jim_Obj
*elem
=Jim_NewListObj(interp
, NULL
, 0);
170 Jim_ListAppendElement(interp
, elem
, Jim_NewStringObj(interp
, "name", -1));
171 Jim_ListAppendElement(interp
, elem
, Jim_NewStringObj(interp
, p
->driver
->name
, -1));
172 Jim_ListAppendElement(interp
, elem
, Jim_NewStringObj(interp
, "base", -1));
173 Jim_ListAppendElement(interp
, elem
, Jim_NewIntObj(interp
, p
->base
));
174 Jim_ListAppendElement(interp
, elem
, Jim_NewStringObj(interp
, "size", -1));
175 Jim_ListAppendElement(interp
, elem
, Jim_NewIntObj(interp
, p
->size
));
176 Jim_ListAppendElement(interp
, elem
, Jim_NewStringObj(interp
, "bus_width", -1));
177 Jim_ListAppendElement(interp
, elem
, Jim_NewIntObj(interp
, p
->bus_width
));
178 Jim_ListAppendElement(interp
, elem
, Jim_NewStringObj(interp
, "chip_width", -1));
179 Jim_ListAppendElement(interp
, elem
, Jim_NewIntObj(interp
, p
->chip_width
));
181 Jim_ListAppendElement(interp
, list
, elem
);
184 Jim_SetResult(interp
, list
);
189 int flash_init_drivers(struct command_context_s
*cmd_ctx
)
193 register_jim(cmd_ctx
, "ocd_flash_banks", jim_flash_banks
, "return information about the flash banks");
195 register_command(cmd_ctx
, flash_cmd
, "info", handle_flash_info_command
, COMMAND_EXEC
,
196 "print info about flash bank <num>");
197 register_command(cmd_ctx
, flash_cmd
, "probe", handle_flash_probe_command
, COMMAND_EXEC
,
198 "identify flash bank <num>");
199 register_command(cmd_ctx
, flash_cmd
, "erase_check", handle_flash_erase_check_command
, COMMAND_EXEC
,
200 "check erase state of sectors in flash bank <num>");
201 register_command(cmd_ctx
, flash_cmd
, "protect_check", handle_flash_protect_check_command
, COMMAND_EXEC
,
202 "check protection state of sectors in flash bank <num>");
203 register_command(cmd_ctx
, flash_cmd
, "erase_sector", handle_flash_erase_command
, COMMAND_EXEC
,
204 "erase sectors at <bank> <first> <last>");
205 register_command(cmd_ctx
, flash_cmd
, "erase_address", handle_flash_erase_address_command
, COMMAND_EXEC
,
206 "erase address range <address> <length>");
208 register_command(cmd_ctx
, flash_cmd
, "fillw", handle_flash_fill_command
, COMMAND_EXEC
,
209 "fill with pattern <address> <word_pattern> <count>");
210 register_command(cmd_ctx
, flash_cmd
, "fillh", handle_flash_fill_command
, COMMAND_EXEC
,
211 "fill with pattern <address> <halfword_pattern> <count>");
212 register_command(cmd_ctx
, flash_cmd
, "fillb", handle_flash_fill_command
, COMMAND_EXEC
,
213 "fill with pattern <address> <byte_pattern> <count>");
215 register_command(cmd_ctx
, flash_cmd
, "write_bank", handle_flash_write_bank_command
, COMMAND_EXEC
,
216 "write binary data to <bank> <file> <offset>");
217 register_command(cmd_ctx
, flash_cmd
, "write_image", handle_flash_write_image_command
, COMMAND_EXEC
,
218 "write_image [erase] <file> [offset] [type]");
219 register_command(cmd_ctx
, flash_cmd
, "protect", handle_flash_protect_command
, COMMAND_EXEC
,
220 "set protection of sectors at <bank> <first> <last> <on|off>");
226 flash_bank_t
*get_flash_bank_by_num_noprobe(int num
)
231 for (p
= flash_banks
; p
; p
= p
->next
)
238 LOG_ERROR("flash bank %d does not exist", num
);
242 int flash_get_bank_count(void)
246 for (p
= flash_banks
; p
; p
= p
->next
)
253 flash_bank_t
*get_flash_bank_by_num(int num
)
255 flash_bank_t
*p
= get_flash_bank_by_num_noprobe(num
);
261 retval
= p
->driver
->auto_probe(p
);
263 if (retval
!= ERROR_OK
)
265 LOG_ERROR("auto_probe failed %d\n", retval
);
271 int handle_flash_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
280 return ERROR_COMMAND_SYNTAX_ERROR
;
283 if ((target
= get_target_by_num(strtoul(args
[5], NULL
, 0))) == NULL
)
285 LOG_ERROR("target %lu not defined", strtoul(args
[5], NULL
, 0));
289 for (i
= 0; flash_drivers
[i
]; i
++)
291 if (strcmp(args
[0], flash_drivers
[i
]->name
) == 0)
295 /* register flash specific commands */
296 if (flash_drivers
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
298 LOG_ERROR("couldn't register '%s' commands", args
[0]);
302 c
= malloc(sizeof(flash_bank_t
));
304 c
->driver
= flash_drivers
[i
];
305 c
->driver_priv
= NULL
;
306 c
->base
= strtoul(args
[1], NULL
, 0);
307 c
->size
= strtoul(args
[2], NULL
, 0);
308 c
->chip_width
= strtoul(args
[3], NULL
, 0);
309 c
->bus_width
= strtoul(args
[4], NULL
, 0);
314 if ((retval
=flash_drivers
[i
]->flash_bank_command(cmd_ctx
, cmd
, args
, argc
, c
)) != ERROR_OK
)
316 LOG_ERROR("'%s' driver rejected flash bank at 0x%8.8x", args
[0], c
->base
);
321 /* put flash bank in linked list */
324 /* find last flash bank */
325 for (p
= flash_banks
; p
&& p
->next
; p
= p
->next
);
338 /* no matching flash driver found */
341 LOG_ERROR("flash driver '%s' not found", args
[0]);
348 int handle_flash_info_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
357 return ERROR_COMMAND_SYNTAX_ERROR
;
360 for (p
= flash_banks
; p
; p
= p
->next
, i
++)
362 if (i
== strtoul(args
[0], NULL
, 0))
366 /* attempt auto probe */
367 if ((retval
= p
->driver
->auto_probe(p
)) != ERROR_OK
)
370 command_print(cmd_ctx
, "#%i: %s at 0x%8.8x, size 0x%8.8x, buswidth %i, chipwidth %i",
371 i
, p
->driver
->name
, p
->base
, p
->size
, p
->bus_width
, p
->chip_width
);
372 for (j
= 0; j
< p
->num_sectors
; j
++)
376 if (p
->sectors
[j
].is_protected
== 0)
377 protect_state
= "not protected";
378 else if (p
->sectors
[j
].is_protected
== 1)
379 protect_state
= "protected";
381 protect_state
= "protection state unknown";
383 command_print(cmd_ctx
, "\t#%3i: 0x%8.8x (0x%x %ikB) %s",
384 j
, p
->sectors
[j
].offset
, p
->sectors
[j
].size
, p
->sectors
[j
].size
>>10,
388 *buf
= '\0'; /* initialize buffer, otherwise it migh contain garbage if driver function fails */
389 retval
= p
->driver
->info(p
, buf
, sizeof(buf
));
390 command_print(cmd_ctx
, "%s", buf
);
391 if (retval
!= ERROR_OK
)
392 LOG_ERROR("error retrieving flash info (%d)", retval
);
399 int handle_flash_probe_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
406 return ERROR_COMMAND_SYNTAX_ERROR
;
409 p
= get_flash_bank_by_num_noprobe(strtoul(args
[0], NULL
, 0));
412 if ((retval
= p
->driver
->probe(p
)) == ERROR_OK
)
414 command_print(cmd_ctx
, "flash '%s' found at 0x%8.8x", p
->driver
->name
, p
->base
);
416 else if (retval
== ERROR_FLASH_BANK_INVALID
)
418 command_print(cmd_ctx
, "probing failed for flash bank '#%s' at 0x%8.8x",
423 command_print(cmd_ctx
, "unknown error when probing flash bank '#%s' at 0x%8.8x",
429 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
435 int handle_flash_erase_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
442 return ERROR_COMMAND_SYNTAX_ERROR
;
445 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
449 if ((retval
= p
->driver
->erase_check(p
)) == ERROR_OK
)
451 command_print(cmd_ctx
, "successfully checked erase state", p
->driver
->name
, p
->base
);
455 command_print(cmd_ctx
, "unknown error when checking erase state of flash bank #%s at 0x%8.8x",
459 for (j
= 0; j
< p
->num_sectors
; j
++)
463 if (p
->sectors
[j
].is_erased
== 0)
464 erase_state
= "not erased";
465 else if (p
->sectors
[j
].is_erased
== 1)
466 erase_state
= "erased";
468 erase_state
= "erase state unknown";
470 command_print(cmd_ctx
, "\t#%3i: 0x%8.8x (0x%x %ikB) %s",
471 j
, p
->sectors
[j
].offset
, p
->sectors
[j
].size
, p
->sectors
[j
].size
>>10,
480 int handle_flash_erase_address_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
489 target_t
*target
= get_current_target(cmd_ctx
);
493 return ERROR_COMMAND_SYNTAX_ERROR
;
496 address
= strtoul(args
[0], NULL
, 0);
497 length
= strtoul(args
[1], NULL
, 0);
500 command_print(cmd_ctx
, "Length must be >0");
501 return ERROR_COMMAND_SYNTAX_ERROR
;
504 p
= get_flash_bank_by_addr(target
, address
);
510 /* We can't know if we did a resume + halt, in which case we no longer know the erased state */
513 duration_start_measure(&duration
);
515 if ((retval
= flash_erase_address_range(target
, address
, length
)) == ERROR_OK
)
517 if ((retval
= duration_stop_measure(&duration
, &duration_text
)) != ERROR_OK
)
522 command_print(cmd_ctx
, "erased address 0x%8.8x length %i in %s", address
, length
, duration_text
);
529 int handle_flash_protect_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
536 return ERROR_COMMAND_SYNTAX_ERROR
;
539 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
542 if ((retval
= p
->driver
->protect_check(p
)) == ERROR_OK
)
544 command_print(cmd_ctx
, "successfully checked protect state");
546 else if (retval
== ERROR_FLASH_OPERATION_FAILED
)
548 command_print(cmd_ctx
, "checking protection state failed (possibly unsupported) by flash #%s at 0x%8.8x", args
[0], p
->base
);
552 command_print(cmd_ctx
, "unknown error when checking protection state of flash bank '#%s' at 0x%8.8x", args
[0], p
->base
);
557 return ERROR_COMMAND_SYNTAX_ERROR
;
563 int handle_flash_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
567 int first
= strtoul(args
[1], NULL
, 0);
568 int last
= strtoul(args
[2], NULL
, 0);
570 flash_bank_t
*p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
574 duration_start_measure(&duration
);
578 return ERROR_COMMAND_SYNTAX_ERROR
;
581 if ((retval
= flash_driver_erase(p
, first
, last
)) == ERROR_OK
)
583 if ((retval
= duration_stop_measure(&duration
, &duration_text
)) != ERROR_OK
)
589 command_print(cmd_ctx
, "erased sectors %i through %i on flash bank %i in %s", first
, last
, strtoul(args
[0], 0, 0), duration_text
);
595 return ERROR_COMMAND_SYNTAX_ERROR
;
601 int handle_flash_protect_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
605 int first
= strtoul(args
[1], NULL
, 0);
606 int last
= strtoul(args
[2], NULL
, 0);
609 flash_bank_t
*p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
612 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
616 if (strcmp(args
[3], "on") == 0)
618 else if (strcmp(args
[3], "off") == 0)
622 return ERROR_COMMAND_SYNTAX_ERROR
;
625 retval
= flash_driver_protect(p
, set
, first
, last
);
626 if (retval
== ERROR_OK
)
628 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));
633 return ERROR_COMMAND_SYNTAX_ERROR
;
640 int handle_flash_write_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
642 target_t
*target
= get_current_target(cmd_ctx
);
650 int retval
, retvaltemp
;
654 return ERROR_COMMAND_SYNTAX_ERROR
;
657 /* flash auto-erase is disabled by default*/
660 if (strcmp(args
[0], "erase")==0)
665 command_print(cmd_ctx
, "auto erase enabled");
671 return ERROR_COMMAND_SYNTAX_ERROR
;
676 LOG_ERROR("no target selected");
680 duration_start_measure(&duration
);
684 image
.base_address_set
= 1;
685 image
.base_address
= strtoul(args
[1], NULL
, 0);
689 image
.base_address_set
= 0;
690 image
.base_address
= 0x0;
693 image
.start_address_set
= 0;
695 retval
= image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
);
696 if (retval
!= ERROR_OK
)
701 retval
= flash_write(target
, &image
, &written
, auto_erase
);
702 if (retval
!= ERROR_OK
)
708 if ((retvaltemp
= duration_stop_measure(&duration
, &duration_text
)) != ERROR_OK
)
714 if (retval
== ERROR_OK
)
716 command_print(cmd_ctx
, "wrote %u byte from file %s in %s (%f kb/s)",
717 written
, args
[0], duration_text
,
718 (float)written
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
727 int handle_flash_fill_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
729 int err
= ERROR_OK
, retval
;
738 target_t
*target
= get_current_target(cmd_ctx
);
744 return ERROR_COMMAND_SYNTAX_ERROR
;
747 address
= strtoul(args
[0], NULL
, 0);
748 pattern
= strtoul(args
[1], NULL
, 0);
749 count
= strtoul(args
[2], NULL
, 0);
767 return ERROR_COMMAND_SYNTAX_ERROR
;
770 chunk_count
= MIN(count
, (1024 / wordsize
));
774 for(i
= 0; i
< chunk_count
; i
++)
776 target_buffer_set_u32(target
, chunk
+ i
* wordsize
, pattern
);
780 for(i
= 0; i
< chunk_count
; i
++)
782 target_buffer_set_u16(target
, chunk
+ i
* wordsize
, pattern
);
786 memset(chunk
, pattern
, chunk_count
);
789 LOG_ERROR("BUG: can't happen");
793 duration_start_measure(&duration
);
796 err
= flash_erase_address_range( target
, address
, count
*wordsize
);
799 for (wrote
=0; wrote
<(count
*wordsize
); wrote
+=sizeof(chunk
))
801 int cur_size
= MIN( (count
*wordsize
- wrote
) , 1024 );
805 bank
= get_flash_bank_by_addr(target
, address
);
811 err
= flash_driver_write(bank
, chunk
, address
- bank
->base
+ wrote
, cur_size
);
819 if ((retval
= duration_stop_measure(&duration
, &duration_text
)) != ERROR_OK
)
829 speed
=wrote
/ 1024.0;
830 speed
/=((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0));
831 command_print(cmd_ctx
, "wrote %d bytes to 0x%8.8x in %s (%f kb/s)",
832 count
*wordsize
, address
, duration_text
,
839 int handle_flash_write_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
850 int retval
, retvaltemp
;
855 return ERROR_COMMAND_SYNTAX_ERROR
;
858 duration_start_measure(&duration
);
860 offset
= strtoul(args
[2], NULL
, 0);
861 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
864 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
868 if (fileio_open(&fileio
, args
[1], FILEIO_READ
, FILEIO_BINARY
) != ERROR_OK
)
873 buffer
= malloc(fileio
.size
);
874 if (fileio_read(&fileio
, fileio
.size
, buffer
, &buf_cnt
) != ERROR_OK
)
877 fileio_close(&fileio
);
881 retval
= flash_driver_write(p
, buffer
, offset
, buf_cnt
);
886 if ((retvaltemp
= duration_stop_measure(&duration
, &duration_text
)) != ERROR_OK
)
889 fileio_close(&fileio
);
892 if (retval
!=ERROR_OK
)
894 command_print(cmd_ctx
, "wrote %"PRIi64
" byte from file %s to flash bank %i at offset 0x%8.8x in %s (%f kb/s)",
895 fileio
.size
, args
[1], strtoul(args
[0], NULL
, 0), offset
, duration_text
,
896 (float)fileio
.size
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
900 fileio_close(&fileio
);
905 void flash_set_dirty(void)
910 /* set all flash to require erasing */
911 for (c
= flash_banks
; c
; c
= c
->next
)
913 for (i
= 0; i
< c
->num_sectors
; i
++)
915 c
->sectors
[i
].is_erased
= 0;
920 /* lookup flash bank by address */
921 flash_bank_t
*get_flash_bank_by_addr(target_t
*target
, u32 addr
)
925 /* cycle through bank list */
926 for (c
= flash_banks
; c
; c
= c
->next
)
929 retval
= c
->driver
->auto_probe(c
);
931 if (retval
!= ERROR_OK
)
933 LOG_ERROR("auto_probe failed %d\n", retval
);
936 /* check whether address belongs to this flash bank */
937 if ((addr
>= c
->base
) && (addr
<= c
->base
+ (c
->size
- 1)) && target
== c
->target
)
940 LOG_ERROR("No flash at address 0x%08x\n", addr
);
944 /* erase given flash region, selects proper bank according to target and address */
945 int flash_erase_address_range(target_t
*target
, u32 addr
, u32 length
)
952 if ((c
= get_flash_bank_by_addr(target
, addr
)) == NULL
)
953 return ERROR_FLASH_DST_OUT_OF_BANK
; /* no corresponding bank found */
955 if (c
->size
== 0 || c
->num_sectors
== 0)
957 LOG_ERROR("Bank is invalid");
958 return ERROR_FLASH_BANK_INVALID
;
963 /* special case, erase whole bank when length is zero */
965 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
967 return flash_driver_erase(c
, 0, c
->num_sectors
- 1);
970 /* check whether it fits */
971 if (addr
+ length
> c
->base
+ c
->size
)
972 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
976 for (i
= 0; i
< c
->num_sectors
; i
++)
978 /* check whether sector overlaps with the given range and is not yet erased */
979 if (addr
< c
->sectors
[i
].offset
+ c
->sectors
[i
].size
&& addr
+ length
> c
->sectors
[i
].offset
&& c
->sectors
[i
].is_erased
!= 1) {
980 /* if first is not set yet then this is the first sector */
983 last
= i
; /* and it is the last one so far in any case */
987 if( first
== -1 || last
== -1 )
990 return flash_driver_erase(c
, first
, last
);
993 /* write (optional verify) an image to flash memory of the given target */
994 int flash_write(target_t
*target
, image_t
*image
, u32
*written
, int erase
)
1011 /* assume all sectors need erasing - stops any problems
1012 * when flash_write is called multiple times */
1017 /* allocate padding array */
1018 padding
= malloc(image
->num_sections
* sizeof(padding
));
1020 /* loop until we reach end of the image */
1021 while (section
< image
->num_sections
)
1027 u32 run_address
= image
->sections
[section
].base_address
+ section_offset
;
1028 u32 run_size
= image
->sections
[section
].size
- section_offset
;
1031 if (image
->sections
[section
].size
== 0)
1033 LOG_WARNING("empty section %d", section
);
1039 /* find the corresponding flash bank */
1040 if ((c
= get_flash_bank_by_addr(target
, run_address
)) == NULL
)
1042 section
++; /* and skip it */
1047 /* collect consecutive sections which fall into the same bank */
1048 section_first
= section
;
1049 section_last
= section
;
1050 padding
[section
] = 0;
1051 while ((run_address
+ run_size
< c
->base
+ c
->size
)
1052 && (section_last
+ 1 < image
->num_sections
))
1054 if (image
->sections
[section_last
+ 1].base_address
< (run_address
+ run_size
))
1056 LOG_DEBUG("section %d out of order(very slightly surprising, but supported)", section_last
+ 1);
1059 /* if we have multiple sections within our image, flash programming could fail due to alignment issues
1060 * attempt to rebuild a consecutive buffer for the flash loader */
1061 pad_bytes
= (image
->sections
[section_last
+ 1].base_address
) - (run_address
+ run_size
);
1062 if ((run_address
+ run_size
+ pad_bytes
) > (c
->base
+ c
->size
))
1064 padding
[section_last
] = pad_bytes
;
1065 run_size
+= image
->sections
[++section_last
].size
;
1066 run_size
+= pad_bytes
;
1067 padding
[section_last
] = 0;
1069 LOG_INFO("Padding image section %d with %d bytes", section_last
-1, pad_bytes
);
1072 /* fit the run into bank constraints */
1073 if (run_address
+ run_size
> c
->base
+ c
->size
)
1074 run_size
= c
->base
+ c
->size
- run_address
;
1076 /* allocate buffer */
1077 buffer
= malloc(run_size
);
1080 /* read sections to the buffer */
1081 while (buffer_size
< run_size
)
1085 size_read
= run_size
- buffer_size
;
1086 if (size_read
> image
->sections
[section
].size
- section_offset
)
1087 size_read
= image
->sections
[section
].size
- section_offset
;
1089 if ((retval
= image_read_section(image
, section
, section_offset
,
1090 size_read
, buffer
+ buffer_size
, &size_read
)) != ERROR_OK
|| size_read
== 0)
1097 /* see if we need to pad the section */
1098 while (padding
[section
]--)
1099 (buffer
+buffer_size
)[size_read
++] = 0xff;
1101 buffer_size
+= size_read
;
1102 section_offset
+= size_read
;
1104 if (section_offset
>= image
->sections
[section
].size
)
1115 /* calculate and erase sectors */
1116 retval
= flash_erase_address_range( target
, run_address
, run_size
);
1119 if (retval
== ERROR_OK
)
1121 /* write flash sectors */
1122 retval
= flash_driver_write(c
, buffer
, run_address
- c
->base
, run_size
);
1127 if (retval
!= ERROR_OK
)
1130 return retval
; /* abort operation */
1133 if (written
!= NULL
)
1134 *written
+= run_size
; /* add run size to total written counter */
1142 int default_flash_mem_blank_check(struct flash_bank_s
*bank
)
1144 target_t
*target
= bank
->target
;
1146 int buffer_size
= sizeof(buffer
);
1150 if (bank
->target
->state
!= TARGET_HALTED
)
1152 LOG_ERROR("Target not halted");
1153 return ERROR_TARGET_NOT_HALTED
;
1156 for (i
= 0; i
< bank
->num_sectors
; i
++)
1159 bank
->sectors
[i
].is_erased
= 1;
1161 for (j
= 0; j
< bank
->sectors
[i
].size
; j
+= buffer_size
)
1165 chunk
= buffer_size
;
1166 if (chunk
> (j
- bank
->sectors
[i
].size
))
1168 chunk
= (j
- bank
->sectors
[i
].size
);
1171 retval
= target
->type
->read_memory(target
, bank
->base
+ bank
->sectors
[i
].offset
+ j
, 4, chunk
/4, buffer
);
1172 if (retval
!= ERROR_OK
)
1175 for (nBytes
= 0; nBytes
< chunk
; nBytes
++)
1177 if (buffer
[nBytes
] != 0xFF)
1179 bank
->sectors
[i
].is_erased
= 0;
1189 int default_flash_blank_check(struct flash_bank_s
*bank
)
1191 target_t
*target
= bank
->target
;
1197 if (bank
->target
->state
!= TARGET_HALTED
)
1199 LOG_ERROR("Target not halted");
1200 return ERROR_TARGET_NOT_HALTED
;
1203 for (i
= 0; i
< bank
->num_sectors
; i
++)
1205 u32 address
= bank
->base
+ bank
->sectors
[i
].offset
;
1206 u32 size
= bank
->sectors
[i
].size
;
1208 if ((retval
= target_blank_check_memory(target
, address
, size
, &blank
)) != ERROR_OK
)
1214 bank
->sectors
[i
].is_erased
= 1;
1216 bank
->sectors
[i
].is_erased
= 0;
1222 LOG_USER("Running slow fallback erase check - add working memory");
1223 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)