This is an automated email from Gerrit. Jean-Christian de Rivaz (jcamd...@gmail.com) just uploaded a new patch set to Gerrit, which you can find at http://openocd.zylin.com/4514
-- gerrit commit 9d124af615c6fd76f290b38b30edbd461d826ec3 Author: Jean-Christian de Rivaz <jcamd...@gmail.com> Date: Wed May 2 18:09:51 2018 +0200 Add bank erase commands to lpc2000 flash. Change-Id: Ic6956a598a763f301fa46c87659184459ec77fba Signed-off-by: Jean-Christian de Rivaz <jcamd...@gmail.com> diff --git a/doc/openocd.texi b/doc/openocd.texi index 3944572..ad968a9 100644 --- a/doc/openocd.texi +++ b/doc/openocd.texi @@ -5804,6 +5804,14 @@ flash bank $_FLASHNAME lpc2000 0x0 0x7d000 0 0 $_TARGETNAME \ Displays the four byte part identifier associated with the specified flash @var{bank}. @end deffn + +@deffn {Command} {lpc2000 erase} bank first_sector [last_sector] +Erase a sector or sectors range in the specified flash @var{bank}. +@end deffn + +@deffn {Command} {lpc2000 erase_all_sectors} bank +Erase all soectors in the specified flash @var{bank}. +@end deffn @end deffn @deffn {Flash Driver} lpc288x diff --git a/src/flash/nor/lpc2000.c b/src/flash/nor/lpc2000.c index 8e15c31..872f312 100644 --- a/src/flash/nor/lpc2000.c +++ b/src/flash/nor/lpc2000.c @@ -1545,6 +1545,83 @@ COMMAND_HANDLER(lpc2000_handle_part_id_command) return retval; } +COMMAND_HANDLER(lpc2000_handle_erase_command) +{ + if (CMD_ARGC < 2) + return ERROR_COMMAND_SYNTAX_ERROR; + + struct flash_bank *bank; + int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank); + if (ERROR_OK != retval) + return retval; + int first_sector = 0; + COMMAND_PARSE_NUMBER(int, CMD_ARGV[1], first_sector); + if (!(first_sector >= 0)) { + LOG_ERROR("first sector index (%i) must be greater or equal to 0", first_sector); + return ERROR_COMMAND_SYNTAX_ERROR; + } + if (!(first_sector < bank->num_sectors)) { + LOG_ERROR("first sector index (%i) must be less than the bank number of sectors (%i)", + first_sector, bank->num_sectors); + return ERROR_COMMAND_SYNTAX_ERROR; + } + int last_sector = first_sector; + if (CMD_ARGC == 3) + COMMAND_PARSE_NUMBER(int, CMD_ARGV[2], last_sector); + if (!(last_sector >= 0)) { + LOG_ERROR("last sector index (%i) must be greater or equal to 0", last_sector); + return ERROR_COMMAND_SYNTAX_ERROR; + } + if (!(last_sector < bank->num_sectors)) { + LOG_ERROR("last sector index (%i) must be less than the bank number of sectors (%i)", + last_sector, bank->num_sectors); + return ERROR_COMMAND_SYNTAX_ERROR; + } + + if (bank->target->state != TARGET_HALTED) { + LOG_ERROR("Target not halted"); + return ERROR_TARGET_NOT_HALTED; + } + + int status_code = lpc2000_erase(bank, first_sector, last_sector); + if (status_code != 0x0) { + if (status_code == ERROR_FLASH_OPERATION_FAILED) + command_print(CMD_CTX, "no sufficient working area specified, can't access LPC2000 IAP interface"); + else + command_print(CMD_CTX, "lpc2000 IAP returned status code %i", status_code); + } else + command_print(CMD_CTX, "lpc2000 eased"); + + return retval; +} + +COMMAND_HANDLER(lpc2000_handle_erase_all_sectors_command) +{ + if (CMD_ARGC < 1) + return ERROR_COMMAND_SYNTAX_ERROR; + + struct flash_bank *bank; + int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank); + if (ERROR_OK != retval) + return retval; + + if (bank->target->state != TARGET_HALTED) { + LOG_ERROR("Target not halted"); + return ERROR_TARGET_NOT_HALTED; + } + + int status_code = lpc2000_erase(bank, 0, bank->num_sectors - 1); + if (status_code != 0x0) { + if (status_code == ERROR_FLASH_OPERATION_FAILED) + command_print(CMD_CTX, "no sufficient working area specified, can't access LPC2000 IAP interface"); + else + command_print(CMD_CTX, "lpc2000 IAP returned status code %i", status_code); + } else + command_print(CMD_CTX, "lpc2000 eased"); + + return retval; +} + static const struct command_registration lpc2000_exec_command_handlers[] = { { .name = "part_id", @@ -1553,6 +1630,20 @@ static const struct command_registration lpc2000_exec_command_handlers[] = { .help = "print part id of lpc2000 flash bank <num>", .usage = "<bank>", }, + { + .name = "erase", + .handler = lpc2000_handle_erase_command, + .mode = COMMAND_EXEC, + .help = "erase lpc2000 flash bank <num> sector <index>, or from first sector <index> up to last sector <index>", + .usage = "<bank> <first_sector> [last_sector]", + }, + { + .name = "erase_all_sectors", + .handler = lpc2000_handle_erase_all_sectors_command, + .mode = COMMAND_EXEC, + .help = "erase lpc2000 flash bank <num> sectors", + .usage = "<bank>", + }, COMMAND_REGISTRATION_DONE }; static const struct command_registration lpc2000_command_handlers[] = { -- ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ OpenOCD-devel mailing list OpenOCD-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openocd-devel