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"
35 #include <sys/types.h>
40 /* command handlers */
41 int handle_flash_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
42 int handle_flash_banks_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
43 int handle_flash_info_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
44 int handle_flash_probe_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
45 int handle_flash_erase_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
46 int handle_flash_erase_address_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
47 int handle_flash_protect_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
48 int handle_flash_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
49 int handle_flash_write_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
50 int handle_flash_write_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
51 int handle_flash_write_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
52 int handle_flash_fill_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
53 int handle_flash_protect_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
54 int handle_flash_auto_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
55 flash_bank_t
*get_flash_bank_by_addr(target_t
*target
, u32 addr
);
59 extern flash_driver_t lpc2000_flash
;
60 extern flash_driver_t cfi_flash
;
61 extern flash_driver_t at91sam7_flash
;
62 extern flash_driver_t str7x_flash
;
63 extern flash_driver_t str9x_flash
;
64 extern flash_driver_t stellaris_flash
;
65 extern flash_driver_t str9xpec_flash
;
66 extern flash_driver_t stm32x_flash
;
67 extern flash_driver_t tms470_flash
;
68 extern flash_driver_t ecosflash_flash
;
70 flash_driver_t
*flash_drivers
[] =
85 flash_bank_t
*flash_banks
;
86 static command_t
*flash_cmd
;
87 static int auto_erase
= 0;
89 /* wafer thin wrapper for invoking the flash driver */
90 static int flash_driver_write(struct flash_bank_s
*bank
, u8
*buffer
, u32 offset
, u32 count
)
94 retval
=bank
->driver
->write(bank
, buffer
, offset
, count
);
97 LOG_ERROR("error writing to flash at address 0x%08x at offset 0x%8.8x (%d)", bank
->base
, offset
, retval
);
103 static int flash_driver_erase(struct flash_bank_s
*bank
, int first
, int last
)
107 retval
=bank
->driver
->erase(bank
, first
, last
);
108 if (retval
!=ERROR_OK
)
110 LOG_ERROR("failed erasing sectors %d to %d (%d)", first
, last
, retval
);
116 int flash_driver_protect(struct flash_bank_s
*bank
, int set
, int first
, int last
)
120 retval
=bank
->driver
->protect(bank
, set
, first
, last
);
121 if (retval
!=ERROR_OK
)
123 LOG_ERROR("failed setting protection for areas %d to %d (%d)", first
, last
, retval
);
130 int flash_register_commands(struct command_context_s
*cmd_ctx
)
132 flash_cmd
= register_command(cmd_ctx
, NULL
, "flash", NULL
, COMMAND_ANY
, NULL
);
134 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 ...]");
135 register_command(cmd_ctx
, flash_cmd
, "auto_erase", handle_flash_auto_erase_command
, COMMAND_ANY
,
136 "auto erase flash sectors <on|off>");
140 int flash_init_drivers(struct command_context_s
*cmd_ctx
)
144 register_command(cmd_ctx
, flash_cmd
, "banks", handle_flash_banks_command
, COMMAND_EXEC
,
145 "list configured flash banks ");
146 register_command(cmd_ctx
, flash_cmd
, "info", handle_flash_info_command
, COMMAND_EXEC
,
147 "print info about flash bank <num>");
148 register_command(cmd_ctx
, flash_cmd
, "probe", handle_flash_probe_command
, COMMAND_EXEC
,
149 "identify flash bank <num>");
150 register_command(cmd_ctx
, flash_cmd
, "erase_check", handle_flash_erase_check_command
, COMMAND_EXEC
,
151 "check erase state of sectors in flash bank <num>");
152 register_command(cmd_ctx
, flash_cmd
, "protect_check", handle_flash_protect_check_command
, COMMAND_EXEC
,
153 "check protection state of sectors in flash bank <num>");
154 register_command(cmd_ctx
, flash_cmd
, "erase_sector", handle_flash_erase_command
, COMMAND_EXEC
,
155 "erase sectors at <bank> <first> <last>");
156 register_command(cmd_ctx
, flash_cmd
, "erase_address", handle_flash_erase_address_command
, COMMAND_EXEC
,
157 "erase address range <address> <length>");
159 register_command(cmd_ctx
, flash_cmd
, "fillw", handle_flash_fill_command
, COMMAND_EXEC
,
160 "fill with pattern <address> <word_pattern> <count>");
161 register_command(cmd_ctx
, flash_cmd
, "fillh", handle_flash_fill_command
, COMMAND_EXEC
,
162 "fill with pattern <address> <halfword_pattern> <count>");
163 register_command(cmd_ctx
, flash_cmd
, "fillb", handle_flash_fill_command
, COMMAND_EXEC
,
164 "fill with pattern <address> <byte_pattern> <count>");
166 register_command(cmd_ctx
, flash_cmd
, "write_bank", handle_flash_write_bank_command
, COMMAND_EXEC
,
167 "write binary data to <bank> <file> <offset>");
168 register_command(cmd_ctx
, flash_cmd
, "write_image", handle_flash_write_image_command
, COMMAND_EXEC
,
169 "write_image <file> [offset] [type]");
170 register_command(cmd_ctx
, flash_cmd
, "protect", handle_flash_protect_command
, COMMAND_EXEC
,
171 "set protection of sectors at <bank> <first> <last> <on|off>");
177 flash_bank_t
*get_flash_bank_by_num_noprobe(int num
)
182 for (p
= flash_banks
; p
; p
= p
->next
)
189 LOG_ERROR("flash bank %d does not exist", num
);
193 int flash_get_bank_count()
197 for (p
= flash_banks
; p
; p
= p
->next
)
204 flash_bank_t
*get_flash_bank_by_num(int num
)
206 flash_bank_t
*p
= get_flash_bank_by_num_noprobe(num
);
212 retval
= p
->driver
->auto_probe(p
);
214 if (retval
!= ERROR_OK
)
216 LOG_ERROR("auto_probe failed %d\n", retval
);
222 int handle_flash_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
230 return ERROR_COMMAND_SYNTAX_ERROR
;
233 if ((target
= get_target_by_num(strtoul(args
[5], NULL
, 0))) == NULL
)
235 LOG_ERROR("target %lu not defined", strtoul(args
[5], NULL
, 0));
239 for (i
= 0; flash_drivers
[i
]; i
++)
241 if (strcmp(args
[0], flash_drivers
[i
]->name
) == 0)
245 /* register flash specific commands */
246 if (flash_drivers
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
248 LOG_ERROR("couldn't register '%s' commands", args
[0]);
252 c
= malloc(sizeof(flash_bank_t
));
254 c
->driver
= flash_drivers
[i
];
255 c
->driver_priv
= NULL
;
256 c
->base
= strtoul(args
[1], NULL
, 0);
257 c
->size
= strtoul(args
[2], NULL
, 0);
258 c
->chip_width
= strtoul(args
[3], NULL
, 0);
259 c
->bus_width
= strtoul(args
[4], NULL
, 0);
264 if (flash_drivers
[i
]->flash_bank_command(cmd_ctx
, cmd
, args
, argc
, c
) != ERROR_OK
)
266 LOG_ERROR("'%s' driver rejected flash bank at 0x%8.8x", args
[0], c
->base
);
271 /* put flash bank in linked list */
274 /* find last flash bank */
275 for (p
= flash_banks
; p
&& p
->next
; p
= p
->next
);
288 /* no matching flash driver found */
291 LOG_ERROR("flash driver '%s' not found", args
[0]);
298 int handle_flash_banks_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
305 command_print(cmd_ctx
, "no flash banks configured");
309 for (p
= flash_banks
; p
; p
= p
->next
)
311 command_print(cmd_ctx
, "#%i: %s at 0x%8.8x, size 0x%8.8x, buswidth %i, chipwidth %i",
312 i
++, p
->driver
->name
, p
->base
, p
->size
, p
->bus_width
, p
->chip_width
);
318 int handle_flash_info_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
327 return ERROR_COMMAND_SYNTAX_ERROR
;
330 for (p
= flash_banks
; p
; p
= p
->next
, i
++)
332 if (i
== strtoul(args
[0], NULL
, 0))
336 /* attempt auto probe */
337 if ((retval
= p
->driver
->auto_probe(p
)) != ERROR_OK
)
340 if ((retval
= p
->driver
->erase_check(p
)) != ERROR_OK
)
343 command_print(cmd_ctx
, "#%i: %s at 0x%8.8x, size 0x%8.8x, buswidth %i, chipwidth %i",
344 i
, p
->driver
->name
, p
->base
, p
->size
, p
->bus_width
, p
->chip_width
);
345 for (j
= 0; j
< p
->num_sectors
; j
++)
347 char *erase_state
, *protect_state
;
349 if (p
->sectors
[j
].is_erased
== 0)
350 erase_state
= "not erased";
351 else if (p
->sectors
[j
].is_erased
== 1)
352 erase_state
= "erased";
354 erase_state
= "erase state unknown";
356 if (p
->sectors
[j
].is_protected
== 0)
357 protect_state
= "not protected";
358 else if (p
->sectors
[j
].is_protected
== 1)
359 protect_state
= "protected";
361 protect_state
= "protection state unknown";
363 command_print(cmd_ctx
, "\t#%i: 0x%8.8x (0x%x %ikB) %s, %s",
364 j
, p
->sectors
[j
].offset
, p
->sectors
[j
].size
, p
->sectors
[j
].size
>>10,
365 erase_state
, protect_state
);
368 *buf
= '\0'; /* initialize buffer, otherwise it migh contain garbage if driver function fails */
369 retval
= p
->driver
->info(p
, buf
, sizeof(buf
));
370 command_print(cmd_ctx
, "%s", buf
);
371 if (retval
!= ERROR_OK
)
372 LOG_ERROR("error retrieving flash info (%d)", retval
);
379 int handle_flash_probe_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
386 return ERROR_COMMAND_SYNTAX_ERROR
;
389 p
= get_flash_bank_by_num_noprobe(strtoul(args
[0], NULL
, 0));
392 if ((retval
= p
->driver
->probe(p
)) == ERROR_OK
)
394 command_print(cmd_ctx
, "flash '%s' found at 0x%8.8x", p
->driver
->name
, p
->base
);
396 else if (retval
== ERROR_FLASH_BANK_INVALID
)
398 command_print(cmd_ctx
, "probing failed for flash bank '#%s' at 0x%8.8x",
403 command_print(cmd_ctx
, "unknown error when probing flash bank '#%s' at 0x%8.8x",
409 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
415 int handle_flash_erase_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
422 return ERROR_COMMAND_SYNTAX_ERROR
;
425 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
428 if ((retval
= p
->driver
->erase_check(p
)) == ERROR_OK
)
430 command_print(cmd_ctx
, "successfully checked erase state", p
->driver
->name
, p
->base
);
434 command_print(cmd_ctx
, "unknown error when checking erase state of flash bank #%s at 0x%8.8x",
442 int handle_flash_erase_address_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
451 target_t
*target
= get_current_target(cmd_ctx
);
455 return ERROR_COMMAND_SYNTAX_ERROR
;
458 address
= strtoul(args
[0], NULL
, 0);
459 length
= strtoul(args
[1], NULL
, 0);
462 command_print(cmd_ctx
, "Length must be >0");
463 return ERROR_COMMAND_SYNTAX_ERROR
;
466 p
= get_flash_bank_by_addr(target
, address
);
469 return ERROR_COMMAND_SYNTAX_ERROR
;
472 /* We can't know if we did a resume + halt, in which case we no longer know the erased state */
475 duration_start_measure(&duration
);
477 if ((retval
= flash_erase_address_range(target
, address
, length
)) == ERROR_OK
)
479 duration_stop_measure(&duration
, &duration_text
);
480 command_print(cmd_ctx
, "erased address 0x%8.8x length %i in %s", address
, length
, duration_text
);
487 int handle_flash_protect_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
494 return ERROR_COMMAND_SYNTAX_ERROR
;
497 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
500 if ((retval
= p
->driver
->protect_check(p
)) == ERROR_OK
)
502 command_print(cmd_ctx
, "successfully checked protect state");
504 else if (retval
== ERROR_FLASH_OPERATION_FAILED
)
506 command_print(cmd_ctx
, "checking protection state failed (possibly unsupported) by flash #%s at 0x%8.8x", args
[0], p
->base
);
510 command_print(cmd_ctx
, "unknown error when checking protection state of flash bank '#%s' at 0x%8.8x", args
[0], p
->base
);
515 return ERROR_COMMAND_SYNTAX_ERROR
;
521 int handle_flash_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
525 int first
= strtoul(args
[1], NULL
, 0);
526 int last
= strtoul(args
[2], NULL
, 0);
528 flash_bank_t
*p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
532 duration_start_measure(&duration
);
536 return ERROR_COMMAND_SYNTAX_ERROR
;
539 if ((retval
= flash_driver_erase(p
, first
, last
)) == ERROR_OK
)
541 duration_stop_measure(&duration
, &duration_text
);
543 command_print(cmd_ctx
, "erased sectors %i through %i on flash bank %i in %s", first
, last
, strtoul(args
[0], 0, 0), duration_text
);
549 return ERROR_COMMAND_SYNTAX_ERROR
;
555 int handle_flash_protect_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
559 int first
= strtoul(args
[1], NULL
, 0);
560 int last
= strtoul(args
[2], NULL
, 0);
563 flash_bank_t
*p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
566 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
570 if (strcmp(args
[3], "on") == 0)
572 else if (strcmp(args
[3], "off") == 0)
576 return ERROR_COMMAND_SYNTAX_ERROR
;
579 retval
= flash_driver_protect(p
, set
, first
, last
);
580 if (retval
== ERROR_OK
)
582 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));
587 return ERROR_COMMAND_SYNTAX_ERROR
;
594 int handle_flash_write_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
596 target_t
*target
= get_current_target(cmd_ctx
);
608 return ERROR_COMMAND_SYNTAX_ERROR
;
614 LOG_ERROR("no target selected");
618 duration_start_measure(&duration
);
622 image
.base_address_set
= 1;
623 image
.base_address
= strtoul(args
[1], NULL
, 0);
627 image
.base_address_set
= 0;
628 image
.base_address
= 0x0;
631 image
.start_address_set
= 0;
633 retval
= image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
);
634 if (retval
!= ERROR_OK
)
639 retval
= flash_write(target
, &image
, &written
, auto_erase
);
641 if (retval
!= ERROR_OK
)
647 duration_stop_measure(&duration
, &duration_text
);
648 if (retval
== ERROR_OK
)
650 command_print(cmd_ctx
, "wrote %u byte from file %s in %s (%f kb/s)",
651 written
, args
[0], duration_text
,
652 (float)written
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
661 int handle_flash_fill_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
672 target_t
*target
= get_current_target(cmd_ctx
);
678 return ERROR_COMMAND_SYNTAX_ERROR
;
681 address
= strtoul(args
[0], NULL
, 0);
682 pattern
= strtoul(args
[1], NULL
, 0);
683 count
= strtoul(args
[2], NULL
, 0);
701 return ERROR_COMMAND_SYNTAX_ERROR
;
704 chunk_count
= MIN(count
, (1024 / wordsize
));
708 for(i
= 0; i
< chunk_count
; i
++)
710 target_buffer_set_u32(target
, chunk
+ i
* wordsize
, pattern
);
714 for(i
= 0; i
< chunk_count
; i
++)
716 target_buffer_set_u16(target
, chunk
+ i
* wordsize
, pattern
);
720 memset(chunk
, pattern
, chunk_count
);
723 LOG_ERROR("BUG: can't happen");
727 duration_start_measure(&duration
);
730 err
= flash_erase_address_range( target
, address
, count
*wordsize
);
733 for (wrote
=0; wrote
<(count
*wordsize
); wrote
+=sizeof(chunk
))
735 int cur_size
= MIN( (count
*wordsize
- wrote
) , 1024 );
739 bank
= get_flash_bank_by_addr(target
, address
);
745 err
= flash_driver_write(bank
, chunk
, address
- bank
->base
+ wrote
, cur_size
);
753 duration_stop_measure(&duration
, &duration_text
);
758 speed
=wrote
/ 1024.0;
759 speed
/=((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0));
760 command_print(cmd_ctx
, "wrote %d bytes to 0x%8.8x in %s (%f kb/s)",
761 count
*wordsize
, address
, duration_text
,
768 int handle_flash_write_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
784 return ERROR_COMMAND_SYNTAX_ERROR
;
787 duration_start_measure(&duration
);
789 offset
= strtoul(args
[2], NULL
, 0);
790 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
793 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
797 if (fileio_open(&fileio
, args
[1], FILEIO_READ
, FILEIO_BINARY
) != ERROR_OK
)
802 buffer
= malloc(fileio
.size
);
803 if (fileio_read(&fileio
, fileio
.size
, buffer
, &buf_cnt
) != ERROR_OK
)
808 retval
= flash_driver_write(p
, buffer
, offset
, buf_cnt
);
812 duration_stop_measure(&duration
, &duration_text
);
813 if (retval
!=ERROR_OK
)
815 command_print(cmd_ctx
, "wrote %"PRIi64
" byte from file %s to flash bank %i at offset 0x%8.8x in %s (%f kb/s)",
816 fileio
.size
, args
[1], strtoul(args
[0], NULL
, 0), offset
, duration_text
,
817 (float)fileio
.size
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
821 fileio_close(&fileio
);
826 void flash_set_dirty(void)
831 /* set all flash to require erasing */
832 for (c
= flash_banks
; c
; c
= c
->next
)
834 for (i
= 0; i
< c
->num_sectors
; i
++)
836 c
->sectors
[i
].is_erased
= 0;
841 /* lookup flash bank by address */
842 flash_bank_t
*get_flash_bank_by_addr(target_t
*target
, u32 addr
)
846 /* cycle through bank list */
847 for (c
= flash_banks
; c
; c
= c
->next
)
850 retval
= c
->driver
->auto_probe(c
);
852 if (retval
!= ERROR_OK
)
854 LOG_ERROR("auto_probe failed %d\n", retval
);
857 /* check whether address belongs to this flash bank */
858 if ((addr
>= c
->base
) && (addr
< c
->base
+ c
->size
) && target
== c
->target
)
861 LOG_ERROR("No flash at address 0x%08x\n", addr
);
865 /* erase given flash region, selects proper bank according to target and address */
866 int flash_erase_address_range(target_t
*target
, u32 addr
, u32 length
)
873 if ((c
= get_flash_bank_by_addr(target
, addr
)) == NULL
)
874 return ERROR_FLASH_DST_OUT_OF_BANK
; /* no corresponding bank found */
876 if (c
->size
== 0 || c
->num_sectors
== 0)
877 return ERROR_FLASH_BANK_INVALID
;
881 /* special case, erase whole bank when length is zero */
883 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
885 return flash_driver_erase(c
, 0, c
->num_sectors
- 1);
888 /* check whether it fits */
889 if (addr
+ length
> c
->base
+ c
->size
)
890 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
894 for (i
= 0; i
< c
->num_sectors
; i
++)
896 /* check whether sector overlaps with the given range and is not yet erased */
897 if (addr
< c
->sectors
[i
].offset
+ c
->sectors
[i
].size
&& addr
+ length
> c
->sectors
[i
].offset
&& c
->sectors
[i
].is_erased
!= 1) {
898 /* if first is not set yet then this is the first sector */
901 last
= i
; /* and it is the last one so far in any case */
905 if( first
== -1 || last
== -1 )
908 return flash_driver_erase(c
, first
, last
);
911 /* write (optional verify) an image to flash memory of the given target */
912 int flash_write(target_t
*target
, image_t
*image
, u32
*written
, int erase
)
928 /* assume all sectors need erasing - stops any problems
929 * when flash_write is called multiple times */
934 /* loop until we reach end of the image */
935 while (section
< image
->num_sections
)
941 u32 run_address
= image
->sections
[section
].base_address
+ section_offset
;
942 u32 run_size
= image
->sections
[section
].size
- section_offset
;
944 if (image
->sections
[section
].size
== 0)
946 LOG_WARNING("empty section %d", section
);
952 /* find the corresponding flash bank */
953 if ((c
= get_flash_bank_by_addr(target
, run_address
)) == NULL
)
955 section
++; /* and skip it */
960 /* collect consecutive sections which fall into the same bank */
961 section_first
= section
;
962 section_last
= section
;
963 while ((run_address
+ run_size
< c
->base
+ c
->size
)
964 && (section_last
+ 1 < image
->num_sections
))
966 if (image
->sections
[section_last
+ 1].base_address
< (run_address
+ run_size
))
968 LOG_DEBUG("section %d out of order(very slightly surprising, but supported)", section_last
+ 1);
971 if (image
->sections
[section_last
+ 1].base_address
!= (run_address
+ run_size
))
973 run_size
+= image
->sections
[++section_last
].size
;
976 /* fit the run into bank constraints */
977 if (run_address
+ run_size
> c
->base
+ c
->size
)
978 run_size
= c
->base
+ c
->size
- run_address
;
980 /* allocate buffer */
981 buffer
= malloc(run_size
);
984 /* read sections to the buffer */
985 while (buffer_size
< run_size
)
989 if (buffer_size
- run_size
<= image
->sections
[section
].size
- section_offset
)
990 size_read
= buffer_size
- run_size
;
992 size_read
= image
->sections
[section
].size
- section_offset
;
994 if ((retval
= image_read_section(image
, section
, section_offset
,
995 size_read
, buffer
+ buffer_size
, &size_read
)) != ERROR_OK
|| size_read
== 0)
1002 buffer_size
+= size_read
;
1003 section_offset
+= size_read
;
1005 if (section_offset
>= image
->sections
[section
].size
)
1016 /* calculate and erase sectors */
1017 retval
= flash_erase_address_range( target
, run_address
, run_size
);
1020 if (retval
== ERROR_OK
)
1022 /* write flash sectors */
1023 retval
= flash_driver_write(c
, buffer
, run_address
- c
->base
, run_size
);
1028 if (retval
!= ERROR_OK
)
1030 return retval
; /* abort operation */
1033 if (written
!= NULL
)
1034 *written
+= run_size
; /* add run size to total written counter */
1040 int handle_flash_auto_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1044 return ERROR_COMMAND_SYNTAX_ERROR
;
1047 if (strcmp(args
[0], "on") == 0)
1049 else if (strcmp(args
[0], "off") == 0)
1052 return ERROR_COMMAND_SYNTAX_ERROR
;
1058 int default_flash_blank_check(struct flash_bank_s
*bank
)
1060 target_t
*target
= bank
->target
;
1062 int buffer_size
=sizeof(buffer
);
1066 if (bank
->target
->state
!= TARGET_HALTED
)
1068 return ERROR_TARGET_NOT_HALTED
;
1072 for (i
= 0; i
< bank
->num_sectors
; i
++)
1075 bank
->sectors
[i
].is_erased
= 1;
1077 for (j
=0; j
<bank
->sectors
[i
].size
; j
+=buffer_size
)
1082 if (chunk
>(j
-bank
->sectors
[i
].size
))
1084 chunk
=(j
-bank
->sectors
[i
].size
);
1087 retval
=target
->type
->read_memory(target
, bank
->base
+ bank
->sectors
[i
].offset
, 4, chunk
/4, buffer
);
1088 if (retval
!=ERROR_OK
)
1091 for (nBytes
= 0; nBytes
< chunk
; nBytes
++)
1093 if (buffer
[nBytes
] != 0xFF)
1095 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)