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