Added support for small f0 devices with core id 0x444
[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 
1114              || sl->core_id == STM32F0_CORE_ID 
1115              || sl->chip_id == STM32_CHIPID_F3 
1116              || sl->chip_id == STM32_CHIPID_F37x) {
1117     /* wait for ongoing op to finish */
1118     wait_flash_busy(sl);
1119
1120     /* unlock if locked */
1121     unlock_flash_if(sl);
1122
1123     /* set the page erase bit */
1124     set_flash_cr_per(sl);
1125
1126     /* select the page to erase */
1127     write_flash_ar(sl, flashaddr);
1128
1129     /* start erase operation, reset by hw with bsy bit */
1130     set_flash_cr_strt(sl);
1131
1132     /* wait for completion */
1133     wait_flash_busy(sl);
1134
1135     /* relock the flash */
1136     lock_flash(sl);
1137   } else {
1138     WLOG("unknown coreid %x, page erase failed\n", sl->core_id);
1139     return -1;
1140   }
1141
1142   /* todo: verify the erased page */
1143
1144   return 0;
1145 }
1146
1147 int stlink_erase_flash_mass(stlink_t *sl) {
1148     if (sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS ) {
1149         /* erase each page */
1150         int i = 0, num_pages = sl->flash_size/sl->flash_pgsz;
1151         for (i = 0; i < num_pages; i++) {
1152             /* addr must be an addr inside the page */
1153             stm32_addr_t addr = sl->flash_base + i * sl->flash_pgsz;
1154             if (stlink_erase_flash_page(sl, addr) == -1) {
1155                 WLOG("Failed to erase_flash_page(%#zx) == -1\n", addr);
1156                 return -1;
1157             }
1158             fprintf(stdout,"\rFlash page at %5d/%5d erased", i, num_pages);
1159             fflush(stdout);
1160         }
1161         fprintf(stdout, "\n");
1162     } else {
1163         /* wait for ongoing op to finish */
1164         wait_flash_busy(sl);
1165
1166         /* unlock if locked */
1167         unlock_flash_if(sl);
1168
1169         /* set the mass erase bit */
1170         set_flash_cr_mer(sl);
1171
1172         /* start erase operation, reset by hw with bsy bit */
1173         set_flash_cr_strt(sl);
1174
1175         /* wait for completion */
1176         wait_flash_busy_progress(sl);
1177
1178         /* relock the flash */
1179         lock_flash(sl);
1180
1181         /* todo: verify the erased memory */
1182     }
1183     return 0;
1184 }
1185
1186 int init_flash_loader(stlink_t *sl, flash_loader_t* fl) {
1187     size_t size;
1188
1189     /* allocate the loader in sram */
1190     if (write_loader_to_sram(sl, &fl->loader_addr, &size) == -1) {
1191         WLOG("Failed to write flash loader to sram!\n");
1192         return -1;
1193     }
1194
1195     /* allocate a one page buffer in sram right after loader */
1196     fl->buf_addr = fl->loader_addr + size;
1197     ILOG("Successfully loaded flash loader in sram\n");
1198     return 0;
1199 }
1200
1201 int write_loader_to_sram(stlink_t *sl, stm32_addr_t* addr, size_t* size) {
1202     /* from openocd, contrib/loaders/flash/stm32.s */
1203     static const uint8_t loader_code_stm32vl[] = {
1204         0x08, 0x4c, /* ldr      r4, STM32_FLASH_BASE */
1205         0x1c, 0x44, /* add      r4, r3 */
1206         /* write_half_word: */
1207         0x01, 0x23, /* movs     r3, #0x01 */
1208         0x23, 0x61, /* str      r3, [r4, #STM32_FLASH_CR_OFFSET] */
1209         0x30, 0xf8, 0x02, 0x3b, /* ldrh r3, [r0], #0x02 */
1210         0x21, 0xf8, 0x02, 0x3b, /* strh r3, [r1], #0x02 */
1211         /* busy: */
1212         0xe3, 0x68, /* ldr      r3, [r4, #STM32_FLASH_SR_OFFSET] */
1213         0x13, 0xf0, 0x01, 0x0f, /* tst  r3, #0x01 */
1214         0xfb, 0xd0, /* beq      busy */
1215         0x13, 0xf0, 0x14, 0x0f, /* tst  r3, #0x14 */
1216         0x01, 0xd1, /* bne      exit */
1217         0x01, 0x3a, /* subs     r2, r2, #0x01 */
1218         0xf0, 0xd1, /* bne      write_half_word */
1219         /* exit: */
1220         0x00, 0xbe, /* bkpt     #0x00 */
1221         0x00, 0x20, 0x02, 0x40, /* STM32_FLASH_BASE: .word 0x40022000 */
1222     };
1223
1224     /* flashloaders/stm32f0.s -- thumb1 only, same sequence as for STM32VL, bank ignored */
1225     static const uint8_t loader_code_stm32f0[] = {
1226 #if 1
1227         /*
1228          * These two NOPs here are a safety precaution, added by Pekka Nikander
1229          * while debugging the STM32F05x support.  They may not be needed, but
1230          * there were strange problems with simpler programs, like a program
1231          * that had just a breakpoint or a program that first moved zero to register r2
1232          * and then had a breakpoint.  So, it appears safest to have these two nops.
1233          *
1234          * Feel free to remove them, if you dare, but then please do test the result
1235          * rigorously.  Also, if you remove these, it may be a good idea first to
1236          * #if 0 them out, with a comment when these were taken out, and to remove
1237          * these only a few months later...  But YMMV.
1238          */
1239         0x00, 0x30, //     nop     /* add r0,#0 */
1240         0x00, 0x30, //     nop     /* add r0,#0 */
1241 #endif
1242         0x0A, 0x4C, //     ldr     r4, STM32_FLASH_BASE
1243         0x01, 0x25, //     mov     r5, #1            /*  FLASH_CR_PG, FLASH_SR_BUSY */
1244         0x04, 0x26, //     mov     r6, #4            /*  PGERR  */
1245                     // write_half_word:
1246         0x23, 0x69, //     ldr     r3, [r4, #16]     /*  FLASH->CR   */
1247         0x2B, 0x43, //     orr     r3, r5
1248         0x23, 0x61, //     str     r3, [r4, #16]     /*  FLASH->CR |= FLASH_CR_PG */
1249         0x03, 0x88, //     ldrh    r3, [r0]          /*  r3 = *sram */
1250         0x0B, 0x80, //     strh    r3, [r1]          /*  *flash = r3 */
1251                     // busy:
1252         0xE3, 0x68, //     ldr     r3, [r4, #12]     /*  FLASH->SR  */
1253         0x2B, 0x42, //     tst     r3, r5            /*  FLASH_SR_BUSY  */
1254         0xFC, 0xD0, //     beq     busy
1255
1256         0x33, 0x42, //     tst     r3, r6            /*  PGERR  */
1257         0x04, 0xD1, //     bne     exit
1258
1259         0x02, 0x30, //     add     r0, r0, #2        /*  sram += 2  */
1260         0x02, 0x31, //     add     r1, r1, #2        /*  flash += 2  */
1261         0x01, 0x3A, //     sub     r2, r2, #0x01     /*  count--  */
1262         0x00, 0x2A, //     cmp     r2, #0
1263         0xF0, 0xD1, //     bne     write_half_word
1264                     // exit:
1265         0x23, 0x69, //     ldr     r3, [r4, #16]     /*  FLASH->CR  */
1266         0xAB, 0x43, //     bic     r3, r5
1267         0x23, 0x61, //     str     r3, [r4, #16]     /*  FLASH->CR &= ~FLASH_CR_PG  */
1268         0x00, 0xBE, //     bkpt #0x00
1269         0x00, 0x20, 0x02, 0x40, /* STM32_FLASH_BASE: .word 0x40022000 */
1270     };
1271
1272     static const uint8_t loader_code_stm32l[] = {
1273
1274         /* openocd.git/contrib/loaders/flash/stm32lx.S
1275            r0, input, dest addr
1276            r1, input, source addr
1277            r2, input, word count
1278            r3, output, word count
1279         */
1280
1281         0x00, 0x23,
1282         0x04, 0xe0,
1283
1284         0x51, 0xf8, 0x04, 0xcb,
1285         0x40, 0xf8, 0x04, 0xcb,
1286         0x01, 0x33,
1287
1288         0x93, 0x42,
1289         0xf8, 0xd3,
1290         0x00, 0xbe
1291     };
1292
1293     static const uint8_t loader_code_stm32f4[] = {
1294         // flashloaders/stm32f4.s
1295
1296         0x07, 0x4b,
1297
1298         0x62, 0xb1,
1299         0x04, 0x68,
1300         0x0c, 0x60,
1301
1302         0xdc, 0x89,
1303         0x14, 0xf0, 0x01, 0x0f,
1304         0xfb, 0xd1,
1305         0x00, 0xf1, 0x04, 0x00,
1306         0x01, 0xf1, 0x04, 0x01,
1307         0xa2, 0xf1, 0x01, 0x02,
1308         0xf1, 0xe7,
1309
1310         0x00, 0xbe,
1311
1312         0x00, 0x3c, 0x02, 0x40,
1313     };
1314
1315     const uint8_t* loader_code;
1316     size_t loader_size;
1317
1318     if (sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS ) { /* stm32l */
1319         loader_code = loader_code_stm32l;
1320         loader_size = sizeof(loader_code_stm32l);
1321     } else if (sl->core_id == STM32VL_CORE_ID || sl->chip_id == STM32_CHIPID_F3  || sl->chip_id == STM32_CHIPID_F37x) {
1322         loader_code = loader_code_stm32vl;
1323         loader_size = sizeof(loader_code_stm32vl);
1324     } else if (sl->chip_id == STM32_CHIPID_F2 || sl->chip_id == STM32_CHIPID_F4) {
1325         loader_code = loader_code_stm32f4;
1326         loader_size = sizeof(loader_code_stm32f4);
1327     } else if (sl->chip_id == STM32_CHIPID_F0 || sl->chip_id == STM32_CHIPID_F0_SMALL) {
1328         loader_code = loader_code_stm32f0;
1329         loader_size = sizeof(loader_code_stm32f0);
1330     } else {
1331         ELOG("unknown coreid, not sure what flash loader to use, aborting!: %x\n", sl->core_id);
1332         return -1;
1333     }
1334
1335     memcpy(sl->q_buf, loader_code, loader_size);
1336     stlink_write_mem32(sl, sl->sram_base, loader_size);
1337
1338     *addr = sl->sram_base;
1339     *size = loader_size;
1340
1341     /* success */
1342     return 0;
1343 }
1344
1345 int stlink_fcheck_flash(stlink_t *sl, const char* path, stm32_addr_t addr) {
1346     /* check the contents of path are at addr */
1347
1348     int res;
1349     mapped_file_t mf = MAPPED_FILE_INITIALIZER;
1350
1351     if (map_file(&mf, path) == -1)
1352         return -1;
1353
1354     res = check_file(sl, &mf, addr);
1355
1356     unmap_file(&mf);
1357
1358     return res;
1359 }
1360
1361 /**
1362  * Verify addr..addr+len is binary identical to base...base+len
1363  * @param sl stlink context
1364  * @param address stm device address
1365  * @param data host side buffer to check against
1366  * @param length how much
1367  * @return 0 for success, -ve for failure
1368  */
1369 int stlink_verify_write_flash(stlink_t *sl, stm32_addr_t address, uint8_t *data, unsigned length) {
1370     size_t off;
1371     size_t cmp_size = (sl->flash_pgsz > 0x1800)? 0x1800:sl->flash_pgsz;
1372     ILOG("Starting verification of write complete\n");
1373     for (off = 0; off < length; off += cmp_size) {
1374         size_t aligned_size;
1375
1376         /* adjust last page size */
1377         if ((off + cmp_size) > length)
1378             cmp_size = length - off;
1379
1380         aligned_size = cmp_size;
1381         if (aligned_size & (4 - 1))
1382             aligned_size = (cmp_size + 4) & ~(4 - 1);
1383
1384         stlink_read_mem32(sl, address + off, aligned_size);
1385
1386         if (memcmp(sl->q_buf, data + off, cmp_size)) {
1387             ELOG("Verification of flash failed at offset: %zd\n", off);
1388             return -1;
1389         }
1390     }
1391     ILOG("Flash written and verified! jolly good!\n");
1392     return 0;
1393
1394 }
1395
1396 int stm32l1_write_half_pages(stlink_t *sl, stm32_addr_t addr, uint8_t* base, unsigned num_half_pages)
1397 {
1398     unsigned int count;
1399     uint32_t val;
1400     flash_loader_t fl;
1401
1402     ILOG("Starting Half page flash write for STM32L core id\n");
1403     /* flash loader initialization */
1404     if (init_flash_loader(sl, &fl) == -1) {
1405         WLOG("init_flash_loader() == -1\n");
1406         return -1;
1407     }
1408     /* Unlock already done */
1409     val = stlink_read_debug32(sl, STM32L_FLASH_PECR);
1410     val |= (1 << FLASH_L1_FPRG);
1411     stlink_write_debug32(sl, STM32L_FLASH_PECR, val);
1412
1413     val |= (1 << FLASH_L1_PROG);
1414     stlink_write_debug32(sl, STM32L_FLASH_PECR, val);
1415     while ((stlink_read_debug32(sl, STM32L_FLASH_SR) & (1 << 0)) != 0) {}
1416
1417 #define L1_WRITE_BLOCK_SIZE 0x80
1418     for (count = 0; count  < num_half_pages; count ++) {
1419         if (run_flash_loader(sl, &fl, addr + count * L1_WRITE_BLOCK_SIZE, base + count * L1_WRITE_BLOCK_SIZE, L1_WRITE_BLOCK_SIZE) == -1) {
1420             WLOG("l1_run_flash_loader(%#zx) failed! == -1\n", addr + count * L1_WRITE_BLOCK_SIZE);
1421             val = stlink_read_debug32(sl, STM32L_FLASH_PECR);
1422             val &= ~((1 << FLASH_L1_FPRG) |(1 << FLASH_L1_PROG));
1423             stlink_write_debug32(sl, STM32L_FLASH_PECR, val);
1424             return -1;
1425         }
1426         /* wait for sr.busy to be cleared */
1427         if (sl->verbose >= 1) {
1428             /* show progress. writing procedure is slow
1429                and previous errors are misleading */
1430             fprintf(stdout, "\r%3u/%u halfpages written", count + 1, num_half_pages);
1431             fflush(stdout);
1432         }
1433         while ((stlink_read_debug32(sl, STM32L_FLASH_SR) & (1 << 0)) != 0) {
1434         }
1435     }
1436     val = stlink_read_debug32(sl, STM32L_FLASH_PECR);
1437     val &= ~(1 << FLASH_L1_PROG);
1438     stlink_write_debug32(sl, STM32L_FLASH_PECR, val);
1439     val = stlink_read_debug32(sl, STM32L_FLASH_PECR);
1440     val &= ~(1 << FLASH_L1_FPRG);
1441     stlink_write_debug32(sl, STM32L_FLASH_PECR, val);
1442
1443     return 0;
1444 }
1445
1446 int stlink_write_flash(stlink_t *sl, stm32_addr_t addr, uint8_t* base, uint32_t len) {
1447     size_t off;
1448     flash_loader_t fl;
1449     ILOG("Attempting to write %d (%#x) bytes to stm32 address: %u (%#x)\n",
1450         len, len, addr, addr);
1451     /* check addr range is inside the flash */
1452     stlink_calculate_pagesize(sl, addr);
1453     if (addr < sl->flash_base) {
1454         ELOG("addr too low %#x < %#x\n", addr, sl->flash_base);
1455         return -1;
1456     } else if ((addr + len) < addr) {
1457         ELOG("addr overruns\n");
1458         return -1;
1459     } else if ((addr + len) > (sl->flash_base + sl->flash_size)) {
1460         ELOG("addr too high\n");
1461         return -1;
1462     } else if (addr & 1) {
1463         ELOG("unaligned addr 0x%x\n", addr);
1464         return -1;
1465     } else if (len & 1) {
1466         WLOG("unaligned len 0x%x -- padding with zero\n", len);
1467         len += 1;
1468     } else if (addr & (sl->flash_pgsz - 1)) {
1469         ELOG("addr not a multiple of pagesize, not supported\n");
1470         return -1;
1471     }
1472
1473     // Make sure we've loaded the context with the chip details
1474     stlink_core_id(sl);
1475     /* erase each page */
1476     int page_count = 0;
1477     for (off = 0; off < len; off += stlink_calculate_pagesize(sl, addr + off)) {
1478         /* addr must be an addr inside the page */
1479         if (stlink_erase_flash_page(sl, addr + off) == -1) {
1480             ELOG("Failed to erase_flash_page(%#zx) == -1\n", addr + off);
1481             return -1;
1482         }
1483         fprintf(stdout,"\rFlash page at addr: 0x%08lx erased",
1484                 (unsigned long)addr + off);
1485         fflush(stdout);
1486         page_count++;
1487     }
1488     fprintf(stdout,"\n");
1489     ILOG("Finished erasing %d pages of %d (%#x) bytes\n",
1490         page_count, sl->flash_pgsz, sl->flash_pgsz);
1491
1492     if ((sl->chip_id == STM32_CHIPID_F2) || (sl->chip_id == STM32_CHIPID_F4)) {
1493         /* todo: check write operation */
1494
1495         ILOG("Starting Flash write for F2/F4\n");
1496         /* flash loader initialization */
1497         if (init_flash_loader(sl, &fl) == -1) {
1498             ELOG("init_flash_loader() == -1\n");
1499             return -1;
1500         }
1501
1502         /* First unlock the cr */
1503         unlock_flash_if(sl);
1504
1505         /* TODO: Check that Voltage range is 2.7 - 3.6 V */
1506         /* set parallelisim to 32 bit*/
1507         write_flash_cr_psiz(sl, 2);
1508
1509         /* set programming mode */
1510         set_flash_cr_pg(sl);
1511
1512         for(off = 0; off < len;) {
1513             size_t size = len - off > 0x8000 ? 0x8000 : len - off;
1514
1515             printf("size: %zu\n", size);
1516
1517             if (run_flash_loader(sl, &fl, addr + off, base + off, size) == -1) {
1518                 ELOG("run_flash_loader(%#zx) failed! == -1\n", addr + off);
1519                 return -1;
1520             }
1521
1522             off += size;
1523         }
1524
1525 #if 0
1526 #define PROGRESS_CHUNK_SIZE 0x1000
1527         /* write a word in program memory */
1528         for (off = 0; off < len; off += sizeof(uint32_t)) {
1529             uint32_t data;
1530             if (sl->verbose >= 1) {
1531                 if ((off & (PROGRESS_CHUNK_SIZE - 1)) == 0) {
1532                     /* show progress. writing procedure is slow
1533                        and previous errors are misleading */
1534                     const uint32_t pgnum = (off / PROGRESS_CHUNK_SIZE)+1;
1535                     const uint32_t pgcount = len / PROGRESS_CHUNK_SIZE +1;
1536                     fprintf(stdout, "Writing %ukB chunk %u out of %u\n",
1537                             PROGRESS_CHUNK_SIZE/1024, pgnum, pgcount);
1538                 }
1539             }
1540
1541             write_uint32((unsigned char*) &data, *(uint32_t*) (base + off));
1542             stlink_write_debug32(sl, addr + off, data);
1543
1544             /* wait for sr.busy to be cleared */
1545             wait_flash_busy(sl);
1546
1547         }
1548 #endif
1549         /* Relock flash */
1550         lock_flash(sl);
1551
1552 #if 0 /* todo: debug mode */
1553         fprintf(stdout, "Final CR:0x%x\n", read_flash_cr(sl));
1554 #endif
1555
1556     }   //STM32F4END
1557
1558     else if (sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS)    {
1559         /* use fast word write. todo: half page. */
1560         uint32_t val;
1561
1562 #if 0 /* todo: check write operation */
1563
1564         uint32_t nwrites = sl->flash_pgsz;
1565
1566         redo_write:
1567
1568 #endif /* todo: check write operation */
1569
1570         /* disable pecr protection */
1571         stlink_write_debug32(sl, STM32L_FLASH_PEKEYR, 0x89abcdef);
1572         stlink_write_debug32(sl, STM32L_FLASH_PEKEYR, 0x02030405);
1573
1574         /* check pecr.pelock is cleared */
1575         val = stlink_read_debug32(sl, STM32L_FLASH_PECR);
1576         if (val & (1 << 0)) {
1577                 fprintf(stderr, "pecr.pelock not clear\n");
1578                 return -1;
1579         }
1580
1581         /* unlock program memory */
1582         stlink_write_debug32(sl, STM32L_FLASH_PRGKEYR, 0x8c9daebf);
1583         stlink_write_debug32(sl, STM32L_FLASH_PRGKEYR, 0x13141516);
1584
1585         /* check pecr.prglock is cleared */
1586         val = stlink_read_debug32(sl, STM32L_FLASH_PECR);
1587         if (val & (1 << 1)) {
1588                 fprintf(stderr, "pecr.prglock not clear\n");
1589                 return -1;
1590         }
1591         off = 0;
1592         if (len > L1_WRITE_BLOCK_SIZE) {
1593             if (stm32l1_write_half_pages(sl, addr, base, len/L1_WRITE_BLOCK_SIZE) == -1) {
1594                 /* This may happen on a blank device! */
1595                 WLOG("\nwrite_half_pages failed == -1\n");
1596             } else {
1597                 off = (len /L1_WRITE_BLOCK_SIZE)*L1_WRITE_BLOCK_SIZE;
1598             }
1599         }
1600
1601         /* write remainingword in program memory */
1602         for ( ; off < len; off += sizeof(uint32_t)) {
1603             uint32_t data;
1604             if (off > 254)
1605                 fprintf(stdout, "\r");
1606
1607             if ((off % sl->flash_pgsz) > (sl->flash_pgsz -5)) {
1608                 fprintf(stdout, "\r%3zd/%3zd pages written",
1609                         off/sl->flash_pgsz, len/sl->flash_pgsz);
1610                 fflush(stdout);
1611             }
1612
1613             write_uint32((unsigned char*) &data, *(uint32_t*) (base + off));
1614             stlink_write_debug32(sl, addr + off, data);
1615
1616             /* wait for sr.busy to be cleared */
1617             while ((stlink_read_debug32(sl, STM32L_FLASH_SR) & (1 << 0)) != 0)
1618                 ;
1619
1620 #if 0 /* todo: check redo write operation */
1621
1622             /* check written bytes. todo: should be on a per page basis. */
1623             data = stlink_read_debug32(sl, addr + off);
1624             if (data == *(uint32_t*)(base + off)) {
1625                 /* re erase the page and redo the write operation */
1626                 uint32_t page;
1627                 uint32_t val;
1628
1629                 /* fail if successive write count too low */
1630                 if (nwrites < sl->flash_pgsz) {
1631                     fprintf(stderr, "writes operation failure count too high, aborting\n");
1632                     return -1;
1633                 }
1634
1635                 nwrites = 0;
1636
1637                 /* assume addr aligned */
1638                 if (off % sl->flash_pgsz) off &= ~(sl->flash_pgsz - 1);
1639                 page = addr + off;
1640
1641                 fprintf(stderr, "invalid write @0x%x(0x%x): 0x%x != 0x%x. retrying.\n",
1642                         page, addr + off, read_uint32(base + off, 0), read_uint32(sl->q_buf, 0));
1643
1644                 /* reset lock bits */
1645                 val = stlink_read_debug32(sl, STM32L_FLASH_PECR)
1646                     | (1 << 0) | (1 << 1) | (1 << 2);
1647                 stlink_write_debug32(sl, STM32L_FLASH_PECR, val);
1648
1649                 stlink_erase_flash_page(sl, page);
1650
1651                 goto redo_write;
1652             }
1653
1654             /* increment successive writes counter */
1655             ++nwrites;
1656
1657 #endif /* todo: check redo write operation */
1658         }
1659         fprintf(stdout, "\n");
1660         /* reset lock bits */
1661         val = stlink_read_debug32(sl, STM32L_FLASH_PECR)
1662              | (1 << 0) | (1 << 1) | (1 << 2);
1663         stlink_write_debug32(sl, STM32L_FLASH_PECR, val);
1664     } 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) {
1665         ILOG("Starting Flash write for VL/F0 core id\n");
1666         /* flash loader initialization */
1667         if (init_flash_loader(sl, &fl) == -1) {
1668             ELOG("init_flash_loader() == -1\n");
1669             return -1;
1670         }
1671
1672         int write_block_count = 0;
1673         for (off = 0; off < len; off += sl->flash_pgsz) {
1674             /* adjust last write size */
1675             size_t size = sl->flash_pgsz;
1676             if ((off + sl->flash_pgsz) > len) size = len - off;
1677
1678             /* unlock and set programming mode */
1679             unlock_flash_if(sl);
1680             set_flash_cr_pg(sl);
1681             //DLOG("Finished setting flash cr pg, running loader!\n");
1682             if (run_flash_loader(sl, &fl, addr + off, base + off, size) == -1) {
1683                 ELOG("run_flash_loader(%#zx) failed! == -1\n", addr + off);
1684                 return -1;
1685             }
1686             lock_flash(sl);
1687             if (sl->verbose >= 1) {
1688                 /* show progress. writing procedure is slow
1689                    and previous errors are misleading */
1690               fprintf(stdout, "\r%3u/%lu pages written", write_block_count++, (unsigned long)len/sl->flash_pgsz);
1691                 fflush(stdout);
1692             }
1693         }
1694         fprintf(stdout, "\n");
1695     } else {
1696         ELOG("unknown coreid, not sure how to write: %x\n", sl->core_id);
1697         return -1;
1698     }
1699
1700     return stlink_verify_write_flash(sl, addr, base, len);
1701 }
1702
1703 /**
1704  * Write the given binary file into flash at address "addr"
1705  * @param sl
1706  * @param path readable file path, should be binary image
1707  * @param addr where to start writing
1708  * @return 0 on success, -ve on failure.
1709  */
1710 int stlink_fwrite_flash(stlink_t *sl, const char* path, stm32_addr_t addr) {
1711     /* write the file in flash at addr */
1712     int err;
1713     unsigned int num_empty = 0, index;
1714     unsigned char erased_pattern =(sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS)?0:0xff;
1715     mapped_file_t mf = MAPPED_FILE_INITIALIZER;
1716     if (map_file(&mf, path) == -1) {
1717         ELOG("map_file() == -1\n");
1718         return -1;
1719     }
1720     for(index = 0; index < mf.len; index ++) {
1721         if (mf.base[index] == erased_pattern)
1722             num_empty ++;
1723         else
1724             num_empty = 0;
1725     }
1726     if(num_empty != 0) {
1727         ILOG("Ignoring %d bytes of Zeros at end of file\n",num_empty);
1728         mf.len -= num_empty;
1729     }
1730     err = stlink_write_flash(sl, addr, mf.base, mf.len);
1731     /* set stack*/
1732     stlink_write_reg(sl, stlink_read_debug32(sl, addr    ),13);
1733     /* Set PC to the reset routine*/
1734     stlink_write_reg(sl, stlink_read_debug32(sl, addr + 4),15);
1735     stlink_run(sl);
1736     unmap_file(&mf);
1737     return err;
1738 }
1739
1740 int run_flash_loader(stlink_t *sl, flash_loader_t* fl, stm32_addr_t target, const uint8_t* buf, size_t size) {
1741
1742     reg rr;
1743     int i = 0;
1744     DLOG("Running flash loader, write address:%#x, size: %zd\n", target, size);
1745     // FIXME This can never return -1
1746     if (write_buffer_to_sram(sl, fl, buf, size) == -1) {
1747         // IMPOSSIBLE!
1748         ELOG("write_buffer_to_sram() == -1\n");
1749         return -1;
1750     }
1751
1752     if (sl->chip_id == STM32_CHIPID_L1_MEDIUM  || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS) {
1753
1754         size_t count = size / sizeof(uint32_t);
1755         if (size % sizeof(uint32_t)) ++count;
1756
1757         /* setup core */
1758         stlink_write_reg(sl, target, 0); /* target */
1759         stlink_write_reg(sl, fl->buf_addr, 1); /* source */
1760         stlink_write_reg(sl, count, 2); /* count (32 bits words) */
1761         stlink_write_reg(sl, fl->loader_addr, 15); /* pc register */
1762
1763     } 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) {
1764
1765         size_t count = size / sizeof(uint16_t);
1766         if (size % sizeof(uint16_t)) ++count;
1767
1768         /* setup core */
1769         stlink_write_reg(sl, fl->buf_addr, 0); /* source */
1770         stlink_write_reg(sl, target, 1); /* target */
1771         stlink_write_reg(sl, count, 2); /* count (16 bits half words) */
1772         stlink_write_reg(sl, 0, 3); /* flash bank 0 (input) */
1773         stlink_write_reg(sl, fl->loader_addr, 15); /* pc register */
1774
1775     } else if (sl->chip_id == STM32_CHIPID_F2 || sl->chip_id == STM32_CHIPID_F4) {
1776
1777         size_t count = size / sizeof(uint32_t);
1778         if (size % sizeof(uint32_t)) ++count;
1779
1780         /* setup core */
1781         stlink_write_reg(sl, fl->buf_addr, 0); /* source */
1782         stlink_write_reg(sl, target, 1); /* target */
1783         stlink_write_reg(sl, count, 2); /* count (32 bits words) */
1784         stlink_write_reg(sl, fl->loader_addr, 15); /* pc register */
1785
1786     } else {
1787         fprintf(stderr, "unknown coreid 0x%x, don't know what flash loader to use\n", sl->core_id);
1788         return -1;
1789     }
1790
1791     /* run loader */
1792     stlink_run(sl);
1793
1794 #define WAIT_ROUNDS 1000
1795     /* wait until done (reaches breakpoint) */
1796     for (i = 0; i < WAIT_ROUNDS; i++) {
1797         usleep(10);
1798         if (is_core_halted(sl))
1799             break;
1800     }
1801
1802     if (i >= WAIT_ROUNDS) {
1803         ELOG("flash loader run error\n");
1804         return -1;
1805     }
1806
1807     /* check written byte count */
1808     if (sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS) {
1809
1810       size_t count = size / sizeof(uint32_t);
1811       if (size % sizeof(uint32_t)) ++count;
1812
1813       stlink_read_reg(sl, 3, &rr);
1814       if (rr.r[3] != count) {
1815         fprintf(stderr, "write error, count == %u\n", rr.r[3]);
1816         return -1;
1817       }
1818
1819     } 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) {
1820
1821       stlink_read_reg(sl, 2, &rr);
1822       if (rr.r[2] != 0) {
1823         fprintf(stderr, "write error, count == %u\n", rr.r[2]);
1824         return -1;
1825       }
1826
1827     } else if (sl->chip_id == STM32_CHIPID_F2 || sl->chip_id == STM32_CHIPID_F4) {
1828
1829         stlink_read_reg(sl, 2, &rr);
1830         if (rr.r[2] != 0) {
1831             fprintf(stderr, "write error, count == %u\n", rr.r[2]);
1832             return -1;
1833         }
1834
1835     } else {
1836
1837       fprintf(stderr, "unknown coreid 0x%x, can't check written byte count\n", sl->core_id);
1838       return -1;
1839
1840     }
1841
1842     return 0;
1843 }