Skip to content

Commit 3696ee0

Browse files
FRASTMkartben
authored andcommitted
drivers: flash: stm32h7 with RDP protection
Implement the readout protection for the STM32H7 series. Define the specific functions used by the flash_stm32h7. Move the stm32h7 flash register manipulation in a write_optb() to be called by the flash_stm32_set_rdp_level. Signed-off-by: Francois Ramu <francois.ramu@st.com>
1 parent a8da574 commit 3696ee0

File tree

4 files changed

+80
-5
lines changed

4 files changed

+80
-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: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,78 @@ struct flash_stm32_sector_t {
6262
volatile uint32_t *sr;
6363
};
6464

65+
static __unused int write_optb(const struct device *dev, uint32_t mask,
66+
uint32_t value)
67+
{
68+
FLASH_TypeDef *regs = FLASH_STM32_REGS(dev);
69+
int rc;
70+
71+
if (regs->OPTCR & FLASH_OPTCR_OPTLOCK) {
72+
LOG_ERR("Option bytes locked");
73+
return -EIO;
74+
}
75+
76+
if ((regs->OPTCR & mask) == value) {
77+
/* Done already */
78+
return 0;
79+
}
80+
81+
rc = flash_stm32_wait_flash_idle(dev);
82+
if (rc < 0) {
83+
LOG_ERR("Err flash no idle");
84+
return rc;
85+
}
86+
87+
regs->OPTCR = (regs->OPTCR & ~mask) | value;
88+
regs->OPTCR |= FLASH_OPTCR_OPTSTART;
89+
90+
/* Make sure previous write is completed. */
91+
barrier_dsync_fence_full();
92+
93+
rc = flash_stm32_wait_flash_idle(dev);
94+
if (rc < 0) {
95+
LOG_ERR("Err flash no idle");
96+
return rc;
97+
}
98+
99+
return 0;
100+
}
101+
102+
#if defined(CONFIG_FLASH_STM32_READOUT_PROTECTION)
103+
uint8_t flash_stm32_get_rdp_level(const struct device *dev)
104+
{
105+
FLASH_TypeDef *regs = FLASH_STM32_REGS(dev);
106+
107+
return (regs->OPTSR_CUR & FLASH_OPTSR_RDP_Msk) >> FLASH_OPTSR_RDP_Pos;
108+
}
109+
110+
void flash_stm32_set_rdp_level(const struct device *dev, uint8_t level)
111+
{
112+
write_optb(dev, FLASH_OPTSR_RDP_Msk,
113+
(uint32_t)level << FLASH_OPTSR_RDP_Pos);
114+
}
115+
#endif /* CONFIG_FLASH_STM32_READOUT_PROTECTION */
116+
117+
int flash_stm32_option_bytes_lock(const struct device *dev, bool enable)
118+
{
119+
FLASH_TypeDef *regs = FLASH_STM32_REGS(dev);
120+
121+
if (enable) {
122+
regs->OPTCR |= FLASH_OPTCR_OPTLOCK;
123+
} else if (regs->OPTCR & FLASH_OPTCR_OPTLOCK) {
124+
regs->OPTKEYR = FLASH_OPT_KEY1;
125+
regs->OPTKEYR = FLASH_OPT_KEY2;
126+
}
127+
128+
if (enable) {
129+
LOG_DBG("Option bytes locked");
130+
} else {
131+
LOG_DBG("Option bytes unlocked");
132+
}
133+
134+
return 0;
135+
}
136+
65137
bool flash_stm32_valid_range(const struct device *dev, off_t offset, uint32_t len, bool write)
66138
{
67139
#if defined(DUAL_BANK)
@@ -649,6 +721,9 @@ static DEVICE_API(flash, flash_stm32h7_api) = {
649721
#ifdef CONFIG_FLASH_PAGE_LAYOUT
650722
.page_layout = flash_stm32_page_layout,
651723
#endif
724+
#ifdef CONFIG_FLASH_EX_OP_ENABLED
725+
.ex_op = flash_stm32_ex_op,
726+
#endif
652727
};
653728

654729
static int stm32h7_flash_init(const struct device *dev)

0 commit comments

Comments
 (0)