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"
49 /* command handlers */
50 static int handle_flash_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
51 static int handle_flash_info_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
52 static int handle_flash_probe_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
53 static int handle_flash_erase_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
54 static int handle_flash_erase_address_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
55 static int handle_flash_protect_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
56 static int handle_flash_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
57 static int handle_flash_write_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
58 static int handle_flash_write_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
59 static int handle_flash_fill_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
60 static int handle_flash_protect_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
64 extern flash_driver_t lpc2000_flash
;
65 extern flash_driver_t cfi_flash
;
66 extern flash_driver_t at91sam7_flash
;
67 extern flash_driver_t str7x_flash
;
68 extern flash_driver_t str9x_flash
;
69 extern flash_driver_t aduc702x_flash
;
70 extern flash_driver_t stellaris_flash
;
71 extern flash_driver_t str9xpec_flash
;
72 extern flash_driver_t stm32x_flash
;
73 extern flash_driver_t tms470_flash
;
74 extern flash_driver_t ecosflash_flash
;
75 extern flash_driver_t lpc288x_flash
;
76 extern flash_driver_t ocl_flash
;
77 extern flash_driver_t pic32mx_flash
;
78 extern flash_driver_t avr_flash
;
80 flash_driver_t
*flash_drivers
[] = {
99 flash_bank_t
*flash_banks
;
100 static command_t
*flash_cmd
;
102 /* wafer thin wrapper for invoking the flash driver */
103 static int flash_driver_write(struct flash_bank_s
*bank
, u8
*buffer
, u32 offset
, u32 count
)
107 retval
=bank
->driver
->write(bank
, buffer
, offset
, count
);
108 if (retval
!=ERROR_OK
)
110 LOG_ERROR("error writing to flash at address 0x%08x at offset 0x%8.8x (%d)", bank
->base
, offset
, retval
);
116 static int flash_driver_erase(struct flash_bank_s
*bank
, int first
, int last
)
120 retval
=bank
->driver
->erase(bank
, first
, last
);
121 if (retval
!=ERROR_OK
)
123 LOG_ERROR("failed erasing sectors %d to %d (%d)", first
, last
, retval
);
129 int flash_driver_protect(struct flash_bank_s
*bank
, int set
, int first
, int last
)
133 retval
=bank
->driver
->protect(bank
, set
, first
, last
);
134 if (retval
!=ERROR_OK
)
136 LOG_ERROR("failed setting protection for areas %d to %d (%d)", first
, last
, retval
);
142 int flash_register_commands(struct command_context_s
*cmd_ctx
)
144 flash_cmd
= register_command(cmd_ctx
, NULL
, "flash", NULL
, COMMAND_ANY
, NULL
);
146 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 ...]");
150 static int jim_flash_banks(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
155 Jim_WrongNumArgs(interp
, 1, argv
, "no arguments to flash_banks command");
159 Jim_Obj
*list
=Jim_NewListObj(interp
, NULL
, 0);
160 for (p
= flash_banks
; p
; p
= p
->next
)
162 Jim_Obj
*elem
=Jim_NewListObj(interp
, NULL
, 0);
164 Jim_ListAppendElement(interp
, elem
, Jim_NewStringObj(interp
, "name", -1));
165 Jim_ListAppendElement(interp
, elem
, Jim_NewStringObj(interp
, p
->driver
->name
, -1));
166 Jim_ListAppendElement(interp
, elem
, Jim_NewStringObj(interp
, "base", -1));
167 Jim_ListAppendElement(interp
, elem
, Jim_NewIntObj(interp
, p
->base
));
168 Jim_ListAppendElement(interp
, elem
, Jim_NewStringObj(interp
, "size", -1));
169 Jim_ListAppendElement(interp
, elem
, Jim_NewIntObj(interp
, p
->size
));
170 Jim_ListAppendElement(interp
, elem
, Jim_NewStringObj(interp
, "bus_width", -1));
171 Jim_ListAppendElement(interp
, elem
, Jim_NewIntObj(interp
, p
->bus_width
));
172 Jim_ListAppendElement(interp
, elem
, Jim_NewStringObj(interp
, "chip_width", -1));
173 Jim_ListAppendElement(interp
, elem
, Jim_NewIntObj(interp
, p
->chip_width
));
175 Jim_ListAppendElement(interp
, list
, elem
);
178 Jim_SetResult(interp
, list
);
183 int flash_init_drivers(struct command_context_s
*cmd_ctx
)
185 register_jim(cmd_ctx
, "ocd_flash_banks", jim_flash_banks
, "return information about the flash banks");
189 register_command(cmd_ctx
, flash_cmd
, "info", handle_flash_info_command
, COMMAND_EXEC
,
190 "print info about flash bank <num>");
191 register_command(cmd_ctx
, flash_cmd
, "probe", handle_flash_probe_command
, COMMAND_EXEC
,
192 "identify flash bank <num>");
193 register_command(cmd_ctx
, flash_cmd
, "erase_check", handle_flash_erase_check_command
, COMMAND_EXEC
,
194 "check erase state of sectors in flash bank <num>");
195 register_command(cmd_ctx
, flash_cmd
, "protect_check", handle_flash_protect_check_command
, COMMAND_EXEC
,
196 "check protection state of sectors in flash bank <num>");
197 register_command(cmd_ctx
, flash_cmd
, "erase_sector", handle_flash_erase_command
, COMMAND_EXEC
,
198 "erase sectors at <bank> <first> <last>");
199 register_command(cmd_ctx
, flash_cmd
, "erase_address", handle_flash_erase_address_command
, COMMAND_EXEC
,
200 "erase address range <address> <length>");
202 register_command(cmd_ctx
, flash_cmd
, "fillw", handle_flash_fill_command
, COMMAND_EXEC
,
203 "fill with pattern (no autoerase) <address> <word_pattern> <count>");
204 register_command(cmd_ctx
, flash_cmd
, "fillh", handle_flash_fill_command
, COMMAND_EXEC
,
205 "fill with pattern <address> <halfword_pattern> <count>");
206 register_command(cmd_ctx
, flash_cmd
, "fillb", handle_flash_fill_command
, COMMAND_EXEC
,
207 "fill with pattern <address> <byte_pattern> <count>");
209 register_command(cmd_ctx
, flash_cmd
, "write_bank", handle_flash_write_bank_command
, COMMAND_EXEC
,
210 "write binary data to <bank> <file> <offset>");
211 register_command(cmd_ctx
, flash_cmd
, "write_image", handle_flash_write_image_command
, COMMAND_EXEC
,
212 "write_image [erase] <file> [offset] [type]");
213 register_command(cmd_ctx
, flash_cmd
, "protect", handle_flash_protect_command
, COMMAND_EXEC
,
214 "set protection of sectors at <bank> <first> <last> <on|off>");
220 flash_bank_t
*get_flash_bank_by_num_noprobe(int num
)
225 for (p
= flash_banks
; p
; p
= p
->next
)
232 LOG_ERROR("flash bank %d does not exist", num
);
236 int flash_get_bank_count(void)
240 for (p
= flash_banks
; p
; p
= p
->next
)
247 flash_bank_t
*get_flash_bank_by_num(int num
)
249 flash_bank_t
*p
= get_flash_bank_by_num_noprobe(num
);
255 retval
= p
->driver
->auto_probe(p
);
257 if (retval
!= ERROR_OK
)
259 LOG_ERROR("auto_probe failed %d\n", retval
);
265 static int handle_flash_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
274 return ERROR_COMMAND_SYNTAX_ERROR
;
277 if ((target
= get_target_by_num(strtoul(args
[5], NULL
, 0))) == NULL
)
279 LOG_ERROR("target %lu not defined", strtoul(args
[5], NULL
, 0));
283 for (i
= 0; flash_drivers
[i
]; i
++)
285 if (strcmp(args
[0], flash_drivers
[i
]->name
) == 0)
289 /* register flash specific commands */
290 if (flash_drivers
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
292 LOG_ERROR("couldn't register '%s' commands", args
[0]);
296 c
= malloc(sizeof(flash_bank_t
));
298 c
->driver
= flash_drivers
[i
];
299 c
->driver_priv
= NULL
;
300 c
->base
= strtoul(args
[1], NULL
, 0);
301 c
->size
= strtoul(args
[2], NULL
, 0);
302 c
->chip_width
= strtoul(args
[3], NULL
, 0);
303 c
->bus_width
= strtoul(args
[4], NULL
, 0);
308 if ((retval
=flash_drivers
[i
]->flash_bank_command(cmd_ctx
, cmd
, args
, argc
, c
)) != ERROR_OK
)
310 LOG_ERROR("'%s' driver rejected flash bank at 0x%8.8x", args
[0], c
->base
);
315 /* put flash bank in linked list */
319 /* find last flash bank */
320 for (p
= flash_banks
; p
&& p
->next
; p
= p
->next
) bank_num
++;
323 c
->bank_number
= bank_num
+ 1;
335 /* no matching flash driver found */
338 LOG_ERROR("flash driver '%s' not found", args
[0]);
345 static int handle_flash_info_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
354 return ERROR_COMMAND_SYNTAX_ERROR
;
357 for (p
= flash_banks
; p
; p
= p
->next
, i
++)
359 if (i
== strtoul(args
[0], NULL
, 0))
363 /* attempt auto probe */
364 if ((retval
= p
->driver
->auto_probe(p
)) != ERROR_OK
)
367 command_print(cmd_ctx
, "#%i: %s at 0x%8.8x, size 0x%8.8x, buswidth %i, chipwidth %i",
368 i
, p
->driver
->name
, p
->base
, p
->size
, p
->bus_width
, p
->chip_width
);
369 for (j
= 0; j
< p
->num_sectors
; j
++)
373 if (p
->sectors
[j
].is_protected
== 0)
374 protect_state
= "not protected";
375 else if (p
->sectors
[j
].is_protected
== 1)
376 protect_state
= "protected";
378 protect_state
= "protection state unknown";
380 command_print(cmd_ctx
, "\t#%3i: 0x%8.8x (0x%x %ikB) %s",
381 j
, p
->sectors
[j
].offset
, p
->sectors
[j
].size
, p
->sectors
[j
].size
>>10,
385 *buf
= '\0'; /* initialize buffer, otherwise it migh contain garbage if driver function fails */
386 retval
= p
->driver
->info(p
, buf
, sizeof(buf
));
387 command_print(cmd_ctx
, "%s", buf
);
388 if (retval
!= ERROR_OK
)
389 LOG_ERROR("error retrieving flash info (%d)", retval
);
396 static int handle_flash_probe_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
403 return ERROR_COMMAND_SYNTAX_ERROR
;
406 p
= get_flash_bank_by_num_noprobe(strtoul(args
[0], NULL
, 0));
409 if ((retval
= p
->driver
->probe(p
)) == ERROR_OK
)
411 command_print(cmd_ctx
, "flash '%s' found at 0x%8.8x", p
->driver
->name
, p
->base
);
413 else if (retval
== ERROR_FLASH_BANK_INVALID
)
415 command_print(cmd_ctx
, "probing failed for flash bank '#%s' at 0x%8.8x",
420 command_print(cmd_ctx
, "unknown error when probing flash bank '#%s' at 0x%8.8x",
426 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
432 static int handle_flash_erase_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
439 return ERROR_COMMAND_SYNTAX_ERROR
;
442 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
446 if ((retval
= p
->driver
->erase_check(p
)) == ERROR_OK
)
448 command_print(cmd_ctx
, "successfully checked erase state", p
->driver
->name
, p
->base
);
452 command_print(cmd_ctx
, "unknown error when checking erase state of flash bank #%s at 0x%8.8x",
456 for (j
= 0; j
< p
->num_sectors
; j
++)
460 if (p
->sectors
[j
].is_erased
== 0)
461 erase_state
= "not erased";
462 else if (p
->sectors
[j
].is_erased
== 1)
463 erase_state
= "erased";
465 erase_state
= "erase state unknown";
467 command_print(cmd_ctx
, "\t#%3i: 0x%8.8x (0x%x %ikB) %s",
468 j
, p
->sectors
[j
].offset
, p
->sectors
[j
].size
, p
->sectors
[j
].size
>>10,
476 static int handle_flash_erase_address_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
485 target_t
*target
= get_current_target(cmd_ctx
);
489 return ERROR_COMMAND_SYNTAX_ERROR
;
492 address
= strtoul(args
[0], NULL
, 0);
493 length
= strtoul(args
[1], NULL
, 0);
496 command_print(cmd_ctx
, "Length must be >0");
497 return ERROR_COMMAND_SYNTAX_ERROR
;
500 p
= get_flash_bank_by_addr(target
, address
);
506 /* We can't know if we did a resume + halt, in which case we no longer know the erased state */
509 duration_start_measure(&duration
);
511 if ((retval
= flash_erase_address_range(target
, address
, length
)) == ERROR_OK
)
513 if ((retval
= duration_stop_measure(&duration
, &duration_text
)) != ERROR_OK
)
517 command_print(cmd_ctx
, "erased address 0x%8.8x length %i in %s", address
, length
, duration_text
);
524 static int handle_flash_protect_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
531 return ERROR_COMMAND_SYNTAX_ERROR
;
534 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
537 if ((retval
= p
->driver
->protect_check(p
)) == ERROR_OK
)
539 command_print(cmd_ctx
, "successfully checked protect state");
541 else if (retval
== ERROR_FLASH_OPERATION_FAILED
)
543 command_print(cmd_ctx
, "checking protection state failed (possibly unsupported) by flash #%s at 0x%8.8x", args
[0], p
->base
);
547 command_print(cmd_ctx
, "unknown error when checking protection state of flash bank '#%s' at 0x%8.8x", args
[0], p
->base
);
552 return ERROR_COMMAND_SYNTAX_ERROR
;
558 static int handle_flash_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
562 int first
= strtoul(args
[1], NULL
, 0);
563 int last
= strtoul(args
[2], NULL
, 0);
565 flash_bank_t
*p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
569 duration_start_measure(&duration
);
573 return ERROR_COMMAND_SYNTAX_ERROR
;
576 if ((retval
= flash_driver_erase(p
, first
, last
)) == ERROR_OK
)
578 if ((retval
= duration_stop_measure(&duration
, &duration_text
)) != ERROR_OK
)
583 command_print(cmd_ctx
, "erased sectors %i through %i on flash bank %i in %s", first
, last
, strtoul(args
[0], 0, 0), duration_text
);
589 return ERROR_COMMAND_SYNTAX_ERROR
;
595 static int handle_flash_protect_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
599 int first
= strtoul(args
[1], NULL
, 0);
600 int last
= strtoul(args
[2], NULL
, 0);
603 flash_bank_t
*p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
606 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
610 if (strcmp(args
[3], "on") == 0)
612 else if (strcmp(args
[3], "off") == 0)
616 return ERROR_COMMAND_SYNTAX_ERROR
;
619 retval
= flash_driver_protect(p
, set
, first
, last
);
620 if (retval
== ERROR_OK
)
622 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));
627 return ERROR_COMMAND_SYNTAX_ERROR
;
634 static int handle_flash_write_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
636 target_t
*target
= get_current_target(cmd_ctx
);
644 int retval
, retvaltemp
;
648 return ERROR_COMMAND_SYNTAX_ERROR
;
651 /* flash auto-erase is disabled by default*/
654 if (strcmp(args
[0], "erase")==0)
659 command_print(cmd_ctx
, "auto erase enabled");
664 return ERROR_COMMAND_SYNTAX_ERROR
;
669 LOG_ERROR("no target selected");
673 duration_start_measure(&duration
);
677 image
.base_address_set
= 1;
678 image
.base_address
= strtoul(args
[1], NULL
, 0);
682 image
.base_address_set
= 0;
683 image
.base_address
= 0x0;
686 image
.start_address_set
= 0;
688 retval
= image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
);
689 if (retval
!= ERROR_OK
)
694 retval
= flash_write(target
, &image
, &written
, auto_erase
);
695 if (retval
!= ERROR_OK
)
701 if ((retvaltemp
= duration_stop_measure(&duration
, &duration_text
)) != ERROR_OK
)
706 if (retval
== ERROR_OK
)
708 command_print(cmd_ctx
, "wrote %u byte from file %s in %s (%f kb/s)",
709 written
, args
[0], duration_text
,
710 (float)written
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
719 static int handle_flash_fill_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
721 int err
= ERROR_OK
, retval
;
732 target_t
*target
= get_current_target(cmd_ctx
);
738 return ERROR_COMMAND_SYNTAX_ERROR
;
741 address
= strtoul(args
[0], NULL
, 0);
742 pattern
= strtoul(args
[1], NULL
, 0);
743 count
= strtoul(args
[2], NULL
, 0);
760 return ERROR_COMMAND_SYNTAX_ERROR
;
763 chunk_count
= MIN(count
, (1024 / wordsize
));
767 for(i
= 0; i
< chunk_count
; i
++)
769 target_buffer_set_u32(target
, chunk
+ i
* wordsize
, pattern
);
773 for(i
= 0; i
< chunk_count
; i
++)
775 target_buffer_set_u16(target
, chunk
+ i
* wordsize
, pattern
);
779 memset(chunk
, pattern
, chunk_count
);
782 LOG_ERROR("BUG: can't happen");
786 duration_start_measure(&duration
);
788 for (wrote
=0; wrote
<(count
*wordsize
); wrote
+= cur_size
)
790 cur_size
= MIN( (count
*wordsize
- wrote
), sizeof(chunk
) );
792 bank
= get_flash_bank_by_addr(target
, address
);
797 err
= flash_driver_write(bank
, chunk
, address
- bank
->base
+ wrote
, cur_size
);
801 err
= target_read_buffer(target
, address
+ wrote
, cur_size
, readback
);
806 for (i
=0; i
<cur_size
; i
++)
808 if (readback
[i
]!=chunk
[i
])
810 LOG_ERROR("Verfication error address 0x%08x, read back 0x%02x, expected 0x%02x", address
+ wrote
+ i
, readback
[i
], chunk
[i
]);
817 if ((retval
= duration_stop_measure(&duration
, &duration_text
)) != ERROR_OK
)
825 speed
=wrote
/ 1024.0;
826 speed
/=((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0));
827 command_print(cmd_ctx
, "wrote %d bytes to 0x%8.8x in %s (%f kb/s)",
828 count
*wordsize
, address
, duration_text
,
835 static int handle_flash_write_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
846 int retval
, retvaltemp
;
851 return ERROR_COMMAND_SYNTAX_ERROR
;
854 duration_start_measure(&duration
);
856 offset
= strtoul(args
[2], NULL
, 0);
857 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
860 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
864 if (fileio_open(&fileio
, args
[1], FILEIO_READ
, FILEIO_BINARY
) != ERROR_OK
)
869 buffer
= malloc(fileio
.size
);
870 if (fileio_read(&fileio
, fileio
.size
, buffer
, &buf_cnt
) != ERROR_OK
)
873 fileio_close(&fileio
);
877 retval
= flash_driver_write(p
, buffer
, offset
, buf_cnt
);
882 if ((retvaltemp
= duration_stop_measure(&duration
, &duration_text
)) != ERROR_OK
)
884 fileio_close(&fileio
);
887 if (retval
==ERROR_OK
)
889 command_print(cmd_ctx
, "wrote %"PRIi64
" byte from file %s to flash bank %i at offset 0x%8.8x in %s (%f kb/s)",
890 fileio
.size
, args
[1], strtoul(args
[0], NULL
, 0), offset
, duration_text
,
891 (float)fileio
.size
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
895 fileio_close(&fileio
);
900 void flash_set_dirty(void)
905 /* set all flash to require erasing */
906 for (c
= flash_banks
; c
; c
= c
->next
)
908 for (i
= 0; i
< c
->num_sectors
; i
++)
910 c
->sectors
[i
].is_erased
= 0;
915 /* lookup flash bank by address */
916 flash_bank_t
*get_flash_bank_by_addr(target_t
*target
, u32 addr
)
920 /* cycle through bank list */
921 for (c
= flash_banks
; c
; c
= c
->next
)
924 retval
= c
->driver
->auto_probe(c
);
926 if (retval
!= ERROR_OK
)
928 LOG_ERROR("auto_probe failed %d\n", retval
);
931 /* check whether address belongs to this flash bank */
932 if ((addr
>= c
->base
) && (addr
<= c
->base
+ (c
->size
- 1)) && target
== c
->target
)
935 LOG_ERROR("No flash at address 0x%08x\n", addr
);
939 /* erase given flash region, selects proper bank according to target and address */
940 int flash_erase_address_range(target_t
*target
, u32 addr
, u32 length
)
947 if ((c
= get_flash_bank_by_addr(target
, addr
)) == NULL
)
948 return ERROR_FLASH_DST_OUT_OF_BANK
; /* no corresponding bank found */
950 if (c
->size
== 0 || c
->num_sectors
== 0)
952 LOG_ERROR("Bank is invalid");
953 return ERROR_FLASH_BANK_INVALID
;
958 /* special case, erase whole bank when length is zero */
960 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
962 return flash_driver_erase(c
, 0, c
->num_sectors
- 1);
965 /* check whether it fits */
966 if (addr
+ length
- 1 > c
->base
+ c
->size
- 1)
967 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
971 for (i
= 0; i
< c
->num_sectors
; i
++)
973 /* check whether sector overlaps with the given range and is not yet erased */
974 if (addr
< c
->sectors
[i
].offset
+ c
->sectors
[i
].size
&& addr
+ length
> c
->sectors
[i
].offset
&& c
->sectors
[i
].is_erased
!= 1) {
975 /* if first is not set yet then this is the first sector */
978 last
= i
; /* and it is the last one so far in any case */
982 if( first
== -1 || last
== -1 )
985 return flash_driver_erase(c
, first
, last
);
988 /* write (optional verify) an image to flash memory of the given target */
989 int flash_write(target_t
*target
, image_t
*image
, u32
*written
, int erase
)
1006 /* assume all sectors need erasing - stops any problems
1007 * when flash_write is called multiple times */
1012 /* allocate padding array */
1013 padding
= malloc(image
->num_sections
* sizeof(padding
));
1015 /* loop until we reach end of the image */
1016 while (section
< image
->num_sections
)
1022 u32 run_address
= image
->sections
[section
].base_address
+ section_offset
;
1023 u32 run_size
= image
->sections
[section
].size
- section_offset
;
1026 if (image
->sections
[section
].size
== 0)
1028 LOG_WARNING("empty section %d", section
);
1034 /* find the corresponding flash bank */
1035 if ((c
= get_flash_bank_by_addr(target
, run_address
)) == NULL
)
1037 section
++; /* and skip it */
1042 /* collect consecutive sections which fall into the same bank */
1043 section_first
= section
;
1044 section_last
= section
;
1045 padding
[section
] = 0;
1046 while ((run_address
+ run_size
- 1 < c
->base
+ c
->size
- 1)
1047 && (section_last
+ 1 < image
->num_sections
))
1049 if (image
->sections
[section_last
+ 1].base_address
< (run_address
+ run_size
))
1051 LOG_DEBUG("section %d out of order(very slightly surprising, but supported)", section_last
+ 1);
1054 /* if we have multiple sections within our image, flash programming could fail due to alignment issues
1055 * attempt to rebuild a consecutive buffer for the flash loader */
1056 pad_bytes
= (image
->sections
[section_last
+ 1].base_address
) - (run_address
+ run_size
);
1057 if ((run_address
+ run_size
+ pad_bytes
) > (c
->base
+ c
->size
))
1059 padding
[section_last
] = pad_bytes
;
1060 run_size
+= image
->sections
[++section_last
].size
;
1061 run_size
+= pad_bytes
;
1062 padding
[section_last
] = 0;
1064 LOG_INFO("Padding image section %d with %d bytes", section_last
-1, pad_bytes
);
1067 /* fit the run into bank constraints */
1068 if (run_address
+ run_size
- 1 > c
->base
+ c
->size
- 1)
1070 LOG_WARNING("writing %d bytes only - as image section is %d bytes and bank is only %d bytes", \
1071 c
->base
+ c
->size
- run_address
, run_size
, c
->size
);
1072 run_size
= c
->base
+ c
->size
- run_address
;
1075 /* allocate buffer */
1076 buffer
= malloc(run_size
);
1079 /* read sections to the buffer */
1080 while (buffer_size
< run_size
)
1084 size_read
= run_size
- buffer_size
;
1085 if (size_read
> image
->sections
[section
].size
- section_offset
)
1086 size_read
= image
->sections
[section
].size
- section_offset
;
1088 if ((retval
= image_read_section(image
, section
, section_offset
,
1089 size_read
, buffer
+ buffer_size
, &size_read
)) != ERROR_OK
|| size_read
== 0)
1096 /* see if we need to pad the section */
1097 while (padding
[section
]--)
1098 (buffer
+buffer_size
)[size_read
++] = 0xff;
1100 buffer_size
+= size_read
;
1101 section_offset
+= size_read
;
1103 if (section_offset
>= image
->sections
[section
].size
)
1114 /* calculate and erase sectors */
1115 retval
= flash_erase_address_range( target
, run_address
, run_size
);
1118 if (retval
== ERROR_OK
)
1120 /* write flash sectors */
1121 retval
= flash_driver_write(c
, buffer
, run_address
- c
->base
, run_size
);
1126 if (retval
!= ERROR_OK
)
1129 return retval
; /* abort operation */
1132 if (written
!= NULL
)
1133 *written
+= run_size
; /* add run size to total written counter */
1141 int default_flash_mem_blank_check(struct flash_bank_s
*bank
)
1143 target_t
*target
= bank
->target
;
1145 int buffer_size
= sizeof(buffer
);
1149 if (bank
->target
->state
!= TARGET_HALTED
)
1151 LOG_ERROR("Target not halted");
1152 return ERROR_TARGET_NOT_HALTED
;
1155 for (i
= 0; i
< bank
->num_sectors
; i
++)
1158 bank
->sectors
[i
].is_erased
= 1;
1160 for (j
= 0; j
< bank
->sectors
[i
].size
; j
+= buffer_size
)
1164 chunk
= buffer_size
;
1165 if (chunk
> (j
- bank
->sectors
[i
].size
))
1167 chunk
= (j
- bank
->sectors
[i
].size
);
1170 retval
= target
->type
->read_memory(target
, bank
->base
+ bank
->sectors
[i
].offset
+ j
, 4, chunk
/4, buffer
);
1171 if (retval
!= ERROR_OK
)
1174 for (nBytes
= 0; nBytes
< chunk
; nBytes
++)
1176 if (buffer
[nBytes
] != 0xFF)
1178 bank
->sectors
[i
].is_erased
= 0;
1188 int default_flash_blank_check(struct flash_bank_s
*bank
)
1190 target_t
*target
= bank
->target
;
1196 if (bank
->target
->state
!= TARGET_HALTED
)
1198 LOG_ERROR("Target not halted");
1199 return ERROR_TARGET_NOT_HALTED
;
1202 for (i
= 0; i
< bank
->num_sectors
; i
++)
1204 u32 address
= bank
->base
+ bank
->sectors
[i
].offset
;
1205 u32 size
= bank
->sectors
[i
].size
;
1207 if ((retval
= target_blank_check_memory(target
, address
, size
, &blank
)) != ERROR_OK
)
1213 bank
->sectors
[i
].is_erased
= 1;
1215 bank
->sectors
[i
].is_erased
= 0;
1221 LOG_USER("Running slow fallback erase check - add working memory");
1222 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)