Flash loader for STM32L4
[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     static const uint8_t loader_code_stm32l4[] = {
1507         // flashloaders/stm32l4.s
1508         0x08, 0x4b,             // start: ldr   r3, [pc, #32] ; <flash_base>
1509         0x72, 0xb1,             // next:  cbz   r2, <done>
1510         0x04, 0x68,             //        ldr   r4, [r0, #0]
1511         0x45, 0x68,             //        ldr   r5, [r0, #4]
1512         0x0c, 0x60,             //        str   r4, [r1, #0]
1513         0x4d, 0x60,             //        str   r5, [r1, #4]
1514         0x5c, 0x8a,             // wait:  ldrh  r4, [r3, #18]
1515         0x14, 0xf0, 0x01, 0x0f, //        tst.w r4, #1
1516         0xfb, 0xd1,             //        bne.n <wait>
1517         0x00, 0xf1, 0x08, 0x00, //        add.w r0, r0, #8
1518         0x01, 0xf1, 0x08, 0x01, //        add.w r1, r1, #8
1519         0xa2, 0xf1, 0x02, 0x02, //        add.w r2, r2, #2
1520         0xef, 0xe7,             //        b.n   <next>
1521         0x00, 0xbe,             // done:  bkpt  0x0000
1522         0x00, 0x20, 0x02, 0x40  // flash_base:  .word 0x40022000
1523     };
1524
1525     const uint8_t* loader_code;
1526     size_t loader_size;
1527
1528     if (sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_CAT2
1529             || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS || sl->chip_id == STM32_CHIPID_L1_HIGH
1530             || sl->chip_id == STM32_CHIPID_L152_RE) { /* stm32l */
1531         loader_code = loader_code_stm32l;
1532         loader_size = sizeof(loader_code_stm32l);
1533     } else if (sl->core_id == STM32VL_CORE_ID 
1534             || sl->chip_id == STM32_CHIPID_F3
1535             || sl->chip_id == STM32_CHIPID_F303_HIGH
1536             || sl->chip_id == STM32_CHIPID_F37x
1537             || sl->chip_id == STM32_CHIPID_F334) {
1538         loader_code = loader_code_stm32vl;
1539         loader_size = sizeof(loader_code_stm32vl);
1540     } else if (sl->chip_id == STM32_CHIPID_F2 || sl->chip_id == STM32_CHIPID_F4 || (sl->chip_id == STM32_CHIPID_F4_DE) ||
1541             sl->chip_id == STM32_CHIPID_F4_LP || sl->chip_id == STM32_CHIPID_F4_HD || (sl->chip_id == STM32_CHIPID_F411RE) ||
1542             (sl->chip_id == STM32_CHIPID_F446)){
1543         int voltage = stlink_target_voltage(sl);
1544         if (voltage > 2700) {
1545             loader_code = loader_code_stm32f4;
1546             loader_size = sizeof(loader_code_stm32f4);
1547         } else {
1548             loader_code = loader_code_stm32f4_lv;
1549             loader_size = sizeof(loader_code_stm32f4_lv);
1550         }
1551     } 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) {
1552         loader_code = loader_code_stm32f0;
1553         loader_size = sizeof(loader_code_stm32f0);
1554     } else if (sl->chip_id == STM32_CHIPID_L0) {
1555         loader_code = loader_code_stm32l0;
1556         loader_size = sizeof(loader_code_stm32l0);
1557     } else if (sl->chip_id == STM32_CHIPID_L4) {
1558         loader_code = loader_code_stm32l4;
1559         loader_size = sizeof(loader_code_stm32l4);
1560     } else {
1561         ELOG("unknown coreid, not sure what flash loader to use, aborting!: %x\n", sl->core_id);
1562         return -1;
1563     }
1564
1565     memcpy(sl->q_buf, loader_code, loader_size);
1566     stlink_write_mem32(sl, sl->sram_base, loader_size);
1567
1568     *addr = sl->sram_base;
1569     *size = loader_size;
1570
1571     /* success */
1572     return 0;
1573 }
1574
1575 int stlink_fcheck_flash(stlink_t *sl, const char* path, stm32_addr_t addr) {
1576     /* check the contents of path are at addr */
1577
1578     int res;
1579     mapped_file_t mf = MAPPED_FILE_INITIALIZER;
1580
1581     if (map_file(&mf, path) == -1)
1582         return -1;
1583
1584     res = check_file(sl, &mf, addr);
1585
1586     unmap_file(&mf);
1587
1588     return res;
1589 }
1590
1591 /**
1592  * Verify addr..addr+len is binary identical to base...base+len
1593  * @param sl stlink context
1594  * @param address stm device address
1595  * @param data host side buffer to check against
1596  * @param length how much
1597  * @return 0 for success, -ve for failure
1598  */
1599 int stlink_verify_write_flash(stlink_t *sl, stm32_addr_t address, uint8_t *data, unsigned length) {
1600     size_t off;
1601     size_t cmp_size = (sl->flash_pgsz > 0x1800)? 0x1800:sl->flash_pgsz;
1602     ILOG("Starting verification of write complete\n");
1603     for (off = 0; off < length; off += cmp_size) {
1604         size_t aligned_size;
1605
1606         /* adjust last page size */
1607         if ((off + cmp_size) > length)
1608             cmp_size = length - off;
1609
1610         aligned_size = cmp_size;
1611         if (aligned_size & (4 - 1))
1612             aligned_size = (cmp_size + 4) & ~(4 - 1);
1613
1614         stlink_read_mem32(sl, address + off, aligned_size);
1615
1616         if (memcmp(sl->q_buf, data + off, cmp_size)) {
1617             ELOG("Verification of flash failed at offset: %zd\n", off);
1618             return -1;
1619         }
1620     }
1621     ILOG("Flash written and verified! jolly good!\n");
1622     return 0;
1623
1624 }
1625
1626 int stm32l1_write_half_pages(stlink_t *sl, stm32_addr_t addr, uint8_t* base, uint32_t len, uint32_t pagesize)
1627 {
1628     unsigned int count;
1629     unsigned int num_half_pages = len / pagesize;
1630     uint32_t val;
1631     uint32_t flash_regs_base;
1632     flash_loader_t fl;
1633
1634     if (sl->chip_id == STM32_CHIPID_L0) {
1635         flash_regs_base = STM32L0_FLASH_REGS_ADDR;
1636     } else {
1637         flash_regs_base = STM32L_FLASH_REGS_ADDR;
1638     }
1639
1640     ILOG("Starting Half page flash write for STM32L core id\n");
1641     /* flash loader initialization */
1642     if (init_flash_loader(sl, &fl) == -1) {
1643         WLOG("init_flash_loader() == -1\n");
1644         return -1;
1645     }
1646     /* Unlock already done */
1647     val = stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF);
1648     val |= (1 << FLASH_L1_FPRG);
1649     stlink_write_debug32(sl, flash_regs_base + FLASH_PECR_OFF, val);
1650
1651     val |= (1 << FLASH_L1_PROG);
1652     stlink_write_debug32(sl, flash_regs_base + FLASH_PECR_OFF, val);
1653     while ((stlink_read_debug32(sl, flash_regs_base + FLASH_SR_OFF) & (1 << 0)) != 0) {}
1654
1655     for (count = 0; count  < num_half_pages; count ++) {
1656         if (run_flash_loader(sl, &fl, addr + count * pagesize, base + count * pagesize, pagesize) == -1) {
1657             WLOG("l1_run_flash_loader(%#zx) failed! == -1\n", addr + count * pagesize);
1658             val = stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF);
1659             val &= ~((1 << FLASH_L1_FPRG) |(1 << FLASH_L1_PROG));
1660             stlink_write_debug32(sl, flash_regs_base + FLASH_PECR_OFF, val);
1661             return -1;
1662         }
1663         /* wait for sr.busy to be cleared */
1664         if (sl->verbose >= 1) {
1665             /* show progress. writing procedure is slow
1666                and previous errors are misleading */
1667             fprintf(stdout, "\r%3u/%u halfpages written", count + 1, num_half_pages);
1668             fflush(stdout);
1669         }
1670         while ((stlink_read_debug32(sl, flash_regs_base + FLASH_SR_OFF) & (1 << 0)) != 0) {
1671         }
1672     }
1673     val = stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF);
1674     val &= ~(1 << FLASH_L1_PROG);
1675     stlink_write_debug32(sl, flash_regs_base + FLASH_PECR_OFF, val);
1676     val = stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF);
1677     val &= ~(1 << FLASH_L1_FPRG);
1678     stlink_write_debug32(sl, flash_regs_base + FLASH_PECR_OFF, val);
1679
1680     return 0;
1681 }
1682
1683 int stlink_write_flash(stlink_t *sl, stm32_addr_t addr, uint8_t* base, uint32_t len) {
1684     size_t off;
1685     flash_loader_t fl;
1686     ILOG("Attempting to write %d (%#x) bytes to stm32 address: %u (%#x)\n",
1687             len, len, addr, addr);
1688     /* check addr range is inside the flash */
1689     stlink_calculate_pagesize(sl, addr);
1690     if (addr < sl->flash_base) {
1691         ELOG("addr too low %#x < %#x\n", addr, sl->flash_base);
1692         return -1;
1693     } else if ((addr + len) < addr) {
1694         ELOG("addr overruns\n");
1695         return -1;
1696     } else if ((addr + len) > (sl->flash_base + sl->flash_size)) {
1697         ELOG("addr too high\n");
1698         return -1;
1699     } else if (addr & 1) {
1700         ELOG("unaligned addr 0x%x\n", addr);
1701         return -1;
1702     } else if (len & 1) {
1703         WLOG("unaligned len 0x%x -- padding with zero\n", len);
1704         len += 1;
1705     } else if (addr & (sl->flash_pgsz - 1)) {
1706         ELOG("addr not a multiple of pagesize, not supported\n");
1707         return -1;
1708     }
1709
1710     // Make sure we've loaded the context with the chip details
1711     stlink_core_id(sl);
1712     /* erase each page */
1713     int page_count = 0;
1714     for (off = 0; off < len; off += stlink_calculate_pagesize(sl, addr + off)) {
1715         /* addr must be an addr inside the page */
1716         if (stlink_erase_flash_page(sl, addr + off) == -1) {
1717             ELOG("Failed to erase_flash_page(%#zx) == -1\n", addr + off);
1718             return -1;
1719         }
1720         fprintf(stdout,"\rFlash page at addr: 0x%08lx erased",
1721                 (unsigned long)addr + off);
1722         fflush(stdout);
1723         page_count++;
1724     }
1725     fprintf(stdout,"\n");
1726     ILOG("Finished erasing %d pages of %d (%#x) bytes\n",
1727             page_count, sl->flash_pgsz, sl->flash_pgsz);
1728
1729     if ((sl->chip_id == STM32_CHIPID_F2) ||
1730         (sl->chip_id == STM32_CHIPID_F4) ||
1731         (sl->chip_id == STM32_CHIPID_F4_DE) ||
1732         (sl->chip_id == STM32_CHIPID_F4_LP) ||
1733         (sl->chip_id == STM32_CHIPID_F4_HD) ||
1734         (sl->chip_id == STM32_CHIPID_F411RE) ||
1735         (sl->chip_id == STM32_CHIPID_F446) ||
1736         (sl->chip_id == STM32_CHIPID_L4)) {
1737         /* todo: check write operation */
1738
1739         ILOG("Starting Flash write for F2/F4/L4\n");
1740         /* flash loader initialization */
1741         if (init_flash_loader(sl, &fl) == -1) {
1742             ELOG("init_flash_loader() == -1\n");
1743             return -1;
1744         }
1745
1746         /* First unlock the cr */
1747         unlock_flash_if(sl);
1748
1749         /* TODO: Check that Voltage range is 2.7 - 3.6 V */
1750         if (sl->chip_id != STM32_CHIPID_L4) {
1751             /* set parallelisim to 32 bit*/
1752             int voltage = stlink_target_voltage(sl);
1753             if (voltage > 2700) {
1754                 printf("enabling 32-bit flash writes\n");
1755                 write_flash_cr_psiz(sl, 2);
1756             } else {
1757                 printf("Target voltage (%d mV) too low for 32-bit flash, using 8-bit flash writes\n", voltage);
1758                 write_flash_cr_psiz(sl, 0);
1759             }
1760         } else {
1761             /* L4 does not have a byte-write mode */
1762             int voltage = stlink_target_voltage(sl);
1763             if (voltage <= 2700) {
1764                 printf("Target voltage (%d mV) too low for flash writes!\n", voltage);
1765                 return -1;
1766             }
1767         }
1768
1769         /* set programming mode */
1770         set_flash_cr_pg(sl);
1771
1772         for(off = 0; off < len;) {
1773             size_t size = len - off > 0x8000 ? 0x8000 : len - off;
1774
1775             printf("size: %zu\n", size);
1776
1777             if (run_flash_loader(sl, &fl, addr + off, base + off, size) == -1) {
1778                 ELOG("run_flash_loader(%#zx) failed! == -1\n", addr + off);
1779                 return -1;
1780             }
1781
1782             off += size;
1783         }
1784
1785         /* Relock flash */
1786         lock_flash(sl);
1787
1788     }   //STM32F4END
1789
1790     else if (sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_CAT2
1791             || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS || sl->chip_id == STM32_CHIPID_L1_HIGH
1792             || sl->chip_id == STM32_CHIPID_L152_RE || sl->chip_id == STM32_CHIPID_L0) {
1793         /* use fast word write. todo: half page. */
1794         uint32_t val;
1795         uint32_t flash_regs_base;
1796         uint32_t pagesize;
1797
1798         if (sl->chip_id == STM32_CHIPID_L0) {
1799             flash_regs_base = STM32L0_FLASH_REGS_ADDR;
1800             pagesize = L0_WRITE_BLOCK_SIZE;
1801         } else {
1802             flash_regs_base = STM32L_FLASH_REGS_ADDR;
1803             pagesize = L1_WRITE_BLOCK_SIZE;
1804         }
1805
1806         /* todo: check write operation */
1807
1808         /* disable pecr protection */
1809         stlink_write_debug32(sl, flash_regs_base + FLASH_PEKEYR_OFF, 0x89abcdef);
1810         stlink_write_debug32(sl, flash_regs_base + FLASH_PEKEYR_OFF, 0x02030405);
1811
1812         /* check pecr.pelock is cleared */
1813         val = stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF);
1814         if (val & (1 << 0)) {
1815             fprintf(stderr, "pecr.pelock not clear\n");
1816             return -1;
1817         }
1818
1819         /* unlock program memory */
1820         stlink_write_debug32(sl, flash_regs_base + FLASH_PRGKEYR_OFF, 0x8c9daebf);
1821         stlink_write_debug32(sl, flash_regs_base + FLASH_PRGKEYR_OFF, 0x13141516);
1822
1823         /* check pecr.prglock is cleared */
1824         val = stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF);
1825         if (val & (1 << 1)) {
1826             fprintf(stderr, "pecr.prglock not clear\n");
1827             return -1;
1828         }
1829         off = 0;
1830         if (len > pagesize) {
1831             if (stm32l1_write_half_pages(sl, addr, base, len, pagesize) == -1) {
1832                 /* This may happen on a blank device! */
1833                 WLOG("\nwrite_half_pages failed == -1\n");
1834             } else {
1835                 off = (len / pagesize)*pagesize;
1836             }
1837         }
1838
1839         /* write remainingword in program memory */
1840         for ( ; off < len; off += sizeof(uint32_t)) {
1841             uint32_t data;
1842             if (off > 254)
1843                 fprintf(stdout, "\r");
1844
1845             if ((off % sl->flash_pgsz) > (sl->flash_pgsz -5)) {
1846                 fprintf(stdout, "\r%3zd/%3zd pages written",
1847                         off/sl->flash_pgsz, len/sl->flash_pgsz);
1848                 fflush(stdout);
1849             }
1850
1851             write_uint32((unsigned char*) &data, *(uint32_t*) (base + off));
1852             stlink_write_debug32(sl, addr + off, data);
1853
1854             /* wait for sr.busy to be cleared */
1855             while ((stlink_read_debug32(sl, flash_regs_base + FLASH_SR_OFF) & (1 << 0)) != 0)
1856                 ;
1857
1858             /* todo: check redo write operation */
1859
1860         }
1861         fprintf(stdout, "\n");
1862         /* reset lock bits */
1863         val = stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF)
1864             | (1 << 0) | (1 << 1) | (1 << 2);
1865         stlink_write_debug32(sl, flash_regs_base + FLASH_PECR_OFF, val);
1866     } else if (sl->core_id == STM32VL_CORE_ID ||
1867                 sl->core_id == STM32F0_CORE_ID ||
1868                 sl->chip_id == STM32_CHIPID_F3  ||
1869                 sl->chip_id == STM32_CHIPID_F303_HIGH ||
1870                 sl->chip_id == STM32_CHIPID_F334 ||
1871                 sl->chip_id == STM32_CHIPID_F37x) {
1872         ILOG("Starting Flash write for VL/F0/F3 core id\n");
1873         /* flash loader initialization */
1874         if (init_flash_loader(sl, &fl) == -1) {
1875             ELOG("init_flash_loader() == -1\n");
1876             return -1;
1877         }
1878
1879         int write_block_count = 0;
1880         for (off = 0; off < len; off += sl->flash_pgsz) {
1881             /* adjust last write size */
1882             size_t size = sl->flash_pgsz;
1883             if ((off + sl->flash_pgsz) > len) size = len - off;
1884
1885             /* unlock and set programming mode */
1886             unlock_flash_if(sl);
1887             set_flash_cr_pg(sl);
1888             //DLOG("Finished setting flash cr pg, running loader!\n");
1889             if (run_flash_loader(sl, &fl, addr + off, base + off, size) == -1) {
1890                 ELOG("run_flash_loader(%#zx) failed! == -1\n", addr + off);
1891                 return -1;
1892             }
1893             lock_flash(sl);
1894             if (sl->verbose >= 1) {
1895                 /* show progress. writing procedure is slow
1896                    and previous errors are misleading */
1897                 fprintf(stdout, "\r%3u/%lu pages written", write_block_count++, (unsigned long)len/sl->flash_pgsz);
1898                 fflush(stdout);
1899             }
1900         }
1901         fprintf(stdout, "\n");
1902     } else {
1903         ELOG("unknown coreid, not sure how to write: %x\n", sl->core_id);
1904         return -1;
1905     }
1906
1907     return stlink_verify_write_flash(sl, addr, base, len);
1908 }
1909
1910 /**
1911  * Write the given binary file into flash at address "addr"
1912  * @param sl
1913  * @param path readable file path, should be binary image
1914  * @param addr where to start writing
1915  * @return 0 on success, -ve on failure.
1916  */
1917 int stlink_fwrite_flash(stlink_t *sl, const char* path, stm32_addr_t addr) {
1918     /* write the file in flash at addr */
1919     int err;
1920     unsigned int num_empty = 0, index;
1921     unsigned char erased_pattern = (sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_CAT2
1922             || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS || sl->chip_id == STM32_CHIPID_L1_HIGH
1923             || sl->chip_id == STM32_CHIPID_L152_RE) ? 0:0xff;
1924     mapped_file_t mf = MAPPED_FILE_INITIALIZER;
1925     if (map_file(&mf, path) == -1) {
1926         ELOG("map_file() == -1\n");
1927         return -1;
1928     }
1929     for(index = 0; index < mf.len; index ++) {
1930         if (mf.base[index] == erased_pattern)
1931             num_empty ++;
1932         else
1933             num_empty = 0;
1934     }
1935     /* Round down to words */
1936     num_empty -= (num_empty & 3);
1937     if(num_empty != 0) {
1938         ILOG("Ignoring %d bytes of 0x%02x at end of file\n", num_empty, erased_pattern);
1939         mf.len -= num_empty;
1940     }
1941     err = stlink_write_flash(sl, addr, mf.base, mf.len);
1942     /* set stack*/
1943     stlink_write_reg(sl, stlink_read_debug32(sl, addr    ),13);
1944     /* Set PC to the reset routine*/
1945     stlink_write_reg(sl, stlink_read_debug32(sl, addr + 4),15);
1946     stlink_run(sl);
1947     unmap_file(&mf);
1948     return err;
1949 }
1950
1951 int run_flash_loader(stlink_t *sl, flash_loader_t* fl, stm32_addr_t target, const uint8_t* buf, size_t size) {
1952
1953     reg rr;
1954     int i = 0;
1955     DLOG("Running flash loader, write address:%#x, size: %zd\n", target, size);
1956     // FIXME This can never return -1
1957     if (write_buffer_to_sram(sl, fl, buf, size) == -1) {
1958         // IMPOSSIBLE!
1959         ELOG("write_buffer_to_sram() == -1\n");
1960         return -1;
1961     }
1962
1963     if (sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_CAT2
1964             || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS || sl->chip_id == STM32_CHIPID_L1_HIGH
1965             || sl->chip_id == STM32_CHIPID_L152_RE || sl->chip_id == STM32_CHIPID_L0) {
1966
1967         size_t count = size / sizeof(uint32_t);
1968         if (size % sizeof(uint32_t)) ++count;
1969
1970         /* setup core */
1971         stlink_write_reg(sl, target, 0); /* target */
1972         stlink_write_reg(sl, fl->buf_addr, 1); /* source */
1973         stlink_write_reg(sl, count, 2); /* count (32 bits words) */
1974         stlink_write_reg(sl, fl->loader_addr, 15); /* pc register */
1975
1976     } else if (sl->core_id == STM32VL_CORE_ID ||
1977                 sl->core_id == STM32F0_CORE_ID ||
1978                 sl->chip_id == STM32_CHIPID_F3 ||
1979                 sl->chip_id == STM32_CHIPID_F303_HIGH ||
1980                 sl->chip_id == STM32_CHIPID_F37x ||
1981                 sl->chip_id == STM32_CHIPID_F334) {
1982
1983         size_t count = size / sizeof(uint16_t);
1984         if (size % sizeof(uint16_t)) ++count;
1985
1986         /* setup core */
1987         stlink_write_reg(sl, fl->buf_addr, 0); /* source */
1988         stlink_write_reg(sl, target, 1); /* target */
1989         stlink_write_reg(sl, count, 2); /* count (16 bits half words) */
1990         stlink_write_reg(sl, 0, 3); /* flash bank 0 (input) */
1991         stlink_write_reg(sl, fl->loader_addr, 15); /* pc register */
1992
1993     } else if (sl->chip_id == STM32_CHIPID_F2 || sl->chip_id == STM32_CHIPID_F4 || (sl->chip_id == STM32_CHIPID_F4_DE) ||
1994             sl->chip_id == STM32_CHIPID_F4_LP || sl->chip_id == STM32_CHIPID_F4_HD || (sl->chip_id == STM32_CHIPID_F411RE) ||
1995             (sl->chip_id == STM32_CHIPID_F446) || (sl->chip_id == STM32_CHIPID_L4)) {
1996
1997         size_t count = size / sizeof(uint32_t);
1998         if (size % sizeof(uint32_t)) ++count;
1999         if (sl->chip_id == STM32_CHIPID_L4) {
2000             if (count % 2) ++count;
2001         }
2002
2003         /* setup core */
2004         stlink_write_reg(sl, fl->buf_addr, 0); /* source */
2005         stlink_write_reg(sl, target, 1); /* target */
2006         stlink_write_reg(sl, count, 2); /* count (32 bits words) */
2007         stlink_write_reg(sl, fl->loader_addr, 15); /* pc register */
2008
2009     } else {
2010         fprintf(stderr, "unknown coreid 0x%x, don't know what flash loader to use\n", sl->core_id);
2011         return -1;
2012     }
2013
2014     /* run loader */
2015     stlink_run(sl);
2016
2017 #define WAIT_ROUNDS 10000
2018     /* wait until done (reaches breakpoint) */
2019     for (i = 0; i < WAIT_ROUNDS; i++) {
2020         usleep(10);
2021         if (is_core_halted(sl))
2022             break;
2023     }
2024
2025     if (i >= WAIT_ROUNDS) {
2026         ELOG("flash loader run error\n");
2027         return -1;
2028     }
2029
2030     /* check written byte count */
2031     if (sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_CAT2
2032             || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS || sl->chip_id == STM32_CHIPID_L1_HIGH
2033             || sl->chip_id == STM32_CHIPID_L152_RE || sl->chip_id == STM32_CHIPID_L0) {
2034
2035         size_t count = size / sizeof(uint32_t);
2036         if (size % sizeof(uint32_t)) ++count;
2037
2038         stlink_read_reg(sl, 3, &rr);
2039         if (rr.r[3] != count) {
2040             fprintf(stderr, "write error, count == %u\n", rr.r[3]);
2041             return -1;
2042         }
2043
2044     } else if (sl->core_id == STM32VL_CORE_ID ||
2045                 sl->core_id == STM32F0_CORE_ID ||
2046                 sl->chip_id == STM32_CHIPID_F3 ||
2047                 sl->chip_id == STM32_CHIPID_F303_HIGH ||
2048                 sl->chip_id == STM32_CHIPID_F37x ||
2049                 sl->chip_id == STM32_CHIPID_F334) {
2050
2051         stlink_read_reg(sl, 2, &rr);
2052         if (rr.r[2] != 0) {
2053             fprintf(stderr, "write error, count == %u\n", rr.r[2]);
2054             return -1;
2055         }
2056
2057     } else if (sl->chip_id == STM32_CHIPID_F2 || sl->chip_id == STM32_CHIPID_F4 || (sl->chip_id == STM32_CHIPID_F4_DE) ||
2058             sl->chip_id == STM32_CHIPID_F4_LP || sl->chip_id == STM32_CHIPID_F4_HD || (sl->chip_id == STM32_CHIPID_F411RE) ||
2059             (sl->chip_id == STM32_CHIPID_F446) || (sl->chip_id == STM32_CHIPID_L4)) {
2060
2061         stlink_read_reg(sl, 2, &rr);
2062         if (rr.r[2] != 0) {
2063             fprintf(stderr, "write error, count == %u\n", rr.r[2]);
2064             return -1;
2065         }
2066
2067     } else {
2068
2069         fprintf(stderr, "unknown coreid 0x%x, can't check written byte count\n", sl->core_id);
2070         return -1;
2071
2072     }
2073
2074     return 0;
2075 }