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