Skip to content

Commit 55ea261

Browse files
committed
drivers: flash_stm32_ospi: workaround for corrupted data
this is a workaround for an errata which leads to corrupted data on the first read after exiting stop 2 or 3 Signed-off-by: Martin Gysel <[email protected]>
1 parent f3c6fc4 commit 55ea261

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

drivers/flash/Kconfig.stm32_ospi

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,27 @@ config FLASH_STM32_OSPI
2424
$(DT_STM32_OCTOSPI_HAS_DMA)
2525
help
2626
Enable OSPI-NOR support on the STM32 family of processors.
27+
28+
if FLASH_STM32_OSPI
29+
30+
if SOC_STM32U595XX || SOC_STM32U595XX || SOC_STM32U595XX || SOC_STM32U595XX \
31+
|| SOC_STM32U595XX || SOC_STM32U595XX || SOC_STM32U595XX || SOC_STM32U595XX \
32+
|| SOC_STM32U595XX || SOC_STM32U595XX || SOC_STM32U599XX || SOC_STM32U599XX \
33+
|| SOC_STM32U599XX || SOC_STM32U599XX || SOC_STM32U599XX || SOC_STM32U599XX \
34+
|| SOC_STM32U599XX || SOC_STM32U5A5XX || SOC_STM32U5A5XX || SOC_STM32U5A5XX \
35+
|| SOC_STM32U5A5XX || SOC_STM32U5A5XX || SOC_STM32U5A9XX || SOC_STM32U5A9XX \
36+
|| SOC_STM32U5A9XX || SOC_STM32U5A9XX
37+
38+
config FLASH_STM32U5_ES0553_2_5_13
39+
bool "Workaround for errata 2.5.13 of ES0553"
40+
default y if PM
41+
default n if !PM
42+
help
43+
Handles erratum "OCTOSPI external memory read issue after exiting
44+
Stop 2 or Stop 3 mode when using DQS and delay block."
45+
Seen in Errata Sheet ES0553 §2.5.13 for STM32U5x5/STM32U5x9.
46+
47+
48+
endif # SOC_STM32U5xxxx
49+
50+
endif # FLASH_STM32_OSPI

drivers/flash/flash_stm32_ospi.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,9 @@ struct flash_stm32_ospi_data {
183183
#if STM32_OSPI_USE_DMA
184184
struct stream dma;
185185
#endif /* STM32_OSPI_USE_DMA */
186+
#if CONFIG_FLASH_STM32U5_ES0553_2_5_13
187+
bool errata_u59_2_5_13;
188+
#endif
186189
};
187190

188191

@@ -226,6 +229,18 @@ static int ospi_read_access(const struct device *dev, OSPI_RegularCmdTypeDef *cm
226229
struct flash_stm32_ospi_data *dev_data = dev->data;
227230
HAL_StatusTypeDef hal_ret;
228231

232+
#if CONFIG_FLASH_STM32U5_ES0553_2_5_13
233+
int err;
234+
235+
if (dev_data->errata_u59_2_5_13) {
236+
dev_data->errata_u59_2_5_13 = false;
237+
err = ospi_read_access(dev, cmd, data, 1);
238+
if (err) {
239+
return err;
240+
}
241+
}
242+
#endif
243+
229244
LOG_DBG("Instruction 0x%x", cmd->Instruction);
230245

231246
cmd->NbData = size;
@@ -2692,6 +2707,9 @@ static int flash_stm32_ospi_pm_action(const struct device *dev, enum pm_device_a
26922707

26932708
switch (action) {
26942709
case PM_DEVICE_ACTION_RESUME:
2710+
#if CONFIG_FLASH_STM32U5_ES0553_2_5_13
2711+
dev_data->errata_u59_2_5_13 = true;
2712+
#endif
26952713
err = flash_stm32_ospi_activate(dev);
26962714
break;
26972715
case PM_DEVICE_ACTION_SUSPEND:

0 commit comments

Comments
 (0)