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 static int handle_flash_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
52 static int handle_flash_info_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
53 static int handle_flash_probe_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
54 static int handle_flash_erase_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
55 static int handle_flash_erase_address_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
56 static int handle_flash_protect_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
57 static int handle_flash_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
58 static int handle_flash_write_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
59 static int handle_flash_write_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
60 static int handle_flash_fill_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
61 static int handle_flash_protect_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
65 extern flash_driver_t lpc2000_flash
;
66 extern flash_driver_t cfi_flash
;
67 extern flash_driver_t at91sam7_flash
;
68 extern flash_driver_t at91sam7_old_flash
;
69 extern flash_driver_t str7x_flash
;
70 extern flash_driver_t str9x_flash
;
71 extern flash_driver_t aduc702x_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
;
79 extern flash_driver_t pic32mx_flash
;
80 extern flash_driver_t avr_flash
;
82 flash_driver_t
*flash_drivers
[] = {
102 flash_bank_t
*flash_banks
;
103 static command_t
*flash_cmd
;
105 /* wafer thin wrapper for invoking the flash driver */
106 static int flash_driver_write(struct flash_bank_s
*bank
, u8
*buffer
, u32 offset
, u32 count
)
110 retval
=bank
->driver
->write(bank
, buffer
, offset
, count
);
111 if (retval
!=ERROR_OK
)
113 LOG_ERROR("error writing to flash at address 0x%08x at offset 0x%8.8x (%d)", bank
->base
, offset
, retval
);
119 static int flash_driver_erase(struct flash_bank_s
*bank
, int first
, int last
)
123 retval
=bank
->driver
->erase(bank
, first
, last
);
124 if (retval
!=ERROR_OK
)
126 LOG_ERROR("failed erasing sectors %d to %d (%d)", first
, last
, retval
);
132 int flash_driver_protect(struct flash_bank_s
*bank
, int set
, int first
, int last
)
136 retval
=bank
->driver
->protect(bank
, set
, first
, last
);
137 if (retval
!=ERROR_OK
)
139 LOG_ERROR("failed setting protection for areas %d to %d (%d)", first
, last
, retval
);
145 int flash_register_commands(struct command_context_s
*cmd_ctx
)
147 flash_cmd
= register_command(cmd_ctx
, NULL
, "flash", NULL
, COMMAND_ANY
, NULL
);
149 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 ...]");
153 static int jim_flash_banks(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
158 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);
167 Jim_ListAppendElement(interp
, elem
, Jim_NewStringObj(interp
, "name", -1));
168 Jim_ListAppendElement(interp
, elem
, Jim_NewStringObj(interp
, p
->driver
->name
, -1));
169 Jim_ListAppendElement(interp
, elem
, Jim_NewStringObj(interp
, "base", -1));
170 Jim_ListAppendElement(interp
, elem
, Jim_NewIntObj(interp
, p
->base
));
171 Jim_ListAppendElement(interp
, elem
, Jim_NewStringObj(interp
, "size", -1));
172 Jim_ListAppendElement(interp
, elem
, Jim_NewIntObj(interp
, p
->size
));
173 Jim_ListAppendElement(interp
, elem
, Jim_NewStringObj(interp
, "bus_width", -1));
174 Jim_ListAppendElement(interp
, elem
, Jim_NewIntObj(interp
, p
->bus_width
));
175 Jim_ListAppendElement(interp
, elem
, Jim_NewStringObj(interp
, "chip_width", -1));
176 Jim_ListAppendElement(interp
, elem
, Jim_NewIntObj(interp
, p
->chip_width
));
178 Jim_ListAppendElement(interp
, list
, elem
);
181 Jim_SetResult(interp
, list
);
186 int flash_init_drivers(struct command_context_s
*cmd_ctx
)
188 register_jim(cmd_ctx
, "ocd_flash_banks", jim_flash_banks
, "return information about the flash banks");
192 register_command(cmd_ctx
, flash_cmd
, "info", handle_flash_info_command
, COMMAND_EXEC
,
193 "print info about flash bank <num>");
194 register_command(cmd_ctx
, flash_cmd
, "probe", handle_flash_probe_command
, COMMAND_EXEC
,
195 "identify flash bank <num>");
196 register_command(cmd_ctx
, flash_cmd
, "erase_check", handle_flash_erase_check_command
, COMMAND_EXEC
,
197 "check erase state of sectors in flash bank <num>");
198 register_command(cmd_ctx
, flash_cmd
, "protect_check", handle_flash_protect_check_command
, COMMAND_EXEC
,
199 "check protection state of sectors in flash bank <num>");
200 register_command(cmd_ctx
, flash_cmd
, "erase_sector", handle_flash_erase_command
, COMMAND_EXEC
,
201 "erase sectors at <bank> <first> <last>");
202 register_command(cmd_ctx
, flash_cmd
, "erase_address", handle_flash_erase_address_command
, COMMAND_EXEC
,
203 "erase address range <address> <length>");
205 register_command(cmd_ctx
, flash_cmd
, "fillw", handle_flash_fill_command
, COMMAND_EXEC
,
206 "fill with pattern (no autoerase) <address> <word_pattern> <count>");
207 register_command(cmd_ctx
, flash_cmd
, "fillh", handle_flash_fill_command
, COMMAND_EXEC
,
208 "fill with pattern <address> <halfword_pattern> <count>");
209 register_command(cmd_ctx
, flash_cmd
, "fillb", handle_flash_fill_command
, COMMAND_EXEC
,
210 "fill with pattern <address> <byte_pattern> <count>");
212 register_command(cmd_ctx
, flash_cmd
, "write_bank", handle_flash_write_bank_command
, COMMAND_EXEC
,
213 "write binary data to <bank> <file> <offset>");
214 register_command(cmd_ctx
, flash_cmd
, "write_image", handle_flash_write_image_command
, COMMAND_EXEC
,
215 "write_image [erase] <file> [offset] [type]");
216 register_command(cmd_ctx
, flash_cmd
, "protect", handle_flash_protect_command
, COMMAND_EXEC
,
217 "set protection of sectors at <bank> <first> <last> <on|off>");
223 flash_bank_t
*get_flash_bank_by_num_noprobe(int num
)
228 for (p
= flash_banks
; p
; p
= p
->next
)
235 LOG_ERROR("flash bank %d does not exist", num
);
239 int flash_get_bank_count(void)
243 for (p
= flash_banks
; p
; p
= p
->next
)
250 flash_bank_t
*get_flash_bank_by_num(int num
)
252 flash_bank_t
*p
= get_flash_bank_by_num_noprobe(num
);
258 retval
= p
->driver
->auto_probe(p
);
260 if (retval
!= ERROR_OK
)
262 LOG_ERROR("auto_probe failed %d\n", retval
);
268 static int handle_flash_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
277 return ERROR_COMMAND_SYNTAX_ERROR
;
280 if ((target
= get_target_by_num(strtoul(args
[5], NULL
, 0))) == NULL
)
282 LOG_ERROR("target %lu not defined", strtoul(args
[5], NULL
, 0));
286 for (i
= 0; flash_drivers
[i
]; i
++)
288 if (strcmp(args
[0], flash_drivers
[i
]->name
) == 0)
292 /* register flash specific commands */
293 if (flash_drivers
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
295 LOG_ERROR("couldn't register '%s' commands", args
[0]);
299 c
= malloc(sizeof(flash_bank_t
));
301 c
->driver
= flash_drivers
[i
];
302 c
->driver_priv
= NULL
;
303 c
->base
= strtoul(args
[1], NULL
, 0);
304 c
->size
= strtoul(args
[2], NULL
, 0);
305 c
->chip_width
= strtoul(args
[3], NULL
, 0);
306 c
->bus_width
= strtoul(args
[4], NULL
, 0);
311 if ((retval
=flash_drivers
[i
]->flash_bank_command(cmd_ctx
, cmd
, args
, argc
, c
)) != ERROR_OK
)
313 LOG_ERROR("'%s' driver rejected flash bank at 0x%8.8x", args
[0], c
->base
);
318 /* put flash bank in linked list */
322 /* find last flash bank */
323 for (p
= flash_banks
; p
&& p
->next
; p
= p
->next
) bank_num
++;
326 c
->bank_number
= bank_num
+ 1;
338 /* no matching flash driver found */
341 LOG_ERROR("flash driver '%s' not found", args
[0]);
348 static 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 static 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 static 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,
479 static int handle_flash_erase_address_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
488 target_t
*target
= get_current_target(cmd_ctx
);
492 return ERROR_COMMAND_SYNTAX_ERROR
;
495 address
= strtoul(args
[0], NULL
, 0);
496 length
= strtoul(args
[1], NULL
, 0);
499 command_print(cmd_ctx
, "Length must be >0");
500 return ERROR_COMMAND_SYNTAX_ERROR
;
503 p
= get_flash_bank_by_addr(target
, address
);
509 /* We can't know if we did a resume + halt, in which case we no longer know the erased state */
512 duration_start_measure(&duration
);
514 if ((retval
= flash_erase_address_range(target
, address
, length
)) == ERROR_OK
)
516 if ((retval
= duration_stop_measure(&duration
, &duration_text
)) != ERROR_OK
)
520 command_print(cmd_ctx
, "erased address 0x%8.8x length %i in %s", address
, length
, duration_text
);
527 static int handle_flash_protect_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
534 return ERROR_COMMAND_SYNTAX_ERROR
;
537 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
540 if ((retval
= p
->driver
->protect_check(p
)) == ERROR_OK
)
542 command_print(cmd_ctx
, "successfully checked protect state");
544 else if (retval
== ERROR_FLASH_OPERATION_FAILED
)
546 command_print(cmd_ctx
, "checking protection state failed (possibly unsupported) by flash #%s at 0x%8.8x", args
[0], p
->base
);
550 command_print(cmd_ctx
, "unknown error when checking protection state of flash bank '#%s' at 0x%8.8x", args
[0], p
->base
);
555 return ERROR_COMMAND_SYNTAX_ERROR
;
561 static int handle_flash_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
565 int first
= strtoul(args
[1], NULL
, 0);
566 int last
= strtoul(args
[2], NULL
, 0);
568 flash_bank_t
*p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
572 duration_start_measure(&duration
);
576 return ERROR_COMMAND_SYNTAX_ERROR
;
579 if ((retval
= flash_driver_erase(p
, first
, last
)) == ERROR_OK
)
581 if ((retval
= duration_stop_measure(&duration
, &duration_text
)) != ERROR_OK
)
586 command_print(cmd_ctx
, "erased sectors %i through %i on flash bank %i in %s", first
, last
, strtoul(args
[0], 0, 0), duration_text
);
592 return ERROR_COMMAND_SYNTAX_ERROR
;
598 static int handle_flash_protect_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
602 int first
= strtoul(args
[1], NULL
, 0);
603 int last
= strtoul(args
[2], NULL
, 0);
606 flash_bank_t
*p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
609 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
613 if (strcmp(args
[3], "on") == 0)
615 else if (strcmp(args
[3], "off") == 0)
619 return ERROR_COMMAND_SYNTAX_ERROR
;
622 retval
= flash_driver_protect(p
, set
, first
, last
);
623 if (retval
== ERROR_OK
)
625 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));
630 return ERROR_COMMAND_SYNTAX_ERROR
;
637 static int handle_flash_write_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
639 target_t
*target
= get_current_target(cmd_ctx
);
647 int retval
, retvaltemp
;
651 return ERROR_COMMAND_SYNTAX_ERROR
;
654 /* flash auto-erase is disabled by default*/
657 if (strcmp(args
[0], "erase")==0)
662 command_print(cmd_ctx
, "auto erase enabled");
667 return ERROR_COMMAND_SYNTAX_ERROR
;
672 LOG_ERROR("no target selected");
676 duration_start_measure(&duration
);
680 image
.base_address_set
= 1;
681 image
.base_address
= strtoul(args
[1], NULL
, 0);
685 image
.base_address_set
= 0;
686 image
.base_address
= 0x0;
689 image
.start_address_set
= 0;
691 retval
= image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
);
692 if (retval
!= ERROR_OK
)
697 retval
= flash_write(target
, &image
, &written
, auto_erase
);
698 if (retval
!= ERROR_OK
)
704 if ((retvaltemp
= duration_stop_measure(&duration
, &duration_text
)) != ERROR_OK
)
709 if (retval
== ERROR_OK
)
711 command_print(cmd_ctx
, "wrote %u byte from file %s in %s (%f kb/s)",
712 written
, args
[0], duration_text
,
713 (float)written
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
722 static int handle_flash_fill_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
724 int err
= ERROR_OK
, retval
;
735 target_t
*target
= get_current_target(cmd_ctx
);
741 return ERROR_COMMAND_SYNTAX_ERROR
;
744 address
= strtoul(args
[0], NULL
, 0);
745 pattern
= strtoul(args
[1], NULL
, 0);
746 count
= strtoul(args
[2], NULL
, 0);
763 return ERROR_COMMAND_SYNTAX_ERROR
;
766 chunk_count
= MIN(count
, (1024 / wordsize
));
770 for(i
= 0; i
< chunk_count
; i
++)
772 target_buffer_set_u32(target
, chunk
+ i
* wordsize
, pattern
);
776 for(i
= 0; i
< chunk_count
; i
++)
778 target_buffer_set_u16(target
, chunk
+ i
* wordsize
, pattern
);
782 memset(chunk
, pattern
, chunk_count
);
785 LOG_ERROR("BUG: can't happen");
789 duration_start_measure(&duration
);
791 for (wrote
=0; wrote
<(count
*wordsize
); wrote
+= cur_size
)
793 cur_size
= MIN( (count
*wordsize
- wrote
), sizeof(chunk
) );
795 bank
= get_flash_bank_by_addr(target
, address
);
800 err
= flash_driver_write(bank
, chunk
, address
- bank
->base
+ wrote
, cur_size
);
804 err
= target_read_buffer(target
, address
+ wrote
, cur_size
, readback
);
809 for (i
=0; i
<cur_size
; i
++)
811 if (readback
[i
]!=chunk
[i
])
813 LOG_ERROR("Verfication error address 0x%08x, read back 0x%02x, expected 0x%02x", address
+ wrote
+ i
, readback
[i
], chunk
[i
]);
820 if ((retval
= duration_stop_measure(&duration
, &duration_text
)) != ERROR_OK
)
828 speed
=wrote
/ 1024.0;
829 speed
/=((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0));
830 command_print(cmd_ctx
, "wrote %d bytes to 0x%8.8x in %s (%f kb/s)",
831 count
*wordsize
, address
, duration_text
,
838 static int handle_flash_write_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
849 int retval
, retvaltemp
;
854 return ERROR_COMMAND_SYNTAX_ERROR
;
857 duration_start_measure(&duration
);
859 offset
= strtoul(args
[2], NULL
, 0);
860 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
863 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
867 if (fileio_open(&fileio
, args
[1], FILEIO_READ
, FILEIO_BINARY
) != ERROR_OK
)
872 buffer
= malloc(fileio
.size
);
873 if (fileio_read(&fileio
, fileio
.size
, buffer
, &buf_cnt
) != ERROR_OK
)
876 fileio_close(&fileio
);
880 retval
= flash_driver_write(p
, buffer
, offset
, buf_cnt
);
885 if ((retvaltemp
= duration_stop_measure(&duration
, &duration_text
)) != ERROR_OK
)
887 fileio_close(&fileio
);
890 if (retval
==ERROR_OK
)
892 command_print(cmd_ctx
, "wrote %"PRIi64
" byte from file %s to flash bank %i at offset 0x%8.8x in %s (%f kb/s)",
893 fileio
.size
, args
[1], strtoul(args
[0], NULL
, 0), offset
, duration_text
,
894 (float)fileio
.size
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
898 fileio_close(&fileio
);
903 void flash_set_dirty(void)
908 /* set all flash to require erasing */
909 for (c
= flash_banks
; c
; c
= c
->next
)
911 for (i
= 0; i
< c
->num_sectors
; i
++)
913 c
->sectors
[i
].is_erased
= 0;
918 /* lookup flash bank by address */
919 flash_bank_t
*get_flash_bank_by_addr(target_t
*target
, u32 addr
)
923 /* cycle through bank list */
924 for (c
= flash_banks
; c
; c
= c
->next
)
927 retval
= c
->driver
->auto_probe(c
);
929 if (retval
!= ERROR_OK
)
931 LOG_ERROR("auto_probe failed %d\n", retval
);
934 /* check whether address belongs to this flash bank */
935 if ((addr
>= c
->base
) && (addr
<= c
->base
+ (c
->size
- 1)) && target
== c
->target
)
938 LOG_ERROR("No flash at address 0x%08x\n", addr
);
942 /* erase given flash region, selects proper bank according to target and address */
943 int flash_erase_address_range(target_t
*target
, u32 addr
, u32 length
)
950 if ((c
= get_flash_bank_by_addr(target
, addr
)) == NULL
)
951 return ERROR_FLASH_DST_OUT_OF_BANK
; /* no corresponding bank found */
953 if (c
->size
== 0 || c
->num_sectors
== 0)
955 LOG_ERROR("Bank is invalid");
956 return ERROR_FLASH_BANK_INVALID
;
961 /* special case, erase whole bank when length is zero */
963 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
965 return flash_driver_erase(c
, 0, c
->num_sectors
- 1);
968 /* check whether it fits */
969 if (addr
+ length
- 1 > c
->base
+ c
->size
- 1)
970 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
974 for (i
= 0; i
< c
->num_sectors
; i
++)
976 /* check whether sector overlaps with the given range and is not yet erased */
977 if (addr
< c
->sectors
[i
].offset
+ c
->sectors
[i
].size
&& addr
+ length
> c
->sectors
[i
].offset
&& c
->sectors
[i
].is_erased
!= 1) {
978 /* if first is not set yet then this is the first sector */
981 last
= i
; /* and it is the last one so far in any case */
985 if( first
== -1 || last
== -1 )
988 return flash_driver_erase(c
, first
, last
);
991 /* write (optional verify) an image to flash memory of the given target */
992 int flash_write(target_t
*target
, image_t
*image
, u32
*written
, int erase
)
1009 /* assume all sectors need erasing - stops any problems
1010 * when flash_write is called multiple times */
1015 /* allocate padding array */
1016 padding
= malloc(image
->num_sections
* sizeof(padding
));
1018 /* loop until we reach end of the image */
1019 while (section
< image
->num_sections
)
1025 u32 run_address
= image
->sections
[section
].base_address
+ section_offset
;
1026 u32 run_size
= image
->sections
[section
].size
- section_offset
;
1029 if (image
->sections
[section
].size
== 0)
1031 LOG_WARNING("empty section %d", section
);
1037 /* find the corresponding flash bank */
1038 if ((c
= get_flash_bank_by_addr(target
, run_address
)) == NULL
)
1040 section
++; /* and skip it */
1045 /* collect consecutive sections which fall into the same bank */
1046 section_first
= section
;
1047 section_last
= section
;
1048 padding
[section
] = 0;
1049 while ((run_address
+ run_size
- 1 < c
->base
+ c
->size
- 1)
1050 && (section_last
+ 1 < image
->num_sections
))
1052 if (image
->sections
[section_last
+ 1].base_address
< (run_address
+ run_size
))
1054 LOG_DEBUG("section %d out of order(very slightly surprising, but supported)", section_last
+ 1);
1057 /* if we have multiple sections within our image, flash programming could fail due to alignment issues
1058 * attempt to rebuild a consecutive buffer for the flash loader */
1059 pad_bytes
= (image
->sections
[section_last
+ 1].base_address
) - (run_address
+ run_size
);
1060 if ((run_address
+ run_size
+ pad_bytes
) > (c
->base
+ c
->size
))
1062 padding
[section_last
] = pad_bytes
;
1063 run_size
+= image
->sections
[++section_last
].size
;
1064 run_size
+= pad_bytes
;
1065 padding
[section_last
] = 0;
1067 LOG_INFO("Padding image section %d with %d bytes", section_last
-1, pad_bytes
);
1070 /* fit the run into bank constraints */
1071 if (run_address
+ run_size
- 1 > c
->base
+ c
->size
- 1)
1073 LOG_WARNING("writing %d bytes only - as image section is %d bytes and bank is only %d bytes", \
1074 c
->base
+ c
->size
- run_address
, run_size
, c
->size
);
1075 run_size
= c
->base
+ c
->size
- run_address
;
1078 /* allocate buffer */
1079 buffer
= malloc(run_size
);
1082 /* read sections to the buffer */
1083 while (buffer_size
< run_size
)
1087 size_read
= run_size
- buffer_size
;
1088 if (size_read
> image
->sections
[section
].size
- section_offset
)
1089 size_read
= image
->sections
[section
].size
- section_offset
;
1091 if ((retval
= image_read_section(image
, section
, section_offset
,
1092 size_read
, buffer
+ buffer_size
, &size_read
)) != ERROR_OK
|| size_read
== 0)
1099 /* see if we need to pad the section */
1100 while (padding
[section
]--)
1101 (buffer
+buffer_size
)[size_read
++] = 0xff;
1103 buffer_size
+= size_read
;
1104 section_offset
+= size_read
;
1106 if (section_offset
>= image
->sections
[section
].size
)
1117 /* calculate and erase sectors */
1118 retval
= flash_erase_address_range( target
, run_address
, run_size
);
1121 if (retval
== ERROR_OK
)
1123 /* write flash sectors */
1124 retval
= flash_driver_write(c
, buffer
, run_address
- c
->base
, run_size
);
1129 if (retval
!= ERROR_OK
)
1132 return retval
; /* abort operation */
1135 if (written
!= NULL
)
1136 *written
+= run_size
; /* add run size to total written counter */
1144 int default_flash_mem_blank_check(struct flash_bank_s
*bank
)
1146 target_t
*target
= bank
->target
;
1148 int buffer_size
= sizeof(buffer
);
1152 if (bank
->target
->state
!= TARGET_HALTED
)
1154 LOG_ERROR("Target not halted");
1155 return ERROR_TARGET_NOT_HALTED
;
1158 for (i
= 0; i
< bank
->num_sectors
; i
++)
1161 bank
->sectors
[i
].is_erased
= 1;
1163 for (j
= 0; j
< bank
->sectors
[i
].size
; j
+= buffer_size
)
1167 chunk
= buffer_size
;
1168 if (chunk
> (j
- bank
->sectors
[i
].size
))
1170 chunk
= (j
- bank
->sectors
[i
].size
);
1173 retval
= target
->type
->read_memory(target
, bank
->base
+ bank
->sectors
[i
].offset
+ j
, 4, chunk
/4, buffer
);
1174 if (retval
!= ERROR_OK
)
1177 for (nBytes
= 0; nBytes
< chunk
; nBytes
++)
1179 if (buffer
[nBytes
] != 0xFF)
1181 bank
->sectors
[i
].is_erased
= 0;
1191 int default_flash_blank_check(struct flash_bank_s
*bank
)
1193 target_t
*target
= bank
->target
;
1199 if (bank
->target
->state
!= TARGET_HALTED
)
1201 LOG_ERROR("Target not halted");
1202 return ERROR_TARGET_NOT_HALTED
;
1205 for (i
= 0; i
< bank
->num_sectors
; i
++)
1207 u32 address
= bank
->base
+ bank
->sectors
[i
].offset
;
1208 u32 size
= bank
->sectors
[i
].size
;
1210 if ((retval
= target_blank_check_memory(target
, address
, size
, &blank
)) != ERROR_OK
)
1216 bank
->sectors
[i
].is_erased
= 1;
1218 bank
->sectors
[i
].is_erased
= 0;
1224 LOG_USER("Running slow fallback erase check - add working memory");
1225 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)