If halt times out, stop GDB. Allows e.g. manual reset via monitor commands.
[openocd.git] / src / flash / flash.c
1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
4 * *
5 * Copyright (C) 2007,2008 Øyvind Harboe *
6 * oyvind.harboe@zylin.com *
7 * *
8 * Copyright (C) 2008 by Spencer Oliver *
9 * spen@spen-soft.co.uk *
10 * *
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. *
15 * *
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. *
20 * *
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 ***************************************************************************/
26 #ifdef HAVE_CONFIG_H
27 #include "config.h"
28 #endif
29
30 #include "flash.h"
31 #include "image.h"
32 #include "time_support.h"
33
34 /* command handlers */
35 static int handle_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
36 static int handle_flash_info_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
37 static int handle_flash_probe_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
38 static int handle_flash_erase_check_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
39 static int handle_flash_erase_address_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
40 static int handle_flash_protect_check_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
41 static int handle_flash_erase_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
42 static int handle_flash_write_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
43 static int handle_flash_write_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
44 static int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
45 static int handle_flash_protect_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
46
47 /* flash drivers
48 */
49 extern flash_driver_t lpc2000_flash;
50 extern flash_driver_t lpc288x_flash;
51 extern flash_driver_t lpc2900_flash;
52 extern flash_driver_t cfi_flash;
53 extern flash_driver_t at91sam3_flash;
54 extern flash_driver_t at91sam7_flash;
55 extern flash_driver_t str7x_flash;
56 extern flash_driver_t str9x_flash;
57 extern flash_driver_t aduc702x_flash;
58 extern flash_driver_t stellaris_flash;
59 extern flash_driver_t str9xpec_flash;
60 extern flash_driver_t stm32x_flash;
61 extern flash_driver_t tms470_flash;
62 extern flash_driver_t ecosflash_flash;
63 extern flash_driver_t ocl_flash;
64 extern flash_driver_t pic32mx_flash;
65 extern flash_driver_t avr_flash;
66
67 flash_driver_t *flash_drivers[] = {
68 &lpc2000_flash,
69 &lpc288x_flash,
70 &lpc2900_flash,
71 &cfi_flash,
72 &at91sam7_flash,
73 &at91sam3_flash,
74 &str7x_flash,
75 &str9x_flash,
76 &aduc702x_flash,
77 &stellaris_flash,
78 &str9xpec_flash,
79 &stm32x_flash,
80 &tms470_flash,
81 &ecosflash_flash,
82 &ocl_flash,
83 &pic32mx_flash,
84 &avr_flash,
85 NULL,
86 };
87
88 flash_bank_t *flash_banks;
89 static command_t *flash_cmd;
90
91 /* wafer thin wrapper for invoking the flash driver */
92 static int flash_driver_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
93 {
94 int retval;
95
96 retval = bank->driver->write(bank, buffer, offset, count);
97 if (retval != ERROR_OK)
98 {
99 LOG_ERROR("error writing to flash at address 0x%08" PRIx32 " at offset 0x%8.8" PRIx32 " (%d)",
100 bank->base, offset, retval);
101 }
102
103 return retval;
104 }
105
106 static int flash_driver_erase(struct flash_bank_s *bank, int first, int last)
107 {
108 int retval;
109
110 retval = bank->driver->erase(bank, first, last);
111 if (retval != ERROR_OK)
112 {
113 LOG_ERROR("failed erasing sectors %d to %d (%d)", first, last, retval);
114 }
115
116 return retval;
117 }
118
119 int flash_driver_protect(struct flash_bank_s *bank, int set, int first, int last)
120 {
121 int retval;
122
123 retval = bank->driver->protect(bank, set, first, last);
124 if (retval != ERROR_OK)
125 {
126 LOG_ERROR("failed setting protection for areas %d to %d (%d)", first, last, retval);
127 }
128
129 return retval;
130 }
131
132 int flash_register_commands(struct command_context_s *cmd_ctx)
133 {
134 flash_cmd = register_command(cmd_ctx, NULL, "flash", NULL, COMMAND_ANY, NULL);
135
136 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 ...]");
137 return ERROR_OK;
138 }
139
140 static int jim_flash_banks(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
141 {
142 flash_bank_t *p;
143
144 if (argc != 1) {
145 Jim_WrongNumArgs(interp, 1, argv, "no arguments to flash_banks command");
146 return JIM_ERR;
147 }
148
149 Jim_Obj *list = Jim_NewListObj(interp, NULL, 0);
150 for (p = flash_banks; p; p = p->next)
151 {
152 Jim_Obj *elem = Jim_NewListObj(interp, NULL, 0);
153
154 Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, "name", -1));
155 Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, p->driver->name, -1));
156 Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, "base", -1));
157 Jim_ListAppendElement(interp, elem, Jim_NewIntObj(interp, p->base));
158 Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, "size", -1));
159 Jim_ListAppendElement(interp, elem, Jim_NewIntObj(interp, p->size));
160 Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, "bus_width", -1));
161 Jim_ListAppendElement(interp, elem, Jim_NewIntObj(interp, p->bus_width));
162 Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, "chip_width", -1));
163 Jim_ListAppendElement(interp, elem, Jim_NewIntObj(interp, p->chip_width));
164
165 Jim_ListAppendElement(interp, list, elem);
166 }
167
168 Jim_SetResult(interp, list);
169
170 return JIM_OK;
171 }
172
173 int flash_init_drivers(struct command_context_s *cmd_ctx)
174 {
175 register_jim(cmd_ctx, "ocd_flash_banks", jim_flash_banks, "return information about the flash banks");
176
177 if (flash_banks)
178 {
179 register_command(cmd_ctx, flash_cmd, "info", handle_flash_info_command, COMMAND_EXEC,
180 "print info about flash bank <num>");
181 register_command(cmd_ctx, flash_cmd, "probe", handle_flash_probe_command, COMMAND_EXEC,
182 "identify flash bank <num>");
183 register_command(cmd_ctx, flash_cmd, "erase_check", handle_flash_erase_check_command, COMMAND_EXEC,
184 "check erase state of sectors in flash bank <num>");
185 register_command(cmd_ctx, flash_cmd, "protect_check", handle_flash_protect_check_command, COMMAND_EXEC,
186 "check protection state of sectors in flash bank <num>");
187 register_command(cmd_ctx, flash_cmd, "erase_sector", handle_flash_erase_command, COMMAND_EXEC,
188 "erase sectors at <bank> <first> <last>");
189 register_command(cmd_ctx, flash_cmd, "erase_address", handle_flash_erase_address_command, COMMAND_EXEC,
190 "erase address range <address> <length>");
191
192 register_command(cmd_ctx, flash_cmd, "fillw", handle_flash_fill_command, COMMAND_EXEC,
193 "fill with pattern (no autoerase) <address> <word_pattern> <count>");
194 register_command(cmd_ctx, flash_cmd, "fillh", handle_flash_fill_command, COMMAND_EXEC,
195 "fill with pattern <address> <halfword_pattern> <count>");
196 register_command(cmd_ctx, flash_cmd, "fillb", handle_flash_fill_command, COMMAND_EXEC,
197 "fill with pattern <address> <byte_pattern> <count>");
198
199 register_command(cmd_ctx, flash_cmd, "write_bank", handle_flash_write_bank_command, COMMAND_EXEC,
200 "write binary data to <bank> <file> <offset>");
201 register_command(cmd_ctx, flash_cmd, "write_image", handle_flash_write_image_command, COMMAND_EXEC,
202 "write_image [erase] <file> [offset] [type]");
203 register_command(cmd_ctx, flash_cmd, "protect", handle_flash_protect_command, COMMAND_EXEC,
204 "set protection of sectors at <bank> <first> <last> <on | off>");
205 }
206
207 return ERROR_OK;
208 }
209
210 flash_bank_t *get_flash_bank_by_num_noprobe(int num)
211 {
212 flash_bank_t *p;
213 int i = 0;
214
215 for (p = flash_banks; p; p = p->next)
216 {
217 if (i++ == num)
218 {
219 return p;
220 }
221 }
222 LOG_ERROR("flash bank %d does not exist", num);
223 return NULL;
224 }
225
226 int flash_get_bank_count(void)
227 {
228 flash_bank_t *p;
229 int i = 0;
230 for (p = flash_banks; p; p = p->next)
231 {
232 i++;
233 }
234 return i;
235 }
236
237 flash_bank_t *get_flash_bank_by_num(int num)
238 {
239 flash_bank_t *p = get_flash_bank_by_num_noprobe(num);
240 int retval;
241
242 if (p == NULL)
243 return NULL;
244
245 retval = p->driver->auto_probe(p);
246
247 if (retval != ERROR_OK)
248 {
249 LOG_ERROR("auto_probe failed %d\n", retval);
250 return NULL;
251 }
252 return p;
253 }
254
255 static int handle_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
256 {
257 int retval;
258 int i;
259 int found = 0;
260 target_t *target;
261
262 if (argc < 6)
263 {
264 return ERROR_COMMAND_SYNTAX_ERROR;
265 }
266
267 if ((target = get_target(args[5])) == NULL)
268 {
269 LOG_ERROR("target '%s' not defined", args[5]);
270 return ERROR_FAIL;
271 }
272
273 for (i = 0; flash_drivers[i]; i++)
274 {
275 if (strcmp(args[0], flash_drivers[i]->name) == 0)
276 {
277 flash_bank_t *p, *c;
278
279 /* register flash specific commands */
280 if (flash_drivers[i]->register_commands(cmd_ctx) != ERROR_OK)
281 {
282 LOG_ERROR("couldn't register '%s' commands", args[0]);
283 return ERROR_FAIL;
284 }
285
286 c = malloc(sizeof(flash_bank_t));
287 c->target = target;
288 c->driver = flash_drivers[i];
289 c->driver_priv = NULL;
290 c->base = strtoul(args[1], NULL, 0);
291 c->size = strtoul(args[2], NULL, 0);
292 c->chip_width = strtoul(args[3], NULL, 0);
293 c->bus_width = strtoul(args[4], NULL, 0);
294 c->num_sectors = 0;
295 c->sectors = NULL;
296 c->next = NULL;
297
298 if ((retval = flash_drivers[i]->flash_bank_command(cmd_ctx, cmd, args, argc, c)) != ERROR_OK)
299 {
300 LOG_ERROR("'%s' driver rejected flash bank at 0x%8.8" PRIx32 , args[0], c->base);
301 free(c);
302 return retval;
303 }
304
305 /* put flash bank in linked list */
306 if (flash_banks)
307 {
308 int bank_num = 0;
309 /* find last flash bank */
310 for (p = flash_banks; p && p->next; p = p->next) bank_num++;
311 if (p)
312 p->next = c;
313 c->bank_number = bank_num + 1;
314 }
315 else
316 {
317 flash_banks = c;
318 c->bank_number = 0;
319 }
320
321 found = 1;
322 }
323 }
324
325 /* no matching flash driver found */
326 if (!found)
327 {
328 LOG_ERROR("flash driver '%s' not found", args[0]);
329 return ERROR_FAIL;
330 }
331
332 return ERROR_OK;
333 }
334
335 static int handle_flash_info_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
336 {
337 flash_bank_t *p;
338 uint32_t i = 0;
339 int j = 0;
340 int retval;
341
342 if (argc != 1)
343 {
344 return ERROR_COMMAND_SYNTAX_ERROR;
345 }
346
347 for (p = flash_banks; p; p = p->next, i++)
348 {
349 if (i == strtoul(args[0], NULL, 0))
350 {
351 char buf[1024];
352
353 /* attempt auto probe */
354 if ((retval = p->driver->auto_probe(p)) != ERROR_OK)
355 return retval;
356
357 command_print(cmd_ctx,
358 "#%" PRIi32 " : %s at 0x%8.8" PRIx32 ", size 0x%8.8" PRIx32 ", buswidth %i, chipwidth %i",
359 i,
360 p->driver->name,
361 p->base,
362 p->size,
363 p->bus_width,
364 p->chip_width);
365 for (j = 0; j < p->num_sectors; j++)
366 {
367 char *protect_state;
368
369 if (p->sectors[j].is_protected == 0)
370 protect_state = "not protected";
371 else if (p->sectors[j].is_protected == 1)
372 protect_state = "protected";
373 else
374 protect_state = "protection state unknown";
375
376 command_print(cmd_ctx,
377 "\t#%3i: 0x%8.8" PRIx32 " (0x%" PRIx32 " %" PRIi32 "kB) %s",
378 j,
379 p->sectors[j].offset,
380 p->sectors[j].size,
381 p->sectors[j].size >> 10,
382 protect_state);
383 }
384
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);
390 }
391 }
392
393 return ERROR_OK;
394 }
395
396 static int handle_flash_probe_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
397 {
398 flash_bank_t *p;
399 int retval;
400
401 if (argc != 1)
402 {
403 return ERROR_COMMAND_SYNTAX_ERROR;
404 }
405
406 p = get_flash_bank_by_num_noprobe(strtoul(args[0], NULL, 0));
407 if (p)
408 {
409 if ((retval = p->driver->probe(p)) == ERROR_OK)
410 {
411 command_print(cmd_ctx, "flash '%s' found at 0x%8.8" PRIx32, p->driver->name, p->base);
412 }
413 else if (retval == ERROR_FLASH_BANK_INVALID)
414 {
415 command_print(cmd_ctx, "probing failed for flash bank '#%s' at 0x%8.8" PRIx32,
416 args[0], p->base);
417 }
418 else
419 {
420 command_print(cmd_ctx, "unknown error when probing flash bank '#%s' at 0x%8.8" PRIx32,
421 args[0], p->base);
422 }
423 }
424 else
425 {
426 command_print(cmd_ctx, "flash bank '#%s' is out of bounds", args[0]);
427 }
428
429 return ERROR_OK;
430 }
431
432 static int handle_flash_erase_check_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
433 {
434 flash_bank_t *p;
435 int retval;
436
437 if (argc != 1)
438 {
439 return ERROR_COMMAND_SYNTAX_ERROR;
440 }
441
442 p = get_flash_bank_by_num(strtoul(args[0], NULL, 0));
443 if (p)
444 {
445 int j;
446 if ((retval = p->driver->erase_check(p)) == ERROR_OK)
447 {
448 command_print(cmd_ctx, "successfully checked erase state");
449 }
450 else
451 {
452 command_print(cmd_ctx, "unknown error when checking erase state of flash bank #%s at 0x%8.8" PRIx32,
453 args[0], p->base);
454 }
455
456 for (j = 0; j < p->num_sectors; j++)
457 {
458 char *erase_state;
459
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";
464 else
465 erase_state = "erase state unknown";
466
467 command_print(cmd_ctx,
468 "\t#%3i: 0x%8.8" PRIx32 " (0x%" PRIx32 " %" PRIi32 "kB) %s",
469 j,
470 p->sectors[j].offset,
471 p->sectors[j].size,
472 p->sectors[j].size >> 10,
473 erase_state);
474 }
475 }
476
477 return ERROR_OK;
478 }
479
480 static int handle_flash_erase_address_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
481 {
482 flash_bank_t *p;
483 int retval;
484 int address;
485 int length;
486 duration_t duration;
487 char *duration_text;
488
489 target_t *target = get_current_target(cmd_ctx);
490
491 if (argc != 2)
492 {
493 return ERROR_COMMAND_SYNTAX_ERROR;
494 }
495
496 address = strtoul(args[0], NULL, 0);
497 length = strtoul(args[1], NULL, 0);
498 if (length <= 0)
499 {
500 command_print(cmd_ctx, "Length must be >0");
501 return ERROR_COMMAND_SYNTAX_ERROR;
502 }
503
504 p = get_flash_bank_by_addr(target, address);
505 if (p == NULL)
506 {
507 return ERROR_FAIL;
508 }
509
510 /* We can't know if we did a resume + halt, in which case we no longer know the erased state */
511 flash_set_dirty();
512
513 duration_start_measure(&duration);
514
515 if ((retval = flash_erase_address_range(target, address, length)) == ERROR_OK)
516 {
517 if ((retval = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
518 {
519 return retval;
520 }
521 command_print(cmd_ctx, "erased address 0x%8.8x length %i in %s", address, length, duration_text);
522 free(duration_text);
523 }
524
525 return retval;
526 }
527
528 static int handle_flash_protect_check_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
529 {
530 flash_bank_t *p;
531 int retval;
532
533 if (argc != 1)
534 {
535 return ERROR_COMMAND_SYNTAX_ERROR;
536 }
537
538 p = get_flash_bank_by_num(strtoul(args[0], NULL, 0));
539 if (p)
540 {
541 if ((retval = p->driver->protect_check(p)) == ERROR_OK)
542 {
543 command_print(cmd_ctx, "successfully checked protect state");
544 }
545 else if (retval == ERROR_FLASH_OPERATION_FAILED)
546 {
547 command_print(cmd_ctx, "checking protection state failed (possibly unsupported) by flash #%s at 0x%8.8" PRIx32, args[0], p->base);
548 }
549 else
550 {
551 command_print(cmd_ctx, "unknown error when checking protection state of flash bank '#%s' at 0x%8.8" PRIx32, args[0], p->base);
552 }
553 }
554 else
555 {
556 return ERROR_COMMAND_SYNTAX_ERROR;
557 }
558
559 return ERROR_OK;
560 }
561
562 static int flash_check_sector_parameters(struct command_context_s *cmd_ctx,
563 uint32_t first, uint32_t last, uint32_t num_sectors)
564 {
565 if (!(first <= last)) {
566 command_print(cmd_ctx, "ERROR: "
567 "first sector must be <= last sector");
568 return ERROR_FAIL;
569 }
570
571 if (!(last <= (num_sectors - 1))) {
572 command_print(cmd_ctx, "ERROR: "
573 "last sector must be <= %d", num_sectors - 1);
574 return ERROR_FAIL;
575 }
576
577 return ERROR_OK;
578 }
579
580 static int handle_flash_erase_command(struct command_context_s *cmd_ctx,
581 char *cmd, char **args, int argc)
582 {
583 if (argc > 2)
584 {
585 uint32_t bank_nr;
586 uint32_t first;
587 uint32_t last;
588 int retval;
589
590 if ((retval = parse_u32(args[0], &bank_nr)) != ERROR_OK)
591 return retval;
592
593 flash_bank_t *p = get_flash_bank_by_num(bank_nr);
594 if (!p)
595 return ERROR_OK;
596
597 if ((retval = parse_u32(args[1], &first)) != ERROR_OK)
598 return retval;
599 if (strcmp(args[2], "last") == 0)
600 last = p->num_sectors - 1;
601 else
602 if ((retval = parse_u32(args[2], &last)) != ERROR_OK)
603 return retval;
604
605 if ((retval = flash_check_sector_parameters(cmd_ctx,
606 first, last, p->num_sectors)) != ERROR_OK)
607 return retval;
608
609 duration_t duration;
610 char *duration_text;
611 duration_start_measure(&duration);
612
613 if ((retval = flash_driver_erase(p, first, last)) == ERROR_OK) {
614 if ((retval = duration_stop_measure(&duration,
615 &duration_text)) != ERROR_OK)
616 return retval;
617 command_print(cmd_ctx, "erased sectors %i through %i "
618 "on flash bank %i in %s",
619 first, last, bank_nr, duration_text);
620 free(duration_text);
621 }
622 }
623 else
624 return ERROR_COMMAND_SYNTAX_ERROR;
625
626 return ERROR_OK;
627 }
628
629 static int handle_flash_protect_command(struct command_context_s *cmd_ctx,
630 char *cmd, char **args, int argc)
631 {
632 if (argc > 3)
633 {
634 uint32_t bank_nr;
635 uint32_t first;
636 uint32_t last;
637 int retval;
638 int set;
639
640 if ((retval = parse_u32(args[0], &bank_nr)) != ERROR_OK)
641 return retval;
642
643 flash_bank_t *p = get_flash_bank_by_num(bank_nr);
644 if (!p)
645 return ERROR_OK;
646
647 if ((retval = parse_u32(args[1], &first)) != ERROR_OK)
648 return retval;
649 if (strcmp(args[2], "last") == 0)
650 last = p->num_sectors - 1;
651 else
652 if ((retval = parse_u32(args[2], &last)) != ERROR_OK)
653 return retval;
654
655 if (strcmp(args[3], "on") == 0)
656 set = 1;
657 else if (strcmp(args[3], "off") == 0)
658 set = 0;
659 else
660 return ERROR_COMMAND_SYNTAX_ERROR;
661
662 if ((retval = flash_check_sector_parameters(cmd_ctx,
663 first, last, p->num_sectors)) != ERROR_OK)
664 return retval;
665
666 retval = flash_driver_protect(p, set, first, last);
667 if (retval == ERROR_OK) {
668 command_print(cmd_ctx, "%s protection for sectors %i "
669 "through %i on flash bank %i",
670 (set) ? "set" : "cleared", first,
671 last, bank_nr);
672 }
673 }
674 else
675 return ERROR_COMMAND_SYNTAX_ERROR;
676
677 return ERROR_OK;
678 }
679
680 static int handle_flash_write_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
681 {
682 target_t *target = get_current_target(cmd_ctx);
683
684 image_t image;
685 uint32_t written;
686
687 duration_t duration;
688 char *duration_text;
689
690 int retval, retvaltemp;
691
692 if (argc < 1)
693 {
694 return ERROR_COMMAND_SYNTAX_ERROR;
695 }
696
697 /* flash auto-erase is disabled by default*/
698 int auto_erase = 0;
699
700 if (strcmp(args[0], "erase") == 0)
701 {
702 auto_erase = 1;
703 args++;
704 argc--;
705 command_print(cmd_ctx, "auto erase enabled");
706 }
707
708 if (argc < 1)
709 {
710 return ERROR_COMMAND_SYNTAX_ERROR;
711 }
712
713 if (!target)
714 {
715 LOG_ERROR("no target selected");
716 return ERROR_FAIL;
717 }
718
719 duration_start_measure(&duration);
720
721 if (argc >= 2)
722 {
723 image.base_address_set = 1;
724 image.base_address = strtoul(args[1], NULL, 0);
725 }
726 else
727 {
728 image.base_address_set = 0;
729 image.base_address = 0x0;
730 }
731
732 image.start_address_set = 0;
733
734 retval = image_open(&image, args[0], (argc == 3) ? args[2] : NULL);
735 if (retval != ERROR_OK)
736 {
737 return retval;
738 }
739
740 retval = flash_write(target, &image, &written, auto_erase);
741 if (retval != ERROR_OK)
742 {
743 image_close(&image);
744 return retval;
745 }
746
747 if ((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
748 {
749 image_close(&image);
750 return retvaltemp;
751 }
752
753 float speed;
754
755 speed = written / 1024.0;
756 speed /= ((float)duration.duration.tv_sec
757 + ((float)duration.duration.tv_usec / 1000000.0));
758 command_print(cmd_ctx,
759 "wrote %" PRIu32 " byte from file %s in %s (%f kb/s)",
760 written, args[0], duration_text, speed);
761
762 free(duration_text);
763
764 image_close(&image);
765
766 return retval;
767 }
768
769 static int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
770 {
771 int err = ERROR_OK, retval;
772 uint32_t address;
773 uint32_t pattern;
774 uint32_t count;
775 uint8_t chunk[1024];
776 uint8_t readback[1024];
777 uint32_t wrote = 0;
778 uint32_t cur_size = 0;
779 uint32_t chunk_count;
780 char *duration_text;
781 duration_t duration;
782 target_t *target = get_current_target(cmd_ctx);
783 uint32_t i;
784 uint32_t wordsize;
785
786 if (argc != 3)
787 {
788 return ERROR_COMMAND_SYNTAX_ERROR;
789 }
790
791 address = strtoul(args[0], NULL, 0);
792 pattern = strtoul(args[1], NULL, 0);
793 count = strtoul(args[2], NULL, 0);
794
795 if (count == 0)
796 return ERROR_OK;
797
798 switch (cmd[4])
799 {
800 case 'w':
801 wordsize = 4;
802 break;
803 case 'h':
804 wordsize = 2;
805 break;
806 case 'b':
807 wordsize = 1;
808 break;
809 default:
810 return ERROR_COMMAND_SYNTAX_ERROR;
811 }
812
813 chunk_count = MIN(count, (1024 / wordsize));
814 switch (wordsize)
815 {
816 case 4:
817 for (i = 0; i < chunk_count; i++)
818 {
819 target_buffer_set_u32(target, chunk + i * wordsize, pattern);
820 }
821 break;
822 case 2:
823 for (i = 0; i < chunk_count; i++)
824 {
825 target_buffer_set_u16(target, chunk + i * wordsize, pattern);
826 }
827 break;
828 case 1:
829 memset(chunk, pattern, chunk_count);
830 break;
831 default:
832 LOG_ERROR("BUG: can't happen");
833 exit(-1);
834 }
835
836 duration_start_measure(&duration);
837
838 for (wrote = 0; wrote < (count*wordsize); wrote += cur_size)
839 {
840 cur_size = MIN((count*wordsize - wrote), sizeof(chunk));
841 flash_bank_t *bank;
842 bank = get_flash_bank_by_addr(target, address);
843 if (bank == NULL)
844 {
845 return ERROR_FAIL;
846 }
847 err = flash_driver_write(bank, chunk, address - bank->base + wrote, cur_size);
848 if (err != ERROR_OK)
849 return err;
850
851 err = target_read_buffer(target, address + wrote, cur_size, readback);
852 if (err != ERROR_OK)
853 return err;
854
855 unsigned i;
856 for (i = 0; i < cur_size; i++)
857 {
858 if (readback[i]!=chunk[i])
859 {
860 LOG_ERROR("Verfication error address 0x%08" PRIx32 ", read back 0x%02x, expected 0x%02x",
861 address + wrote + i, readback[i], chunk[i]);
862 return ERROR_FAIL;
863 }
864 }
865
866 }
867
868 if ((retval = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
869 {
870 return retval;
871 }
872
873 float speed;
874
875 speed = wrote / 1024.0;
876 speed /= ((float)duration.duration.tv_sec
877 + ((float)duration.duration.tv_usec / 1000000.0));
878 command_print(cmd_ctx,
879 "wrote %" PRIu32 " bytes to 0x%8.8" PRIx32 " in %s (%f kb/s)",
880 wrote, address, duration_text, speed);
881
882 free(duration_text);
883 return ERROR_OK;
884 }
885
886 static int handle_flash_write_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
887 {
888 uint32_t offset;
889 uint8_t *buffer;
890 uint32_t buf_cnt;
891
892 fileio_t fileio;
893
894 duration_t duration;
895 char *duration_text;
896
897 int retval, retvaltemp;
898 flash_bank_t *p;
899
900 if (argc != 3)
901 {
902 return ERROR_COMMAND_SYNTAX_ERROR;
903 }
904
905 duration_start_measure(&duration);
906
907 offset = strtoul(args[2], NULL, 0);
908 p = get_flash_bank_by_num(strtoul(args[0], NULL, 0));
909 if (!p)
910 {
911 command_print(cmd_ctx, "flash bank '#%s' is out of bounds", args[0]);
912 return ERROR_OK;
913 }
914
915 if (fileio_open(&fileio, args[1], FILEIO_READ, FILEIO_BINARY) != ERROR_OK)
916 {
917 return ERROR_OK;
918 }
919
920 buffer = malloc(fileio.size);
921 if (fileio_read(&fileio, fileio.size, buffer, &buf_cnt) != ERROR_OK)
922 {
923 free(buffer);
924 fileio_close(&fileio);
925 return ERROR_OK;
926 }
927
928 retval = flash_driver_write(p, buffer, offset, buf_cnt);
929
930 free(buffer);
931 buffer = NULL;
932
933 if ((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
934 {
935 fileio_close(&fileio);
936 return retvaltemp;
937 }
938 if (retval == ERROR_OK)
939 {
940 command_print(cmd_ctx,
941 "wrote %lld byte from file %s to flash bank %li at offset 0x%8.8" PRIx32 " in %s (%f kb/s)",
942 fileio.size,
943 args[1],
944 strtoul(args[0], NULL, 0),
945 offset,
946 duration_text,
947 (float)fileio.size / 1024.0 / ((float)duration.duration.tv_sec + ((float)duration.duration.tv_usec / 1000000.0)));
948 }
949 free(duration_text);
950
951 fileio_close(&fileio);
952
953 return retval;
954 }
955
956 void flash_set_dirty(void)
957 {
958 flash_bank_t *c;
959 int i;
960
961 /* set all flash to require erasing */
962 for (c = flash_banks; c; c = c->next)
963 {
964 for (i = 0; i < c->num_sectors; i++)
965 {
966 c->sectors[i].is_erased = 0;
967 }
968 }
969 }
970
971 /* lookup flash bank by address */
972 flash_bank_t *get_flash_bank_by_addr(target_t *target, uint32_t addr)
973 {
974 flash_bank_t *c;
975
976 /* cycle through bank list */
977 for (c = flash_banks; c; c = c->next)
978 {
979 int retval;
980 retval = c->driver->auto_probe(c);
981
982 if (retval != ERROR_OK)
983 {
984 LOG_ERROR("auto_probe failed %d\n", retval);
985 return NULL;
986 }
987 /* check whether address belongs to this flash bank */
988 if ((addr >= c->base) && (addr <= c->base + (c->size - 1)) && target == c->target)
989 return c;
990 }
991 LOG_ERROR("No flash at address 0x%08" PRIx32 "\n", addr);
992 return NULL;
993 }
994
995 /* erase given flash region, selects proper bank according to target and address */
996 int flash_erase_address_range(target_t *target, uint32_t addr, uint32_t length)
997 {
998 flash_bank_t *c;
999 int first = -1;
1000 int last = -1;
1001 int i;
1002
1003 if ((c = get_flash_bank_by_addr(target, addr)) == NULL)
1004 return ERROR_FLASH_DST_OUT_OF_BANK; /* no corresponding bank found */
1005
1006 if (c->size == 0 || c->num_sectors == 0)
1007 {
1008 LOG_ERROR("Bank is invalid");
1009 return ERROR_FLASH_BANK_INVALID;
1010 }
1011
1012 if (length == 0)
1013 {
1014 /* special case, erase whole bank when length is zero */
1015 if (addr != c->base)
1016 return ERROR_FLASH_DST_BREAKS_ALIGNMENT;
1017
1018 return flash_driver_erase(c, 0, c->num_sectors - 1);
1019 }
1020
1021 /* check whether it fits */
1022 if (addr + length - 1 > c->base + c->size - 1)
1023 return ERROR_FLASH_DST_BREAKS_ALIGNMENT;
1024
1025 addr -= c->base;
1026
1027 for (i = 0; i < c->num_sectors; i++)
1028 {
1029 /* check whether sector overlaps with the given range and is not yet erased */
1030 if (addr < c->sectors[i].offset + c->sectors[i].size && addr + length > c->sectors[i].offset && c->sectors[i].is_erased != 1) {
1031 /* if first is not set yet then this is the first sector */
1032 if (first == -1)
1033 first = i;
1034 last = i; /* and it is the last one so far in any case */
1035 }
1036 }
1037
1038 if (first == -1 || last == -1)
1039 return ERROR_OK;
1040
1041 return flash_driver_erase(c, first, last);
1042 }
1043
1044 /* write (optional verify) an image to flash memory of the given target */
1045 int flash_write(target_t *target, image_t *image, uint32_t *written, int erase)
1046 {
1047 int retval = ERROR_OK;
1048
1049 int section;
1050 uint32_t section_offset;
1051 flash_bank_t *c;
1052 int *padding;
1053
1054 section = 0;
1055 section_offset = 0;
1056
1057 if (written)
1058 *written = 0;
1059
1060 if (erase)
1061 {
1062 /* assume all sectors need erasing - stops any problems
1063 * when flash_write is called multiple times */
1064
1065 flash_set_dirty();
1066 }
1067
1068 /* allocate padding array */
1069 padding = malloc(image->num_sections * sizeof(padding));
1070
1071 /* loop until we reach end of the image */
1072 while (section < image->num_sections)
1073 {
1074 uint32_t buffer_size;
1075 uint8_t *buffer;
1076 int section_first;
1077 int section_last;
1078 uint32_t run_address = image->sections[section].base_address + section_offset;
1079 uint32_t run_size = image->sections[section].size - section_offset;
1080 int pad_bytes = 0;
1081
1082 if (image->sections[section].size == 0)
1083 {
1084 LOG_WARNING("empty section %d", section);
1085 section++;
1086 section_offset = 0;
1087 continue;
1088 }
1089
1090 /* find the corresponding flash bank */
1091 if ((c = get_flash_bank_by_addr(target, run_address)) == NULL)
1092 {
1093 section++; /* and skip it */
1094 section_offset = 0;
1095 continue;
1096 }
1097
1098 /* collect consecutive sections which fall into the same bank */
1099 section_first = section;
1100 section_last = section;
1101 padding[section] = 0;
1102 while ((run_address + run_size - 1 < c->base + c->size - 1)
1103 && (section_last + 1 < image->num_sections))
1104 {
1105 if (image->sections[section_last + 1].base_address < (run_address + run_size))
1106 {
1107 LOG_DEBUG("section %d out of order(very slightly surprising, but supported)", section_last + 1);
1108 break;
1109 }
1110 /* if we have multiple sections within our image, flash programming could fail due to alignment issues
1111 * attempt to rebuild a consecutive buffer for the flash loader */
1112 pad_bytes = (image->sections[section_last + 1].base_address) - (run_address + run_size);
1113 if ((run_address + run_size + pad_bytes) > (c->base + c->size))
1114 break;
1115 padding[section_last] = pad_bytes;
1116 run_size += image->sections[++section_last].size;
1117 run_size += pad_bytes;
1118 padding[section_last] = 0;
1119
1120 LOG_INFO("Padding image section %d with %d bytes", section_last-1, pad_bytes);
1121 }
1122
1123 /* fit the run into bank constraints */
1124 if (run_address + run_size - 1 > c->base + c->size - 1)
1125 {
1126 LOG_WARNING("writing %d bytes only - as image section is %d bytes and bank is only %d bytes", \
1127 (int)(c->base + c->size - run_address), (int)(run_size), (int)(c->size));
1128 run_size = c->base + c->size - run_address;
1129 }
1130
1131 /* allocate buffer */
1132 buffer = malloc(run_size);
1133 buffer_size = 0;
1134
1135 /* read sections to the buffer */
1136 while (buffer_size < run_size)
1137 {
1138 uint32_t size_read;
1139
1140 size_read = run_size - buffer_size;
1141 if (size_read > image->sections[section].size - section_offset)
1142 size_read = image->sections[section].size - section_offset;
1143
1144 if ((retval = image_read_section(image, section, section_offset,
1145 size_read, buffer + buffer_size, &size_read)) != ERROR_OK || size_read == 0)
1146 {
1147 free(buffer);
1148 free(padding);
1149 return retval;
1150 }
1151
1152 /* see if we need to pad the section */
1153 while (padding[section]--)
1154 (buffer + buffer_size)[size_read++] = 0xff;
1155
1156 buffer_size += size_read;
1157 section_offset += size_read;
1158
1159 if (section_offset >= image->sections[section].size)
1160 {
1161 section++;
1162 section_offset = 0;
1163 }
1164 }
1165
1166 retval = ERROR_OK;
1167
1168 if (erase)
1169 {
1170 /* calculate and erase sectors */
1171 retval = flash_erase_address_range(target, run_address, run_size);
1172 }
1173
1174 if (retval == ERROR_OK)
1175 {
1176 /* write flash sectors */
1177 retval = flash_driver_write(c, buffer, run_address - c->base, run_size);
1178 }
1179
1180 free(buffer);
1181
1182 if (retval != ERROR_OK)
1183 {
1184 free(padding);
1185 return retval; /* abort operation */
1186 }
1187
1188 if (written != NULL)
1189 *written += run_size; /* add run size to total written counter */
1190 }
1191
1192 free(padding);
1193
1194 return retval;
1195 }
1196
1197 int default_flash_mem_blank_check(struct flash_bank_s *bank)
1198 {
1199 target_t *target = bank->target;
1200 uint8_t buffer[1024];
1201 int buffer_size = sizeof(buffer);
1202 int i;
1203 uint32_t nBytes;
1204
1205 if (bank->target->state != TARGET_HALTED)
1206 {
1207 LOG_ERROR("Target not halted");
1208 return ERROR_TARGET_NOT_HALTED;
1209 }
1210
1211 for (i = 0; i < bank->num_sectors; i++)
1212 {
1213 uint32_t j;
1214 bank->sectors[i].is_erased = 1;
1215
1216 for (j = 0; j < bank->sectors[i].size; j += buffer_size)
1217 {
1218 uint32_t chunk;
1219 int retval;
1220 chunk = buffer_size;
1221 if (chunk > (j - bank->sectors[i].size))
1222 {
1223 chunk = (j - bank->sectors[i].size);
1224 }
1225
1226 retval = target_read_memory(target, bank->base + bank->sectors[i].offset + j, 4, chunk/4, buffer);
1227 if (retval != ERROR_OK)
1228 return retval;
1229
1230 for (nBytes = 0; nBytes < chunk; nBytes++)
1231 {
1232 if (buffer[nBytes] != 0xFF)
1233 {
1234 bank->sectors[i].is_erased = 0;
1235 break;
1236 }
1237 }
1238 }
1239 }
1240
1241 return ERROR_OK;
1242 }
1243
1244 int default_flash_blank_check(struct flash_bank_s *bank)
1245 {
1246 target_t *target = bank->target;
1247 int i;
1248 int retval;
1249 int fast_check = 0;
1250 uint32_t blank;
1251
1252 if (bank->target->state != TARGET_HALTED)
1253 {
1254 LOG_ERROR("Target not halted");
1255 return ERROR_TARGET_NOT_HALTED;
1256 }
1257
1258 for (i = 0; i < bank->num_sectors; i++)
1259 {
1260 uint32_t address = bank->base + bank->sectors[i].offset;
1261 uint32_t size = bank->sectors[i].size;
1262
1263 if ((retval = target_blank_check_memory(target, address, size, &blank)) != ERROR_OK)
1264 {
1265 fast_check = 0;
1266 break;
1267 }
1268 if (blank == 0xFF)
1269 bank->sectors[i].is_erased = 1;
1270 else
1271 bank->sectors[i].is_erased = 0;
1272 fast_check = 1;
1273 }
1274
1275 if (!fast_check)
1276 {
1277 LOG_USER("Running slow fallback erase check - add working memory");
1278 return default_flash_mem_blank_check(bank);
1279 }
1280
1281 return ERROR_OK;
1282 }

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)