diff options
author | Spencer Oliver <ntfreak@users.sourceforge.net> | 2010-12-08 17:07:08 +0000 |
---|---|---|
committer | Spencer Oliver <ntfreak@users.sourceforge.net> | 2010-12-10 13:36:09 +0000 |
commit | 26ba6ea51113ddf2e2962f5f6edabe56fd532eb5 (patch) | |
tree | f213214b9c93c87daf9342bfb26e61d59843c3a4 | |
parent | fe4fe623d540993d9769615a8631c732b5f3c9ea (diff) | |
download | openocd+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>
-rw-r--r-- | src/flash/common.h | 5 | ||||
-rw-r--r-- | src/flash/nor/cfi.c | 9 |
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) |