stm32l4: Handle failing flash_size read like on other devices.
[fw/openocd] / src / flash / nor / stm32l4x.c
1 /***************************************************************************
2  *   Copyright (C) 2015 by Uwe Bonnes                                      *
3  *   bon@elektron.ikp.physik.tu-darmstadt.de                               *
4  *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation; either version 2 of the License, or     *
8  *   (at your option) any later version.                                   *
9  *                                                                         *
10  *   This program is distributed in the hope that it will be useful,       *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU General Public License     *
16  *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
17  ***************************************************************************/
18
19 #ifdef HAVE_CONFIG_H
20 #include "config.h"
21 #endif
22
23 #include "imp.h"
24 #include <helper/binarybuffer.h>
25 #include <target/algorithm.h>
26 #include <target/armv7m.h>
27
28 /* STM32L4xxx series for reference.
29  *
30  * RM0351
31  * http://www.st.com/st-web-ui/static/active/en/resource/technical/document/reference_manual/DM00083560.pdf
32  *
33  * STM32L476RG Datasheet (for erase timing)
34  * http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/DM00108832.pdf
35  *
36  *
37  * The device has normally two banks, but on 512 and 256 kiB devices an
38  * option byte is available to map all sectors to the first bank.
39  * Both STM32 banks are treated as one OpenOCD bank, as other STM32 devices
40  * handlers do!
41  *
42  */
43
44 /* Erase time can be as high as 25ms, 10x this and assume it's toast... */
45
46 #define FLASH_ERASE_TIMEOUT 250
47
48 #define STM32_FLASH_BASE    0x40022000
49 #define STM32_FLASH_ACR     0x40022000
50 #define STM32_FLASH_KEYR    0x40022008
51 #define STM32_FLASH_OPTKEYR 0x4002200c
52 #define STM32_FLASH_SR      0x40022010
53 #define STM32_FLASH_CR      0x40022014
54 #define STM32_FLASH_OPTR    0x40022020
55 #define STM32_FLASH_WRP1AR  0x4002202c
56 #define STM32_FLASH_WRP2AR  0x40022030
57 #define STM32_FLASH_WRP1BR  0x4002204c
58 #define STM32_FLASH_WRP2BR  0x40022050
59
60 /* FLASH_CR register bits */
61
62 #define FLASH_PG       (1 << 0)
63 #define FLASH_PER      (1 << 1)
64 #define FLASH_MER1     (1 << 2)
65 #define FLASH_PAGE_SHIFT     3
66 #define FLASH_CR_BKER  (1 << 11)
67 #define FLASH_MER2     (1 << 15)
68 #define FLASH_STRT     (1 << 16)
69 #define FLASH_EOPIE    (1 << 24)
70 #define FLASH_ERRIE    (1 << 25)
71 #define FLASH_OPTLOCK  (1 << 30)
72 #define FLASH_LOCK     (1 << 31)
73
74 /* FLASH_SR register bits */
75
76 #define FLASH_BSY      (1 << 16)
77 /* Fast programming not used => related errors not used*/
78 #define FLASH_PGSERR   (1 << 7) /* Programming sequence error */
79 #define FLASH_SIZERR   (1 << 6) /* Size  error */
80 #define FLASH_PGAERR   (1 << 5) /* Programming alignment error */
81 #define FLASH_WRPERR   (1 << 4) /* Write protection error */
82 #define FLASH_PROGERR  (1 << 3) /* Programming error */
83 #define FLASH_OPERR    (1 << 1) /* Operation error */
84 #define FLASH_EOP      (1 << 0) /* End of operation */
85
86 #define FLASH_ERROR (FLASH_PGSERR | FLASH_PGSERR | FLASH_PGAERR | FLASH_WRPERR | FLASH_OPERR)
87
88 /* STM32_FLASH_OBR bit definitions (reading) */
89
90 #define OPT_DUALBANK   21       /* dual flash bank only */
91
92 /* register unlock keys */
93
94 #define KEY1           0x45670123
95 #define KEY2           0xCDEF89AB
96
97 /* option register unlock key */
98 #define OPTKEY1        0x08192A3B
99 #define OPTKEY2        0x4C5D6E7F
100
101
102 /* other registers */
103 #define DBGMCU_IDCODE   0xE0042000
104 #define FLASH_SIZE_REG  0x1FFF75E0
105
106 struct stm32l4_options {
107         uint8_t RDP;
108         uint16_t bank_b_start;
109         uint8_t user_options;
110         uint8_t wpr1a_start;
111         uint8_t wpr1a_end;
112         uint8_t wpr1b_start;
113         uint8_t wpr1b_end;
114         uint8_t wpr2a_start;
115         uint8_t wpr2a_end;
116         uint8_t wpr2b_start;
117         uint8_t wpr2b_end;
118     /* Fixme: Handle PCROP */
119 };
120
121 struct stm32l4_flash_bank {
122         struct stm32l4_options option_bytes;
123         int probed;
124 };
125
126 /* flash bank stm32l4x <base> <size> 0 0 <target#>
127  */
128 FLASH_BANK_COMMAND_HANDLER(stm32l4_flash_bank_command)
129 {
130         struct stm32l4_flash_bank *stm32l4_info;
131
132         if (CMD_ARGC < 6)
133                 return ERROR_COMMAND_SYNTAX_ERROR;
134
135         stm32l4_info = malloc(sizeof(struct stm32l4_flash_bank));
136         if (!stm32l4_info)
137                 return ERROR_FAIL; /* Checkme: What better error to use?*/
138         bank->driver_priv = stm32l4_info;
139
140         stm32l4_info->probed = 0;
141
142         return ERROR_OK;
143 }
144
145 static inline int stm32l4_get_flash_reg(struct flash_bank *bank, uint32_t reg)
146 {
147         return reg;
148 }
149
150 static inline int stm32l4_get_flash_status(struct flash_bank *bank, uint32_t *status)
151 {
152         struct target *target = bank->target;
153         return target_read_u32(
154                 target, stm32l4_get_flash_reg(bank, STM32_FLASH_SR), status);
155 }
156
157 static int stm32l4_wait_status_busy(struct flash_bank *bank, int timeout)
158 {
159         struct target *target = bank->target;
160         uint32_t status;
161         int retval = ERROR_OK;
162
163         /* wait for busy to clear */
164         for (;;) {
165                 retval = stm32l4_get_flash_status(bank, &status);
166                 if (retval != ERROR_OK)
167                         return retval;
168                 LOG_DEBUG("status: 0x%" PRIx32 "", status);
169                 if ((status & FLASH_BSY) == 0)
170                         break;
171                 if (timeout-- <= 0) {
172                         LOG_ERROR("timed out waiting for flash");
173                         return ERROR_FAIL;
174                 }
175                 alive_sleep(1);
176         }
177
178
179         if (status & FLASH_WRPERR) {
180                 LOG_ERROR("stm32x device protected");
181                 retval = ERROR_FAIL;
182         }
183
184         /* Clear but report errors */
185         if (status & FLASH_ERROR) {
186                 /* If this operation fails, we ignore it and report the original
187                  * retval
188                  */
189                 target_write_u32(target, stm32l4_get_flash_reg(bank, STM32_FLASH_SR),
190                                 status & FLASH_ERROR);
191         }
192         return retval;
193 }
194
195 static int stm32l4_unlock_reg(struct target *target)
196 {
197         uint32_t ctrl;
198
199         /* first check if not already unlocked
200          * otherwise writing on STM32_FLASH_KEYR will fail
201          */
202         int retval = target_read_u32(target, STM32_FLASH_CR, &ctrl);
203         if (retval != ERROR_OK)
204                 return retval;
205
206         if ((ctrl & FLASH_LOCK) == 0)
207                 return ERROR_OK;
208
209         /* unlock flash registers */
210         retval = target_write_u32(target, STM32_FLASH_KEYR, KEY1);
211         if (retval != ERROR_OK)
212                 return retval;
213
214         retval = target_write_u32(target, STM32_FLASH_KEYR, KEY2);
215         if (retval != ERROR_OK)
216                 return retval;
217
218         retval = target_read_u32(target, STM32_FLASH_CR, &ctrl);
219         if (retval != ERROR_OK)
220                 return retval;
221
222         if (ctrl & FLASH_LOCK) {
223                 LOG_ERROR("flash not unlocked STM32_FLASH_CR: %" PRIx32, ctrl);
224                 return ERROR_TARGET_FAILURE;
225         }
226
227         return ERROR_OK;
228 }
229
230 static int stm32l4_unlock_option_reg(struct target *target)
231 {
232         uint32_t ctrl;
233
234         int retval = target_read_u32(target, STM32_FLASH_CR, &ctrl);
235         if (retval != ERROR_OK)
236                 return retval;
237
238         if ((ctrl & FLASH_OPTLOCK) == 0)
239                 return ERROR_OK;
240
241         /* unlock option registers */
242         retval = target_write_u32(target, STM32_FLASH_OPTKEYR, OPTKEY1);
243         if (retval != ERROR_OK)
244                 return retval;
245
246         retval = target_write_u32(target, STM32_FLASH_OPTKEYR, OPTKEY2);
247         if (retval != ERROR_OK)
248                 return retval;
249
250         retval = target_read_u32(target, STM32_FLASH_CR, &ctrl);
251         if (retval != ERROR_OK)
252                 return retval;
253
254         if (ctrl & FLASH_OPTLOCK) {
255                 LOG_ERROR("options not unlocked STM32_FLASH_CR: %" PRIx32, ctrl);
256                 return ERROR_TARGET_FAILURE;
257         }
258
259         return ERROR_OK;
260 }
261
262 static int stm32l4_read_options(struct flash_bank *bank)
263 {
264         uint32_t optiondata;
265         struct stm32l4_flash_bank *stm32l4_info = NULL;
266         struct target *target = bank->target;
267
268         stm32l4_info = bank->driver_priv;
269
270         /* read current option bytes */
271         int retval = target_read_u32(target, STM32_FLASH_OPTR, &optiondata);
272         if (retval != ERROR_OK)
273                 return retval;
274
275         stm32l4_info->option_bytes.user_options = (optiondata >> 8) & 0x3ffff;
276         stm32l4_info->option_bytes.RDP = optiondata & 0xff;
277
278         retval = target_read_u32(target, STM32_FLASH_WRP1AR, &optiondata);
279         if (retval != ERROR_OK)
280                 return retval;
281         stm32l4_info->option_bytes.wpr1a_start =  optiondata         & 0xff;
282         stm32l4_info->option_bytes.wpr1a_end   = (optiondata >> 16)  & 0xff;
283
284         retval = target_read_u32(target, STM32_FLASH_WRP2AR, &optiondata);
285         if (retval != ERROR_OK)
286                 return retval;
287         stm32l4_info->option_bytes.wpr2a_start =  optiondata         & 0xff;
288         stm32l4_info->option_bytes.wpr2a_end   = (optiondata >> 16)  & 0xff;
289
290         retval = target_read_u32(target, STM32_FLASH_WRP1BR, &optiondata);
291         if (retval != ERROR_OK)
292                 return retval;
293         stm32l4_info->option_bytes.wpr1b_start =  optiondata         & 0xff;
294         stm32l4_info->option_bytes.wpr1b_end   = (optiondata >> 16)  & 0xff;
295
296         retval = target_read_u32(target, STM32_FLASH_WRP2BR, &optiondata);
297         if (retval != ERROR_OK)
298                 return retval;
299         stm32l4_info->option_bytes.wpr2b_start =  optiondata         & 0xff;
300         stm32l4_info->option_bytes.wpr2b_end   = (optiondata >> 16)  & 0xff;
301
302         if (stm32l4_info->option_bytes.RDP != 0xAA)
303                 LOG_INFO("Device Security Bit Set");
304
305         return ERROR_OK;
306 }
307
308 static int stm32l4_write_options(struct flash_bank *bank)
309 {
310         struct stm32l4_flash_bank *stm32l4_info = NULL;
311         struct target *target = bank->target;
312         uint32_t optiondata;
313
314         stm32l4_info = bank->driver_priv;
315
316         (void) optiondata;
317         (void) stm32l4_info;
318
319         int retval = stm32l4_unlock_option_reg(target);
320         if (retval != ERROR_OK)
321                 return retval;
322         /* FIXME: Implement Option writing!*/
323         return ERROR_OK;
324 }
325
326 static int stm32l4_protect_check(struct flash_bank *bank)
327 {
328         struct stm32l4_flash_bank *stm32l4_info = bank->driver_priv;
329
330         /* read write protection settings */
331         int retval = stm32l4_read_options(bank);
332         if (retval != ERROR_OK) {
333                 LOG_DEBUG("unable to read option bytes");
334                 return retval;
335         }
336
337         for (int i = 0; i < bank->num_sectors; i++) {
338                 if (i < stm32l4_info->option_bytes.bank_b_start) {
339                         if (((i >= stm32l4_info->option_bytes.wpr1a_start) &&
340                                  (i <= stm32l4_info->option_bytes.wpr1a_end)) ||
341                                 ((i >= stm32l4_info->option_bytes.wpr2a_start) &&
342                                  (i <= stm32l4_info->option_bytes.wpr2a_end)))
343                                 bank->sectors[i].is_protected = 1;
344                         else
345                                 bank->sectors[i].is_protected = 0;
346                 } else {
347                         uint8_t snb;
348                         snb = i - stm32l4_info->option_bytes.bank_b_start + 256;
349                         if (((snb >= stm32l4_info->option_bytes.wpr1b_start) &&
350                                  (snb <= stm32l4_info->option_bytes.wpr1b_end)) ||
351                                 ((snb >= stm32l4_info->option_bytes.wpr2b_start) &&
352                                  (snb <= stm32l4_info->option_bytes.wpr2b_end)))
353                                 bank->sectors[i].is_protected = 1;
354                         else
355                                 bank->sectors[i].is_protected = 0;
356                 }
357         }
358         return ERROR_OK;
359 }
360
361 static int stm32l4_erase(struct flash_bank *bank, int first, int last)
362 {
363         struct target *target = bank->target;
364         int i;
365
366         assert(first < bank->num_sectors);
367         assert(last < bank->num_sectors);
368
369         if (bank->target->state != TARGET_HALTED) {
370                 LOG_ERROR("Target not halted");
371                 return ERROR_TARGET_NOT_HALTED;
372         }
373
374         int retval;
375         retval = stm32l4_unlock_reg(target);
376         if (retval != ERROR_OK)
377                 return retval;
378
379         /*
380         Sector Erase
381         To erase a sector, follow the procedure below:
382         1. Check that no Flash memory operation is ongoing by
383        checking the BSY bit in the FLASH_SR register
384         2. Set the PER bit and select the page and bank
385            you wish to erase  in the FLASH_CR register
386         3. Set the STRT bit in the FLASH_CR register
387         4. Wait for the BSY bit to be cleared
388          */
389         struct stm32l4_flash_bank *stm32l4_info = bank->driver_priv;
390
391         for (i = first; i <= last; i++) {
392                 uint32_t erase_flags;
393                 erase_flags = FLASH_PER | FLASH_STRT;
394
395                 if  (i >= stm32l4_info->option_bytes.bank_b_start) {
396                         uint8_t snb;
397                         snb = (i - stm32l4_info->option_bytes.bank_b_start) + 256;
398                         erase_flags |= snb << FLASH_PAGE_SHIFT | FLASH_CR_BKER;
399                 } else
400                         erase_flags |= i << FLASH_PAGE_SHIFT;
401                 retval = target_write_u32(target,
402                                 stm32l4_get_flash_reg(bank, STM32_FLASH_CR), erase_flags);
403                 if (retval != ERROR_OK)
404                         return retval;
405
406                 retval = stm32l4_wait_status_busy(bank, FLASH_ERASE_TIMEOUT);
407                 if (retval != ERROR_OK)
408                         return retval;
409
410                 bank->sectors[i].is_erased = 1;
411         }
412
413         retval = target_write_u32(
414                 target, stm32l4_get_flash_reg(bank, STM32_FLASH_CR), FLASH_LOCK);
415         if (retval != ERROR_OK)
416                 return retval;
417
418         return ERROR_OK;
419 }
420
421 static int stm32l4_protect(struct flash_bank *bank, int set, int first, int last)
422 {
423         struct target *target = bank->target;
424         struct stm32l4_flash_bank *stm32l4_info = bank->driver_priv;
425
426         if (target->state != TARGET_HALTED) {
427                 LOG_ERROR("Target not halted");
428                 return ERROR_TARGET_NOT_HALTED;
429         }
430
431         /* read protection settings */
432         int retval = stm32l4_read_options(bank);
433         if (retval != ERROR_OK) {
434                 LOG_DEBUG("unable to read option bytes");
435                 return retval;
436         }
437
438         (void)stm32l4_info;
439         /* FIXME: Write First and last in a valid WRPxx_start/end combo*/
440         retval = stm32l4_write_options(bank);
441         if (retval != ERROR_OK)
442                 return retval;
443
444         return ERROR_OK;
445 }
446
447 /* Count is in halfwords */
448 static int stm32l4_write_block(struct flash_bank *bank, const uint8_t *buffer,
449                 uint32_t offset, uint32_t count)
450 {
451         struct target *target = bank->target;
452         uint32_t buffer_size = 16384;
453         struct working_area *write_algorithm;
454         struct working_area *source;
455         uint32_t address = bank->base + offset;
456         struct reg_param reg_params[5];
457         struct armv7m_algorithm armv7m_info;
458         int retval = ERROR_OK;
459
460         /* See contrib/loaders/flash/stm32l4x.S for source and
461          * hints how to generate the data!
462          */
463
464         static const uint8_t stm32l4_flash_write_code[] = {
465                 0xd0, 0xf8, 0x00, 0x80, 0xb8, 0xf1, 0x00, 0x0f, 0x21, 0xd0, 0x45, 0x68,
466                 0xb8, 0xeb, 0x05, 0x06, 0x44, 0xbf, 0x76, 0x18, 0x36, 0x1a, 0x08, 0x2e,
467                 0xf2, 0xd3, 0xdf, 0xf8, 0x36, 0x60, 0x66, 0x61, 0xf5, 0xe8, 0x02, 0x67,
468                 0xe2, 0xe8, 0x02, 0x67, 0xbf, 0xf3, 0x4f, 0x8f, 0x26, 0x69, 0x16, 0xf4,
469                 0x80, 0x3f, 0xfb, 0xd1, 0x16, 0xf0, 0xfa, 0x0f, 0x07, 0xd1, 0x8d, 0x42,
470                 0x28, 0xbf, 0x00, 0xf1, 0x08, 0x05, 0x45, 0x60, 0x01, 0x3b, 0x13, 0xb1,
471                 0xda, 0xe7, 0x00, 0x21, 0x41, 0x60, 0x30, 0x46, 0x00, 0xbe, 0x01, 0x00,
472                 0x00, 0x00
473         };
474
475         if (target_alloc_working_area(target, sizeof(stm32l4_flash_write_code),
476                         &write_algorithm) != ERROR_OK) {
477                 LOG_WARNING("no working area available, can't do block memory writes");
478                 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
479         }
480
481         retval = target_write_buffer(target, write_algorithm->address,
482                         sizeof(stm32l4_flash_write_code),
483                         stm32l4_flash_write_code);
484         if (retval != ERROR_OK)
485                 return retval;
486
487         /* memory buffer */
488         while (target_alloc_working_area_try(target, buffer_size, &source) !=
489                    ERROR_OK) {
490                 buffer_size /= 2;
491                 if (buffer_size <= 256) {
492                         /* we already allocated the writing code, but failed to get a
493                          * buffer, free the algorithm */
494                         target_free_working_area(target, write_algorithm);
495
496                         LOG_WARNING("no large enough working area available, can't do block memory writes");
497                         return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
498                 }
499         }
500
501         armv7m_info.common_magic = ARMV7M_COMMON_MAGIC;
502         armv7m_info.core_mode = ARM_MODE_THREAD;
503
504         init_reg_param(&reg_params[0], "r0", 32, PARAM_IN_OUT); /* buffer start, status (out) */
505         init_reg_param(&reg_params[1], "r1", 32, PARAM_OUT);    /* buffer end */
506         init_reg_param(&reg_params[2], "r2", 32, PARAM_OUT);    /* target address */
507         init_reg_param(&reg_params[3], "r3", 32, PARAM_OUT);    /* count (double word-64bit) */
508         init_reg_param(&reg_params[4], "r4", 32, PARAM_OUT);    /* flash base */
509
510         buf_set_u32(reg_params[0].value, 0, 32, source->address);
511         buf_set_u32(reg_params[1].value, 0, 32, source->address + source->size);
512         buf_set_u32(reg_params[2].value, 0, 32, address);
513         buf_set_u32(reg_params[3].value, 0, 32, count / 4);
514         buf_set_u32(reg_params[4].value, 0, 32, STM32_FLASH_BASE);
515
516         retval = target_run_flash_async_algorithm(target, buffer, count, 2,
517                         0, NULL,
518                         5, reg_params,
519                         source->address, source->size,
520                         write_algorithm->address, 0,
521                         &armv7m_info);
522
523         if (retval == ERROR_FLASH_OPERATION_FAILED) {
524                 LOG_ERROR("error executing stm32l4 flash write algorithm");
525
526                 uint32_t error = buf_get_u32(reg_params[0].value, 0, 32) & FLASH_ERROR;
527
528                 if (error & FLASH_WRPERR)
529                         LOG_ERROR("flash memory write protected");
530
531                 if (error != 0) {
532                         LOG_ERROR("flash write failed = %08" PRIx32, error);
533                         /* Clear but report errors */
534                         target_write_u32(target, STM32_FLASH_SR, error);
535                         retval = ERROR_FAIL;
536                 }
537         }
538
539         target_free_working_area(target, source);
540         target_free_working_area(target, write_algorithm);
541
542         destroy_reg_param(&reg_params[0]);
543         destroy_reg_param(&reg_params[1]);
544         destroy_reg_param(&reg_params[2]);
545         destroy_reg_param(&reg_params[3]);
546         destroy_reg_param(&reg_params[4]);
547
548         return retval;
549 }
550
551 static int stm32l4_write(struct flash_bank *bank, const uint8_t *buffer,
552                 uint32_t offset, uint32_t count)
553 {
554         struct target *target = bank->target;
555         int retval;
556
557         if (bank->target->state != TARGET_HALTED) {
558                 LOG_ERROR("Target not halted");
559                 return ERROR_TARGET_NOT_HALTED;
560         }
561
562         if (offset & 0x7) {
563                 LOG_WARNING("offset 0x%" PRIx32 " breaks required 8-byte alignment",
564                                         offset);
565                 return ERROR_FLASH_DST_BREAKS_ALIGNMENT;
566         }
567
568         if (count & 0x7) {
569                 LOG_WARNING("Padding %d bytes to keep 8-byte write size",
570                                         count & 7);
571                 count = (count + 7) & ~7;
572                 /* This pads the write chunk with random bytes by overrunning the
573                  * write buffer. Padding with the erased pattern 0xff is purely
574                  * cosmetical, as 8-byte flash words are ECC secured and the first
575                  * write will program the ECC bits. A second write would need
576                  * to reprogramm these ECC bits.
577                  * But this can only be done after erase!
578                  */
579         }
580
581         retval = stm32l4_unlock_reg(target);
582         if (retval != ERROR_OK)
583                 return retval;
584
585         /* Only full double words (8-byte) can be programmed*/
586         retval = stm32l4_write_block(bank, buffer, offset, count / 2);
587         if (retval != ERROR_OK) {
588                 LOG_WARNING("block write failed");
589                 return retval;
590                 }
591
592         LOG_WARNING("block write succeeded");
593         return target_write_u32(target, STM32_FLASH_CR, FLASH_LOCK);
594 }
595
596 static int stm32l4_probe(struct flash_bank *bank)
597 {
598         struct target *target = bank->target;
599         struct stm32l4_flash_bank *stm32l4_info = bank->driver_priv;
600         int i;
601         uint16_t flash_size_in_kb = 0xffff;
602         uint16_t max_flash_size_in_kb;
603         uint32_t device_id;
604         uint32_t options;
605         uint32_t base_address = 0x08000000;
606
607         stm32l4_info->probed = 0;
608
609         /* read stm32 device id register */
610         int retval = target_read_u32(target, DBGMCU_IDCODE, &device_id);
611         if (retval != ERROR_OK)
612                 return retval;
613         LOG_INFO("device id = 0x%08" PRIx32 "", device_id);
614
615         /* set max flash size depending on family */
616         switch (device_id & 0xfff) {
617         case 0x415:
618                 max_flash_size_in_kb = 1024;
619                 break;
620         default:
621                 LOG_WARNING("Cannot identify target as a STM32L4 family.");
622                 return ERROR_FAIL;
623         }
624
625         /* get flash size from target. */
626         retval = target_read_u16(target, FLASH_SIZE_REG, &flash_size_in_kb);
627
628         /* failed reading flash size or flash size invalid (early silicon),
629          * default to max target family */
630         if (retval != ERROR_OK || flash_size_in_kb == 0xffff || flash_size_in_kb == 0) {
631                 LOG_WARNING("STM32 flash size failed, probe inaccurate - assuming %dk flash",
632                         max_flash_size_in_kb);
633                 flash_size_in_kb = max_flash_size_in_kb;
634         }
635
636         LOG_INFO("flash size = %dkbytes", flash_size_in_kb);
637
638         /* did we assign flash size? */
639         assert(flash_size_in_kb != 0xffff);
640
641         /* get options to for DUAL BANK. */
642         retval = target_read_u32(target, STM32_FLASH_OPTR, &options);
643
644         /* only devices with < 1024 kiB may be set to single bank dual banks */
645         if ((flash_size_in_kb == 1024) || !(options & OPT_DUALBANK))
646                 stm32l4_info->option_bytes.bank_b_start = 256;
647         else
648                 stm32l4_info->option_bytes.bank_b_start = flash_size_in_kb << 9;
649
650         /* did we assign flash size? */
651         assert((flash_size_in_kb != 0xffff) && flash_size_in_kb);
652
653         /* calculate numbers of pages */
654         int num_pages = flash_size_in_kb / 2;
655
656         /* check that calculation result makes sense */
657         assert(num_pages > 0);
658
659         if (bank->sectors) {
660                 free(bank->sectors);
661                 bank->sectors = NULL;
662         }
663
664         bank->base = base_address;
665         bank->size = num_pages * (1 << 11);
666         bank->num_sectors = num_pages;
667         bank->sectors = malloc(sizeof(struct flash_sector) * num_pages);
668         if (!bank->sectors)
669                 return ERROR_FAIL; /* Checkme: What better error to use?*/
670
671         for (i = 0; i < num_pages; i++) {
672                 bank->sectors[i].offset = i << 11;
673                 bank->sectors[i].size = 1 << 11;
674                 bank->sectors[i].is_erased = -1;
675                 bank->sectors[i].is_protected = 1;
676         }
677
678         stm32l4_info->probed = 1;
679
680         return ERROR_OK;
681 }
682
683 static int stm32l4_auto_probe(struct flash_bank *bank)
684 {
685         struct stm32l4_flash_bank *stm32l4_info = bank->driver_priv;
686         if (stm32l4_info->probed)
687                 return ERROR_OK;
688         return stm32l4_probe(bank);
689 }
690
691 static int get_stm32l4_info(struct flash_bank *bank, char *buf, int buf_size)
692 {
693         struct target *target = bank->target;
694         uint32_t dbgmcu_idcode;
695
696         /* read stm32 device id register */
697         int retval = target_read_u32(target, DBGMCU_IDCODE, &dbgmcu_idcode);
698         if (retval != ERROR_OK)
699                 return retval;
700
701         uint16_t device_id = dbgmcu_idcode & 0xffff;
702         uint8_t rev_id = dbgmcu_idcode >> 28;
703         uint8_t rev_minor = 0;
704         int i;
705
706         for (i = 16; i < 28; i++) {
707                 if (dbgmcu_idcode & (1 << i))
708                         rev_minor++;
709                 else
710                         break;
711         }
712
713         const char *device_str;
714
715         switch (device_id) {
716         case 0x6415:
717                 device_str = "STM32L4xx";
718                 break;
719
720         default:
721                 snprintf(buf, buf_size, "Cannot identify target as a STM32L4\n");
722                 return ERROR_FAIL;
723         }
724
725         snprintf(buf, buf_size, "%s - Rev: %1d.%02d",
726                          device_str, rev_id, rev_minor);
727
728         return ERROR_OK;
729 }
730
731 COMMAND_HANDLER(stm32l4_handle_lock_command)
732 {
733         struct target *target = NULL;
734         struct stm32l4_flash_bank *stm32l4_info = NULL;
735
736         if (CMD_ARGC < 1)
737                 return ERROR_COMMAND_SYNTAX_ERROR;
738
739         struct flash_bank *bank;
740         int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
741         if (ERROR_OK != retval)
742                 return retval;
743
744         stm32l4_info = bank->driver_priv;
745         target = bank->target;
746
747         if (target->state != TARGET_HALTED) {
748                 LOG_ERROR("Target not halted");
749                 return ERROR_TARGET_NOT_HALTED;
750         }
751
752         if (stm32l4_read_options(bank) != ERROR_OK) {
753                 command_print(CMD_CTX, "%s failed to read options",
754                                           bank->driver->name);
755                 return ERROR_OK;
756         }
757
758         /* set readout protection */
759         stm32l4_info->option_bytes.RDP = 0;
760
761         if (stm32l4_write_options(bank) != ERROR_OK) {
762                 command_print(CMD_CTX, "%s failed to lock device", bank->driver->name);
763                 return ERROR_OK;
764         }
765
766         command_print(CMD_CTX, "%s locked", bank->driver->name);
767
768         return ERROR_OK;
769 }
770
771 COMMAND_HANDLER(stm32l4_handle_unlock_command)
772 {
773         struct target *target = NULL;
774         struct stm32l4_flash_bank *stm32l4_info = NULL;
775
776         if (CMD_ARGC < 1)
777                 return ERROR_COMMAND_SYNTAX_ERROR;
778
779         struct flash_bank *bank;
780         int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
781         if (ERROR_OK != retval)
782                 return retval;
783
784         stm32l4_info = bank->driver_priv;
785         target = bank->target;
786
787         if (target->state != TARGET_HALTED) {
788                 LOG_ERROR("Target not halted");
789                 return ERROR_TARGET_NOT_HALTED;
790         }
791
792         if (stm32l4_read_options(bank) != ERROR_OK) {
793                 command_print(CMD_CTX, "%s failed to read options", bank->driver->name);
794                 return ERROR_OK;
795         }
796
797         /* clear readout protection and complementary option bytes
798          * this will also force a device unlock if set */
799         stm32l4_info->option_bytes.RDP = 0xAA;
800
801         if (stm32l4_write_options(bank) != ERROR_OK) {
802                 command_print(CMD_CTX, "%s failed to unlock device",
803                                           bank->driver->name);
804                 return ERROR_OK;
805         }
806
807         command_print(CMD_CTX, "%s unlocked.\n"
808                         "INFO: a reset or power cycle is required "
809                         "for the new settings to take effect.", bank->driver->name);
810
811         return ERROR_OK;
812 }
813
814 static int stm32l4_mass_erase(struct flash_bank *bank, uint32_t action)
815 {
816         int retval;
817         struct target *target = bank->target;
818
819         if (target->state != TARGET_HALTED) {
820                 LOG_ERROR("Target not halted");
821                 return ERROR_TARGET_NOT_HALTED;
822         }
823
824         retval = stm32l4_unlock_reg(target);
825         if (retval != ERROR_OK)
826                 return retval;
827
828         /* mass erase flash memory */
829         retval = target_write_u32(
830                 target, stm32l4_get_flash_reg(bank, STM32_FLASH_CR), action);
831         if (retval != ERROR_OK)
832                 return retval;
833         retval = target_write_u32(
834                 target, stm32l4_get_flash_reg(bank, STM32_FLASH_CR),
835                 action | FLASH_STRT);
836         if (retval != ERROR_OK)
837                 return retval;
838
839         retval = stm32l4_wait_status_busy(bank,  FLASH_ERASE_TIMEOUT);
840         if (retval != ERROR_OK)
841                 return retval;
842
843         retval = target_write_u32(
844                 target, stm32l4_get_flash_reg(bank, STM32_FLASH_CR), FLASH_LOCK);
845         if (retval != ERROR_OK)
846                 return retval;
847
848         return ERROR_OK;
849 }
850
851 COMMAND_HANDLER(stm32l4_handle_mass_erase_command)
852 {
853         int i;
854         uint32_t action;
855
856         if (CMD_ARGC < 1) {
857                 command_print(CMD_CTX, "stm32x mass_erase <STM32L4 bank>");
858                 return ERROR_COMMAND_SYNTAX_ERROR;
859         }
860
861         struct flash_bank *bank;
862         int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
863         if (ERROR_OK != retval)
864                 return retval;
865
866         action =  FLASH_MER1 |  FLASH_MER2;
867         retval = stm32l4_mass_erase(bank, action);
868         if (retval == ERROR_OK) {
869                 /* set all sectors as erased */
870                 for (i = 0; i < bank->num_sectors; i++)
871                         bank->sectors[i].is_erased = 1;
872
873                 command_print(CMD_CTX, "stm32x mass erase complete");
874         } else {
875                 command_print(CMD_CTX, "stm32x mass erase failed");
876         }
877
878         return retval;
879 }
880
881 static const struct command_registration stm32l4_exec_command_handlers[] = {
882         {
883                 .name = "lock",
884                 .handler = stm32l4_handle_lock_command,
885                 .mode = COMMAND_EXEC,
886                 .usage = "bank_id",
887                 .help = "Lock entire flash device.",
888         },
889         {
890                 .name = "unlock",
891                 .handler = stm32l4_handle_unlock_command,
892                 .mode = COMMAND_EXEC,
893                 .usage = "bank_id",
894                 .help = "Unlock entire protected flash device.",
895         },
896         {
897                 .name = "mass_erase",
898                 .handler = stm32l4_handle_mass_erase_command,
899                 .mode = COMMAND_EXEC,
900                 .usage = "bank_id",
901                 .help = "Erase entire flash device.",
902         },
903         COMMAND_REGISTRATION_DONE
904 };
905
906 static const struct command_registration stm32l4_command_handlers[] = {
907         {
908                 .name = "stm32l4x",
909                 .mode = COMMAND_ANY,
910                 .help = "stm32l4x flash command group",
911                 .usage = "",
912                 .chain = stm32l4_exec_command_handlers,
913         },
914         COMMAND_REGISTRATION_DONE
915 };
916
917 struct flash_driver stm32l4x_flash = {
918         .name = "stm32l4x",
919         .commands = stm32l4_command_handlers,
920         .flash_bank_command = stm32l4_flash_bank_command,
921         .erase = stm32l4_erase,
922         .protect = stm32l4_protect,
923         .write = stm32l4_write,
924         .read = default_flash_read,
925         .probe = stm32l4_probe,
926         .auto_probe = stm32l4_auto_probe,
927         .erase_check = default_flash_blank_check,
928         .protect_check = stm32l4_protect_check,
929         .info = get_stm32l4_info,
930 };