1 /***************************************************************************
2 * Copyright (C) 2015 by Uwe Bonnes *
3 * bon@elektron.ikp.physik.tu-darmstadt.de *
5 * Copyright (C) 2019 by Tarek Bochkati for STMicroelectronics *
6 * tarek.bouchkati@gmail.com *
8 * This program is free software; you can redistribute it and/or modify *
9 * it under the terms of the GNU General Public License as published by *
10 * the Free Software Foundation; either version 2 of the License, or *
11 * (at your option) any later version. *
13 * This program is distributed in the hope that it will be useful, *
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16 * GNU General Public License for more details. *
18 * You should have received a copy of the GNU General Public License *
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
20 ***************************************************************************/
27 #include <helper/binarybuffer.h>
28 #include <target/algorithm.h>
29 #include <target/armv7m.h>
33 /* STM32L4xxx series for reference.
35 * RM0351 (STM32L4x5/STM32L4x6)
36 * http://www.st.com/resource/en/reference_manual/dm00083560.pdf
38 * RM0394 (STM32L43x/44x/45x/46x)
39 * http://www.st.com/resource/en/reference_manual/dm00151940.pdf
41 * RM0432 (STM32L4R/4Sxx)
42 * http://www.st.com/resource/en/reference_manual/dm00310109.pdf
44 * STM32L476RG Datasheet (for erase timing)
45 * http://www.st.com/resource/en/datasheet/stm32l476rg.pdf
47 * The RM0351 devices have normally two banks, but on 512 and 256 kiB devices
48 * an option byte is available to map all sectors to the first bank.
49 * Both STM32 banks are treated as one OpenOCD bank, as other STM32 devices
52 * RM0394 devices have a single bank only.
54 * RM0432 devices have single and dual bank operating modes.
55 * - for STM32L4R/Sxx the FLASH size is 2Mbyte or 1Mbyte.
56 * - for STM32L4P/Q5x the FLASH size is 1Mbyte or 512Kbyte.
57 * Bank page (sector) size is 4Kbyte (dual mode) or 8Kbyte (single mode).
59 * Bank mode is controlled by two different bits in option bytes register.
61 * In 2M FLASH devices bit 22 (DBANK) controls Dual Bank mode.
62 * In 1M FLASH devices bit 21 (DB1M) controls Dual Bank mode.
64 * In 1M FLASH devices bit 22 (DBANK) controls Dual Bank mode.
65 * In 512K FLASH devices bit 21 (DB512K) controls Dual Bank mode.
69 /* STM32WBxxx series for reference.
72 * http://www.st.com/resource/en/reference_manual/dm00318631.pdf
75 * http://www.st.com/resource/en/reference_manual/dm00622834.pdf
78 /* STM32WLxxx series for reference.
81 * http://www.st.com/resource/en/reference_manual/dm00530369.pdf
84 /* STM32G0xxx series for reference.
87 * http://www.st.com/resource/en/reference_manual/dm00371828.pdf
90 * http://www.st.com/resource/en/reference_manual/dm00463896.pdf
93 /* STM32G4xxx series for reference.
95 * RM0440 (STM32G43x/44x/47x/48x/49x/4Ax)
96 * http://www.st.com/resource/en/reference_manual/dm00355726.pdf
98 * Cat. 2 devices have single bank only, page size is 2kByte.
100 * Cat. 3 devices have single and dual bank operating modes,
101 * Page size is 2kByte (dual mode) or 4kByte (single mode).
103 * Bank mode is controlled by bit 22 (DBANK) in option bytes register.
104 * Both banks are treated as a single OpenOCD bank.
106 * Cat. 4 devices have single bank only, page size is 2kByte.
109 /* Erase time can be as high as 25ms, 10x this and assume it's toast... */
111 #define FLASH_ERASE_TIMEOUT 250
113 enum stm32l4_flash_reg_index
{
114 STM32_FLASH_ACR_INDEX
,
115 STM32_FLASH_KEYR_INDEX
,
116 STM32_FLASH_OPTKEYR_INDEX
,
117 STM32_FLASH_SR_INDEX
,
118 STM32_FLASH_CR_INDEX
,
119 STM32_FLASH_OPTR_INDEX
,
120 STM32_FLASH_WRP1AR_INDEX
,
121 STM32_FLASH_WRP1BR_INDEX
,
122 STM32_FLASH_WRP2AR_INDEX
,
123 STM32_FLASH_WRP2BR_INDEX
,
124 STM32_FLASH_REG_INDEX_NUM
,
127 static const uint32_t stm32l4_flash_regs
[STM32_FLASH_REG_INDEX_NUM
] = {
128 [STM32_FLASH_ACR_INDEX
] = 0x000,
129 [STM32_FLASH_KEYR_INDEX
] = 0x008,
130 [STM32_FLASH_OPTKEYR_INDEX
] = 0x00C,
131 [STM32_FLASH_SR_INDEX
] = 0x010,
132 [STM32_FLASH_CR_INDEX
] = 0x014,
133 [STM32_FLASH_OPTR_INDEX
] = 0x020,
134 [STM32_FLASH_WRP1AR_INDEX
] = 0x02C,
135 [STM32_FLASH_WRP1BR_INDEX
] = 0x030,
136 [STM32_FLASH_WRP2AR_INDEX
] = 0x04C,
137 [STM32_FLASH_WRP2BR_INDEX
] = 0x050,
145 struct stm32l4_part_info
{
147 const char *device_str
;
148 const struct stm32l4_rev
*revs
;
149 const size_t num_revs
;
150 const uint16_t max_flash_size_kb
;
151 const bool has_dual_bank
;
152 const uint32_t flash_regs_base
;
153 const uint32_t *default_flash_regs
;
154 const uint32_t fsize_addr
;
157 struct stm32l4_flash_bank
{
160 unsigned int bank1_sectors
;
163 uint32_t user_bank_size
;
164 uint32_t wrpxxr_mask
;
165 const struct stm32l4_part_info
*part_info
;
166 const uint32_t *flash_regs
;
169 /* human readable list of families this drivers supports (sorted alphabetically) */
170 static const char *device_families
= "STM32G0/G4/L4/L4+/WB/WL";
172 static const struct stm32l4_rev stm32_415_revs
[] = {
173 { 0x1000, "1" }, { 0x1001, "2" }, { 0x1003, "3" }, { 0x1007, "4" }
176 static const struct stm32l4_rev stm32_435_revs
[] = {
177 { 0x1000, "A" }, { 0x1001, "Z" }, { 0x2001, "Y" },
180 static const struct stm32l4_rev stm32_460_revs
[] = {
181 { 0x1000, "A/Z" } /* A and Z, no typo in RM! */, { 0x2000, "B" },
184 static const struct stm32l4_rev stm32_461_revs
[] = {
185 { 0x1000, "A" }, { 0x2000, "B" },
188 static const struct stm32l4_rev stm32_462_revs
[] = {
189 { 0x1000, "A" }, { 0x1001, "Z" }, { 0x2001, "Y" },
192 static const struct stm32l4_rev stm32_464_revs
[] = {
193 { 0x1000, "A" }, { 0x1001, "Z" }, { 0x2001, "Y" },
196 static const struct stm32l4_rev stm32_466_revs
[] = {
197 { 0x1000, "A" }, { 0x1001, "Z" }, { 0x2000, "B" },
200 static const struct stm32l4_rev stm32_468_revs
[] = {
201 { 0x1000, "A" }, { 0x2000, "B" }, { 0x2001, "Z" },
204 static const struct stm32l4_rev stm32_469_revs
[] = {
205 { 0x1000, "A" }, { 0x2000, "B" }, { 0x2001, "Z" },
208 static const struct stm32l4_rev stm32_470_revs
[] = {
209 { 0x1000, "A" }, { 0x1001, "Z" }, { 0x1003, "Y" }, { 0x100F, "W" },
212 static const struct stm32l4_rev stm32_471_revs
[] = {
216 static const struct stm32l4_rev stm32_479_revs
[] = {
220 static const struct stm32l4_rev stm32_495_revs
[] = {
224 static const struct stm32l4_rev stm32_496_revs
[] = {
228 static const struct stm32l4_rev stm32_497_revs
[] = {
232 static const struct stm32l4_part_info stm32l4_parts
[] = {
235 .revs
= stm32_415_revs
,
236 .num_revs
= ARRAY_SIZE(stm32_415_revs
),
237 .device_str
= "STM32L47/L48xx",
238 .max_flash_size_kb
= 1024,
239 .has_dual_bank
= true,
240 .flash_regs_base
= 0x40022000,
241 .default_flash_regs
= stm32l4_flash_regs
,
242 .fsize_addr
= 0x1FFF75E0,
246 .revs
= stm32_435_revs
,
247 .num_revs
= ARRAY_SIZE(stm32_435_revs
),
248 .device_str
= "STM32L43/L44xx",
249 .max_flash_size_kb
= 256,
250 .has_dual_bank
= false,
251 .flash_regs_base
= 0x40022000,
252 .default_flash_regs
= stm32l4_flash_regs
,
253 .fsize_addr
= 0x1FFF75E0,
257 .revs
= stm32_460_revs
,
258 .num_revs
= ARRAY_SIZE(stm32_460_revs
),
259 .device_str
= "STM32G07/G08xx",
260 .max_flash_size_kb
= 128,
261 .has_dual_bank
= false,
262 .flash_regs_base
= 0x40022000,
263 .default_flash_regs
= stm32l4_flash_regs
,
264 .fsize_addr
= 0x1FFF75E0,
268 .revs
= stm32_461_revs
,
269 .num_revs
= ARRAY_SIZE(stm32_461_revs
),
270 .device_str
= "STM32L49/L4Axx",
271 .max_flash_size_kb
= 1024,
272 .has_dual_bank
= true,
273 .flash_regs_base
= 0x40022000,
274 .default_flash_regs
= stm32l4_flash_regs
,
275 .fsize_addr
= 0x1FFF75E0,
279 .revs
= stm32_462_revs
,
280 .num_revs
= ARRAY_SIZE(stm32_462_revs
),
281 .device_str
= "STM32L45/L46xx",
282 .max_flash_size_kb
= 512,
283 .has_dual_bank
= false,
284 .flash_regs_base
= 0x40022000,
285 .default_flash_regs
= stm32l4_flash_regs
,
286 .fsize_addr
= 0x1FFF75E0,
290 .revs
= stm32_464_revs
,
291 .num_revs
= ARRAY_SIZE(stm32_464_revs
),
292 .device_str
= "STM32L41/L42xx",
293 .max_flash_size_kb
= 128,
294 .has_dual_bank
= false,
295 .flash_regs_base
= 0x40022000,
296 .default_flash_regs
= stm32l4_flash_regs
,
297 .fsize_addr
= 0x1FFF75E0,
301 .revs
= stm32_466_revs
,
302 .num_revs
= ARRAY_SIZE(stm32_466_revs
),
303 .device_str
= "STM32G03/G04xx",
304 .max_flash_size_kb
= 64,
305 .has_dual_bank
= false,
306 .flash_regs_base
= 0x40022000,
307 .default_flash_regs
= stm32l4_flash_regs
,
308 .fsize_addr
= 0x1FFF75E0,
312 .revs
= stm32_468_revs
,
313 .num_revs
= ARRAY_SIZE(stm32_468_revs
),
314 .device_str
= "STM32G43/G44xx",
315 .max_flash_size_kb
= 128,
316 .has_dual_bank
= false,
317 .flash_regs_base
= 0x40022000,
318 .default_flash_regs
= stm32l4_flash_regs
,
319 .fsize_addr
= 0x1FFF75E0,
323 .revs
= stm32_469_revs
,
324 .num_revs
= ARRAY_SIZE(stm32_469_revs
),
325 .device_str
= "STM32G47/G48xx",
326 .max_flash_size_kb
= 512,
327 .has_dual_bank
= true,
328 .flash_regs_base
= 0x40022000,
329 .default_flash_regs
= stm32l4_flash_regs
,
330 .fsize_addr
= 0x1FFF75E0,
334 .revs
= stm32_470_revs
,
335 .num_revs
= ARRAY_SIZE(stm32_470_revs
),
336 .device_str
= "STM32L4R/L4Sxx",
337 .max_flash_size_kb
= 2048,
338 .has_dual_bank
= true,
339 .flash_regs_base
= 0x40022000,
340 .default_flash_regs
= stm32l4_flash_regs
,
341 .fsize_addr
= 0x1FFF75E0,
345 .revs
= stm32_471_revs
,
346 .num_revs
= ARRAY_SIZE(stm32_471_revs
),
347 .device_str
= "STM32L4P5/L4Q5x",
348 .max_flash_size_kb
= 1024,
349 .has_dual_bank
= true,
350 .flash_regs_base
= 0x40022000,
351 .default_flash_regs
= stm32l4_flash_regs
,
352 .fsize_addr
= 0x1FFF75E0,
356 .revs
= stm32_479_revs
,
357 .num_revs
= ARRAY_SIZE(stm32_479_revs
),
358 .device_str
= "STM32G49/G4Axx",
359 .max_flash_size_kb
= 512,
360 .has_dual_bank
= false,
361 .flash_regs_base
= 0x40022000,
362 .default_flash_regs
= stm32l4_flash_regs
,
363 .fsize_addr
= 0x1FFF75E0,
367 .revs
= stm32_495_revs
,
368 .num_revs
= ARRAY_SIZE(stm32_495_revs
),
369 .device_str
= "STM32WB5x",
370 .max_flash_size_kb
= 1024,
371 .has_dual_bank
= false,
372 .flash_regs_base
= 0x58004000,
373 .default_flash_regs
= stm32l4_flash_regs
,
374 .fsize_addr
= 0x1FFF75E0,
378 .revs
= stm32_496_revs
,
379 .num_revs
= ARRAY_SIZE(stm32_496_revs
),
380 .device_str
= "STM32WB3x",
381 .max_flash_size_kb
= 512,
382 .has_dual_bank
= false,
383 .flash_regs_base
= 0x58004000,
384 .default_flash_regs
= stm32l4_flash_regs
,
385 .fsize_addr
= 0x1FFF75E0,
389 .revs
= stm32_497_revs
,
390 .num_revs
= ARRAY_SIZE(stm32_497_revs
),
391 .device_str
= "STM32WLEx",
392 .max_flash_size_kb
= 256,
393 .has_dual_bank
= false,
394 .flash_regs_base
= 0x58004000,
395 .default_flash_regs
= stm32l4_flash_regs
,
396 .fsize_addr
= 0x1FFF75E0,
400 /* flash bank stm32l4x <base> <size> 0 0 <target#> */
401 FLASH_BANK_COMMAND_HANDLER(stm32l4_flash_bank_command
)
403 struct stm32l4_flash_bank
*stm32l4_info
;
406 return ERROR_COMMAND_SYNTAX_ERROR
;
408 stm32l4_info
= malloc(sizeof(struct stm32l4_flash_bank
));
410 return ERROR_FAIL
; /* Checkme: What better error to use?*/
411 bank
->driver_priv
= stm32l4_info
;
413 /* The flash write must be aligned to a double word (8-bytes) boundary.
414 * Ask the flash infrastructure to ensure required alignment */
415 bank
->write_start_alignment
= bank
->write_end_alignment
= 8;
417 stm32l4_info
->probed
= false;
418 stm32l4_info
->user_bank_size
= bank
->size
;
423 static inline uint32_t stm32l4_get_flash_reg(struct flash_bank
*bank
, uint32_t reg_offset
)
425 struct stm32l4_flash_bank
*stm32l4_info
= bank
->driver_priv
;
426 return stm32l4_info
->part_info
->flash_regs_base
+ reg_offset
;
429 static inline uint32_t stm32l4_get_flash_reg_by_index(struct flash_bank
*bank
,
430 enum stm32l4_flash_reg_index reg_index
)
432 struct stm32l4_flash_bank
*stm32l4_info
= bank
->driver_priv
;
433 return stm32l4_get_flash_reg(bank
, stm32l4_info
->flash_regs
[reg_index
]);
436 static inline int stm32l4_read_flash_reg(struct flash_bank
*bank
, uint32_t reg_offset
, uint32_t *value
)
438 return target_read_u32(bank
->target
, stm32l4_get_flash_reg(bank
, reg_offset
), value
);
441 static inline int stm32l4_read_flash_reg_by_index(struct flash_bank
*bank
,
442 enum stm32l4_flash_reg_index reg_index
, uint32_t *value
)
444 struct stm32l4_flash_bank
*stm32l4_info
= bank
->driver_priv
;
445 return stm32l4_read_flash_reg(bank
, stm32l4_info
->flash_regs
[reg_index
], value
);
448 static inline int stm32l4_write_flash_reg(struct flash_bank
*bank
, uint32_t reg_offset
, uint32_t value
)
450 return target_write_u32(bank
->target
, stm32l4_get_flash_reg(bank
, reg_offset
), value
);
453 static inline int stm32l4_write_flash_reg_by_index(struct flash_bank
*bank
,
454 enum stm32l4_flash_reg_index reg_index
, uint32_t value
)
456 struct stm32l4_flash_bank
*stm32l4_info
= bank
->driver_priv
;
457 return stm32l4_write_flash_reg(bank
, stm32l4_info
->flash_regs
[reg_index
], value
);
460 static int stm32l4_wait_status_busy(struct flash_bank
*bank
, int timeout
)
463 int retval
= ERROR_OK
;
465 /* wait for busy to clear */
467 retval
= stm32l4_read_flash_reg_by_index(bank
, STM32_FLASH_SR_INDEX
, &status
);
468 if (retval
!= ERROR_OK
)
470 LOG_DEBUG("status: 0x%" PRIx32
"", status
);
471 if ((status
& FLASH_BSY
) == 0)
473 if (timeout
-- <= 0) {
474 LOG_ERROR("timed out waiting for flash");
481 if (status
& FLASH_WRPERR
) {
482 LOG_ERROR("stm32x device protected");
486 /* Clear but report errors */
487 if (status
& FLASH_ERROR
) {
488 if (retval
== ERROR_OK
)
490 /* If this operation fails, we ignore it and report the original
493 stm32l4_write_flash_reg_by_index(bank
, STM32_FLASH_SR_INDEX
, status
& FLASH_ERROR
);
499 static int stm32l4_unlock_reg(struct flash_bank
*bank
)
503 /* first check if not already unlocked
504 * otherwise writing on STM32_FLASH_KEYR will fail
506 int retval
= stm32l4_read_flash_reg_by_index(bank
, STM32_FLASH_CR_INDEX
, &ctrl
);
507 if (retval
!= ERROR_OK
)
510 if ((ctrl
& FLASH_LOCK
) == 0)
513 /* unlock flash registers */
514 retval
= stm32l4_write_flash_reg_by_index(bank
, STM32_FLASH_KEYR_INDEX
, KEY1
);
515 if (retval
!= ERROR_OK
)
518 retval
= stm32l4_write_flash_reg_by_index(bank
, STM32_FLASH_KEYR_INDEX
, KEY2
);
519 if (retval
!= ERROR_OK
)
522 retval
= stm32l4_read_flash_reg_by_index(bank
, STM32_FLASH_CR_INDEX
, &ctrl
);
523 if (retval
!= ERROR_OK
)
526 if (ctrl
& FLASH_LOCK
) {
527 LOG_ERROR("flash not unlocked STM32_FLASH_CR: %" PRIx32
, ctrl
);
528 return ERROR_TARGET_FAILURE
;
534 static int stm32l4_unlock_option_reg(struct flash_bank
*bank
)
538 int retval
= stm32l4_read_flash_reg_by_index(bank
, STM32_FLASH_CR_INDEX
, &ctrl
);
539 if (retval
!= ERROR_OK
)
542 if ((ctrl
& FLASH_OPTLOCK
) == 0)
545 /* unlock option registers */
546 retval
= stm32l4_write_flash_reg_by_index(bank
, STM32_FLASH_OPTKEYR_INDEX
, OPTKEY1
);
547 if (retval
!= ERROR_OK
)
550 retval
= stm32l4_write_flash_reg_by_index(bank
, STM32_FLASH_OPTKEYR_INDEX
, OPTKEY2
);
551 if (retval
!= ERROR_OK
)
554 retval
= stm32l4_read_flash_reg_by_index(bank
, STM32_FLASH_CR_INDEX
, &ctrl
);
555 if (retval
!= ERROR_OK
)
558 if (ctrl
& FLASH_OPTLOCK
) {
559 LOG_ERROR("options not unlocked STM32_FLASH_CR: %" PRIx32
, ctrl
);
560 return ERROR_TARGET_FAILURE
;
566 static int stm32l4_write_option(struct flash_bank
*bank
, uint32_t reg_offset
,
567 uint32_t value
, uint32_t mask
)
572 retval
= stm32l4_read_flash_reg(bank
, reg_offset
, &optiondata
);
573 if (retval
!= ERROR_OK
)
576 retval
= stm32l4_unlock_reg(bank
);
577 if (retval
!= ERROR_OK
)
580 retval
= stm32l4_unlock_option_reg(bank
);
581 if (retval
!= ERROR_OK
)
584 optiondata
= (optiondata
& ~mask
) | (value
& mask
);
586 retval
= stm32l4_write_flash_reg(bank
, reg_offset
, optiondata
);
587 if (retval
!= ERROR_OK
)
590 retval
= stm32l4_write_flash_reg_by_index(bank
, STM32_FLASH_CR_INDEX
, FLASH_OPTSTRT
);
591 if (retval
!= ERROR_OK
)
594 retval
= stm32l4_wait_status_busy(bank
, FLASH_ERASE_TIMEOUT
);
597 retval2
= stm32l4_write_flash_reg_by_index(bank
, STM32_FLASH_CR_INDEX
, FLASH_LOCK
| FLASH_OPTLOCK
);
599 if (retval
!= ERROR_OK
)
605 static int stm32l4_protect_check(struct flash_bank
*bank
)
607 struct stm32l4_flash_bank
*stm32l4_info
= bank
->driver_priv
;
609 uint32_t wrp1ar
, wrp1br
, wrp2ar
, wrp2br
;
610 stm32l4_read_flash_reg_by_index(bank
, STM32_FLASH_WRP1AR_INDEX
, &wrp1ar
);
611 stm32l4_read_flash_reg_by_index(bank
, STM32_FLASH_WRP1BR_INDEX
, &wrp1br
);
612 if (stm32l4_info
->part_info
->has_dual_bank
) {
613 stm32l4_read_flash_reg_by_index(bank
, STM32_FLASH_WRP2AR_INDEX
, &wrp2ar
);
614 stm32l4_read_flash_reg_by_index(bank
, STM32_FLASH_WRP2BR_INDEX
, &wrp2br
);
616 /* prevent uninitialized errors */
621 const uint8_t wrp1a_start
= wrp1ar
& stm32l4_info
->wrpxxr_mask
;
622 const uint8_t wrp1a_end
= (wrp1ar
>> 16) & stm32l4_info
->wrpxxr_mask
;
623 const uint8_t wrp1b_start
= wrp1br
& stm32l4_info
->wrpxxr_mask
;
624 const uint8_t wrp1b_end
= (wrp1br
>> 16) & stm32l4_info
->wrpxxr_mask
;
625 const uint8_t wrp2a_start
= wrp2ar
& stm32l4_info
->wrpxxr_mask
;
626 const uint8_t wrp2a_end
= (wrp2ar
>> 16) & stm32l4_info
->wrpxxr_mask
;
627 const uint8_t wrp2b_start
= wrp2br
& stm32l4_info
->wrpxxr_mask
;
628 const uint8_t wrp2b_end
= (wrp2br
>> 16) & stm32l4_info
->wrpxxr_mask
;
630 for (unsigned int i
= 0; i
< bank
->num_sectors
; i
++) {
631 if (i
< stm32l4_info
->bank1_sectors
) {
632 if (((i
>= wrp1a_start
) &&
634 ((i
>= wrp1b_start
) &&
636 bank
->sectors
[i
].is_protected
= 1;
638 bank
->sectors
[i
].is_protected
= 0;
640 assert(stm32l4_info
->part_info
->has_dual_bank
== true);
642 snb
= i
- stm32l4_info
->bank1_sectors
;
643 if (((snb
>= wrp2a_start
) &&
644 (snb
<= wrp2a_end
)) ||
645 ((snb
>= wrp2b_start
) &&
647 bank
->sectors
[i
].is_protected
= 1;
649 bank
->sectors
[i
].is_protected
= 0;
655 static int stm32l4_erase(struct flash_bank
*bank
, unsigned int first
,
658 struct stm32l4_flash_bank
*stm32l4_info
= bank
->driver_priv
;
661 assert((first
<= last
) && (last
< bank
->num_sectors
));
663 if (bank
->target
->state
!= TARGET_HALTED
) {
664 LOG_ERROR("Target not halted");
665 return ERROR_TARGET_NOT_HALTED
;
668 retval
= stm32l4_unlock_reg(bank
);
669 if (retval
!= ERROR_OK
)
674 To erase a sector, follow the procedure below:
675 1. Check that no Flash memory operation is ongoing by
676 checking the BSY bit in the FLASH_SR register
677 2. Set the PER bit and select the page and bank
678 you wish to erase in the FLASH_CR register
679 3. Set the STRT bit in the FLASH_CR register
680 4. Wait for the BSY bit to be cleared
683 for (unsigned int i
= first
; i
<= last
; i
++) {
684 uint32_t erase_flags
;
685 erase_flags
= FLASH_PER
| FLASH_STRT
;
687 if (i
>= stm32l4_info
->bank1_sectors
) {
689 snb
= i
- stm32l4_info
->bank1_sectors
;
690 erase_flags
|= snb
<< FLASH_PAGE_SHIFT
| FLASH_CR_BKER
;
692 erase_flags
|= i
<< FLASH_PAGE_SHIFT
;
693 retval
= stm32l4_write_flash_reg_by_index(bank
, STM32_FLASH_CR_INDEX
, erase_flags
);
694 if (retval
!= ERROR_OK
)
697 retval
= stm32l4_wait_status_busy(bank
, FLASH_ERASE_TIMEOUT
);
698 if (retval
!= ERROR_OK
)
701 bank
->sectors
[i
].is_erased
= 1;
705 retval2
= stm32l4_write_flash_reg_by_index(bank
, STM32_FLASH_CR_INDEX
, FLASH_LOCK
);
707 if (retval
!= ERROR_OK
)
713 static int stm32l4_protect(struct flash_bank
*bank
, int set
, unsigned int first
,
716 struct target
*target
= bank
->target
;
717 struct stm32l4_flash_bank
*stm32l4_info
= bank
->driver_priv
;
719 if (target
->state
!= TARGET_HALTED
) {
720 LOG_ERROR("Target not halted");
721 return ERROR_TARGET_NOT_HALTED
;
726 uint32_t reg_value
= 0xFF; /* Default to bank un-protected */
727 if (last
>= stm32l4_info
->bank1_sectors
) {
729 uint8_t begin
= first
> stm32l4_info
->bank1_sectors
? first
: 0x00;
730 reg_value
= ((last
& 0xFF) << 16) | begin
;
733 ret
= stm32l4_write_option(bank
, stm32l4_info
->flash_regs
[STM32_FLASH_WRP2AR_INDEX
], reg_value
, 0xffffffff);
736 reg_value
= 0xFF; /* Default to bank un-protected */
737 if (first
< stm32l4_info
->bank1_sectors
) {
739 uint8_t end
= last
>= stm32l4_info
->bank1_sectors
? 0xFF : last
;
740 reg_value
= (end
<< 16) | (first
& 0xFF);
743 ret
= stm32l4_write_option(bank
, stm32l4_info
->flash_regs
[STM32_FLASH_WRP1AR_INDEX
], reg_value
, 0xffffffff);
749 /* Count is in double-words */
750 static int stm32l4_write_block(struct flash_bank
*bank
, const uint8_t *buffer
,
751 uint32_t offset
, uint32_t count
)
753 struct target
*target
= bank
->target
;
754 uint32_t buffer_size
;
755 struct working_area
*write_algorithm
;
756 struct working_area
*source
;
757 uint32_t address
= bank
->base
+ offset
;
758 struct reg_param reg_params
[6];
759 struct armv7m_algorithm armv7m_info
;
760 int retval
= ERROR_OK
;
762 static const uint8_t stm32l4_flash_write_code
[] = {
763 #include "../../../contrib/loaders/flash/stm32/stm32l4x.inc"
766 if (target_alloc_working_area(target
, sizeof(stm32l4_flash_write_code
),
767 &write_algorithm
) != ERROR_OK
) {
768 LOG_WARNING("no working area available, can't do block memory writes");
769 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
772 retval
= target_write_buffer(target
, write_algorithm
->address
,
773 sizeof(stm32l4_flash_write_code
),
774 stm32l4_flash_write_code
);
775 if (retval
!= ERROR_OK
) {
776 target_free_working_area(target
, write_algorithm
);
780 /* memory buffer, size *must* be multiple of dword plus one dword for rp and one for wp */
781 buffer_size
= target_get_working_area_avail(target
) & ~(2 * sizeof(uint32_t) - 1);
782 if (buffer_size
< 256) {
783 LOG_WARNING("large enough working area not available, can't do block memory writes");
784 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
785 } else if (buffer_size
> 16384) {
786 /* probably won't benefit from more than 16k ... */
790 if (target_alloc_working_area_try(target
, buffer_size
, &source
) != ERROR_OK
) {
791 LOG_ERROR("allocating working area failed");
792 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
795 armv7m_info
.common_magic
= ARMV7M_COMMON_MAGIC
;
796 armv7m_info
.core_mode
= ARM_MODE_THREAD
;
798 init_reg_param(®_params
[0], "r0", 32, PARAM_IN_OUT
); /* buffer start, status (out) */
799 init_reg_param(®_params
[1], "r1", 32, PARAM_OUT
); /* buffer end */
800 init_reg_param(®_params
[2], "r2", 32, PARAM_OUT
); /* target address */
801 init_reg_param(®_params
[3], "r3", 32, PARAM_OUT
); /* count (double word-64bit) */
802 init_reg_param(®_params
[4], "r4", 32, PARAM_OUT
); /* flash status register */
803 init_reg_param(®_params
[5], "r5", 32, PARAM_OUT
); /* flash control register */
805 buf_set_u32(reg_params
[0].value
, 0, 32, source
->address
);
806 buf_set_u32(reg_params
[1].value
, 0, 32, source
->address
+ source
->size
);
807 buf_set_u32(reg_params
[2].value
, 0, 32, address
);
808 buf_set_u32(reg_params
[3].value
, 0, 32, count
);
809 buf_set_u32(reg_params
[4].value
, 0, 32, stm32l4_get_flash_reg_by_index(bank
, STM32_FLASH_SR_INDEX
));
810 buf_set_u32(reg_params
[5].value
, 0, 32, stm32l4_get_flash_reg_by_index(bank
, STM32_FLASH_CR_INDEX
));
812 retval
= target_run_flash_async_algorithm(target
, buffer
, count
, 8,
814 ARRAY_SIZE(reg_params
), reg_params
,
815 source
->address
, source
->size
,
816 write_algorithm
->address
, 0,
819 if (retval
== ERROR_FLASH_OPERATION_FAILED
) {
820 LOG_ERROR("error executing stm32l4 flash write algorithm");
822 uint32_t error
= buf_get_u32(reg_params
[0].value
, 0, 32) & FLASH_ERROR
;
824 if (error
& FLASH_WRPERR
)
825 LOG_ERROR("flash memory write protected");
828 LOG_ERROR("flash write failed = %08" PRIx32
, error
);
829 /* Clear but report errors */
830 stm32l4_write_flash_reg_by_index(bank
, STM32_FLASH_SR_INDEX
, error
);
835 target_free_working_area(target
, source
);
836 target_free_working_area(target
, write_algorithm
);
838 destroy_reg_param(®_params
[0]);
839 destroy_reg_param(®_params
[1]);
840 destroy_reg_param(®_params
[2]);
841 destroy_reg_param(®_params
[3]);
842 destroy_reg_param(®_params
[4]);
843 destroy_reg_param(®_params
[5]);
848 static int stm32l4_write(struct flash_bank
*bank
, const uint8_t *buffer
,
849 uint32_t offset
, uint32_t count
)
851 int retval
= ERROR_OK
, retval2
;
853 if (bank
->target
->state
!= TARGET_HALTED
) {
854 LOG_ERROR("Target not halted");
855 return ERROR_TARGET_NOT_HALTED
;
858 /* The flash write must be aligned to a double word (8-bytes) boundary.
859 * The flash infrastructure ensures it, do just a security check */
860 assert(offset
% 8 == 0);
861 assert(count
% 8 == 0);
863 /* STM32G4xxx Cat. 3 devices may have gaps between banks, check whether
864 * data to be written does not go into a gap:
865 * suppose buffer is fully contained in bank from sector 0 to sector
866 * num->sectors - 1 and sectors are ordered according to offset
868 struct flash_sector
*head
= &bank
->sectors
[0];
869 struct flash_sector
*tail
= &bank
->sectors
[bank
->num_sectors
- 1];
871 while ((head
< tail
) && (offset
>= (head
+ 1)->offset
)) {
872 /* buffer does not intersect head nor gap behind head */
876 while ((head
< tail
) && (offset
+ count
<= (tail
- 1)->offset
+ (tail
- 1)->size
)) {
877 /* buffer does not intersect tail nor gap before tail */
881 LOG_DEBUG("data: 0x%08" PRIx32
" - 0x%08" PRIx32
", sectors: 0x%08" PRIx32
" - 0x%08" PRIx32
,
882 offset
, offset
+ count
- 1, head
->offset
, tail
->offset
+ tail
->size
- 1);
884 /* Now check that there is no gap from head to tail, this should work
885 * even for multiple or non-symmetric gaps
887 while (head
< tail
) {
888 if (head
->offset
+ head
->size
!= (head
+ 1)->offset
) {
889 LOG_ERROR("write into gap from " TARGET_ADDR_FMT
" to " TARGET_ADDR_FMT
,
890 bank
->base
+ head
->offset
+ head
->size
,
891 bank
->base
+ (head
+ 1)->offset
- 1);
892 retval
= ERROR_FLASH_DST_OUT_OF_BANK
;
897 if (retval
!= ERROR_OK
)
900 retval
= stm32l4_unlock_reg(bank
);
901 if (retval
!= ERROR_OK
)
904 retval
= stm32l4_write_block(bank
, buffer
, offset
, count
/ 8);
907 retval2
= stm32l4_write_flash_reg_by_index(bank
, STM32_FLASH_CR_INDEX
, FLASH_LOCK
);
909 if (retval
!= ERROR_OK
) {
910 LOG_ERROR("block write failed");
916 static int stm32l4_read_idcode(struct flash_bank
*bank
, uint32_t *id
)
920 /* try stm32l4/l4+/wb/g4 id register first, then stm32g0 id register */
921 retval
= target_read_u32(bank
->target
, DBGMCU_IDCODE_L4_G4
, id
);
922 if ((retval
!= ERROR_OK
) || ((*id
& 0xfff) == 0) || ((*id
& 0xfff) == 0xfff)) {
923 retval
= target_read_u32(bank
->target
, DBGMCU_IDCODE_G0
, id
);
924 if ((retval
!= ERROR_OK
) || ((*id
& 0xfff) == 0) || ((*id
& 0xfff) == 0xfff)) {
925 LOG_ERROR("can't get device id");
926 return (retval
== ERROR_OK
) ? ERROR_FAIL
: retval
;
933 static int stm32l4_probe(struct flash_bank
*bank
)
935 struct target
*target
= bank
->target
;
936 struct stm32l4_flash_bank
*stm32l4_info
= bank
->driver_priv
;
937 const struct stm32l4_part_info
*part_info
;
938 uint16_t flash_size_kb
= 0xffff;
942 stm32l4_info
->probed
= false;
944 /* read stm32 device id registers */
945 int retval
= stm32l4_read_idcode(bank
, &stm32l4_info
->idcode
);
946 if (retval
!= ERROR_OK
)
949 device_id
= stm32l4_info
->idcode
& 0xFFF;
951 for (unsigned int n
= 0; n
< ARRAY_SIZE(stm32l4_parts
); n
++) {
952 if (device_id
== stm32l4_parts
[n
].id
)
953 stm32l4_info
->part_info
= &stm32l4_parts
[n
];
956 if (!stm32l4_info
->part_info
) {
957 LOG_WARNING("Cannot identify target as an %s family device.", device_families
);
961 part_info
= stm32l4_info
->part_info
;
962 stm32l4_info
->flash_regs
= stm32l4_info
->part_info
->default_flash_regs
;
964 char device_info
[1024];
965 retval
= bank
->driver
->info(bank
, device_info
, sizeof(device_info
));
966 if (retval
!= ERROR_OK
)
969 LOG_INFO("device idcode = 0x%08" PRIx32
" (%s)", stm32l4_info
->idcode
, device_info
);
971 /* get flash size from target. */
972 retval
= target_read_u16(target
, part_info
->fsize_addr
, &flash_size_kb
);
974 /* failed reading flash size or flash size invalid (early silicon),
975 * default to max target family */
976 if (retval
!= ERROR_OK
|| flash_size_kb
== 0xffff || flash_size_kb
== 0
977 || flash_size_kb
> part_info
->max_flash_size_kb
) {
978 LOG_WARNING("STM32 flash size failed, probe inaccurate - assuming %dk flash",
979 part_info
->max_flash_size_kb
);
980 flash_size_kb
= part_info
->max_flash_size_kb
;
983 /* if the user sets the size manually then ignore the probed value
984 * this allows us to work around devices that have a invalid flash size register value */
985 if (stm32l4_info
->user_bank_size
) {
986 LOG_WARNING("overriding size register by configured bank size - MAY CAUSE TROUBLE");
987 flash_size_kb
= stm32l4_info
->user_bank_size
/ 1024;
990 LOG_INFO("flash size = %dkbytes", flash_size_kb
);
992 /* did we assign a flash size? */
993 assert((flash_size_kb
!= 0xffff) && flash_size_kb
);
995 /* read flash option register */
996 retval
= stm32l4_read_flash_reg_by_index(bank
, STM32_FLASH_OPTR_INDEX
, &options
);
997 if (retval
!= ERROR_OK
)
1000 stm32l4_info
->bank1_sectors
= 0;
1001 stm32l4_info
->hole_sectors
= 0;
1004 int page_size_kb
= 0;
1006 stm32l4_info
->dual_bank_mode
= false;
1008 switch (device_id
) {
1009 case 0x415: /* STM32L47/L48xx */
1010 case 0x461: /* STM32L49/L4Axx */
1011 /* if flash size is max (1M) the device is always dual bank
1012 * 0x415: has variants with 512K
1013 * 0x461: has variants with 512 and 256
1014 * for these variants:
1015 * if DUAL_BANK = 0 -> single bank
1016 * else -> dual bank without gap
1017 * note: the page size is invariant
1020 num_pages
= flash_size_kb
/ page_size_kb
;
1021 stm32l4_info
->bank1_sectors
= num_pages
;
1023 /* check DUAL_BANK bit[21] if the flash is less than 1M */
1024 if (flash_size_kb
== 1024 || (options
& BIT(21))) {
1025 stm32l4_info
->dual_bank_mode
= true;
1026 stm32l4_info
->bank1_sectors
= num_pages
/ 2;
1029 case 0x435: /* STM32L43/L44xx */
1030 case 0x460: /* STM32G07/G08xx */
1031 case 0x462: /* STM32L45/L46xx */
1032 case 0x464: /* STM32L41/L42xx */
1033 case 0x466: /* STM32G03/G04xx */
1034 case 0x468: /* STM32G43/G44xx */
1035 case 0x479: /* STM32G49/G4Axx */
1036 case 0x497: /* STM32WLEx */
1037 /* single bank flash */
1039 num_pages
= flash_size_kb
/ page_size_kb
;
1040 stm32l4_info
->bank1_sectors
= num_pages
;
1042 case 0x469: /* STM32G47/G48xx */
1043 /* STM32G47/8 can be single/dual bank:
1044 * if DUAL_BANK = 0 -> single bank
1045 * else -> dual bank WITH gap
1048 num_pages
= flash_size_kb
/ page_size_kb
;
1049 stm32l4_info
->bank1_sectors
= num_pages
;
1050 if (options
& BIT(22)) {
1051 stm32l4_info
->dual_bank_mode
= true;
1053 num_pages
= flash_size_kb
/ page_size_kb
;
1054 stm32l4_info
->bank1_sectors
= num_pages
/ 2;
1056 /* for devices with trimmed flash, there is a gap between both banks */
1057 stm32l4_info
->hole_sectors
=
1058 (part_info
->max_flash_size_kb
- flash_size_kb
) / (2 * page_size_kb
);
1061 case 0x470: /* STM32L4R/L4Sxx */
1062 case 0x471: /* STM32L4P5/L4Q5x */
1063 /* STM32L4R/S can be single/dual bank:
1064 * if size = 2M check DBANK bit(22)
1065 * if size = 1M check DB1M bit(21)
1066 * STM32L4P/Q can be single/dual bank
1067 * if size = 1M check DBANK bit(22)
1068 * if size = 512K check DB512K bit(21)
1071 num_pages
= flash_size_kb
/ page_size_kb
;
1072 stm32l4_info
->bank1_sectors
= num_pages
;
1073 const bool use_dbank_bit
= flash_size_kb
== part_info
->max_flash_size_kb
;
1074 if ((use_dbank_bit
&& (options
& BIT(22))) ||
1075 (!use_dbank_bit
&& (options
& BIT(21)))) {
1076 stm32l4_info
->dual_bank_mode
= true;
1078 num_pages
= flash_size_kb
/ page_size_kb
;
1079 stm32l4_info
->bank1_sectors
= num_pages
/ 2;
1082 case 0x495: /* STM32WB5x */
1083 case 0x496: /* STM32WB3x */
1084 /* single bank flash */
1086 num_pages
= flash_size_kb
/ page_size_kb
;
1087 stm32l4_info
->bank1_sectors
= num_pages
;
1090 LOG_ERROR("unsupported device");
1094 LOG_INFO("flash mode : %s-bank", stm32l4_info
->dual_bank_mode
? "dual" : "single");
1096 const int gap_size_kb
= stm32l4_info
->hole_sectors
* page_size_kb
;
1098 if (gap_size_kb
!= 0) {
1099 LOG_INFO("gap detected from 0x%08x to 0x%08x",
1100 STM32_FLASH_BANK_BASE
+ stm32l4_info
->bank1_sectors
1101 * page_size_kb
* 1024,
1102 STM32_FLASH_BANK_BASE
+ (stm32l4_info
->bank1_sectors
1103 * page_size_kb
+ gap_size_kb
) * 1024 - 1);
1106 /* number of significant bits in WRPxxR differs per device,
1107 * always right adjusted, on some devices non-implemented
1108 * bits read as '0', on others as '1' ...
1109 * notably G4 Cat. 2 implement only 6 bits, contradicting the RM
1112 /* use *max_flash_size* instead of actual size as the trimmed versions
1113 * certainly use the same number of bits
1114 * max_flash_size is always power of two, so max_pages too
1116 uint32_t max_pages
= stm32l4_info
->part_info
->max_flash_size_kb
/ page_size_kb
;
1117 assert((max_pages
& (max_pages
- 1)) == 0);
1119 /* in dual bank mode number of pages is doubled, but extra bit is bank selection */
1120 stm32l4_info
->wrpxxr_mask
= ((max_pages
>> (stm32l4_info
->dual_bank_mode
? 1 : 0)) - 1);
1121 assert((stm32l4_info
->wrpxxr_mask
& 0xFFFF0000) == 0);
1122 LOG_DEBUG("WRPxxR mask 0x%04" PRIx16
, (uint16_t)stm32l4_info
->wrpxxr_mask
);
1124 free(bank
->sectors
);
1126 bank
->size
= (flash_size_kb
+ gap_size_kb
) * 1024;
1127 bank
->base
= STM32_FLASH_BANK_BASE
;
1128 bank
->num_sectors
= num_pages
;
1129 bank
->sectors
= malloc(sizeof(struct flash_sector
) * bank
->num_sectors
);
1130 if (bank
->sectors
== NULL
) {
1131 LOG_ERROR("failed to allocate bank sectors");
1135 for (unsigned int i
= 0; i
< bank
->num_sectors
; i
++) {
1136 bank
->sectors
[i
].offset
= i
* page_size_kb
* 1024;
1137 /* in dual bank configuration, if there is a gap between banks
1138 * we fix up the sector offset to consider this gap */
1139 if (i
>= stm32l4_info
->bank1_sectors
&& stm32l4_info
->hole_sectors
)
1140 bank
->sectors
[i
].offset
+= gap_size_kb
* 1024;
1141 bank
->sectors
[i
].size
= page_size_kb
* 1024;
1142 bank
->sectors
[i
].is_erased
= -1;
1143 bank
->sectors
[i
].is_protected
= 1;
1146 stm32l4_info
->probed
= true;
1150 static int stm32l4_auto_probe(struct flash_bank
*bank
)
1152 struct stm32l4_flash_bank
*stm32l4_info
= bank
->driver_priv
;
1153 if (stm32l4_info
->probed
)
1156 return stm32l4_probe(bank
);
1159 static int get_stm32l4_info(struct flash_bank
*bank
, char *buf
, int buf_size
)
1161 struct stm32l4_flash_bank
*stm32l4_info
= bank
->driver_priv
;
1162 const struct stm32l4_part_info
*part_info
= stm32l4_info
->part_info
;
1165 const char *rev_str
= NULL
;
1166 uint16_t rev_id
= stm32l4_info
->idcode
>> 16;
1167 for (unsigned int i
= 0; i
< part_info
->num_revs
; i
++) {
1168 if (rev_id
== part_info
->revs
[i
].rev
) {
1169 rev_str
= part_info
->revs
[i
].str
;
1171 if (rev_str
!= NULL
) {
1172 snprintf(buf
, buf_size
, "%s - Rev: %s%s",
1173 part_info
->device_str
, rev_str
, stm32l4_info
->probed
?
1174 (stm32l4_info
->dual_bank_mode
? " dual-bank" : " single-bank") : "");
1180 snprintf(buf
, buf_size
, "%s - Rev: unknown (0x%04x)%s",
1181 part_info
->device_str
, rev_id
, stm32l4_info
->probed
?
1182 (stm32l4_info
->dual_bank_mode
? " dual-bank" : " single-bank") : "");
1185 snprintf(buf
, buf_size
, "Cannot identify target as an %s device", device_families
);
1192 static int stm32l4_mass_erase(struct flash_bank
*bank
)
1194 int retval
, retval2
;
1195 struct target
*target
= bank
->target
;
1196 struct stm32l4_flash_bank
*stm32l4_info
= bank
->driver_priv
;
1198 uint32_t action
= FLASH_MER1
;
1200 if (stm32l4_info
->part_info
->has_dual_bank
)
1201 action
|= FLASH_MER2
;
1203 if (target
->state
!= TARGET_HALTED
) {
1204 LOG_ERROR("Target not halted");
1205 return ERROR_TARGET_NOT_HALTED
;
1208 retval
= stm32l4_unlock_reg(bank
);
1209 if (retval
!= ERROR_OK
)
1212 /* mass erase flash memory */
1213 retval
= stm32l4_wait_status_busy(bank
, FLASH_ERASE_TIMEOUT
/ 10);
1214 if (retval
!= ERROR_OK
)
1217 retval
= stm32l4_write_flash_reg_by_index(bank
, STM32_FLASH_CR_INDEX
, action
);
1218 if (retval
!= ERROR_OK
)
1221 retval
= stm32l4_write_flash_reg_by_index(bank
, STM32_FLASH_CR_INDEX
, action
| FLASH_STRT
);
1222 if (retval
!= ERROR_OK
)
1225 retval
= stm32l4_wait_status_busy(bank
, FLASH_ERASE_TIMEOUT
);
1228 retval2
= stm32l4_write_flash_reg_by_index(bank
, STM32_FLASH_CR_INDEX
, FLASH_LOCK
);
1230 if (retval
!= ERROR_OK
)
1236 COMMAND_HANDLER(stm32l4_handle_mass_erase_command
)
1239 command_print(CMD
, "stm32l4x mass_erase <STM32L4 bank>");
1240 return ERROR_COMMAND_SYNTAX_ERROR
;
1243 struct flash_bank
*bank
;
1244 int retval
= CALL_COMMAND_HANDLER(flash_command_get_bank
, 0, &bank
);
1245 if (ERROR_OK
!= retval
)
1248 retval
= stm32l4_mass_erase(bank
);
1249 if (retval
== ERROR_OK
) {
1250 /* set all sectors as erased */
1251 for (unsigned int i
= 0; i
< bank
->num_sectors
; i
++)
1252 bank
->sectors
[i
].is_erased
= 1;
1254 command_print(CMD
, "stm32l4x mass erase complete");
1256 command_print(CMD
, "stm32l4x mass erase failed");
1262 COMMAND_HANDLER(stm32l4_handle_option_read_command
)
1265 command_print(CMD
, "stm32l4x option_read <STM32L4 bank> <option_reg offset>");
1266 return ERROR_COMMAND_SYNTAX_ERROR
;
1269 struct flash_bank
*bank
;
1270 int retval
= CALL_COMMAND_HANDLER(flash_command_get_bank
, 0, &bank
);
1271 if (ERROR_OK
!= retval
)
1274 uint32_t reg_offset
, reg_addr
;
1277 reg_offset
= strtoul(CMD_ARGV
[1], NULL
, 16);
1278 reg_addr
= stm32l4_get_flash_reg(bank
, reg_offset
);
1280 retval
= stm32l4_read_flash_reg(bank
, reg_offset
, &value
);
1281 if (ERROR_OK
!= retval
)
1284 command_print(CMD
, "Option Register: <0x%" PRIx32
"> = 0x%" PRIx32
"", reg_addr
, value
);
1289 COMMAND_HANDLER(stm32l4_handle_option_write_command
)
1292 command_print(CMD
, "stm32l4x option_write <STM32L4 bank> <option_reg offset> <value> [mask]");
1293 return ERROR_COMMAND_SYNTAX_ERROR
;
1296 struct flash_bank
*bank
;
1297 int retval
= CALL_COMMAND_HANDLER(flash_command_get_bank
, 0, &bank
);
1298 if (ERROR_OK
!= retval
)
1301 uint32_t reg_offset
;
1303 uint32_t mask
= 0xFFFFFFFF;
1305 reg_offset
= strtoul(CMD_ARGV
[1], NULL
, 16);
1306 value
= strtoul(CMD_ARGV
[2], NULL
, 16);
1308 mask
= strtoul(CMD_ARGV
[3], NULL
, 16);
1310 command_print(CMD
, "%s Option written.\n"
1311 "INFO: a reset or power cycle is required "
1312 "for the new settings to take effect.", bank
->driver
->name
);
1314 retval
= stm32l4_write_option(bank
, reg_offset
, value
, mask
);
1318 COMMAND_HANDLER(stm32l4_handle_option_load_command
)
1321 return ERROR_COMMAND_SYNTAX_ERROR
;
1323 struct flash_bank
*bank
;
1324 int retval
= CALL_COMMAND_HANDLER(flash_command_get_bank
, 0, &bank
);
1325 if (ERROR_OK
!= retval
)
1328 retval
= stm32l4_unlock_reg(bank
);
1329 if (ERROR_OK
!= retval
)
1332 retval
= stm32l4_unlock_option_reg(bank
);
1333 if (ERROR_OK
!= retval
)
1336 /* Set OBL_LAUNCH bit in CR -> system reset and option bytes reload,
1337 * but the RMs explicitly do *NOT* list this as power-on reset cause, and:
1338 * "Note: If the read protection is set while the debugger is still
1339 * connected through JTAG/SWD, apply a POR (power-on reset) instead of a system reset."
1341 retval
= stm32l4_write_flash_reg_by_index(bank
, STM32_FLASH_CR_INDEX
, FLASH_OBL_LAUNCH
);
1343 command_print(CMD
, "stm32l4x option load completed. Power-on reset might be required");
1345 /* Need to re-probe after change */
1346 struct stm32l4_flash_bank
*stm32l4_info
= bank
->driver_priv
;
1347 stm32l4_info
->probed
= false;
1352 COMMAND_HANDLER(stm32l4_handle_lock_command
)
1354 struct target
*target
= NULL
;
1357 return ERROR_COMMAND_SYNTAX_ERROR
;
1359 struct flash_bank
*bank
;
1360 int retval
= CALL_COMMAND_HANDLER(flash_command_get_bank
, 0, &bank
);
1361 if (ERROR_OK
!= retval
)
1364 target
= bank
->target
;
1366 if (target
->state
!= TARGET_HALTED
) {
1367 LOG_ERROR("Target not halted");
1368 return ERROR_TARGET_NOT_HALTED
;
1371 /* set readout protection level 1 by erasing the RDP option byte */
1372 struct stm32l4_flash_bank
*stm32l4_info
= bank
->driver_priv
;
1373 if (stm32l4_write_option(bank
, stm32l4_info
->flash_regs
[STM32_FLASH_OPTR_INDEX
], 0, 0x000000FF) != ERROR_OK
) {
1374 command_print(CMD
, "%s failed to lock device", bank
->driver
->name
);
1381 COMMAND_HANDLER(stm32l4_handle_unlock_command
)
1383 struct target
*target
= NULL
;
1386 return ERROR_COMMAND_SYNTAX_ERROR
;
1388 struct flash_bank
*bank
;
1389 int retval
= CALL_COMMAND_HANDLER(flash_command_get_bank
, 0, &bank
);
1390 if (ERROR_OK
!= retval
)
1393 target
= bank
->target
;
1395 if (target
->state
!= TARGET_HALTED
) {
1396 LOG_ERROR("Target not halted");
1397 return ERROR_TARGET_NOT_HALTED
;
1400 struct stm32l4_flash_bank
*stm32l4_info
= bank
->driver_priv
;
1401 if (stm32l4_write_option(bank
, stm32l4_info
->flash_regs
[STM32_FLASH_OPTR_INDEX
],
1402 RDP_LEVEL_0
, 0x000000FF) != ERROR_OK
) {
1403 command_print(CMD
, "%s failed to unlock device", bank
->driver
->name
);
1410 static const struct command_registration stm32l4_exec_command_handlers
[] = {
1413 .handler
= stm32l4_handle_lock_command
,
1414 .mode
= COMMAND_EXEC
,
1416 .help
= "Lock entire flash device.",
1420 .handler
= stm32l4_handle_unlock_command
,
1421 .mode
= COMMAND_EXEC
,
1423 .help
= "Unlock entire protected flash device.",
1426 .name
= "mass_erase",
1427 .handler
= stm32l4_handle_mass_erase_command
,
1428 .mode
= COMMAND_EXEC
,
1430 .help
= "Erase entire flash device.",
1433 .name
= "option_read",
1434 .handler
= stm32l4_handle_option_read_command
,
1435 .mode
= COMMAND_EXEC
,
1436 .usage
= "bank_id reg_offset",
1437 .help
= "Read & Display device option bytes.",
1440 .name
= "option_write",
1441 .handler
= stm32l4_handle_option_write_command
,
1442 .mode
= COMMAND_EXEC
,
1443 .usage
= "bank_id reg_offset value mask",
1444 .help
= "Write device option bit fields with provided value.",
1447 .name
= "option_load",
1448 .handler
= stm32l4_handle_option_load_command
,
1449 .mode
= COMMAND_EXEC
,
1451 .help
= "Force re-load of device options (will cause device reset).",
1453 COMMAND_REGISTRATION_DONE
1456 static const struct command_registration stm32l4_command_handlers
[] = {
1459 .mode
= COMMAND_ANY
,
1460 .help
= "stm32l4x flash command group",
1462 .chain
= stm32l4_exec_command_handlers
,
1464 COMMAND_REGISTRATION_DONE
1467 const struct flash_driver stm32l4x_flash
= {
1469 .commands
= stm32l4_command_handlers
,
1470 .flash_bank_command
= stm32l4_flash_bank_command
,
1471 .erase
= stm32l4_erase
,
1472 .protect
= stm32l4_protect
,
1473 .write
= stm32l4_write
,
1474 .read
= default_flash_read
,
1475 .probe
= stm32l4_probe
,
1476 .auto_probe
= stm32l4_auto_probe
,
1477 .erase_check
= default_flash_blank_check
,
1478 .protect_check
= stm32l4_protect_check
,
1479 .info
= get_stm32l4_info
,
1480 .free_driver_priv
= default_flash_free_driver_priv
,
Linking to existing account procedure
If you already have an account and want to add another login method
you
MUST first sign in with your existing account and
then change URL to read
https://review.openocd.org/login/?link
to get to this page again but this time it'll work for linking. Thank you.
SSH host keys fingerprints
1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=.. |
|+o.. . |
|*.o . . |
|+B . . . |
|Bo. = o S |
|Oo.+ + = |
|oB=.* = . o |
| =+=.+ + E |
|. .=o . o |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)