Merge pull request #213 from tekaikko/master
[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) || (sl->chip_id == STM32_CHIPID_F4_HD))
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) || (sl->chip_id == STM32_CHIPID_F4_HD))
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) || (sl->chip_id == STM32_CHIPID_F4_HD)) {
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) || (sl->chip_id == STM32_CHIPID_F4_HD)) {
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) || (sl->chip_id == STM32_CHIPID_F4_HD)) {
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) || (sl->chip_id == STM32_CHIPID_F4_HD))
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) || (sl->chip_id == STM32_CHIPID_F4_HD))
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) || (sl->chip_id == STM32_CHIPID_F4_HD))
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) || (sl->chip_id == STM32_CHIPID_F4_HD)) {
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) || (sl->chip_id == STM32_CHIPID_F4_HD))
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) || (sl->chip_id == STM32_CHIPID_F4_HD))
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     uint32_t flash_size;
438
439     sl->chip_id = chip_id & 0xfff;
440     /* Fix chip_id for F4 rev A errata , Read CPU ID, as CoreID is the same for F2/F4*/
441     if (sl->chip_id == 0x411) {
442         uint32_t cpuid = stlink_read_debug32(sl, 0xE000ED00);
443         if ((cpuid  & 0xfff0) == 0xc240)
444             sl->chip_id = 0x413;
445     }
446
447     for (size_t i = 0; i < sizeof(devices) / sizeof(devices[0]); i++) {
448         if(devices[i].chip_id == sl->chip_id) {
449             params = &devices[i];
450             break;
451         }
452     }
453     if (params == NULL) {
454         WLOG("unknown chip id! %#x\n", chip_id);
455         return -1;
456     }
457
458     // These are fixed...
459     sl->flash_base = STM32_FLASH_BASE;
460     sl->sram_base = STM32_SRAM_BASE;
461     flash_size = stlink_read_debug32(sl,(params->flash_size_reg) & ~3);
462     if (params->flash_size_reg & 2)
463         flash_size = flash_size >>16;
464     flash_size = flash_size & 0xffff;
465
466     if ((sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS) && ( flash_size == 0 )) {
467             sl->flash_size = 128 * 1024;
468     } else if ((sl->chip_id & 0xFFF) == STM32_CHIPID_L1_HIGH) {
469         // 0 is 384k and 1 is 256k
470         if ( flash_size == 0 ) {
471             sl->flash_size = 384 * 1024;
472         } else {
473             sl->flash_size = 256 * 1024;
474         }
475     } else {
476         sl->flash_size = flash_size * 1024;
477     }
478     sl->flash_pgsz = params->flash_pagesize;
479     sl->sram_size = params->sram_size;
480     sl->sys_base = params->bootrom_base;
481     sl->sys_size = params->bootrom_size;
482
483     ILOG("Device connected is: %s, id %#x\n", params->description, chip_id);
484     // TODO make note of variable page size here.....
485     ILOG("SRAM size: %#x bytes (%d KiB), Flash: %#x bytes (%d KiB) in pages of %zd bytes\n",
486         sl->sram_size, sl->sram_size / 1024, sl->flash_size, sl->flash_size / 1024,
487         sl->flash_pgsz);
488     return 0;
489 }
490
491 void stlink_reset(stlink_t *sl) {
492     DLOG("*** stlink_reset ***\n");
493     sl->backend->reset(sl);
494 }
495
496 void stlink_jtag_reset(stlink_t *sl, int value) {
497     DLOG("*** stlink_jtag_reset ***\n");
498     sl->backend->jtag_reset(sl, value);
499 }
500
501 void stlink_run(stlink_t *sl) {
502     DLOG("*** stlink_run ***\n");
503     sl->backend->run(sl);
504 }
505
506 void stlink_status(stlink_t *sl) {
507     DLOG("*** stlink_status ***\n");
508     sl->backend->status(sl);
509     stlink_core_stat(sl);
510 }
511
512 /**
513  * Decode the version bits, originally from -sg, verified with usb
514  * @param sl stlink context, assumed to contain valid data in the buffer
515  * @param slv output parsed version object
516  */
517 void _parse_version(stlink_t *sl, stlink_version_t *slv) {
518     uint32_t b0 = sl->q_buf[0]; //lsb
519     uint32_t b1 = sl->q_buf[1];
520     uint32_t b2 = sl->q_buf[2];
521     uint32_t b3 = sl->q_buf[3];
522     uint32_t b4 = sl->q_buf[4];
523     uint32_t b5 = sl->q_buf[5]; //msb
524
525     // b0 b1                       || b2 b3  | b4 b5
526     // 4b        | 6b     | 6b     || 2B     | 2B
527     // stlink_v  | jtag_v | swim_v || st_vid | stlink_pid
528
529     slv->stlink_v = (b0 & 0xf0) >> 4;
530     slv->jtag_v = ((b0 & 0x0f) << 2) | ((b1 & 0xc0) >> 6);
531     slv->swim_v = b1 & 0x3f;
532     slv->st_vid = (b3 << 8) | b2;
533     slv->stlink_pid = (b5 << 8) | b4;
534     return;
535 }
536
537 void stlink_version(stlink_t *sl) {
538     DLOG("*** looking up stlink version\n");
539     sl->backend->version(sl);
540     _parse_version(sl, &sl->version);
541
542     DLOG("st vid         = 0x%04x (expect 0x%04x)\n", sl->version.st_vid, USB_ST_VID);
543     DLOG("stlink pid     = 0x%04x\n", sl->version.stlink_pid);
544     DLOG("stlink version = 0x%x\n", sl->version.stlink_v);
545     DLOG("jtag version   = 0x%x\n", sl->version.jtag_v);
546     DLOG("swim version   = 0x%x\n", sl->version.swim_v);
547     if (sl->version.jtag_v == 0) {
548         DLOG("    notice: the firmware doesn't support a jtag/swd interface\n");
549     }
550     if (sl->version.swim_v == 0) {
551         DLOG("    notice: the firmware doesn't support a swim interface\n");
552     }
553 }
554
555 int stlink_target_voltage(stlink_t *sl) {
556     int voltage = -1;
557     DLOG("*** reading target voltage\n");
558     if (sl->backend->target_voltage != NULL) {
559         voltage = sl->backend->target_voltage(sl);
560         if (voltage != -1) {
561             DLOG("target voltage = %ldmV\n", voltage);
562         } else {
563             DLOG("error reading target voltage\n");
564         }
565     } else {
566         DLOG("reading voltage not supported by backend\n");
567     }
568     return voltage;
569 }
570
571 uint32_t stlink_read_debug32(stlink_t *sl, uint32_t addr) {
572     uint32_t data = sl->backend->read_debug32(sl, addr);
573     DLOG("*** stlink_read_debug32 %x is %#x\n", data, addr);
574     return data;
575 }
576
577 void stlink_write_debug32(stlink_t *sl, uint32_t addr, uint32_t data) {
578     DLOG("*** stlink_write_debug32 %x to %#x\n", data, addr);
579     sl->backend->write_debug32(sl, addr, data);
580 }
581
582 void stlink_write_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
583     DLOG("*** stlink_write_mem32 %u bytes to %#x\n", len, addr);
584     if (len % 4 != 0) {
585         fprintf(stderr, "Error: Data length doesn't have a 32 bit alignment: +%d byte.\n", len % 4);
586         abort();
587     }
588     sl->backend->write_mem32(sl, addr, len);
589 }
590
591 void stlink_read_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
592     DLOG("*** stlink_read_mem32 ***\n");
593     if (len % 4 != 0) { // !!! never ever: fw gives just wrong values
594         fprintf(stderr, "Error: Data length doesn't have a 32 bit alignment: +%d byte.\n",
595                 len % 4);
596         abort();
597     }
598     sl->backend->read_mem32(sl, addr, len);
599 }
600
601 void stlink_write_mem8(stlink_t *sl, uint32_t addr, uint16_t len) {
602     DLOG("*** stlink_write_mem8 ***\n");
603     if (len > 0x40 ) { // !!! never ever: Writing more then 0x40 bytes gives unexpected behaviour
604         fprintf(stderr, "Error: Data length > 64: +%d byte.\n",
605                 len);
606         abort();
607     }
608     sl->backend->write_mem8(sl, addr, len);
609 }
610
611 void stlink_read_all_regs(stlink_t *sl, reg *regp) {
612     DLOG("*** stlink_read_all_regs ***\n");
613     sl->backend->read_all_regs(sl, regp);
614 }
615
616 void stlink_read_all_unsupported_regs(stlink_t *sl, reg *regp) {
617     DLOG("*** stlink_read_all_unsupported_regs ***\n");
618     sl->backend->read_all_unsupported_regs(sl, regp);
619 }
620
621 void stlink_write_reg(stlink_t *sl, uint32_t reg, int idx) {
622     DLOG("*** stlink_write_reg\n");
623     sl->backend->write_reg(sl, reg, idx);
624 }
625
626 void stlink_read_reg(stlink_t *sl, int r_idx, reg *regp) {
627     DLOG("*** stlink_read_reg\n");
628     DLOG(" (%d) ***\n", r_idx);
629
630     if (r_idx > 20 || r_idx < 0) {
631         fprintf(stderr, "Error: register index must be in [0..20]\n");
632         return;
633     }
634
635     sl->backend->read_reg(sl, r_idx, regp);
636 }
637
638 void stlink_read_unsupported_reg(stlink_t *sl, int r_idx, reg *regp) {
639     int r_convert;
640
641     DLOG("*** stlink_read_unsupported_reg\n");
642     DLOG(" (%d) ***\n", r_idx);
643
644     /* Convert to values used by DCRSR */
645     if (r_idx >= 0x1C && r_idx <= 0x1F) { /* primask, basepri, faultmask, or control */
646         r_convert = 0x14;
647     } else if (r_idx == 0x40) {     /* FPSCR */
648         r_convert = 0x21;
649     } else if (r_idx >= 0x20 && r_idx < 0x40) {
650         r_convert = 0x40 + (r_idx - 0x20);
651     } else {
652         fprintf(stderr, "Error: register address must be in [0x1C..0x40]\n");
653         return;
654     }
655
656     sl->backend->read_unsupported_reg(sl, r_convert, regp);
657 }
658
659 void stlink_write_unsupported_reg(stlink_t *sl, uint32_t val, int r_idx, reg *regp) {
660     int r_convert;
661
662     DLOG("*** stlink_write_unsupported_reg\n");
663     DLOG(" (%d) ***\n", r_idx);
664
665     /* Convert to values used by DCRSR */
666     if (r_idx >= 0x1C && r_idx <= 0x1F) { /* primask, basepri, faultmask, or control */
667         r_convert = r_idx;  /* The backend function handles this */
668     } else if (r_idx == 0x40) {     /* FPSCR */
669         r_convert = 0x21;
670     } else if (r_idx >= 0x20 && r_idx < 0x40) {
671         r_convert = 0x40 + (r_idx - 0x20);
672     } else {
673         fprintf(stderr, "Error: register address must be in [0x1C..0x40]\n");
674         return;
675     }
676
677     sl->backend->write_unsupported_reg(sl, val, r_convert, regp);
678 }
679
680 unsigned int is_core_halted(stlink_t *sl) {
681     /* return non zero if core is halted */
682     stlink_status(sl);
683     return sl->q_buf[0] == STLINK_CORE_HALTED;
684 }
685
686 void stlink_step(stlink_t *sl) {
687     DLOG("*** stlink_step ***\n");
688     sl->backend->step(sl);
689 }
690
691 int stlink_current_mode(stlink_t *sl) {
692     int mode = sl->backend->current_mode(sl);
693     switch (mode) {
694         case STLINK_DEV_DFU_MODE:
695             DLOG("stlink current mode: dfu\n");
696             return mode;
697         case STLINK_DEV_DEBUG_MODE:
698             DLOG("stlink current mode: debug (jtag or swd)\n");
699             return mode;
700         case STLINK_DEV_MASS_MODE:
701             DLOG("stlink current mode: mass\n");
702             return mode;
703     }
704     DLOG("stlink mode: unknown!\n");
705     return STLINK_DEV_UNKNOWN_MODE;
706 }
707
708
709
710
711 // End of delegates....  Common code below here...
712
713 // Endianness
714 // http://www.ibm.com/developerworks/aix/library/au-endianc/index.html
715 // const int i = 1;
716 // #define is_bigendian() ( (*(char*)&i) == 0 )
717
718 inline unsigned int is_bigendian(void) {
719     static volatile const unsigned int i = 1;
720     return *(volatile const char*) &i == 0;
721 }
722
723 uint16_t read_uint16(const unsigned char *c, const int pt) {
724     uint32_t ui;
725     char *p = (char *) &ui;
726
727     if (!is_bigendian()) { // le -> le (don't swap)
728         p[0] = c[pt + 0];
729         p[1] = c[pt + 1];
730     } else {
731         p[0] = c[pt + 1];
732         p[1] = c[pt + 0];
733     }
734     return ui;
735 }
736
737 // same as above with entrypoint.
738
739 void stlink_run_at(stlink_t *sl, stm32_addr_t addr) {
740     stlink_write_reg(sl, addr, 15); /* pc register */
741
742     stlink_run(sl);
743
744     while (is_core_halted(sl) == 0)
745         usleep(3000000);
746 }
747
748 void stlink_core_stat(stlink_t *sl) {
749     if (sl->q_len <= 0)
750         return;
751
752     switch (sl->q_buf[0]) {
753         case STLINK_CORE_RUNNING:
754             sl->core_stat = STLINK_CORE_RUNNING;
755             DLOG("  core status: running\n");
756             return;
757         case STLINK_CORE_HALTED:
758             sl->core_stat = STLINK_CORE_HALTED;
759             DLOG("  core status: halted\n");
760             return;
761         default:
762             sl->core_stat = STLINK_CORE_STAT_UNKNOWN;
763             fprintf(stderr, "  core status: unknown\n");
764     }
765 }
766
767 void stlink_print_data(stlink_t * sl) {
768     if (sl->q_len <= 0 || sl->verbose < UDEBUG)
769         return;
770     if (sl->verbose > 2)
771         fprintf(stdout, "data_len = %d 0x%x\n", sl->q_len, sl->q_len);
772
773     for (int i = 0; i < sl->q_len; i++) {
774         if (i % 16 == 0) {
775             /*
776                                     if (sl->q_data_dir == Q_DATA_OUT)
777                                             fprintf(stdout, "\n<- 0x%08x ", sl->q_addr + i);
778                                     else
779                                             fprintf(stdout, "\n-> 0x%08x ", sl->q_addr + i);
780              */
781         }
782         fprintf(stdout, " %02x", (unsigned int) sl->q_buf[i]);
783     }
784     fputs("\n\n", stdout);
785 }
786
787 /* memory mapped file */
788
789 typedef struct mapped_file {
790     uint8_t* base;
791     size_t len;
792 } mapped_file_t;
793
794 #define MAPPED_FILE_INITIALIZER { NULL, 0 }
795
796 static int map_file(mapped_file_t* mf, const char* path) {
797     int error = -1;
798     struct stat st;
799
800     const int fd = open(path, O_RDONLY | O_BINARY);
801     if (fd == -1) {
802         fprintf(stderr, "open(%s) == -1\n", path);
803         return -1;
804     }
805
806     if (fstat(fd, &st) == -1) {
807         fprintf(stderr, "fstat() == -1\n");
808         goto on_error;
809     }
810
811     mf->base = (uint8_t*) mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
812     if (mf->base == MAP_FAILED) {
813         fprintf(stderr, "mmap() == MAP_FAILED\n");
814         goto on_error;
815     }
816
817     mf->len = st.st_size;
818
819     /* success */
820     error = 0;
821
822 on_error:
823     close(fd);
824
825     return error;
826 }
827
828 static void unmap_file(mapped_file_t * mf) {
829     munmap((void*) mf->base, mf->len);
830     mf->base = (unsigned char*) MAP_FAILED;
831     mf->len = 0;
832 }
833
834 /* Limit the block size to compare to 0x1800
835    Anything larger will stall the STLINK2
836    Maybe STLINK V1 needs smaller value!*/
837 static int check_file(stlink_t* sl, mapped_file_t* mf, stm32_addr_t addr) {
838     size_t off;
839     size_t n_cmp = sl->flash_pgsz;
840     if ( n_cmp > 0x1800)
841         n_cmp = 0x1800;
842
843     for (off = 0; off < mf->len; off += n_cmp) {
844         size_t aligned_size;
845
846         /* adjust last page size */
847         size_t cmp_size = n_cmp;
848         if ((off + n_cmp) > mf->len)
849             cmp_size = mf->len - off;
850
851         aligned_size = cmp_size;
852         if (aligned_size & (4 - 1))
853             aligned_size = (cmp_size + 4) & ~(4 - 1);
854
855         stlink_read_mem32(sl, addr + off, aligned_size);
856
857         if (memcmp(sl->q_buf, mf->base + off, cmp_size))
858             return -1;
859     }
860
861     return 0;
862 }
863
864 int stlink_fwrite_sram
865 (stlink_t * sl, const char* path, stm32_addr_t addr) {
866     /* write the file in sram at addr */
867
868     int error = -1;
869     size_t off;
870     mapped_file_t mf = MAPPED_FILE_INITIALIZER;
871
872
873     if (map_file(&mf, path) == -1) {
874         fprintf(stderr, "map_file() == -1\n");
875         return -1;
876     }
877
878     /* check addr range is inside the sram */
879     if (addr < sl->sram_base) {
880         fprintf(stderr, "addr too low\n");
881         goto on_error;
882     } else if ((addr + mf.len) < addr) {
883         fprintf(stderr, "addr overruns\n");
884         goto on_error;
885     } else if ((addr + mf.len) > (sl->sram_base + sl->sram_size)) {
886         fprintf(stderr, "addr too high\n");
887         goto on_error;
888     } else if ((addr & 3) || (mf.len & 3)) {
889         /* todo */
890         fprintf(stderr, "unaligned addr or size\n");
891         goto on_error;
892     }
893     /* do the copy by 1k blocks */
894     for (off = 0; off < mf.len; off += 1024) {
895         size_t size = 1024;
896         if ((off + size) > mf.len)
897             size = mf.len - off;
898
899         memcpy(sl->q_buf, mf.base + off, size);
900
901         /* round size if needed */
902         if (size & 3)
903             size += 2;
904
905         stlink_write_mem32(sl, addr + off, size);
906     }
907
908     /* check the file ha been written */
909     if (check_file(sl, &mf, addr) == -1) {
910         fprintf(stderr, "check_file() == -1\n");
911         goto on_error;
912     }
913
914     /* success */
915     error = 0;
916     /* set stack*/
917     stlink_write_reg(sl, stlink_read_debug32(sl, addr    ),13);
918     /* Set PC to the reset routine*/
919     stlink_write_reg(sl, stlink_read_debug32(sl, addr + 4),15);
920     stlink_run(sl);
921
922 on_error:
923     unmap_file(&mf);
924     return error;
925 }
926
927 int stlink_fread(stlink_t* sl, const char* path, stm32_addr_t addr, size_t size) {
928     /* read size bytes from addr to file */
929
930     int error = -1;
931     size_t off;
932     int num_empty = 0;
933     unsigned char erased_pattern = (sl->chip_id == STM32_CHIPID_L1_MEDIUM  || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS
934                                      || sl->chip_id == STM32_CHIPID_L1_HIGH) ? 0:0xff;
935
936     const int fd = open(path, O_RDWR | O_TRUNC | O_CREAT, 00700);
937     if (fd == -1) {
938         fprintf(stderr, "open(%s) == -1\n", path);
939         return -1;
940     }
941
942     if (size <1)
943         size = sl->flash_size;
944
945     if (size > sl->flash_size)
946         size = sl->flash_size;
947
948     /* do the copy by 1k blocks */
949     for (off = 0; off < size; off += 1024) {
950         size_t read_size = 1024;
951         size_t rounded_size;
952         size_t index;
953         if ((off + read_size) > size)
954           read_size = size - off;
955
956         /* round size if needed */
957         rounded_size = read_size;
958         if (rounded_size & 3)
959           rounded_size = (rounded_size + 4) & ~(3);
960
961         stlink_read_mem32(sl, addr + off, rounded_size);
962
963         for(index = 0; index < read_size; index ++) {
964             if (sl->q_buf[index] == erased_pattern)
965                 num_empty ++;
966             else
967                 num_empty = 0;
968         }
969         if (write(fd, sl->q_buf, read_size) != (ssize_t) read_size) {
970             fprintf(stderr, "write() != read_size\n");
971             goto on_error;
972         }
973     }
974
975     /* Ignore NULL Bytes at end of file */
976     if (!ftruncate(fd, size - num_empty)) {
977         error = -1;
978     }
979
980     /* success */
981     error = 0;
982
983 on_error:
984     close(fd);
985
986     return error;
987 }
988
989 int write_buffer_to_sram(stlink_t *sl, flash_loader_t* fl, const uint8_t* buf, size_t size) {
990     /* write the buffer right after the loader */
991     size_t chunk = size & ~0x3;
992     size_t rem   = size & 0x3;
993     if (chunk) {
994         memcpy(sl->q_buf, buf, chunk);
995         stlink_write_mem32(sl, fl->buf_addr, chunk);
996     }
997     if (rem) {
998         memcpy(sl->q_buf, buf+chunk, rem);
999         stlink_write_mem8(sl, (fl->buf_addr)+chunk, rem);
1000     }
1001     return 0;
1002 }
1003
1004 uint32_t calculate_F4_sectornum(uint32_t flashaddr){
1005     flashaddr &= ~STM32_FLASH_BASE;     //Page now holding the actual flash address
1006     if (flashaddr<0x4000) return (0);
1007     else if(flashaddr<0x8000) return(1);
1008     else if(flashaddr<0xc000) return(2);
1009     else if(flashaddr<0x10000) return(3);
1010     else if(flashaddr<0x20000) return(4);
1011     else return(flashaddr/0x20000)+4;
1012
1013 }
1014
1015 uint32_t stlink_calculate_pagesize(stlink_t *sl, uint32_t flashaddr){
1016         if ((sl->chip_id == STM32_CHIPID_F2) || (sl->chip_id == STM32_CHIPID_F4) ||
1017       (sl->chip_id == STM32_CHIPID_F4_LP) || (sl->chip_id == STM32_CHIPID_F4_HD)) {
1018                 uint32_t sector=calculate_F4_sectornum(flashaddr);
1019                 if (sector<4) sl->flash_pgsz=0x4000;
1020                 else if(sector<5) sl->flash_pgsz=0x10000;
1021                 else sl->flash_pgsz=0x20000;
1022         }
1023         return (sl->flash_pgsz);
1024 }
1025
1026 /**
1027  * Erase a page of flash, assumes sl is fully populated with things like chip/core ids
1028  * @param sl stlink context
1029  * @param flashaddr an address in the flash page to erase
1030  * @return 0 on success -ve on failure
1031  */
1032 int stlink_erase_flash_page(stlink_t *sl, stm32_addr_t flashaddr)
1033 {
1034   if ((sl->chip_id == STM32_CHIPID_F2) || (sl->chip_id == STM32_CHIPID_F4) ||
1035       (sl->chip_id == STM32_CHIPID_F4_LP) || (sl->chip_id == STM32_CHIPID_F4_HD)) {
1036     /* wait for ongoing op to finish */
1037     wait_flash_busy(sl);
1038
1039     /* unlock if locked */
1040     unlock_flash_if(sl);
1041
1042     /* select the page to erase */
1043     // calculate the actual page from the address
1044     uint32_t sector=calculate_F4_sectornum(flashaddr);
1045
1046     fprintf(stderr, "EraseFlash - Sector:0x%x Size:0x%x\n", sector, stlink_calculate_pagesize(sl, flashaddr));
1047     write_flash_cr_snb(sl, sector);
1048
1049     /* start erase operation */
1050     set_flash_cr_strt(sl);
1051
1052     /* wait for completion */
1053     wait_flash_busy(sl);
1054
1055     /* relock the flash */
1056     //todo: fails to program if this is in
1057     lock_flash(sl);
1058 #if DEBUG_FLASH
1059         fprintf(stdout, "Erase Final CR:0x%x\n", read_flash_cr(sl));
1060 #endif
1061   } else if (sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS
1062                 || sl->chip_id == STM32_CHIPID_L1_HIGH) {
1063
1064     uint32_t val;
1065
1066     /* check if the locks are set */
1067     val = stlink_read_debug32(sl, STM32L_FLASH_PECR);
1068     if((val & (1<<0))||(val & (1<<1))) {
1069         /* disable pecr protection */
1070         stlink_write_debug32(sl, STM32L_FLASH_PEKEYR, 0x89abcdef);
1071         stlink_write_debug32(sl, STM32L_FLASH_PEKEYR, 0x02030405);
1072
1073         /* check pecr.pelock is cleared */
1074         val = stlink_read_debug32(sl, STM32L_FLASH_PECR);
1075         if (val & (1 << 0)) {
1076             WLOG("pecr.pelock not clear (%#x)\n", val);
1077             return -1;
1078         }
1079
1080         /* unlock program memory */
1081         stlink_write_debug32(sl, STM32L_FLASH_PRGKEYR, 0x8c9daebf);
1082         stlink_write_debug32(sl, STM32L_FLASH_PRGKEYR, 0x13141516);
1083
1084         /* check pecr.prglock is cleared */
1085         val = stlink_read_debug32(sl, STM32L_FLASH_PECR);
1086         if (val & (1 << 1)) {
1087             WLOG("pecr.prglock not clear (%#x)\n", val);
1088             return -1;
1089         }
1090     }
1091
1092     /* unused: unlock the option byte block */
1093 #if 0
1094     stlink_write_debug32(sl, STM32L_FLASH_OPTKEYR, 0xfbead9c8);
1095     stlink_write_debug32(sl, STM32L_FLASH_OPTKEYR, 0x24252627);
1096
1097     /* check pecr.optlock is cleared */
1098     val = stlink_read_debug32(sl, STM32L_FLASH_PECR);
1099     if (val & (1 << 2)) {
1100       fprintf(stderr, "pecr.prglock not clear\n");
1101       return -1;
1102     }
1103 #endif
1104
1105     /* set pecr.{erase,prog} */
1106     val |= (1 << 9) | (1 << 3);
1107     stlink_write_debug32(sl, STM32L_FLASH_PECR, val);
1108
1109 #if 0 /* fix_to_be_confirmed */
1110
1111     /* wait for sr.busy to be cleared
1112        MP: Test shows that busy bit is not set here. Perhaps, PM0062 is
1113        wrong and we do not need to wait here for clearing the busy bit.
1114        TEXANE: ok, if experience says so and it works for you, we comment
1115        it. If someone has a problem, please drop an email.
1116      */
1117     while ((stlink_read_debug32(sl, STM32L_FLASH_SR) & (1 << 0)) != 0)
1118         ;
1119
1120 #endif /* fix_to_be_confirmed */
1121
1122     /* write 0 to the first word of the page to be erased */
1123     stlink_write_debug32(sl, flashaddr, 0);
1124
1125     /* MP: It is better to wait for clearing the busy bit after issuing
1126     page erase command, even though PM0062 recommends to wait before it.
1127     Test shows that a few iterations is performed in the following loop
1128     before busy bit is cleared.*/
1129     while ((stlink_read_debug32(sl, STM32L_FLASH_SR) & (1 << 0)) != 0)
1130         ;
1131
1132     /* reset lock bits */
1133     val = stlink_read_debug32(sl, STM32L_FLASH_PECR)
1134         | (1 << 0) | (1 << 1) | (1 << 2);
1135     stlink_write_debug32(sl, STM32L_FLASH_PECR, val);
1136   } else if (sl->core_id == STM32VL_CORE_ID 
1137              || sl->core_id == STM32F0_CORE_ID 
1138              || sl->chip_id == STM32_CHIPID_F3 
1139              || sl->chip_id == STM32_CHIPID_F37x) {
1140     /* wait for ongoing op to finish */
1141     wait_flash_busy(sl);
1142
1143     /* unlock if locked */
1144     unlock_flash_if(sl);
1145
1146     /* set the page erase bit */
1147     set_flash_cr_per(sl);
1148
1149     /* select the page to erase */
1150     write_flash_ar(sl, flashaddr);
1151
1152     /* start erase operation, reset by hw with bsy bit */
1153     set_flash_cr_strt(sl);
1154
1155     /* wait for completion */
1156     wait_flash_busy(sl);
1157
1158     /* relock the flash */
1159     lock_flash(sl);
1160   } else {
1161     WLOG("unknown coreid %x, page erase failed\n", sl->core_id);
1162     return -1;
1163   }
1164
1165   /* todo: verify the erased page */
1166
1167   return 0;
1168 }
1169
1170 int stlink_erase_flash_mass(stlink_t *sl) {
1171     if (sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS 
1172         || sl->chip_id == STM32_CHIPID_L1_HIGH) {
1173         /* erase each page */
1174         int i = 0, num_pages = sl->flash_size/sl->flash_pgsz;
1175         for (i = 0; i < num_pages; i++) {
1176             /* addr must be an addr inside the page */
1177             stm32_addr_t addr = sl->flash_base + i * sl->flash_pgsz;
1178             if (stlink_erase_flash_page(sl, addr) == -1) {
1179                 WLOG("Failed to erase_flash_page(%#zx) == -1\n", addr);
1180                 return -1;
1181             }
1182             fprintf(stdout,"\rFlash page at %5d/%5d erased", i, num_pages);
1183             fflush(stdout);
1184         }
1185         fprintf(stdout, "\n");
1186     } else {
1187         /* wait for ongoing op to finish */
1188         wait_flash_busy(sl);
1189
1190         /* unlock if locked */
1191         unlock_flash_if(sl);
1192
1193         /* set the mass erase bit */
1194         set_flash_cr_mer(sl);
1195
1196         /* start erase operation, reset by hw with bsy bit */
1197         set_flash_cr_strt(sl);
1198
1199         /* wait for completion */
1200         wait_flash_busy_progress(sl);
1201
1202         /* relock the flash */
1203         lock_flash(sl);
1204
1205         /* todo: verify the erased memory */
1206     }
1207     return 0;
1208 }
1209
1210 int init_flash_loader(stlink_t *sl, flash_loader_t* fl) {
1211     size_t size;
1212
1213     /* allocate the loader in sram */
1214     if (write_loader_to_sram(sl, &fl->loader_addr, &size) == -1) {
1215         WLOG("Failed to write flash loader to sram!\n");
1216         return -1;
1217     }
1218
1219     /* allocate a one page buffer in sram right after loader */
1220     fl->buf_addr = fl->loader_addr + size;
1221     ILOG("Successfully loaded flash loader in sram\n");
1222     return 0;
1223 }
1224
1225 int write_loader_to_sram(stlink_t *sl, stm32_addr_t* addr, size_t* size) {
1226     /* from openocd, contrib/loaders/flash/stm32.s */
1227     static const uint8_t loader_code_stm32vl[] = {
1228         0x08, 0x4c, /* ldr      r4, STM32_FLASH_BASE */
1229         0x1c, 0x44, /* add      r4, r3 */
1230         /* write_half_word: */
1231         0x01, 0x23, /* movs     r3, #0x01 */
1232         0x23, 0x61, /* str      r3, [r4, #STM32_FLASH_CR_OFFSET] */
1233         0x30, 0xf8, 0x02, 0x3b, /* ldrh r3, [r0], #0x02 */
1234         0x21, 0xf8, 0x02, 0x3b, /* strh r3, [r1], #0x02 */
1235         /* busy: */
1236         0xe3, 0x68, /* ldr      r3, [r4, #STM32_FLASH_SR_OFFSET] */
1237         0x13, 0xf0, 0x01, 0x0f, /* tst  r3, #0x01 */
1238         0xfb, 0xd0, /* beq      busy */
1239         0x13, 0xf0, 0x14, 0x0f, /* tst  r3, #0x14 */
1240         0x01, 0xd1, /* bne      exit */
1241         0x01, 0x3a, /* subs     r2, r2, #0x01 */
1242         0xf0, 0xd1, /* bne      write_half_word */
1243         /* exit: */
1244         0x00, 0xbe, /* bkpt     #0x00 */
1245         0x00, 0x20, 0x02, 0x40, /* STM32_FLASH_BASE: .word 0x40022000 */
1246     };
1247
1248     /* flashloaders/stm32f0.s -- thumb1 only, same sequence as for STM32VL, bank ignored */
1249     static const uint8_t loader_code_stm32f0[] = {
1250 #if 1
1251         /*
1252          * These two NOPs here are a safety precaution, added by Pekka Nikander
1253          * while debugging the STM32F05x support.  They may not be needed, but
1254          * there were strange problems with simpler programs, like a program
1255          * that had just a breakpoint or a program that first moved zero to register r2
1256          * and then had a breakpoint.  So, it appears safest to have these two nops.
1257          *
1258          * Feel free to remove them, if you dare, but then please do test the result
1259          * rigorously.  Also, if you remove these, it may be a good idea first to
1260          * #if 0 them out, with a comment when these were taken out, and to remove
1261          * these only a few months later...  But YMMV.
1262          */
1263         0x00, 0x30, //     nop     /* add r0,#0 */
1264         0x00, 0x30, //     nop     /* add r0,#0 */
1265 #endif
1266         0x0A, 0x4C, //     ldr     r4, STM32_FLASH_BASE
1267         0x01, 0x25, //     mov     r5, #1            /*  FLASH_CR_PG, FLASH_SR_BUSY */
1268         0x04, 0x26, //     mov     r6, #4            /*  PGERR  */
1269                     // write_half_word:
1270         0x23, 0x69, //     ldr     r3, [r4, #16]     /*  FLASH->CR   */
1271         0x2B, 0x43, //     orr     r3, r5
1272         0x23, 0x61, //     str     r3, [r4, #16]     /*  FLASH->CR |= FLASH_CR_PG */
1273         0x03, 0x88, //     ldrh    r3, [r0]          /*  r3 = *sram */
1274         0x0B, 0x80, //     strh    r3, [r1]          /*  *flash = r3 */
1275                     // busy:
1276         0xE3, 0x68, //     ldr     r3, [r4, #12]     /*  FLASH->SR  */
1277         0x2B, 0x42, //     tst     r3, r5            /*  FLASH_SR_BUSY  */
1278         0xFC, 0xD0, //     beq     busy
1279
1280         0x33, 0x42, //     tst     r3, r6            /*  PGERR  */
1281         0x04, 0xD1, //     bne     exit
1282
1283         0x02, 0x30, //     add     r0, r0, #2        /*  sram += 2  */
1284         0x02, 0x31, //     add     r1, r1, #2        /*  flash += 2  */
1285         0x01, 0x3A, //     sub     r2, r2, #0x01     /*  count--  */
1286         0x00, 0x2A, //     cmp     r2, #0
1287         0xF0, 0xD1, //     bne     write_half_word
1288                     // exit:
1289         0x23, 0x69, //     ldr     r3, [r4, #16]     /*  FLASH->CR  */
1290         0xAB, 0x43, //     bic     r3, r5
1291         0x23, 0x61, //     str     r3, [r4, #16]     /*  FLASH->CR &= ~FLASH_CR_PG  */
1292         0x00, 0xBE, //     bkpt #0x00
1293         0x00, 0x20, 0x02, 0x40, /* STM32_FLASH_BASE: .word 0x40022000 */
1294     };
1295
1296     static const uint8_t loader_code_stm32l[] = {
1297
1298         /* openocd.git/contrib/loaders/flash/stm32lx.S
1299            r0, input, dest addr
1300            r1, input, source addr
1301            r2, input, word count
1302            r3, output, word count
1303         */
1304
1305         0x00, 0x23,
1306         0x04, 0xe0,
1307
1308         0x51, 0xf8, 0x04, 0xcb,
1309         0x40, 0xf8, 0x04, 0xcb,
1310         0x01, 0x33,
1311
1312         0x93, 0x42,
1313         0xf8, 0xd3,
1314         0x00, 0xbe
1315     };
1316
1317     static const uint8_t loader_code_stm32f4[] = {
1318         // flashloaders/stm32f4.s
1319
1320         0x07, 0x4b,
1321
1322         0x62, 0xb1,
1323         0x04, 0x68,
1324         0x0c, 0x60,
1325
1326         0xdc, 0x89,
1327         0x14, 0xf0, 0x01, 0x0f,
1328         0xfb, 0xd1,
1329         0x00, 0xf1, 0x04, 0x00,
1330         0x01, 0xf1, 0x04, 0x01,
1331         0xa2, 0xf1, 0x01, 0x02,
1332         0xf1, 0xe7,
1333
1334         0x00, 0xbe,
1335
1336         0x00, 0x3c, 0x02, 0x40,
1337     };
1338
1339     const uint8_t* loader_code;
1340     size_t loader_size;
1341
1342     if (sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS
1343                 || sl->chip_id == STM32_CHIPID_L1_HIGH ) { /* stm32l */
1344         loader_code = loader_code_stm32l;
1345         loader_size = sizeof(loader_code_stm32l);
1346     } else if (sl->core_id == STM32VL_CORE_ID || sl->chip_id == STM32_CHIPID_F3  || sl->chip_id == STM32_CHIPID_F37x) {
1347         loader_code = loader_code_stm32vl;
1348         loader_size = sizeof(loader_code_stm32vl);
1349     } else if (sl->chip_id == STM32_CHIPID_F2 || sl->chip_id == STM32_CHIPID_F4 ||
1350                sl->chip_id == STM32_CHIPID_F4_LP || sl->chip_id == STM32_CHIPID_F4_HD){
1351         loader_code = loader_code_stm32f4;
1352         loader_size = sizeof(loader_code_stm32f4);
1353     } else if (sl->chip_id == STM32_CHIPID_F0 || sl->chip_id == STM32_CHIPID_F0_CAN || sl->chip_id == STM32_CHIPID_F0_SMALL) {
1354         loader_code = loader_code_stm32f0;
1355         loader_size = sizeof(loader_code_stm32f0);
1356     } else {
1357         ELOG("unknown coreid, not sure what flash loader to use, aborting!: %x\n", sl->core_id);
1358         return -1;
1359     }
1360
1361     memcpy(sl->q_buf, loader_code, loader_size);
1362     stlink_write_mem32(sl, sl->sram_base, loader_size);
1363
1364     *addr = sl->sram_base;
1365     *size = loader_size;
1366
1367     /* success */
1368     return 0;
1369 }
1370
1371 int stlink_fcheck_flash(stlink_t *sl, const char* path, stm32_addr_t addr) {
1372     /* check the contents of path are at addr */
1373
1374     int res;
1375     mapped_file_t mf = MAPPED_FILE_INITIALIZER;
1376
1377     if (map_file(&mf, path) == -1)
1378         return -1;
1379
1380     res = check_file(sl, &mf, addr);
1381
1382     unmap_file(&mf);
1383
1384     return res;
1385 }
1386
1387 /**
1388  * Verify addr..addr+len is binary identical to base...base+len
1389  * @param sl stlink context
1390  * @param address stm device address
1391  * @param data host side buffer to check against
1392  * @param length how much
1393  * @return 0 for success, -ve for failure
1394  */
1395 int stlink_verify_write_flash(stlink_t *sl, stm32_addr_t address, uint8_t *data, unsigned length) {
1396     size_t off;
1397     size_t cmp_size = (sl->flash_pgsz > 0x1800)? 0x1800:sl->flash_pgsz;
1398     ILOG("Starting verification of write complete\n");
1399     for (off = 0; off < length; off += cmp_size) {
1400         size_t aligned_size;
1401
1402         /* adjust last page size */
1403         if ((off + cmp_size) > length)
1404             cmp_size = length - off;
1405
1406         aligned_size = cmp_size;
1407         if (aligned_size & (4 - 1))
1408             aligned_size = (cmp_size + 4) & ~(4 - 1);
1409
1410         stlink_read_mem32(sl, address + off, aligned_size);
1411
1412         if (memcmp(sl->q_buf, data + off, cmp_size)) {
1413             ELOG("Verification of flash failed at offset: %zd\n", off);
1414             return -1;
1415         }
1416     }
1417     ILOG("Flash written and verified! jolly good!\n");
1418     return 0;
1419
1420 }
1421
1422 int stm32l1_write_half_pages(stlink_t *sl, stm32_addr_t addr, uint8_t* base, unsigned num_half_pages)
1423 {
1424     unsigned int count;
1425     uint32_t val;
1426     flash_loader_t fl;
1427
1428     ILOG("Starting Half page flash write for STM32L core id\n");
1429     /* flash loader initialization */
1430     if (init_flash_loader(sl, &fl) == -1) {
1431         WLOG("init_flash_loader() == -1\n");
1432         return -1;
1433     }
1434     /* Unlock already done */
1435     val = stlink_read_debug32(sl, STM32L_FLASH_PECR);
1436     val |= (1 << FLASH_L1_FPRG);
1437     stlink_write_debug32(sl, STM32L_FLASH_PECR, val);
1438
1439     val |= (1 << FLASH_L1_PROG);
1440     stlink_write_debug32(sl, STM32L_FLASH_PECR, val);
1441     while ((stlink_read_debug32(sl, STM32L_FLASH_SR) & (1 << 0)) != 0) {}
1442
1443 #define L1_WRITE_BLOCK_SIZE 0x80
1444     for (count = 0; count  < num_half_pages; count ++) {
1445         if (run_flash_loader(sl, &fl, addr + count * L1_WRITE_BLOCK_SIZE, base + count * L1_WRITE_BLOCK_SIZE, L1_WRITE_BLOCK_SIZE) == -1) {
1446             WLOG("l1_run_flash_loader(%#zx) failed! == -1\n", addr + count * L1_WRITE_BLOCK_SIZE);
1447             val = stlink_read_debug32(sl, STM32L_FLASH_PECR);
1448             val &= ~((1 << FLASH_L1_FPRG) |(1 << FLASH_L1_PROG));
1449             stlink_write_debug32(sl, STM32L_FLASH_PECR, val);
1450             return -1;
1451         }
1452         /* wait for sr.busy to be cleared */
1453         if (sl->verbose >= 1) {
1454             /* show progress. writing procedure is slow
1455                and previous errors are misleading */
1456             fprintf(stdout, "\r%3u/%u halfpages written", count + 1, num_half_pages);
1457             fflush(stdout);
1458         }
1459         while ((stlink_read_debug32(sl, STM32L_FLASH_SR) & (1 << 0)) != 0) {
1460         }
1461     }
1462     val = stlink_read_debug32(sl, STM32L_FLASH_PECR);
1463     val &= ~(1 << FLASH_L1_PROG);
1464     stlink_write_debug32(sl, STM32L_FLASH_PECR, val);
1465     val = stlink_read_debug32(sl, STM32L_FLASH_PECR);
1466     val &= ~(1 << FLASH_L1_FPRG);
1467     stlink_write_debug32(sl, STM32L_FLASH_PECR, val);
1468
1469     return 0;
1470 }
1471
1472 int stlink_write_flash(stlink_t *sl, stm32_addr_t addr, uint8_t* base, uint32_t len) {
1473     size_t off;
1474     flash_loader_t fl;
1475     ILOG("Attempting to write %d (%#x) bytes to stm32 address: %u (%#x)\n",
1476         len, len, addr, addr);
1477     /* check addr range is inside the flash */
1478     stlink_calculate_pagesize(sl, addr);
1479     if (addr < sl->flash_base) {
1480         ELOG("addr too low %#x < %#x\n", addr, sl->flash_base);
1481         return -1;
1482     } else if ((addr + len) < addr) {
1483         ELOG("addr overruns\n");
1484         return -1;
1485     } else if ((addr + len) > (sl->flash_base + sl->flash_size)) {
1486         ELOG("addr too high\n");
1487         return -1;
1488     } else if (addr & 1) {
1489         ELOG("unaligned addr 0x%x\n", addr);
1490         return -1;
1491     } else if (len & 1) {
1492         WLOG("unaligned len 0x%x -- padding with zero\n", len);
1493         len += 1;
1494     } else if (addr & (sl->flash_pgsz - 1)) {
1495         ELOG("addr not a multiple of pagesize, not supported\n");
1496         return -1;
1497     }
1498
1499     // Make sure we've loaded the context with the chip details
1500     stlink_core_id(sl);
1501     /* erase each page */
1502     int page_count = 0;
1503     for (off = 0; off < len; off += stlink_calculate_pagesize(sl, addr + off)) {
1504         /* addr must be an addr inside the page */
1505         if (stlink_erase_flash_page(sl, addr + off) == -1) {
1506             ELOG("Failed to erase_flash_page(%#zx) == -1\n", addr + off);
1507             return -1;
1508         }
1509         fprintf(stdout,"\rFlash page at addr: 0x%08lx erased",
1510                 (unsigned long)addr + off);
1511         fflush(stdout);
1512         page_count++;
1513     }
1514     fprintf(stdout,"\n");
1515     ILOG("Finished erasing %d pages of %d (%#x) bytes\n",
1516         page_count, sl->flash_pgsz, sl->flash_pgsz);
1517
1518     if ((sl->chip_id == STM32_CHIPID_F2) || (sl->chip_id == STM32_CHIPID_F4) ||
1519         (sl->chip_id == STM32_CHIPID_F4_LP) || (sl->chip_id == STM32_CHIPID_F4_HD)) {
1520         /* todo: check write operation */
1521
1522         ILOG("Starting Flash write for F2/F4\n");
1523         /* flash loader initialization */
1524         if (init_flash_loader(sl, &fl) == -1) {
1525             ELOG("init_flash_loader() == -1\n");
1526             return -1;
1527         }
1528
1529         /* First unlock the cr */
1530         unlock_flash_if(sl);
1531
1532         /* TODO: Check that Voltage range is 2.7 - 3.6 V */
1533         /* set parallelisim to 32 bit*/
1534         write_flash_cr_psiz(sl, 2);
1535
1536         /* set programming mode */
1537         set_flash_cr_pg(sl);
1538
1539         for(off = 0; off < len;) {
1540             size_t size = len - off > 0x8000 ? 0x8000 : len - off;
1541
1542             printf("size: %zu\n", size);
1543
1544             if (run_flash_loader(sl, &fl, addr + off, base + off, size) == -1) {
1545                 ELOG("run_flash_loader(%#zx) failed! == -1\n", addr + off);
1546                 return -1;
1547             }
1548
1549             off += size;
1550         }
1551
1552 #if 0
1553 #define PROGRESS_CHUNK_SIZE 0x1000
1554         /* write a word in program memory */
1555         for (off = 0; off < len; off += sizeof(uint32_t)) {
1556             uint32_t data;
1557             if (sl->verbose >= 1) {
1558                 if ((off & (PROGRESS_CHUNK_SIZE - 1)) == 0) {
1559                     /* show progress. writing procedure is slow
1560                        and previous errors are misleading */
1561                     const uint32_t pgnum = (off / PROGRESS_CHUNK_SIZE)+1;
1562                     const uint32_t pgcount = len / PROGRESS_CHUNK_SIZE +1;
1563                     fprintf(stdout, "Writing %ukB chunk %u out of %u\n",
1564                             PROGRESS_CHUNK_SIZE/1024, pgnum, pgcount);
1565                 }
1566             }
1567
1568             write_uint32((unsigned char*) &data, *(uint32_t*) (base + off));
1569             stlink_write_debug32(sl, addr + off, data);
1570
1571             /* wait for sr.busy to be cleared */
1572             wait_flash_busy(sl);
1573
1574         }
1575 #endif
1576         /* Relock flash */
1577         lock_flash(sl);
1578
1579 #if 0 /* todo: debug mode */
1580         fprintf(stdout, "Final CR:0x%x\n", read_flash_cr(sl));
1581 #endif
1582
1583     }   //STM32F4END
1584
1585     else if (sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS
1586                 || sl->chip_id == STM32_CHIPID_L1_HIGH ) {
1587         /* use fast word write. todo: half page. */
1588         uint32_t val;
1589
1590 #if 0 /* todo: check write operation */
1591
1592         uint32_t nwrites = sl->flash_pgsz;
1593
1594         redo_write:
1595
1596 #endif /* todo: check write operation */
1597
1598         /* disable pecr protection */
1599         stlink_write_debug32(sl, STM32L_FLASH_PEKEYR, 0x89abcdef);
1600         stlink_write_debug32(sl, STM32L_FLASH_PEKEYR, 0x02030405);
1601
1602         /* check pecr.pelock is cleared */
1603         val = stlink_read_debug32(sl, STM32L_FLASH_PECR);
1604         if (val & (1 << 0)) {
1605                 fprintf(stderr, "pecr.pelock not clear\n");
1606                 return -1;
1607         }
1608
1609         /* unlock program memory */
1610         stlink_write_debug32(sl, STM32L_FLASH_PRGKEYR, 0x8c9daebf);
1611         stlink_write_debug32(sl, STM32L_FLASH_PRGKEYR, 0x13141516);
1612
1613         /* check pecr.prglock is cleared */
1614         val = stlink_read_debug32(sl, STM32L_FLASH_PECR);
1615         if (val & (1 << 1)) {
1616                 fprintf(stderr, "pecr.prglock not clear\n");
1617                 return -1;
1618         }
1619         off = 0;
1620         if (len > L1_WRITE_BLOCK_SIZE) {
1621             if (stm32l1_write_half_pages(sl, addr, base, len/L1_WRITE_BLOCK_SIZE) == -1) {
1622                 /* This may happen on a blank device! */
1623                 WLOG("\nwrite_half_pages failed == -1\n");
1624             } else {
1625                 off = (len /L1_WRITE_BLOCK_SIZE)*L1_WRITE_BLOCK_SIZE;
1626             }
1627         }
1628
1629         /* write remainingword in program memory */
1630         for ( ; off < len; off += sizeof(uint32_t)) {
1631             uint32_t data;
1632             if (off > 254)
1633                 fprintf(stdout, "\r");
1634
1635             if ((off % sl->flash_pgsz) > (sl->flash_pgsz -5)) {
1636                 fprintf(stdout, "\r%3zd/%3zd pages written",
1637                         off/sl->flash_pgsz, len/sl->flash_pgsz);
1638                 fflush(stdout);
1639             }
1640
1641             write_uint32((unsigned char*) &data, *(uint32_t*) (base + off));
1642             stlink_write_debug32(sl, addr + off, data);
1643
1644             /* wait for sr.busy to be cleared */
1645             while ((stlink_read_debug32(sl, STM32L_FLASH_SR) & (1 << 0)) != 0)
1646                 ;
1647
1648 #if 0 /* todo: check redo write operation */
1649
1650             /* check written bytes. todo: should be on a per page basis. */
1651             data = stlink_read_debug32(sl, addr + off);
1652             if (data == *(uint32_t*)(base + off)) {
1653                 /* re erase the page and redo the write operation */
1654                 uint32_t page;
1655                 uint32_t val;
1656
1657                 /* fail if successive write count too low */
1658                 if (nwrites < sl->flash_pgsz) {
1659                     fprintf(stderr, "writes operation failure count too high, aborting\n");
1660                     return -1;
1661                 }
1662
1663                 nwrites = 0;
1664
1665                 /* assume addr aligned */
1666                 if (off % sl->flash_pgsz) off &= ~(sl->flash_pgsz - 1);
1667                 page = addr + off;
1668
1669                 fprintf(stderr, "invalid write @0x%x(0x%x): 0x%x != 0x%x. retrying.\n",
1670                         page, addr + off, read_uint32(base + off, 0), read_uint32(sl->q_buf, 0));
1671
1672                 /* reset lock bits */
1673                 val = stlink_read_debug32(sl, STM32L_FLASH_PECR)
1674                     | (1 << 0) | (1 << 1) | (1 << 2);
1675                 stlink_write_debug32(sl, STM32L_FLASH_PECR, val);
1676
1677                 stlink_erase_flash_page(sl, page);
1678
1679                 goto redo_write;
1680             }
1681
1682             /* increment successive writes counter */
1683             ++nwrites;
1684
1685 #endif /* todo: check redo write operation */
1686         }
1687         fprintf(stdout, "\n");
1688         /* reset lock bits */
1689         val = stlink_read_debug32(sl, STM32L_FLASH_PECR)
1690              | (1 << 0) | (1 << 1) | (1 << 2);
1691         stlink_write_debug32(sl, STM32L_FLASH_PECR, val);
1692     } 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) {
1693         ILOG("Starting Flash write for VL/F0 core id\n");
1694         /* flash loader initialization */
1695         if (init_flash_loader(sl, &fl) == -1) {
1696             ELOG("init_flash_loader() == -1\n");
1697             return -1;
1698         }
1699
1700         int write_block_count = 0;
1701         for (off = 0; off < len; off += sl->flash_pgsz) {
1702             /* adjust last write size */
1703             size_t size = sl->flash_pgsz;
1704             if ((off + sl->flash_pgsz) > len) size = len - off;
1705
1706             /* unlock and set programming mode */
1707             unlock_flash_if(sl);
1708             set_flash_cr_pg(sl);
1709             //DLOG("Finished setting flash cr pg, running loader!\n");
1710             if (run_flash_loader(sl, &fl, addr + off, base + off, size) == -1) {
1711                 ELOG("run_flash_loader(%#zx) failed! == -1\n", addr + off);
1712                 return -1;
1713             }
1714             lock_flash(sl);
1715             if (sl->verbose >= 1) {
1716                 /* show progress. writing procedure is slow
1717                    and previous errors are misleading */
1718               fprintf(stdout, "\r%3u/%lu pages written", write_block_count++, (unsigned long)len/sl->flash_pgsz);
1719                 fflush(stdout);
1720             }
1721         }
1722         fprintf(stdout, "\n");
1723     } else {
1724         ELOG("unknown coreid, not sure how to write: %x\n", sl->core_id);
1725         return -1;
1726     }
1727
1728     return stlink_verify_write_flash(sl, addr, base, len);
1729 }
1730
1731 /**
1732  * Write the given binary file into flash at address "addr"
1733  * @param sl
1734  * @param path readable file path, should be binary image
1735  * @param addr where to start writing
1736  * @return 0 on success, -ve on failure.
1737  */
1738 int stlink_fwrite_flash(stlink_t *sl, const char* path, stm32_addr_t addr) {
1739     /* write the file in flash at addr */
1740     int err;
1741     unsigned int num_empty = 0, index;
1742     unsigned char erased_pattern =(sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS
1743         || sl->chip_id == STM32_CHIPID_L1_HIGH )?0:0xff;
1744     mapped_file_t mf = MAPPED_FILE_INITIALIZER;
1745     if (map_file(&mf, path) == -1) {
1746         ELOG("map_file() == -1\n");
1747         return -1;
1748     }
1749     for(index = 0; index < mf.len; index ++) {
1750         if (mf.base[index] == erased_pattern)
1751             num_empty ++;
1752         else
1753             num_empty = 0;
1754     }
1755     /* Round down to words */
1756     num_empty -= (num_empty & 3);
1757     if(num_empty != 0) {
1758         ILOG("Ignoring %d bytes of 0x%02x at end of file\n", num_empty, erased_pattern);
1759         mf.len -= num_empty;
1760     }
1761     err = stlink_write_flash(sl, addr, mf.base, mf.len);
1762     /* set stack*/
1763     stlink_write_reg(sl, stlink_read_debug32(sl, addr    ),13);
1764     /* Set PC to the reset routine*/
1765     stlink_write_reg(sl, stlink_read_debug32(sl, addr + 4),15);
1766     stlink_run(sl);
1767     unmap_file(&mf);
1768     return err;
1769 }
1770
1771 int run_flash_loader(stlink_t *sl, flash_loader_t* fl, stm32_addr_t target, const uint8_t* buf, size_t size) {
1772
1773     reg rr;
1774     int i = 0;
1775     DLOG("Running flash loader, write address:%#x, size: %zd\n", target, size);
1776     // FIXME This can never return -1
1777     if (write_buffer_to_sram(sl, fl, buf, size) == -1) {
1778         // IMPOSSIBLE!
1779         ELOG("write_buffer_to_sram() == -1\n");
1780         return -1;
1781     }
1782
1783     if (sl->chip_id == STM32_CHIPID_L1_MEDIUM  || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS
1784         || sl->chip_id == STM32_CHIPID_L1_HIGH ) {
1785
1786         size_t count = size / sizeof(uint32_t);
1787         if (size % sizeof(uint32_t)) ++count;
1788
1789         /* setup core */
1790         stlink_write_reg(sl, target, 0); /* target */
1791         stlink_write_reg(sl, fl->buf_addr, 1); /* source */
1792         stlink_write_reg(sl, count, 2); /* count (32 bits words) */
1793         stlink_write_reg(sl, fl->loader_addr, 15); /* pc register */
1794
1795     } 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) {
1796
1797         size_t count = size / sizeof(uint16_t);
1798         if (size % sizeof(uint16_t)) ++count;
1799
1800         /* setup core */
1801         stlink_write_reg(sl, fl->buf_addr, 0); /* source */
1802         stlink_write_reg(sl, target, 1); /* target */
1803         stlink_write_reg(sl, count, 2); /* count (16 bits half words) */
1804         stlink_write_reg(sl, 0, 3); /* flash bank 0 (input) */
1805         stlink_write_reg(sl, fl->loader_addr, 15); /* pc register */
1806
1807     } else if (sl->chip_id == STM32_CHIPID_F2 || sl->chip_id == STM32_CHIPID_F4 ||
1808                sl->chip_id == STM32_CHIPID_F4_LP || sl->chip_id == STM32_CHIPID_F4_HD) {
1809
1810         size_t count = size / sizeof(uint32_t);
1811         if (size % sizeof(uint32_t)) ++count;
1812
1813         /* setup core */
1814         stlink_write_reg(sl, fl->buf_addr, 0); /* source */
1815         stlink_write_reg(sl, target, 1); /* target */
1816         stlink_write_reg(sl, count, 2); /* count (32 bits words) */
1817         stlink_write_reg(sl, fl->loader_addr, 15); /* pc register */
1818
1819     } else {
1820         fprintf(stderr, "unknown coreid 0x%x, don't know what flash loader to use\n", sl->core_id);
1821         return -1;
1822     }
1823
1824     /* run loader */
1825     stlink_run(sl);
1826
1827 #define WAIT_ROUNDS 10000
1828     /* wait until done (reaches breakpoint) */
1829     for (i = 0; i < WAIT_ROUNDS; i++) {
1830         usleep(10);
1831         if (is_core_halted(sl))
1832             break;
1833     }
1834
1835     if (i >= WAIT_ROUNDS) {
1836         ELOG("flash loader run error\n");
1837         return -1;
1838     }
1839
1840     /* check written byte count */
1841     if (sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS
1842         || sl->chip_id == STM32_CHIPID_L1_HIGH ) {
1843
1844       size_t count = size / sizeof(uint32_t);
1845       if (size % sizeof(uint32_t)) ++count;
1846
1847       stlink_read_reg(sl, 3, &rr);
1848       if (rr.r[3] != count) {
1849         fprintf(stderr, "write error, count == %u\n", rr.r[3]);
1850         return -1;
1851       }
1852
1853     } 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) {
1854
1855       stlink_read_reg(sl, 2, &rr);
1856       if (rr.r[2] != 0) {
1857         fprintf(stderr, "write error, count == %u\n", rr.r[2]);
1858         return -1;
1859       }
1860
1861     } else if (sl->chip_id == STM32_CHIPID_F2 || sl->chip_id == STM32_CHIPID_F4 ||
1862                sl->chip_id == STM32_CHIPID_F4_LP || sl->chip_id == STM32_CHIPID_F4_HD) {
1863
1864         stlink_read_reg(sl, 2, &rr);
1865         if (rr.r[2] != 0) {
1866             fprintf(stderr, "write error, count == %u\n", rr.r[2]);
1867             return -1;
1868         }
1869
1870     } else {
1871
1872       fprintf(stderr, "unknown coreid 0x%x, can't check written byte count\n", sl->core_id);
1873       return -1;
1874
1875     }
1876
1877     return 0;
1878 }