X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fflash%2Fflash.c;h=d1b023c55b28e11dd369599f553e133510b6842d;hp=a850ced94fa5f2ae163c0d48577d46573eae937e;hb=a0b1e05b5300817e1fe2bc4dae31601d02cfd815;hpb=fb1a9b2cb2f844a17d26dfeb3d26849364d93e26 diff --git a/src/flash/flash.c b/src/flash/flash.c index a850ced94f..d1b023c55b 100644 --- a/src/flash/flash.c +++ b/src/flash/flash.c @@ -2,7 +2,7 @@ * Copyright (C) 2005 by Dominic Rath * * Dominic.Rath@gmx.de * * * - * Copyright (C) 2007,2008 Øyvind Harboe * + * Copyright (C) 2007,2008 Øyvind Harboe * * oyvind.harboe@zylin.com * * * * Copyright (C) 2008 by Spencer Oliver * @@ -47,7 +47,10 @@ static int handle_flash_protect_command(struct command_context_s *cmd_ctx, char /* flash drivers */ extern flash_driver_t lpc2000_flash; +extern flash_driver_t lpc288x_flash; +extern flash_driver_t lpc2900_flash; extern flash_driver_t cfi_flash; +extern flash_driver_t at91sam3_flash; extern flash_driver_t at91sam7_flash; extern flash_driver_t str7x_flash; extern flash_driver_t str9x_flash; @@ -57,15 +60,17 @@ extern flash_driver_t str9xpec_flash; extern flash_driver_t stm32x_flash; extern flash_driver_t tms470_flash; extern flash_driver_t ecosflash_flash; -extern flash_driver_t lpc288x_flash; extern flash_driver_t ocl_flash; extern flash_driver_t pic32mx_flash; extern flash_driver_t avr_flash; flash_driver_t *flash_drivers[] = { &lpc2000_flash, + &lpc288x_flash, + &lpc2900_flash, &cfi_flash, &at91sam7_flash, + &at91sam3_flash, &str7x_flash, &str9x_flash, &aduc702x_flash, @@ -74,7 +79,6 @@ flash_driver_t *flash_drivers[] = { &stm32x_flash, &tms470_flash, &ecosflash_flash, - &lpc288x_flash, &ocl_flash, &pic32mx_flash, &avr_flash, @@ -92,7 +96,7 @@ static int flash_driver_write(struct flash_bank_s *bank, uint8_t *buffer, uint32 retval = bank->driver->write(bank, buffer, offset, count); if (retval != ERROR_OK) { - LOG_ERROR("error writing to flash at address 0x%08" PRIx32 " at offset 0x%8.8" PRIx32 " (%d)", + LOG_ERROR("error writing to flash at address 0x%08" PRIx32 " at offset 0x%8.8" PRIx32 " (%d)", bank->base, offset, retval); } @@ -350,13 +354,13 @@ static int handle_flash_info_command(struct command_context_s *cmd_ctx, char *cm if ((retval = p->driver->auto_probe(p)) != ERROR_OK) return retval; - command_print(cmd_ctx, + command_print(cmd_ctx, "#%" PRIi32 " : %s at 0x%8.8" PRIx32 ", size 0x%8.8" PRIx32 ", buswidth %i, chipwidth %i", i, - p->driver->name, - p->base, - p->size, - p->bus_width, + p->driver->name, + p->base, + p->size, + p->bus_width, p->chip_width); for (j = 0; j < p->num_sectors; j++) { @@ -369,11 +373,11 @@ static int handle_flash_info_command(struct command_context_s *cmd_ctx, char *cm else protect_state = "protection state unknown"; - command_print(cmd_ctx, + command_print(cmd_ctx, "\t#%3i: 0x%8.8" PRIx32 " (0x%" PRIx32 " %" PRIi32 "kB) %s", j, - p->sectors[j].offset, - p->sectors[j].size, + p->sectors[j].offset, + p->sectors[j].size, p->sectors[j].size >> 10, protect_state); } @@ -462,9 +466,9 @@ static int handle_flash_erase_check_command(struct command_context_s *cmd_ctx, c command_print(cmd_ctx, "\t#%3i: 0x%8.8" PRIx32 " (0x%" PRIx32 " %" PRIi32 "kB) %s", - j, - p->sectors[j].offset, - p->sectors[j].size, + j, + p->sectors[j].offset, + p->sectors[j].size, p->sectors[j].size >> 10, erase_state); } @@ -555,82 +559,122 @@ static int handle_flash_protect_check_command(struct command_context_s *cmd_ctx, return ERROR_OK; } -static int handle_flash_erase_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +static int flash_check_sector_parameters(struct command_context_s *cmd_ctx, + uint32_t first, uint32_t last, uint32_t num_sectors) +{ + if (!(first <= last)) { + command_print(cmd_ctx, "ERROR: " + "first sector must be <= last sector"); + return ERROR_FAIL; + } + + if (!(last <= (num_sectors - 1))) { + command_print(cmd_ctx, "ERROR: last sector must be <= %d", + (int) num_sectors - 1); + return ERROR_FAIL; + } + + return ERROR_OK; +} + +static int handle_flash_erase_command(struct command_context_s *cmd_ctx, + char *cmd, char **args, int argc) { if (argc > 2) { - int first = strtoul(args[1], NULL, 0); - int last = strtoul(args[2], NULL, 0); + uint32_t bank_nr; + uint32_t first; + uint32_t last; int retval; - flash_bank_t *p = get_flash_bank_by_num(strtoul(args[0], NULL, 0)); - duration_t duration; - char *duration_text; - duration_start_measure(&duration); + if ((retval = parse_u32(args[0], &bank_nr)) != ERROR_OK) + return retval; + flash_bank_t *p = get_flash_bank_by_num(bank_nr); if (!p) - { - return ERROR_COMMAND_SYNTAX_ERROR; - } + return ERROR_OK; - if ((retval = flash_driver_erase(p, first, last)) == ERROR_OK) - { - if ((retval = duration_stop_measure(&duration, &duration_text)) != ERROR_OK) - { + if ((retval = parse_u32(args[1], &first)) != ERROR_OK) + return retval; + if (strcmp(args[2], "last") == 0) + last = p->num_sectors - 1; + else + if ((retval = parse_u32(args[2], &last)) != ERROR_OK) return retval; - } - command_print(cmd_ctx, "erased sectors %i through %i on flash bank %li in %s", - first, last, strtoul(args[0], 0, 0), duration_text); + if ((retval = flash_check_sector_parameters(cmd_ctx, + first, last, p->num_sectors)) != ERROR_OK) + return retval; + + duration_t duration; + char *duration_text; + duration_start_measure(&duration); + + if ((retval = flash_driver_erase(p, first, last)) == ERROR_OK) { + if ((retval = duration_stop_measure(&duration, + &duration_text)) != ERROR_OK) + return retval; + command_print(cmd_ctx, "erased sectors %i through %i " + "on flash bank %i in %s", + (int) first, (int) last, (int) bank_nr, + duration_text); free(duration_text); } } else - { return ERROR_COMMAND_SYNTAX_ERROR; - } return ERROR_OK; } -static int handle_flash_protect_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +static int handle_flash_protect_command(struct command_context_s *cmd_ctx, + char *cmd, char **args, int argc) { if (argc > 3) { - int first = strtoul(args[1], NULL, 0); - int last = strtoul(args[2], NULL, 0); - int set; + uint32_t bank_nr; + uint32_t first; + uint32_t last; int retval; - flash_bank_t *p = get_flash_bank_by_num(strtoul(args[0], NULL, 0)); + int set; + + if ((retval = parse_u32(args[0], &bank_nr)) != ERROR_OK) + return retval; + + flash_bank_t *p = get_flash_bank_by_num(bank_nr); if (!p) - { - command_print(cmd_ctx, "flash bank '#%s' is out of bounds", args[0]); return ERROR_OK; - } + + if ((retval = parse_u32(args[1], &first)) != ERROR_OK) + return retval; + if (strcmp(args[2], "last") == 0) + last = p->num_sectors - 1; + else + if ((retval = parse_u32(args[2], &last)) != ERROR_OK) + return retval; if (strcmp(args[3], "on") == 0) set = 1; else if (strcmp(args[3], "off") == 0) set = 0; else - { return ERROR_COMMAND_SYNTAX_ERROR; - } + + if ((retval = flash_check_sector_parameters(cmd_ctx, + first, last, p->num_sectors)) != ERROR_OK) + return retval; retval = flash_driver_protect(p, set, first, last); - if (retval == ERROR_OK) - { - command_print(cmd_ctx, "%s protection for sectors %i through %i on flash bank %li", - (set) ? "set" : "cleared", first, - last, strtoul(args[0], 0, 0)); + if (retval == ERROR_OK) { + command_print(cmd_ctx, "%s protection for sectors %i " + "through %i on flash bank %i", + (set) ? "set" : "cleared", (int) first, + (int) last, (int) bank_nr); } } else - { return ERROR_COMMAND_SYNTAX_ERROR; - } - return ERROR_OK; } @@ -706,15 +750,16 @@ static int handle_flash_write_image_command(struct command_context_s *cmd_ctx, c image_close(&image); return retvaltemp; } - if (retval == ERROR_OK) - { - command_print(cmd_ctx, - "wrote %" PRIu32 " byte from file %s in %s (%f kb/s)", - written, - args[0], - duration_text, - (float)written / 1024.0 / ((float)duration.duration.tv_sec + ((float)duration.duration.tv_usec / 1000000.0))); - } + + float speed; + + speed = written / 1024.0; + speed /= ((float)duration.duration.tv_sec + + ((float)duration.duration.tv_usec / 1000000.0)); + command_print(cmd_ctx, + "wrote %" PRIu32 " byte from file %s in %s (%f kb/s)", + written, args[0], duration_text, speed); + free(duration_text); image_close(&image); @@ -791,9 +836,9 @@ static int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cm duration_start_measure(&duration); - for (wrote = 0; wrote<(count*wordsize); wrote += cur_size) + for (wrote = 0; wrote < (count*wordsize); wrote += cur_size) { - cur_size = MIN( (count*wordsize - wrote), sizeof(chunk) ); + cur_size = MIN((count*wordsize - wrote), sizeof(chunk)); flash_bank_t *bank; bank = get_flash_bank_by_addr(target, address); if (bank == NULL) @@ -809,11 +854,11 @@ static int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cm return err; unsigned i; - for (i = 0; i