1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * Copyright (C) 2008 by Spencer Oliver *
6 * spen@spen-soft.co.uk *
8 * Copyright (C) 2011 by Andreas Fritiofson *
9 * andreas.fritiofson@gmail.com *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
16 * This program is distributed in the hope that it will be useful, *
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
19 * GNU General Public License for more details. *
21 * You should have received a copy of the GNU General Public License *
22 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
23 ***************************************************************************/
30 #include <helper/binarybuffer.h>
31 #include <target/algorithm.h>
32 #include <target/cortex_m.h>
34 /* stm32x register locations */
36 #define FLASH_REG_BASE_B0 0x40022000
37 #define FLASH_REG_BASE_B1 0x40022040
39 #define STM32_FLASH_ACR 0x00
40 #define STM32_FLASH_KEYR 0x04
41 #define STM32_FLASH_OPTKEYR 0x08
42 #define STM32_FLASH_SR 0x0C
43 #define STM32_FLASH_CR 0x10
44 #define STM32_FLASH_AR 0x14
45 #define STM32_FLASH_OBR 0x1C
46 #define STM32_FLASH_WRPR 0x20
48 /* TODO: Check if code using these really should be hard coded to bank 0.
49 * There are valid cases, on dual flash devices the protection of the
50 * second bank is done on the bank0 reg's. */
51 #define STM32_FLASH_ACR_B0 0x40022000
52 #define STM32_FLASH_KEYR_B0 0x40022004
53 #define STM32_FLASH_OPTKEYR_B0 0x40022008
54 #define STM32_FLASH_SR_B0 0x4002200C
55 #define STM32_FLASH_CR_B0 0x40022010
56 #define STM32_FLASH_AR_B0 0x40022014
57 #define STM32_FLASH_OBR_B0 0x4002201C
58 #define STM32_FLASH_WRPR_B0 0x40022020
60 /* option byte location */
62 #define STM32_OB_RDP 0x1FFFF800
63 #define STM32_OB_USER 0x1FFFF802
64 #define STM32_OB_DATA0 0x1FFFF804
65 #define STM32_OB_DATA1 0x1FFFF806
66 #define STM32_OB_WRP0 0x1FFFF808
67 #define STM32_OB_WRP1 0x1FFFF80A
68 #define STM32_OB_WRP2 0x1FFFF80C
69 #define STM32_OB_WRP3 0x1FFFF80E
71 /* FLASH_CR register bits */
73 #define FLASH_PG (1 << 0)
74 #define FLASH_PER (1 << 1)
75 #define FLASH_MER (1 << 2)
76 #define FLASH_OPTPG (1 << 4)
77 #define FLASH_OPTER (1 << 5)
78 #define FLASH_STRT (1 << 6)
79 #define FLASH_LOCK (1 << 7)
80 #define FLASH_OPTWRE (1 << 9)
81 #define FLASH_OBL_LAUNCH (1 << 13) /* except stm32f1x series */
83 /* FLASH_SR register bits */
85 #define FLASH_BSY (1 << 0)
86 #define FLASH_PGERR (1 << 2)
87 #define FLASH_WRPRTERR (1 << 4)
88 #define FLASH_EOP (1 << 5)
90 /* STM32_FLASH_OBR bit definitions (reading) */
95 #define OPT_RDRSTSTOP 3
96 #define OPT_RDRSTSTDBY 4
97 #define OPT_BFB2 5 /* dual flash bank only */
99 /* register unlock keys */
101 #define KEY1 0x45670123
102 #define KEY2 0xCDEF89AB
106 #define FLASH_WRITE_TIMEOUT 10
107 #define FLASH_ERASE_TIMEOUT 100
109 struct stm32x_options
{
116 struct stm32x_flash_bank
{
117 struct stm32x_options option_bytes
;
122 /* used to access dual flash bank stm32xl */
123 bool can_load_options
;
124 uint32_t register_base
;
126 int user_data_offset
;
128 uint32_t user_bank_size
;
131 static int stm32x_mass_erase(struct flash_bank
*bank
);
132 static int stm32x_get_device_id(struct flash_bank
*bank
, uint32_t *device_id
);
133 static int stm32x_write_block(struct flash_bank
*bank
, const uint8_t *buffer
,
134 uint32_t address
, uint32_t hwords_count
);
136 /* flash bank stm32x <base> <size> 0 0 <target#>
138 FLASH_BANK_COMMAND_HANDLER(stm32x_flash_bank_command
)
140 struct stm32x_flash_bank
*stm32x_info
;
143 return ERROR_COMMAND_SYNTAX_ERROR
;
145 stm32x_info
= malloc(sizeof(struct stm32x_flash_bank
));
147 bank
->driver_priv
= stm32x_info
;
148 stm32x_info
->probed
= false;
149 stm32x_info
->has_dual_banks
= false;
150 stm32x_info
->can_load_options
= false;
151 stm32x_info
->register_base
= FLASH_REG_BASE_B0
;
152 stm32x_info
->user_bank_size
= bank
->size
;
157 static inline int stm32x_get_flash_reg(struct flash_bank
*bank
, uint32_t reg
)
159 struct stm32x_flash_bank
*stm32x_info
= bank
->driver_priv
;
160 return reg
+ stm32x_info
->register_base
;
163 static inline int stm32x_get_flash_status(struct flash_bank
*bank
, uint32_t *status
)
165 struct target
*target
= bank
->target
;
166 return target_read_u32(target
, stm32x_get_flash_reg(bank
, STM32_FLASH_SR
), status
);
169 static int stm32x_wait_status_busy(struct flash_bank
*bank
, int timeout
)
171 struct target
*target
= bank
->target
;
173 int retval
= ERROR_OK
;
175 /* wait for busy to clear */
177 retval
= stm32x_get_flash_status(bank
, &status
);
178 if (retval
!= ERROR_OK
)
180 LOG_DEBUG("status: 0x%" PRIx32
"", status
);
181 if ((status
& FLASH_BSY
) == 0)
183 if (timeout
-- <= 0) {
184 LOG_ERROR("timed out waiting for flash");
190 if (status
& FLASH_WRPRTERR
) {
191 LOG_ERROR("stm32x device protected");
195 if (status
& FLASH_PGERR
) {
196 LOG_ERROR("stm32x device programming failed");
200 /* Clear but report errors */
201 if (status
& (FLASH_WRPRTERR
| FLASH_PGERR
)) {
202 /* If this operation fails, we ignore it and report the original
205 target_write_u32(target
, stm32x_get_flash_reg(bank
, STM32_FLASH_SR
),
206 FLASH_WRPRTERR
| FLASH_PGERR
);
211 static int stm32x_check_operation_supported(struct flash_bank
*bank
)
213 struct stm32x_flash_bank
*stm32x_info
= bank
->driver_priv
;
215 /* if we have a dual flash bank device then
216 * we need to perform option byte stuff on bank0 only */
217 if (stm32x_info
->register_base
!= FLASH_REG_BASE_B0
) {
218 LOG_ERROR("Option byte operations must use bank 0");
219 return ERROR_FLASH_OPERATION_FAILED
;
225 static int stm32x_read_options(struct flash_bank
*bank
)
227 struct stm32x_flash_bank
*stm32x_info
= bank
->driver_priv
;
228 struct target
*target
= bank
->target
;
229 uint32_t option_bytes
;
232 /* read user and read protection option bytes, user data option bytes */
233 retval
= target_read_u32(target
, STM32_FLASH_OBR_B0
, &option_bytes
);
234 if (retval
!= ERROR_OK
)
237 stm32x_info
->option_bytes
.rdp
= (option_bytes
& (1 << OPT_READOUT
)) ? 0 : stm32x_info
->default_rdp
;
238 stm32x_info
->option_bytes
.user
= (option_bytes
>> stm32x_info
->option_offset
>> 2) & 0xff;
239 stm32x_info
->option_bytes
.data
= (option_bytes
>> stm32x_info
->user_data_offset
) & 0xffff;
241 /* read write protection option bytes */
242 retval
= target_read_u32(target
, STM32_FLASH_WRPR_B0
, &stm32x_info
->option_bytes
.protection
);
243 if (retval
!= ERROR_OK
)
249 static int stm32x_erase_options(struct flash_bank
*bank
)
251 struct stm32x_flash_bank
*stm32x_info
= bank
->driver_priv
;
252 struct target
*target
= bank
->target
;
254 /* read current options */
255 stm32x_read_options(bank
);
257 /* unlock flash registers */
258 int retval
= target_write_u32(target
, STM32_FLASH_KEYR_B0
, KEY1
);
259 if (retval
!= ERROR_OK
)
262 retval
= target_write_u32(target
, STM32_FLASH_KEYR_B0
, KEY2
);
263 if (retval
!= ERROR_OK
)
266 /* unlock option flash registers */
267 retval
= target_write_u32(target
, STM32_FLASH_OPTKEYR_B0
, KEY1
);
268 if (retval
!= ERROR_OK
)
270 retval
= target_write_u32(target
, STM32_FLASH_OPTKEYR_B0
, KEY2
);
271 if (retval
!= ERROR_OK
)
274 /* erase option bytes */
275 retval
= target_write_u32(target
, STM32_FLASH_CR_B0
, FLASH_OPTER
| FLASH_OPTWRE
);
276 if (retval
!= ERROR_OK
)
278 retval
= target_write_u32(target
, STM32_FLASH_CR_B0
, FLASH_OPTER
| FLASH_STRT
| FLASH_OPTWRE
);
279 if (retval
!= ERROR_OK
)
282 retval
= stm32x_wait_status_busy(bank
, FLASH_ERASE_TIMEOUT
);
283 if (retval
!= ERROR_OK
)
286 /* clear read protection option byte
287 * this will also force a device unlock if set */
288 stm32x_info
->option_bytes
.rdp
= stm32x_info
->default_rdp
;
293 static int stm32x_write_options(struct flash_bank
*bank
)
295 struct stm32x_flash_bank
*stm32x_info
= NULL
;
296 struct target
*target
= bank
->target
;
298 stm32x_info
= bank
->driver_priv
;
300 /* unlock flash registers */
301 int retval
= target_write_u32(target
, STM32_FLASH_KEYR_B0
, KEY1
);
302 if (retval
!= ERROR_OK
)
304 retval
= target_write_u32(target
, STM32_FLASH_KEYR_B0
, KEY2
);
305 if (retval
!= ERROR_OK
)
308 /* unlock option flash registers */
309 retval
= target_write_u32(target
, STM32_FLASH_OPTKEYR_B0
, KEY1
);
310 if (retval
!= ERROR_OK
)
312 retval
= target_write_u32(target
, STM32_FLASH_OPTKEYR_B0
, KEY2
);
313 if (retval
!= ERROR_OK
)
316 /* program option bytes */
317 retval
= target_write_u32(target
, STM32_FLASH_CR_B0
, FLASH_OPTPG
| FLASH_OPTWRE
);
318 if (retval
!= ERROR_OK
)
321 uint8_t opt_bytes
[16];
323 target_buffer_set_u16(target
, opt_bytes
, stm32x_info
->option_bytes
.rdp
);
324 target_buffer_set_u16(target
, opt_bytes
+ 2, stm32x_info
->option_bytes
.user
);
325 target_buffer_set_u16(target
, opt_bytes
+ 4, stm32x_info
->option_bytes
.data
& 0xff);
326 target_buffer_set_u16(target
, opt_bytes
+ 6, (stm32x_info
->option_bytes
.data
>> 8) & 0xff);
327 target_buffer_set_u16(target
, opt_bytes
+ 8, stm32x_info
->option_bytes
.protection
& 0xff);
328 target_buffer_set_u16(target
, opt_bytes
+ 10, (stm32x_info
->option_bytes
.protection
>> 8) & 0xff);
329 target_buffer_set_u16(target
, opt_bytes
+ 12, (stm32x_info
->option_bytes
.protection
>> 16) & 0xff);
330 target_buffer_set_u16(target
, opt_bytes
+ 14, (stm32x_info
->option_bytes
.protection
>> 24) & 0xff);
332 /* Block write is preferred in favour of operation with ancient ST-Link
333 * firmwares without 16-bit memory access. See
334 * 480: flash: stm32f1x: write option bytes using the loader
335 * https://review.openocd.org/c/openocd/+/480
337 retval
= stm32x_write_block(bank
, opt_bytes
, STM32_OB_RDP
, sizeof(opt_bytes
) / 2);
338 if (retval
!= ERROR_OK
)
341 retval
= target_write_u32(target
, STM32_FLASH_CR_B0
, FLASH_LOCK
);
342 if (retval
!= ERROR_OK
)
348 static int stm32x_protect_check(struct flash_bank
*bank
)
350 struct target
*target
= bank
->target
;
353 int retval
= stm32x_check_operation_supported(bank
);
354 if (retval
!= ERROR_OK
)
357 /* medium density - each bit refers to a 4 sector protection block
358 * high density - each bit refers to a 2 sector protection block
359 * bit 31 refers to all remaining sectors in a bank */
360 retval
= target_read_u32(target
, STM32_FLASH_WRPR_B0
, &protection
);
361 if (retval
!= ERROR_OK
)
364 for (unsigned int i
= 0; i
< bank
->num_prot_blocks
; i
++)
365 bank
->prot_blocks
[i
].is_protected
= (protection
& (1 << i
)) ? 0 : 1;
370 static int stm32x_erase(struct flash_bank
*bank
, unsigned int first
,
373 struct target
*target
= bank
->target
;
375 if (bank
->target
->state
!= TARGET_HALTED
) {
376 LOG_ERROR("Target not halted");
377 return ERROR_TARGET_NOT_HALTED
;
380 if ((first
== 0) && (last
== (bank
->num_sectors
- 1)))
381 return stm32x_mass_erase(bank
);
383 /* unlock flash registers */
384 int retval
= target_write_u32(target
, stm32x_get_flash_reg(bank
, STM32_FLASH_KEYR
), KEY1
);
385 if (retval
!= ERROR_OK
)
387 retval
= target_write_u32(target
, stm32x_get_flash_reg(bank
, STM32_FLASH_KEYR
), KEY2
);
388 if (retval
!= ERROR_OK
)
391 for (unsigned int i
= first
; i
<= last
; i
++) {
392 retval
= target_write_u32(target
, stm32x_get_flash_reg(bank
, STM32_FLASH_CR
), FLASH_PER
);
393 if (retval
!= ERROR_OK
)
395 retval
= target_write_u32(target
, stm32x_get_flash_reg(bank
, STM32_FLASH_AR
),
396 bank
->base
+ bank
->sectors
[i
].offset
);
397 if (retval
!= ERROR_OK
)
399 retval
= target_write_u32(target
,
400 stm32x_get_flash_reg(bank
, STM32_FLASH_CR
), FLASH_PER
| FLASH_STRT
);
401 if (retval
!= ERROR_OK
)
404 retval
= stm32x_wait_status_busy(bank
, FLASH_ERASE_TIMEOUT
);
405 if (retval
!= ERROR_OK
)
409 retval
= target_write_u32(target
, stm32x_get_flash_reg(bank
, STM32_FLASH_CR
), FLASH_LOCK
);
410 if (retval
!= ERROR_OK
)
416 static int stm32x_protect(struct flash_bank
*bank
, int set
, unsigned int first
,
419 struct target
*target
= bank
->target
;
420 struct stm32x_flash_bank
*stm32x_info
= bank
->driver_priv
;
422 if (target
->state
!= TARGET_HALTED
) {
423 LOG_ERROR("Target not halted");
424 return ERROR_TARGET_NOT_HALTED
;
427 int retval
= stm32x_check_operation_supported(bank
);
428 if (retval
!= ERROR_OK
)
431 retval
= stm32x_erase_options(bank
);
432 if (retval
!= ERROR_OK
) {
433 LOG_ERROR("stm32x failed to erase options");
437 for (unsigned int i
= first
; i
<= last
; i
++) {
439 stm32x_info
->option_bytes
.protection
&= ~(1 << i
);
441 stm32x_info
->option_bytes
.protection
|= (1 << i
);
444 return stm32x_write_options(bank
);
447 static int stm32x_write_block_async(struct flash_bank
*bank
, const uint8_t *buffer
,
448 uint32_t address
, uint32_t hwords_count
)
450 struct stm32x_flash_bank
*stm32x_info
= bank
->driver_priv
;
451 struct target
*target
= bank
->target
;
452 uint32_t buffer_size
= 16384;
453 struct working_area
*write_algorithm
;
454 struct working_area
*source
;
455 struct reg_param reg_params
[5];
456 struct armv7m_algorithm armv7m_info
;
457 int retval
= ERROR_OK
;
459 static const uint8_t stm32x_flash_write_code
[] = {
460 #include "../../../contrib/loaders/flash/stm32/stm32f1x.inc"
463 /* flash write code */
464 if (target_alloc_working_area(target
, sizeof(stm32x_flash_write_code
),
465 &write_algorithm
) != ERROR_OK
) {
466 LOG_WARNING("no working area available, can't do block memory writes");
467 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
470 retval
= target_write_buffer(target
, write_algorithm
->address
,
471 sizeof(stm32x_flash_write_code
), stm32x_flash_write_code
);
472 if (retval
!= ERROR_OK
) {
473 target_free_working_area(target
, write_algorithm
);
478 while (target_alloc_working_area_try(target
, buffer_size
, &source
) != ERROR_OK
) {
480 buffer_size
&= ~3UL; /* Make sure it's 4 byte aligned */
481 if (buffer_size
<= 256) {
482 /* we already allocated the writing code, but failed to get a
483 * buffer, free the algorithm */
484 target_free_working_area(target
, write_algorithm
);
486 LOG_WARNING("no large enough working area available, can't do block memory writes");
487 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
491 init_reg_param(®_params
[0], "r0", 32, PARAM_IN_OUT
); /* flash base (in), status (out) */
492 init_reg_param(®_params
[1], "r1", 32, PARAM_OUT
); /* count (halfword-16bit) */
493 init_reg_param(®_params
[2], "r2", 32, PARAM_OUT
); /* buffer start */
494 init_reg_param(®_params
[3], "r3", 32, PARAM_OUT
); /* buffer end */
495 init_reg_param(®_params
[4], "r4", 32, PARAM_IN_OUT
); /* target address */
497 buf_set_u32(reg_params
[0].value
, 0, 32, stm32x_info
->register_base
);
498 buf_set_u32(reg_params
[1].value
, 0, 32, hwords_count
);
499 buf_set_u32(reg_params
[2].value
, 0, 32, source
->address
);
500 buf_set_u32(reg_params
[3].value
, 0, 32, source
->address
+ source
->size
);
501 buf_set_u32(reg_params
[4].value
, 0, 32, address
);
503 armv7m_info
.common_magic
= ARMV7M_COMMON_MAGIC
;
504 armv7m_info
.core_mode
= ARM_MODE_THREAD
;
506 retval
= target_run_flash_async_algorithm(target
, buffer
, hwords_count
, 2,
509 source
->address
, source
->size
,
510 write_algorithm
->address
, 0,
513 if (retval
== ERROR_FLASH_OPERATION_FAILED
) {
514 LOG_ERROR("flash write failed at address 0x%"PRIx32
,
515 buf_get_u32(reg_params
[4].value
, 0, 32));
517 if (buf_get_u32(reg_params
[0].value
, 0, 32) & FLASH_PGERR
) {
518 LOG_ERROR("flash memory not erased before writing");
519 /* Clear but report errors */
520 target_write_u32(target
, stm32x_get_flash_reg(bank
, STM32_FLASH_SR
), FLASH_PGERR
);
523 if (buf_get_u32(reg_params
[0].value
, 0, 32) & FLASH_WRPRTERR
) {
524 LOG_ERROR("flash memory write protected");
525 /* Clear but report errors */
526 target_write_u32(target
, stm32x_get_flash_reg(bank
, STM32_FLASH_SR
), FLASH_WRPRTERR
);
530 target_free_working_area(target
, source
);
531 target_free_working_area(target
, write_algorithm
);
533 destroy_reg_param(®_params
[0]);
534 destroy_reg_param(®_params
[1]);
535 destroy_reg_param(®_params
[2]);
536 destroy_reg_param(®_params
[3]);
537 destroy_reg_param(®_params
[4]);
542 /** Writes a block to flash either using target algorithm
543 * or use fallback, host controlled halfword-by-halfword access.
544 * Flash controller must be unlocked before this call.
546 static int stm32x_write_block(struct flash_bank
*bank
,
547 const uint8_t *buffer
, uint32_t address
, uint32_t hwords_count
)
549 struct target
*target
= bank
->target
;
551 /* try using a block write - on ARM architecture or... */
552 int retval
= stm32x_write_block_async(bank
, buffer
, address
, hwords_count
);
554 if (retval
== ERROR_TARGET_RESOURCE_NOT_AVAILABLE
) {
555 /* if block write failed (no sufficient working area),
556 * we use normal (slow) single halfword accesses */
557 LOG_WARNING("couldn't use block writes, falling back to single memory accesses");
559 while (hwords_count
> 0) {
560 retval
= target_write_memory(target
, address
, 2, 1, buffer
);
561 if (retval
!= ERROR_OK
)
564 retval
= stm32x_wait_status_busy(bank
, 5);
565 if (retval
!= ERROR_OK
)
576 static int stm32x_write(struct flash_bank
*bank
, const uint8_t *buffer
,
577 uint32_t offset
, uint32_t count
)
579 struct target
*target
= bank
->target
;
580 uint8_t *new_buffer
= NULL
;
582 if (bank
->target
->state
!= TARGET_HALTED
) {
583 LOG_ERROR("Target not halted");
584 return ERROR_TARGET_NOT_HALTED
;
588 LOG_ERROR("offset 0x%" PRIx32
" breaks required 2-byte alignment", offset
);
589 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
592 /* If there's an odd number of bytes, the data has to be padded. Duplicate
593 * the buffer and use the normal code path with a single block write since
594 * it's probably cheaper than to special case the last odd write using
595 * discrete accesses. */
597 new_buffer
= malloc(count
+ 1);
599 LOG_ERROR("odd number of bytes to write and no memory for padding buffer");
602 LOG_INFO("odd number of bytes to write, padding with 0xff");
603 buffer
= memcpy(new_buffer
, buffer
, count
);
604 new_buffer
[count
++] = 0xff;
609 /* unlock flash registers */
610 retval
= target_write_u32(target
, stm32x_get_flash_reg(bank
, STM32_FLASH_KEYR
), KEY1
);
611 if (retval
!= ERROR_OK
)
613 retval
= target_write_u32(target
, stm32x_get_flash_reg(bank
, STM32_FLASH_KEYR
), KEY2
);
614 if (retval
!= ERROR_OK
)
615 goto reset_pg_and_lock
;
617 /* enable flash programming */
618 retval
= target_write_u32(target
, stm32x_get_flash_reg(bank
, STM32_FLASH_CR
), FLASH_PG
);
619 if (retval
!= ERROR_OK
)
620 goto reset_pg_and_lock
;
623 retval
= stm32x_write_block(bank
, buffer
, bank
->base
+ offset
, count
/ 2);
626 retval2
= target_write_u32(target
, stm32x_get_flash_reg(bank
, STM32_FLASH_CR
), FLASH_LOCK
);
627 if (retval
== ERROR_OK
)
635 static int stm32x_get_device_id(struct flash_bank
*bank
, uint32_t *device_id
)
637 struct target
*target
= bank
->target
;
638 uint32_t device_id_register
= 0;
640 if (!target_was_examined(target
)) {
641 LOG_ERROR("Target not examined yet");
642 return ERROR_TARGET_NOT_EXAMINED
;
645 switch (cortex_m_get_partno_safe(target
)) {
646 case CORTEX_M0_PARTNO
: /* STM32F0x devices */
647 device_id_register
= 0x40015800;
649 case CORTEX_M3_PARTNO
: /* STM32F1x devices */
650 device_id_register
= 0xE0042000;
652 case CORTEX_M4_PARTNO
: /* STM32F3x devices */
653 device_id_register
= 0xE0042000;
655 case CORTEX_M23_PARTNO
: /* GD32E23x devices */
656 device_id_register
= 0x40015800;
659 LOG_ERROR("Cannot identify target as a stm32x");
663 /* read stm32 device id register */
664 int retval
= target_read_u32(target
, device_id_register
, device_id
);
665 if (retval
!= ERROR_OK
)
671 static int stm32x_get_flash_size(struct flash_bank
*bank
, uint16_t *flash_size_in_kb
)
673 struct target
*target
= bank
->target
;
674 uint32_t flash_size_reg
;
676 if (!target_was_examined(target
)) {
677 LOG_ERROR("Target not examined yet");
678 return ERROR_TARGET_NOT_EXAMINED
;
681 switch (cortex_m_get_partno_safe(target
)) {
682 case CORTEX_M0_PARTNO
: /* STM32F0x devices */
683 flash_size_reg
= 0x1FFFF7CC;
685 case CORTEX_M3_PARTNO
: /* STM32F1x devices */
686 flash_size_reg
= 0x1FFFF7E0;
688 case CORTEX_M4_PARTNO
: /* STM32F3x devices */
689 flash_size_reg
= 0x1FFFF7CC;
691 case CORTEX_M23_PARTNO
: /* GD32E23x devices */
692 flash_size_reg
= 0x1FFFF7E0;
695 LOG_ERROR("Cannot identify target as a stm32x");
699 int retval
= target_read_u16(target
, flash_size_reg
, flash_size_in_kb
);
700 if (retval
!= ERROR_OK
)
706 static int stm32x_probe(struct flash_bank
*bank
)
708 struct stm32x_flash_bank
*stm32x_info
= bank
->driver_priv
;
709 uint16_t flash_size_in_kb
;
710 uint16_t max_flash_size_in_kb
;
711 uint32_t dbgmcu_idcode
;
713 uint32_t base_address
= 0x08000000;
715 stm32x_info
->probed
= false;
716 stm32x_info
->register_base
= FLASH_REG_BASE_B0
;
717 stm32x_info
->user_data_offset
= 10;
718 stm32x_info
->option_offset
= 0;
720 /* default factory read protection level 0 */
721 stm32x_info
->default_rdp
= 0xA5;
723 /* read stm32 device id register */
724 int retval
= stm32x_get_device_id(bank
, &dbgmcu_idcode
);
725 if (retval
!= ERROR_OK
)
728 LOG_INFO("device id = 0x%08" PRIx32
"", dbgmcu_idcode
);
730 uint16_t device_id
= dbgmcu_idcode
& 0xfff;
731 uint16_t rev_id
= dbgmcu_idcode
>> 16;
733 /* set page size, protection granularity and max flash size depending on family */
735 case 0x440: /* stm32f05x */
737 stm32x_info
->ppage_size
= 4;
738 max_flash_size_in_kb
= 64;
739 stm32x_info
->user_data_offset
= 16;
740 stm32x_info
->option_offset
= 6;
741 stm32x_info
->default_rdp
= 0xAA;
742 stm32x_info
->can_load_options
= true;
744 case 0x444: /* stm32f03x */
745 case 0x445: /* stm32f04x */
747 stm32x_info
->ppage_size
= 4;
748 max_flash_size_in_kb
= 32;
749 stm32x_info
->user_data_offset
= 16;
750 stm32x_info
->option_offset
= 6;
751 stm32x_info
->default_rdp
= 0xAA;
752 stm32x_info
->can_load_options
= true;
754 case 0x448: /* stm32f07x */
756 stm32x_info
->ppage_size
= 4;
757 max_flash_size_in_kb
= 128;
758 stm32x_info
->user_data_offset
= 16;
759 stm32x_info
->option_offset
= 6;
760 stm32x_info
->default_rdp
= 0xAA;
761 stm32x_info
->can_load_options
= true;
763 case 0x442: /* stm32f09x */
765 stm32x_info
->ppage_size
= 4;
766 max_flash_size_in_kb
= 256;
767 stm32x_info
->user_data_offset
= 16;
768 stm32x_info
->option_offset
= 6;
769 stm32x_info
->default_rdp
= 0xAA;
770 stm32x_info
->can_load_options
= true;
772 case 0x410: /* stm32f1x medium-density */
774 stm32x_info
->ppage_size
= 4;
775 max_flash_size_in_kb
= 128;
776 /* GigaDevice GD32F1x0 & GD32F3x0 & GD32E23x series devices
777 share DEV_ID with STM32F101/2/3 medium-density line,
778 however they use a REV_ID different from any STM32 device.
779 The main difference is another offset of user option bits
780 (like WDG_SW, nRST_STOP, nRST_STDBY) in option byte register
781 (FLASH_OBR/FMC_OBSTAT 0x4002201C).
782 This caused problems e.g. during flash block programming
783 because of unexpected active hardware watchog. */
785 case 0x1303: /* gd32f1x0 */
786 stm32x_info
->user_data_offset
= 16;
787 stm32x_info
->option_offset
= 6;
788 max_flash_size_in_kb
= 64;
790 case 0x1704: /* gd32f3x0 */
791 stm32x_info
->user_data_offset
= 16;
792 stm32x_info
->option_offset
= 6;
794 case 0x1909: /* gd32e23x */
795 stm32x_info
->user_data_offset
= 16;
796 stm32x_info
->option_offset
= 6;
797 max_flash_size_in_kb
= 64;
801 case 0x412: /* stm32f1x low-density */
803 stm32x_info
->ppage_size
= 4;
804 max_flash_size_in_kb
= 32;
806 case 0x414: /* stm32f1x high-density */
808 stm32x_info
->ppage_size
= 2;
809 max_flash_size_in_kb
= 512;
811 case 0x418: /* stm32f1x connectivity */
813 stm32x_info
->ppage_size
= 2;
814 max_flash_size_in_kb
= 256;
816 case 0x430: /* stm32f1 XL-density (dual flash banks) */
818 stm32x_info
->ppage_size
= 2;
819 max_flash_size_in_kb
= 1024;
820 stm32x_info
->has_dual_banks
= true;
822 case 0x420: /* stm32f100xx low- and medium-density value line */
824 stm32x_info
->ppage_size
= 4;
825 max_flash_size_in_kb
= 128;
827 case 0x428: /* stm32f100xx high-density value line */
829 stm32x_info
->ppage_size
= 4;
830 max_flash_size_in_kb
= 512;
832 case 0x422: /* stm32f302/3xb/c */
834 stm32x_info
->ppage_size
= 2;
835 max_flash_size_in_kb
= 256;
836 stm32x_info
->user_data_offset
= 16;
837 stm32x_info
->option_offset
= 6;
838 stm32x_info
->default_rdp
= 0xAA;
839 stm32x_info
->can_load_options
= true;
841 case 0x446: /* stm32f303xD/E */
843 stm32x_info
->ppage_size
= 2;
844 max_flash_size_in_kb
= 512;
845 stm32x_info
->user_data_offset
= 16;
846 stm32x_info
->option_offset
= 6;
847 stm32x_info
->default_rdp
= 0xAA;
848 stm32x_info
->can_load_options
= true;
850 case 0x432: /* stm32f37x */
852 stm32x_info
->ppage_size
= 2;
853 max_flash_size_in_kb
= 256;
854 stm32x_info
->user_data_offset
= 16;
855 stm32x_info
->option_offset
= 6;
856 stm32x_info
->default_rdp
= 0xAA;
857 stm32x_info
->can_load_options
= true;
859 case 0x438: /* stm32f33x */
860 case 0x439: /* stm32f302x6/8 */
862 stm32x_info
->ppage_size
= 2;
863 max_flash_size_in_kb
= 64;
864 stm32x_info
->user_data_offset
= 16;
865 stm32x_info
->option_offset
= 6;
866 stm32x_info
->default_rdp
= 0xAA;
867 stm32x_info
->can_load_options
= true;
870 LOG_WARNING("Cannot identify target as a STM32 family.");
874 /* get flash size from target. */
875 retval
= stm32x_get_flash_size(bank
, &flash_size_in_kb
);
877 /* failed reading flash size or flash size invalid (early silicon),
878 * default to max target family */
879 if (retval
!= ERROR_OK
|| flash_size_in_kb
== 0xffff || flash_size_in_kb
== 0) {
880 LOG_WARNING("STM32 flash size failed, probe inaccurate - assuming %dk flash",
881 max_flash_size_in_kb
);
882 flash_size_in_kb
= max_flash_size_in_kb
;
885 if (stm32x_info
->has_dual_banks
) {
886 /* split reported size into matching bank */
887 if (bank
->base
!= 0x08080000) {
888 /* bank 0 will be fixed 512k */
889 flash_size_in_kb
= 512;
891 flash_size_in_kb
-= 512;
892 /* bank1 also uses a register offset */
893 stm32x_info
->register_base
= FLASH_REG_BASE_B1
;
894 base_address
= 0x08080000;
898 /* if the user sets the size manually then ignore the probed value
899 * this allows us to work around devices that have a invalid flash size register value */
900 if (stm32x_info
->user_bank_size
) {
901 LOG_INFO("ignoring flash probed value, using configured bank size");
902 flash_size_in_kb
= stm32x_info
->user_bank_size
/ 1024;
905 LOG_INFO("flash size = %dkbytes", flash_size_in_kb
);
907 /* did we assign flash size? */
908 assert(flash_size_in_kb
!= 0xffff);
910 /* calculate numbers of pages */
911 int num_pages
= flash_size_in_kb
* 1024 / page_size
;
913 /* check that calculation result makes sense */
914 assert(num_pages
> 0);
917 bank
->sectors
= NULL
;
919 free(bank
->prot_blocks
);
920 bank
->prot_blocks
= NULL
;
922 bank
->base
= base_address
;
923 bank
->size
= (num_pages
* page_size
);
925 bank
->num_sectors
= num_pages
;
926 bank
->sectors
= alloc_block_array(0, page_size
, num_pages
);
930 /* calculate number of write protection blocks */
931 int num_prot_blocks
= num_pages
/ stm32x_info
->ppage_size
;
932 if (num_prot_blocks
> 32)
933 num_prot_blocks
= 32;
935 bank
->num_prot_blocks
= num_prot_blocks
;
936 bank
->prot_blocks
= alloc_block_array(0, stm32x_info
->ppage_size
* page_size
, num_prot_blocks
);
937 if (!bank
->prot_blocks
)
940 if (num_prot_blocks
== 32)
941 bank
->prot_blocks
[31].size
= (num_pages
- (31 * stm32x_info
->ppage_size
)) * page_size
;
943 stm32x_info
->probed
= true;
948 static int stm32x_auto_probe(struct flash_bank
*bank
)
950 struct stm32x_flash_bank
*stm32x_info
= bank
->driver_priv
;
951 if (stm32x_info
->probed
)
953 return stm32x_probe(bank
);
957 COMMAND_HANDLER(stm32x_handle_part_id_command
)
963 static const char *get_stm32f0_revision(uint16_t rev_id
)
965 const char *rev_str
= NULL
;
978 static int get_stm32x_info(struct flash_bank
*bank
, struct command_invocation
*cmd
)
980 uint32_t dbgmcu_idcode
;
982 /* read stm32 device id register */
983 int retval
= stm32x_get_device_id(bank
, &dbgmcu_idcode
);
984 if (retval
!= ERROR_OK
)
987 uint16_t device_id
= dbgmcu_idcode
& 0xfff;
988 uint16_t rev_id
= dbgmcu_idcode
>> 16;
989 const char *device_str
;
990 const char *rev_str
= NULL
;
994 device_str
= "STM32F10x (Medium Density)";
1001 case 0x1303: /* gd32f1x0 */
1002 device_str
= "GD32F1x0";
1005 case 0x1704: /* gd32f3x0 */
1006 device_str
= "GD32F3x0";
1009 case 0x1909: /* gd32e23x */
1010 device_str
= "GD32E23x";
1028 device_str
= "STM32F10x (Low Density)";
1038 device_str
= "STM32F10x (High Density)";
1056 device_str
= "STM32F10x (Connectivity)";
1070 device_str
= "STM32F100 (Low/Medium Density)";
1084 device_str
= "STM32F302xB/C";
1106 device_str
= "STM32F100 (High Density)";
1120 device_str
= "STM32F10x (XL Density)";
1130 device_str
= "STM32F37x";
1144 device_str
= "STM32F33x";
1154 device_str
= "STM32F302x6/8";
1168 device_str
= "STM32F03x";
1169 rev_str
= get_stm32f0_revision(rev_id
);
1173 device_str
= "STM32F05x";
1174 rev_str
= get_stm32f0_revision(rev_id
);
1178 device_str
= "STM32F04x";
1179 rev_str
= get_stm32f0_revision(rev_id
);
1183 device_str
= "STM32F303xD/E";
1192 device_str
= "STM32F07x";
1193 rev_str
= get_stm32f0_revision(rev_id
);
1197 device_str
= "STM32F09x";
1198 rev_str
= get_stm32f0_revision(rev_id
);
1202 command_print_sameline(cmd
, "Cannot identify target as a STM32F0/1/3\n");
1207 command_print_sameline(cmd
, "%s - Rev: %s", device_str
, rev_str
);
1209 command_print_sameline(cmd
, "%s - Rev: unknown (0x%04x)", device_str
, rev_id
);
1214 COMMAND_HANDLER(stm32x_handle_lock_command
)
1216 struct target
*target
= NULL
;
1217 struct stm32x_flash_bank
*stm32x_info
= NULL
;
1220 return ERROR_COMMAND_SYNTAX_ERROR
;
1222 struct flash_bank
*bank
;
1223 int retval
= CALL_COMMAND_HANDLER(flash_command_get_bank
, 0, &bank
);
1224 if (retval
!= ERROR_OK
)
1227 stm32x_info
= bank
->driver_priv
;
1229 target
= bank
->target
;
1231 if (target
->state
!= TARGET_HALTED
) {
1232 LOG_ERROR("Target not halted");
1233 return ERROR_TARGET_NOT_HALTED
;
1236 retval
= stm32x_check_operation_supported(bank
);
1237 if (retval
!= ERROR_OK
)
1240 if (stm32x_erase_options(bank
) != ERROR_OK
) {
1241 command_print(CMD
, "stm32x failed to erase options");
1245 /* set readout protection */
1246 stm32x_info
->option_bytes
.rdp
= 0;
1248 if (stm32x_write_options(bank
) != ERROR_OK
) {
1249 command_print(CMD
, "stm32x failed to lock device");
1253 command_print(CMD
, "stm32x locked");
1258 COMMAND_HANDLER(stm32x_handle_unlock_command
)
1260 struct target
*target
= NULL
;
1263 return ERROR_COMMAND_SYNTAX_ERROR
;
1265 struct flash_bank
*bank
;
1266 int retval
= CALL_COMMAND_HANDLER(flash_command_get_bank
, 0, &bank
);
1267 if (retval
!= ERROR_OK
)
1270 target
= bank
->target
;
1272 if (target
->state
!= TARGET_HALTED
) {
1273 LOG_ERROR("Target not halted");
1274 return ERROR_TARGET_NOT_HALTED
;
1277 retval
= stm32x_check_operation_supported(bank
);
1278 if (retval
!= ERROR_OK
)
1281 if (stm32x_erase_options(bank
) != ERROR_OK
) {
1282 command_print(CMD
, "stm32x failed to erase options");
1286 if (stm32x_write_options(bank
) != ERROR_OK
) {
1287 command_print(CMD
, "stm32x failed to unlock device");
1291 command_print(CMD
, "stm32x unlocked.\n"
1292 "INFO: a reset or power cycle is required "
1293 "for the new settings to take effect.");
1298 COMMAND_HANDLER(stm32x_handle_options_read_command
)
1300 uint32_t optionbyte
, protection
;
1301 struct target
*target
= NULL
;
1302 struct stm32x_flash_bank
*stm32x_info
= NULL
;
1305 return ERROR_COMMAND_SYNTAX_ERROR
;
1307 struct flash_bank
*bank
;
1308 int retval
= CALL_COMMAND_HANDLER(flash_command_get_bank
, 0, &bank
);
1309 if (retval
!= ERROR_OK
)
1312 stm32x_info
= bank
->driver_priv
;
1314 target
= bank
->target
;
1316 if (target
->state
!= TARGET_HALTED
) {
1317 LOG_ERROR("Target not halted");
1318 return ERROR_TARGET_NOT_HALTED
;
1321 retval
= stm32x_check_operation_supported(bank
);
1322 if (retval
!= ERROR_OK
)
1325 retval
= target_read_u32(target
, STM32_FLASH_OBR_B0
, &optionbyte
);
1326 if (retval
!= ERROR_OK
)
1329 uint16_t user_data
= optionbyte
>> stm32x_info
->user_data_offset
;
1331 retval
= target_read_u32(target
, STM32_FLASH_WRPR_B0
, &protection
);
1332 if (retval
!= ERROR_OK
)
1335 if (optionbyte
& (1 << OPT_ERROR
))
1336 command_print(CMD
, "option byte complement error");
1338 command_print(CMD
, "option byte register = 0x%" PRIx32
"", optionbyte
);
1339 command_print(CMD
, "write protection register = 0x%" PRIx32
"", protection
);
1341 command_print(CMD
, "read protection: %s",
1342 (optionbyte
& (1 << OPT_READOUT
)) ? "on" : "off");
1344 /* user option bytes are offset depending on variant */
1345 optionbyte
>>= stm32x_info
->option_offset
;
1347 command_print(CMD
, "watchdog: %sware",
1348 (optionbyte
& (1 << OPT_RDWDGSW
)) ? "soft" : "hard");
1350 command_print(CMD
, "stop mode: %sreset generated upon entry",
1351 (optionbyte
& (1 << OPT_RDRSTSTOP
)) ? "no " : "");
1353 command_print(CMD
, "standby mode: %sreset generated upon entry",
1354 (optionbyte
& (1 << OPT_RDRSTSTDBY
)) ? "no " : "");
1356 if (stm32x_info
->has_dual_banks
)
1357 command_print(CMD
, "boot: bank %d", (optionbyte
& (1 << OPT_BFB2
)) ? 0 : 1);
1359 command_print(CMD
, "user data = 0x%02" PRIx16
"", user_data
);
1364 COMMAND_HANDLER(stm32x_handle_options_write_command
)
1366 struct target
*target
= NULL
;
1367 struct stm32x_flash_bank
*stm32x_info
= NULL
;
1372 return ERROR_COMMAND_SYNTAX_ERROR
;
1374 struct flash_bank
*bank
;
1375 int retval
= CALL_COMMAND_HANDLER(flash_command_get_bank
, 0, &bank
);
1376 if (retval
!= ERROR_OK
)
1379 stm32x_info
= bank
->driver_priv
;
1381 target
= bank
->target
;
1383 if (target
->state
!= TARGET_HALTED
) {
1384 LOG_ERROR("Target not halted");
1385 return ERROR_TARGET_NOT_HALTED
;
1388 retval
= stm32x_check_operation_supported(bank
);
1389 if (retval
!= ERROR_OK
)
1392 retval
= stm32x_read_options(bank
);
1393 if (retval
!= ERROR_OK
)
1396 /* start with current options */
1397 optionbyte
= stm32x_info
->option_bytes
.user
;
1398 useropt
= stm32x_info
->option_bytes
.data
;
1400 /* skip over flash bank */
1405 if (strcmp("SWWDG", CMD_ARGV
[0]) == 0)
1406 optionbyte
|= (1 << 0);
1407 else if (strcmp("HWWDG", CMD_ARGV
[0]) == 0)
1408 optionbyte
&= ~(1 << 0);
1409 else if (strcmp("NORSTSTOP", CMD_ARGV
[0]) == 0)
1410 optionbyte
|= (1 << 1);
1411 else if (strcmp("RSTSTOP", CMD_ARGV
[0]) == 0)
1412 optionbyte
&= ~(1 << 1);
1413 else if (strcmp("NORSTSTNDBY", CMD_ARGV
[0]) == 0)
1414 optionbyte
|= (1 << 2);
1415 else if (strcmp("RSTSTNDBY", CMD_ARGV
[0]) == 0)
1416 optionbyte
&= ~(1 << 2);
1417 else if (strcmp("USEROPT", CMD_ARGV
[0]) == 0) {
1419 return ERROR_COMMAND_SYNTAX_ERROR
;
1420 COMMAND_PARSE_NUMBER(u16
, CMD_ARGV
[1], useropt
);
1423 } else if (stm32x_info
->has_dual_banks
) {
1424 if (strcmp("BOOT0", CMD_ARGV
[0]) == 0)
1425 optionbyte
|= (1 << 3);
1426 else if (strcmp("BOOT1", CMD_ARGV
[0]) == 0)
1427 optionbyte
&= ~(1 << 3);
1429 return ERROR_COMMAND_SYNTAX_ERROR
;
1431 return ERROR_COMMAND_SYNTAX_ERROR
;
1436 if (stm32x_erase_options(bank
) != ERROR_OK
) {
1437 command_print(CMD
, "stm32x failed to erase options");
1441 stm32x_info
->option_bytes
.user
= optionbyte
;
1442 stm32x_info
->option_bytes
.data
= useropt
;
1444 if (stm32x_write_options(bank
) != ERROR_OK
) {
1445 command_print(CMD
, "stm32x failed to write options");
1449 command_print(CMD
, "stm32x write options complete.\n"
1450 "INFO: %spower cycle is required "
1451 "for the new settings to take effect.",
1452 stm32x_info
->can_load_options
1453 ? "'stm32f1x options_load' command or " : "");
1458 COMMAND_HANDLER(stm32x_handle_options_load_command
)
1461 return ERROR_COMMAND_SYNTAX_ERROR
;
1463 struct flash_bank
*bank
;
1464 int retval
= CALL_COMMAND_HANDLER(flash_command_get_bank
, 0, &bank
);
1465 if (retval
!= ERROR_OK
)
1468 struct stm32x_flash_bank
*stm32x_info
= bank
->driver_priv
;
1470 if (!stm32x_info
->can_load_options
) {
1471 LOG_ERROR("Command not applicable to stm32f1x devices - power cycle is "
1472 "required instead.");
1476 struct target
*target
= bank
->target
;
1478 if (target
->state
!= TARGET_HALTED
) {
1479 LOG_ERROR("Target not halted");
1480 return ERROR_TARGET_NOT_HALTED
;
1483 retval
= stm32x_check_operation_supported(bank
);
1484 if (retval
!= ERROR_OK
)
1487 /* unlock option flash registers */
1488 retval
= target_write_u32(target
, stm32x_get_flash_reg(bank
, STM32_FLASH_KEYR
), KEY1
);
1489 if (retval
!= ERROR_OK
)
1491 retval
= target_write_u32(target
, stm32x_get_flash_reg(bank
, STM32_FLASH_KEYR
), KEY2
);
1492 if (retval
!= ERROR_OK
)
1495 /* force re-load of option bytes - generates software reset */
1496 retval
= target_write_u32(target
, stm32x_get_flash_reg(bank
, STM32_FLASH_CR
), FLASH_OBL_LAUNCH
);
1497 if (retval
!= ERROR_OK
)
1503 static int stm32x_mass_erase(struct flash_bank
*bank
)
1505 struct target
*target
= bank
->target
;
1507 if (target
->state
!= TARGET_HALTED
) {
1508 LOG_ERROR("Target not halted");
1509 return ERROR_TARGET_NOT_HALTED
;
1512 /* unlock option flash registers */
1513 int retval
= target_write_u32(target
, stm32x_get_flash_reg(bank
, STM32_FLASH_KEYR
), KEY1
);
1514 if (retval
!= ERROR_OK
)
1516 retval
= target_write_u32(target
, stm32x_get_flash_reg(bank
, STM32_FLASH_KEYR
), KEY2
);
1517 if (retval
!= ERROR_OK
)
1520 /* mass erase flash memory */
1521 retval
= target_write_u32(target
, stm32x_get_flash_reg(bank
, STM32_FLASH_CR
), FLASH_MER
);
1522 if (retval
!= ERROR_OK
)
1524 retval
= target_write_u32(target
, stm32x_get_flash_reg(bank
, STM32_FLASH_CR
),
1525 FLASH_MER
| FLASH_STRT
);
1526 if (retval
!= ERROR_OK
)
1529 retval
= stm32x_wait_status_busy(bank
, FLASH_ERASE_TIMEOUT
);
1530 if (retval
!= ERROR_OK
)
1533 retval
= target_write_u32(target
, stm32x_get_flash_reg(bank
, STM32_FLASH_CR
), FLASH_LOCK
);
1534 if (retval
!= ERROR_OK
)
1540 COMMAND_HANDLER(stm32x_handle_mass_erase_command
)
1543 return ERROR_COMMAND_SYNTAX_ERROR
;
1545 struct flash_bank
*bank
;
1546 int retval
= CALL_COMMAND_HANDLER(flash_command_get_bank
, 0, &bank
);
1547 if (retval
!= ERROR_OK
)
1550 retval
= stm32x_mass_erase(bank
);
1551 if (retval
== ERROR_OK
)
1552 command_print(CMD
, "stm32x mass erase complete");
1554 command_print(CMD
, "stm32x mass erase failed");
1559 static const struct command_registration stm32f1x_exec_command_handlers
[] = {
1562 .handler
= stm32x_handle_lock_command
,
1563 .mode
= COMMAND_EXEC
,
1565 .help
= "Lock entire flash device.",
1569 .handler
= stm32x_handle_unlock_command
,
1570 .mode
= COMMAND_EXEC
,
1572 .help
= "Unlock entire protected flash device.",
1575 .name
= "mass_erase",
1576 .handler
= stm32x_handle_mass_erase_command
,
1577 .mode
= COMMAND_EXEC
,
1579 .help
= "Erase entire flash device.",
1582 .name
= "options_read",
1583 .handler
= stm32x_handle_options_read_command
,
1584 .mode
= COMMAND_EXEC
,
1586 .help
= "Read and display device option bytes.",
1589 .name
= "options_write",
1590 .handler
= stm32x_handle_options_write_command
,
1591 .mode
= COMMAND_EXEC
,
1592 .usage
= "bank_id ('SWWDG'|'HWWDG') "
1593 "('RSTSTNDBY'|'NORSTSTNDBY') "
1594 "('RSTSTOP'|'NORSTSTOP') ('USEROPT' user_data)",
1595 .help
= "Replace bits in device option bytes.",
1598 .name
= "options_load",
1599 .handler
= stm32x_handle_options_load_command
,
1600 .mode
= COMMAND_EXEC
,
1602 .help
= "Force re-load of device option bytes.",
1604 COMMAND_REGISTRATION_DONE
1607 static const struct command_registration stm32f1x_command_handlers
[] = {
1610 .mode
= COMMAND_ANY
,
1611 .help
= "stm32f1x flash command group",
1613 .chain
= stm32f1x_exec_command_handlers
,
1615 COMMAND_REGISTRATION_DONE
1618 const struct flash_driver stm32f1x_flash
= {
1620 .commands
= stm32f1x_command_handlers
,
1621 .flash_bank_command
= stm32x_flash_bank_command
,
1622 .erase
= stm32x_erase
,
1623 .protect
= stm32x_protect
,
1624 .write
= stm32x_write
,
1625 .read
= default_flash_read
,
1626 .probe
= stm32x_probe
,
1627 .auto_probe
= stm32x_auto_probe
,
1628 .erase_check
= default_flash_blank_check
,
1629 .protect_check
= stm32x_protect_check
,
1630 .info
= get_stm32x_info
,
1631 .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)