aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTomas Vanek <vanekt@fbl.cz>2019-12-14 16:08:32 +0100
committerTomas Vanek <vanekt@fbl.cz>2020-01-27 16:59:57 +0000
commitc2cb4e40b80783a56d991e1e970a9fde5887551a (patch)
tree25b4992c40d92e3efb1b3642e3289afc9844b5d1 /src
parent634e09f4e7da02a3813ac98b77bc2a4f047debbc (diff)
downloadriscv-openocd-c2cb4e40b80783a56d991e1e970a9fde5887551a.zip
riscv-openocd-c2cb4e40b80783a56d991e1e970a9fde5887551a.tar.gz
riscv-openocd-c2cb4e40b80783a56d991e1e970a9fde5887551a.tar.bz2
flash/nor/stm32l4x: use flash infrastructure to align write
The original code paded the write chunk with random bytes by overrunning the buffer. An user can easily regard the random bytes to be a programming error. Change-Id: Ib0f47b5bc406bc6a7c32f3d929bf324a17c7c1e1 Signed-off-by: Tomas Vanek <vanekt@fbl.cz> Reviewed-on: http://openocd.zylin.com/5359 Tested-by: jenkins Reviewed-by: Tarek BOCHKATI <tarek.bouchkati@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/flash/nor/stm32l4x.c27
1 files changed, 8 insertions, 19 deletions
diff --git a/src/flash/nor/stm32l4x.c b/src/flash/nor/stm32l4x.c
index 3d15377..1b54193 100644
--- a/src/flash/nor/stm32l4x.c
+++ b/src/flash/nor/stm32l4x.c
@@ -278,6 +278,10 @@ FLASH_BANK_COMMAND_HANDLER(stm32l4_flash_bank_command)
return ERROR_FAIL; /* Checkme: What better error to use?*/
bank->driver_priv = stm32l4_info;
+ /* The flash write must be aligned to a double word (8-bytes) boundary.
+ * Ask the flash infrastructure to ensure required alignment */
+ bank->write_start_alignment = bank->write_end_alignment = 8;
+
stm32l4_info->probed = 0;
return ERROR_OK;
@@ -679,30 +683,15 @@ static int stm32l4_write(struct flash_bank *bank, const uint8_t *buffer,
return ERROR_TARGET_NOT_HALTED;
}
- if (offset & 0x7) {
- LOG_WARNING("offset 0x%" PRIx32 " breaks required 8-byte alignment",
- offset);
- return ERROR_FLASH_DST_BREAKS_ALIGNMENT;
- }
-
- if (count & 0x7) {
- LOG_WARNING("Padding %d bytes to keep 8-byte write size",
- count & 7);
- count = (count + 7) & ~7;
- /* This pads the write chunk with random bytes by overrunning the
- * write buffer. Padding with the erased pattern 0xff is purely
- * cosmetical, as 8-byte flash words are ECC secured and the first
- * write will program the ECC bits. A second write would need
- * to reprogramm these ECC bits.
- * But this can only be done after erase!
- */
- }
+ /* The flash write must be aligned to a double word (8-bytes) boundary.
+ * The flash infrastructure ensures it, do just a security check */
+ assert(offset % 8 == 0);
+ assert(count % 8 == 0);
retval = stm32l4_unlock_reg(bank);
if (retval != ERROR_OK)
return retval;
- /* Only full double words (8-byte) can be programmed*/
retval = stm32l4_write_block(bank, buffer, offset, count / 2);
if (retval != ERROR_OK) {
LOG_WARNING("block write failed");