Skip to content

Commit 365ff6d

Browse files
ikmdanigalak
authored andcommitted
drivers/flash: stm32l5: Adding flash driver for stm32l5x series
This commit adds flash driver in non-secure mode for stm32l5x series with icache enabled. This commit also adds a flash programming error status check applicable for all platforms except stm32f1 series. Signed-off-by: Krishna Mohan Dani <[email protected]>
1 parent ba644c3 commit 365ff6d

File tree

4 files changed

+423
-6
lines changed

4 files changed

+423
-6
lines changed

drivers/flash/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ if(CONFIG_SOC_FLASH_STM32)
4343
zephyr_sources_ifdef(CONFIG_SOC_SERIES_STM32F4X flash_stm32f4x.c)
4444
zephyr_sources_ifdef(CONFIG_SOC_SERIES_STM32F7X flash_stm32f7x.c)
4545
zephyr_sources_ifdef(CONFIG_SOC_SERIES_STM32L4X flash_stm32l4x.c)
46+
zephyr_sources_ifdef(CONFIG_SOC_SERIES_STM32L5X flash_stm32l5x.c)
4647
zephyr_sources_ifdef(CONFIG_SOC_SERIES_STM32WLX flash_stm32l4x.c)
4748
zephyr_sources_ifdef(CONFIG_SOC_SERIES_STM32WBX flash_stm32wbx.c)
4849
zephyr_sources_ifdef(CONFIG_SOC_SERIES_STM32G0X flash_stm32g0x.c)

drivers/flash/Kconfig.stm32

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
config SOC_FLASH_STM32
88
bool "STM32 flash driver"
99
depends on SOC_FAMILY_STM32
10-
depends on (SOC_SERIES_STM32F0X || SOC_SERIES_STM32F1X || SOC_SERIES_STM32F2X || SOC_SERIES_STM32F3X || SOC_SERIES_STM32F4X || SOC_SERIES_STM32F7X || SOC_SERIES_STM32L0X || SOC_SERIES_STM32L1X || SOC_SERIES_STM32L4X || SOC_SERIES_STM32WBX || SOC_SERIES_STM32WLX || SOC_SERIES_STM32G0X || SOC_SERIES_STM32G4X || SOC_SERIES_STM32H7X)
10+
depends on (SOC_SERIES_STM32F0X || SOC_SERIES_STM32F1X || SOC_SERIES_STM32F2X || SOC_SERIES_STM32F3X || SOC_SERIES_STM32F4X || SOC_SERIES_STM32F7X || SOC_SERIES_STM32L0X || SOC_SERIES_STM32L1X || SOC_SERIES_STM32L4X || SOC_SERIES_STM32L5X || SOC_SERIES_STM32WBX || SOC_SERIES_STM32WLX || SOC_SERIES_STM32G0X || SOC_SERIES_STM32G4X || SOC_SERIES_STM32H7X)
1111
select FLASH_HAS_DRIVER_ENABLED
1212
default y
1313
select SOC_FLASH_STM32_V1 if SOC_SERIES_STM32F0X
@@ -20,6 +20,7 @@ config SOC_FLASH_STM32
2020
select FLASH_PAGE_LAYOUT if SOC_SERIES_STM32F4X
2121
select FLASH_PAGE_LAYOUT if SOC_SERIES_STM32F7X
2222
select FLASH_PAGE_LAYOUT if SOC_SERIES_STM32L4X
23+
select FLASH_PAGE_LAYOUT if SOC_SERIES_STM32L5X
2324
select FLASH_PAGE_LAYOUT if SOC_SERIES_STM32WBX
2425
select FLASH_PAGE_LAYOUT if SOC_SERIES_STM32WLX
2526
select FLASH_PAGE_LAYOUT if SOC_SERIES_STM32G4X
@@ -29,15 +30,16 @@ config SOC_FLASH_STM32
2930
select FLASH_HAS_PAGE_LAYOUT if SOC_SERIES_STM32F4X
3031
select FLASH_HAS_PAGE_LAYOUT if SOC_SERIES_STM32F7X
3132
select FLASH_HAS_PAGE_LAYOUT if SOC_SERIES_STM32L4X
33+
select FLASH_HAS_PAGE_LAYOUT if SOC_SERIES_STM32L5X
3234
select FLASH_HAS_PAGE_LAYOUT if SOC_SERIES_STM32WBX
3335
select FLASH_HAS_PAGE_LAYOUT if SOC_SERIES_STM32WLX
3436
select FLASH_HAS_PAGE_LAYOUT if SOC_SERIES_STM32G4X
3537
select FLASH_HAS_PAGE_LAYOUT if SOC_SERIES_STM32H7X
3638
select MPU_ALLOW_FLASH_WRITE if ARM_MPU
3739
help
3840
Enable STM32F0x, STM32F1x, STM32F2x, STM32F3x, STM32F4x, STM32F7x,
39-
STM32L0x, STM32L1x, STM32L4x, STM32WBx, STM32WLx, STM32G0x, STM32G4x
40-
or STM3H7x series flash driver.
41+
STM32L0x, STM32L1x, STM32L4x, STM32L5x, STM32WBx, STM32WLx, STM32G0x,
42+
STM32G4x or STM3H7x series flash driver.
4143

4244
config SOC_FLASH_STM32_V1
4345
bool

drivers/flash/flash_stm32.c

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,17 @@ LOG_MODULE_REGISTER(flash_stm32, CONFIG_FLASH_LOG_LEVEL);
2929
*/
3030
#define STM32_FLASH_TIMEOUT (2 * DT_PROP(DT_INST(0, soc_nv_flash), max_erase_time))
3131

