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>
44 /* command handlers */
45 int handle_flash_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
46 int handle_flash_banks_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
47 int handle_flash_info_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
48 int handle_flash_probe_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
49 int handle_flash_erase_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
50 int handle_flash_erase_address_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
51 int handle_flash_protect_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
52 int handle_flash_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
53 int handle_flash_write_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
54 int handle_flash_write_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
55 int handle_flash_write_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
56 int handle_flash_fill_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
57 int handle_flash_protect_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
58 int handle_flash_auto_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
59 flash_bank_t
*get_flash_bank_by_addr(target_t
*target
, u32 addr
);
63 extern flash_driver_t lpc2000_flash
;
64 extern flash_driver_t cfi_flash
;
65 extern flash_driver_t at91sam7_flash
;
66 extern flash_driver_t str7x_flash
;
67 extern flash_driver_t str9x_flash
;
68 extern flash_driver_t stellaris_flash
;
69 extern flash_driver_t str9xpec_flash
;
70 extern flash_driver_t stm32x_flash
;
71 extern flash_driver_t tms470_flash
;
72 extern flash_driver_t ecosflash_flash
;
74 flash_driver_t
*flash_drivers
[] =
89 flash_bank_t
*flash_banks
;
90 static command_t
*flash_cmd
;
91 /* enabled by default*/
92 static int auto_erase
= 1;
94 /* wafer thin wrapper for invoking the flash driver */
95 static int flash_driver_write(struct flash_bank_s
*bank
, u8
*buffer
, u32 offset
, u32 count
)
99 retval
=bank
->driver
->write(bank
, buffer
, offset
, count
);
100 if (retval
!=ERROR_OK
)
102 LOG_ERROR("error writing to flash at address 0x%08x at offset 0x%8.8x (%d)", bank
->base
, offset
, retval
);
108 static int flash_driver_erase(struct flash_bank_s
*bank
, int first
, int last
)
112 retval
=bank
->driver
->erase(bank
, first
, last
);
113 if (retval
!=ERROR_OK
)
115 LOG_ERROR("failed erasing sectors %d to %d (%d)", first
, last
, retval
);
121 int flash_driver_protect(struct flash_bank_s
*bank
, int set
, int first
, int last
)
125 retval
=bank
->driver
->protect(bank
, set
, first
, last
);
126 if (retval
!=ERROR_OK
)
128 LOG_ERROR("failed setting protection for areas %d to %d (%d)", first
, last
, retval
);
135 int flash_register_commands(struct command_context_s
*cmd_ctx
)
137 flash_cmd
= register_command(cmd_ctx
, NULL
, "flash", NULL
, COMMAND_ANY
, NULL
);
139 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 ...]");
140 register_command(cmd_ctx
, flash_cmd
, "auto_erase", handle_flash_auto_erase_command
, COMMAND_ANY
,
141 "auto erase flash sectors <on|off>");
145 int flash_init_drivers(struct command_context_s
*cmd_ctx
)
149 register_command(cmd_ctx
, flash_cmd
, "banks", handle_flash_banks_command
, COMMAND_EXEC
,
150 "list configured flash banks ");
151 register_command(cmd_ctx
, flash_cmd
, "info", handle_flash_info_command
, COMMAND_EXEC
,
152 "print info about flash bank <num>");
153 register_command(cmd_ctx
, flash_cmd
, "probe", handle_flash_probe_command
, COMMAND_EXEC
,
154 "identify flash bank <num>");
155 register_command(cmd_ctx
, flash_cmd
, "erase_check", handle_flash_erase_check_command
, COMMAND_EXEC
,
156 "check erase state of sectors in flash bank <num>");
157 register_command(cmd_ctx
, flash_cmd
, "protect_check", handle_flash_protect_check_command
, COMMAND_EXEC
,
158 "check protection state of sectors in flash bank <num>");
159 register_command(cmd_ctx
, flash_cmd
, "erase_sector", handle_flash_erase_command
, COMMAND_EXEC
,
160 "erase sectors at <bank> <first> <last>");
161 register_command(cmd_ctx
, flash_cmd
, "erase_address", handle_flash_erase_address_command
, COMMAND_EXEC
,
162 "erase address range <address> <length>");
164 register_command(cmd_ctx
, flash_cmd
, "fillw", handle_flash_fill_command
, COMMAND_EXEC
,
165 "fill with pattern <address> <word_pattern> <count>");
166 register_command(cmd_ctx
, flash_cmd
, "fillh", handle_flash_fill_command
, COMMAND_EXEC
,
167 "fill with pattern <address> <halfword_pattern> <count>");
168 register_command(cmd_ctx
, flash_cmd
, "fillb", handle_flash_fill_command
, COMMAND_EXEC
,
169 "fill with pattern <address> <byte_pattern> <count>");
171 register_command(cmd_ctx
, flash_cmd
, "write_bank", handle_flash_write_bank_command
, COMMAND_EXEC
,
172 "write binary data to <bank> <file> <offset>");
173 register_command(cmd_ctx
, flash_cmd
, "write_image", handle_flash_write_image_command
, COMMAND_EXEC
,
174 "write_image <file> [offset] [type]");
175 register_command(cmd_ctx
, flash_cmd
, "protect", handle_flash_protect_command
, COMMAND_EXEC
,
176 "set protection of sectors at <bank> <first> <last> <on|off>");
182 flash_bank_t
*get_flash_bank_by_num_noprobe(int num
)
187 for (p
= flash_banks
; p
; p
= p
->next
)
194 LOG_ERROR("flash bank %d does not exist", num
);
198 int flash_get_bank_count()
202 for (p
= flash_banks
; p
; p
= p
->next
)
209 flash_bank_t
*get_flash_bank_by_num(int num
)
211 flash_bank_t
*p
= get_flash_bank_by_num_noprobe(num
);
217 retval
= p
->driver
->auto_probe(p
);
219 if (retval
!= ERROR_OK
)
221 LOG_ERROR("auto_probe failed %d\n", retval
);
227 int handle_flash_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
235 return ERROR_COMMAND_SYNTAX_ERROR
;
238 if ((target
= get_target_by_num(strtoul(args
[5], NULL
, 0))) == NULL
)
240 LOG_ERROR("target %lu not defined", strtoul(args
[5], NULL
, 0));
244 for (i
= 0; flash_drivers
[i
]; i
++)
246 if (strcmp(args
[0], flash_drivers
[i
]->name
) == 0)
250 /* register flash specific commands */
251 if (flash_drivers
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
253 LOG_ERROR("couldn't register '%s' commands", args
[0]);
257 c
= malloc(sizeof(flash_bank_t
));
259 c
->driver
= flash_drivers
[i
];
260 c
->driver_priv
= NULL
;
261 c
->base
= strtoul(args
[1], NULL
, 0);
262 c
->size
= strtoul(args
[2], NULL
, 0);
263 c
->chip_width
= strtoul(args
[3], NULL
, 0);
264 c
->bus_width
= strtoul(args
[4], NULL
, 0);
269 if (flash_drivers
[i
]->flash_bank_command(cmd_ctx
, cmd
, args
, argc
, c
) != ERROR_OK
)
271 LOG_ERROR("'%s' driver rejected flash bank at 0x%8.8x", args
[0], c
->base
);
276 /* put flash bank in linked list */
279 /* find last flash bank */
280 for (p
= flash_banks
; p
&& p
->next
; p
= p
->next
);
293 /* no matching flash driver found */
296 LOG_ERROR("flash driver '%s' not found", args
[0]);
303 int handle_flash_banks_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
310 command_print(cmd_ctx
, "no flash banks configured");
314 for (p
= flash_banks
; p
; p
= p
->next
)
316 command_print(cmd_ctx
, "#%i: %s at 0x%8.8x, size 0x%8.8x, buswidth %i, chipwidth %i",
317 i
++, p
->driver
->name
, p
->base
, p
->size
, p
->bus_width
, p
->chip_width
);
323 int handle_flash_info_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
332 return ERROR_COMMAND_SYNTAX_ERROR
;
335 for (p
= flash_banks
; p
; p
= p
->next
, i
++)
337 if (i
== strtoul(args
[0], NULL
, 0))
341 /* attempt auto probe */
342 if ((retval
= p
->driver
->auto_probe(p
)) != ERROR_OK
)
345 command_print(cmd_ctx
, "#%i: %s at 0x%8.8x, size 0x%8.8x, buswidth %i, chipwidth %i",
346 i
, p
->driver
->name
, p
->base
, p
->size
, p
->bus_width
, p
->chip_width
);
347 for (j
= 0; j
< p
->num_sectors
; j
++)
351 if (p
->sectors
[j
].is_protected
== 0)
352 protect_state
= "not protected";
353 else if (p
->sectors
[j
].is_protected
== 1)
354 protect_state
= "protected";
356 protect_state
= "protection state unknown";
358 command_print(cmd_ctx
, "\t#%i: 0x%8.8x (0x%x %ikB) %s",
359 j
, p
->sectors
[j
].offset
, p
->sectors
[j
].size
, p
->sectors
[j
].size
>>10,
363 *buf
= '\0'; /* initialize buffer, otherwise it migh contain garbage if driver function fails */
364 retval
= p
->driver
->info(p
, buf
, sizeof(buf
));
365 command_print(cmd_ctx
, "%s", buf
);
366 if (retval
!= ERROR_OK
)
367 LOG_ERROR("error retrieving flash info (%d)", retval
);
374 int handle_flash_probe_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
381 return ERROR_COMMAND_SYNTAX_ERROR
;
384 p
= get_flash_bank_by_num_noprobe(strtoul(args
[0], NULL
, 0));
387 if ((retval
= p
->driver
->probe(p
)) == ERROR_OK
)
389 command_print(cmd_ctx
, "flash '%s' found at 0x%8.8x", p
->driver
->name
, p
->base
);
391 else if (retval
== ERROR_FLASH_BANK_INVALID
)
393 command_print(cmd_ctx
, "probing failed for flash bank '#%s' at 0x%8.8x",
398 command_print(cmd_ctx
, "unknown error when probing flash bank '#%s' at 0x%8.8x",
404 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
410 int handle_flash_erase_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
417 return ERROR_COMMAND_SYNTAX_ERROR
;
420 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
424 if ((retval
= p
->driver
->erase_check(p
)) == ERROR_OK
)
426 command_print(cmd_ctx
, "successfully checked erase state", p
->driver
->name
, p
->base
);
430 command_print(cmd_ctx
, "unknown error when checking erase state of flash bank #%s at 0x%8.8x",
434 for (j
= 0; j
< p
->num_sectors
; j
++)
438 if (p
->sectors
[j
].is_erased
== 0)
439 erase_state
= "not erased";
440 else if (p
->sectors
[j
].is_erased
== 1)
441 erase_state
= "erased";
443 erase_state
= "erase state unknown";
445 command_print(cmd_ctx
, "\t#%i: 0x%8.8x (0x%x %ikB) %s",
446 j
, p
->sectors
[j
].offset
, p
->sectors
[j
].size
, p
->sectors
[j
].size
>>10,
455 int handle_flash_erase_address_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
464 target_t
*target
= get_current_target(cmd_ctx
);
468 return ERROR_COMMAND_SYNTAX_ERROR
;
471 address
= strtoul(args
[0], NULL
, 0);
472 length
= strtoul(args
[1], NULL
, 0);
475 command_print(cmd_ctx
, "Length must be >0");
476 return ERROR_COMMAND_SYNTAX_ERROR
;
479 p
= get_flash_bank_by_addr(target
, address
);
482 return ERROR_COMMAND_SYNTAX_ERROR
;
485 /* We can't know if we did a resume + halt, in which case we no longer know the erased state */
488 duration_start_measure(&duration
);
490 if ((retval
= flash_erase_address_range(target
, address
, length
)) == ERROR_OK
)
492 duration_stop_measure(&duration
, &duration_text
);
493 command_print(cmd_ctx
, "erased address 0x%8.8x length %i in %s", address
, length
, duration_text
);
500 int handle_flash_protect_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
507 return ERROR_COMMAND_SYNTAX_ERROR
;
510 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
513 if ((retval
= p
->driver
->protect_check(p
)) == ERROR_OK
)
515 command_print(cmd_ctx
, "successfully checked protect state");
517 else if (retval
== ERROR_FLASH_OPERATION_FAILED
)
519 command_print(cmd_ctx
, "checking protection state failed (possibly unsupported) by flash #%s at 0x%8.8x", args
[0], p
->base
);
523 command_print(cmd_ctx
, "unknown error when checking protection state of flash bank '#%s' at 0x%8.8x", args
[0], p
->base
);
528 return ERROR_COMMAND_SYNTAX_ERROR
;
534 int handle_flash_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
538 int first
= strtoul(args
[1], NULL
, 0);
539 int last
= strtoul(args
[2], NULL
, 0);
541 flash_bank_t
*p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
545 duration_start_measure(&duration
);
549 return ERROR_COMMAND_SYNTAX_ERROR
;
552 if ((retval
= flash_driver_erase(p
, first
, last
)) == ERROR_OK
)
554 duration_stop_measure(&duration
, &duration_text
);
556 command_print(cmd_ctx
, "erased sectors %i through %i on flash bank %i in %s", first
, last
, strtoul(args
[0], 0, 0), duration_text
);
562 return ERROR_COMMAND_SYNTAX_ERROR
;
568 int handle_flash_protect_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
572 int first
= strtoul(args
[1], NULL
, 0);
573 int last
= strtoul(args
[2], NULL
, 0);
576 flash_bank_t
*p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
579 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
583 if (strcmp(args
[3], "on") == 0)
585 else if (strcmp(args
[3], "off") == 0)
589 return ERROR_COMMAND_SYNTAX_ERROR
;
592 retval
= flash_driver_protect(p
, set
, first
, last
);
593 if (retval
== ERROR_OK
)
595 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));
600 return ERROR_COMMAND_SYNTAX_ERROR
;
607 int handle_flash_write_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
609 target_t
*target
= get_current_target(cmd_ctx
);
621 return ERROR_COMMAND_SYNTAX_ERROR
;
626 LOG_ERROR("no target selected");
630 duration_start_measure(&duration
);
634 image
.base_address_set
= 1;
635 image
.base_address
= strtoul(args
[1], NULL
, 0);
639 image
.base_address_set
= 0;
640 image
.base_address
= 0x0;
643 image
.start_address_set
= 0;
645 retval
= image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
);
646 if (retval
!= ERROR_OK
)
651 retval
= flash_write(target
, &image
, &written
, auto_erase
);
652 if (retval
!= ERROR_OK
)
658 duration_stop_measure(&duration
, &duration_text
);
659 if (retval
== ERROR_OK
)
661 command_print(cmd_ctx
, "wrote %u byte from file %s in %s (%f kb/s)",
662 written
, args
[0], duration_text
,
663 (float)written
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
672 int handle_flash_fill_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
683 target_t
*target
= get_current_target(cmd_ctx
);
689 return ERROR_COMMAND_SYNTAX_ERROR
;
692 address
= strtoul(args
[0], NULL
, 0);
693 pattern
= strtoul(args
[1], NULL
, 0);
694 count
= strtoul(args
[2], NULL
, 0);
712 return ERROR_COMMAND_SYNTAX_ERROR
;
715 chunk_count
= MIN(count
, (1024 / wordsize
));
719 for(i
= 0; i
< chunk_count
; i
++)
721 target_buffer_set_u32(target
, chunk
+ i
* wordsize
, pattern
);
725 for(i
= 0; i
< chunk_count
; i
++)
727 target_buffer_set_u16(target
, chunk
+ i
* wordsize
, pattern
);
731 memset(chunk
, pattern
, chunk_count
);
734 LOG_ERROR("BUG: can't happen");
738 duration_start_measure(&duration
);
741 err
= flash_erase_address_range( target
, address
, count
*wordsize
);
744 for (wrote
=0; wrote
<(count
*wordsize
); wrote
+=sizeof(chunk
))
746 int cur_size
= MIN( (count
*wordsize
- wrote
) , 1024 );
750 bank
= get_flash_bank_by_addr(target
, address
);
756 err
= flash_driver_write(bank
, chunk
, address
- bank
->base
+ wrote
, cur_size
);
764 duration_stop_measure(&duration
, &duration_text
);
769 speed
=wrote
/ 1024.0;
770 speed
/=((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0));
771 command_print(cmd_ctx
, "wrote %d bytes to 0x%8.8x in %s (%f kb/s)",
772 count
*wordsize
, address
, duration_text
,
779 int handle_flash_write_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
795 return ERROR_COMMAND_SYNTAX_ERROR
;
798 duration_start_measure(&duration
);
800 offset
= strtoul(args
[2], NULL
, 0);
801 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
804 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
808 if (fileio_open(&fileio
, args
[1], FILEIO_READ
, FILEIO_BINARY
) != ERROR_OK
)
813 buffer
= malloc(fileio
.size
);
814 if (fileio_read(&fileio
, fileio
.size
, buffer
, &buf_cnt
) != ERROR_OK
)
819 retval
= flash_driver_write(p
, buffer
, offset
, buf_cnt
);
823 duration_stop_measure(&duration
, &duration_text
);
824 if (retval
!=ERROR_OK
)
826 command_print(cmd_ctx
, "wrote %"PRIi64
" byte from file %s to flash bank %i at offset 0x%8.8x in %s (%f kb/s)",
827 fileio
.size
, args
[1], strtoul(args
[0], NULL
, 0), offset
, duration_text
,
828 (float)fileio
.size
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
832 fileio_close(&fileio
);
837 void flash_set_dirty(void)
842 /* set all flash to require erasing */
843 for (c
= flash_banks
; c
; c
= c
->next
)
845 for (i
= 0; i
< c
->num_sectors
; i
++)
847 c
->sectors
[i
].is_erased
= 0;
852 /* lookup flash bank by address */
853 flash_bank_t
*get_flash_bank_by_addr(target_t
*target
, u32 addr
)
857 /* cycle through bank list */
858 for (c
= flash_banks
; c
; c
= c
->next
)
861 retval
= c
->driver
->auto_probe(c
);
863 if (retval
!= ERROR_OK
)
865 LOG_ERROR("auto_probe failed %d\n", retval
);
868 /* check whether address belongs to this flash bank */
869 if ((addr
>= c
->base
) && (addr
< c
->base
+ c
->size
) && target
== c
->target
)
872 LOG_ERROR("No flash at address 0x%08x\n", addr
);
876 /* erase given flash region, selects proper bank according to target and address */
877 int flash_erase_address_range(target_t
*target
, u32 addr
, u32 length
)
884 if ((c
= get_flash_bank_by_addr(target
, addr
)) == NULL
)
885 return ERROR_FLASH_DST_OUT_OF_BANK
; /* no corresponding bank found */
887 if (c
->size
== 0 || c
->num_sectors
== 0)
889 LOG_ERROR("Bank is invalid");
890 return ERROR_FLASH_BANK_INVALID
;
895 /* special case, erase whole bank when length is zero */
897 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
899 return flash_driver_erase(c
, 0, c
->num_sectors
- 1);
902 /* check whether it fits */
903 if (addr
+ length
> c
->base
+ c
->size
)
904 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
908 for (i
= 0; i
< c
->num_sectors
; i
++)
910 /* check whether sector overlaps with the given range and is not yet erased */
911 if (addr
< c
->sectors
[i
].offset
+ c
->sectors
[i
].size
&& addr
+ length
> c
->sectors
[i
].offset
&& c
->sectors
[i
].is_erased
!= 1) {
912 /* if first is not set yet then this is the first sector */
915 last
= i
; /* and it is the last one so far in any case */
919 if( first
== -1 || last
== -1 )
922 return flash_driver_erase(c
, first
, last
);
925 /* write (optional verify) an image to flash memory of the given target */
926 int flash_write(target_t
*target
, image_t
*image
, u32
*written
, int erase
)
942 /* assume all sectors need erasing - stops any problems
943 * when flash_write is called multiple times */
948 /* loop until we reach end of the image */
949 while (section
< image
->num_sections
)
955 u32 run_address
= image
->sections
[section
].base_address
+ section_offset
;
956 u32 run_size
= image
->sections
[section
].size
- section_offset
;
958 if (image
->sections
[section
].size
== 0)
960 LOG_WARNING("empty section %d", section
);
966 /* find the corresponding flash bank */
967 if ((c
= get_flash_bank_by_addr(target
, run_address
)) == NULL
)
969 section
++; /* and skip it */
974 /* collect consecutive sections which fall into the same bank */
975 section_first
= section
;
976 section_last
= section
;
977 while ((run_address
+ run_size
< c
->base
+ c
->size
)
978 && (section_last
+ 1 < image
->num_sections
))
980 if (image
->sections
[section_last
+ 1].base_address
< (run_address
+ run_size
))
982 LOG_DEBUG("section %d out of order(very slightly surprising, but supported)", section_last
+ 1);
985 if (image
->sections
[section_last
+ 1].base_address
!= (run_address
+ run_size
))
987 run_size
+= image
->sections
[++section_last
].size
;
990 /* fit the run into bank constraints */
991 if (run_address
+ run_size
> c
->base
+ c
->size
)
992 run_size
= c
->base
+ c
->size
- run_address
;
994 /* allocate buffer */
995 buffer
= malloc(run_size
);
998 /* read sections to the buffer */
999 while (buffer_size
< run_size
)
1003 if (buffer_size
- run_size
<= image
->sections
[section
].size
- section_offset
)
1004 size_read
= buffer_size
- run_size
;
1006 size_read
= image
->sections
[section
].size
- section_offset
;
1008 if ((retval
= image_read_section(image
, section
, section_offset
,
1009 size_read
, buffer
+ buffer_size
, &size_read
)) != ERROR_OK
|| size_read
== 0)
1016 buffer_size
+= size_read
;
1017 section_offset
+= size_read
;
1019 if (section_offset
>= image
->sections
[section
].size
)
1030 /* calculate and erase sectors */
1031 retval
= flash_erase_address_range( target
, run_address
, run_size
);
1034 if (retval
== ERROR_OK
)
1036 /* write flash sectors */
1037 retval
= flash_driver_write(c
, buffer
, run_address
- c
->base
, run_size
);
1042 if (retval
!= ERROR_OK
)
1044 return retval
; /* abort operation */
1047 if (written
!= NULL
)
1048 *written
+= run_size
; /* add run size to total written counter */
1054 int handle_flash_auto_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1058 return ERROR_COMMAND_SYNTAX_ERROR
;
1061 if (strcmp(args
[0], "on") == 0)
1063 else if (strcmp(args
[0], "off") == 0)
1066 return ERROR_COMMAND_SYNTAX_ERROR
;
1072 int default_flash_blank_check(struct flash_bank_s
*bank
)
1074 target_t
*target
= bank
->target
;
1076 int buffer_size
=sizeof(buffer
);
1080 if (bank
->target
->state
!= TARGET_HALTED
)
1082 return ERROR_TARGET_NOT_HALTED
;
1087 working_area_t
*erase_check_algorithm
;
1089 /* FIX! doesn't work yet... */
1091 char test(char *a, int len, char t)
1095 for (i=0; i<len; i++)
1102 $ arm-elf-gcc -c -mthumb -O3 test.c
1104 $ arm-elf-objdump --disassemble test.o
1106 test.o: file format elf32-littlearm
1108 Disassembly of section .text:
1111 0: b510 push {r4, lr}
1112 2: 0612 lsl r2, r2, #24
1113 4: 1c04 mov r4, r0 (add r4, r0, #0)
1114 6: 0e10 lsr r0, r2, #24
1117 c: dd04 ble 18 <test+0x18>
1118 e: 5ca3 ldrb r3, [r4, r2]
1122 16: dbfa blt e <test+0xe>
1123 18: bd10 pop {r4, pc}
1124 1a: 46c0 nop (mov r8, r8)
1128 u16 erase_check_code
[] =
1130 0x0612,// lsl r2, r2, #24
1131 0x1c04,// mov r4, r0 (add r4, r0, #0)
1132 0x0e10,// lsr r0, r2, #24
1133 0x2200,// mov r2, #0
1134 0x2900,// cmp r1, #0
1135 0xdd04,// ble 18 <test+0x18>
1136 0x5ca3,// ldrb r3, [r4, r2]
1137 0x3201,// add r2, #1
1138 0x4018,// and r0, r3
1139 0x428a,// cmp r2, r1
1140 0xdbfa,// blt e <test+0xe>
1141 0x46c0,// nop (mov r8, r8)
1147 /* make sure we have a working area */
1148 if (target_alloc_working_area(target
, ((sizeof(erase_check_code
)+3)/4)*4, &erase_check_algorithm
) != ERROR_OK
)
1150 erase_check_algorithm
= NULL
;
1153 if (erase_check_algorithm
)
1155 u8 erase_check_code_buf
[((sizeof(erase_check_code
)+3)/4)*4];
1156 LOG_DEBUG("Running fast flash erase check");
1158 for (i
= 0; i
< sizeof(erase_check_code
)/sizeof(*erase_check_code
); i
++)
1159 target_buffer_set_u16(target
, erase_check_code_buf
+ (i
*2), erase_check_code
[i
]);
1161 /* write algorithm code to working area */
1162 if ((retval
=target
->type
->write_memory(target
, erase_check_algorithm
->address
, 2, sizeof(erase_check_code
)/sizeof(*erase_check_code
), erase_check_code_buf
))==ERROR_OK
)
1164 for (i
= 0; i
< bank
->num_sectors
; i
++)
1166 u32 address
= bank
->base
+ bank
->sectors
[i
].offset
;
1167 u32 size
= bank
->sectors
[i
].size
;
1169 reg_param_t reg_params
[3];
1170 armv7m_algorithm_t arm_info
;
1172 arm_info
.common_magic
= ARMV7M_COMMON_MAGIC
;
1173 arm_info
.core_mode
= ARMV7M_MODE_ANY
;
1174 arm_info
.core_state
= ARMV7M_STATE_THUMB
;
1176 init_reg_param(®_params
[0], "r0", 32, PARAM_OUT
);
1177 buf_set_u32(reg_params
[0].value
, 0, 32, address
);
1179 init_reg_param(®_params
[1], "r1", 32, PARAM_OUT
);
1180 buf_set_u32(reg_params
[1].value
, 0, 32, size
);
1182 init_reg_param(®_params
[2], "r2", 32, PARAM_IN_OUT
);
1183 buf_set_u32(reg_params
[2].value
, 0, 32, 0xff);
1185 if ((retval
= target
->type
->run_algorithm(target
, 0, NULL
, 3, reg_params
, erase_check_algorithm
->address
,
1186 erase_check_algorithm
->address
+ sizeof(erase_check_code
) - 2, 10000, &arm_info
)) != ERROR_OK
)
1189 if (buf_get_u32(reg_params
[2].value
, 0, 32) == 0xff)
1190 bank
->sectors
[i
].is_erased
= 1;
1192 bank
->sectors
[i
].is_erased
= 0;
1194 destroy_reg_param(®_params
[0]);
1195 destroy_reg_param(®_params
[1]);
1196 destroy_reg_param(®_params
[2]);
1198 if (i
== bank
->num_sectors
)
1203 target_free_working_area(target
, erase_check_algorithm
);
1208 /* try ARM7 instead */
1210 u32 erase_check_code
[] =
1212 0xe4d03001, /* ldrb r3, [r0], #1 */
1213 0xe0022003, /* and r2, r2, r3 */
1214 0xe2511001, /* subs r1, r1, #1 */
1215 0x1afffffb, /* b -4 */
1216 0xeafffffe /* b 0 */
1219 /* make sure we have a working area */
1220 if (target_alloc_working_area(target
, 20, &erase_check_algorithm
) == ERROR_OK
)
1222 u8 erase_check_code_buf
[5 * 4];
1224 for (i
= 0; i
< 5; i
++)
1225 target_buffer_set_u32(target
, erase_check_code_buf
+ (i
*4), erase_check_code
[i
]);
1227 /* write algorithm code to working area */
1228 if ((retval
=target
->type
->write_memory(target
, erase_check_algorithm
->address
, 4, 5, erase_check_code_buf
))==ERROR_OK
)
1230 for (i
= 0; i
< bank
->num_sectors
; i
++)
1232 u32 address
= bank
->base
+ bank
->sectors
[i
].offset
;
1233 u32 size
= bank
->sectors
[i
].size
;
1235 reg_param_t reg_params
[3];
1236 armv4_5_algorithm_t armv4_5_info
;
1238 armv4_5_info
.common_magic
= ARMV4_5_COMMON_MAGIC
;
1239 armv4_5_info
.core_mode
= ARMV4_5_MODE_SVC
;
1240 armv4_5_info
.core_state
= ARMV4_5_STATE_ARM
;
1242 init_reg_param(®_params
[0], "r0", 32, PARAM_OUT
);
1243 buf_set_u32(reg_params
[0].value
, 0, 32, address
);
1245 init_reg_param(®_params
[1], "r1", 32, PARAM_OUT
);
1246 buf_set_u32(reg_params
[1].value
, 0, 32, size
);
1248 init_reg_param(®_params
[2], "r2", 32, PARAM_IN_OUT
);
1249 buf_set_u32(reg_params
[2].value
, 0, 32, 0xff);
1251 if ((retval
= target
->type
->run_algorithm(target
, 0, NULL
, 3, reg_params
,
1252 erase_check_algorithm
->address
, erase_check_algorithm
->address
+ 0x10, 10000, &armv4_5_info
)) != ERROR_OK
)
1255 if (buf_get_u32(reg_params
[2].value
, 0, 32) == 0xff)
1256 bank
->sectors
[i
].is_erased
= 1;
1258 bank
->sectors
[i
].is_erased
= 0;
1260 destroy_reg_param(®_params
[0]);
1261 destroy_reg_param(®_params
[1]);
1262 destroy_reg_param(®_params
[2]);
1264 if (i
== bank
->num_sectors
)
1269 target_free_working_area(target
, erase_check_algorithm
);
1276 LOG_USER("Running slow fallback erase check - add working memory");
1277 for (i
= 0; i
< bank
->num_sectors
; i
++)
1280 bank
->sectors
[i
].is_erased
= 1;
1282 for (j
=0; j
<bank
->sectors
[i
].size
; j
+=buffer_size
)
1287 if (chunk
>(j
-bank
->sectors
[i
].size
))
1289 chunk
=(j
-bank
->sectors
[i
].size
);
1292 retval
=target
->type
->read_memory(target
, bank
->base
+ bank
->sectors
[i
].offset
+ j
, 4, chunk
/4, buffer
);
1293 if (retval
!=ERROR_OK
)
1296 for (nBytes
= 0; nBytes
< chunk
; nBytes
++)
1298 if (buffer
[nBytes
] != 0xFF)
1300 bank
->sectors
[i
].is_erased
= 0;
Linking to existing account procedure
If you already have an account and want to add another login method
you
MUST first sign in with your existing account and
then change URL to read
https://review.openocd.org/login/?link
to get to this page again but this time it'll work for linking. Thank you.
SSH host keys fingerprints
1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=.. |
|+o.. . |
|*.o . . |
|+B . . . |
|Bo. = o S |
|Oo.+ + = |
|oB=.* = . o |
| =+=.+ + E |
|. .=o . o |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)