aboutsummaryrefslogtreecommitdiff
path: root/src/flash/nor/fm4.c
diff options
context:
space:
mode:
authorAndreas Färber <afaerber@suse.de>2015-12-06 19:43:52 +0100
committerAndreas Fritiofson <andreas.fritiofson@gmail.com>2016-02-29 20:15:52 +0000
commitf0682623ca4b26f07ce0313b8246709b8e634323 (patch)
treeda6d1f31b2d72e1e0a717e04207db4fd333c659c /src/flash/nor/fm4.c
parentf2b3a8b0e88adccea9b2c4ad8eba322973051d03 (diff)
downloadriscv-openocd-f0682623ca4b26f07ce0313b8246709b8e634323.zip
riscv-openocd-f0682623ca4b26f07ce0313b8246709b8e634323.tar.gz
riscv-openocd-f0682623ca4b26f07ce0313b8246709b8e634323.tar.bz2
fm4: Add support for S6E2DH family
Add support for S6E2DH MainFlash. VFlash is not implemented. Briefly tested with SK-FM4-176L-S6E2DH V110 board. Change-Id: If7c523d8c75307bc1494bbf4cca3eed0272e8e01 Signed-off-by: Andreas Färber <afaerber@suse.de> Reviewed-on: http://openocd.zylin.com/3158 Tested-by: jenkins Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
Diffstat (limited to 'src/flash/nor/fm4.c')
-rw-r--r--src/flash/nor/fm4.c40
1 files changed, 39 insertions, 1 deletions
diff --git a/src/flash/nor/fm4.c b/src/flash/nor/fm4.c
index 0f8de8c..2590d5f 100644
--- a/src/flash/nor/fm4.c
+++ b/src/flash/nor/fm4.c
@@ -3,6 +3,7 @@
*
* Copyright (c) 2015 Andreas Färber
*
+ * Based on S6E2DH_MN709-00013 for S6E2DH/DF/D5/D3 series
* Based on S6E2CC_MN709-00007 for S6E2CC/C5/C4/C3/C2/C1 series
* Based on MB9B560R_MN709-00005 for MB9BFx66/x67/x68 series
* Based on MB9B560L_MN709-00006 for MB9BFx64/x65/x66 series
@@ -36,6 +37,8 @@ enum fm4_variant {
s6e2cx8,
s6e2cx9,
s6e2cxa,
+
+ s6e2dx,
};
struct fm4_flash_bank {
@@ -458,6 +461,32 @@ static int s6e2cc_probe(struct flash_bank *bank)
return ERROR_OK;
}
+static int s6e2dh_probe(struct flash_bank *bank)
+{
+ uint32_t flash_addr = bank->base;
+ int i;
+
+ bank->num_sectors = 10;
+ bank->sectors = calloc(bank->num_sectors,
+ sizeof(struct flash_sector));
+ for (i = 0; i < bank->num_sectors; i++) {
+ if (i < 4)
+ bank->sectors[i].size = 8 * 1024;
+ else if (i == 4)
+ bank->sectors[i].size = 32 * 1024;
+ else
+ bank->sectors[i].size = 64 * 1024;
+ bank->sectors[i].offset = flash_addr - bank->base;
+ bank->sectors[i].is_erased = -1;
+ bank->sectors[i].is_protected = -1;
+
+ bank->size += bank->sectors[i].size;
+ flash_addr += bank->sectors[i].size;
+ }
+
+ return ERROR_OK;
+}
+
static int fm4_probe(struct flash_bank *bank)
{
struct fm4_flash_bank *fm4_bank = bank->driver_priv;
@@ -484,6 +513,9 @@ static int fm4_probe(struct flash_bank *bank)
case s6e2cxa:
retval = s6e2cc_probe(bank);
break;
+ case s6e2dx:
+ retval = s6e2dh_probe(bank);
+ break;
default:
return ERROR_FLASH_OPER_UNSUPPORTED;
}
@@ -545,6 +577,9 @@ static int fm4_get_info_command(struct flash_bank *bank, char *buf, int buf_size
case s6e2cxa:
name = "S6E2CxA";
break;
+ case s6e2dx:
+ name = "S6E2Dx";
+ break;
default:
name = "unknown";
break;
@@ -645,7 +680,10 @@ FLASH_BANK_COMMAND_HANDLER(fm4_flash_bank_command)
ret = mb9bf_bank_setup(bank, variant);
else if (fm4_name_match(variant, "S6E2Cx"))
ret = s6e2cc_bank_setup(bank, variant);
- else {
+ else if (fm4_name_match(variant, "S6E2Dx")) {
+ fm4_bank->variant = s6e2dx;
+ ret = ERROR_OK;
+ } else {
LOG_WARNING("Family %s not recognized.", variant);
ret = ERROR_FLASH_OPER_UNSUPPORTED;
}