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