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?*/
|
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");
|
||||||
|
|
Loading…
Reference in New Issue