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

Reply via email to