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>
This commit is contained in:
Tomas Vanek 2019-12-14 16:08:32 +01:00
parent 634e09f4e7
commit c2cb4e40b8
1 changed files with 8 additions and 19 deletions

View File

@ -278,6 +278,10 @@ FLASH_BANK_COMMAND_HANDLER(stm32l4_flash_bank_command)
return ERROR_FAIL; /* Checkme: What better error to use?*/ return ERROR_FAIL; /* Checkme: What better error to use?*/
bank->driver_priv = stm32l4_info; 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; stm32l4_info->probed = 0;
return ERROR_OK; return ERROR_OK;
@ -679,30 +683,15 @@ static int stm32l4_write(struct flash_bank *bank, const uint8_t *buffer,
return ERROR_TARGET_NOT_HALTED; return ERROR_TARGET_NOT_HALTED;
} }
if (offset & 0x7) { /* The flash write must be aligned to a double word (8-bytes) boundary.
LOG_WARNING("offset 0x%" PRIx32 " breaks required 8-byte alignment", * The flash infrastructure ensures it, do just a security check */
offset); assert(offset % 8 == 0);
return ERROR_FLASH_DST_BREAKS_ALIGNMENT; assert(count % 8 == 0);
}
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!
*/
}
retval = stm32l4_unlock_reg(bank); retval = stm32l4_unlock_reg(bank);
if (retval != ERROR_OK) if (retval != ERROR_OK)
return retval; return retval;
/* Only full double words (8-byte) can be programmed*/
retval = stm32l4_write_block(bank, buffer, offset, count / 2); retval = stm32l4_write_block(bank, buffer, offset, count / 2);
if (retval != ERROR_OK) { if (retval != ERROR_OK) {
LOG_WARNING("block write failed"); LOG_WARNING("block write failed");