FUTURE_SEQUANA: Fix flash_api bug introduced with e16d2d81d9

PDL Flash API requires that the data buffer is 32-bit aligned, otherwise
programming can hung. Buffer declared as uint8_t array is not always
properly aligned, e.g. with gcc 6 when -Os option is used.
pull/10469/head
Leszek Rusinowicz 2019-04-16 11:20:11 +02:00 committed by adbridge
parent 4d6dc137cf
commit 5118cdf887
1 changed files with 2 additions and 2 deletions

View File

@ -48,7 +48,7 @@ int32_t flash_program_page(flash_t *obj, uint32_t address, const uint8_t *data,
{ {
(void)(obj); (void)(obj);
int32_t status = 0; int32_t status = 0;
static uint8_t prog_buf[CY_FLASH_SIZEOF_ROW]; static uint32_t prog_buf[CY_FLASH_SIZEOF_ROW / sizeof(uint32_t)];
while (size) { while (size) {
uint32_t offset = address % CY_FLASH_SIZEOF_ROW; uint32_t offset = address % CY_FLASH_SIZEOF_ROW;
uint32_t chunk_size; uint32_t chunk_size;
@ -59,7 +59,7 @@ int32_t flash_program_page(flash_t *obj, uint32_t address, const uint8_t *data,
} }
uint32_t row_address = address / CY_FLASH_SIZEOF_ROW * CY_FLASH_SIZEOF_ROW; uint32_t row_address = address / CY_FLASH_SIZEOF_ROW * CY_FLASH_SIZEOF_ROW;
memcpy(prog_buf, (const void *)row_address, CY_FLASH_SIZEOF_ROW); memcpy(prog_buf, (const void *)row_address, CY_FLASH_SIZEOF_ROW);
memcpy(prog_buf + offset, data, chunk_size); memcpy((uint8_t *)prog_buf + offset, data, chunk_size);
if (Cy_Flash_ProgramRow(row_address, (const uint32_t *)prog_buf) != CY_FLASH_DRV_SUCCESS) { if (Cy_Flash_ProgramRow(row_address, (const uint32_t *)prog_buf) != CY_FLASH_DRV_SUCCESS) {
status = -1; status = -1;