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 ***************************************************************************/
28 #include "time_support.h"
33 #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_protect_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
47 int handle_flash_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
48 int handle_flash_write_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
49 int handle_flash_protect_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
53 extern flash_driver_t lpc2000_flash
;
54 extern flash_driver_t cfi_flash
;
55 extern flash_driver_t at91sam7_flash
;
56 extern flash_driver_t str7x_flash
;
57 extern flash_driver_t str9x_flash
;
59 flash_driver_t
*flash_drivers
[] =
69 flash_bank_t
*flash_banks
;
70 static command_t
*flash_cmd
;
72 int flash_register_commands(struct command_context_s
*cmd_ctx
)
74 flash_cmd
= register_command(cmd_ctx
, NULL
, "flash", NULL
, COMMAND_ANY
, NULL
);
76 register_command(cmd_ctx
, flash_cmd
, "bank", handle_flash_bank_command
, COMMAND_CONFIG
, NULL
);
81 int flash_init(struct command_context_s
*cmd_ctx
)
85 register_command(cmd_ctx
, flash_cmd
, "banks", handle_flash_banks_command
, COMMAND_EXEC
,
86 "list configured flash banks ");
87 register_command(cmd_ctx
, flash_cmd
, "info", handle_flash_info_command
, COMMAND_EXEC
,
88 "print info about flash bank <num>");
89 register_command(cmd_ctx
, flash_cmd
, "probe", handle_flash_probe_command
, COMMAND_EXEC
,
90 "identify flash bank <num>");
91 register_command(cmd_ctx
, flash_cmd
, "erase_check", handle_flash_erase_check_command
, COMMAND_EXEC
,
92 "check erase state of sectors in flash bank <num>");
93 register_command(cmd_ctx
, flash_cmd
, "protect_check", handle_flash_protect_check_command
, COMMAND_EXEC
,
94 "check protection state of sectors in flash bank <num>");
95 register_command(cmd_ctx
, flash_cmd
, "erase", handle_flash_erase_command
, COMMAND_EXEC
,
96 "erase sectors at <bank> <first> <last>");
97 register_command(cmd_ctx
, flash_cmd
, "write", handle_flash_write_command
, COMMAND_EXEC
,
98 "write binary <bank> <file> <offset>");
99 register_command(cmd_ctx
, flash_cmd
, "protect", handle_flash_protect_command
, COMMAND_EXEC
,
100 "set protection of sectors at <bank> <first> <last> <on|off>");
106 flash_bank_t
*get_flash_bank_by_num(int num
)
111 for (p
= flash_banks
; p
; p
= p
->next
)
122 /* flash_bank <driver> <base> <size> <chip_width> <bus_width> [driver_options ...]
124 int handle_flash_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
131 WARNING("incomplete flash_bank configuration");
135 for (i
= 0; flash_drivers
[i
]; i
++)
137 if (strcmp(args
[0], flash_drivers
[i
]->name
) == 0)
141 /* register flash specific commands */
142 if (flash_drivers
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
144 ERROR("couldn't register '%s' commands", args
[0]);
148 c
= malloc(sizeof(flash_bank_t
));
149 c
->driver
= flash_drivers
[i
];
150 c
->driver_priv
= NULL
;
151 c
->base
= strtoul(args
[1], NULL
, 0);
152 c
->size
= strtoul(args
[2], NULL
, 0);
153 c
->chip_width
= strtoul(args
[3], NULL
, 0);
154 c
->bus_width
= strtoul(args
[4], NULL
, 0);
157 if (flash_drivers
[i
]->flash_bank_command(cmd_ctx
, cmd
, args
, argc
, c
) != ERROR_OK
)
159 ERROR("'%s' driver rejected flash bank at 0x%8.8x", args
[0], c
->base
);
164 /* put flash bank in linked list */
167 /* find last flash bank */
168 for (p
= flash_banks
; p
&& p
->next
; p
= p
->next
);
181 /* no matching flash driver found */
184 ERROR("flash driver '%s' not found", args
[0]);
191 int handle_flash_banks_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
198 command_print(cmd_ctx
, "no flash banks configured");
202 for (p
= flash_banks
; p
; p
= p
->next
)
204 command_print(cmd_ctx
, "#%i: %s at 0x%8.8x, size 0x%8.8x, buswidth %i, chipwidth %i",
205 i
++, p
->driver
->name
, p
->base
, p
->size
, p
->bus_width
, p
->chip_width
);
211 int handle_flash_info_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
219 command_print(cmd_ctx
, "usage: flash info <num>");
223 for (p
= flash_banks
; p
; p
= p
->next
)
225 if (i
++ == strtoul(args
[0], NULL
, 0))
229 command_print(cmd_ctx
, "#%i: %s at 0x%8.8x, size 0x%8.8x, buswidth %i, chipwidth %i",
230 i
, p
->driver
->name
, p
->base
, p
->size
, p
->bus_width
, p
->chip_width
);
231 for (j
= 0; j
< p
->num_sectors
; j
++)
233 char *erase_state
, *protect_state
;
235 if (p
->sectors
[j
].is_erased
== 0)
236 erase_state
= "not erased";
237 else if (p
->sectors
[j
].is_erased
== 1)
238 erase_state
= "erased";
240 erase_state
= "erase state unknown";
242 if (p
->sectors
[j
].is_protected
== 0)
243 protect_state
= "not protected";
244 else if (p
->sectors
[j
].is_protected
== 1)
245 protect_state
= "protected";
247 protect_state
= "protection state unknown";
249 command_print(cmd_ctx
, "\t#%i: 0x%8.8x (0x%xkB) %s, %s",
250 j
, p
->sectors
[j
].offset
, p
->sectors
[j
].size
,
251 erase_state
, protect_state
);
254 p
->driver
->info(p
, buf
, 1024);
255 command_print(cmd_ctx
, "%s", buf
);
262 int handle_flash_probe_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
269 command_print(cmd_ctx
, "usage: flash probe <num>");
273 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
276 if ((retval
= p
->driver
->probe(p
)) == ERROR_OK
)
278 command_print(cmd_ctx
, "flash '%s' found at 0x%8.8x", p
->driver
->name
, p
->base
);
280 else if (retval
== ERROR_FLASH_BANK_INVALID
)
282 command_print(cmd_ctx
, "probing failed for flash bank '#%s' at 0x%8.8x",
287 command_print(cmd_ctx
, "unknown error when probing flash bank '#%s' at 0x%8.8x",
293 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
299 int handle_flash_erase_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
306 command_print(cmd_ctx
, "usage: flash erase_check <num>");
310 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
313 if ((retval
= p
->driver
->erase_check(p
)) == ERROR_OK
)
315 command_print(cmd_ctx
, "successfully checked erase state", p
->driver
->name
, p
->base
);
319 command_print(cmd_ctx
, "unknown error when checking erase state of flash bank #%s at 0x%8.8x",
325 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
331 int handle_flash_protect_check_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
338 command_print(cmd_ctx
, "usage: flash protect_check <num>");
342 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
345 if ((retval
= p
->driver
->protect_check(p
)) == ERROR_OK
)
347 command_print(cmd_ctx
, "successfully checked protect state");
349 else if (retval
== ERROR_FLASH_OPERATION_FAILED
)
351 command_print(cmd_ctx
, "checking protection state failed (possibly unsupported) by flash #%s at 0x%8.8x", args
[0], p
->base
);
355 command_print(cmd_ctx
, "unknown error when checking protection state of flash bank '#%s' at 0x%8.8x", args
[0], p
->base
);
360 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
366 int handle_flash_erase_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
370 int first
= strtoul(args
[1], NULL
, 0);
371 int last
= strtoul(args
[2], NULL
, 0);
373 flash_bank_t
*p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
374 struct timeval start
, end
, duration
;
376 gettimeofday(&start
, NULL
);
380 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
384 if ((retval
= p
->driver
->erase(p
, first
, last
)) != ERROR_OK
)
388 case ERROR_TARGET_NOT_HALTED
:
389 command_print(cmd_ctx
, "can't work with this flash while target is running");
391 case ERROR_INVALID_ARGUMENTS
:
392 command_print(cmd_ctx
, "usage: flash_erase <bank> <first> <last>");
394 case ERROR_FLASH_BANK_INVALID
:
395 command_print(cmd_ctx
, "no '%s' flash found at 0x%8.8x", p
->driver
->name
, p
->base
);
397 case ERROR_FLASH_OPERATION_FAILED
:
398 command_print(cmd_ctx
, "flash erase error");
400 case ERROR_FLASH_SECTOR_INVALID
:
401 command_print(cmd_ctx
, "sector number(s) invalid");
404 command_print(cmd_ctx
, "erased flash sectors %i to %i", first
, last
);
407 command_print(cmd_ctx
, "unknown error");
412 gettimeofday(&end
, NULL
);
413 timeval_subtract(&duration
, &end
, &start
);
415 command_print(cmd_ctx
, "erased sectors %i through %i on flash bank %i in %is %ius", first
, last
, strtoul(args
[0], 0, 0), duration
.tv_sec
, duration
.tv_usec
);
420 command_print(cmd_ctx
, "usage: flash erase <bank> <first> <last>");
426 int handle_flash_protect_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
430 int first
= strtoul(args
[1], NULL
, 0);
431 int last
= strtoul(args
[2], NULL
, 0);
434 flash_bank_t
*p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
437 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
441 if (strcmp(args
[3], "on") == 0)
443 else if (strcmp(args
[3], "off") == 0)
447 command_print(cmd_ctx
, "usage: flash protect <bank> <first> <last> <on|off>");
451 if ((retval
= p
->driver
->protect(p
, set
, first
, last
)) != ERROR_OK
)
455 case ERROR_TARGET_NOT_HALTED
:
456 command_print(cmd_ctx
, "can't work with this flash while target is running");
458 case ERROR_INVALID_ARGUMENTS
:
459 command_print(cmd_ctx
, "usage: flash protect <bank> <first> <last> <on|off>");
461 case ERROR_FLASH_BANK_INVALID
:
462 command_print(cmd_ctx
, "no '%s' flash found at 0x%8.8x", p
->driver
->name
, p
->base
);
464 case ERROR_FLASH_OPERATION_FAILED
:
465 command_print(cmd_ctx
, "flash program error");
467 case ERROR_FLASH_SECTOR_INVALID
:
468 command_print(cmd_ctx
, "sector number(s) invalid");
471 command_print(cmd_ctx
, "protection of flash sectors %i to %i turned %s", first
, last
, args
[3]);
474 command_print(cmd_ctx
, "unknown error");
479 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));
484 command_print(cmd_ctx
, "usage: flash protect <bank> <first> <last> <on|off>");
490 int handle_flash_write_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
508 command_print(cmd_ctx
, "usage: flash write <bank> <file> <offset> [type]");
512 duration_start_measure(&duration
);
514 identify_image_type(&image
.type
, (argc
== 4) ? args
[3] : NULL
);
516 image
.base_address_set
= 1;
517 image
.base_address
= strtoul(args
[1], NULL
, 0);
519 image
.start_address_set
= 0;
521 offset
= strtoul(args
[2], NULL
, 0);
522 p
= get_flash_bank_by_num(strtoul(args
[0], NULL
, 0));
525 command_print(cmd_ctx
, "flash bank '#%s' is out of bounds", args
[0]);
529 if (image_open(&image
, args
[1], FILEIO_READ
) != ERROR_OK
)
531 command_print(cmd_ctx
, "flash write error: %s", image
.error_str
);
536 for (i
= 0; i
< image
.num_sections
; i
++)
538 buffer
= malloc(image
.sections
[i
].size
);
539 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
541 ERROR("image_read_section failed with error code: %i", retval
);
542 command_print(cmd_ctx
, "image reading failed, flash write aborted");
548 if ((retval
= p
->driver
->write(p
, buffer
, offset
, buf_cnt
)) != ERROR_OK
)
550 command_print(cmd_ctx
, "failed writing file %s to flash bank %i at offset 0x%8.8x",
551 args
[1], strtoul(args
[0], NULL
, 0), strtoul(args
[2], NULL
, 0));
554 case ERROR_TARGET_NOT_HALTED
:
555 command_print(cmd_ctx
, "can't work with this flash while target is running");
557 case ERROR_INVALID_ARGUMENTS
:
558 command_print(cmd_ctx
, "usage: flash write <bank> <file> <offset>");
560 case ERROR_FLASH_BANK_INVALID
:
561 command_print(cmd_ctx
, "no '%s' flash found at 0x%8.8x", p
->driver
->name
, p
->base
);
563 case ERROR_FLASH_OPERATION_FAILED
:
564 command_print(cmd_ctx
, "flash program error");
566 case ERROR_FLASH_DST_BREAKS_ALIGNMENT
:
567 command_print(cmd_ctx
, "offset breaks required alignment");
569 case ERROR_FLASH_DST_OUT_OF_BANK
:
570 command_print(cmd_ctx
, "destination is out of flash bank (offset and/or file too large)");
572 case ERROR_FLASH_SECTOR_NOT_ERASED
:
573 command_print(cmd_ctx
, "destination sector(s) not erased");
576 command_print(cmd_ctx
, "unknown error");
579 image_size
+= buf_cnt
;
585 duration_stop_measure(&duration
, &duration_text
);
586 command_print(cmd_ctx
, "wrote %u byte from file %s to flash bank %i at offset 0x%8.8x in %s (%f kb/s)",
587 image_size
, args
[1], strtoul(args
[0], NULL
, 0), offset
, duration_text
,
588 (float)image_size
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.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)