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