flash/nor: implement flash bank deallocation in drivers with simple alloc
[openocd.git] / src / flash / nor / stm32f2x.c
blob8bca62ea207c32030c181e72721f0474e8f338ab
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, see <http://www.gnu.org/licenses/>. *
23 ***************************************************************************/
25 #ifdef HAVE_CONFIG_H
26 #include "config.h"
27 #endif
29 #include "imp.h"
30 #include <helper/binarybuffer.h>
31 #include <target/algorithm.h>
32 #include <target/armv7m.h>
34 /* Regarding performance:
36 * Short story - it might be best to leave the performance at
37 * current levels.
39 * You may see a jump in speed if you change to using
40 * 32bit words for the block programming.
42 * Its a shame you cannot use the double word as its
43 * even faster - but you require external VPP for that mode.
45 * Having said all that 16bit writes give us the widest vdd
46 * operating range, so may be worth adding a note to that effect.
50 /* Danger!!!! The STM32F1x and STM32F2x series actually have
51 * quite different flash controllers.
53 * What's more scary is that the names of the registers and their
54 * addresses are the same, but the actual bits and what they do are
55 * can be very different.
57 * To reduce testing complexity and dangers of regressions,
58 * a seperate file is used for stm32fx2x.
60 * Sector sizes in kiBytes:
61 * 1 MiByte part with 4 x 16, 1 x 64, 7 x 128.
62 * 1.5 MiByte part with 4 x 16, 1 x 64, 11 x 128.
63 * 2 MiByte part with 4 x 16, 1 x 64, 7 x 128, 4 x 16, 1 x 64, 7 x 128.
64 * 1 MiByte STM32F42x/43x part with DB1M Option set:
65 * 4 x 16, 1 x 64, 3 x 128, 4 x 16, 1 x 64, 3 x 128.
67 * STM32F7[2|3]
68 * 512 kiByte part with 4 x 16, 1 x 64, 3 x 128.
70 * STM32F7[4|5]
71 * 1 MiByte part with 4 x 32, 1 x 128, 3 x 256.
73 * STM32F7[6|7]
74 * 1 MiByte part in single bank mode with 4 x 32, 1 x 128, 3 x 256.
75 * 1 MiByte part in dual-bank mode two banks with 4 x 16, 1 x 64, 3 x 128 each.
76 * 2 MiByte part in single-bank mode with 4 x 32, 1 x 128, 7 x 256.
77 * 2 MiByte part in dual-bank mode two banks with 4 x 16, 1 x 64, 7 x 128 each.
79 * Protection size is sector size.
81 * Tested with STM3220F-EVAL board.
83 * STM32F4xx series for reference.
85 * RM0090
86 * http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf
88 * PM0059
89 * www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/
90 * PROGRAMMING_MANUAL/CD00233952.pdf
92 * STM32F7xx series for reference.
94 * RM0385
95 * http://www.st.com/web/en/resource/technical/document/reference_manual/DM00124865.pdf
97 * RM0410
98 * http://www.st.com/resource/en/reference_manual/dm00224583.pdf
100 * RM0430
101 * http://www.st.com/resource/en/reference_manual/dm00305666.pdf
103 * RM0431
104 * http://www.st.com/resource/en/reference_manual/dm00305990.pdf
106 * STM32F1x series - notice that this code was copy, pasted and knocked
107 * into a stm32f2x driver, so in case something has been converted or
108 * bugs haven't been fixed, here are the original manuals:
110 * RM0008 - Reference manual
112 * RM0042, the Flash programming manual for low-, medium- high-density and
113 * connectivity line STM32F10x devices
115 * PM0068, the Flash programming manual for XL-density STM32F10x devices.
119 /* Erase time can be as high as 1000ms, 10x this and it's toast... */
120 #define FLASH_ERASE_TIMEOUT 10000
121 #define FLASH_WRITE_TIMEOUT 5
123 /* Mass erase time can be as high as 32 s in x8 mode. */
124 #define FLASH_MASS_ERASE_TIMEOUT 33000
126 #define STM32_FLASH_BASE 0x40023c00
127 #define STM32_FLASH_ACR 0x40023c00
128 #define STM32_FLASH_KEYR 0x40023c04
129 #define STM32_FLASH_OPTKEYR 0x40023c08
130 #define STM32_FLASH_SR 0x40023c0C
131 #define STM32_FLASH_CR 0x40023c10
132 #define STM32_FLASH_OPTCR 0x40023c14
133 #define STM32_FLASH_OPTCR1 0x40023c18
134 #define STM32_FLASH_OPTCR2 0x40023c1c
136 /* FLASH_CR register bits */
137 #define FLASH_PG (1 << 0)
138 #define FLASH_SER (1 << 1)
139 #define FLASH_MER (1 << 2) /* MER/MER1 for f76x/77x */
140 #define FLASH_MER1 (1 << 15) /* MER2 for f76x/77x, confusing ... */
141 #define FLASH_STRT (1 << 16)
142 #define FLASH_PSIZE_8 (0 << 8)
143 #define FLASH_PSIZE_16 (1 << 8)
144 #define FLASH_PSIZE_32 (2 << 8)
145 #define FLASH_PSIZE_64 (3 << 8)
146 /* The sector number encoding is not straight binary for dual bank flash. */
147 #define FLASH_SNB(a) ((a) << 3)
148 #define FLASH_LOCK (1 << 31)
150 /* FLASH_SR register bits */
151 #define FLASH_BSY (1 << 16)
152 #define FLASH_PGSERR (1 << 7) /* Programming sequence error */
153 #define FLASH_PGPERR (1 << 6) /* Programming parallelism error */
154 #define FLASH_PGAERR (1 << 5) /* Programming alignment error */
155 #define FLASH_WRPERR (1 << 4) /* Write protection error */
156 #define FLASH_OPERR (1 << 1) /* Operation error */
158 #define FLASH_ERROR (FLASH_PGSERR | FLASH_PGPERR | FLASH_PGAERR | FLASH_WRPERR | FLASH_OPERR)
160 /* STM32_FLASH_OPTCR register bits */
161 #define OPTCR_LOCK (1 << 0)
162 #define OPTCR_START (1 << 1)
163 #define OPTCR_NDBANK (1 << 29) /* not dual bank mode */
164 #define OPTCR_DB1M (1 << 30) /* 1 MiB devices dual flash bank option */
165 #define OPTCR_SPRMOD (1 << 31) /* switches PCROPi/nWPRi interpretation */
167 /* STM32_FLASH_OPTCR2 register bits */
168 #define OPTCR2_PCROP_RDP (1 << 31) /* erase PCROP zone when decreasing RDP */
170 /* register unlock keys */
171 #define KEY1 0x45670123
172 #define KEY2 0xCDEF89AB
174 /* option register unlock key */
175 #define OPTKEY1 0x08192A3B
176 #define OPTKEY2 0x4C5D6E7F
178 struct stm32x_options {
179 uint8_t RDP;
180 uint16_t user_options; /* bit 0-7 usual options, bit 8-11 extra options */
181 uint32_t protection;
182 uint32_t boot_addr;
183 uint32_t optcr2_pcrop;
186 struct stm32x_flash_bank {
187 struct stm32x_options option_bytes;
188 int probed;
189 bool has_large_mem; /* F42x/43x/469/479/7xx in dual bank mode */
190 bool has_extra_options; /* F42x/43x/469/479/7xx */
191 bool has_boot_addr; /* F7xx */
192 bool has_optcr2_pcrop; /* F72x/73x */
193 int protection_bits; /* F413/423 */
194 uint32_t user_bank_size;
197 /* flash bank stm32x <base> <size> 0 0 <target#>
199 FLASH_BANK_COMMAND_HANDLER(stm32x_flash_bank_command)
201 struct stm32x_flash_bank *stm32x_info;
203 if (CMD_ARGC < 6)
204 return ERROR_COMMAND_SYNTAX_ERROR;
206 stm32x_info = malloc(sizeof(struct stm32x_flash_bank));
207 bank->driver_priv = stm32x_info;
209 stm32x_info->probed = 0;
210 stm32x_info->user_bank_size = bank->size;
212 return ERROR_OK;
215 static inline int stm32x_get_flash_reg(struct flash_bank *bank, uint32_t reg)
217 return reg;
220 static inline int stm32x_get_flash_status(struct flash_bank *bank, uint32_t *status)
222 struct target *target = bank->target;
223 return target_read_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_SR), status);
226 static int stm32x_wait_status_busy(struct flash_bank *bank, int timeout)
228 struct target *target = bank->target;
229 uint32_t status;
230 int retval = ERROR_OK;
232 /* wait for busy to clear */
233 for (;;) {
234 retval = stm32x_get_flash_status(bank, &status);
235 if (retval != ERROR_OK)
236 return retval;
237 LOG_DEBUG("status: 0x%" PRIx32 "", status);
238 if ((status & FLASH_BSY) == 0)
239 break;
240 if (timeout-- <= 0) {
241 LOG_ERROR("timed out waiting for flash");
242 return ERROR_FAIL;
244 alive_sleep(1);
248 if (status & FLASH_WRPERR) {
249 LOG_ERROR("stm32x device protected");
250 retval = ERROR_FAIL;
253 /* Clear but report errors */
254 if (status & FLASH_ERROR) {
255 /* If this operation fails, we ignore it and report the original
256 * retval
258 target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_SR),
259 status & FLASH_ERROR);
261 return retval;
264 static int stm32x_unlock_reg(struct target *target)
266 uint32_t ctrl;
268 /* first check if not already unlocked
269 * otherwise writing on STM32_FLASH_KEYR will fail
271 int retval = target_read_u32(target, STM32_FLASH_CR, &ctrl);
272 if (retval != ERROR_OK)
273 return retval;
275 if ((ctrl & FLASH_LOCK) == 0)
276 return ERROR_OK;
278 /* unlock flash registers */
279 retval = target_write_u32(target, STM32_FLASH_KEYR, KEY1);
280 if (retval != ERROR_OK)
281 return retval;
283 retval = target_write_u32(target, STM32_FLASH_KEYR, KEY2);
284 if (retval != ERROR_OK)
285 return retval;
287 retval = target_read_u32(target, STM32_FLASH_CR, &ctrl);
288 if (retval != ERROR_OK)
289 return retval;
291 if (ctrl & FLASH_LOCK) {
292 LOG_ERROR("flash not unlocked STM32_FLASH_CR: %" PRIx32, ctrl);
293 return ERROR_TARGET_FAILURE;
296 return ERROR_OK;
299 static int stm32x_unlock_option_reg(struct target *target)
301 uint32_t ctrl;
303 int retval = target_read_u32(target, STM32_FLASH_OPTCR, &ctrl);
304 if (retval != ERROR_OK)
305 return retval;
307 if ((ctrl & OPTCR_LOCK) == 0)
308 return ERROR_OK;
310 /* unlock option registers */
311 retval = target_write_u32(target, STM32_FLASH_OPTKEYR, OPTKEY1);
312 if (retval != ERROR_OK)
313 return retval;
315 retval = target_write_u32(target, STM32_FLASH_OPTKEYR, OPTKEY2);
316 if (retval != ERROR_OK)
317 return retval;
319 retval = target_read_u32(target, STM32_FLASH_OPTCR, &ctrl);
320 if (retval != ERROR_OK)
321 return retval;
323 if (ctrl & OPTCR_LOCK) {
324 LOG_ERROR("options not unlocked STM32_FLASH_OPTCR: %" PRIx32, ctrl);
325 return ERROR_TARGET_FAILURE;
328 return ERROR_OK;
331 static int stm32x_read_options(struct flash_bank *bank)
333 uint32_t optiondata;
334 struct stm32x_flash_bank *stm32x_info = NULL;
335 struct target *target = bank->target;
337 stm32x_info = bank->driver_priv;
339 /* read current option bytes */
340 int retval = target_read_u32(target, STM32_FLASH_OPTCR, &optiondata);
341 if (retval != ERROR_OK)
342 return retval;
344 /* caution: F2 implements 5 bits (WDG_SW only)
345 * whereas F7 6 bits (IWDG_SW and WWDG_SW) in user_options */
346 stm32x_info->option_bytes.user_options = optiondata & 0xfc;
347 stm32x_info->option_bytes.RDP = (optiondata >> 8) & 0xff;
348 stm32x_info->option_bytes.protection =
349 (optiondata >> 16) & (~(0xffff << stm32x_info->protection_bits) & 0xffff);
351 if (stm32x_info->has_extra_options) {
352 /* F42x/43x/469/479 and 7xx have up to 4 bits of extra options */
353 stm32x_info->option_bytes.user_options |= (optiondata >> 20) &
354 ((0xf00 << (stm32x_info->protection_bits - 12)) & 0xf00);
357 if (stm32x_info->has_large_mem || stm32x_info->has_boot_addr) {
358 retval = target_read_u32(target, STM32_FLASH_OPTCR1, &optiondata);
359 if (retval != ERROR_OK)
360 return retval;
362 /* FLASH_OPTCR1 has quite diffent meanings ... */
363 if (stm32x_info->has_boot_addr) {
364 /* for F7xx it contains boot0 and boot1 */
365 stm32x_info->option_bytes.boot_addr = optiondata;
366 } else {
367 /* for F42x/43x/469/479 it contains 12 additional protection bits */
368 stm32x_info->option_bytes.protection |= (optiondata >> 4) & 0x00fff000;
372 if (stm32x_info->has_optcr2_pcrop) {
373 retval = target_read_u32(target, STM32_FLASH_OPTCR2, &optiondata);
374 if (retval != ERROR_OK)
375 return retval;
377 stm32x_info->option_bytes.optcr2_pcrop = optiondata;
378 if (stm32x_info->has_optcr2_pcrop &&
379 (stm32x_info->option_bytes.optcr2_pcrop & ~OPTCR2_PCROP_RDP)) {
380 LOG_INFO("PCROP Engaged");
382 } else {
383 stm32x_info->option_bytes.optcr2_pcrop = 0x0;
386 if (stm32x_info->option_bytes.RDP != 0xAA)
387 LOG_INFO("Device Security Bit Set");
389 return ERROR_OK;
392 static int stm32x_write_options(struct flash_bank *bank)
394 struct stm32x_flash_bank *stm32x_info = NULL;
395 struct target *target = bank->target;
396 uint32_t optiondata, optiondata2;
398 stm32x_info = bank->driver_priv;
400 int retval = stm32x_unlock_option_reg(target);
401 if (retval != ERROR_OK)
402 return retval;
404 /* rebuild option data */
405 optiondata = stm32x_info->option_bytes.user_options & 0xfc;
406 optiondata |= stm32x_info->option_bytes.RDP << 8;
407 optiondata |= (stm32x_info->option_bytes.protection &
408 (~(0xffff << stm32x_info->protection_bits))) << 16;
410 if (stm32x_info->has_extra_options) {
411 /* F42x/43x/469/479 and 7xx have up to 4 bits of extra options */
412 optiondata |= (stm32x_info->option_bytes.user_options &
413 ((0xf00 << (stm32x_info->protection_bits - 12)) & 0xf00)) << 20;
416 if (stm32x_info->has_large_mem || stm32x_info->has_boot_addr) {
417 if (stm32x_info->has_boot_addr) {
418 /* F7xx uses FLASH_OPTCR1 for boot0 and boot1 ... */
419 optiondata2 = stm32x_info->option_bytes.boot_addr;
420 } else {
421 /* F42x/43x/469/479 uses FLASH_OPTCR1 for additional protection bits */
422 optiondata2 = (stm32x_info->option_bytes.protection & 0x00fff000) << 4;
425 retval = target_write_u32(target, STM32_FLASH_OPTCR1, optiondata2);
426 if (retval != ERROR_OK)
427 return retval;
430 /* program extra pcrop register */
431 if (stm32x_info->has_optcr2_pcrop) {
432 retval = target_write_u32(target, STM32_FLASH_OPTCR2,
433 stm32x_info->option_bytes.optcr2_pcrop);
434 if (retval != ERROR_OK)
435 return retval;
438 /* program options */
439 retval = target_write_u32(target, STM32_FLASH_OPTCR, optiondata);
440 if (retval != ERROR_OK)
441 return retval;
443 /* start programming cycle */
444 retval = target_write_u32(target, STM32_FLASH_OPTCR, optiondata | OPTCR_START);
445 if (retval != ERROR_OK)
446 return retval;
448 /* wait for completion, this might trigger a security erase and take a while */
449 retval = stm32x_wait_status_busy(bank, FLASH_MASS_ERASE_TIMEOUT);
450 if (retval != ERROR_OK)
451 return retval;
453 /* relock registers */
454 retval = target_write_u32(target, STM32_FLASH_OPTCR, optiondata | OPTCR_LOCK);
455 if (retval != ERROR_OK)
456 return retval;
458 return ERROR_OK;
461 static int stm32x_protect_check(struct flash_bank *bank)
463 struct stm32x_flash_bank *stm32x_info = bank->driver_priv;
464 struct flash_sector *prot_blocks;
465 int num_prot_blocks;
467 /* read write protection settings */
468 int retval = stm32x_read_options(bank);
469 if (retval != ERROR_OK) {
470 LOG_DEBUG("unable to read option bytes");
471 return retval;
474 if (bank->prot_blocks) {
475 num_prot_blocks = bank->num_prot_blocks;
476 prot_blocks = bank->prot_blocks;
477 } else {
478 num_prot_blocks = bank->num_sectors;
479 prot_blocks = bank->sectors;
482 for (int i = 0; i < num_prot_blocks; i++)
483 prot_blocks[i].is_protected =
484 ~(stm32x_info->option_bytes.protection >> i) & 1;
486 return ERROR_OK;
489 static int stm32x_erase(struct flash_bank *bank, int first, int last)
491 struct stm32x_flash_bank *stm32x_info = bank->driver_priv;
492 struct target *target = bank->target;
493 int i;
495 assert((0 <= first) && (first <= last) && (last < bank->num_sectors));
497 if (bank->target->state != TARGET_HALTED) {
498 LOG_ERROR("Target not halted");
499 return ERROR_TARGET_NOT_HALTED;
502 int retval;
503 retval = stm32x_unlock_reg(target);
504 if (retval != ERROR_OK)
505 return retval;
508 Sector Erase
509 To erase a sector, follow the procedure below:
510 1. Check that no Flash memory operation is ongoing by checking the BSY bit in the
511 FLASH_SR register
512 2. Set the SER bit and select the sector
513 you wish to erase (SNB) in the FLASH_CR register
514 3. Set the STRT bit in the FLASH_CR register
515 4. Wait for the BSY bit to be cleared
518 for (i = first; i <= last; i++) {
519 int snb;
520 if (stm32x_info->has_large_mem && i >= 12)
521 snb = (i - 12) | 0x10;
522 else
523 snb = i;
525 retval = target_write_u32(target,
526 stm32x_get_flash_reg(bank, STM32_FLASH_CR), FLASH_SER | FLASH_SNB(snb) | FLASH_STRT);
527 if (retval != ERROR_OK)
528 return retval;
530 retval = stm32x_wait_status_busy(bank, FLASH_ERASE_TIMEOUT);
531 if (retval != ERROR_OK)
532 return retval;
534 bank->sectors[i].is_erased = 1;
537 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_CR), FLASH_LOCK);
538 if (retval != ERROR_OK)
539 return retval;
541 return ERROR_OK;
544 static int stm32x_protect(struct flash_bank *bank, int set, int first, int last)
546 struct target *target = bank->target;
547 struct stm32x_flash_bank *stm32x_info = bank->driver_priv;
549 if (target->state != TARGET_HALTED) {
550 LOG_ERROR("Target not halted");
551 return ERROR_TARGET_NOT_HALTED;
554 /* read protection settings */
555 int retval = stm32x_read_options(bank);
556 if (retval != ERROR_OK) {
557 LOG_DEBUG("unable to read option bytes");
558 return retval;
561 for (int i = first; i <= last; i++) {
562 if (set)
563 stm32x_info->option_bytes.protection &= ~(1 << i);
564 else
565 stm32x_info->option_bytes.protection |= (1 << i);
568 retval = stm32x_write_options(bank);
569 if (retval != ERROR_OK)
570 return retval;
572 return ERROR_OK;
575 static int stm32x_write_block(struct flash_bank *bank, const uint8_t *buffer,
576 uint32_t offset, uint32_t count)
578 struct target *target = bank->target;
579 uint32_t buffer_size = 16384;
580 struct working_area *write_algorithm;
581 struct working_area *source;
582 uint32_t address = bank->base + offset;
583 struct reg_param reg_params[5];
584 struct armv7m_algorithm armv7m_info;
585 int retval = ERROR_OK;
587 /* see contrib/loaders/flash/stm32f2x.S for src */
589 static const uint8_t stm32x_flash_write_code[] = {
590 /* wait_fifo: */
591 0xD0, 0xF8, 0x00, 0x80, /* ldr r8, [r0, #0] */
592 0xB8, 0xF1, 0x00, 0x0F, /* cmp r8, #0 */
593 0x1A, 0xD0, /* beq exit */
594 0x47, 0x68, /* ldr r7, [r0, #4] */
595 0x47, 0x45, /* cmp r7, r8 */
596 0xF7, 0xD0, /* beq wait_fifo */
598 0xDF, 0xF8, 0x34, 0x60, /* ldr r6, STM32_PROG16 */
599 0x26, 0x61, /* str r6, [r4, #STM32_FLASH_CR_OFFSET] */
600 0x37, 0xF8, 0x02, 0x6B, /* ldrh r6, [r7], #0x02 */
601 0x22, 0xF8, 0x02, 0x6B, /* strh r6, [r2], #0x02 */
602 0xBF, 0xF3, 0x4F, 0x8F, /* dsb sy */
603 /* busy: */
604 0xE6, 0x68, /* ldr r6, [r4, #STM32_FLASH_SR_OFFSET] */
605 0x16, 0xF4, 0x80, 0x3F, /* tst r6, #0x10000 */
606 0xFB, 0xD1, /* bne busy */
607 0x16, 0xF0, 0xF0, 0x0F, /* tst r6, #0xf0 */
608 0x07, 0xD1, /* bne error */
610 0x8F, 0x42, /* cmp r7, r1 */
611 0x28, 0xBF, /* it cs */
612 0x00, 0xF1, 0x08, 0x07, /* addcs r7, r0, #8 */
613 0x47, 0x60, /* str r7, [r0, #4] */
614 0x01, 0x3B, /* subs r3, r3, #1 */
615 0x13, 0xB1, /* cbz r3, exit */
616 0xDF, 0xE7, /* b wait_fifo */
617 /* error: */
618 0x00, 0x21, /* movs r1, #0 */
619 0x41, 0x60, /* str r1, [r0, #4] */
620 /* exit: */
621 0x30, 0x46, /* mov r0, r6 */
622 0x00, 0xBE, /* bkpt #0x00 */
624 /* <STM32_PROG16>: */
625 0x01, 0x01, 0x00, 0x00, /* .word 0x00000101 */
628 if (target_alloc_working_area(target, sizeof(stm32x_flash_write_code),
629 &write_algorithm) != ERROR_OK) {
630 LOG_WARNING("no working area available, can't do block memory writes");
631 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
634 retval = target_write_buffer(target, write_algorithm->address,
635 sizeof(stm32x_flash_write_code),
636 stm32x_flash_write_code);
637 if (retval != ERROR_OK)
638 return retval;
640 /* memory buffer */
641 while (target_alloc_working_area_try(target, buffer_size, &source) != ERROR_OK) {
642 buffer_size /= 2;
643 if (buffer_size <= 256) {
644 /* we already allocated the writing code, but failed to get a
645 * buffer, free the algorithm */
646 target_free_working_area(target, write_algorithm);
648 LOG_WARNING("no large enough working area available, can't do block memory writes");
649 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
653 armv7m_info.common_magic = ARMV7M_COMMON_MAGIC;
654 armv7m_info.core_mode = ARM_MODE_THREAD;
656 init_reg_param(&reg_params[0], "r0", 32, PARAM_IN_OUT); /* buffer start, status (out) */
657 init_reg_param(&reg_params[1], "r1", 32, PARAM_OUT); /* buffer end */
658 init_reg_param(&reg_params[2], "r2", 32, PARAM_OUT); /* target address */
659 init_reg_param(&reg_params[3], "r3", 32, PARAM_OUT); /* count (halfword-16bit) */
660 init_reg_param(&reg_params[4], "r4", 32, PARAM_OUT); /* flash base */
662 buf_set_u32(reg_params[0].value, 0, 32, source->address);
663 buf_set_u32(reg_params[1].value, 0, 32, source->address + source->size);
664 buf_set_u32(reg_params[2].value, 0, 32, address);
665 buf_set_u32(reg_params[3].value, 0, 32, count);
666 buf_set_u32(reg_params[4].value, 0, 32, STM32_FLASH_BASE);
668 retval = target_run_flash_async_algorithm(target, buffer, count, 2,
669 0, NULL,
670 5, reg_params,
671 source->address, source->size,
672 write_algorithm->address, 0,
673 &armv7m_info);
675 if (retval == ERROR_FLASH_OPERATION_FAILED) {
676 LOG_ERROR("error executing stm32x flash write algorithm");
678 uint32_t error = buf_get_u32(reg_params[0].value, 0, 32) & FLASH_ERROR;
680 if (error & FLASH_WRPERR)
681 LOG_ERROR("flash memory write protected");
683 if (error != 0) {
684 LOG_ERROR("flash write failed = %08" PRIx32, error);
685 /* Clear but report errors */
686 target_write_u32(target, STM32_FLASH_SR, error);
687 retval = ERROR_FAIL;
691 target_free_working_area(target, source);
692 target_free_working_area(target, write_algorithm);
694 destroy_reg_param(&reg_params[0]);
695 destroy_reg_param(&reg_params[1]);
696 destroy_reg_param(&reg_params[2]);
697 destroy_reg_param(&reg_params[3]);
698 destroy_reg_param(&reg_params[4]);
700 return retval;
703 static int stm32x_write(struct flash_bank *bank, const uint8_t *buffer,
704 uint32_t offset, uint32_t count)
706 struct target *target = bank->target;
707 uint32_t words_remaining = (count / 2);
708 uint32_t bytes_remaining = (count & 0x00000001);
709 uint32_t address = bank->base + offset;
710 uint32_t bytes_written = 0;
711 int retval;
713 if (bank->target->state != TARGET_HALTED) {
714 LOG_ERROR("Target not halted");
715 return ERROR_TARGET_NOT_HALTED;
718 if (offset & 0x1) {
719 LOG_WARNING("offset 0x%" PRIx32 " breaks required 2-byte alignment", offset);
720 return ERROR_FLASH_DST_BREAKS_ALIGNMENT;
723 retval = stm32x_unlock_reg(target);
724 if (retval != ERROR_OK)
725 return retval;
727 /* multiple half words (2-byte) to be programmed? */
728 if (words_remaining > 0) {
729 /* try using a block write */
730 retval = stm32x_write_block(bank, buffer, offset, words_remaining);
731 if (retval != ERROR_OK) {
732 if (retval == ERROR_TARGET_RESOURCE_NOT_AVAILABLE) {
733 /* if block write failed (no sufficient working area),
734 * we use normal (slow) single dword accesses */
735 LOG_WARNING("couldn't use block writes, falling back to single memory accesses");
737 } else {
738 buffer += words_remaining * 2;
739 address += words_remaining * 2;
740 words_remaining = 0;
744 if ((retval != ERROR_OK) && (retval != ERROR_TARGET_RESOURCE_NOT_AVAILABLE))
745 return retval;
748 Standard programming
749 The Flash memory programming sequence is as follows:
750 1. Check that no main Flash memory operation is ongoing by checking the BSY bit in the
751 FLASH_SR register.
752 2. Set the PG bit in the FLASH_CR register
753 3. Perform the data write operation(s) to the desired memory address (inside main
754 memory block or OTP area):
755 – – Half-word access in case of x16 parallelism
756 – Word access in case of x32 parallelism
757 –
759 Byte access in case of x8 parallelism
760 Double word access in case of x64 parallelism
761 Wait for the BSY bit to be cleared
763 while (words_remaining > 0) {
764 uint16_t value;
765 memcpy(&value, buffer + bytes_written, sizeof(uint16_t));
767 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_CR),
768 FLASH_PG | FLASH_PSIZE_16);
769 if (retval != ERROR_OK)
770 return retval;
772 retval = target_write_u16(target, address, value);
773 if (retval != ERROR_OK)
774 return retval;
776 retval = stm32x_wait_status_busy(bank, FLASH_WRITE_TIMEOUT);
777 if (retval != ERROR_OK)
778 return retval;
780 bytes_written += 2;
781 words_remaining--;
782 address += 2;
785 if (bytes_remaining) {
786 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_CR),
787 FLASH_PG | FLASH_PSIZE_8);
788 if (retval != ERROR_OK)
789 return retval;
790 retval = target_write_u8(target, address, buffer[bytes_written]);
791 if (retval != ERROR_OK)
792 return retval;
794 retval = stm32x_wait_status_busy(bank, FLASH_WRITE_TIMEOUT);
795 if (retval != ERROR_OK)
796 return retval;
799 return target_write_u32(target, STM32_FLASH_CR, FLASH_LOCK);
802 static int setup_sector(struct flash_bank *bank, int start, int num, int size)
805 for (int i = start; i < (start + num) ; i++) {
806 assert(i < bank->num_sectors);
807 bank->sectors[i].offset = bank->size;
808 bank->sectors[i].size = size;
809 bank->size += bank->sectors[i].size;
810 LOG_DEBUG("sector %d: %dkBytes", i, size >> 10);
813 return start + num;
816 static void setup_bank(struct flash_bank *bank, int start,
817 uint16_t flash_size_in_kb, uint16_t max_sector_size_in_kb)
819 int remain;
821 start = setup_sector(bank, start, 4, (max_sector_size_in_kb / 8) * 1024);
822 start = setup_sector(bank, start, 1, (max_sector_size_in_kb / 2) * 1024);
824 /* remaining sectors all of size max_sector_size_in_kb */
825 remain = (flash_size_in_kb / max_sector_size_in_kb) - 1;
826 start = setup_sector(bank, start, remain, max_sector_size_in_kb * 1024);
829 static int stm32x_get_device_id(struct flash_bank *bank, uint32_t *device_id)
831 /* this checks for a stm32f4x errata issue where a
832 * stm32f2x DBGMCU_IDCODE is incorrectly returned.
833 * If the issue is detected target is forced to stm32f4x Rev A.
834 * Only effects Rev A silicon */
836 struct target *target = bank->target;
837 uint32_t cpuid;
839 /* read stm32 device id register */
840 int retval = target_read_u32(target, 0xE0042000, device_id);
841 if (retval != ERROR_OK)
842 return retval;
844 if ((*device_id & 0xfff) == 0x411) {
845 /* read CPUID reg to check core type */
846 retval = target_read_u32(target, 0xE000ED00, &cpuid);
847 if (retval != ERROR_OK)
848 return retval;
850 /* check for cortex_m4 */
851 if (((cpuid >> 4) & 0xFFF) == 0xC24) {
852 *device_id &= ~((0xFFFF << 16) | 0xfff);
853 *device_id |= (0x1000 << 16) | 0x413;
854 LOG_INFO("stm32f4x errata detected - fixing incorrect MCU_IDCODE");
857 return retval;
860 static int stm32x_probe(struct flash_bank *bank)
862 struct target *target = bank->target;
863 struct stm32x_flash_bank *stm32x_info = bank->driver_priv;
864 int i, num_prot_blocks;
865 uint16_t flash_size_in_kb;
866 uint32_t flash_size_reg = 0x1FFF7A22;
867 uint16_t max_sector_size_in_kb = 128;
868 uint16_t max_flash_size_in_kb;
869 uint32_t device_id;
870 uint32_t base_address = 0x08000000;
872 stm32x_info->probed = 0;
873 stm32x_info->has_large_mem = false;
874 stm32x_info->has_boot_addr = false;
875 stm32x_info->has_extra_options = false;
876 stm32x_info->has_optcr2_pcrop = false;
877 stm32x_info->protection_bits = 12; /* max. number of nWRPi bits (in FLASH_OPTCR !!!) */
878 num_prot_blocks = 0;
880 if (bank->sectors) {
881 free(bank->sectors);
882 bank->num_sectors = 0;
883 bank->sectors = NULL;
886 if (bank->prot_blocks) {
887 free(bank->prot_blocks);
888 bank->num_prot_blocks = 0;
889 bank->prot_blocks = NULL;
892 /* read stm32 device id register */
893 int retval = stm32x_get_device_id(bank, &device_id);
894 if (retval != ERROR_OK)
895 return retval;
896 LOG_INFO("device id = 0x%08" PRIx32 "", device_id);
897 device_id &= 0xfff; /* only bits 0-11 are used further on */
899 /* set max flash size depending on family, id taken from AN2606 */
900 switch (device_id) {
901 case 0x411: /* F20x/21x */
902 case 0x413: /* F40x/41x */
903 max_flash_size_in_kb = 1024;
904 break;
906 case 0x419: /* F42x/43x */
907 case 0x434: /* F469/479 */
908 stm32x_info->has_extra_options = true;
909 max_flash_size_in_kb = 2048;
910 break;
912 case 0x423: /* F401xB/C */
913 max_flash_size_in_kb = 256;
914 break;
916 case 0x421: /* F446 */
917 case 0x431: /* F411 */
918 case 0x433: /* F401xD/E */
919 case 0x441: /* F412 */
920 max_flash_size_in_kb = 512;
921 break;
923 case 0x458: /* F410 */
924 max_flash_size_in_kb = 128;
925 break;
927 case 0x449: /* F74x/75x */
928 max_flash_size_in_kb = 1024;
929 max_sector_size_in_kb = 256;
930 flash_size_reg = 0x1FF0F442;
931 stm32x_info->has_extra_options = true;
932 stm32x_info->has_boot_addr = true;
933 break;
935 case 0x451: /* F76x/77x */
936 max_flash_size_in_kb = 2048;
937 max_sector_size_in_kb = 256;
938 flash_size_reg = 0x1FF0F442;
939 stm32x_info->has_extra_options = true;
940 stm32x_info->has_boot_addr = true;
941 break;
943 case 0x452: /* F72x/73x */
944 max_flash_size_in_kb = 512;
945 flash_size_reg = 0x1FF07A22; /* yes, 0x1FF*0*7A22, not 0x1FF*F*7A22 */
946 stm32x_info->has_extra_options = true;
947 stm32x_info->has_boot_addr = true;
948 stm32x_info->has_optcr2_pcrop = true;
949 break;
951 case 0x463: /* F413x/423x */
952 max_flash_size_in_kb = 1536;
953 stm32x_info->has_extra_options = true;
954 stm32x_info->protection_bits = 15;
955 num_prot_blocks = 15;
956 break;
958 default:
959 LOG_WARNING("Cannot identify target as a STM32 family.");
960 return ERROR_FAIL;
963 /* get flash size from target. */
964 retval = target_read_u16(target, flash_size_reg, &flash_size_in_kb);
966 /* failed reading flash size or flash size invalid (early silicon),
967 * default to max target family */
968 if (retval != ERROR_OK || flash_size_in_kb == 0xffff || flash_size_in_kb == 0) {
969 LOG_WARNING("STM32 flash size failed, probe inaccurate - assuming %dk flash",
970 max_flash_size_in_kb);
971 flash_size_in_kb = max_flash_size_in_kb;
974 /* if the user sets the size manually then ignore the probed value
975 * this allows us to work around devices that have a invalid flash size register value */
976 if (stm32x_info->user_bank_size) {
977 LOG_INFO("ignoring flash probed value, using configured bank size");
978 flash_size_in_kb = stm32x_info->user_bank_size / 1024;
981 LOG_INFO("flash size = %dkbytes", flash_size_in_kb);
983 /* did we assign flash size? */
984 assert(flash_size_in_kb != 0xffff);
986 /* F42x/43x/469/479 1024 kiByte devices have a dual bank option */
987 if ((device_id == 0x419) || (device_id == 0x434)) {
988 uint32_t optiondata;
989 retval = target_read_u32(target, STM32_FLASH_OPTCR, &optiondata);
990 if (retval != ERROR_OK) {
991 LOG_DEBUG("unable to read option bytes");
992 return retval;
994 if ((flash_size_in_kb > 1024) || (optiondata & OPTCR_DB1M)) {
995 stm32x_info->has_large_mem = true;
996 LOG_INFO("Dual Bank %d kiB STM32F42x/43x/469/479 found", flash_size_in_kb);
997 } else {
998 stm32x_info->has_large_mem = false;
999 LOG_INFO("Single Bank %d kiB STM32F42x/43x/469/479 found", flash_size_in_kb);
1003 /* F76x/77x devices have a dual bank option */
1004 if (device_id == 0x451) {
1005 uint32_t optiondata;
1006 retval = target_read_u32(target, STM32_FLASH_OPTCR, &optiondata);
1007 if (retval != ERROR_OK) {
1008 LOG_DEBUG("unable to read option bytes");
1009 return retval;
1011 if (optiondata & OPTCR_NDBANK) {
1012 stm32x_info->has_large_mem = false;
1013 LOG_INFO("Single Bank %d kiB STM32F76x/77x found", flash_size_in_kb);
1014 } else {
1015 stm32x_info->has_large_mem = true;
1016 max_sector_size_in_kb >>= 1; /* sector size divided by 2 in dual-bank mode */
1017 LOG_INFO("Dual Bank %d kiB STM32F76x/77x found", flash_size_in_kb);
1021 /* calculate numbers of pages */
1022 int num_pages = flash_size_in_kb / max_sector_size_in_kb
1023 + (stm32x_info->has_large_mem ? 8 : 4);
1025 bank->base = base_address;
1026 bank->num_sectors = num_pages;
1027 bank->sectors = malloc(sizeof(struct flash_sector) * num_pages);
1028 for (i = 0; i < num_pages; i++) {
1029 bank->sectors[i].is_erased = -1;
1030 bank->sectors[i].is_protected = 0;
1032 bank->size = 0;
1033 LOG_DEBUG("allocated %d sectors", num_pages);
1035 /* F76x/77x in dual bank mode */
1036 if ((device_id == 0x451) && stm32x_info->has_large_mem)
1037 num_prot_blocks = num_pages >> 1;
1039 if (num_prot_blocks) {
1040 bank->prot_blocks = malloc(sizeof(struct flash_sector) * num_prot_blocks);
1041 for (i = 0; i < num_prot_blocks; i++)
1042 bank->prot_blocks[i].is_protected = 0;
1043 LOG_DEBUG("allocated %d prot blocks", num_prot_blocks);
1046 if (stm32x_info->has_large_mem) {
1047 /* dual-bank */
1048 setup_bank(bank, 0, flash_size_in_kb >> 1, max_sector_size_in_kb);
1049 setup_bank(bank, num_pages >> 1, flash_size_in_kb >> 1,
1050 max_sector_size_in_kb);
1052 /* F767x/F77x in dual mode, one protection bit refers to two adjacent sectors */
1053 if (device_id == 0x451) {
1054 for (i = 0; i < num_prot_blocks; i++) {
1055 bank->prot_blocks[i].offset = bank->sectors[i << 1].offset;
1056 bank->prot_blocks[i].size = bank->sectors[i << 1].size
1057 + bank->sectors[(i << 1) + 1].size;
1060 } else {
1061 /* single-bank */
1062 setup_bank(bank, 0, flash_size_in_kb, max_sector_size_in_kb);
1064 /* F413/F423, sectors 14 and 15 share one common protection bit */
1065 if (device_id == 0x463) {
1066 for (i = 0; i < num_prot_blocks; i++) {
1067 bank->prot_blocks[i].offset = bank->sectors[i].offset;
1068 bank->prot_blocks[i].size = bank->sectors[i].size;
1070 bank->prot_blocks[num_prot_blocks - 1].size <<= 1;
1073 bank->num_prot_blocks = num_prot_blocks;
1074 assert((bank->size >> 10) == flash_size_in_kb);
1076 stm32x_info->probed = 1;
1077 return ERROR_OK;
1080 static int stm32x_auto_probe(struct flash_bank *bank)
1082 struct stm32x_flash_bank *stm32x_info = bank->driver_priv;
1083 if (stm32x_info->probed)
1084 return ERROR_OK;
1085 return stm32x_probe(bank);
1088 static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size)
1090 uint32_t dbgmcu_idcode;
1092 /* read stm32 device id register */
1093 int retval = stm32x_get_device_id(bank, &dbgmcu_idcode);
1094 if (retval != ERROR_OK)
1095 return retval;
1097 uint16_t device_id = dbgmcu_idcode & 0xfff;
1098 uint16_t rev_id = dbgmcu_idcode >> 16;
1099 const char *device_str;
1100 const char *rev_str = NULL;
1102 switch (device_id) {
1103 case 0x411:
1104 device_str = "STM32F2xx";
1106 switch (rev_id) {
1107 case 0x1000:
1108 rev_str = "A";
1109 break;
1111 case 0x2000:
1112 rev_str = "B";
1113 break;
1115 case 0x1001:
1116 rev_str = "Z";
1117 break;
1119 case 0x2001:
1120 rev_str = "Y";
1121 break;
1123 case 0x2003:
1124 rev_str = "X";
1125 break;
1127 case 0x2007:
1128 rev_str = "1";
1129 break;
1131 case 0x200F:
1132 rev_str = "V";
1133 break;
1135 case 0x201F:
1136 rev_str = "2";
1137 break;
1139 break;
1141 case 0x413:
1142 case 0x419:
1143 case 0x434:
1144 device_str = "STM32F4xx";
1146 switch (rev_id) {
1147 case 0x1000:
1148 rev_str = "A";
1149 break;
1151 case 0x1001:
1152 rev_str = "Z";
1153 break;
1155 case 0x1003:
1156 rev_str = "Y";
1157 break;
1159 case 0x1007:
1160 rev_str = "1";
1161 break;
1163 case 0x2001:
1164 rev_str = "3";
1165 break;
1167 break;
1169 case 0x421:
1170 device_str = "STM32F446";
1172 switch (rev_id) {
1173 case 0x1000:
1174 rev_str = "A";
1175 break;
1177 break;
1179 case 0x423:
1180 case 0x431:
1181 case 0x433:
1182 case 0x458:
1183 case 0x441:
1184 device_str = "STM32F4xx (Low Power)";
1186 switch (rev_id) {
1187 case 0x1000:
1188 rev_str = "A";
1189 break;
1191 case 0x1001:
1192 rev_str = "Z";
1193 break;
1195 case 0x2000:
1196 rev_str = "B";
1197 break;
1199 case 0x3000:
1200 rev_str = "C";
1201 break;
1203 break;
1205 case 0x449:
1206 device_str = "STM32F7[4|5]x";
1208 switch (rev_id) {
1209 case 0x1000:
1210 rev_str = "A";
1211 break;
1213 case 0x1001:
1214 rev_str = "Z";
1215 break;
1217 break;
1219 case 0x451:
1220 device_str = "STM32F7[6|7]x";
1222 switch (rev_id) {
1223 case 0x1000:
1224 rev_str = "A";
1225 break;
1227 break;
1229 case 0x452:
1230 device_str = "STM32F7[2|3]x";
1232 switch (rev_id) {
1233 case 0x1000:
1234 rev_str = "A";
1235 break;
1237 break;
1239 case 0x463:
1240 device_str = "STM32F4[1|2]3";
1242 switch (rev_id) {
1243 case 0x1000:
1244 rev_str = "A";
1245 break;
1247 break;
1249 default:
1250 snprintf(buf, buf_size, "Cannot identify target as a STM32F2/4/7\n");
1251 return ERROR_FAIL;
1254 if (rev_str != NULL)
1255 snprintf(buf, buf_size, "%s - Rev: %s", device_str, rev_str);
1256 else
1257 snprintf(buf, buf_size, "%s - Rev: unknown (0x%04x)", device_str, rev_id);
1259 return ERROR_OK;
1262 COMMAND_HANDLER(stm32x_handle_lock_command)
1264 struct target *target = NULL;
1265 struct stm32x_flash_bank *stm32x_info = NULL;
1267 if (CMD_ARGC < 1)
1268 return ERROR_COMMAND_SYNTAX_ERROR;
1270 struct flash_bank *bank;
1271 int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
1272 if (ERROR_OK != retval)
1273 return retval;
1275 stm32x_info = bank->driver_priv;
1276 target = bank->target;
1278 if (target->state != TARGET_HALTED) {
1279 LOG_INFO("Target not halted");
1280 /* return ERROR_TARGET_NOT_HALTED; */
1283 if (stm32x_read_options(bank) != ERROR_OK) {
1284 command_print(CMD_CTX, "%s failed to read options", bank->driver->name);
1285 return ERROR_OK;
1288 /* set readout protection */
1289 stm32x_info->option_bytes.RDP = 0;
1291 if (stm32x_write_options(bank) != ERROR_OK) {
1292 command_print(CMD_CTX, "%s failed to lock device", bank->driver->name);
1293 return ERROR_OK;
1296 command_print(CMD_CTX, "%s locked", bank->driver->name);
1298 return ERROR_OK;
1301 COMMAND_HANDLER(stm32x_handle_unlock_command)
1303 struct target *target = NULL;
1304 struct stm32x_flash_bank *stm32x_info = NULL;
1306 if (CMD_ARGC < 1)
1307 return ERROR_COMMAND_SYNTAX_ERROR;
1309 struct flash_bank *bank;
1310 int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
1311 if (ERROR_OK != retval)
1312 return retval;
1314 stm32x_info = bank->driver_priv;
1315 target = bank->target;
1317 if (target->state != TARGET_HALTED) {
1318 LOG_INFO("Target not halted");
1319 /* return ERROR_TARGET_NOT_HALTED; */
1322 if (stm32x_read_options(bank) != ERROR_OK) {
1323 command_print(CMD_CTX, "%s failed to read options", bank->driver->name);
1324 return ERROR_OK;
1327 /* clear readout protection and complementary option bytes
1328 * this will also force a device unlock if set */
1329 stm32x_info->option_bytes.RDP = 0xAA;
1330 if (stm32x_info->has_optcr2_pcrop) {
1331 stm32x_info->option_bytes.optcr2_pcrop = OPTCR2_PCROP_RDP | (~1U << bank->num_sectors);
1334 if (stm32x_write_options(bank) != ERROR_OK) {
1335 command_print(CMD_CTX, "%s failed to unlock device", bank->driver->name);
1336 return ERROR_OK;
1339 command_print(CMD_CTX, "%s unlocked.\n"
1340 "INFO: a reset or power cycle is required "
1341 "for the new settings to take effect.", bank->driver->name);
1343 return ERROR_OK;
1346 static int stm32x_mass_erase(struct flash_bank *bank)
1348 int retval;
1349 uint32_t flash_mer;
1350 struct target *target = bank->target;
1351 struct stm32x_flash_bank *stm32x_info = NULL;
1353 if (target->state != TARGET_HALTED) {
1354 LOG_ERROR("Target not halted");
1355 return ERROR_TARGET_NOT_HALTED;
1358 stm32x_info = bank->driver_priv;
1360 retval = stm32x_unlock_reg(target);
1361 if (retval != ERROR_OK)
1362 return retval;
1364 /* mass erase flash memory */
1365 if (stm32x_info->has_large_mem)
1366 flash_mer = FLASH_MER | FLASH_MER1;
1367 else
1368 flash_mer = FLASH_MER;
1370 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_CR), flash_mer);
1371 if (retval != ERROR_OK)
1372 return retval;
1373 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_CR),
1374 flash_mer | FLASH_STRT);
1375 if (retval != ERROR_OK)
1376 return retval;
1378 retval = stm32x_wait_status_busy(bank, FLASH_MASS_ERASE_TIMEOUT);
1379 if (retval != ERROR_OK)
1380 return retval;
1382 retval = target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_CR), FLASH_LOCK);
1383 if (retval != ERROR_OK)
1384 return retval;
1386 return ERROR_OK;
1389 COMMAND_HANDLER(stm32x_handle_mass_erase_command)
1391 int i;
1393 if (CMD_ARGC < 1) {
1394 command_print(CMD_CTX, "stm32x mass_erase <bank>");
1395 return ERROR_COMMAND_SYNTAX_ERROR;
1398 struct flash_bank *bank;
1399 int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
1400 if (ERROR_OK != retval)
1401 return retval;
1403 retval = stm32x_mass_erase(bank);
1404 if (retval == ERROR_OK) {
1405 /* set all sectors as erased */
1406 for (i = 0; i < bank->num_sectors; i++)
1407 bank->sectors[i].is_erased = 1;
1409 command_print(CMD_CTX, "stm32x mass erase complete");
1410 } else {
1411 command_print(CMD_CTX, "stm32x mass erase failed");
1414 return retval;
1417 COMMAND_HANDLER(stm32f2x_handle_options_read_command)
1419 int retval;
1420 struct flash_bank *bank;
1421 struct stm32x_flash_bank *stm32x_info = NULL;
1423 if (CMD_ARGC != 1) {
1424 command_print(CMD_CTX, "stm32f2x options_read <bank>");
1425 return ERROR_COMMAND_SYNTAX_ERROR;
1428 retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
1429 if (ERROR_OK != retval)
1430 return retval;
1432 retval = stm32x_read_options(bank);
1433 if (ERROR_OK != retval)
1434 return retval;
1436 stm32x_info = bank->driver_priv;
1437 if (stm32x_info->has_extra_options) {
1438 if (stm32x_info->has_boot_addr) {
1439 uint32_t boot_addr = stm32x_info->option_bytes.boot_addr;
1441 command_print(CMD_CTX, "stm32f2x user_options 0x%03X,"
1442 " boot_add0 0x%04X, boot_add1 0x%04X",
1443 stm32x_info->option_bytes.user_options,
1444 boot_addr & 0xffff, (boot_addr & 0xffff0000) >> 16);
1445 if (stm32x_info->has_optcr2_pcrop) {
1446 command_print(CMD_CTX, "stm32f2x optcr2_pcrop 0x%08X",
1447 stm32x_info->option_bytes.optcr2_pcrop);
1449 } else {
1450 command_print(CMD_CTX, "stm32f2x user_options 0x%03X",
1451 stm32x_info->option_bytes.user_options);
1453 } else {
1454 command_print(CMD_CTX, "stm32f2x user_options 0x%02X",
1455 stm32x_info->option_bytes.user_options);
1459 return retval;
1462 COMMAND_HANDLER(stm32f2x_handle_options_write_command)
1464 int retval;
1465 struct flash_bank *bank;
1466 struct stm32x_flash_bank *stm32x_info = NULL;
1467 uint16_t user_options, boot_addr0, boot_addr1, options_mask;
1469 if (CMD_ARGC < 1) {
1470 command_print(CMD_CTX, "stm32f2x options_write <bank> ...");
1471 return ERROR_COMMAND_SYNTAX_ERROR;
1474 retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
1475 if (ERROR_OK != retval)
1476 return retval;
1478 retval = stm32x_read_options(bank);
1479 if (ERROR_OK != retval)
1480 return retval;
1482 stm32x_info = bank->driver_priv;
1483 if (stm32x_info->has_boot_addr) {
1484 if (CMD_ARGC != 4) {
1485 command_print(CMD_CTX, "stm32f2x options_write <bank> <user_options>"
1486 " <boot_addr0> <boot_addr1>");
1487 return ERROR_COMMAND_SYNTAX_ERROR;
1489 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[2], boot_addr0);
1490 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[3], boot_addr1);
1491 stm32x_info->option_bytes.boot_addr = boot_addr0 | (((uint32_t) boot_addr1) << 16);
1492 } else {
1493 if (CMD_ARGC != 2) {
1494 command_print(CMD_CTX, "stm32f2x options_write <bank> <user_options>");
1495 return ERROR_COMMAND_SYNTAX_ERROR;
1499 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[1], user_options);
1500 options_mask = !stm32x_info->has_extra_options ? ~0xfc :
1501 ~(((0xf00 << (stm32x_info->protection_bits - 12)) | 0xff) & 0xffc);
1502 if (user_options & options_mask) {
1503 command_print(CMD_CTX, "stm32f2x invalid user_options");
1504 return ERROR_COMMAND_ARGUMENT_INVALID;
1507 stm32x_info->option_bytes.user_options = user_options;
1509 if (stm32x_write_options(bank) != ERROR_OK) {
1510 command_print(CMD_CTX, "stm32f2x failed to write options");
1511 return ERROR_OK;
1514 /* switching between single- and dual-bank modes requires re-probe */
1515 /* ... and reprogramming of whole flash */
1516 stm32x_info->probed = 0;
1518 command_print(CMD_CTX, "stm32f2x write options complete.\n"
1519 "INFO: a reset or power cycle is required "
1520 "for the new settings to take effect.");
1521 return retval;
1524 COMMAND_HANDLER(stm32f2x_handle_optcr2_write_command)
1526 int retval;
1527 struct flash_bank *bank;
1528 struct stm32x_flash_bank *stm32x_info = NULL;
1529 uint32_t optcr2_pcrop;
1531 if (CMD_ARGC != 2) {
1532 command_print(CMD_CTX, "stm32f2x optcr2_write <bank> <optcr2_value>");
1533 return ERROR_COMMAND_SYNTAX_ERROR;
1536 retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
1537 if (ERROR_OK != retval)
1538 return retval;
1540 stm32x_info = bank->driver_priv;
1541 if (!stm32x_info->has_optcr2_pcrop) {
1542 command_print(CMD_CTX, "no optcr2 register");
1543 return ERROR_COMMAND_ARGUMENT_INVALID;
1546 command_print(CMD_CTX, "INFO: To disable PCROP, set PCROP_RDP"
1547 " with PCROPi bits STILL SET, then\nlock device and"
1548 " finally unlock it. Clears PCROP and mass erases flash.");
1550 retval = stm32x_read_options(bank);
1551 if (ERROR_OK != retval)
1552 return retval;
1554 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], optcr2_pcrop);
1555 stm32x_info->option_bytes.optcr2_pcrop = optcr2_pcrop;
1557 if (stm32x_write_options(bank) != ERROR_OK) {
1558 command_print(CMD_CTX, "stm32f2x failed to write options");
1559 return ERROR_OK;
1562 command_print(CMD_CTX, "stm32f2x optcr2_write complete.");
1563 return retval;
1566 static const struct command_registration stm32x_exec_command_handlers[] = {
1568 .name = "lock",
1569 .handler = stm32x_handle_lock_command,
1570 .mode = COMMAND_EXEC,
1571 .usage = "bank_id",
1572 .help = "Lock entire flash device.",
1575 .name = "unlock",
1576 .handler = stm32x_handle_unlock_command,
1577 .mode = COMMAND_EXEC,
1578 .usage = "bank_id",
1579 .help = "Unlock entire protected flash device.",
1582 .name = "mass_erase",
1583 .handler = stm32x_handle_mass_erase_command,
1584 .mode = COMMAND_EXEC,
1585 .usage = "bank_id",
1586 .help = "Erase entire flash device.",
1589 .name = "options_read",
1590 .handler = stm32f2x_handle_options_read_command,
1591 .mode = COMMAND_EXEC,
1592 .usage = "bank_id",
1593 .help = "Read and display device option bytes.",
1596 .name = "options_write",
1597 .handler = stm32f2x_handle_options_write_command,
1598 .mode = COMMAND_EXEC,
1599 .usage = "bank_id user_options [ boot_add0 boot_add1 ]",
1600 .help = "Write option bytes",
1603 .name = "optcr2_write",
1604 .handler = stm32f2x_handle_optcr2_write_command,
1605 .mode = COMMAND_EXEC,
1606 .usage = "bank_id optcr2",
1607 .help = "Write optcr2 word",
1610 COMMAND_REGISTRATION_DONE
1613 static const struct command_registration stm32x_command_handlers[] = {
1615 .name = "stm32f2x",
1616 .mode = COMMAND_ANY,
1617 .help = "stm32f2x flash command group",
1618 .usage = "",
1619 .chain = stm32x_exec_command_handlers,
1621 COMMAND_REGISTRATION_DONE
1624 struct flash_driver stm32f2x_flash = {
1625 .name = "stm32f2x",
1626 .commands = stm32x_command_handlers,
1627 .flash_bank_command = stm32x_flash_bank_command,
1628 .erase = stm32x_erase,
1629 .protect = stm32x_protect,
1630 .write = stm32x_write,
1631 .read = default_flash_read,
1632 .probe = stm32x_probe,
1633 .auto_probe = stm32x_auto_probe,
1634 .erase_check = default_flash_blank_check,
1635 .protect_check = stm32x_protect_check,
1636 .info = get_stm32x_info,
1637 .free_driver_priv = default_flash_free_driver_priv,