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:
parent
634e09f4e7
commit
c2cb4e40b8
|
@ -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");
|
||||
|
|
Loading…
Reference in New Issue