32+
#if defined(FLASH_NSSR_NSBSY) /* For STM32L5x in non-secure mode */
33+
#define FLASH_SECURITY_NS
34+
#elif defined(FLASH_SECSR_SECBSY) /* For STM32L5x in secured mode */
35+
#error Flash is not supported in secure mode
36+
#define FLASH_SECURITY_SEC
37+
#else
38+
#define FLASH_SECURITY_NA /* For series which does not have
39+
* secured or non-secured mode
40+
*/
41+
#endif
42+
3243
static const struct flash_parameters flash_stm32_parameters = {
3344
.write_block_size = FLASH_STM32_WRITE_BLOCK_SIZE,
3445
/* Some SoCs (L0/L1) use an EEPROM under the hood. Distinguish
@@ -93,13 +104,21 @@ static int flash_stm32_check_status(const struct device *dev)
93104
#if defined(FLASH_FLAG_OPERR)
94105
FLASH_FLAG_OPERR |
95106
#endif
107+
#if defined(FLASH_FLAG_PROGERR)
108+
FLASH_FLAG_PROGERR |
109+
#endif
96110
#if defined(FLASH_FLAG_PGERR)
97111
FLASH_FLAG_PGERR |
98112
#endif
99113
FLASH_FLAG_WRPERR;
100114

115+
#if defined(FLASH_SECURITY_NS)
116+
if (FLASH_STM32_REGS(dev)->NSSR & error) {
117+
LOG_DBG("Status: 0x%08x", FLASH_STM32_REGS(dev)->NSSR & error);
118+
#else /* FLASH_SECURITY_SEC | FLASH_SECURITY_NA */
101119
if (FLASH_STM32_REGS(dev)->SR & error) {
102120
LOG_DBG("Status: 0x%08x", FLASH_STM32_REGS(dev)->SR & error);
121+
#endif /* FLASH_SECURITY_NS */
103122
return -EIO;
104123
}
105124

@@ -116,11 +135,16 @@ int flash_stm32_wait_flash_idle(const struct device *dev)
116135
if (rc < 0) {
117136
return -EIO;
118137
}
119-
#if defined(CONFIG_SOC_SERIES_STM32G0X)
138+
#if defined(FLASH_SECURITY_NS)
139+
while ((FLASH_STM32_REGS(dev)->NSSR & FLASH_FLAG_BSY)) {
140+
#else /* FLASH_SECURITY_SEC | FLASH_SECURITY_NA */
141+
#if defined(FLASH_SR_BSY1)
142+
/* Applicable for STM32G0 series */
120143
while ((FLASH_STM32_REGS(dev)->SR & FLASH_SR_BSY1)) {
121144
#else
122145
while ((FLASH_STM32_REGS(dev)->SR & FLASH_SR_BSY)) {
123146
#endif
147+
#endif /* FLASH_SECURITY_NS */
124148
if (k_uptime_get() > timeout_time) {
125149
LOG_ERR("Timeout! val: %d", STM32_FLASH_TIMEOUT);
126150
return -EIO;
@@ -134,7 +158,7 @@ static void flash_stm32_flush_caches(const struct device *dev,
134158
off_t offset, size_t len)
135159
{
136160
#if defined(CONFIG_SOC_SERIES_STM32F0X) || defined(CONFIG_SOC_SERIES_STM32F3X) || \
137-
defined(CONFIG_SOC_SERIES_STM32G0X)
161+
defined(CONFIG_SOC_SERIES_STM32G0X) || defined(CONFIG_SOC_SERIES_STM32L5X)
138162
ARG_UNUSED(dev);
139163
ARG_UNUSED(offset);
140164
ARG_UNUSED(len);
@@ -266,6 +290,16 @@ static int flash_stm32_write_protection(const struct device *dev, bool enable)
266290
}
267291
}
268292

293+
#if defined(FLASH_SECURITY_NS)
294+
if (enable) {
295+
regs->NSCR |= FLASH_NSCR_NSLOCK;
296+
} else {
297+
if (regs->NSCR & FLASH_NSCR_NSLOCK) {
298+
regs->NSKEYR = FLASH_KEY1;
299+
regs->NSKEYR = FLASH_KEY2;
300+
}
301+
}
302+
#else /* FLASH_SECURITY_SEC | FLASH_SECURITY_NA */
269303
#if defined(FLASH_CR_LOCK)
270304
if (enable) {
271305
regs->CR |= FLASH_CR_LOCK;
@@ -293,6 +327,7 @@ static int flash_stm32_write_protection(const struct device *dev, bool enable)
293327
}
294328
}
295329
#endif
330+
#endif /* FLASH_SECURITY_NS */
296331

297332
if (enable) {
298333
LOG_DBG("Enable write protection");
@@ -337,7 +372,7 @@ static const struct flash_driver_api flash_stm32_api = {
337372
static int stm32_flash_init(const struct device *dev)
338373
{
339374
int rc;
340-
/* Below is applicable to F0, F1, F3, G0, G4, L1, L4 & WB55 series.
375+
/* Below is applicable to F0, F1, F3, G0, G4, L1, L4, L5 & WB55 series.
341376
* For F2, F4, F7 & H7 series, this is not applicable.
342377
*/
343378
#if DT_INST_NODE_HAS_PROP(0, clocks)

0 commit comments

Comments
 (0)