aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSpencer Oliver <spen@spen-soft.co.uk>2013-09-19 12:07:06 +0100
committerSpencer Oliver <spen@spen-soft.co.uk>2013-10-07 19:28:19 +0000
commit1f3ca0b5b81d9f9e4565cf177797a17ad37ef2c3 (patch)
treea5352260d013eb75ee04c864ba2c2ea2c2f6ee56 /src
parent53ca124a754fd0d2bb18fb26ac69c5654c81117d (diff)
downloadriscv-openocd-1f3ca0b5b81d9f9e4565cf177797a17ad37ef2c3.zip
riscv-openocd-1f3ca0b5b81d9f9e4565cf177797a17ad37ef2c3.tar.gz
riscv-openocd-1f3ca0b5b81d9f9e4565cf177797a17ad37ef2c3.tar.bz2
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 <spen@spen-soft.co.uk> Reviewed-on: http://openocd.zylin.com/1635 Tested-by: jenkins
Diffstat (limited to 'src')
-rw-r--r--src/flash/nor/core.c2
-rw-r--r--src/flash/nor/core.h4
-rw-r--r--src/flash/nor/tcl.c27
-rw-r--r--src/flash/nor/virtual.c1
4 files changed, 32 insertions, 2 deletions
diff --git a/src/flash/nor/core.c b/src/flash/nor/core.c
index 21ea05d..e61b303 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 07b095f..726dd95 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 788d050..5bc0958 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 45738ed..fab521d 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;
}