flash: support stm32f4x flash
[openocd.git] / src / flash / nor / stm32f2x.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 * Copyright (C) 2011 Øyvind Harboe *
9 * oyvind.harboe@zylin.com *
10 * *
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. *
15 * *
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. *
20 * *
21 * You should have received a copy of the GNU General Public License *
22 * along with this program; if not, write to the *
23 * Free Software Foundation, Inc., *
24 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
25 ***************************************************************************/
26 #ifdef HAVE_CONFIG_H
27 #include "config.h"
28 #endif
29
30 #include "imp.h"
31 #include <helper/binarybuffer.h>
32 #include <target/algorithm.h>
33 #include <target/armv7m.h>
34
35 /* Regarding performance:
36 *
37 * Short story - it might be best to leave the performance at
38 * current levels.
39 *
40 * You may see a jump in speed if you change to using
41 * 32bit words for the block programming.
42 *
43 * Its a shame you cannot use the double word as its
44 * even faster - but you require external VPP for that mode.
45 *
46 * Having said all that 16bit writes give us the widest vdd
47 * operating range, so may be worth adding a note to that effect.
48 *
49 */
50
51 /* Danger!!!! The STM32F1x and STM32F2x series actually have
52 * quite different flash controllers.
53 *
54 * What's more scary is that the names of the registers and their
55 * addresses are the same, but the actual bits and what they do are
56 * can be very different.
57 *
58 * To reduce testing complexity and dangers of regressions,
59 * a seperate file is used for stm32fx2x.
60 *
61 * 1mByte part with 4 x 16, 1 x 64, 7 x 128kBytes sectors
62 *
63 * What's the protection page size???
64 *
65 * Tested with STM3220F-EVAL board.
66 *
67 * STM32F21xx series for reference.
68 *
69 * RM0033
70 * http://www.st.com/internet/mcu/product/250192.jsp
71 *
72 * PM0059
73 * www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/PROGRAMMING_MANUAL/CD00233952.pdf
74 *
75 * STM32F1x series - notice that this code was copy, pasted and knocked
76 * into a stm32f2x driver, so in case something has been converted or
77 * bugs haven't been fixed, here are the original manuals:
78 *
79 * RM0008 - Reference manual
80 *
81 * RM0042, the Flash programming manual for low-, medium- high-density and
82 * connectivity line STM32F10x devices
83 *
84 * PM0068, the Flash programming manual for XL-density STM32F10x devices.
85 *
86 */
87
88 // Erase time can be as high as 1000ms, 10x this and it's toast...
89 #define FLASH_ERASE_TIMEOUT 10000
90 #define FLASH_WRITE_TIMEOUT 5
91
92
93 #define STM32_FLASH_BASE 0x40023c00
94 #define STM32_FLASH_ACR 0x40023c00
95 #define STM32_FLASH_KEYR 0x40023c04
96 #define STM32_FLASH_OPTKEYR 0x40023c08
97 #define STM32_FLASH_SR 0x40023c0C
98 #define STM32_FLASH_CR 0x40023c10
99 #define STM32_FLASH_OPTCR 0x40023c14
100 #define STM32_FLASH_OBR 0x40023c1C
101
102
103
104 /* option byte location */
105
106 #define STM32_OB_RDP 0x1FFFF800
107 #define STM32_OB_USER 0x1FFFF802
108 #define STM32_OB_DATA0 0x1FFFF804
109 #define STM32_OB_DATA1 0x1FFFF806
110 #define STM32_OB_WRP0 0x1FFFF808
111 #define STM32_OB_WRP1 0x1FFFF80A
112 #define STM32_OB_WRP2 0x1FFFF80C
113 #define STM32_OB_WRP3 0x1FFFF80E
114
115 /* FLASH_CR register bits */
116
117 #define FLASH_PG (1 << 0)
118 #define FLASH_SER (1 << 1)
119 #define FLASH_MER (1 << 2)
120 #define FLASH_STRT (1 << 16)
121 #define FLASH_PSIZE_8 (0 << 8)
122 #define FLASH_PSIZE_16 (1 << 8)
123 #define FLASH_PSIZE_32 (2 << 8)
124 #define FLASH_PSIZE_64 (3 << 8)
125 #define FLASH_SNB(a) ((a) << 3)
126 #define FLASH_LOCK (1 << 31)
127
128 /* FLASH_SR register bits */
129
130 #define FLASH_BSY (1 << 16)
131 #define FLASH_PGSERR (1 << 7) // Programming sequence error
132 #define FLASH_PGPERR (1 << 6) // Programming parallelism error
133 #define FLASH_PGAERR (1 << 5) // Programming alignment error
134 #define FLASH_WRPERR (1 << 4) // Write protection error
135 #define FLASH_OPERR (1 << 1) // Operation error
136
137 #define FLASH_ERROR (FLASH_PGSERR | FLASH_PGPERR | FLASH_PGAERR| FLASH_WRPERR| FLASH_OPERR)
138
139 /* STM32_FLASH_OBR bit definitions (reading) */
140
141 #define OPT_ERROR 0
142 #define OPT_READOUT 1
143 #define OPT_RDWDGSW 2
144 #define OPT_RDRSTSTOP 3
145 #define OPT_RDRSTSTDBY 4
146 #define OPT_BFB2 5 /* dual flash bank only */
147
148 /* register unlock keys */
149
150 #define KEY1 0x45670123
151 #define KEY2 0xCDEF89AB
152
153 struct stm32x_flash_bank
154 {
155 struct working_area *write_algorithm;
156 int probed;
157 };
158
159
160 /* flash bank stm32x <base> <size> 0 0 <target#>
161 */
162 FLASH_BANK_COMMAND_HANDLER(stm32x_flash_bank_command)
163 {
164 struct stm32x_flash_bank *stm32x_info;
165
166 if (CMD_ARGC < 6)
167 {
168 return ERROR_COMMAND_SYNTAX_ERROR;
169 }
170
171 stm32x_info = malloc(sizeof(struct stm32x_flash_bank));
172 bank->driver_priv = stm32x_info;
173
174 stm32x_info->write_algorithm = NULL;
175 stm32x_info->probed = 0;
176
177 return ERROR_OK;
178 }
179
180 static inline int stm32x_get_flash_reg(struct flash_bank *bank, uint32_t reg)
181 {
182 return reg;
183 }
184
185 static inline int stm32x_get_flash_status(struct flash_bank *bank, uint32_t *status)
186 {
187 struct target *target = bank->target;
188 return target_read_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_SR), status);
189 }
190
191 static int stm32x_wait_status_busy(struct flash_bank *bank, int timeout)
192 {
193 struct target *target = bank->target;
194 uint32_t status;
195 int retval = ERROR_OK;
196
197 /* wait for busy to clear */
198 for (;;)
199 {
200 retval = stm32x_get_flash_status(bank, &status);
201 if (retval != ERROR_OK)
202 return retval;
203 LOG_DEBUG("status: 0x%" PRIx32 "", status);
204 if ((status & FLASH_BSY) == 0)
205 break;
206 if (timeout-- <= 0)
207 {
208 LOG_ERROR("timed out waiting for flash");
209 return ERROR_FAIL;
210 }
211 alive_sleep(1);
212 }
213
214
215 if (status & FLASH_WRPERR)
216 {
217 LOG_ERROR("stm32x device protected");
218 retval = ERROR_FAIL;
219 }
220
221 /* Clear but report errors */
222 if (status & FLASH_ERROR)
223 {
224 /* If this operation fails, we ignore it and report the original
225 * retval
226 */
227 target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_SR),
228 status & FLASH_ERROR);
229 }
230 return retval;
231 }
232
233 static int stm32x_unlock_reg(struct target *target)
234 {
235 uint32_t ctrl;
236
237 /* unlock flash registers */
238 int retval = target_write_u32(target, STM32_FLASH_KEYR, KEY1);
239 if (retval != ERROR_OK)
240 return retval;
241
242 retval = target_write_u32(target, STM32_FLASH_KEYR, KEY2);
243 if (retval != ERROR_OK)
244 return retval;
245
246 retval = target_read_u32(target, STM32_FLASH_CR, &ctrl);
247 if (retval != ERROR_OK)
248 return retval;
249
250 if (ctrl & FLASH_LOCK) {
251 LOG_ERROR("flash not unlocked STM32_FLASH_CR: %x", ctrl);
252 return ERROR_TARGET_FAILURE;
253 }
254
255 return ERROR_OK;
256 }
257
258 static int stm32x_protect_check(struct flash_bank *bank)
259 {
260 return ERROR_OK;
261 }
262
263 static int stm32x_erase(struct flash_bank *bank, int first, int last)
264 {
265 struct target *target = bank->target;
266 int i;
267
268 if (bank->target->state != TARGET_HALTED)
269 {
270 LOG_ERROR("Target not halted");
271 return ERROR_TARGET_NOT_HALTED;
272 }
273
274 int retval;
275 retval = stm32x_unlock_reg(target);
276 if (retval != ERROR_OK)
277 return retval;
278
279 /*
280 Sector Erase
281 To erase a sector, follow the procedure below:
282 1. Check that no Flash memory operation is ongoing by checking the BSY bit in the
283 FLASH_SR register
284 2. Set the SER bit and select the sector (out of the 12 sectors in the main memory block)
285 you wish to erase (SNB) in the FLASH_CR register
286 3. Set the STRT bit in the FLASH_CR register
287 4. Wait for the BSY bit to be cleared
288 */
289
290 for (i = first; i <= last; i++)
291 {
292 retval = target_write_u32(target,
293 stm32x_get_flash_reg(bank, STM32_FLASH_CR), FLASH_SER | FLASH_SNB(i) | FLASH_STRT);
294 if (retval != ERROR_OK)
295 return retval;
296
297 retval = stm32x_wait_status_busy(bank, FLASH_ERASE_TIMEOUT);
298 if (retval != ERROR_OK)
299 return retval;
300
301 bank->sectors[i].is_erased = 1;
302 }
303
304 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_CR), FLASH_LOCK);
305 if (retval != ERROR_OK)
306 return retval;
307
308 return ERROR_OK;
309 }
310
311 static int stm32x_protect(struct flash_bank *bank, int set, int first, int last)
312 {
313 return ERROR_OK;
314 }
315
316 static int stm32x_write_block(struct flash_bank *bank, uint8_t *buffer,
317 uint32_t offset, uint32_t count)
318 {
319 struct stm32x_flash_bank *stm32x_info = bank->driver_priv;
320 struct target *target = bank->target;
321 uint32_t buffer_size = 16384;
322 struct working_area *source;
323 uint32_t address = bank->base + offset;
324 struct reg_param reg_params[5];
325 struct armv7m_algorithm armv7m_info;
326 int retval = ERROR_OK;
327
328 /* see contrib/loaders/flash/stm32f2x.S for src */
329
330 static const uint16_t stm32x_flash_write_code_16[] = {
331 /* 00000000 <write>: */
332 0x4b07, /* ldr r3, [pc, #28] (20 <STM32_PROG16>) */
333 0x6123, /* str r3, [r4, #16] */
334 0xf830, 0x3b02, /* ldrh.w r3, [r0], #2 */
335 0xf821, 0x3b02, /* strh.w r3, [r1], #2 */
336
337 /* 0000000c <busy>: */
338 0x68e3, /* ldr r3, [r4, #12] */
339 0xf413, 0x3f80, /* tst.w r3, #65536 ; 0x10000 */
340 0xd0fb, /* beq.n c <busy> */
341 0xf013, 0x0ff0, /* tst.w r3, #240 ; 0xf0 */
342 0xd101, /* bne.n 1e <exit> */
343 0x3a01, /* subs r2, #1 */
344 0xd1f0, /* bne.n 0 <write> */
345 /* 0000001e <exit>: */
346 0xbe00, /* bkpt 0x0000 */
347
348 /* 00000020 <STM32_PROG16>: */
349 0x0101, 0x0000, /* .word 0x00000101 */
350 };
351
352 /* Flip endian */
353 uint8_t stm32x_flash_write_code[sizeof(stm32x_flash_write_code_16)*2];
354 for (unsigned i = 0; i < sizeof(stm32x_flash_write_code_16) / 2; i++)
355 {
356 stm32x_flash_write_code[i*2 + 0] = stm32x_flash_write_code_16[i] & 0xff;
357 stm32x_flash_write_code[i*2 + 1] = (stm32x_flash_write_code_16[i] >> 8) & 0xff;
358 }
359
360 if (target_alloc_working_area(target, sizeof(stm32x_flash_write_code),
361 &stm32x_info->write_algorithm) != ERROR_OK)
362 {
363 LOG_WARNING("no working area available, can't do block memory writes");
364 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
365 };
366
367 if ((retval = target_write_buffer(target, stm32x_info->write_algorithm->address,
368 sizeof(stm32x_flash_write_code),
369 (uint8_t*)stm32x_flash_write_code)) != ERROR_OK)
370 return retval;
371
372 /* memory buffer */
373 while (target_alloc_working_area_try(target, buffer_size, &source) != ERROR_OK)
374 {
375 buffer_size /= 2;
376 if (buffer_size <= 256)
377 {
378 /* if we already allocated the writing code, but failed to get a
379 * buffer, free the algorithm */
380 if (stm32x_info->write_algorithm)
381 target_free_working_area(target, stm32x_info->write_algorithm);
382
383 LOG_WARNING("no large enough working area available, can't do block memory writes");
384 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
385 }
386 };
387
388 armv7m_info.common_magic = ARMV7M_COMMON_MAGIC;
389 armv7m_info.core_mode = ARMV7M_MODE_ANY;
390
391 init_reg_param(&reg_params[0], "r0", 32, PARAM_OUT);
392 init_reg_param(&reg_params[1], "r1", 32, PARAM_OUT);
393 init_reg_param(&reg_params[2], "r2", 32, PARAM_OUT);
394 init_reg_param(&reg_params[3], "r3", 32, PARAM_IN_OUT);
395 init_reg_param(&reg_params[4], "r4", 32, PARAM_OUT);
396
397 while (count > 0)
398 {
399 uint32_t thisrun_count = (count > (buffer_size / 2)) ?
400 (buffer_size / 2) : count;
401
402 if ((retval = target_write_buffer(target, source->address,
403 thisrun_count * 2, buffer)) != ERROR_OK)
404 break;
405
406 buf_set_u32(reg_params[0].value, 0, 32, source->address);
407 buf_set_u32(reg_params[1].value, 0, 32, address);
408 buf_set_u32(reg_params[2].value, 0, 32, thisrun_count);
409 // R3 is a return value only
410 buf_set_u32(reg_params[4].value, 0, 32, STM32_FLASH_BASE);
411
412 if ((retval = target_run_algorithm(target, 0, NULL,
413 sizeof(reg_params) / sizeof(*reg_params),
414 reg_params,
415 stm32x_info->write_algorithm->address,
416 0,
417 10000, &armv7m_info)) != ERROR_OK)
418 {
419 LOG_ERROR("error executing stm32x flash write algorithm");
420 break;
421 }
422
423 uint32_t error = buf_get_u32(reg_params[3].value, 0, 32) & FLASH_ERROR;
424
425 if (error & FLASH_WRPERR)
426 {
427 LOG_ERROR("flash memory write protected");
428 }
429
430 if (error != 0)
431 {
432 LOG_ERROR("flash write failed = %08x", error);
433 /* Clear but report errors */
434 target_write_u32(target, STM32_FLASH_SR, error);
435 retval = ERROR_FAIL;
436 break;
437 }
438
439 buffer += thisrun_count * 2;
440 address += thisrun_count * 2;
441 count -= thisrun_count;
442 }
443
444 target_free_working_area(target, source);
445 target_free_working_area(target, stm32x_info->write_algorithm);
446
447 destroy_reg_param(&reg_params[0]);
448 destroy_reg_param(&reg_params[1]);
449 destroy_reg_param(&reg_params[2]);
450 destroy_reg_param(&reg_params[3]);
451 destroy_reg_param(&reg_params[4]);
452
453 return retval;
454 }
455
456 static int stm32x_write(struct flash_bank *bank, uint8_t *buffer,
457 uint32_t offset, uint32_t count)
458 {
459 struct target *target = bank->target;
460 uint32_t words_remaining = (count / 2);
461 uint32_t bytes_remaining = (count & 0x00000001);
462 uint32_t address = bank->base + offset;
463 uint32_t bytes_written = 0;
464 int retval;
465
466 if (bank->target->state != TARGET_HALTED)
467 {
468 LOG_ERROR("Target not halted");
469 return ERROR_TARGET_NOT_HALTED;
470 }
471
472 if (offset & 0x1)
473 {
474 LOG_WARNING("offset 0x%" PRIx32 " breaks required 2-byte alignment", offset);
475 return ERROR_FLASH_DST_BREAKS_ALIGNMENT;
476 }
477
478 retval = stm32x_unlock_reg(target);
479 if (retval != ERROR_OK)
480 return retval;
481
482 /* multiple half words (2-byte) to be programmed? */
483 if (words_remaining > 0)
484 {
485 /* try using a block write */
486 if ((retval = stm32x_write_block(bank, buffer, offset, words_remaining)) != ERROR_OK)
487 {
488 if (retval == ERROR_TARGET_RESOURCE_NOT_AVAILABLE)
489 {
490 /* if block write failed (no sufficient working area),
491 * we use normal (slow) single dword accesses */
492 LOG_WARNING("couldn't use block writes, falling back to single memory accesses");
493 }
494 }
495 else
496 {
497 buffer += words_remaining * 2;
498 address += words_remaining * 2;
499 words_remaining = 0;
500 }
501 }
502
503 if ((retval != ERROR_OK) && (retval != ERROR_TARGET_RESOURCE_NOT_AVAILABLE))
504 return retval;
505
506 /*
507 Standard programming
508 The Flash memory programming sequence is as follows:
509 1. Check that no main Flash memory operation is ongoing by checking the BSY bit in the
510 FLASH_SR register.
511 2. Set the PG bit in the FLASH_CR register
512 3. Perform the data write operation(s) to the desired memory address (inside main
513 memory block or OTP area):
514 – – Half-word access in case of x16 parallelism
515 – Word access in case of x32 parallelism
516 –
517 4.
518 Byte access in case of x8 parallelism
519 Double word access in case of x64 parallelism
520 Wait for the BSY bit to be cleared
521 */
522 while (words_remaining > 0)
523 {
524 uint16_t value;
525 memcpy(&value, buffer + bytes_written, sizeof(uint16_t));
526
527 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_CR),
528 FLASH_PG | FLASH_PSIZE_16);
529 if (retval != ERROR_OK)
530 return retval;
531
532 retval = target_write_u16(target, address, value);
533 if (retval != ERROR_OK)
534 return retval;
535
536 retval = stm32x_wait_status_busy(bank, FLASH_WRITE_TIMEOUT);
537 if (retval != ERROR_OK)
538 return retval;
539
540 bytes_written += 2;
541 words_remaining--;
542 address += 2;
543 }
544
545 if (bytes_remaining)
546 {
547 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_CR),
548 FLASH_PG | FLASH_PSIZE_8);
549 if (retval != ERROR_OK)
550 return retval;
551 retval = target_write_u8(target, address, buffer[bytes_written]);
552 if (retval != ERROR_OK)
553 return retval;
554
555 retval = stm32x_wait_status_busy(bank, FLASH_WRITE_TIMEOUT);
556 if (retval != ERROR_OK)
557 return retval;
558 }
559
560 return target_write_u32(target, STM32_FLASH_CR, FLASH_LOCK);
561 }
562
563 static void setup_sector(struct flash_bank *bank, int start, int num, int size)
564 {
565 for (int i = start; i < (start + num) ; i++)
566 {
567 bank->sectors[i].offset = bank->size;
568 bank->sectors[i].size = size;
569 bank->size += bank->sectors[i].size;
570 }
571 }
572
573 static int stm32x_probe(struct flash_bank *bank)
574 {
575 struct target *target = bank->target;
576 struct stm32x_flash_bank *stm32x_info = bank->driver_priv;
577 int i;
578 uint16_t flash_size_in_kb;
579 uint32_t device_id;
580 uint32_t base_address = 0x08000000;
581
582 stm32x_info->probed = 0;
583
584 /* read stm32 device id register */
585 int retval = target_read_u32(target, 0xE0042000, &device_id);
586 if (retval != ERROR_OK)
587 return retval;
588 LOG_INFO("device id = 0x%08" PRIx32 "", device_id);
589
590 /* get flash size from target. */
591 retval = target_read_u16(target, 0x1FFF7A10, &flash_size_in_kb);
592 if (retval != ERROR_OK) {
593 LOG_WARNING("failed reading flash size, default to max target family");
594 /* failed reading flash size, default to max target family */
595 flash_size_in_kb = 0xffff;
596 }
597
598 if ((device_id & 0x7ff) == 0x411) {
599 /* check for early silicon */
600 if (flash_size_in_kb == 0xffff) {
601 /* number of sectors may be incorrrect on early silicon */
602 LOG_WARNING("STM32 flash size failed, probe inaccurate - assuming 512k flash");
603 flash_size_in_kb = 512;
604 }
605 } else if ((device_id & 0x7ff) == 0x413) {
606 /* check for early silicon */
607 if (flash_size_in_kb == 0xffff) {
608 /* number of sectors may be incorrrect on early silicon */
609 LOG_WARNING("STM32 flash size failed, probe inaccurate - assuming 512k flash");
610 flash_size_in_kb = 512;
611 }
612 } else {
613 LOG_WARNING("Cannot identify target as a STM32 family.");
614 return ERROR_FAIL;
615 }
616
617 LOG_INFO("flash size = %dkbytes", flash_size_in_kb);
618
619 /* did we assign flash size? */
620 assert(flash_size_in_kb != 0xffff);
621
622 /* calculate numbers of pages */
623 int num_pages = (flash_size_in_kb / 128) + 4;
624
625 /* check that calculation result makes sense */
626 assert(num_pages > 0);
627
628 if (bank->sectors) {
629 free(bank->sectors);
630 bank->sectors = NULL;
631 }
632
633 bank->base = base_address;
634 bank->num_sectors = num_pages;
635 bank->sectors = malloc(sizeof(struct flash_sector) * num_pages);
636 bank->size = 0;
637
638 /* fixed memory */
639 setup_sector(bank, 0, 4, 16 * 1024);
640 setup_sector(bank, 4, 1, 64 * 1024);
641
642 /* dynamic memory */
643 setup_sector(bank, 4 + 1, num_pages - 5, 128 * 1024);
644
645 for (i = 0; i < num_pages; i++) {
646 bank->sectors[i].is_erased = -1;
647 bank->sectors[i].is_protected = 0;
648 }
649
650 stm32x_info->probed = 1;
651
652 return ERROR_OK;
653 }
654
655 static int stm32x_auto_probe(struct flash_bank *bank)
656 {
657 struct stm32x_flash_bank *stm32x_info = bank->driver_priv;
658 if (stm32x_info->probed)
659 return ERROR_OK;
660 return stm32x_probe(bank);
661 }
662
663 static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size)
664 {
665 struct target *target = bank->target;
666 uint32_t device_id;
667 int printed;
668
669 /* read stm32 device id register */
670 int retval = target_read_u32(target, 0xE0042000, &device_id);
671 if (retval != ERROR_OK)
672 return retval;
673
674 if ((device_id & 0x7ff) == 0x411) {
675 printed = snprintf(buf, buf_size, "stm32f2x - Rev: ");
676 buf += printed;
677 buf_size -= printed;
678
679 switch (device_id >> 16) {
680 case 0x1000:
681 snprintf(buf, buf_size, "A");
682 break;
683
684 case 0x2000:
685 snprintf(buf, buf_size, "B");
686 break;
687
688 case 0x1001:
689 snprintf(buf, buf_size, "Z");
690 break;
691
692 case 0x2001:
693 snprintf(buf, buf_size, "Y");
694 break;
695
696 default:
697 snprintf(buf, buf_size, "unknown");
698 break;
699 }
700 } else if ((device_id & 0x7ff) == 0x413) {
701 printed = snprintf(buf, buf_size, "stm32f4x - Rev: ");
702 buf += printed;
703 buf_size -= printed;
704
705 switch (device_id >> 16) {
706 case 0x1000:
707 snprintf(buf, buf_size, "A");
708 break;
709
710 default:
711 snprintf(buf, buf_size, "unknown");
712 break;
713 }
714 } else {
715 snprintf(buf, buf_size, "Cannot identify target as a stm32x\n");
716 return ERROR_FAIL;
717 }
718
719 return ERROR_OK;
720 }
721
722 static int stm32x_mass_erase(struct flash_bank *bank)
723 {
724 int retval;
725 struct target *target = bank->target;
726
727 if (target->state != TARGET_HALTED) {
728 LOG_ERROR("Target not halted");
729 return ERROR_TARGET_NOT_HALTED;
730 }
731
732 retval = stm32x_unlock_reg(target);
733 if (retval != ERROR_OK)
734 return retval;
735
736 /* mass erase flash memory */
737 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_CR), FLASH_MER);
738 if (retval != ERROR_OK)
739 return retval;
740 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_CR),
741 FLASH_MER | FLASH_STRT);
742 if (retval != ERROR_OK)
743 return retval;
744
745 retval = stm32x_wait_status_busy(bank, 30000);
746 if (retval != ERROR_OK)
747 return retval;
748
749 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_CR), FLASH_LOCK);
750 if (retval != ERROR_OK)
751 return retval;
752
753 return ERROR_OK;
754 }
755
756 COMMAND_HANDLER(stm32x_handle_mass_erase_command)
757 {
758 int i;
759
760 if (CMD_ARGC < 1) {
761 command_print(CMD_CTX, "stm32x mass_erase <bank>");
762 return ERROR_COMMAND_SYNTAX_ERROR;
763 }
764
765 struct flash_bank *bank;
766 int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
767 if (ERROR_OK != retval)
768 return retval;
769
770 retval = stm32x_mass_erase(bank);
771 if (retval == ERROR_OK) {
772 /* set all sectors as erased */
773 for (i = 0; i < bank->num_sectors; i++)
774 bank->sectors[i].is_erased = 1;
775
776 command_print(CMD_CTX, "stm32x mass erase complete");
777 } else {
778 command_print(CMD_CTX, "stm32x mass erase failed");
779 }
780
781 return retval;
782 }
783
784 static const struct command_registration stm32x_exec_command_handlers[] = {
785 {
786 .name = "mass_erase",
787 .handler = stm32x_handle_mass_erase_command,
788 .mode = COMMAND_EXEC,
789 .usage = "bank_id",
790 .help = "Erase entire flash device.",
791 },
792 COMMAND_REGISTRATION_DONE
793 };
794
795 static const struct command_registration stm32x_command_handlers[] = {
796 {
797 .name = "stm32f2x",
798 .mode = COMMAND_ANY,
799 .help = "stm32f2x flash command group",
800 .chain = stm32x_exec_command_handlers,
801 },
802 COMMAND_REGISTRATION_DONE
803 };
804
805 struct flash_driver stm32f2x_flash = {
806 .name = "stm32f2x",
807 .commands = stm32x_command_handlers,
808 .flash_bank_command = stm32x_flash_bank_command,
809 .erase = stm32x_erase,
810 .protect = stm32x_protect,
811 .write = stm32x_write,
812 .read = default_flash_read,
813 .probe = stm32x_probe,
814 .auto_probe = stm32x_auto_probe,
815 .erase_check = default_flash_mem_blank_check,
816 .protect_check = stm32x_protect_check,
817 .info = get_stm32x_info,
818 };

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)