Quite useful to be able to unlock the flash, just like in
the flash write_image cmd.
Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
@itemize @bullet
@item Copyright @copyright{} 2008 The OpenOCD Project
@item Copyright @copyright{} 2007-2008 Spencer Oliver @email{spen@@spen-soft.co.uk}
@itemize @bullet
@item Copyright @copyright{} 2008 The OpenOCD Project
@item Copyright @copyright{} 2007-2008 Spencer Oliver @email{spen@@spen-soft.co.uk}
-@item Copyright @copyright{} 2008 Oyvind Harboe @email{oyvind.harboe@@zylin.com}
+@item Copyright @copyright{} 2008-2010 Oyvind Harboe @email{oyvind.harboe@@zylin.com}
@item Copyright @copyright{} 2008 Duane Ellis @email{openocd@@duaneellis.com}
@item Copyright @copyright{} 2009-2010 David Brownell
@end itemize
@item Copyright @copyright{} 2008 Duane Ellis @email{openocd@@duaneellis.com}
@item Copyright @copyright{} 2009-2010 David Brownell
@end itemize
The @var{num} parameter is a value shown by @command{flash banks}.
@end deffn
The @var{num} parameter is a value shown by @command{flash banks}.
@end deffn
-@deffn Command {flash erase_address} [@option{pad}] address length
+@deffn Command {flash erase_address} [@option{pad}] [@option{unlock}] address length
Erase sectors starting at @var{address} for @var{length} bytes.
Unless @option{pad} is specified, @math{address} must begin a
flash sector, and @math{address + length - 1} must end a sector.
Erase sectors starting at @var{address} for @var{length} bytes.
Unless @option{pad} is specified, @math{address} must begin a
flash sector, and @math{address + length - 1} must end a sector.
the specified length must stay within that bank.
As a special case, when @var{length} is zero and @var{address} is
the start of the bank, the whole flash is erased.
the specified length must stay within that bank.
As a special case, when @var{length} is zero and @var{address} is
the start of the bank, the whole flash is erased.
+If @option{unlock} is specified, then the flash is unprotected
+before erase starts.
@end deffn
@deffn Command {flash fillw} address word length
@end deffn
@deffn Command {flash fillw} address word length
return flash_driver_protect(bank, 0, first, last);
}
return flash_driver_protect(bank, 0, first, last);
}
-static int flash_unlock_address_range(struct target *target, uint32_t addr, uint32_t length)
+int flash_unlock_address_range(struct target *target, uint32_t addr, uint32_t length)
{
/* By default, pad to sector boundaries ... the real issue here
* is that our (only) caller *permanently* removes protection,
{
/* By default, pad to sector boundaries ... the real issue here
* is that our (only) caller *permanently* removes protection,
int flash_erase_address_range(struct target *target,
bool pad, uint32_t addr, uint32_t length);
int flash_erase_address_range(struct target *target,
bool pad, uint32_t addr, uint32_t length);
+int flash_unlock_address_range(struct target *target, uint32_t addr,
+ uint32_t length);
+
/**
* Writes @a image into the @a target flash. The @a written parameter
* will contain the
/**
* Writes @a image into the @a target flash. The @a written parameter
* will contain the
COMMAND_HANDLER(handle_flash_erase_address_command)
{
struct flash_bank *p;
COMMAND_HANDLER(handle_flash_erase_address_command)
{
struct flash_bank *p;
int address;
int length;
bool do_pad = false;
int address;
int length;
bool do_pad = false;
+ bool do_unlock = false;
struct target *target = get_current_target(CMD_CTX);
struct target *target = get_current_target(CMD_CTX);
- switch (CMD_ARGC) {
- case 3:
+ while (CMD_ARGC >= 3)
+ {
/* Optionally pad out the address range to block/sector
* boundaries. We can't know if there's data in that part
* of the flash; only do padding if we're told to.
*/
/* Optionally pad out the address range to block/sector
* boundaries. We can't know if there's data in that part
* of the flash; only do padding if we're told to.
*/
- if (strcmp("pad", CMD_ARGV[0]) != 0)
+ if (strcmp("pad", CMD_ARGV[0]) == 0)
+ {
+ do_pad = true;
+ } else if (strcmp("unlock", CMD_ARGV[0]) == 0)
+ {
+ do_unlock = true;
+ } else
+ {
return ERROR_COMMAND_SYNTAX_ERROR;
return ERROR_COMMAND_SYNTAX_ERROR;
- /* FALL THROUGH */
- case 2:
- COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], address);
- COMMAND_PARSE_NUMBER(int, CMD_ARGV[1], length);
- break;
- default:
+ }
+ if (CMD_ARGC != 2)
+ {
return ERROR_COMMAND_SYNTAX_ERROR;
}
return ERROR_COMMAND_SYNTAX_ERROR;
}
+ COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], address);
+ COMMAND_PARSE_NUMBER(int, CMD_ARGV[1], length);
+
if (length <= 0)
{
command_print(CMD_CTX, "Length must be >0");
if (length <= 0)
{
command_print(CMD_CTX, "Length must be >0");
struct duration bench;
duration_start(&bench);
struct duration bench;
duration_start(&bench);
- retval = flash_erase_address_range(target, do_pad, address, length);
+ if (do_unlock)
+ {
+ retval = flash_unlock_address_range(target, address, length);
+ }
+
+ if (retval == ERROR_OK)
+ {
+ retval = flash_erase_address_range(target, do_pad, address, length);
+ }
if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK))
{
if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK))
{
.name = "erase_address",
.handler = handle_flash_erase_address_command,
.mode = COMMAND_EXEC,
.name = "erase_address",
.handler = handle_flash_erase_address_command,
.mode = COMMAND_EXEC,
- .usage = "['pad'] address length",
+ .usage = "['pad'] ['unlock'] address length",
.help = "Erase flash sectors starting at address and "
"continuing for length bytes. If 'pad' is specified, "
"data outside that range may also be erased: the start "
"address may be decreased, and length increased, so "
.help = "Erase flash sectors starting at address and "
"continuing for length bytes. If 'pad' is specified, "
"data outside that range may also be erased: the start "
"address may be decreased, and length increased, so "
- "that all of the first and last sectors are erased.",
+ "that all of the first and last sectors are erased. "
+ "If 'unlock' is specified, then the flash is unprotected "
+ "before erasing.",
+
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)