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