@@ -42,8 +42,6 @@ static const struct flash_parameters flash_stm32_parameters = {
4242#endif
4343};
4444
45- static int flash_stm32_write_protection (const struct device * dev , bool enable );
46-
4745bool __weak flash_stm32_valid_range (const struct device * dev , off_t offset ,
4846 uint32_t len , bool write )
4947{
@@ -59,6 +57,66 @@ int __weak flash_stm32_check_configuration(void)
5957}
6058
6159
60+ int flash_stm32_write_protection (const struct device * dev , bool enable )
61+ {
62+ FLASH_TypeDef * regs = FLASH_STM32_REGS (dev );
63+
64+ int rc = 0 ;
65+
66+ if (enable ) {
67+ rc = flash_stm32_wait_flash_idle (dev );
68+ if (rc ) {
69+ flash_stm32_sem_give (dev );
70+ return rc ;
71+ }
72+ }
73+
74+ #if defined(FLASH_SECURITY_NS )
75+ if (enable ) {
76+ regs -> NSCR |= FLASH_STM32_NSLOCK ;
77+ } else {
78+ if (regs -> NSCR & FLASH_STM32_NSLOCK ) {
79+ regs -> NSKEYR = FLASH_KEY1 ;
80+ regs -> NSKEYR = FLASH_KEY2 ;
81+ }
82+ }
83+ #elif defined(FLASH_CR_LOCK )
84+ if (enable ) {
85+ regs -> CR |= FLASH_CR_LOCK ;
86+ } else {
87+ if (regs -> CR & FLASH_CR_LOCK ) {
88+ regs -> KEYR = FLASH_KEY1 ;
89+ regs -> KEYR = FLASH_KEY2 ;
90+ }
91+ }
92+ #else
93+ if (enable ) {
94+ regs -> PECR |= FLASH_PECR_PRGLOCK ;
95+ regs -> PECR |= FLASH_PECR_PELOCK ;
96+ } else {
97+ if (regs -> PECR & FLASH_PECR_PRGLOCK ) {
98+ LOG_DBG ("Disabling write protection" );
99+ regs -> PEKEYR = FLASH_PEKEY1 ;
100+ regs -> PEKEYR = FLASH_PEKEY2 ;
101+ regs -> PRGKEYR = FLASH_PRGKEY1 ;
102+ regs -> PRGKEYR = FLASH_PRGKEY2 ;
103+ }
104+ if (FLASH -> PECR & FLASH_PECR_PRGLOCK ) {
105+ LOG_ERR ("Unlock failed" );
106+ rc = - EIO ;
107+ }
108+ }
109+ #endif /* FLASH_SECURITY_NS */
110+
111+ if (enable ) {
112+ LOG_DBG ("Enable write protection" );
113+ } else {
114+ LOG_DBG ("Disable write protection" );
115+ }
116+
117+ return rc ;
118+ }
119+
62120#if !defined(CONFIG_SOC_SERIES_STM32WBX )
63121static int flash_stm32_check_status (const struct device * dev )
64122{
@@ -228,141 +286,6 @@ static int flash_stm32_write(const struct device *dev, off_t offset,
228286 return rc ;
229287}
230288
231- static int flash_stm32_write_protection (const struct device * dev , bool enable )
232- {
233- FLASH_TypeDef * regs = FLASH_STM32_REGS (dev );
234-
235- int rc = 0 ;
236-
237- if (enable ) {
238- rc = flash_stm32_wait_flash_idle (dev );
239- if (rc ) {
240- flash_stm32_sem_give (dev );
241- return rc ;
242- }
243- }
244-
245- #if defined(FLASH_SECURITY_NS )
246- if (enable ) {
247- regs -> NSCR |= FLASH_STM32_NSLOCK ;
248- } else {
249- if (regs -> NSCR & FLASH_STM32_NSLOCK ) {
250- regs -> NSKEYR = FLASH_KEY1 ;
251- regs -> NSKEYR = FLASH_KEY2 ;
252- }
253- }
254- #elif defined(FLASH_CR_LOCK )
255- if (enable ) {
256- regs -> CR |= FLASH_CR_LOCK ;
257- } else {
258- if (regs -> CR & FLASH_CR_LOCK ) {
259- regs -> KEYR = FLASH_KEY1 ;
260- regs -> KEYR = FLASH_KEY2 ;
261- }
262- }
263- #else
264- if (enable ) {
265- regs -> PECR |= FLASH_PECR_PRGLOCK ;
266- regs -> PECR |= FLASH_PECR_PELOCK ;
267- } else {
268- if (regs -> PECR & FLASH_PECR_PRGLOCK ) {
269- LOG_DBG ("Disabling write protection" );
270- regs -> PEKEYR = FLASH_PEKEY1 ;
271- regs -> PEKEYR = FLASH_PEKEY2 ;
272- regs -> PRGKEYR = FLASH_PRGKEY1 ;
273- regs -> PRGKEYR = FLASH_PRGKEY2 ;
274- }
275- if (FLASH -> PECR & FLASH_PECR_PRGLOCK ) {
276- LOG_ERR ("Unlock failed" );
277- rc = - EIO ;
278- }
279- }
280- #endif /* FLASH_SECURITY_NS */
281-
282- if (enable ) {
283- LOG_DBG ("Enable write protection" );
284- } else {
285- LOG_DBG ("Disable write protection" );
286- }
287-
288- return rc ;
289- }
290-
291- int flash_stm32_option_bytes_lock (const struct device * dev , bool enable )
292- {
293- FLASH_TypeDef * regs = FLASH_STM32_REGS (dev );
294-
295- #if defined(FLASH_OPTCR_OPTLOCK ) /* F2, F4, F7 */
296- if (enable ) {
297- regs -> OPTCR |= FLASH_OPTCR_OPTLOCK ;
298- } else if (regs -> OPTCR & FLASH_OPTCR_OPTLOCK ) {
299- regs -> OPTKEYR = FLASH_OPT_KEY1 ;
300- regs -> OPTKEYR = FLASH_OPT_KEY2 ;
301- }
302- #else
303- int rc ;
304-
305- /* Unlock CR/PECR/NSCR register if needed. */
306- if (!enable ) {
307- rc = flash_stm32_write_protection (dev , false);
308- if (rc ) {
309- return rc ;
310- }
311- }
312- #if defined(FLASH_CR_OPTWRE ) /* F0, F1 and F3 */
313- if (enable ) {
314- regs -> CR &= ~FLASH_CR_OPTWRE ;
315- } else if (!(regs -> CR & FLASH_CR_OPTWRE )) {
316- regs -> OPTKEYR = FLASH_OPTKEY1 ;
317- regs -> OPTKEYR = FLASH_OPTKEY2 ;
318- }
319- #elif defined(FLASH_CR_OPTLOCK ) /* G0, G4, L4, WB and WL */
320- if (enable ) {
321- regs -> CR |= FLASH_CR_OPTLOCK ;
322- } else if (regs -> CR & FLASH_CR_OPTLOCK ) {
323- regs -> OPTKEYR = FLASH_OPTKEY1 ;
324- regs -> OPTKEYR = FLASH_OPTKEY2 ;
325- }
326- #elif defined(FLASH_PECR_OPTLOCK ) /* L0 and L1 */
327- if (enable ) {
328- regs -> PECR |= FLASH_PECR_OPTLOCK ;
329- } else if (regs -> PECR & FLASH_PECR_OPTLOCK ) {
330- regs -> OPTKEYR = FLASH_OPTKEY1 ;
331- regs -> OPTKEYR = FLASH_OPTKEY2 ;
332- }
333- #elif defined(FLASH_NSCR_OPTLOCK ) /* L5 and U5 */
334- if (enable ) {
335- regs -> NSCR |= FLASH_NSCR_OPTLOCK ;
336- } else if (regs -> NSCR & FLASH_NSCR_OPTLOCK ) {
337- regs -> OPTKEYR = FLASH_OPTKEY1 ;
338- regs -> OPTKEYR = FLASH_OPTKEY2 ;
339- }
340- #elif defined(FLASH_NSCR1_OPTLOCK ) /* WBA */
341- if (enable ) {
342- regs -> NSCR1 |= FLASH_NSCR1_OPTLOCK ;
343- } else if (regs -> NSCR1 & FLASH_NSCR1_OPTLOCK ) {
344- regs -> OPTKEYR = FLASH_OPTKEY1 ;
345- regs -> OPTKEYR = FLASH_OPTKEY2 ;
346- }
347- #endif
348- /* Lock CR/PECR/NSCR register if needed. */
349- if (enable ) {
350- rc = flash_stm32_write_protection (dev , true);
351- if (rc ) {
352- return rc ;
353- }
354- }
355- #endif
356-
357- if (enable ) {
358- LOG_DBG ("Option bytes locked" );
359- } else {
360- LOG_DBG ("Option bytes unlocked" );
361- }
362-
363- return 0 ;
364- }
365-
366289#if defined(CONFIG_FLASH_EX_OP_ENABLED ) && defined(CONFIG_FLASH_STM32_BLOCK_REGISTERS )
367290int flash_stm32_control_register_disable (const struct device * dev )
368291{
0 commit comments