stm32: add stm32 xl family flash support
[openocd.git] / src / flash / nor / stm32x.c
1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
4 * *
5 * Copyright (C) 2008 by Spencer Oliver *
6 * spen@spen-soft.co.uk *
7 * *
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. *
12 * *
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. *
17 * *
18 * You should have received a copy of the GNU General Public License *
19 * along with this program; if not, write to the *
20 * Free Software Foundation, Inc., *
21 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
22 ***************************************************************************/
23 #ifdef HAVE_CONFIG_H
24 #include "config.h"
25 #endif
26
27 #include "imp.h"
28 #include <helper/binarybuffer.h>
29 #include <target/algorithm.h>
30 #include <target/armv7m.h>
31
32 /* stm32x register locations */
33
34 #define STM32_FLASH_ACR 0x40022000
35 #define STM32_FLASH_KEYR 0x40022004
36 #define STM32_FLASH_OPTKEYR 0x40022008
37 #define STM32_FLASH_SR 0x4002200C
38 #define STM32_FLASH_CR 0x40022010
39 #define STM32_FLASH_AR 0x40022014
40 #define STM32_FLASH_OBR 0x4002201C
41 #define STM32_FLASH_WRPR 0x40022020
42
43 /* option byte location */
44
45 #define STM32_OB_RDP 0x1FFFF800
46 #define STM32_OB_USER 0x1FFFF802
47 #define STM32_OB_DATA0 0x1FFFF804
48 #define STM32_OB_DATA1 0x1FFFF806
49 #define STM32_OB_WRP0 0x1FFFF808
50 #define STM32_OB_WRP1 0x1FFFF80A
51 #define STM32_OB_WRP2 0x1FFFF80C
52 #define STM32_OB_WRP3 0x1FFFF80E
53
54 /* FLASH_CR register bits */
55
56 #define FLASH_PG (1 << 0)
57 #define FLASH_PER (1 << 1)
58 #define FLASH_MER (1 << 2)
59 #define FLASH_OPTPG (1 << 4)
60 #define FLASH_OPTER (1 << 5)
61 #define FLASH_STRT (1 << 6)
62 #define FLASH_LOCK (1 << 7)
63 #define FLASH_OPTWRE (1 << 9)
64
65 /* FLASH_SR register bits */
66
67 #define FLASH_BSY (1 << 0)
68 #define FLASH_PGERR (1 << 2)
69 #define FLASH_WRPRTERR (1 << 4)
70 #define FLASH_EOP (1 << 5)
71
72 /* STM32_FLASH_OBR bit definitions (reading) */
73
74 #define OPT_ERROR 0
75 #define OPT_READOUT 1
76 #define OPT_RDWDGSW 2
77 #define OPT_RDRSTSTOP 3
78 #define OPT_RDRSTSTDBY 4
79
80 /* register unlock keys */
81
82 #define KEY1 0x45670123
83 #define KEY2 0xCDEF89AB
84
85 struct stm32x_options
86 {
87 uint16_t RDP;
88 uint16_t user_options;
89 uint16_t protection[4];
90 };
91
92 struct stm32x_flash_bank
93 {
94 struct stm32x_options option_bytes;
95 struct working_area *write_algorithm;
96 int ppage_size;
97 int probed;
98
99 /* used to access dual flash bank stm32xl
100 * 0x00 will address sector 0 flash
101 * 0x40 will address sector 1 flash */
102 int register_offset;
103 };
104
105 static int stm32x_mass_erase(struct flash_bank *bank);
106
107 /* flash bank stm32x <base> <size> 0 0 <target#>
108 */
109 FLASH_BANK_COMMAND_HANDLER(stm32x_flash_bank_command)
110 {
111 struct stm32x_flash_bank *stm32x_info;
112
113 if (CMD_ARGC < 6)
114 {
115 LOG_WARNING("incomplete flash_bank stm32x configuration");
116 return ERROR_FLASH_BANK_INVALID;
117 }
118
119 stm32x_info = malloc(sizeof(struct stm32x_flash_bank));
120 bank->driver_priv = stm32x_info;
121
122 stm32x_info->write_algorithm = NULL;
123 stm32x_info->probed = 0;
124 stm32x_info->register_offset = 0x00;
125
126 return ERROR_OK;
127 }
128
129 static inline int stm32x_get_flash_reg(struct flash_bank *bank, uint32_t reg)
130 {
131 struct stm32x_flash_bank *stm32x_info = bank->driver_priv;
132 return reg + stm32x_info->register_offset;
133 }
134
135 static inline int stm32x_get_flash_status(struct flash_bank *bank, uint32_t *status)
136 {
137 struct target *target = bank->target;
138 return target_read_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_SR), status);
139 }
140
141 static int stm32x_wait_status_busy(struct flash_bank *bank, int timeout)
142 {
143 struct target *target = bank->target;
144 uint32_t status;
145 int retval = ERROR_OK;
146
147 /* wait for busy to clear */
148 for (;;)
149 {
150 retval = stm32x_get_flash_status(bank, &status);
151 if (retval != ERROR_OK)
152 return retval;
153 LOG_DEBUG("status: 0x%" PRIx32 "", status);
154 if ((status & FLASH_BSY) == 0)
155 break;
156 if (timeout-- <= 0)
157 {
158 LOG_ERROR("timed out waiting for flash");
159 return ERROR_FAIL;
160 }
161 alive_sleep(1);
162 }
163
164 if (status & FLASH_WRPRTERR)
165 {
166 LOG_ERROR("stm32x device protected");
167 retval = ERROR_FAIL;
168 }
169
170 if (status & FLASH_PGERR)
171 {
172 LOG_ERROR("stm32x device programming failed");
173 retval = ERROR_FAIL;
174 }
175
176 /* Clear but report errors */
177 if (status & (FLASH_WRPRTERR | FLASH_PGERR))
178 {
179 /* If this operation fails, we ignore it and report the original
180 * retval
181 */
182 target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_SR),
183 FLASH_WRPRTERR | FLASH_PGERR);
184 }
185 return retval;
186 }
187
188 static int stm32x_read_options(struct flash_bank *bank)
189 {
190 uint32_t optiondata;
191 struct stm32x_flash_bank *stm32x_info = NULL;
192 struct target *target = bank->target;
193
194 stm32x_info = bank->driver_priv;
195
196 /* read current option bytes */
197 int retval = target_read_u32(target, STM32_FLASH_OBR, &optiondata);
198 if (retval != ERROR_OK)
199 return retval;
200
201 stm32x_info->option_bytes.user_options = (uint16_t)0xFFF8 | ((optiondata >> 2) & 0x07);
202 stm32x_info->option_bytes.RDP = (optiondata & (1 << OPT_READOUT)) ? 0xFFFF : 0x5AA5;
203
204 if (optiondata & (1 << OPT_READOUT))
205 LOG_INFO("Device Security Bit Set");
206
207 /* each bit refers to a 4bank protection */
208 retval = target_read_u32(target, STM32_FLASH_WRPR, &optiondata);
209 if (retval != ERROR_OK)
210 return retval;
211
212 stm32x_info->option_bytes.protection[0] = (uint16_t)optiondata;
213 stm32x_info->option_bytes.protection[1] = (uint16_t)(optiondata >> 8);
214 stm32x_info->option_bytes.protection[2] = (uint16_t)(optiondata >> 16);
215 stm32x_info->option_bytes.protection[3] = (uint16_t)(optiondata >> 24);
216
217 return ERROR_OK;
218 }
219
220 static int stm32x_erase_options(struct flash_bank *bank)
221 {
222 struct stm32x_flash_bank *stm32x_info = NULL;
223 struct target *target = bank->target;
224
225 stm32x_info = bank->driver_priv;
226
227 /* read current options */
228 stm32x_read_options(bank);
229
230 /* unlock flash registers */
231 int retval = target_write_u32(target, STM32_FLASH_KEYR, KEY1);
232 if (retval != ERROR_OK)
233 return retval;
234
235 retval = target_write_u32(target, STM32_FLASH_KEYR, KEY2);
236 if (retval != ERROR_OK)
237 return retval;
238
239 /* unlock option flash registers */
240 retval = target_write_u32(target, STM32_FLASH_OPTKEYR, KEY1);
241 if (retval != ERROR_OK)
242 return retval;
243 retval = target_write_u32(target, STM32_FLASH_OPTKEYR, KEY2);
244 if (retval != ERROR_OK)
245 return retval;
246
247 /* erase option bytes */
248 retval = target_write_u32(target, STM32_FLASH_CR, FLASH_OPTER | FLASH_OPTWRE);
249 if (retval != ERROR_OK)
250 return retval;
251 retval = target_write_u32(target, STM32_FLASH_CR, FLASH_OPTER | FLASH_STRT | FLASH_OPTWRE);
252 if (retval != ERROR_OK)
253 return retval;
254
255 retval = stm32x_wait_status_busy(bank, 10);
256 if (retval != ERROR_OK)
257 return retval;
258
259 /* clear readout protection and complementary option bytes
260 * this will also force a device unlock if set */
261 stm32x_info->option_bytes.RDP = 0x5AA5;
262
263 return ERROR_OK;
264 }
265
266 static int stm32x_write_options(struct flash_bank *bank)
267 {
268 struct stm32x_flash_bank *stm32x_info = NULL;
269 struct target *target = bank->target;
270
271 stm32x_info = bank->driver_priv;
272
273 /* unlock flash registers */
274 int retval = target_write_u32(target, STM32_FLASH_KEYR, KEY1);
275 if (retval != ERROR_OK)
276 return retval;
277 retval = target_write_u32(target, STM32_FLASH_KEYR, KEY2);
278 if (retval != ERROR_OK)
279 return retval;
280
281 /* unlock option flash registers */
282 retval = target_write_u32(target, STM32_FLASH_OPTKEYR, KEY1);
283 if (retval != ERROR_OK)
284 return retval;
285 retval = target_write_u32(target, STM32_FLASH_OPTKEYR, KEY2);
286 if (retval != ERROR_OK)
287 return retval;
288
289 /* program option bytes */
290 retval = target_write_u32(target, STM32_FLASH_CR, FLASH_OPTPG | FLASH_OPTWRE);
291 if (retval != ERROR_OK)
292 return retval;
293
294 /* write user option byte */
295 retval = target_write_u16(target, STM32_OB_USER, stm32x_info->option_bytes.user_options);
296 if (retval != ERROR_OK)
297 return retval;
298
299 retval = stm32x_wait_status_busy(bank, 10);
300 if (retval != ERROR_OK)
301 return retval;
302
303 /* write protection byte 1 */
304 retval = target_write_u16(target, STM32_OB_WRP0, stm32x_info->option_bytes.protection[0]);
305 if (retval != ERROR_OK)
306 return retval;
307
308 retval = stm32x_wait_status_busy(bank, 10);
309 if (retval != ERROR_OK)
310 return retval;
311
312 /* write protection byte 2 */
313 retval = target_write_u16(target, STM32_OB_WRP1, stm32x_info->option_bytes.protection[1]);
314 if (retval != ERROR_OK)
315 return retval;
316
317 retval = stm32x_wait_status_busy(bank, 10);
318 if (retval != ERROR_OK)
319 return retval;
320
321 /* write protection byte 3 */
322 retval = target_write_u16(target, STM32_OB_WRP2, stm32x_info->option_bytes.protection[2]);
323 if (retval != ERROR_OK)
324 return retval;
325
326 retval = stm32x_wait_status_busy(bank, 10);
327 if (retval != ERROR_OK)
328 return retval;
329
330 /* write protection byte 4 */
331 retval = target_write_u16(target, STM32_OB_WRP3, stm32x_info->option_bytes.protection[3]);
332 if (retval != ERROR_OK)
333 return retval;
334
335 retval = stm32x_wait_status_busy(bank, 10);
336 if (retval != ERROR_OK)
337 return retval;
338
339 /* write readout protection bit */
340 retval = target_write_u16(target, STM32_OB_RDP, stm32x_info->option_bytes.RDP);
341 if (retval != ERROR_OK)
342 return retval;
343
344 retval = stm32x_wait_status_busy(bank, 10);
345 if (retval != ERROR_OK)
346 return retval;
347
348 retval = target_write_u32(target, STM32_FLASH_CR, FLASH_LOCK);
349 if (retval != ERROR_OK)
350 return retval;
351
352 return ERROR_OK;
353 }
354
355 static int stm32x_protect_check(struct flash_bank *bank)
356 {
357 struct target *target = bank->target;
358 struct stm32x_flash_bank *stm32x_info = bank->driver_priv;
359
360 uint32_t protection;
361 int i, s;
362 int num_bits;
363 int set;
364
365 if (target->state != TARGET_HALTED)
366 {
367 LOG_ERROR("Target not halted");
368 return ERROR_TARGET_NOT_HALTED;
369 }
370
371 /* medium density - each bit refers to a 4bank protection
372 * high density - each bit refers to a 2bank protection */
373 int retval = target_read_u32(target, STM32_FLASH_WRPR, &protection);
374 if (retval != ERROR_OK)
375 return retval;
376
377 /* medium density - each protection bit is for 4 * 1K pages
378 * high density - each protection bit is for 2 * 2K pages */
379 num_bits = (bank->num_sectors / stm32x_info->ppage_size);
380
381 if (stm32x_info->ppage_size == 2)
382 {
383 /* high density flash/connectivity line protection */
384
385 set = 1;
386
387 if (protection & (1 << 31))
388 set = 0;
389
390 /* bit 31 controls sector 62 - 255 protection for high density
391 * bit 31 controls sector 62 - 127 protection for connectivity line */
392 for (s = 62; s < bank->num_sectors; s++)
393 {
394 bank->sectors[s].is_protected = set;
395 }
396
397 if (bank->num_sectors > 61)
398 num_bits = 31;
399
400 for (i = 0; i < num_bits; i++)
401 {
402 set = 1;
403
404 if (protection & (1 << i))
405 set = 0;
406
407 for (s = 0; s < stm32x_info->ppage_size; s++)
408 bank->sectors[(i * stm32x_info->ppage_size) + s].is_protected = set;
409 }
410 }
411 else
412 {
413 /* low/medium density flash protection */
414 for (i = 0; i < num_bits; i++)
415 {
416 set = 1;
417
418 if (protection & (1 << i))
419 set = 0;
420
421 for (s = 0; s < stm32x_info->ppage_size; s++)
422 bank->sectors[(i * stm32x_info->ppage_size) + s].is_protected = set;
423 }
424 }
425
426 return ERROR_OK;
427 }
428
429 static int stm32x_erase(struct flash_bank *bank, int first, int last)
430 {
431 struct target *target = bank->target;
432 int i;
433
434 if (bank->target->state != TARGET_HALTED)
435 {
436 LOG_ERROR("Target not halted");
437 return ERROR_TARGET_NOT_HALTED;
438 }
439
440 if ((first == 0) && (last == (bank->num_sectors - 1)))
441 {
442 return stm32x_mass_erase(bank);
443 }
444
445 /* unlock flash registers */
446 int retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_KEYR), KEY1);
447 if (retval != ERROR_OK)
448 return retval;
449 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_KEYR), KEY2);
450 if (retval != ERROR_OK)
451 return retval;
452
453 for (i = first; i <= last; i++)
454 {
455 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_CR), FLASH_PER);
456 if (retval != ERROR_OK)
457 return retval;
458 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_AR),
459 bank->base + bank->sectors[i].offset);
460 if (retval != ERROR_OK)
461 return retval;
462 retval = target_write_u32(target,
463 stm32x_get_flash_reg(bank, STM32_FLASH_CR), FLASH_PER | FLASH_STRT);
464 if (retval != ERROR_OK)
465 return retval;
466
467 retval = stm32x_wait_status_busy(bank, 100);
468 if (retval != ERROR_OK)
469 return retval;
470
471 bank->sectors[i].is_erased = 1;
472 }
473
474 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_CR), FLASH_LOCK);
475 if (retval != ERROR_OK)
476 return retval;
477
478 return ERROR_OK;
479 }
480
481 static int stm32x_protect(struct flash_bank *bank, int set, int first, int last)
482 {
483 struct stm32x_flash_bank *stm32x_info = NULL;
484 struct target *target = bank->target;
485 uint16_t prot_reg[4] = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF};
486 int i, reg, bit;
487 int status;
488 uint32_t protection;
489
490 stm32x_info = bank->driver_priv;
491
492 if (target->state != TARGET_HALTED)
493 {
494 LOG_ERROR("Target not halted");
495 return ERROR_TARGET_NOT_HALTED;
496 }
497
498 if ((first % stm32x_info->ppage_size) != 0)
499 {
500 LOG_WARNING("aligned start protect sector to a %d sector boundary",
501 stm32x_info->ppage_size);
502 first = first - (first % stm32x_info->ppage_size);
503 }
504 if (((last + 1) % stm32x_info->ppage_size) != 0)
505 {
506 LOG_WARNING("aligned end protect sector to a %d sector boundary",
507 stm32x_info->ppage_size);
508 last++;
509 last = last - (last % stm32x_info->ppage_size);
510 last--;
511 }
512
513 /* medium density - each bit refers to a 4bank protection
514 * high density - each bit refers to a 2bank protection */
515 int retval = target_read_u32(target, STM32_FLASH_WRPR, &protection);
516 if (retval != ERROR_OK)
517 return retval;
518
519 prot_reg[0] = (uint16_t)protection;
520 prot_reg[1] = (uint16_t)(protection >> 8);
521 prot_reg[2] = (uint16_t)(protection >> 16);
522 prot_reg[3] = (uint16_t)(protection >> 24);
523
524 if (stm32x_info->ppage_size == 2)
525 {
526 /* high density flash */
527
528 /* bit 7 controls sector 62 - 255 protection */
529 if (last > 61)
530 {
531 if (set)
532 prot_reg[3] &= ~(1 << 7);
533 else
534 prot_reg[3] |= (1 << 7);
535 }
536
537 if (first > 61)
538 first = 62;
539 if (last > 61)
540 last = 61;
541
542 for (i = first; i <= last; i++)
543 {
544 reg = (i / stm32x_info->ppage_size) / 8;
545 bit = (i / stm32x_info->ppage_size) - (reg * 8);
546
547 if (set)
548 prot_reg[reg] &= ~(1 << bit);
549 else
550 prot_reg[reg] |= (1 << bit);
551 }
552 }
553 else
554 {
555 /* medium density flash */
556 for (i = first; i <= last; i++)
557 {
558 reg = (i / stm32x_info->ppage_size) / 8;
559 bit = (i / stm32x_info->ppage_size) - (reg * 8);
560
561 if (set)
562 prot_reg[reg] &= ~(1 << bit);
563 else
564 prot_reg[reg] |= (1 << bit);
565 }
566 }
567
568 if ((status = stm32x_erase_options(bank)) != ERROR_OK)
569 return status;
570
571 stm32x_info->option_bytes.protection[0] = prot_reg[0];
572 stm32x_info->option_bytes.protection[1] = prot_reg[1];
573 stm32x_info->option_bytes.protection[2] = prot_reg[2];
574 stm32x_info->option_bytes.protection[3] = prot_reg[3];
575
576 return stm32x_write_options(bank);
577 }
578
579 static int stm32x_write_block(struct flash_bank *bank, uint8_t *buffer,
580 uint32_t offset, uint32_t count)
581 {
582 struct stm32x_flash_bank *stm32x_info = bank->driver_priv;
583 struct target *target = bank->target;
584 uint32_t buffer_size = 16384;
585 struct working_area *source;
586 uint32_t address = bank->base + offset;
587 struct reg_param reg_params[4];
588 struct armv7m_algorithm armv7m_info;
589 int retval = ERROR_OK;
590
591 /* see contib/loaders/flash/stm32x.s for src */
592
593 static const uint8_t stm32x_flash_write_code[] = {
594 /* #define STM32_FLASH_CR_OFFSET 0x10 */
595 /* #define STM32_FLASH_SR_OFFSET 0x0C */
596 /* write: */
597 0x08, 0x4c, /* ldr r4, STM32_FLASH_BASE */
598 0x1c, 0x44, /* add r4, r3 */
599 /* write_half_word: */
600 0x01, 0x23, /* movs r3, #0x01 */
601 0x23, 0x61, /* str r3, [r4, #STM32_FLASH_CR_OFFSET] */
602 0x30, 0xf8, 0x02, 0x3b, /* ldrh r3, [r0], #0x02 */
603 0x21, 0xf8, 0x02, 0x3b, /* strh r3, [r1], #0x02 */
604 /* busy: */
605 0xe3, 0x68, /* ldr r3, [r4, #STM32_FLASH_SR_OFFSET] */
606 0x13, 0xf0, 0x01, 0x0f, /* tst r3, #0x01 */
607 0xfb, 0xd0, /* beq busy */
608 0x13, 0xf0, 0x14, 0x0f, /* tst r3, #0x14 */
609 0x01, 0xd1, /* bne exit */
610 0x01, 0x3a, /* subs r2, r2, #0x01 */
611 0xf0, 0xd1, /* bne write_half_word */
612 /* exit: */
613 0x00, 0xbe, /* bkpt #0x00 */
614 0x00, 0x20, 0x02, 0x40, /* STM32_FLASH_BASE: .word 0x40022000 */
615 };
616
617 /* flash write code */
618 if (target_alloc_working_area(target, sizeof(stm32x_flash_write_code),
619 &stm32x_info->write_algorithm) != ERROR_OK)
620 {
621 LOG_WARNING("no working area available, can't do block memory writes");
622 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
623 };
624
625 if ((retval = target_write_buffer(target, stm32x_info->write_algorithm->address,
626 sizeof(stm32x_flash_write_code),
627 (uint8_t*)stm32x_flash_write_code)) != ERROR_OK)
628 return retval;
629
630 /* memory buffer */
631 while (target_alloc_working_area_try(target, buffer_size, &source) != ERROR_OK)
632 {
633 buffer_size /= 2;
634 if (buffer_size <= 256)
635 {
636 /* if we already allocated the writing code, but failed to get a
637 * buffer, free the algorithm */
638 if (stm32x_info->write_algorithm)
639 target_free_working_area(target, stm32x_info->write_algorithm);
640
641 LOG_WARNING("no large enough working area available, can't do block memory writes");
642 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
643 }
644 };
645
646 armv7m_info.common_magic = ARMV7M_COMMON_MAGIC;
647 armv7m_info.core_mode = ARMV7M_MODE_ANY;
648
649 init_reg_param(&reg_params[0], "r0", 32, PARAM_OUT);
650 init_reg_param(&reg_params[1], "r1", 32, PARAM_OUT);
651 init_reg_param(&reg_params[2], "r2", 32, PARAM_OUT);
652 init_reg_param(&reg_params[3], "r3", 32, PARAM_IN_OUT);
653
654 while (count > 0)
655 {
656 uint32_t thisrun_count = (count > (buffer_size / 2)) ?
657 (buffer_size / 2) : count;
658
659 if ((retval = target_write_buffer(target, source->address,
660 thisrun_count * 2, buffer)) != ERROR_OK)
661 break;
662
663 buf_set_u32(reg_params[0].value, 0, 32, source->address);
664 buf_set_u32(reg_params[1].value, 0, 32, address);
665 buf_set_u32(reg_params[2].value, 0, 32, thisrun_count);
666 buf_set_u32(reg_params[3].value, 0, 32, stm32x_info->register_offset);
667
668 if ((retval = target_run_algorithm(target, 0, NULL, 4, reg_params,
669 stm32x_info->write_algorithm->address,
670 0,
671 10000, &armv7m_info)) != ERROR_OK)
672 {
673 LOG_ERROR("error executing stm32x flash write algorithm");
674 break;
675 }
676
677 if (buf_get_u32(reg_params[3].value, 0, 32) & FLASH_PGERR)
678 {
679 LOG_ERROR("flash memory not erased before writing");
680 /* Clear but report errors */
681 target_write_u32(target, STM32_FLASH_SR, FLASH_PGERR);
682 retval = ERROR_FAIL;
683 break;
684 }
685
686 if (buf_get_u32(reg_params[3].value, 0, 32) & FLASH_WRPRTERR)
687 {
688 LOG_ERROR("flash memory write protected");
689 /* Clear but report errors */
690 target_write_u32(target, STM32_FLASH_SR, FLASH_WRPRTERR);
691 retval = ERROR_FAIL;
692 break;
693 }
694
695 buffer += thisrun_count * 2;
696 address += thisrun_count * 2;
697 count -= thisrun_count;
698 }
699
700 target_free_working_area(target, source);
701 target_free_working_area(target, stm32x_info->write_algorithm);
702
703 destroy_reg_param(&reg_params[0]);
704 destroy_reg_param(&reg_params[1]);
705 destroy_reg_param(&reg_params[2]);
706 destroy_reg_param(&reg_params[3]);
707
708 return retval;
709 }
710
711 static int stm32x_write(struct flash_bank *bank, uint8_t *buffer,
712 uint32_t offset, uint32_t count)
713 {
714 struct target *target = bank->target;
715 uint32_t words_remaining = (count / 2);
716 uint32_t bytes_remaining = (count & 0x00000001);
717 uint32_t address = bank->base + offset;
718 uint32_t bytes_written = 0;
719 int retval;
720
721 if (bank->target->state != TARGET_HALTED)
722 {
723 LOG_ERROR("Target not halted");
724 return ERROR_TARGET_NOT_HALTED;
725 }
726
727 if (offset & 0x1)
728 {
729 LOG_WARNING("offset 0x%" PRIx32 " breaks required 2-byte alignment", offset);
730 return ERROR_FLASH_DST_BREAKS_ALIGNMENT;
731 }
732
733 /* unlock flash registers */
734 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_KEYR), KEY1);
735 if (retval != ERROR_OK)
736 return retval;
737 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_KEYR), KEY2);
738 if (retval != ERROR_OK)
739 return retval;
740
741 /* multiple half words (2-byte) to be programmed? */
742 if (words_remaining > 0)
743 {
744 /* try using a block write */
745 if ((retval = stm32x_write_block(bank, buffer, offset, words_remaining)) != ERROR_OK)
746 {
747 if (retval == ERROR_TARGET_RESOURCE_NOT_AVAILABLE)
748 {
749 /* if block write failed (no sufficient working area),
750 * we use normal (slow) single dword accesses */
751 LOG_WARNING("couldn't use block writes, falling back to single memory accesses");
752 }
753 }
754 else
755 {
756 buffer += words_remaining * 2;
757 address += words_remaining * 2;
758 words_remaining = 0;
759 }
760 }
761
762 if ((retval != ERROR_OK) && (retval != ERROR_TARGET_RESOURCE_NOT_AVAILABLE))
763 return retval;
764
765 while (words_remaining > 0)
766 {
767 uint16_t value;
768 memcpy(&value, buffer + bytes_written, sizeof(uint16_t));
769
770 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_CR), FLASH_PG);
771 if (retval != ERROR_OK)
772 return retval;
773 retval = target_write_u16(target, address, value);
774 if (retval != ERROR_OK)
775 return retval;
776
777 retval = stm32x_wait_status_busy(bank, 5);
778 if (retval != ERROR_OK)
779 return retval;
780
781 bytes_written += 2;
782 words_remaining--;
783 address += 2;
784 }
785
786 if (bytes_remaining)
787 {
788 uint16_t value = 0xffff;
789 memcpy(&value, buffer + bytes_written, bytes_remaining);
790
791 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_CR), FLASH_PG);
792 if (retval != ERROR_OK)
793 return retval;
794 retval = target_write_u16(target, address, value);
795 if (retval != ERROR_OK)
796 return retval;
797
798 retval = stm32x_wait_status_busy(bank, 5);
799 if (retval != ERROR_OK)
800 return retval;
801 }
802
803 return target_write_u32(target, STM32_FLASH_CR, FLASH_LOCK);
804 }
805
806 static int stm32x_probe(struct flash_bank *bank)
807 {
808 struct target *target = bank->target;
809 struct stm32x_flash_bank *stm32x_info = bank->driver_priv;
810 int i;
811 uint16_t num_pages;
812 uint32_t device_id;
813 int page_size;
814
815 stm32x_info->probed = 0;
816 stm32x_info->register_offset = 0x00;
817
818 /* read stm32 device id register */
819 int retval = target_read_u32(target, 0xE0042000, &device_id);
820 if (retval != ERROR_OK)
821 return retval;
822 LOG_INFO("device id = 0x%08" PRIx32 "", device_id);
823
824 /* get flash size from target. */
825 retval = target_read_u16(target, 0x1FFFF7E0, &num_pages);
826 if (retval != ERROR_OK)
827 {
828 LOG_WARNING("failed reading flash size, default to max target family");
829 /* failed reading flash size, default to max target family */
830 num_pages = 0xffff;
831 }
832
833 if ((device_id & 0x7ff) == 0x410)
834 {
835 /* medium density - we have 1k pages
836 * 4 pages for a protection area */
837 page_size = 1024;
838 stm32x_info->ppage_size = 4;
839
840 /* check for early silicon */
841 if (num_pages == 0xffff)
842 {
843 /* number of sectors incorrect on revA */
844 LOG_WARNING("STM32 flash size failed, probe inaccurate - assuming 128k flash");
845 num_pages = 128;
846 }
847 }
848 else if ((device_id & 0x7ff) == 0x412)
849 {
850 /* low density - we have 1k pages
851 * 4 pages for a protection area */
852 page_size = 1024;
853 stm32x_info->ppage_size = 4;
854
855 /* check for early silicon */
856 if (num_pages == 0xffff)
857 {
858 /* number of sectors incorrect on revA */
859 LOG_WARNING("STM32 flash size failed, probe inaccurate - assuming 32k flash");
860 num_pages = 32;
861 }
862 }
863 else if ((device_id & 0x7ff) == 0x414)
864 {
865 /* high density - we have 2k pages
866 * 2 pages for a protection area */
867 page_size = 2048;
868 stm32x_info->ppage_size = 2;
869
870 /* check for early silicon */
871 if (num_pages == 0xffff)
872 {
873 /* number of sectors incorrect on revZ */
874 LOG_WARNING("STM32 flash size failed, probe inaccurate - assuming 512k flash");
875 num_pages = 512;
876 }
877 }
878 else if ((device_id & 0x7ff) == 0x418)
879 {
880 /* connectivity line density - we have 2k pages
881 * 2 pages for a protection area */
882 page_size = 2048;
883 stm32x_info->ppage_size = 2;
884
885 /* check for early silicon */
886 if (num_pages == 0xffff)
887 {
888 /* number of sectors incorrect on revZ */
889 LOG_WARNING("STM32 flash size failed, probe inaccurate - assuming 256k flash");
890 num_pages = 256;
891 }
892 }
893 else if ((device_id & 0x7ff) == 0x420)
894 {
895 /* value line density - we have 1k pages
896 * 4 pages for a protection area */
897 page_size = 1024;
898 stm32x_info->ppage_size = 4;
899
900 /* check for early silicon */
901 if (num_pages == 0xffff)
902 {
903 /* number of sectors may be incorrrect on early silicon */
904 LOG_WARNING("STM32 flash size failed, probe inaccurate - assuming 128k flash");
905 num_pages = 128;
906 }
907 }
908 else if ((device_id & 0x7ff) == 0x430)
909 {
910 /* xl line density - we have 2k pages
911 * 2 pages for a protection area */
912 page_size = 2048;
913 stm32x_info->ppage_size = 2;
914
915 /* check for early silicon */
916 if (num_pages == 0xffff)
917 {
918 /* number of sectors may be incorrrect on early silicon */
919 LOG_WARNING("STM32 flash size failed, probe inaccurate - assuming 1024k flash");
920 num_pages = 1024;
921 }
922
923 /* split reported size into matching bank */
924 if (bank->base != 0x08080000)
925 {
926 /* bank 0 will be fixed 512k */
927 num_pages = 512;
928 }
929 else
930 {
931 num_pages -= 512;
932 /* bank1 also uses a register offset */
933 stm32x_info->register_offset = 0x40;
934 }
935 }
936 else
937 {
938 LOG_WARNING("Cannot identify target as a STM32 family.");
939 return ERROR_FAIL;
940 }
941
942 LOG_INFO("flash size = %dkbytes", num_pages);
943
944 /* calculate numbers of pages */
945 num_pages /= (page_size / 1024);
946
947 if (bank->sectors)
948 {
949 free(bank->sectors);
950 bank->sectors = NULL;
951 }
952
953 bank->size = (num_pages * page_size);
954 bank->num_sectors = num_pages;
955 bank->sectors = malloc(sizeof(struct flash_sector) * num_pages);
956
957 for (i = 0; i < num_pages; i++)
958 {
959 bank->sectors[i].offset = i * page_size;
960 bank->sectors[i].size = page_size;
961 bank->sectors[i].is_erased = -1;
962 bank->sectors[i].is_protected = 1;
963 }
964
965 stm32x_info->probed = 1;
966
967 return ERROR_OK;
968 }
969
970 static int stm32x_auto_probe(struct flash_bank *bank)
971 {
972 struct stm32x_flash_bank *stm32x_info = bank->driver_priv;
973 if (stm32x_info->probed)
974 return ERROR_OK;
975 return stm32x_probe(bank);
976 }
977
978 #if 0
979 COMMAND_HANDLER(stm32x_handle_part_id_command)
980 {
981 return ERROR_OK;
982 }
983 #endif
984
985 static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size)
986 {
987 struct target *target = bank->target;
988 uint32_t device_id;
989 int printed;
990
991 /* read stm32 device id register */
992 int retval = target_read_u32(target, 0xE0042000, &device_id);
993 if (retval != ERROR_OK)
994 return retval;
995
996 if ((device_id & 0x7ff) == 0x410)
997 {
998 printed = snprintf(buf, buf_size, "stm32x (Medium Density) - Rev: ");
999 buf += printed;
1000 buf_size -= printed;
1001
1002 switch (device_id >> 16)
1003 {
1004 case 0x0000:
1005 snprintf(buf, buf_size, "A");
1006 break;
1007
1008 case 0x2000:
1009 snprintf(buf, buf_size, "B");
1010 break;
1011
1012 case 0x2001:
1013 snprintf(buf, buf_size, "Z");
1014 break;
1015
1016 case 0x2003:
1017 snprintf(buf, buf_size, "Y");
1018 break;
1019
1020 default:
1021 snprintf(buf, buf_size, "unknown");
1022 break;
1023 }
1024 }
1025 else if ((device_id & 0x7ff) == 0x412)
1026 {
1027 printed = snprintf(buf, buf_size, "stm32x (Low Density) - Rev: ");
1028 buf += printed;
1029 buf_size -= printed;
1030
1031 switch (device_id >> 16)
1032 {
1033 case 0x1000:
1034 snprintf(buf, buf_size, "A");
1035 break;
1036
1037 default:
1038 snprintf(buf, buf_size, "unknown");
1039 break;
1040 }
1041 }
1042 else if ((device_id & 0x7ff) == 0x414)
1043 {
1044 printed = snprintf(buf, buf_size, "stm32x (High Density) - Rev: ");
1045 buf += printed;
1046 buf_size -= printed;
1047
1048 switch (device_id >> 16)
1049 {
1050 case 0x1000:
1051 snprintf(buf, buf_size, "A");
1052 break;
1053
1054 case 0x1001:
1055 snprintf(buf, buf_size, "Z");
1056 break;
1057
1058 default:
1059 snprintf(buf, buf_size, "unknown");
1060 break;
1061 }
1062 }
1063 else if ((device_id & 0x7ff) == 0x418)
1064 {
1065 printed = snprintf(buf, buf_size, "stm32x (Connectivity) - Rev: ");
1066 buf += printed;
1067 buf_size -= printed;
1068
1069 switch (device_id >> 16)
1070 {
1071 case 0x1000:
1072 snprintf(buf, buf_size, "A");
1073 break;
1074
1075 case 0x1001:
1076 snprintf(buf, buf_size, "Z");
1077 break;
1078
1079 default:
1080 snprintf(buf, buf_size, "unknown");
1081 break;
1082 }
1083 }
1084 else if ((device_id & 0x7ff) == 0x420)
1085 {
1086 printed = snprintf(buf, buf_size, "stm32x (Value) - Rev: ");
1087 buf += printed;
1088 buf_size -= printed;
1089
1090 switch (device_id >> 16)
1091 {
1092 case 0x1000:
1093 snprintf(buf, buf_size, "A");
1094 break;
1095
1096 case 0x1001:
1097 snprintf(buf, buf_size, "Z");
1098 break;
1099
1100 default:
1101 snprintf(buf, buf_size, "unknown");
1102 break;
1103 }
1104 }
1105 else if ((device_id & 0x7ff) == 0x430)
1106 {
1107 printed = snprintf(buf, buf_size, "stm32x (XL) - Rev: ");
1108 buf += printed;
1109 buf_size -= printed;
1110
1111 switch (device_id >> 16)
1112 {
1113 case 0x1000:
1114 snprintf(buf, buf_size, "A");
1115 break;
1116
1117 default:
1118 snprintf(buf, buf_size, "unknown");
1119 break;
1120 }
1121 }
1122 else
1123 {
1124 snprintf(buf, buf_size, "Cannot identify target as a stm32x\n");
1125 return ERROR_FAIL;
1126 }
1127
1128 return ERROR_OK;
1129 }
1130
1131 COMMAND_HANDLER(stm32x_handle_lock_command)
1132 {
1133 struct target *target = NULL;
1134 struct stm32x_flash_bank *stm32x_info = NULL;
1135
1136 if (CMD_ARGC < 1)
1137 {
1138 command_print(CMD_CTX, "stm32x lock <bank>");
1139 return ERROR_OK;
1140 }
1141
1142 struct flash_bank *bank;
1143 int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
1144 if (ERROR_OK != retval)
1145 return retval;
1146
1147 stm32x_info = bank->driver_priv;
1148
1149 target = bank->target;
1150
1151 if (target->state != TARGET_HALTED)
1152 {
1153 LOG_ERROR("Target not halted");
1154 return ERROR_TARGET_NOT_HALTED;
1155 }
1156
1157 if (stm32x_erase_options(bank) != ERROR_OK)
1158 {
1159 command_print(CMD_CTX, "stm32x failed to erase options");
1160 return ERROR_OK;
1161 }
1162
1163 /* set readout protection */
1164 stm32x_info->option_bytes.RDP = 0;
1165
1166 if (stm32x_write_options(bank) != ERROR_OK)
1167 {
1168 command_print(CMD_CTX, "stm32x failed to lock device");
1169 return ERROR_OK;
1170 }
1171
1172 command_print(CMD_CTX, "stm32x locked");
1173
1174 return ERROR_OK;
1175 }
1176
1177 COMMAND_HANDLER(stm32x_handle_unlock_command)
1178 {
1179 struct target *target = NULL;
1180 struct stm32x_flash_bank *stm32x_info = NULL;
1181
1182 if (CMD_ARGC < 1)
1183 {
1184 command_print(CMD_CTX, "stm32x unlock <bank>");
1185 return ERROR_OK;
1186 }
1187
1188 struct flash_bank *bank;
1189 int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
1190 if (ERROR_OK != retval)
1191 return retval;
1192
1193 stm32x_info = bank->driver_priv;
1194
1195 target = bank->target;
1196
1197 if (target->state != TARGET_HALTED)
1198 {
1199 LOG_ERROR("Target not halted");
1200 return ERROR_TARGET_NOT_HALTED;
1201 }
1202
1203 if (stm32x_erase_options(bank) != ERROR_OK)
1204 {
1205 command_print(CMD_CTX, "stm32x failed to unlock device");
1206 return ERROR_OK;
1207 }
1208
1209 if (stm32x_write_options(bank) != ERROR_OK)
1210 {
1211 command_print(CMD_CTX, "stm32x failed to lock device");
1212 return ERROR_OK;
1213 }
1214
1215 command_print(CMD_CTX, "stm32x unlocked.\n"
1216 "INFO: a reset or power cycle is required "
1217 "for the new settings to take effect.");
1218
1219 return ERROR_OK;
1220 }
1221
1222 COMMAND_HANDLER(stm32x_handle_options_read_command)
1223 {
1224 uint32_t optionbyte;
1225 struct target *target = NULL;
1226 struct stm32x_flash_bank *stm32x_info = NULL;
1227
1228 if (CMD_ARGC < 1)
1229 {
1230 command_print(CMD_CTX, "stm32x options_read <bank>");
1231 return ERROR_OK;
1232 }
1233
1234 struct flash_bank *bank;
1235 int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
1236 if (ERROR_OK != retval)
1237 return retval;
1238
1239 stm32x_info = bank->driver_priv;
1240
1241 target = bank->target;
1242
1243 if (target->state != TARGET_HALTED)
1244 {
1245 LOG_ERROR("Target not halted");
1246 return ERROR_TARGET_NOT_HALTED;
1247 }
1248
1249 retval = target_read_u32(target, STM32_FLASH_OBR, &optionbyte);
1250 if (retval != ERROR_OK)
1251 return retval;
1252 command_print(CMD_CTX, "Option Byte: 0x%" PRIx32 "", optionbyte);
1253
1254 if (buf_get_u32((uint8_t*)&optionbyte, OPT_ERROR, 1))
1255 command_print(CMD_CTX, "Option Byte Complement Error");
1256
1257 if (buf_get_u32((uint8_t*)&optionbyte, OPT_READOUT, 1))
1258 command_print(CMD_CTX, "Readout Protection On");
1259 else
1260 command_print(CMD_CTX, "Readout Protection Off");
1261
1262 if (buf_get_u32((uint8_t*)&optionbyte, OPT_RDWDGSW, 1))
1263 command_print(CMD_CTX, "Software Watchdog");
1264 else
1265 command_print(CMD_CTX, "Hardware Watchdog");
1266
1267 if (buf_get_u32((uint8_t*)&optionbyte, OPT_RDRSTSTOP, 1))
1268 command_print(CMD_CTX, "Stop: No reset generated");
1269 else
1270 command_print(CMD_CTX, "Stop: Reset generated");
1271
1272 if (buf_get_u32((uint8_t*)&optionbyte, OPT_RDRSTSTDBY, 1))
1273 command_print(CMD_CTX, "Standby: No reset generated");
1274 else
1275 command_print(CMD_CTX, "Standby: Reset generated");
1276
1277 return ERROR_OK;
1278 }
1279
1280 COMMAND_HANDLER(stm32x_handle_options_write_command)
1281 {
1282 struct target *target = NULL;
1283 struct stm32x_flash_bank *stm32x_info = NULL;
1284 uint16_t optionbyte = 0xF8;
1285
1286 if (CMD_ARGC < 4)
1287 {
1288 command_print(CMD_CTX, "stm32x options_write <bank> <SWWDG | HWWDG> <RSTSTNDBY | NORSTSTNDBY> <RSTSTOP | NORSTSTOP>");
1289 return ERROR_OK;
1290 }
1291
1292 struct flash_bank *bank;
1293 int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
1294 if (ERROR_OK != retval)
1295 return retval;
1296
1297 stm32x_info = bank->driver_priv;
1298
1299 target = bank->target;
1300
1301 if (target->state != TARGET_HALTED)
1302 {
1303 LOG_ERROR("Target not halted");
1304 return ERROR_TARGET_NOT_HALTED;
1305 }
1306
1307 /* REVISIT: ignores some options which we will display...
1308 * and doesn't insist on the specified syntax.
1309 */
1310
1311 /* OPT_RDWDGSW */
1312 if (strcmp(CMD_ARGV[1], "SWWDG") == 0)
1313 {
1314 optionbyte |= (1 << 0);
1315 }
1316 else /* REVISIT must be "HWWDG" then ... */
1317 {
1318 optionbyte &= ~(1 << 0);
1319 }
1320
1321 /* OPT_RDRSTSTDBY */
1322 if (strcmp(CMD_ARGV[2], "NORSTSTNDBY") == 0)
1323 {
1324 optionbyte |= (1 << 1);
1325 }
1326 else /* REVISIT must be "RSTSTNDBY" then ... */
1327 {
1328 optionbyte &= ~(1 << 1);
1329 }
1330
1331 /* OPT_RDRSTSTOP */
1332 if (strcmp(CMD_ARGV[3], "NORSTSTOP") == 0)
1333 {
1334 optionbyte |= (1 << 2);
1335 }
1336 else /* REVISIT must be "RSTSTOP" then ... */
1337 {
1338 optionbyte &= ~(1 << 2);
1339 }
1340
1341 if (stm32x_erase_options(bank) != ERROR_OK)
1342 {
1343 command_print(CMD_CTX, "stm32x failed to erase options");
1344 return ERROR_OK;
1345 }
1346
1347 stm32x_info->option_bytes.user_options = optionbyte;
1348
1349 if (stm32x_write_options(bank) != ERROR_OK)
1350 {
1351 command_print(CMD_CTX, "stm32x failed to write options");
1352 return ERROR_OK;
1353 }
1354
1355 command_print(CMD_CTX, "stm32x write options complete.\n"
1356 "INFO: a reset or power cycle is required "
1357 "for the new settings to take effect.");
1358
1359 return ERROR_OK;
1360 }
1361
1362 static int stm32x_mass_erase(struct flash_bank *bank)
1363 {
1364 struct target *target = bank->target;
1365
1366 if (target->state != TARGET_HALTED)
1367 {
1368 LOG_ERROR("Target not halted");
1369 return ERROR_TARGET_NOT_HALTED;
1370 }
1371
1372 /* unlock option flash registers */
1373 int retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_KEYR), KEY1);
1374 if (retval != ERROR_OK)
1375 return retval;
1376 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_KEYR), KEY2);
1377 if (retval != ERROR_OK)
1378 return retval;
1379
1380 /* mass erase flash memory */
1381 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_CR), FLASH_MER);
1382 if (retval != ERROR_OK)
1383 return retval;
1384 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_CR), FLASH_MER | FLASH_STRT);
1385 if (retval != ERROR_OK)
1386 return retval;
1387
1388 retval = stm32x_wait_status_busy(bank, 100);
1389 if (retval != ERROR_OK)
1390 return retval;
1391
1392 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_CR), FLASH_LOCK);
1393 if (retval != ERROR_OK)
1394 return retval;
1395
1396 return ERROR_OK;
1397 }
1398
1399 COMMAND_HANDLER(stm32x_handle_mass_erase_command)
1400 {
1401 int i;
1402
1403 if (CMD_ARGC < 1)
1404 {
1405 command_print(CMD_CTX, "stm32x mass_erase <bank>");
1406 return ERROR_OK;
1407 }
1408
1409 struct flash_bank *bank;
1410 int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
1411 if (ERROR_OK != retval)
1412 return retval;
1413
1414 retval = stm32x_mass_erase(bank);
1415 if (retval == ERROR_OK)
1416 {
1417 /* set all sectors as erased */
1418 for (i = 0; i < bank->num_sectors; i++)
1419 {
1420 bank->sectors[i].is_erased = 1;
1421 }
1422
1423 command_print(CMD_CTX, "stm32x mass erase complete");
1424 }
1425 else
1426 {
1427 command_print(CMD_CTX, "stm32x mass erase failed");
1428 }
1429
1430 return retval;
1431 }
1432
1433 static const struct command_registration stm32x_exec_command_handlers[] = {
1434 {
1435 .name = "lock",
1436 .handler = stm32x_handle_lock_command,
1437 .mode = COMMAND_EXEC,
1438 .usage = "bank_id",
1439 .help = "Lock entire flash device.",
1440 },
1441 {
1442 .name = "unlock",
1443 .handler = stm32x_handle_unlock_command,
1444 .mode = COMMAND_EXEC,
1445 .usage = "bank_id",
1446 .help = "Unlock entire protected flash device.",
1447 },
1448 {
1449 .name = "mass_erase",
1450 .handler = stm32x_handle_mass_erase_command,
1451 .mode = COMMAND_EXEC,
1452 .usage = "bank_id",
1453 .help = "Erase entire flash device.",
1454 },
1455 {
1456 .name = "options_read",
1457 .handler = stm32x_handle_options_read_command,
1458 .mode = COMMAND_EXEC,
1459 .usage = "bank_id",
1460 .help = "Read and display device option byte.",
1461 },
1462 {
1463 .name = "options_write",
1464 .handler = stm32x_handle_options_write_command,
1465 .mode = COMMAND_EXEC,
1466 .usage = "bank_id ('SWWDG'|'HWWDG') "
1467 "('RSTSTNDBY'|'NORSTSTNDBY') "
1468 "('RSTSTOP'|'NORSTSTOP')",
1469 .help = "Replace bits in device option byte.",
1470 },
1471 COMMAND_REGISTRATION_DONE
1472 };
1473
1474 static const struct command_registration stm32x_command_handlers[] = {
1475 {
1476 .name = "stm32x",
1477 .mode = COMMAND_ANY,
1478 .help = "stm32x flash command group",
1479 .chain = stm32x_exec_command_handlers,
1480 },
1481 COMMAND_REGISTRATION_DONE
1482 };
1483
1484 struct flash_driver stm32x_flash = {
1485 .name = "stm32x",
1486 .commands = stm32x_command_handlers,
1487 .flash_bank_command = stm32x_flash_bank_command,
1488 .erase = stm32x_erase,
1489 .protect = stm32x_protect,
1490 .write = stm32x_write,
1491 .read = default_flash_read,
1492 .probe = stm32x_probe,
1493 .auto_probe = stm32x_auto_probe,
1494 .erase_check = default_flash_mem_blank_check,
1495 .protect_check = stm32x_protect_check,
1496 .info = get_stm32x_info,
1497 };

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)