Merge pull request #407 from tomdeboer/STML1_Fix
[fw/stlink] / src / common.c
1 #define DEBUG_FLASH 0
2
3 #include <stdarg.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <string.h>
7
8 #include <unistd.h>
9 #include <fcntl.h>
10 #include <sys/types.h>
11 #include <sys/stat.h>
12
13 #include "stlink.h"
14 #include "stlink/mmap.h"
15 #include "stlink/logging.h"
16
17 #ifndef _WIN32
18 #define O_BINARY 0
19 #endif
20
21 /* todo: stm32l15xxx flash memory, pm0062 manual */
22
23 /* stm32f FPEC flash controller interface, pm0063 manual */
24 // TODO - all of this needs to be abstracted out....
25 // STM32F05x is identical, based on RM0091 (DM00031936, Doc ID 018940 Rev 2, August 2012)
26 #define FLASH_REGS_ADDR 0x40022000
27 #define FLASH_REGS_SIZE 0x28
28
29 #define FLASH_ACR (FLASH_REGS_ADDR + 0x00)
30 #define FLASH_KEYR (FLASH_REGS_ADDR + 0x04)
31 #define FLASH_SR (FLASH_REGS_ADDR + 0x0c)
32 #define FLASH_CR (FLASH_REGS_ADDR + 0x10)
33 #define FLASH_AR (FLASH_REGS_ADDR + 0x14)
34 #define FLASH_OBR (FLASH_REGS_ADDR + 0x1c)
35 #define FLASH_WRPR (FLASH_REGS_ADDR + 0x20)
36
37 // For STM32F05x, the RDPTR_KEY may be wrong, but as it is not used anywhere...
38 #define FLASH_RDPTR_KEY 0x00a5
39 #define FLASH_KEY1 0x45670123
40 #define FLASH_KEY2 0xcdef89ab
41
42 #define FLASH_SR_BSY 0
43 #define FLASH_SR_EOP 5
44
45 #define FLASH_CR_PG 0
46 #define FLASH_CR_PER 1
47 #define FLASH_CR_MER 2
48 #define FLASH_CR_STRT 6
49 #define FLASH_CR_LOCK 7
50
51
52 //32L = 32F1 same CoreID as 32F4!
53 #define STM32L_FLASH_REGS_ADDR ((uint32_t)0x40023c00)
54 #define STM32L_FLASH_ACR (STM32L_FLASH_REGS_ADDR + 0x00)
55 #define STM32L_FLASH_PECR (STM32L_FLASH_REGS_ADDR + 0x04)
56 #define STM32L_FLASH_PDKEYR (STM32L_FLASH_REGS_ADDR + 0x08)
57 #define STM32L_FLASH_PEKEYR (STM32L_FLASH_REGS_ADDR + 0x0c)
58 #define STM32L_FLASH_PRGKEYR (STM32L_FLASH_REGS_ADDR + 0x10)
59 #define STM32L_FLASH_OPTKEYR (STM32L_FLASH_REGS_ADDR + 0x14)
60 #define STM32L_FLASH_SR (STM32L_FLASH_REGS_ADDR + 0x18)
61 #define STM32L_FLASH_OBR (STM32L_FLASH_REGS_ADDR + 0x1c)
62 #define STM32L_FLASH_WRPR (STM32L_FLASH_REGS_ADDR + 0x20)
63 #define FLASH_L1_FPRG 10
64 #define FLASH_L1_PROG 3
65
66 //32L4 register base is at FLASH_REGS_ADDR (0x40022000)
67 #define STM32L4_FLASH_KEYR      (FLASH_REGS_ADDR + 0x08)
68 #define STM32L4_FLASH_SR        (FLASH_REGS_ADDR + 0x10)
69 #define STM32L4_FLASH_CR        (FLASH_REGS_ADDR + 0x14)
70 #define STM32L4_FLASH_OPTR      (FLASH_REGS_ADDR + 0x20)
71
72 #define STM32L4_FLASH_SR_BSY            16
73 #define STM32L4_FLASH_SR_ERRMASK        0x3f8 /* SR [9:3] */
74
75 #define STM32L4_FLASH_CR_LOCK   31      /* Lock control register */
76 #define STM32L4_FLASH_CR_PG     0       /* Program */
77 #define STM32L4_FLASH_CR_PER    1       /* Page erase */
78 #define STM32L4_FLASH_CR_MER1   2       /* Bank 1 erase */
79 #define STM32L4_FLASH_CR_MER2   15      /* Bank 2 erase */
80 #define STM32L4_FLASH_CR_STRT   16      /* Start command */
81 #define STM32L4_FLASH_CR_BKER   11      /* Bank select for page erase */
82 #define STM32L4_FLASH_CR_PNB    3       /* Page number (8 bits) */
83 // Bits requesting flash operations (useful when we want to clear them)
84 #define STM32L4_FLASH_CR_OPBITS                                     \
85     ((1lu<<STM32L4_FLASH_CR_PG) | (1lu<<STM32L4_FLASH_CR_PER)       \
86     | (1lu<<STM32L4_FLASH_CR_MER1) | (1lu<<STM32L4_FLASH_CR_MER1))
87 // Page is fully specified by BKER and PNB
88 #define STM32L4_FLASH_CR_PAGEMASK (0x1fflu << STM32L4_FLASH_CR_PNB)
89
90 #define STM32L4_FLASH_OPTR_DUALBANK     21
91
92 //STM32L0x flash register base and offsets
93 //same as 32L1 above
94 // RM0090 - DM00031020.pdf
95 #define STM32L0_FLASH_REGS_ADDR ((uint32_t)0x40022000)
96 #define FLASH_ACR_OFF     ((uint32_t) 0x00)
97 #define FLASH_PECR_OFF    ((uint32_t) 0x04)
98 #define FLASH_PDKEYR_OFF  ((uint32_t) 0x08)
99 #define FLASH_PEKEYR_OFF  ((uint32_t) 0x0c)
100 #define FLASH_PRGKEYR_OFF ((uint32_t) 0x10)
101 #define FLASH_OPTKEYR_OFF ((uint32_t) 0x14)
102 #define FLASH_SR_OFF      ((uint32_t) 0x18)
103 #define FLASH_OBR_OFF     ((uint32_t) 0x1c)
104 #define FLASH_WRPR_OFF    ((uint32_t) 0x20)
105
106
107
108 //STM32F4
109 #define FLASH_F4_REGS_ADDR ((uint32_t)0x40023c00)
110 #define FLASH_F4_KEYR (FLASH_F4_REGS_ADDR + 0x04)
111 #define FLASH_F4_OPT_KEYR (FLASH_F4_REGS_ADDR + 0x08)
112 #define FLASH_F4_SR (FLASH_F4_REGS_ADDR + 0x0c)
113 #define FLASH_F4_CR (FLASH_F4_REGS_ADDR + 0x10)
114 #define FLASH_F4_OPT_CR (FLASH_F4_REGS_ADDR + 0x14)
115 #define FLASH_F4_CR_STRT 16
116 #define FLASH_F4_CR_LOCK 31
117 #define FLASH_F4_CR_SER 1
118 #define FLASH_F4_CR_SNB 3
119 #define FLASH_F4_CR_SNB_MASK 0xf8
120 #define FLASH_F4_SR_BSY 16
121
122 #define L1_WRITE_BLOCK_SIZE 0x80
123 #define L0_WRITE_BLOCK_SIZE 0x40
124
125 void write_uint32(unsigned char* buf, uint32_t ui) {
126     if (!is_bigendian()) { // le -> le (don't swap)
127         buf[0] = ((unsigned char*) &ui)[0];
128         buf[1] = ((unsigned char*) &ui)[1];
129         buf[2] = ((unsigned char*) &ui)[2];
130         buf[3] = ((unsigned char*) &ui)[3];
131     } else {
132         buf[0] = ((unsigned char*) &ui)[3];
133         buf[1] = ((unsigned char*) &ui)[2];
134         buf[2] = ((unsigned char*) &ui)[1];
135         buf[3] = ((unsigned char*) &ui)[0];
136     }
137 }
138
139 void write_uint16(unsigned char* buf, uint16_t ui) {
140     if (!is_bigendian()) { // le -> le (don't swap)
141         buf[0] = ((unsigned char*) &ui)[0];
142         buf[1] = ((unsigned char*) &ui)[1];
143     } else {
144         buf[0] = ((unsigned char*) &ui)[1];
145         buf[1] = ((unsigned char*) &ui)[0];
146     }
147 }
148
149 uint32_t read_uint32(const unsigned char *c, const int pt) {
150     uint32_t ui;
151     char *p = (char *) &ui;
152
153     if (!is_bigendian()) { // le -> le (don't swap)
154         p[0] = c[pt + 0];
155         p[1] = c[pt + 1];
156         p[2] = c[pt + 2];
157         p[3] = c[pt + 3];
158     } else {
159         p[0] = c[pt + 3];
160         p[1] = c[pt + 2];
161         p[2] = c[pt + 1];
162         p[3] = c[pt + 0];
163     }
164     return ui;
165 }
166
167 static uint32_t __attribute__((unused)) read_flash_rdp(stlink_t *sl) {
168     uint32_t rdp;
169     stlink_read_debug32(sl, FLASH_WRPR, &rdp);
170     return rdp & 0xff;
171 }
172
173 static inline uint32_t read_flash_wrpr(stlink_t *sl) {
174     uint32_t wrpr;
175     stlink_read_debug32(sl, FLASH_WRPR, &wrpr);
176     return wrpr;
177 }
178
179 static inline uint32_t read_flash_obr(stlink_t *sl) {
180     uint32_t obr;
181     stlink_read_debug32(sl, FLASH_OBR, &obr);
182     return obr;
183 }
184
185 static inline uint32_t read_flash_cr(stlink_t *sl) {
186     uint32_t reg, res;
187
188     if (sl->flash_type == FLASH_TYPE_F4)
189         reg = FLASH_F4_CR;
190     else if (sl->flash_type == FLASH_TYPE_L4)
191         reg = STM32L4_FLASH_CR;
192     else
193         reg = FLASH_CR;
194
195     stlink_read_debug32(sl, reg, &res);
196
197 #if DEBUG_FLASH
198     fprintf(stdout, "CR:0x%x\n", res);
199 #endif
200     return res;
201 }
202
203 static inline unsigned int is_flash_locked(stlink_t *sl) {
204     /* return non zero for true */
205     uint32_t cr_lock_shift, cr = read_flash_cr(sl);
206
207     if (sl->flash_type == FLASH_TYPE_F4)
208         cr_lock_shift = FLASH_F4_CR_LOCK;
209     else if (sl->flash_type == FLASH_TYPE_L4)
210         cr_lock_shift = STM32L4_FLASH_CR_LOCK;
211     else
212         cr_lock_shift = FLASH_CR_LOCK;
213
214     return cr & (1 << cr_lock_shift);
215 }
216
217 static void unlock_flash(stlink_t *sl) {
218     uint32_t key_reg;
219     /* the unlock sequence consists of 2 write cycles where
220        2 key values are written to the FLASH_KEYR register.
221        an invalid sequence results in a definitive lock of
222        the FPEC block until next reset.
223        */
224     if (sl->flash_type == FLASH_TYPE_F4)
225         key_reg = FLASH_F4_KEYR;
226     else if (sl->flash_type == FLASH_TYPE_L4)
227         key_reg = STM32L4_FLASH_KEYR;
228     else
229         key_reg = FLASH_KEYR;
230
231     stlink_write_debug32(sl, key_reg, FLASH_KEY1);
232     stlink_write_debug32(sl, key_reg, FLASH_KEY2);
233 }
234
235 static int unlock_flash_if(stlink_t *sl) {
236     /* unlock flash if already locked */
237
238     if (is_flash_locked(sl)) {
239         unlock_flash(sl);
240         if (is_flash_locked(sl)) {
241             WLOG("Failed to unlock flash!\n");
242             return -1;
243         }
244     }
245     DLOG("Successfully unlocked flash\n");
246     return 0;
247 }
248
249 static void lock_flash(stlink_t *sl) {
250     uint32_t cr_lock_shift, cr_reg, n;
251
252     if (sl->flash_type == FLASH_TYPE_F4) {
253         cr_reg = FLASH_F4_CR;
254         cr_lock_shift = FLASH_F4_CR_LOCK;
255     } else if (sl->flash_type == FLASH_TYPE_L4) {
256         cr_reg = STM32L4_FLASH_CR;
257         cr_lock_shift = STM32L4_FLASH_CR_LOCK;
258     } else {
259         cr_reg = FLASH_CR;
260         cr_lock_shift = FLASH_CR_LOCK;
261     }
262
263     n = read_flash_cr(sl) | (1 << cr_lock_shift);
264     stlink_write_debug32(sl, cr_reg, n);
265 }
266
267
268 static void set_flash_cr_pg(stlink_t *sl) {
269     uint32_t cr_reg, x;
270
271     x = read_flash_cr(sl);
272
273     if (sl->flash_type == FLASH_TYPE_F4) {
274         cr_reg = FLASH_F4_CR;
275         x |= 1 << FLASH_CR_PG;
276     } else if (sl->flash_type == FLASH_TYPE_L4) {
277         cr_reg = STM32L4_FLASH_CR;
278         x &= ~STM32L4_FLASH_CR_OPBITS;
279         x |= 1 << STM32L4_FLASH_CR_PG;
280     } else {
281         cr_reg = FLASH_CR;
282         x = 1 << FLASH_CR_PG;
283     }
284
285     stlink_write_debug32(sl, cr_reg, x);
286 }
287
288 static void __attribute__((unused)) clear_flash_cr_pg(stlink_t *sl) {
289     uint32_t cr_reg, n;
290
291     if (sl->flash_type == FLASH_TYPE_F4)
292         cr_reg = FLASH_F4_CR;
293     else if (sl->flash_type == FLASH_TYPE_L4)
294         cr_reg = STM32L4_FLASH_CR;
295     else
296         cr_reg = FLASH_CR;
297
298     n = read_flash_cr(sl) & ~(1 << FLASH_CR_PG);
299     stlink_write_debug32(sl, cr_reg, n);
300 }
301
302 static void set_flash_cr_per(stlink_t *sl) {
303     const uint32_t n = 1 << FLASH_CR_PER;
304     stlink_write_debug32(sl, FLASH_CR, n);
305 }
306
307 static void __attribute__((unused)) clear_flash_cr_per(stlink_t *sl) {
308     const uint32_t n = read_flash_cr(sl) & ~(1 << FLASH_CR_PER);
309     stlink_write_debug32(sl, FLASH_CR, n);
310 }
311
312 static void set_flash_cr_mer(stlink_t *sl) {
313     uint32_t val, cr_reg, cr_mer;
314
315     if (sl->flash_type == FLASH_TYPE_F4) {
316         cr_reg = FLASH_F4_CR;
317         cr_mer = 1 << FLASH_CR_MER;
318     } else if (sl->flash_type == FLASH_TYPE_L4) {
319         cr_reg = STM32L4_FLASH_CR;
320         cr_mer = (1 << STM32L4_FLASH_CR_MER1) | (1 << STM32L4_FLASH_CR_MER2);
321     } else {
322         cr_reg = FLASH_CR;
323         cr_mer = 1 << FLASH_CR_MER;
324     }
325
326     stlink_read_debug32(sl, cr_reg, &val);
327     val |= cr_mer;
328     stlink_write_debug32(sl, cr_reg, val);
329 }
330
331 static void __attribute__((unused)) clear_flash_cr_mer(stlink_t *sl) {
332     uint32_t val, cr_reg, cr_mer;
333
334     if (sl->flash_type == FLASH_TYPE_F4) {
335         cr_reg = FLASH_F4_CR;
336         cr_mer = 1 << FLASH_CR_MER;
337     } else if (sl->flash_type == FLASH_TYPE_L4) {
338         cr_reg = STM32L4_FLASH_CR;
339         cr_mer = (1 << STM32L4_FLASH_CR_MER1) | (1 << STM32L4_FLASH_CR_MER2);
340     } else {
341         cr_reg = FLASH_CR;
342         cr_mer = 1 << FLASH_CR_MER;
343     }
344
345     stlink_read_debug32(sl, cr_reg, &val);
346     val &= ~cr_mer;
347     stlink_write_debug32(sl, cr_reg, val);
348 }
349
350 static void set_flash_cr_strt(stlink_t *sl) {
351     uint32_t val, cr_reg, cr_strt;
352
353     if (sl->flash_type == FLASH_TYPE_F4) {
354         cr_reg = FLASH_F4_CR;
355         cr_strt = 1 << FLASH_F4_CR_STRT;
356     } else if (sl->flash_type == FLASH_TYPE_L4) {
357         cr_reg = STM32L4_FLASH_CR;
358         cr_strt = 1 << STM32L4_FLASH_CR_STRT;
359     } else {
360         cr_reg = FLASH_CR;
361         cr_strt = 1 << FLASH_CR_STRT;
362     }
363
364     stlink_read_debug32(sl, cr_reg, &val);
365     val |= cr_strt;
366     stlink_write_debug32(sl, cr_reg, val);
367 }
368
369 static inline uint32_t read_flash_acr(stlink_t *sl) {
370     uint32_t acr;
371     stlink_read_debug32(sl, FLASH_ACR, &acr);
372     return acr;
373 }
374
375 static inline uint32_t read_flash_sr(stlink_t *sl) {
376     uint32_t res, sr_reg;
377
378     if (sl->flash_type == FLASH_TYPE_F4)
379         sr_reg = FLASH_F4_SR;
380     else if (sl->flash_type == FLASH_TYPE_L4)
381         sr_reg = STM32L4_FLASH_SR;
382     else
383         sr_reg = FLASH_SR;
384
385     stlink_read_debug32(sl, sr_reg, &res);
386
387     return res;
388 }
389
390 static inline unsigned int is_flash_busy(stlink_t *sl) {
391     uint32_t sr_busy_shift;
392
393     if (sl->flash_type == FLASH_TYPE_F4)
394         sr_busy_shift = FLASH_F4_SR_BSY;
395     else if (sl->flash_type == FLASH_TYPE_L4)
396         sr_busy_shift = STM32L4_FLASH_SR_BSY;
397     else
398         sr_busy_shift = FLASH_SR_BSY;
399
400     return read_flash_sr(sl) & (1 << sr_busy_shift);
401 }
402
403 static void wait_flash_busy(stlink_t *sl) {
404     /* todo: add some delays here */
405     while (is_flash_busy(sl))
406         ;
407 }
408
409 static void wait_flash_busy_progress(stlink_t *sl) {
410     int i = 0;
411     fprintf(stdout, "Mass erasing");
412     fflush(stdout);
413     while (is_flash_busy(sl)) {
414         usleep(10000);
415         i++;
416         if (i % 100 == 0) {
417             fprintf(stdout, ".");
418             fflush(stdout);
419         }
420     }
421     fprintf(stdout, "\n");
422 }
423
424 static inline unsigned int is_flash_eop(stlink_t *sl) {
425     return read_flash_sr(sl) & (1 << FLASH_SR_EOP);
426 }
427
428 static void __attribute__((unused)) clear_flash_sr_eop(stlink_t *sl) {
429     const uint32_t n = read_flash_sr(sl) & ~(1 << FLASH_SR_EOP);
430     stlink_write_debug32(sl, FLASH_SR, n);
431 }
432
433 static void __attribute__((unused)) wait_flash_eop(stlink_t *sl) {
434     /* todo: add some delays here */
435     while (is_flash_eop(sl) == 0)
436         ;
437 }
438
439 static inline void write_flash_ar(stlink_t *sl, uint32_t n) {
440     stlink_write_debug32(sl, FLASH_AR, n);
441 }
442
443 static inline void write_flash_cr_psiz(stlink_t *sl, uint32_t n) {
444     uint32_t x = read_flash_cr(sl);
445     x &= ~(0x03 << 8);
446     x |= (n << 8);
447 #if DEBUG_FLASH
448     fprintf(stdout, "PSIZ:0x%x 0x%x\n", x, n);
449 #endif
450     stlink_write_debug32(sl, FLASH_F4_CR, x);
451 }
452
453
454 static inline void write_flash_cr_snb(stlink_t *sl, uint32_t n) {
455     uint32_t x = read_flash_cr(sl);
456     x &= ~FLASH_F4_CR_SNB_MASK;
457     x |= (n << FLASH_F4_CR_SNB);
458     x |= (1 << FLASH_F4_CR_SER);
459 #if DEBUG_FLASH
460     fprintf(stdout, "SNB:0x%x 0x%x\n", x, n);
461 #endif
462     stlink_write_debug32(sl, FLASH_F4_CR, x);
463 }
464
465 static inline void write_flash_cr_bker_pnb(stlink_t *sl, uint32_t n) {
466     stlink_write_debug32(sl, STM32L4_FLASH_SR, 0xFFFFFFFF & ~(1<<STM32L4_FLASH_SR_BSY));
467     uint32_t x = read_flash_cr(sl);
468     x &=~ STM32L4_FLASH_CR_OPBITS;
469     x &=~ STM32L4_FLASH_CR_PAGEMASK;
470     x &= ~(1<<STM32L4_FLASH_CR_MER1);
471     x &= ~(1<<STM32L4_FLASH_CR_MER2);
472     x |= (n << STM32L4_FLASH_CR_PNB);
473     x |= (1lu << STM32L4_FLASH_CR_PER);
474 #if DEBUG_FLASH
475     fprintf(stdout, "BKER:PNB:0x%x 0x%x\n", x, n);
476 #endif
477     stlink_write_debug32(sl, STM32L4_FLASH_CR, x);
478 }
479
480 // Delegates to the backends...
481
482 void stlink_close(stlink_t *sl) {
483     DLOG("*** stlink_close ***\n");
484     if (!sl)
485          return;
486     sl->backend->close(sl);
487     free(sl);
488 }
489
490 int stlink_exit_debug_mode(stlink_t *sl) {
491     int ret;
492
493     DLOG("*** stlink_exit_debug_mode ***\n");
494     ret = stlink_write_debug32(sl, DHCSR, DBGKEY);
495     if (ret == -1)
496         return ret;
497
498     return sl->backend->exit_debug_mode(sl);
499 }
500
501 int stlink_enter_swd_mode(stlink_t *sl) {
502     DLOG("*** stlink_enter_swd_mode ***\n");
503     return sl->backend->enter_swd_mode(sl);
504 }
505
506 // Force the core into the debug mode -> halted state.
507 int stlink_force_debug(stlink_t *sl) {
508     DLOG("*** stlink_force_debug_mode ***\n");
509     return sl->backend->force_debug(sl);
510 }
511
512 int stlink_exit_dfu_mode(stlink_t *sl) {
513     DLOG("*** stlink_exit_dfu_mode ***\n");
514     return sl->backend->exit_dfu_mode(sl);
515 }
516
517 int stlink_core_id(stlink_t *sl) {
518     int ret;
519
520     DLOG("*** stlink_core_id ***\n");
521     ret = sl->backend->core_id(sl);
522     if (ret == -1) {
523         ELOG("Failed to read core_id\n");
524         return ret;
525     }
526     if (sl->verbose > 2)
527         stlink_print_data(sl);
528     DLOG("core_id = 0x%08x\n", sl->core_id);
529     return ret;
530 }
531
532 int stlink_chip_id(stlink_t *sl, uint32_t *chip_id) {
533     int ret;
534
535     ret = stlink_read_debug32(sl, 0xE0042000, chip_id);
536     if (ret == -1)
537         return ret;
538
539     if (*chip_id == 0)
540         ret = stlink_read_debug32(sl, 0x40015800, chip_id);    //Try Corex M0 DBGMCU_IDCODE register address
541
542     return ret;
543 }
544
545 /**
546  * Cortex m3 tech ref manual, CPUID register description
547  * @param sl stlink context
548  * @param cpuid pointer to the result object
549  */
550 int stlink_cpu_id(stlink_t *sl, cortex_m3_cpuid_t *cpuid) {
551     uint32_t raw;
552
553     if (stlink_read_debug32(sl, CM3_REG_CPUID, &raw))
554         return -1;
555
556     cpuid->implementer_id = (raw >> 24) & 0x7f;
557     cpuid->variant = (raw >> 20) & 0xf;
558     cpuid->part = (raw >> 4) & 0xfff;
559     cpuid->revision = raw & 0xf;
560     return 0;
561 }
562
563 /**
564  * reads and decodes the flash parameters, as dynamically as possible
565  * @param sl
566  * @return 0 for success, or -1 for unsupported core type.
567  */
568 int stlink_load_device_params(stlink_t *sl) {
569     ILOG("Loading device parameters....\n");
570     const chip_params_t *params = NULL;
571     stlink_core_id(sl);
572     uint32_t chip_id;
573     uint32_t flash_size;
574
575     stlink_chip_id(sl, &chip_id);
576     sl->chip_id = chip_id & 0xfff;
577     /* Fix chip_id for F4 rev A errata , Read CPU ID, as CoreID is the same for F2/F4*/
578     if (sl->chip_id == 0x411) {
579         uint32_t cpuid;
580         stlink_read_debug32(sl, 0xE000ED00, &cpuid);
581         if ((cpuid  & 0xfff0) == 0xc240)
582             sl->chip_id = 0x413;
583     }
584
585     for (size_t i = 0; i < sizeof(devices) / sizeof(devices[0]); i++) {
586         if(devices[i].chip_id == sl->chip_id) {
587             params = &devices[i];
588             break;
589         }
590     }
591     if (params == NULL) {
592         WLOG("unknown chip id! %#x\n", chip_id);
593         return -1;
594     }
595
596     // These are fixed...
597     sl->flash_base = STM32_FLASH_BASE;
598     sl->sram_base = STM32_SRAM_BASE;
599     stlink_read_debug32(sl,(params->flash_size_reg) & ~3, &flash_size);
600     if (params->flash_size_reg & 2)
601         flash_size = flash_size >>16;
602     flash_size = flash_size & 0xffff;
603
604     if ((sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS) && ( flash_size == 0 )) {
605         sl->flash_size = 128 * 1024;
606     } else if (sl->chip_id == STM32_CHIPID_L1_CAT2) {
607         sl->flash_size = (flash_size & 0xff) * 1024;
608     } else if ((sl->chip_id & 0xFFF) == STM32_CHIPID_L1_HIGH) {
609         // 0 is 384k and 1 is 256k
610         if ( flash_size == 0 ) {
611             sl->flash_size = 384 * 1024;
612         } else {
613             sl->flash_size = 256 * 1024;
614         }
615     } else {
616         sl->flash_size = flash_size * 1024;
617     }
618     sl->flash_type = params->flash_type;
619     sl->flash_pgsz = params->flash_pagesize;
620     sl->sram_size = params->sram_size;
621     sl->sys_base = params->bootrom_base;
622     sl->sys_size = params->bootrom_size;
623
624     //medium and low devices have the same chipid. ram size depends on flash size.
625     //STM32F100xx datasheet Doc ID 16455 Table 2
626     if(sl->chip_id == STM32_CHIPID_F1_VL_MEDIUM_LOW && sl->flash_size < 64 * 1024){
627         sl->sram_size = 0x1000;
628     }
629
630     ILOG("Device connected is: %s, id %#x\n", params->description, chip_id);
631     // TODO make note of variable page size here.....
632     ILOG("SRAM size: %#x bytes (%d KiB), Flash: %#x bytes (%d KiB) in pages of %zd bytes\n",
633             sl->sram_size, sl->sram_size / 1024, sl->flash_size, sl->flash_size / 1024,
634             sl->flash_pgsz);
635     return 0;
636 }
637
638 int stlink_reset(stlink_t *sl) {
639     DLOG("*** stlink_reset ***\n");
640     return sl->backend->reset(sl);
641 }
642
643 int stlink_jtag_reset(stlink_t *sl, int value) {
644     DLOG("*** stlink_jtag_reset ***\n");
645     return sl->backend->jtag_reset(sl, value);
646 }
647
648 int stlink_run(stlink_t *sl) {
649     DLOG("*** stlink_run ***\n");
650     return sl->backend->run(sl);
651 }
652
653 int stlink_status(stlink_t *sl) {
654     int ret;
655
656     DLOG("*** stlink_status ***\n");
657     ret = sl->backend->status(sl);
658     stlink_core_stat(sl);
659
660     return ret;
661 }
662
663 /**
664  * Decode the version bits, originally from -sg, verified with usb
665  * @param sl stlink context, assumed to contain valid data in the buffer
666  * @param slv output parsed version object
667  */
668 void _parse_version(stlink_t *sl, stlink_version_t *slv) {
669     uint32_t b0 = sl->q_buf[0]; //lsb
670     uint32_t b1 = sl->q_buf[1];
671     uint32_t b2 = sl->q_buf[2];
672     uint32_t b3 = sl->q_buf[3];
673     uint32_t b4 = sl->q_buf[4];
674     uint32_t b5 = sl->q_buf[5]; //msb
675
676     // b0 b1                       || b2 b3  | b4 b5
677     // 4b        | 6b     | 6b     || 2B     | 2B
678     // stlink_v  | jtag_v | swim_v || st_vid | stlink_pid
679
680     slv->stlink_v = (b0 & 0xf0) >> 4;
681     slv->jtag_v = ((b0 & 0x0f) << 2) | ((b1 & 0xc0) >> 6);
682     slv->swim_v = b1 & 0x3f;
683     slv->st_vid = (b3 << 8) | b2;
684     slv->stlink_pid = (b5 << 8) | b4;
685     return;
686 }
687
688 int stlink_version(stlink_t *sl) {
689     DLOG("*** looking up stlink version\n");
690     if (sl->backend->version(sl))
691         return -1;
692
693     _parse_version(sl, &sl->version);
694
695     DLOG("st vid         = 0x%04x (expect 0x%04x)\n", sl->version.st_vid, USB_ST_VID);
696     DLOG("stlink pid     = 0x%04x\n", sl->version.stlink_pid);
697     DLOG("stlink version = 0x%x\n", sl->version.stlink_v);
698     DLOG("jtag version   = 0x%x\n", sl->version.jtag_v);
699     DLOG("swim version   = 0x%x\n", sl->version.swim_v);
700     if (sl->version.jtag_v == 0) {
701         DLOG("    notice: the firmware doesn't support a jtag/swd interface\n");
702     }
703     if (sl->version.swim_v == 0) {
704         DLOG("    notice: the firmware doesn't support a swim interface\n");
705     }
706
707     return 0;
708 }
709
710 int stlink_target_voltage(stlink_t *sl) {
711     int voltage = -1;
712     DLOG("*** reading target voltage\n");
713     if (sl->backend->target_voltage != NULL) {
714         voltage = sl->backend->target_voltage(sl);
715         if (voltage != -1) {
716             DLOG("target voltage = %ldmV\n", voltage);
717         } else {
718             DLOG("error reading target voltage\n");
719         }
720     } else {
721         DLOG("reading voltage not supported by backend\n");
722     }
723     return voltage;
724 }
725
726 int stlink_read_debug32(stlink_t *sl, uint32_t addr, uint32_t *data) {
727     int ret;
728
729     ret = sl->backend->read_debug32(sl, addr, data);
730     if (!ret)
731             DLOG("*** stlink_read_debug32 %x is %#x\n", *data, addr);
732
733         return ret;
734 }
735
736 int stlink_write_debug32(stlink_t *sl, uint32_t addr, uint32_t data) {
737     DLOG("*** stlink_write_debug32 %x to %#x\n", data, addr);
738     return sl->backend->write_debug32(sl, addr, data);
739 }
740
741 int stlink_write_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
742     DLOG("*** stlink_write_mem32 %u bytes to %#x\n", len, addr);
743     if (len % 4 != 0) {
744         fprintf(stderr, "Error: Data length doesn't have a 32 bit alignment: +%d byte.\n", len % 4);
745         abort();
746     }
747     return sl->backend->write_mem32(sl, addr, len);
748 }
749
750 int stlink_read_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
751     DLOG("*** stlink_read_mem32 ***\n");
752     if (len % 4 != 0) { // !!! never ever: fw gives just wrong values
753         fprintf(stderr, "Error: Data length doesn't have a 32 bit alignment: +%d byte.\n",
754                 len % 4);
755         abort();
756     }
757     return sl->backend->read_mem32(sl, addr, len);
758 }
759
760 int stlink_write_mem8(stlink_t *sl, uint32_t addr, uint16_t len) {
761     DLOG("*** stlink_write_mem8 ***\n");
762     if (len > 0x40 ) { // !!! never ever: Writing more then 0x40 bytes gives unexpected behaviour
763         fprintf(stderr, "Error: Data length > 64: +%d byte.\n",
764                 len);
765         abort();
766     }
767     return sl->backend->write_mem8(sl, addr, len);
768 }
769
770 int stlink_read_all_regs(stlink_t *sl, reg *regp) {
771     DLOG("*** stlink_read_all_regs ***\n");
772     return sl->backend->read_all_regs(sl, regp);
773 }
774
775 int stlink_read_all_unsupported_regs(stlink_t *sl, reg *regp) {
776     DLOG("*** stlink_read_all_unsupported_regs ***\n");
777     return sl->backend->read_all_unsupported_regs(sl, regp);
778 }
779
780 int stlink_write_reg(stlink_t *sl, uint32_t reg, int idx) {
781     DLOG("*** stlink_write_reg\n");
782     return sl->backend->write_reg(sl, reg, idx);
783 }
784
785 int stlink_read_reg(stlink_t *sl, int r_idx, reg *regp) {
786     DLOG("*** stlink_read_reg\n");
787     DLOG(" (%d) ***\n", r_idx);
788
789     if (r_idx > 20 || r_idx < 0) {
790         fprintf(stderr, "Error: register index must be in [0..20]\n");
791         return -1;
792     }
793
794     return sl->backend->read_reg(sl, r_idx, regp);
795 }
796
797 int stlink_read_unsupported_reg(stlink_t *sl, int r_idx, reg *regp) {
798     int r_convert;
799
800     DLOG("*** stlink_read_unsupported_reg\n");
801     DLOG(" (%d) ***\n", r_idx);
802
803     /* Convert to values used by DCRSR */
804     if (r_idx >= 0x1C && r_idx <= 0x1F) { /* primask, basepri, faultmask, or control */
805         r_convert = 0x14;
806     } else if (r_idx == 0x40) {     /* FPSCR */
807         r_convert = 0x21;
808     } else if (r_idx >= 0x20 && r_idx < 0x40) {
809         r_convert = 0x40 + (r_idx - 0x20);
810     } else {
811         fprintf(stderr, "Error: register address must be in [0x1C..0x40]\n");
812         return -1;
813     }
814
815     return sl->backend->read_unsupported_reg(sl, r_convert, regp);
816 }
817
818 int stlink_write_unsupported_reg(stlink_t *sl, uint32_t val, int r_idx, reg *regp) {
819     int r_convert;
820
821     DLOG("*** stlink_write_unsupported_reg\n");
822     DLOG(" (%d) ***\n", r_idx);
823
824     /* Convert to values used by DCRSR */
825     if (r_idx >= 0x1C && r_idx <= 0x1F) { /* primask, basepri, faultmask, or control */
826         r_convert = r_idx;  /* The backend function handles this */
827     } else if (r_idx == 0x40) {     /* FPSCR */
828         r_convert = 0x21;
829     } else if (r_idx >= 0x20 && r_idx < 0x40) {
830         r_convert = 0x40 + (r_idx - 0x20);
831     } else {
832         fprintf(stderr, "Error: register address must be in [0x1C..0x40]\n");
833         return -1;
834     }
835
836     return sl->backend->write_unsupported_reg(sl, val, r_convert, regp);
837 }
838
839 unsigned int is_core_halted(stlink_t *sl) {
840     /* return non zero if core is halted */
841     stlink_status(sl);
842     return sl->q_buf[0] == STLINK_CORE_HALTED;
843 }
844
845 int stlink_step(stlink_t *sl) {
846     DLOG("*** stlink_step ***\n");
847     return sl->backend->step(sl);
848 }
849
850 int stlink_current_mode(stlink_t *sl) {
851     int mode = sl->backend->current_mode(sl);
852     switch (mode) {
853     case STLINK_DEV_DFU_MODE:
854         DLOG("stlink current mode: dfu\n");
855         return mode;
856     case STLINK_DEV_DEBUG_MODE:
857         DLOG("stlink current mode: debug (jtag or swd)\n");
858         return mode;
859     case STLINK_DEV_MASS_MODE:
860         DLOG("stlink current mode: mass\n");
861         return mode;
862     }
863     DLOG("stlink mode: unknown!\n");
864     return STLINK_DEV_UNKNOWN_MODE;
865 }
866
867
868
869
870 // End of delegates....  Common code below here...
871
872 // Endianness
873 // http://www.ibm.com/developerworks/aix/library/au-endianc/index.html
874 // const int i = 1;
875 // #define is_bigendian() ( (*(char*)&i) == 0 )
876
877 inline unsigned int is_bigendian(void) {
878     static volatile const unsigned int i = 1;
879     return *(volatile const char*) &i == 0;
880 }
881
882 uint16_t read_uint16(const unsigned char *c, const int pt) {
883     uint32_t ui;
884     char *p = (char *) &ui;
885
886     if (!is_bigendian()) { // le -> le (don't swap)
887         p[0] = c[pt + 0];
888         p[1] = c[pt + 1];
889     } else {
890         p[0] = c[pt + 1];
891         p[1] = c[pt + 0];
892     }
893     return ui;
894 }
895
896 // same as above with entrypoint.
897
898 void stlink_run_at(stlink_t *sl, stm32_addr_t addr) {
899     stlink_write_reg(sl, addr, 15); /* pc register */
900
901     stlink_run(sl);
902
903     while (is_core_halted(sl) == 0)
904         usleep(3000000);
905 }
906
907 void stlink_core_stat(stlink_t *sl) {
908     if (sl->q_len <= 0)
909         return;
910
911     switch (sl->q_buf[0]) {
912     case STLINK_CORE_RUNNING:
913         sl->core_stat = STLINK_CORE_RUNNING;
914         DLOG("  core status: running\n");
915         return;
916     case STLINK_CORE_HALTED:
917         sl->core_stat = STLINK_CORE_HALTED;
918         DLOG("  core status: halted\n");
919         return;
920     default:
921         sl->core_stat = STLINK_CORE_STAT_UNKNOWN;
922         fprintf(stderr, "  core status: unknown\n");
923     }
924 }
925
926 void stlink_print_data(stlink_t * sl) {
927     if (sl->q_len <= 0 || sl->verbose < UDEBUG)
928         return;
929     if (sl->verbose > 2)
930         fprintf(stdout, "data_len = %d 0x%x\n", sl->q_len, sl->q_len);
931
932     for (int i = 0; i < sl->q_len; i++) {
933         if (i % 16 == 0) {
934             /*
935                if (sl->q_data_dir == Q_DATA_OUT)
936                fprintf(stdout, "\n<- 0x%08x ", sl->q_addr + i);
937                else
938                fprintf(stdout, "\n-> 0x%08x ", sl->q_addr + i);
939                */
940         }
941         fprintf(stdout, " %02x", (unsigned int) sl->q_buf[i]);
942     }
943     fputs("\n\n", stdout);
944 }
945
946 /* memory mapped file */
947
948 typedef struct mapped_file {
949     uint8_t* base;
950     size_t len;
951 } mapped_file_t;
952
953 #define MAPPED_FILE_INITIALIZER { NULL, 0 }
954
955 static int map_file(mapped_file_t* mf, const char* path) {
956     int error = -1;
957     struct stat st;
958
959     const int fd = open(path, O_RDONLY | O_BINARY);
960     if (fd == -1) {
961         fprintf(stderr, "open(%s) == -1\n", path);
962         return -1;
963     }
964
965     if (fstat(fd, &st) == -1) {
966         fprintf(stderr, "fstat() == -1\n");
967         goto on_error;
968     }
969
970     mf->base = (uint8_t*) mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
971     if (mf->base == MAP_FAILED) {
972         fprintf(stderr, "mmap() == MAP_FAILED\n");
973         goto on_error;
974     }
975
976     mf->len = st.st_size;
977
978     /* success */
979     error = 0;
980
981 on_error:
982     close(fd);
983
984     return error;
985 }
986
987 static void unmap_file(mapped_file_t * mf) {
988     munmap((void*) mf->base, mf->len);
989     mf->base = (unsigned char*) MAP_FAILED;
990     mf->len = 0;
991 }
992
993 /* Limit the block size to compare to 0x1800
994    Anything larger will stall the STLINK2
995    Maybe STLINK V1 needs smaller value!*/
996 static int check_file(stlink_t* sl, mapped_file_t* mf, stm32_addr_t addr) {
997     size_t off;
998     size_t n_cmp = sl->flash_pgsz;
999     if ( n_cmp > 0x1800)
1000         n_cmp = 0x1800;
1001
1002     for (off = 0; off < mf->len; off += n_cmp) {
1003         size_t aligned_size;
1004
1005         /* adjust last page size */
1006         size_t cmp_size = n_cmp;
1007         if ((off + n_cmp) > mf->len)
1008             cmp_size = mf->len - off;
1009
1010         aligned_size = cmp_size;
1011         if (aligned_size & (4 - 1))
1012             aligned_size = (cmp_size + 4) & ~(4 - 1);
1013
1014         stlink_read_mem32(sl, addr + off, aligned_size);
1015
1016         if (memcmp(sl->q_buf, mf->base + off, cmp_size))
1017             return -1;
1018     }
1019
1020     return 0;
1021 }
1022
1023 int stlink_fwrite_sram
1024 (stlink_t * sl, const char* path, stm32_addr_t addr) {
1025     /* write the file in sram at addr */
1026
1027     int error = -1;
1028     size_t off;
1029     size_t len;
1030     mapped_file_t mf = MAPPED_FILE_INITIALIZER;
1031     uint32_t val;
1032
1033
1034     if (map_file(&mf, path) == -1) {
1035         fprintf(stderr, "map_file() == -1\n");
1036         return -1;
1037     }
1038
1039     /* check addr range is inside the sram */
1040     if (addr < sl->sram_base) {
1041         fprintf(stderr, "addr too low\n");
1042         goto on_error;
1043     } else if ((addr + mf.len) < addr) {
1044         fprintf(stderr, "addr overruns\n");
1045         goto on_error;
1046     } else if ((addr + mf.len) > (sl->sram_base + sl->sram_size)) {
1047         fprintf(stderr, "addr too high\n");
1048         goto on_error;
1049     } else if (addr & 3) {
1050         /* todo */
1051         fprintf(stderr, "unaligned addr\n");
1052         goto on_error;
1053     }
1054
1055     len = mf.len;
1056
1057     if(len & 3) {
1058       len -= len & 3;
1059     }
1060
1061     /* do the copy by 1k blocks */
1062     for (off = 0; off < len; off += 1024) {
1063         size_t size = 1024;
1064         if ((off + size) > len)
1065             size = len - off;
1066
1067         memcpy(sl->q_buf, mf.base + off, size);
1068
1069         /* round size if needed */
1070         if (size & 3)
1071             size += 2;
1072
1073         stlink_write_mem32(sl, addr + off, size);
1074     }
1075
1076     if(mf.len > len) {
1077         memcpy(sl->q_buf, mf.base + len, mf.len - len);
1078         stlink_write_mem8(sl, addr + len, mf.len - len);
1079     }
1080
1081     /* check the file ha been written */
1082     if (check_file(sl, &mf, addr) == -1) {
1083         fprintf(stderr, "check_file() == -1\n");
1084         goto on_error;
1085     }
1086
1087     /* success */
1088     error = 0;
1089     /* set stack*/
1090     stlink_read_debug32(sl, addr, &val);
1091     stlink_write_reg(sl, val, 13);
1092     /* Set PC to the reset routine*/
1093     stlink_read_debug32(sl, addr + 4, &val);
1094     stlink_write_reg(sl, val, 15);
1095     stlink_run(sl);
1096
1097 on_error:
1098     unmap_file(&mf);
1099     return error;
1100 }
1101
1102 int stlink_fread(stlink_t* sl, const char* path, stm32_addr_t addr, size_t size) {
1103     /* read size bytes from addr to file */
1104
1105     int error = -1;
1106     size_t off;
1107
1108     const int fd = open(path, O_RDWR | O_TRUNC | O_CREAT, 00700);
1109     if (fd == -1) {
1110         fprintf(stderr, "open(%s) == -1\n", path);
1111         return -1;
1112     }
1113
1114     if (size <1)
1115         size = sl->flash_size;
1116
1117     if (size > sl->flash_size)
1118         size = sl->flash_size;
1119
1120     size_t cmp_size = (sl->flash_pgsz > 0x1800)? 0x1800:sl->flash_pgsz;
1121     for (off = 0; off < size; off += cmp_size) {
1122         size_t aligned_size;
1123
1124         /* adjust last page size */
1125         if ((off + cmp_size) > size)
1126             cmp_size = size - off;
1127
1128         aligned_size = cmp_size;
1129         if (aligned_size & (4 - 1))
1130             aligned_size = (cmp_size + 4) & ~(4 - 1);
1131
1132         stlink_read_mem32(sl, addr + off, aligned_size);
1133
1134         if (write(fd, sl->q_buf, sl->q_len) != (ssize_t) aligned_size) {
1135             fprintf(stderr, "write() != aligned_size\n");
1136             goto on_error;
1137         }
1138     }
1139
1140     /* success */
1141     error = 0;
1142
1143 on_error:
1144     close(fd);
1145
1146     return error;
1147 }
1148
1149 int write_buffer_to_sram(stlink_t *sl, flash_loader_t* fl, const uint8_t* buf, size_t size) {
1150     /* write the buffer right after the loader */
1151     size_t chunk = size & ~0x3;
1152     size_t rem   = size & 0x3;
1153     if (chunk) {
1154         memcpy(sl->q_buf, buf, chunk);
1155         stlink_write_mem32(sl, fl->buf_addr, chunk);
1156     }
1157     if (rem) {
1158         memcpy(sl->q_buf, buf+chunk, rem);
1159         stlink_write_mem8(sl, (fl->buf_addr)+chunk, rem);
1160     }
1161     return 0;
1162 }
1163
1164 uint32_t calculate_F4_sectornum(uint32_t flashaddr){
1165     uint32_t offset = 0;
1166     flashaddr &= ~STM32_FLASH_BASE;     //Page now holding the actual flash address
1167     if (flashaddr >= 0x100000) {
1168         offset = 12;
1169         flashaddr -= 0x100000;
1170     } 
1171     if (flashaddr<0x4000) return (offset + 0);
1172     else if(flashaddr<0x8000) return(offset + 1);
1173     else if(flashaddr<0xc000) return(offset + 2);
1174     else if(flashaddr<0x10000) return(offset + 3);
1175     else if(flashaddr<0x20000) return(offset + 4);
1176     else return offset + (flashaddr/0x20000) +4;
1177
1178 }
1179
1180 uint32_t calculate_F7_sectornum(uint32_t flashaddr){
1181     flashaddr &= ~STM32_FLASH_BASE;     //Page now holding the actual flash address
1182         if(flashaddr<0x20000) return(flashaddr/0x8000);
1183     else if(flashaddr<0x40000) return(4);
1184     else return(flashaddr/0x40000) +4;
1185
1186 }
1187
1188 // Returns BKER:PNB for the given page address
1189 uint32_t calculate_L4_page(stlink_t *sl, uint32_t flashaddr) {
1190     uint32_t bker = 0;
1191     uint32_t flashopt;
1192     stlink_read_debug32(sl, STM32L4_FLASH_OPTR, &flashopt);
1193     flashaddr -= STM32_FLASH_BASE;
1194     if (flashopt & (1lu << STM32L4_FLASH_OPTR_DUALBANK)) {
1195         uint32_t banksize = sl->flash_size / 2;
1196         if (flashaddr >= banksize) {
1197             flashaddr -= banksize;
1198             bker = 0x100;
1199         }
1200     }
1201     // For 1MB chips without the dual-bank option set, the page address will
1202     // overflow into the BKER bit, which gives us the correct bank:page value.
1203     return bker | flashaddr/sl->flash_pgsz;
1204 }
1205
1206 uint32_t stlink_calculate_pagesize(stlink_t *sl, uint32_t flashaddr){
1207     if ((sl->chip_id == STM32_CHIPID_F2) || (sl->chip_id == STM32_CHIPID_F4) || (sl->chip_id == STM32_CHIPID_F4_DE) ||
1208             (sl->chip_id == STM32_CHIPID_F4_LP) || (sl->chip_id == STM32_CHIPID_F4_HD) || (sl->chip_id == STM32_CHIPID_F411RE) ||
1209             (sl->chip_id == STM32_CHIPID_F446) || (sl->chip_id == STM32_CHIPID_F4_DSI)) {
1210         uint32_t sector=calculate_F4_sectornum(flashaddr);
1211         if (sector>= 12) {
1212             sector -= 12;
1213         }
1214         if (sector<4) sl->flash_pgsz=0x4000;
1215         else if(sector<5) sl->flash_pgsz=0x10000;
1216         else sl->flash_pgsz=0x20000;
1217     }
1218     else if (sl->chip_id == STM32_CHIPID_F7) {
1219         uint32_t sector=calculate_F7_sectornum(flashaddr);
1220         if (sector<4) sl->flash_pgsz=0x8000;
1221         else if(sector<5) sl->flash_pgsz=0x20000;
1222         else sl->flash_pgsz=0x40000;
1223     }
1224     return (sl->flash_pgsz);
1225 }
1226
1227 /**
1228  * Erase a page of flash, assumes sl is fully populated with things like chip/core ids
1229  * @param sl stlink context
1230  * @param flashaddr an address in the flash page to erase
1231  * @return 0 on success -ve on failure
1232  */
1233 int stlink_erase_flash_page(stlink_t *sl, stm32_addr_t flashaddr)
1234 {
1235     if (sl->flash_type == FLASH_TYPE_F4 || sl->flash_type == FLASH_TYPE_L4) {
1236         /* wait for ongoing op to finish */
1237         wait_flash_busy(sl);
1238
1239         /* unlock if locked */
1240         unlock_flash_if(sl);
1241
1242         /* select the page to erase */
1243         if (sl->chip_id == STM32_CHIPID_L4) {
1244             // calculate the actual bank+page from the address
1245             uint32_t page = calculate_L4_page(sl, flashaddr);
1246
1247             fprintf(stderr, "EraseFlash - Page:0x%x Size:0x%x ", page, stlink_calculate_pagesize(sl, flashaddr));
1248
1249             write_flash_cr_bker_pnb(sl, page);
1250         } else if (sl->chip_id == STM32_CHIPID_F7) {
1251             // calculate the actual page from the address
1252             uint32_t sector=calculate_F7_sectornum(flashaddr);
1253
1254             fprintf(stderr, "EraseFlash - Sector:0x%x Size:0x%x ", sector, stlink_calculate_pagesize(sl, flashaddr));
1255
1256             write_flash_cr_snb(sl, sector);
1257         } else {
1258             // calculate the actual page from the address
1259             uint32_t sector=calculate_F4_sectornum(flashaddr);
1260
1261             fprintf(stderr, "EraseFlash - Sector:0x%x Size:0x%x ", sector, stlink_calculate_pagesize(sl, flashaddr));
1262         
1263             //the SNB values for flash sectors in the second bank do not directly follow the values for the first bank on 2mb devices...
1264             if (sector >= 12) sector += 4;
1265
1266             write_flash_cr_snb(sl, sector);
1267         }
1268
1269         /* start erase operation */
1270         set_flash_cr_strt(sl);
1271
1272         /* wait for completion */
1273         wait_flash_busy(sl);
1274
1275         /* relock the flash */
1276         //todo: fails to program if this is in
1277         lock_flash(sl);
1278 #if DEBUG_FLASH
1279         fprintf(stdout, "Erase Final CR:0x%x\n", read_flash_cr(sl));
1280 #endif
1281     } else if (sl->flash_type == FLASH_TYPE_L0) {
1282
1283         uint32_t val;
1284         uint32_t flash_regs_base;
1285         if (sl->chip_id == STM32_CHIPID_L0 || sl->chip_id == STM32_CHIPID_L0_CAT5) {
1286             flash_regs_base = STM32L0_FLASH_REGS_ADDR;
1287         } else {
1288             flash_regs_base = STM32L_FLASH_REGS_ADDR;
1289         }
1290
1291         /* check if the locks are set */
1292         stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF, &val);
1293         if((val & (1<<0))||(val & (1<<1))) {
1294             /* disable pecr protection */
1295             stlink_write_debug32(sl, flash_regs_base + FLASH_PEKEYR_OFF, 0x89abcdef);
1296             stlink_write_debug32(sl, flash_regs_base + FLASH_PEKEYR_OFF, 0x02030405);
1297
1298             /* check pecr.pelock is cleared */
1299             stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF, &val);
1300             if (val & (1 << 0)) {
1301                 WLOG("pecr.pelock not clear (%#x)\n", val);
1302                 return -1;
1303             }
1304
1305             /* unlock program memory */
1306             stlink_write_debug32(sl, flash_regs_base + FLASH_PRGKEYR_OFF, 0x8c9daebf);
1307             stlink_write_debug32(sl, flash_regs_base + FLASH_PRGKEYR_OFF, 0x13141516);
1308
1309             /* check pecr.prglock is cleared */
1310             stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF, &val);
1311             if (val & (1 << 1)) {
1312                 WLOG("pecr.prglock not clear (%#x)\n", val);
1313                 return -1;
1314             }
1315         }
1316
1317         /* set pecr.{erase,prog} */
1318         val |= (1 << 9) | (1 << 3);
1319         stlink_write_debug32(sl, flash_regs_base + FLASH_PECR_OFF, val);
1320 #if 0 /* fix_to_be_confirmed */
1321
1322         /* wait for sr.busy to be cleared
1323          * MP: Test shows that busy bit is not set here. Perhaps, PM0062 is
1324          * wrong and we do not need to wait here for clearing the busy bit.
1325          * TEXANE: ok, if experience says so and it works for you, we comment
1326          * it. If someone has a problem, please drop an email.
1327          */
1328         do {
1329             stlink_read_debug32(sl, STM32L_FLASH_SR, &val)
1330         } while((val & (1 << 0)) != 0);
1331
1332 #endif /* fix_to_be_confirmed */
1333
1334         /* write 0 to the first word of the page to be erased */
1335         stlink_write_debug32(sl, flashaddr, 0);
1336
1337         /* MP: It is better to wait for clearing the busy bit after issuing
1338            page erase command, even though PM0062 recommends to wait before it.
1339            Test shows that a few iterations is performed in the following loop
1340            before busy bit is cleared.*/
1341         do {
1342             stlink_read_debug32(sl, flash_regs_base + FLASH_SR_OFF, &val);
1343         } while ((val & (1 << 0)) != 0);
1344
1345         /* reset lock bits */
1346         stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF, &val);
1347         val |= (1 << 0) | (1 << 1) | (1 << 2);
1348         stlink_write_debug32(sl, flash_regs_base + FLASH_PECR_OFF, val);
1349     } else if (sl->flash_type == FLASH_TYPE_F0)  {
1350         /* wait for ongoing op to finish */
1351         wait_flash_busy(sl);
1352
1353         /* unlock if locked */
1354         unlock_flash_if(sl);
1355
1356         /* set the page erase bit */
1357         set_flash_cr_per(sl);
1358
1359         /* select the page to erase */
1360         write_flash_ar(sl, flashaddr);
1361
1362         /* start erase operation, reset by hw with bsy bit */
1363         set_flash_cr_strt(sl);
1364
1365         /* wait for completion */
1366         wait_flash_busy(sl);
1367
1368         /* relock the flash */
1369         lock_flash(sl);
1370     } else {
1371         WLOG("unknown coreid %x, page erase failed\n", sl->core_id);
1372         return -1;
1373     }
1374
1375     /* todo: verify the erased page */
1376
1377     return 0;
1378 }
1379
1380 int stlink_erase_flash_mass(stlink_t *sl) {
1381     if (sl->flash_type == FLASH_TYPE_L0) {
1382         /* erase each page */
1383         int i = 0, num_pages = sl->flash_size/sl->flash_pgsz;
1384         for (i = 0; i < num_pages; i++) {
1385             /* addr must be an addr inside the page */
1386             stm32_addr_t addr = sl->flash_base + i * sl->flash_pgsz;
1387             if (stlink_erase_flash_page(sl, addr) == -1) {
1388                 WLOG("Failed to erase_flash_page(%#zx) == -1\n", addr);
1389                 return -1;
1390             }
1391             fprintf(stdout,"-> Flash page at %5d/%5d erased\n", i, num_pages);
1392             fflush(stdout);
1393         }
1394         fprintf(stdout, "\n");
1395     } else {
1396         /* wait for ongoing op to finish */
1397         wait_flash_busy(sl);
1398
1399         /* unlock if locked */
1400         unlock_flash_if(sl);
1401
1402         /* set the mass erase bit */
1403         set_flash_cr_mer(sl);
1404
1405         /* start erase operation, reset by hw with bsy bit */
1406         set_flash_cr_strt(sl);
1407
1408         /* wait for completion */
1409         wait_flash_busy_progress(sl);
1410
1411         /* relock the flash */
1412         lock_flash(sl);
1413
1414         /* todo: verify the erased memory */
1415     }
1416     return 0;
1417 }
1418
1419 int init_flash_loader(stlink_t *sl, flash_loader_t* fl) {
1420     size_t size;
1421
1422     /* allocate the loader in sram */
1423     if (write_loader_to_sram(sl, &fl->loader_addr, &size) == -1) {
1424         WLOG("Failed to write flash loader to sram!\n");
1425         return -1;
1426     }
1427
1428     /* allocate a one page buffer in sram right after loader */
1429     fl->buf_addr = fl->loader_addr + size;
1430     ILOG("Successfully loaded flash loader in sram\n");
1431     return 0;
1432 }
1433
1434 int write_loader_to_sram(stlink_t *sl, stm32_addr_t* addr, size_t* size) {
1435     /* from openocd, contrib/loaders/flash/stm32.s */
1436     static const uint8_t loader_code_stm32vl[] = {
1437         0x08, 0x4c, /* ldr      r4, STM32_FLASH_BASE */
1438         0x1c, 0x44, /* add      r4, r3 */
1439         /* write_half_word: */
1440         0x01, 0x23, /* movs     r3, #0x01 */
1441         0x23, 0x61, /* str      r3, [r4, #STM32_FLASH_CR_OFFSET] */
1442         0x30, 0xf8, 0x02, 0x3b, /* ldrh r3, [r0], #0x02 */
1443         0x21, 0xf8, 0x02, 0x3b, /* strh r3, [r1], #0x02 */
1444         /* busy: */
1445         0xe3, 0x68, /* ldr      r3, [r4, #STM32_FLASH_SR_OFFSET] */
1446         0x13, 0xf0, 0x01, 0x0f, /* tst  r3, #0x01 */
1447         0xfb, 0xd0, /* beq      busy */
1448         0x13, 0xf0, 0x14, 0x0f, /* tst  r3, #0x14 */
1449         0x01, 0xd1, /* bne      exit */
1450         0x01, 0x3a, /* subs     r2, r2, #0x01 */
1451         0xf0, 0xd1, /* bne      write_half_word */
1452         /* exit: */
1453         0x00, 0xbe, /* bkpt     #0x00 */
1454         0x00, 0x20, 0x02, 0x40, /* STM32_FLASH_BASE: .word 0x40022000 */
1455     };
1456
1457     /* flashloaders/stm32f0.s -- thumb1 only, same sequence as for STM32VL, bank ignored */
1458     static const uint8_t loader_code_stm32f0[] = {
1459 #if 1
1460         /*
1461          * These two NOPs here are a safety precaution, added by Pekka Nikander
1462          * while debugging the STM32F05x support.  They may not be needed, but
1463          * there were strange problems with simpler programs, like a program
1464          * that had just a breakpoint or a program that first moved zero to register r2
1465          * and then had a breakpoint.  So, it appears safest to have these two nops.
1466          *
1467          * Feel free to remove them, if you dare, but then please do test the result
1468          * rigorously.  Also, if you remove these, it may be a good idea first to
1469          * #if 0 them out, with a comment when these were taken out, and to remove
1470          * these only a few months later...  But YMMV.
1471          */
1472         0x00, 0x30, //     nop     /* add r0,#0 */
1473         0x00, 0x30, //     nop     /* add r0,#0 */
1474 #endif
1475         0x0A, 0x4C, //     ldr     r4, STM32_FLASH_BASE
1476         0x01, 0x25, //     mov     r5, #1            /*  FLASH_CR_PG, FLASH_SR_BUSY */
1477         0x04, 0x26, //     mov     r6, #4            /*  PGERR  */
1478         // write_half_word:
1479         0x23, 0x69, //     ldr     r3, [r4, #16]     /*  FLASH->CR   */
1480         0x2B, 0x43, //     orr     r3, r5
1481         0x23, 0x61, //     str     r3, [r4, #16]     /*  FLASH->CR |= FLASH_CR_PG */
1482         0x03, 0x88, //     ldrh    r3, [r0]          /*  r3 = *sram */
1483         0x0B, 0x80, //     strh    r3, [r1]          /*  *flash = r3 */
1484         // busy:
1485         0xE3, 0x68, //     ldr     r3, [r4, #12]     /*  FLASH->SR  */
1486         0x2B, 0x42, //     tst     r3, r5            /*  FLASH_SR_BUSY  */
1487         0xFC, 0xD0, //     beq     busy
1488
1489         0x33, 0x42, //     tst     r3, r6            /*  PGERR  */
1490         0x04, 0xD1, //     bne     exit
1491
1492         0x02, 0x30, //     add     r0, r0, #2        /*  sram += 2  */
1493         0x02, 0x31, //     add     r1, r1, #2        /*  flash += 2  */
1494         0x01, 0x3A, //     sub     r2, r2, #0x01     /*  count--  */
1495         0x00, 0x2A, //     cmp     r2, #0
1496         0xF0, 0xD1, //     bne     write_half_word
1497         // exit:
1498         0x23, 0x69, //     ldr     r3, [r4, #16]     /*  FLASH->CR  */
1499         0xAB, 0x43, //     bic     r3, r5
1500         0x23, 0x61, //     str     r3, [r4, #16]     /*  FLASH->CR &= ~FLASH_CR_PG  */
1501         0x00, 0xBE, //     bkpt #0x00
1502         0x00, 0x20, 0x02, 0x40, /* STM32_FLASH_BASE: .word 0x40022000 */
1503     };
1504
1505     static const uint8_t loader_code_stm32l[] = {
1506
1507         /* openocd.git/contrib/loaders/flash/stm32lx.S
1508            r0, input, dest addr
1509            r1, input, source addr
1510            r2, input, word count
1511            r3, output, word count
1512            */
1513
1514         0x00, 0x23,
1515         0x04, 0xe0,
1516
1517         0x51, 0xf8, 0x04, 0xcb,
1518         0x40, 0xf8, 0x04, 0xcb,
1519         0x01, 0x33,
1520
1521         0x93, 0x42,
1522         0xf8, 0xd3,
1523         0x00, 0xbe
1524     };
1525
1526     static const uint8_t loader_code_stm32l0[] = {
1527
1528         /*
1529            r0, input, dest addr
1530            r1, input, source addr
1531            r2, input, word count
1532            r3, output, word count
1533          */
1534
1535         0x00, 0x23,
1536         0x04, 0xe0,
1537
1538         0x0c, 0x68,
1539         0x04, 0x60,
1540         0x01, 0x33,
1541         0x04, 0x31,
1542         0x04, 0x30,
1543
1544         0x93, 0x42,
1545         0xf8, 0xd3,
1546         0x00, 0xbe
1547     };
1548
1549     static const uint8_t loader_code_stm32f4[] = {
1550         // flashloaders/stm32f4.s
1551
1552         0x07, 0x4b,
1553
1554         0x62, 0xb1,
1555         0x04, 0x68,
1556         0x0c, 0x60,
1557
1558         0xdc, 0x89,
1559         0x14, 0xf0, 0x01, 0x0f,
1560         0xfb, 0xd1,
1561         0x00, 0xf1, 0x04, 0x00,
1562         0x01, 0xf1, 0x04, 0x01,
1563         0xa2, 0xf1, 0x01, 0x02,
1564         0xf1, 0xe7,
1565
1566         0x00, 0xbe,
1567
1568         0x00, 0x3c, 0x02, 0x40,
1569     };
1570
1571     static const uint8_t loader_code_stm32f4_lv[] = {
1572         // flashloaders/stm32f4lv.s
1573         0x92, 0x00,
1574
1575         0x08, 0x4b,
1576         0x62, 0xb1,
1577         0x04, 0x78,
1578         0x0c, 0x70,
1579
1580         0xdc, 0x89,
1581         0x14, 0xf0, 0x01, 0x0f,
1582         0xfb, 0xd1,
1583         0x00, 0xf1, 0x01, 0x00,
1584         0x01, 0xf1, 0x01, 0x01,
1585         0xa2, 0xf1, 0x01, 0x02,
1586         0xf1, 0xe7,
1587
1588         0x00, 0xbe,
1589         0x00, 0xbf,
1590
1591         0x00, 0x3c, 0x02, 0x40,
1592     };
1593
1594     static const uint8_t loader_code_stm32l4[] = {
1595         // flashloaders/stm32l4.s
1596         0x08, 0x4b,             // start: ldr   r3, [pc, #32] ; <flash_base>
1597         0x72, 0xb1,             // next:  cbz   r2, <done>
1598         0x04, 0x68,             //        ldr   r4, [r0, #0]
1599         0x45, 0x68,             //        ldr   r5, [r0, #4]
1600         0x0c, 0x60,             //        str   r4, [r1, #0]
1601         0x4d, 0x60,             //        str   r5, [r1, #4]
1602         0x5c, 0x8a,             // wait:  ldrh  r4, [r3, #18]
1603         0x14, 0xf0, 0x01, 0x0f, //        tst.w r4, #1
1604         0xfb, 0xd1,             //        bne.n <wait>
1605         0x00, 0xf1, 0x08, 0x00, //        add.w r0, r0, #8
1606         0x01, 0xf1, 0x08, 0x01, //        add.w r1, r1, #8
1607         0xa2, 0xf1, 0x02, 0x02, //        add.w r2, r2, #2
1608         0xef, 0xe7,             //        b.n   <next>
1609         0x00, 0xbe,             // done:  bkpt  0x0000
1610         0x00, 0x20, 0x02, 0x40  // flash_base:  .word 0x40022000
1611     };
1612
1613         static const uint8_t loader_code_stm32f7[] = {
1614         0x08, 0x4b,
1615         0x72, 0xb1,
1616         0x04, 0x68,
1617         0x0c, 0x60,
1618         0xbf, 0xf3, 0x4f, 0x8f,        // DSB Memory barrier for in order flash write
1619         0xdc, 0x89,
1620         0x14, 0xf0, 0x01, 0x0f,
1621         0xfb, 0xd1,
1622         0x00, 0xf1, 0x04, 0x00,
1623         0x01, 0xf1, 0x04, 0x01,
1624         0xa2, 0xf1, 0x01, 0x02,
1625         0xef, 0xe7,
1626         0x00, 0xbe,                   //     bkpt       #0x00
1627         0x00, 0x3c, 0x02, 0x40,
1628     };
1629
1630     const uint8_t* loader_code;
1631     size_t loader_size;
1632
1633     if (sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_CAT2
1634             || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS || sl->chip_id == STM32_CHIPID_L1_HIGH
1635             || sl->chip_id == STM32_CHIPID_L152_RE) { /* stm32l */
1636         loader_code = loader_code_stm32l;
1637         loader_size = sizeof(loader_code_stm32l);
1638     } else if (sl->core_id == STM32VL_CORE_ID 
1639             || sl->chip_id == STM32_CHIPID_F3
1640             || sl->chip_id == STM32_CHIPID_F3_SMALL
1641             || sl->chip_id == STM32_CHIPID_F303_HIGH
1642             || sl->chip_id == STM32_CHIPID_F37x
1643             || sl->chip_id == STM32_CHIPID_F334) {
1644         loader_code = loader_code_stm32vl;
1645         loader_size = sizeof(loader_code_stm32vl);
1646     } else if (sl->chip_id == STM32_CHIPID_F2 || sl->chip_id == STM32_CHIPID_F4 || (sl->chip_id == STM32_CHIPID_F4_DE) ||
1647             sl->chip_id == STM32_CHIPID_F4_LP || sl->chip_id == STM32_CHIPID_F4_HD || (sl->chip_id == STM32_CHIPID_F411RE) ||
1648             (sl->chip_id == STM32_CHIPID_F446) || (sl->chip_id == STM32_CHIPID_F4_DSI)){
1649         int voltage = stlink_target_voltage(sl);
1650         if (voltage == -1) {
1651             printf("Failed to read Target voltage\n");
1652             return voltage;
1653         } else if (voltage > 2700) {
1654             loader_code = loader_code_stm32f4;
1655             loader_size = sizeof(loader_code_stm32f4);
1656         } else {
1657             loader_code = loader_code_stm32f4_lv;
1658             loader_size = sizeof(loader_code_stm32f4_lv);
1659         }
1660     } else if (sl->chip_id == STM32_CHIPID_F7){
1661         loader_code = loader_code_stm32f7;
1662         loader_size = sizeof(loader_code_stm32f7);
1663     } else if (sl->chip_id == STM32_CHIPID_F0 || sl->chip_id == STM32_CHIPID_F04 || sl->chip_id == STM32_CHIPID_F0_CAN || sl->chip_id == STM32_CHIPID_F0_SMALL || sl->chip_id == STM32_CHIPID_F09X) {
1664         loader_code = loader_code_stm32f0;
1665         loader_size = sizeof(loader_code_stm32f0);
1666     } else if (sl->chip_id == STM32_CHIPID_L0 || sl->chip_id == STM32_CHIPID_L0_CAT5) {
1667         loader_code = loader_code_stm32l0;
1668         loader_size = sizeof(loader_code_stm32l0);
1669     } else if (sl->chip_id == STM32_CHIPID_L4) {
1670         loader_code = loader_code_stm32l4;
1671         loader_size = sizeof(loader_code_stm32l4);
1672     } else {
1673         ELOG("unknown coreid, not sure what flash loader to use, aborting!: %x\n", sl->core_id);
1674         return -1;
1675     }
1676
1677     memcpy(sl->q_buf, loader_code, loader_size);
1678     stlink_write_mem32(sl, sl->sram_base, loader_size);
1679
1680     *addr = sl->sram_base;
1681     *size = loader_size;
1682
1683     /* success */
1684     return 0;
1685 }
1686
1687 int stlink_fcheck_flash(stlink_t *sl, const char* path, stm32_addr_t addr) {
1688     /* check the contents of path are at addr */
1689
1690     int res;
1691     mapped_file_t mf = MAPPED_FILE_INITIALIZER;
1692
1693     if (map_file(&mf, path) == -1)
1694         return -1;
1695
1696     res = check_file(sl, &mf, addr);
1697
1698     unmap_file(&mf);
1699
1700     return res;
1701 }
1702
1703 /**
1704  * Verify addr..addr+len is binary identical to base...base+len
1705  * @param sl stlink context
1706  * @param address stm device address
1707  * @param data host side buffer to check against
1708  * @param length how much
1709  * @return 0 for success, -ve for failure
1710  */
1711 int stlink_verify_write_flash(stlink_t *sl, stm32_addr_t address, uint8_t *data, unsigned length) {
1712     size_t off;
1713     size_t cmp_size = (sl->flash_pgsz > 0x1800)? 0x1800:sl->flash_pgsz;
1714     ILOG("Starting verification of write complete\n");
1715     for (off = 0; off < length; off += cmp_size) {
1716         size_t aligned_size;
1717
1718         /* adjust last page size */
1719         if ((off + cmp_size) > length)
1720             cmp_size = length - off;
1721
1722         aligned_size = cmp_size;
1723         if (aligned_size & (4 - 1))
1724             aligned_size = (cmp_size + 4) & ~(4 - 1);
1725
1726         stlink_read_mem32(sl, address + off, aligned_size);
1727
1728         if (memcmp(sl->q_buf, data + off, cmp_size)) {
1729             ELOG("Verification of flash failed at offset: %zd\n", off);
1730             return -1;
1731         }
1732     }
1733     ILOG("Flash written and verified! jolly good!\n");
1734     return 0;
1735
1736 }
1737
1738 int stm32l1_write_half_pages(stlink_t *sl, stm32_addr_t addr, uint8_t* base, uint32_t len, uint32_t pagesize)
1739 {
1740     unsigned int count;
1741     unsigned int num_half_pages = len / pagesize;
1742     uint32_t val;
1743     uint32_t flash_regs_base;
1744     flash_loader_t fl;
1745
1746     if (sl->chip_id == STM32_CHIPID_L0 || sl->chip_id == STM32_CHIPID_L0_CAT5) {
1747         flash_regs_base = STM32L0_FLASH_REGS_ADDR;
1748     } else {
1749         flash_regs_base = STM32L_FLASH_REGS_ADDR;
1750     }
1751
1752     ILOG("Starting Half page flash write for STM32L core id\n");
1753     /* flash loader initialization */
1754     if (init_flash_loader(sl, &fl) == -1) {
1755         WLOG("init_flash_loader() == -1\n");
1756         return -1;
1757     }
1758     /* Unlock already done */
1759     stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF, &val);
1760     val |= (1 << FLASH_L1_FPRG);
1761     stlink_write_debug32(sl, flash_regs_base + FLASH_PECR_OFF, val);
1762
1763     val |= (1 << FLASH_L1_PROG);
1764     stlink_write_debug32(sl, flash_regs_base + FLASH_PECR_OFF, val);
1765     do {
1766         stlink_read_debug32(sl, flash_regs_base + FLASH_SR_OFF, &val);
1767     } while ((val & (1 << 0)) != 0);
1768
1769     for (count = 0; count  < num_half_pages; count ++) {
1770         if (run_flash_loader(sl, &fl, addr + count * pagesize, base + count * pagesize, pagesize) == -1) {
1771             WLOG("l1_run_flash_loader(%#zx) failed! == -1\n", addr + count * pagesize);
1772             stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF, &val);
1773             val &= ~((1 << FLASH_L1_FPRG) |(1 << FLASH_L1_PROG));
1774             stlink_write_debug32(sl, flash_regs_base + FLASH_PECR_OFF, val);
1775             return -1;
1776         }
1777         /* wait for sr.busy to be cleared */
1778         if (sl->verbose >= 1) {
1779             /* show progress. writing procedure is slow
1780                and previous errors are misleading */
1781             fprintf(stdout, "\r%3u/%u halfpages written", count + 1, num_half_pages);
1782             fflush(stdout);
1783         }
1784         do {
1785             stlink_read_debug32(sl, flash_regs_base + FLASH_SR_OFF, &val);
1786         } while ((val & (1 << 0)) != 0);
1787     }
1788     stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF, &val);
1789     val &= ~(1 << FLASH_L1_PROG);
1790     stlink_write_debug32(sl, flash_regs_base + FLASH_PECR_OFF, val);
1791     stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF, &val);
1792     val &= ~(1 << FLASH_L1_FPRG);
1793     stlink_write_debug32(sl, flash_regs_base + FLASH_PECR_OFF, val);
1794
1795     return 0;
1796 }
1797
1798 int stlink_write_flash(stlink_t *sl, stm32_addr_t addr, uint8_t* base, uint32_t len, uint8_t eraseonly) {
1799     size_t off;
1800     flash_loader_t fl;
1801     ILOG("Attempting to write %d (%#x) bytes to stm32 address: %u (%#x)\n",
1802             len, len, addr, addr);
1803     /* check addr range is inside the flash */
1804     stlink_calculate_pagesize(sl, addr);
1805     if (addr < sl->flash_base) {
1806         ELOG("addr too low %#x < %#x\n", addr, sl->flash_base);
1807         return -1;
1808     } else if ((addr + len) < addr) {
1809         ELOG("addr overruns\n");
1810         return -1;
1811     } else if ((addr + len) > (sl->flash_base + sl->flash_size)) {
1812         ELOG("addr too high\n");
1813         return -1;
1814     } else if (addr & 1) {
1815         ELOG("unaligned addr 0x%x\n", addr);
1816         return -1;
1817     } else if (len & 1) {
1818         WLOG("unaligned len 0x%x -- padding with zero\n", len);
1819         len += 1;
1820     } else if (addr & (sl->flash_pgsz - 1)) {
1821         ELOG("addr not a multiple of pagesize, not supported\n");
1822         return -1;
1823     }
1824
1825     // Make sure we've loaded the context with the chip details
1826     stlink_core_id(sl);
1827     /* erase each page */
1828     int page_count = 0;
1829     for (off = 0; off < len; off += stlink_calculate_pagesize(sl, addr + off)) {
1830         /* addr must be an addr inside the page */
1831         if (stlink_erase_flash_page(sl, addr + off) == -1) {
1832             ELOG("Failed to erase_flash_page(%#zx) == -1\n", addr + off);
1833             return -1;
1834         }
1835         fprintf(stdout,"\rFlash page at addr: 0x%08lx erased",
1836                 (unsigned long)addr + off);
1837         fflush(stdout);
1838         page_count++;
1839     }
1840     fprintf(stdout,"\n");
1841     ILOG("Finished erasing %d pages of %d (%#x) bytes\n",
1842             page_count, sl->flash_pgsz, sl->flash_pgsz);
1843
1844     if (eraseonly)
1845         return 0;
1846
1847     if ((sl->flash_type == FLASH_TYPE_F4) || (sl->flash_type == FLASH_TYPE_L4)) {
1848         /* todo: check write operation */
1849
1850         ILOG("Starting Flash write for F2/F4/L4\n");
1851         /* flash loader initialization */
1852         if (init_flash_loader(sl, &fl) == -1) {
1853             ELOG("init_flash_loader() == -1\n");
1854             return -1;
1855         }
1856
1857         /* First unlock the cr */
1858         unlock_flash_if(sl);
1859
1860         /* TODO: Check that Voltage range is 2.7 - 3.6 V */
1861         if (sl->chip_id != STM32_CHIPID_L4) {
1862             /* set parallelisim to 32 bit*/
1863             int voltage = stlink_target_voltage(sl);
1864             if (voltage == -1) {
1865                 printf("Failed to read Target voltage\n");
1866                 return voltage;
1867             } else if (voltage > 2700) {
1868                 printf("enabling 32-bit flash writes\n");
1869                 write_flash_cr_psiz(sl, 2);
1870             } else {
1871                 printf("Target voltage (%d mV) too low for 32-bit flash, using 8-bit flash writes\n", voltage);
1872                 write_flash_cr_psiz(sl, 0);
1873             }
1874         } else {
1875             /* L4 does not have a byte-write mode */
1876             int voltage = stlink_target_voltage(sl);
1877             if (voltage == -1) {
1878                 printf("Failed to read Target voltage\n");
1879                 return voltage;
1880             } else if (voltage < 1710) {
1881                 printf("Target voltage (%d mV) too low for flash writes!\n", voltage);
1882                 return -1;
1883             }
1884         }
1885
1886         /* set programming mode */
1887         set_flash_cr_pg(sl);
1888
1889         for(off = 0; off < len;) {
1890             size_t size = len - off > 0x8000 ? 0x8000 : len - off;
1891
1892             printf("size: %zu\n", size);
1893
1894             if (run_flash_loader(sl, &fl, addr + off, base + off, size) == -1) {
1895                 ELOG("run_flash_loader(%#zx) failed! == -1\n", addr + off);
1896                 return -1;
1897             }
1898
1899             off += size;
1900         }
1901
1902         /* Relock flash */
1903         lock_flash(sl);
1904
1905     }   //STM32F4END
1906
1907     else if (sl->flash_type == FLASH_TYPE_L0) {
1908         /* use fast word write. todo: half page. */
1909         uint32_t val;
1910         uint32_t flash_regs_base;
1911         uint32_t pagesize;
1912
1913         if (sl->chip_id == STM32_CHIPID_L0 || sl->chip_id == STM32_CHIPID_L0_CAT5) {
1914             flash_regs_base = STM32L0_FLASH_REGS_ADDR;
1915             pagesize = L0_WRITE_BLOCK_SIZE;
1916         } else {
1917             flash_regs_base = STM32L_FLASH_REGS_ADDR;
1918             pagesize = L1_WRITE_BLOCK_SIZE;
1919         }
1920
1921         /* todo: check write operation */
1922
1923         /* disable pecr protection */
1924         stlink_write_debug32(sl, flash_regs_base + FLASH_PEKEYR_OFF, 0x89abcdef);
1925         stlink_write_debug32(sl, flash_regs_base + FLASH_PEKEYR_OFF, 0x02030405);
1926
1927         /* check pecr.pelock is cleared */
1928         stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF, &val);
1929         if (val & (1 << 0)) {
1930             fprintf(stderr, "pecr.pelock not clear\n");
1931             return -1;
1932         }
1933
1934         /* unlock program memory */
1935         stlink_write_debug32(sl, flash_regs_base + FLASH_PRGKEYR_OFF, 0x8c9daebf);
1936         stlink_write_debug32(sl, flash_regs_base + FLASH_PRGKEYR_OFF, 0x13141516);
1937
1938         /* check pecr.prglock is cleared */
1939         stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF, &val);
1940         if (val & (1 << 1)) {
1941             fprintf(stderr, "pecr.prglock not clear\n");
1942             return -1;
1943         }
1944         off = 0;
1945         if (len > pagesize) {
1946             if (stm32l1_write_half_pages(sl, addr, base, len, pagesize) == -1) {
1947                 /* This may happen on a blank device! */
1948                 WLOG("\nwrite_half_pages failed == -1\n");
1949             } else {
1950                 off = (len / pagesize)*pagesize;
1951             }
1952         }
1953
1954         /* write remainingword in program memory */
1955         for ( ; off < len; off += sizeof(uint32_t)) {
1956             uint32_t data;
1957             if (off > 254)
1958                 fprintf(stdout, "\r");
1959
1960             if ((off % sl->flash_pgsz) > (sl->flash_pgsz -5)) {
1961                 fprintf(stdout, "\r%3zd/%3zd pages written",
1962                         off/sl->flash_pgsz, len/sl->flash_pgsz);
1963                 fflush(stdout);
1964             }
1965
1966             write_uint32((unsigned char*) &data, *(uint32_t*) (base + off));
1967             stlink_write_debug32(sl, addr + off, data);
1968
1969             /* wait for sr.busy to be cleared */
1970             do {
1971                 stlink_read_debug32(sl, flash_regs_base + FLASH_SR_OFF, &val);
1972             } while ((val & (1 << 0)) != 0);
1973
1974             /* todo: check redo write operation */
1975
1976         }
1977         fprintf(stdout, "\n");
1978         /* reset lock bits */
1979         stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF, &val);
1980         val |= (1 << 0) | (1 << 1) | (1 << 2);
1981         stlink_write_debug32(sl, flash_regs_base + FLASH_PECR_OFF, val);
1982     } else if (sl->flash_type == FLASH_TYPE_F0) {
1983         ILOG("Starting Flash write for VL/F0/F3 core id\n");
1984         /* flash loader initialization */
1985         if (init_flash_loader(sl, &fl) == -1) {
1986             ELOG("init_flash_loader() == -1\n");
1987             return -1;
1988         }
1989
1990         int write_block_count = 0;
1991         for (off = 0; off < len; off += sl->flash_pgsz) {
1992             /* adjust last write size */
1993             size_t size = sl->flash_pgsz;
1994             if ((off + sl->flash_pgsz) > len) size = len - off;
1995
1996             /* unlock and set programming mode */
1997             unlock_flash_if(sl);
1998             set_flash_cr_pg(sl);
1999             //DLOG("Finished setting flash cr pg, running loader!\n");
2000             if (run_flash_loader(sl, &fl, addr + off, base + off, size) == -1) {
2001                 ELOG("run_flash_loader(%#zx) failed! == -1\n", addr + off);
2002                 return -1;
2003             }
2004             lock_flash(sl);
2005             if (sl->verbose >= 1) {
2006                 /* show progress. writing procedure is slow
2007                    and previous errors are misleading */
2008                 fprintf(stdout, "\r%3u/%lu pages written", write_block_count++, (unsigned long)len/sl->flash_pgsz);
2009                 fflush(stdout);
2010             }
2011         }
2012         fprintf(stdout, "\n");
2013     } else {
2014         ELOG("unknown coreid, not sure how to write: %x\n", sl->core_id);
2015         return -1;
2016     }
2017
2018     return stlink_verify_write_flash(sl, addr, base, len);
2019 }
2020
2021 /**
2022  * Write the given binary file into flash at address "addr"
2023  * @param sl
2024  * @param path readable file path, should be binary image
2025  * @param addr where to start writing
2026  * @return 0 on success, -ve on failure.
2027  */
2028 int stlink_fwrite_flash(stlink_t *sl, const char* path, stm32_addr_t addr) {
2029     /* write the file in flash at addr */
2030     int err;
2031     unsigned int num_empty, index, val;
2032     unsigned char erased_pattern;
2033     mapped_file_t mf = MAPPED_FILE_INITIALIZER;
2034
2035     if (map_file(&mf, path) == -1) {
2036         ELOG("map_file() == -1\n");
2037         return -1;
2038     }
2039
2040     if (sl->flash_type == FLASH_TYPE_L0)
2041         erased_pattern = 0x00;
2042     else
2043         erased_pattern = 0xff;
2044
2045     index = mf.len;
2046     for(num_empty = 0; num_empty != mf.len; ++num_empty) {
2047         if (mf.base[--index] != erased_pattern) {
2048             break;
2049         }
2050     }
2051     /* Round down to words */
2052     num_empty -= (num_empty & 3);
2053     if(num_empty != 0) {
2054         ILOG("Ignoring %d bytes of 0x%02x at end of file\n", num_empty, erased_pattern);
2055     }
2056     err = stlink_write_flash(sl, addr, mf.base, num_empty == mf.len? mf.len : mf.len - num_empty, num_empty == mf.len);
2057     /* set stack*/
2058     stlink_read_debug32(sl, addr, &val);
2059     stlink_write_reg(sl, val, 13);
2060     /* Set PC to the reset routine*/
2061     stlink_read_debug32(sl, addr + 4, &val);
2062     stlink_write_reg(sl, val, 15);
2063     stlink_run(sl);
2064     unmap_file(&mf);
2065     return err;
2066 }
2067
2068 int run_flash_loader(stlink_t *sl, flash_loader_t* fl, stm32_addr_t target, const uint8_t* buf, size_t size) {
2069
2070     reg rr;
2071     int target_reg, source_reg, i = 0;
2072     size_t count;
2073
2074     DLOG("Running flash loader, write address:%#x, size: %zd\n", target, size);
2075     // FIXME This can never return -1
2076     if (write_buffer_to_sram(sl, fl, buf, size) == -1) {
2077         // IMPOSSIBLE!
2078         ELOG("write_buffer_to_sram() == -1\n");
2079         return -1;
2080     }
2081
2082     if (sl->flash_type == FLASH_TYPE_L0) {
2083         count = size / sizeof(uint32_t);
2084         if (size % sizeof(uint32_t))
2085             ++count;
2086         target_reg = 0;
2087         source_reg = 1;
2088     } else if (sl->flash_type == FLASH_TYPE_F0) {
2089         count = size / sizeof(uint16_t);
2090         if (size % sizeof(uint16_t))
2091             ++count;
2092         target_reg = 1;
2093         source_reg = 0;
2094     } else if (sl->flash_type == FLASH_TYPE_F4 || sl->flash_type == FLASH_TYPE_L4) {
2095         count = size / sizeof(uint32_t);
2096         if (size % sizeof(uint32_t))
2097             ++count;
2098         if (sl->chip_id == STM32_CHIPID_L4) {
2099             if (count % 2)
2100                 ++count;
2101         }
2102         target_reg = 1;
2103         source_reg = 0;
2104     } else {
2105         fprintf(stderr, "unknown coreid 0x%x, don't know what flash loader to use\n", sl->core_id);
2106         return -1;
2107     }
2108
2109     /* setup core */
2110     stlink_write_reg(sl, fl->buf_addr, source_reg); /* source */
2111     stlink_write_reg(sl, target, target_reg); /* target */
2112     stlink_write_reg(sl, count, 2); /* count */
2113     stlink_write_reg(sl, 0, 3); /* flash bank 0 (input), only used on F0, but armless fopr others */
2114     stlink_write_reg(sl, fl->loader_addr, 15); /* pc register */
2115
2116     /* run loader */
2117     stlink_run(sl);
2118
2119 #define WAIT_ROUNDS 10000
2120     /* wait until done (reaches breakpoint) */
2121     for (i = 0; i < WAIT_ROUNDS; i++) {
2122         usleep(10);
2123         if (is_core_halted(sl))
2124             break;
2125     }
2126
2127     if (i >= WAIT_ROUNDS) {
2128         ELOG("flash loader run error\n");
2129         return -1;
2130     }
2131
2132     stlink_read_all_regs(sl, &rr);
2133
2134     /* check written byte count */
2135     if (sl->flash_type == FLASH_TYPE_L0) {
2136         if (rr.r[3] != count) {
2137             fprintf(stderr, "write error, count == %u\n", rr.r[3]);
2138             return -1;
2139         }
2140     } else {
2141         if (rr.r[2] != 0) {
2142             fprintf(stderr, "write error, count == %u\n", rr.r[2]);
2143             return -1;
2144         }
2145     }
2146
2147     return 0;
2148 }