aboutsummaryrefslogtreecommitdiff
path: root/src/flash/nor/stmsmi.c
diff options
context:
space:
mode:
authorAndreas Bolsch <hyphen0break@gmail.com>2018-11-18 17:08:20 +0100
committerTomas Vanek <vanekt@fbl.cz>2018-11-29 08:18:24 +0000
commit42f1cc576ab9b503fadd0b8916a139cd0bc6563e (patch)
tree36e12a90f1764f97aee55f223df29f318c5bdfda /src/flash/nor/stmsmi.c
parenteb8dfd5ca8af6f2d784f6b1d30c96b40c52ae0ce (diff)
downloadriscv-openocd-42f1cc576ab9b503fadd0b8916a139cd0bc6563e.zip
riscv-openocd-42f1cc576ab9b503fadd0b8916a139cd0bc6563e.tar.gz
riscv-openocd-42f1cc576ab9b503fadd0b8916a139cd0bc6563e.tar.bz2
SPI table updates (some new devices and new info)
read_cmd, qread_cmd, pprog_cmd added as some recent high densities devices use variants for 4-byte addressing. Some new flash and FRAM device ids added. FRAMs don't have write pages nor erase commands or sector sizes. The corresponding entries are marked as "not used" (i. e. zero). Checks in existing SPI flash drivers added to handle these cases gracefully. Change-Id: I5104bce7c815ac22f98bc32c1bb6db66b984404a Signed-off-by: Andreas Bolsch <hyphen0break@gmail.com> Reviewed-on: http://openocd.zylin.com/4773 Tested-by: jenkins Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
Diffstat (limited to 'src/flash/nor/stmsmi.c')
-rw-r--r--src/flash/nor/stmsmi.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/src/flash/nor/stmsmi.c b/src/flash/nor/stmsmi.c
index c839bf7..9225610 100644
--- a/src/flash/nor/stmsmi.c
+++ b/src/flash/nor/stmsmi.c
@@ -348,6 +348,9 @@ static int stmsmi_erase(struct flash_bank *bank, int first, int last)
}
}
+ if (stmsmi_info->dev->erase_cmd == 0x00)
+ return ERROR_FLASH_OPER_UNSUPPORTED;
+
for (sector = first; sector <= last; sector++) {
retval = smi_erase_sector(bank, sector);
if (retval != ERROR_OK)
@@ -431,7 +434,9 @@ static int stmsmi_write(struct flash_bank *bank, const uint8_t *buffer,
}
}
- page_size = stmsmi_info->dev->pagesize;
+ /* if no valid page_size, use reasonable default */
+ page_size = stmsmi_info->dev->pagesize ?
+ stmsmi_info->dev->pagesize : SPIFLASH_DEF_PAGESIZE;
/* unaligned buffer head */
if (count > 0 && (offset & 3) != 0) {
@@ -524,7 +529,7 @@ static int stmsmi_probe(struct flash_bank *bank)
{
struct target *target = bank->target;
struct stmsmi_flash_bank *stmsmi_info = bank->driver_priv;
- uint32_t io_base;
+ uint32_t io_base, sectorsize;
struct flash_sector *sectors;
uint32_t id = 0; /* silence uninitialized warning */
const struct stmsmi_target *target_device;
@@ -589,10 +594,18 @@ static int stmsmi_probe(struct flash_bank *bank)
/* Set correct size value */
bank->size = stmsmi_info->dev->size_in_bytes;
+ if (bank->size <= (1UL << 16))
+ LOG_WARNING("device needs 2-byte addresses - not implemented");
+ if (bank->size > (1UL << 24))
+ LOG_WARNING("device needs paging or 4-byte addresses - not implemented");
+
+ /* if no sectors, treat whole bank as single sector */
+ sectorsize = stmsmi_info->dev->sectorsize ?
+ stmsmi_info->dev->sectorsize : stmsmi_info->dev->size_in_bytes;
/* create and fill sectors array */
bank->num_sectors =
- stmsmi_info->dev->size_in_bytes / stmsmi_info->dev->sectorsize;
+ stmsmi_info->dev->size_in_bytes / sectorsize;
sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors);
if (sectors == NULL) {
LOG_ERROR("not enough memory");
@@ -600,8 +613,8 @@ static int stmsmi_probe(struct flash_bank *bank)
}
for (int sector = 0; sector < bank->num_sectors; sector++) {
- sectors[sector].offset = sector * stmsmi_info->dev->sectorsize;
- sectors[sector].size = stmsmi_info->dev->sectorsize;
+ sectors[sector].offset = sector * sectorsize;
+ sectors[sector].size = sectorsize;
sectors[sector].is_erased = -1;
sectors[sector].is_protected = 1;
}