aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTarek BOCHKATI <tarek.bouchkati@gmail.com>2021-09-09 22:14:36 +0100
committerTomas Vanek <vanekt@fbl.cz>2021-09-12 14:26:31 +0000
commitb61a280860f9ceb9bc38125c48d2f0f4d35f1c11 (patch)
tree4067b3cef0731ee6b26e46675d4b8d5c9128e586 /src
parentf78f9a90a6c4f8abedbac8a4047631cbe3ea0e17 (diff)
downloadriscv-openocd-b61a280860f9ceb9bc38125c48d2f0f4d35f1c11.zip
riscv-openocd-b61a280860f9ceb9bc38125c48d2f0f4d35f1c11.tar.gz
riscv-openocd-b61a280860f9ceb9bc38125c48d2f0f4d35f1c11.tar.bz2
flash/stm32l4x: fix flash programming in 64-bit hosts
stm32l4_work_area struct is shared between the loader and stm32l4x flash driver '*wp' and '*rp' pointers' size is 4 bytes each since stm32l4x devices have 32-bit processors. however when used in openocd code, their size depends on the host if the host is 32-bit, then the size is 4 bytes each. if the host is 64-bit, then the size is 8 bytes each. to avoid this size difference, change their types depending on the usage (pointers for the loader, and 32-bit integers in openocd code). Change-Id: I0a3df4bb4bf872b01cdb9357eb28307868d7d469 Signed-off-by: Tarek BOCHKATI <tarek.bouchkati@gmail.com> Reviewed-on: https://review.openocd.org/c/openocd/+/6556 Tested-by: jenkins Reviewed-by: Yestin Sun <sunyi0804@gmail.com> Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
Diffstat (limited to 'src')
-rw-r--r--src/flash/nor/stm32l4x.c7
-rw-r--r--src/flash/nor/stm32l4x.h17
2 files changed, 21 insertions, 3 deletions
diff --git a/src/flash/nor/stm32l4x.c b/src/flash/nor/stm32l4x.c
index f76bc45..0182aae 100644
--- a/src/flash/nor/stm32l4x.c
+++ b/src/flash/nor/stm32l4x.c
@@ -1405,16 +1405,19 @@ static int stm32l4_write_block(struct flash_bank *bank, const uint8_t *buffer,
armv7m_info.common_magic = ARMV7M_COMMON_MAGIC;
armv7m_info.core_mode = ARM_MODE_THREAD;
- init_reg_param(&reg_params[0], "r0", 32, PARAM_IN_OUT); /* buffer start, status (out) */
+ /* contrib/loaders/flash/stm32/stm32l4x.c:write() arguments */
+ init_reg_param(&reg_params[0], "r0", 32, PARAM_IN_OUT); /* stm32l4_work_area ptr , status (out) */
init_reg_param(&reg_params[1], "r1", 32, PARAM_OUT); /* buffer end */
init_reg_param(&reg_params[2], "r2", 32, PARAM_OUT); /* target address */
init_reg_param(&reg_params[3], "r3", 32, PARAM_OUT); /* count (of stm32l4_info->data_width) */
- init_reg_param(&reg_params[4], "sp", 32, PARAM_OUT); /* write algo stack pointer */
buf_set_u32(reg_params[0].value, 0, 32, source->address);
buf_set_u32(reg_params[1].value, 0, 32, source->address + source->size);
buf_set_u32(reg_params[2].value, 0, 32, address);
buf_set_u32(reg_params[3].value, 0, 32, count);
+
+ /* write algo stack pointer */
+ init_reg_param(&reg_params[4], "sp", 32, PARAM_OUT);
buf_set_u32(reg_params[4].value, 0, 32, source->address +
offsetof(struct stm32l4_work_area, stack) + LDR_STACK_SIZE);
diff --git a/src/flash/nor/stm32l4x.h b/src/flash/nor/stm32l4x.h
index 4cc50a0..4458c08 100644
--- a/src/flash/nor/stm32l4x.h
+++ b/src/flash/nor/stm32l4x.h
@@ -136,9 +136,24 @@ struct stm32l4_work_area {
} params;
uint8_t stack[LDR_STACK_SIZE];
struct flash_async_algorithm_circbuf {
+ /* note: stm32l4_work_area struct is shared between the loader
+ * and stm32l4x flash driver.
+ *
+ * '*wp' and '*rp' pointers' size is 4 bytes each since stm32l4x
+ * devices have 32-bit processors.
+ * however when used in openocd code, their size depends on the host
+ * if the host is 32-bit, then the size is 4 bytes each.
+ * if the host is 64-bit, then the size is 8 bytes each.
+ * to avoid this size difference, change their types depending on the
+ * usage (pointers for the loader, and 32-bit integers in openocd code).
+ */
+#ifdef OPENOCD_CONTRIB_LOADERS_FLASH_STM32_STM32L4X
uint8_t *wp;
uint8_t *rp;
- uint8_t *buf;
+#else
+ uint32_t wp;
+ uint32_t rp;
+#endif /* OPENOCD_CONTRIB_LOADERS_FLASH_STM32_STM32L4X */
} fifo;
};