From 1f3ca0b5b81d9f9e4565cf177797a17ad37ef2c3 Mon Sep 17 00:00:00 2001 From: Spencer Oliver Date: Thu, 19 Sep 2013 12:07:06 +0100 Subject: [PATCH] flash: add padded_value cmd This adds support for setting the default value used when padding image sections. Previously 0xff was used but some targets have an erased value of 0x00. Change-Id: If3df6fea3abf95b09daa3ff7be362acf991070ce Signed-off-by: Spencer Oliver Reviewed-on: http://openocd.zylin.com/1635 Tested-by: jenkins --- doc/openocd.texi | 6 ++++++ src/flash/nor/core.c | 2 +- src/flash/nor/core.h | 4 ++++ src/flash/nor/tcl.c | 27 ++++++++++++++++++++++++++- src/flash/nor/virtual.c | 1 + 5 files changed, 38 insertions(+), 2 deletions(-) diff --git a/doc/openocd.texi b/doc/openocd.texi index 003ec4ff6..a2bcaf850 100644 --- a/doc/openocd.texi +++ b/doc/openocd.texi @@ -4862,6 +4862,12 @@ specifies "to the end of the flash bank". The @var{num} parameter is a value shown by @command{flash banks}. @end deffn +@deffn Command {flash padded_value} num value +Sets the default value used for padding any image sections, This should +normally match the flash bank erased value. If not specified by this +comamnd or the flash driver then it defaults to 0xff. +@end deffn + @anchor{program} @deffn Command {program} filename [verify] [reset] [offset] This is a helper script that simplifies using OpenOCD as a standalone diff --git a/src/flash/nor/core.c b/src/flash/nor/core.c index 21ea05d33..e61b30326 100644 --- a/src/flash/nor/core.c +++ b/src/flash/nor/core.c @@ -710,7 +710,7 @@ int flash_write_unlock(struct target *target, struct image *image, /* see if we need to pad the section */ while (padding[section]--) - (buffer + buffer_size)[size_read++] = 0xff; + (buffer + buffer_size)[size_read++] = c->default_padded_value; buffer_size += size_read; section_offset += size_read; diff --git a/src/flash/nor/core.h b/src/flash/nor/core.h index 07b095f9b..726dd957e 100644 --- a/src/flash/nor/core.h +++ b/src/flash/nor/core.h @@ -87,6 +87,10 @@ struct flash_bank { int chip_width; /**< Width of the chip in bytes (1,2,4 bytes) */ int bus_width; /**< Maximum bus width, in bytes (1,2,4 bytes) */ + /** Default padded value used, normally this matches the flash + * erased value. Defaults to 0xFF. */ + uint8_t default_padded_value; + /** * The number of sectors on this chip. This value will * be set intially to 0, and the flash driver must set this to diff --git a/src/flash/nor/tcl.c b/src/flash/nor/tcl.c index 788d050b9..5bc0958be 100644 --- a/src/flash/nor/tcl.c +++ b/src/flash/nor/tcl.c @@ -605,6 +605,24 @@ void flash_set_dirty(void) } } +COMMAND_HANDLER(handle_flash_padded_value_command) +{ + if (CMD_ARGC != 2) + return ERROR_COMMAND_SYNTAX_ERROR; + + struct flash_bank *p; + int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &p); + if (ERROR_OK != retval) + return retval; + + COMMAND_PARSE_NUMBER(u8, CMD_ARGV[1], p->default_padded_value); + + command_print(CMD_CTX, "Default padded value set to 0x%" PRIx8 " for flash bank %u", \ + p->default_padded_value, p->bank_number); + + return retval; +} + static const struct command_registration flash_exec_command_handlers[] = { { .name = "probe", @@ -700,6 +718,13 @@ static const struct command_registration flash_exec_command_handlers[] = { .help = "Turn protection on or off for a range of sectors " "in a given flash bank.", }, + { + .name = "padded_value", + .handler = handle_flash_padded_value_command, + .mode = COMMAND_EXEC, + .usage = "bank_id value", + .help = "Set default flash padded value", + }, COMMAND_REGISTRATION_DONE }; @@ -712,7 +737,6 @@ static int flash_init_drivers(struct command_context *cmd_ctx) return register_commands(cmd_ctx, parent, flash_exec_command_handlers); } - COMMAND_HANDLER(handle_flash_bank_command) { if (CMD_ARGC < 7) { @@ -765,6 +789,7 @@ COMMAND_HANDLER(handle_flash_bank_command) COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], c->size); COMMAND_PARSE_NUMBER(int, CMD_ARGV[3], c->chip_width); COMMAND_PARSE_NUMBER(int, CMD_ARGV[4], c->bus_width); + c->default_padded_value = 0xff; c->num_sectors = 0; c->sectors = NULL; c->next = NULL; diff --git a/src/flash/nor/virtual.c b/src/flash/nor/virtual.c index 45738ed42..fab521dd6 100644 --- a/src/flash/nor/virtual.c +++ b/src/flash/nor/virtual.c @@ -46,6 +46,7 @@ static void virtual_update_bank_info(struct flash_bank *bank) bank->size = master_bank->size; bank->chip_width = master_bank->chip_width; bank->bus_width = master_bank->bus_width; + bank->default_padded_value = master_bank->default_padded_value; bank->num_sectors = master_bank->num_sectors; bank->sectors = master_bank->sectors; }