Skip to content

Commit eaaecc2

Browse files
committed
drivers: flash: stm32h7 with RDP protection
Implement the readout protection for the STM32H7 series. Define the specific functions used by the flash_stm32h7. Remove reference to the stm32H7 from the flash_stm32.c Signed-off-by: Francois Ramu <[email protected]>
1 parent 81d10a8 commit eaaecc2

File tree

4 files changed

+69
-5
lines changed

4 files changed

+69
-5
lines changed

drivers/flash/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ if(CONFIG_FLASH_MCUX_FLEXSPI_XIP)
9090
endif()
9191

9292
if(CONFIG_SOC_FLASH_STM32)
93+
zephyr_library_sources_ifdef(CONFIG_FLASH_EX_OP_ENABLED flash_stm32_ex_op.c)
9394
if(CONFIG_SOC_SERIES_STM32H7X)
9495
zephyr_library_sources_ifdef(CONFIG_DT_HAS_ST_STM32H7_FLASH_CONTROLLER_ENABLED flash_stm32h7x.c)
9596
elseif(CONFIG_SOC_SERIES_STM32H7RSX)
@@ -106,7 +107,6 @@ if(CONFIG_SOC_FLASH_STM32)
106107
else()
107108
if(CONFIG_DT_HAS_ST_STM32_FLASH_CONTROLLER_ENABLED)
108109
zephyr_library_sources(flash_stm32.c)
109-
zephyr_library_sources_ifdef(CONFIG_FLASH_EX_OP_ENABLED flash_stm32_ex_op.c)
110110

111111
# zephyr-keep-sorted-start
112112
zephyr_library_sources_ifdef(CONFIG_DT_HAS_ST_STM32F1_FLASH_CONTROLLER_ENABLED flash_stm32f1x.c)

drivers/flash/Kconfig.stm32

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ config FLASH_STM32_WRITE_PROTECT_DISABLE_PREVENTION
5151
config FLASH_STM32_READOUT_PROTECTION
5252
bool "Extended operation for flash readout protection control"
5353
depends on SOC_SERIES_STM32F4X || SOC_SERIES_STM32L4X || \
54-
SOC_SERIES_STM32G4X || SOC_SERIES_STM32F7X
54+
SOC_SERIES_STM32G4X || SOC_SERIES_STM32F7X || \
55+
SOC_SERIES_STM32H7X
5556
select FLASH_HAS_EX_OP
5657
default n
5758
help

drivers/flash/flash_stm32.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -368,8 +368,7 @@ int flash_stm32_control_register_disable(const struct device *dev)
368368
{
369369
FLASH_TypeDef *regs = FLASH_STM32_REGS(dev);
370370

371-
#if defined(FLASH_CR_LOCK) /* F0, F1, F2, F3, F4, F7, L4, G0, G4, WB, WL \
372-
*/
371+
#if defined(FLASH_CR_LOCK) /* F0, F1, F2, F3, F4, F7, L4, G0, G4, WB, WL */
373372
/*
374373
* Access to control register can be disabled by writing wrong key to
375374
* the key register. Option register will remain disabled until reset.
@@ -462,7 +461,7 @@ static int stm32_flash_init(const struct device *dev)
462461
{
463462
int rc;
464463
/* Below is applicable to F0, F1, F3, G0, G4, L1, L4, L5, U5 & WB55 series.
465-
* For F2, F4, F7 & H7 series, this is not applicable.
464+
* For F2, F4, F7 series, this is not applicable.
466465
*/
467466
#if DT_INST_NODE_HAS_PROP(0, clocks)
468467
struct flash_stm32_priv *p = FLASH_STM32_PRIV(dev);

drivers/flash/flash_stm32h7x.c

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,67 @@ struct flash_stm32_sector_t {
6262
volatile uint32_t *sr;
6363
};
6464

65+
#if defined(CONFIG_FLASH_STM32_READOUT_PROTECTION)
66+
uint8_t flash_stm32_get_rdp_level(const struct device *dev)
67+
{
68+
FLASH_TypeDef *regs = FLASH_STM32_REGS(dev);
69+
70+
return (regs->OPTSR_CUR & FLASH_OPTSR_RDP_Msk) >> FLASH_OPTSR_RDP_Pos;
71+
}
72+
73+
void flash_stm32_set_rdp_level(const struct device *dev, uint8_t level)
74+
{
75+
FLASH_TypeDef *regs = FLASH_STM32_REGS(dev);
76+
uint32_t value = (uint32_t)level << FLASH_OPTSR_RDP_Pos;
77+
78+
if (regs->OPTCR & FLASH_OPTCR_OPTLOCK) {
79+
LOG_ERR("Option bytes locked");
80+
return;
81+
}
82+
83+
if ((regs->OPTCR & FLASH_OPTSR_RDP_Msk) == value) {
84+
/* Done already */
85+
return;
86+
}
87+
88+
if (flash_stm32_wait_flash_idle(dev) != 0) {
89+
LOG_ERR("Err flash no idle");
90+
return;
91+
}
92+
93+
regs->OPTCR = (regs->OPTCR & ~FLASH_OPTSR_RDP_Msk) | value;
94+
regs->OPTCR |= FLASH_OPTCR_OPTSTART;
95+
96+
/* Make sure previous write is completed. */
97+
barrier_dsync_fence_full();
98+
99+
if (flash_stm32_wait_flash_idle(dev) != 0) {
100+
LOG_ERR("Err flash no idle");
101+
return;
102+
}
103+
}
104+
#endif /* CONFIG_FLASH_STM32_READOUT_PROTECTION */
105+
106+
int flash_stm32_option_bytes_lock(const struct device *dev, bool enable)
107+
{
108+
FLASH_TypeDef *regs = FLASH_STM32_REGS(dev);
109+
110+
if (enable) {
111+
regs->OPTCR |= FLASH_OPTCR_OPTLOCK;
112+
} else if (regs->OPTCR & FLASH_OPTCR_OPTLOCK) {
113+
regs->OPTKEYR = FLASH_OPT_KEY1;
114+
regs->OPTKEYR = FLASH_OPT_KEY2;
115+
}
116+
117+
if (enable) {
118+
LOG_DBG("Option bytes locked");
119+
} else {
120+
LOG_DBG("Option bytes unlocked");
121+
}
122+
123+
return 0;
124+
}
125+
65126
bool flash_stm32_valid_range(const struct device *dev, off_t offset, uint32_t len, bool write)
66127
{
67128
#if defined(DUAL_BANK)
@@ -649,6 +710,9 @@ static const struct flash_driver_api flash_stm32h7_api = {
649710
#ifdef CONFIG_FLASH_PAGE_LAYOUT
650711
.page_layout = flash_stm32_page_layout,
651712
#endif
713+
#ifdef CONFIG_FLASH_EX_OP_ENABLED
714+
.ex_op = flash_stm32_ex_op,
715+
#endif
652716
};
653717

654718
static int stm32h7_flash_init(const struct device *dev)

0 commit comments

Comments
 (0)