summaryrefslogtreecommitdiff
path: root/src/flash
diff options
context:
space:
mode:
authorSpencer Oliver <ntfreak@users.sourceforge.net>2010-12-08 17:07:08 +0000
committerSpencer Oliver <ntfreak@users.sourceforge.net>2010-12-10 13:36:09 +0000
commit26ba6ea51113ddf2e2962f5f6edabe56fd532eb5 (patch)
treef213214b9c93c87daf9342bfb26e61d59843c3a4 /src/flash
parentfe4fe623d540993d9769615a8631c732b5f3c9ea (diff)
downloadopenocd+libswd-26ba6ea51113ddf2e2962f5f6edabe56fd532eb5.tar.gz
openocd+libswd-26ba6ea51113ddf2e2962f5f6edabe56fd532eb5.tar.bz2
openocd+libswd-26ba6ea51113ddf2e2962f5f6edabe56fd532eb5.tar.xz
openocd+libswd-26ba6ea51113ddf2e2962f5f6edabe56fd532eb5.zip
cfi: allow optional buffer write support
Some flash's do not support buffer writes, so we now check they are supported before trying to use them. Signed-off-by: Spencer Oliver <ntfreak@users.sourceforge.net>
Diffstat (limited to 'src/flash')
-rw-r--r--src/flash/common.h5
-rw-r--r--src/flash/nor/cfi.c9
2 files changed, 12 insertions, 2 deletions
diff --git a/src/flash/common.h b/src/flash/common.h
index c78f24ce..528b9cf7 100644
--- a/src/flash/common.h
+++ b/src/flash/common.h
@@ -25,9 +25,9 @@
* Parses the optional '.index' portion of a flash bank identifier.
* @param name The desired driver name, passed by the user.
* @returns The parsed index request, or 0 if not present. If the
- * name provides a suffix but it does not parse as an unsigned integer,
+ * name provides a suffix but it does not parse as an unsigned integer,
* the routine returns ~0U. This will prevent further matching.
- */
+ */
unsigned get_flash_name_index(const char *name);
/**
* Attempt to match the @c expected name with the @c name of a driver.
@@ -44,5 +44,6 @@ bool flash_driver_name_matches(const char *name, const char *expected);
#define ERROR_FLASH_BUSY (-905)
#define ERROR_FLASH_SECTOR_NOT_ERASED (-906)
#define ERROR_FLASH_BANK_NOT_PROBED (-907)
+#define ERROR_FLASH_OPER_UNSUPPORTED (-908)
#endif // FLASH_COMMON_H
diff --git a/src/flash/nor/cfi.c b/src/flash/nor/cfi.c
index 7f2d0a5b..09caa2eb 100644
--- a/src/flash/nor/cfi.c
+++ b/src/flash/nor/cfi.c
@@ -2051,6 +2051,13 @@ static int cfi_write_words(struct flash_bank *bank, uint8_t *word,
{
struct cfi_flash_bank *cfi_info = bank->driver_priv;
+ if (cfi_info->buf_write_timeout_typ == 0)
+ {
+ /* buffer writes are not supported */
+ LOG_DEBUG("Buffer Writes Not Supported");
+ return ERROR_FLASH_OPER_UNSUPPORTED;
+ }
+
switch (cfi_info->pri_id)
{
case 1:
@@ -2241,6 +2248,8 @@ static int cfi_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset,
count -= buffersize;
fallback = 0;
}
+ else if (retval != ERROR_FLASH_OPER_UNSUPPORTED)
+ return retval;
}
/* try the slow way? */
if (fallback)