]> git.gag.com Git - fw/stlink/blob - src/stlink-common.c
remove empty byte truncation from stlink_fread
[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     int num_empty = 0;
1035
1036     const int fd = open(path, O_RDWR | O_TRUNC | O_CREAT, 00700);
1037     if (fd == -1) {
1038         fprintf(stderr, "open(%s) == -1\n", path);
1039         return -1;
1040     }
1041
1042     if (size <1)
1043         size = sl->flash_size;
1044
1045     if (size > sl->flash_size)
1046         size = sl->flash_size;
1047
1048     size_t cmp_size = (sl->flash_pgsz > 0x1800)? 0x1800:sl->flash_pgsz;
1049     for (off = 0; off < size; off += cmp_size) {
1050         size_t aligned_size;
1051
1052         /* adjust last page size */
1053         if ((off + cmp_size) > size)
1054             cmp_size = size - off;
1055
1056         aligned_size = cmp_size;
1057         if (aligned_size & (4 - 1))
1058             aligned_size = (cmp_size + 4) & ~(4 - 1);
1059
1060         stlink_read_mem32(sl, addr + off, aligned_size);
1061
1062         if (write(fd, sl->q_buf, sl->q_len) != (ssize_t) aligned_size) {
1063             fprintf(stderr, "write() != aligned_size\n");
1064             goto on_error;
1065         }
1066     }
1067
1068     /* success */
1069     error = 0;
1070
1071 on_error:
1072     close(fd);
1073
1074     return error;
1075 }
1076
1077 int write_buffer_to_sram(stlink_t *sl, flash_loader_t* fl, const uint8_t* buf, size_t size) {
1078     /* write the buffer right after the loader */
1079     size_t chunk = size & ~0x3;
1080     size_t rem   = size & 0x3;
1081     if (chunk) {
1082         memcpy(sl->q_buf, buf, chunk);
1083         stlink_write_mem32(sl, fl->buf_addr, chunk);
1084     }
1085     if (rem) {
1086         memcpy(sl->q_buf, buf+chunk, rem);
1087         stlink_write_mem8(sl, (fl->buf_addr)+chunk, rem);
1088     }
1089     return 0;
1090 }
1091
1092 uint32_t calculate_F4_sectornum(uint32_t flashaddr){
1093     uint32_t offset = 0;
1094     flashaddr &= ~STM32_FLASH_BASE;     //Page now holding the actual flash address
1095     if (flashaddr >= 0x100000) {
1096         offset = 12;
1097         flashaddr -= 0x100000;
1098     } 
1099     if (flashaddr<0x4000) return (offset + 0);
1100     else if(flashaddr<0x8000) return(offset + 1);
1101     else if(flashaddr<0xc000) return(offset + 2);
1102     else if(flashaddr<0x10000) return(offset + 3);
1103     else if(flashaddr<0x20000) return(offset + 4);
1104     else return offset + (flashaddr/0x20000) +4;
1105
1106 }
1107
1108 uint32_t calculate_F7_sectornum(uint32_t flashaddr){
1109     flashaddr &= ~STM32_FLASH_BASE;     //Page now holding the actual flash address
1110         if(flashaddr<0x20000) return(flashaddr/0x8000);
1111     else if(flashaddr<0x40000) return(4);
1112     else return(flashaddr/0x40000) +4;
1113
1114 }
1115
1116 // Returns BKER:PNB for the given page address
1117 uint32_t calculate_L4_page(stlink_t *sl, uint32_t flashaddr) {
1118     uint32_t bker = 0;
1119     uint32_t flashopt = stlink_read_debug32(sl, STM32L4_FLASH_OPTR);
1120     flashaddr -= STM32_FLASH_BASE;
1121     if (flashopt & (1lu << STM32L4_FLASH_OPTR_DUALBANK)) {
1122         uint32_t banksize = sl->flash_size / 2;
1123         if (flashaddr > banksize) {
1124             flashaddr -= banksize;
1125             bker = 0x100;
1126         }
1127     }
1128     // For 1MB chips without the dual-bank option set, the page address will
1129     // overflow into the BKER bit, which gives us the correct bank:page value.
1130     return bker | flashaddr/sl->flash_pgsz;
1131 }
1132
1133 uint32_t stlink_calculate_pagesize(stlink_t *sl, uint32_t flashaddr){
1134     if ((sl->chip_id == STM32_CHIPID_F2) || (sl->chip_id == STM32_CHIPID_F4) || (sl->chip_id == STM32_CHIPID_F4_DE) ||
1135             (sl->chip_id == STM32_CHIPID_F4_LP) || (sl->chip_id == STM32_CHIPID_F4_HD) || (sl->chip_id == STM32_CHIPID_F411RE) ||
1136             (sl->chip_id == STM32_CHIPID_F446) || (sl->chip_id == STM32_CHIPID_F4_DSI)) {
1137         uint32_t sector=calculate_F4_sectornum(flashaddr);
1138         if (sector>= 12) {
1139             sector -= 12;
1140         }
1141         if (sector<4) sl->flash_pgsz=0x4000;
1142         else if(sector<5) sl->flash_pgsz=0x10000;
1143         else sl->flash_pgsz=0x20000;
1144     }
1145     else if (sl->chip_id == STM32_CHIPID_F7) {
1146         uint32_t sector=calculate_F7_sectornum(flashaddr);
1147         if (sector<4) sl->flash_pgsz=0x8000;
1148         else if(sector<5) sl->flash_pgsz=0x20000;
1149         else sl->flash_pgsz=0x40000;
1150     }
1151     return (sl->flash_pgsz);
1152 }
1153
1154 /**
1155  * Erase a page of flash, assumes sl is fully populated with things like chip/core ids
1156  * @param sl stlink context
1157  * @param flashaddr an address in the flash page to erase
1158  * @return 0 on success -ve on failure
1159  */
1160 int stlink_erase_flash_page(stlink_t *sl, stm32_addr_t flashaddr)
1161 {
1162     if ((sl->chip_id == STM32_CHIPID_F2) || (sl->chip_id == STM32_CHIPID_F4) ||  (sl->chip_id == STM32_CHIPID_F4_DE) ||
1163             (sl->chip_id == STM32_CHIPID_F4_LP) || (sl->chip_id == STM32_CHIPID_F4_HD) || (sl->chip_id == STM32_CHIPID_F411RE) ||
1164             (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)) {
1165         /* wait for ongoing op to finish */
1166         wait_flash_busy(sl);
1167
1168         /* unlock if locked */
1169         unlock_flash_if(sl);
1170
1171         /* select the page to erase */
1172         if (sl->chip_id == STM32_CHIPID_L4) {
1173             // calculate the actual bank+page from the address
1174             uint32_t page = calculate_L4_page(sl, flashaddr);
1175
1176             write_flash_cr_bker_pnb(sl, page);
1177         } else if (sl->chip_id == STM32_CHIPID_F7) {
1178             // calculate the actual page from the address
1179             uint32_t sector=calculate_F7_sectornum(flashaddr);
1180
1181             fprintf(stderr, "EraseFlash - Sector:0x%x Size:0x%x\n", sector, stlink_calculate_pagesize(sl, flashaddr));
1182
1183             write_flash_cr_snb(sl, sector);
1184         } else {
1185             // calculate the actual page from the address
1186             uint32_t sector=calculate_F4_sectornum(flashaddr);
1187
1188             fprintf(stderr, "EraseFlash - Sector:0x%x Size:0x%x\n", sector, stlink_calculate_pagesize(sl, flashaddr));
1189         
1190             //the SNB values for flash sectors in the second bank do not directly follow the values for the first bank on 2mb devices...
1191             if (sector >= 12) sector += 4;
1192
1193             write_flash_cr_snb(sl, sector);
1194         }
1195
1196         /* start erase operation */
1197         set_flash_cr_strt(sl);
1198
1199         /* wait for completion */
1200         wait_flash_busy(sl);
1201
1202         /* relock the flash */
1203         //todo: fails to program if this is in
1204         lock_flash(sl);
1205 #if DEBUG_FLASH
1206         fprintf(stdout, "Erase Final CR:0x%x\n", read_flash_cr(sl));
1207 #endif
1208     } else if (sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_CAT2
1209             || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS || sl->chip_id == STM32_CHIPID_L1_HIGH
1210             || sl->chip_id == STM32_CHIPID_L152_RE || sl->chip_id == STM32_CHIPID_L0) {
1211
1212         uint32_t val;
1213         uint32_t flash_regs_base;
1214         if (sl->chip_id == STM32_CHIPID_L0) {
1215             flash_regs_base = STM32L0_FLASH_REGS_ADDR;
1216         } else {
1217             flash_regs_base = STM32L_FLASH_REGS_ADDR;
1218         }
1219
1220         /* check if the locks are set */
1221         val = stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF);
1222         if((val & (1<<0))||(val & (1<<1))) {
1223             /* disable pecr protection */
1224             stlink_write_debug32(sl, flash_regs_base + FLASH_PEKEYR_OFF, 0x89abcdef);
1225             stlink_write_debug32(sl, flash_regs_base + FLASH_PEKEYR_OFF, 0x02030405);
1226
1227             /* check pecr.pelock is cleared */
1228             val = stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF);
1229             if (val & (1 << 0)) {
1230                 WLOG("pecr.pelock not clear (%#x)\n", val);
1231                 return -1;
1232             }
1233
1234             /* unlock program memory */
1235             stlink_write_debug32(sl, flash_regs_base + FLASH_PRGKEYR_OFF, 0x8c9daebf);
1236             stlink_write_debug32(sl, flash_regs_base + FLASH_PRGKEYR_OFF, 0x13141516);
1237
1238             /* check pecr.prglock is cleared */
1239             val = stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF);
1240             if (val & (1 << 1)) {
1241                 WLOG("pecr.prglock not clear (%#x)\n", val);
1242                 return -1;
1243             }
1244         }
1245
1246         /* set pecr.{erase,prog} */
1247         val |= (1 << 9) | (1 << 3);
1248         stlink_write_debug32(sl, flash_regs_base + FLASH_PECR_OFF, val);
1249 #if 0 /* fix_to_be_confirmed */
1250
1251         /* wait for sr.busy to be cleared
1252          * MP: Test shows that busy bit is not set here. Perhaps, PM0062 is
1253          * wrong and we do not need to wait here for clearing the busy bit.
1254          * TEXANE: ok, if experience says so and it works for you, we comment
1255          * it. If someone has a problem, please drop an email.
1256          */
1257         while ((stlink_read_debug32(sl, STM32L_FLASH_SR) & (1 << 0)) != 0)
1258             ;
1259
1260 #endif /* fix_to_be_confirmed */
1261
1262         /* write 0 to the first word of the page to be erased */
1263         stlink_write_debug32(sl, flashaddr, 0);
1264
1265         /* MP: It is better to wait for clearing the busy bit after issuing
1266            page erase command, even though PM0062 recommends to wait before it.
1267            Test shows that a few iterations is performed in the following loop
1268            before busy bit is cleared.*/
1269         while ((stlink_read_debug32(sl, flash_regs_base + FLASH_SR_OFF) & (1 << 0)) != 0)
1270             ;
1271
1272         /* reset lock bits */
1273         val = stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF)
1274             | (1 << 0) | (1 << 1) | (1 << 2);
1275         stlink_write_debug32(sl, flash_regs_base + FLASH_PECR_OFF, val);
1276     } else if (sl->core_id == STM32VL_CORE_ID 
1277             || sl->core_id == STM32F0_CORE_ID 
1278             || sl->chip_id == STM32_CHIPID_F3 
1279             || sl->chip_id == STM32_CHIPID_F3_SMALL
1280             || sl->chip_id == STM32_CHIPID_F303_HIGH
1281             || sl->chip_id == STM32_CHIPID_F37x
1282             || sl->chip_id == STM32_CHIPID_F334)  {
1283         /* wait for ongoing op to finish */
1284         wait_flash_busy(sl);
1285
1286         /* unlock if locked */
1287         unlock_flash_if(sl);
1288
1289         /* set the page erase bit */
1290         set_flash_cr_per(sl);
1291
1292         /* select the page to erase */
1293         write_flash_ar(sl, flashaddr);
1294
1295         /* start erase operation, reset by hw with bsy bit */
1296         set_flash_cr_strt(sl);
1297
1298         /* wait for completion */
1299         wait_flash_busy(sl);
1300
1301         /* relock the flash */
1302         lock_flash(sl);
1303     } else {
1304         WLOG("unknown coreid %x, page erase failed\n", sl->core_id);
1305         return -1;
1306     }
1307
1308     /* todo: verify the erased page */
1309
1310     return 0;
1311 }
1312
1313 int stlink_erase_flash_mass(stlink_t *sl) {
1314     if (sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_CAT2
1315             || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS || sl->chip_id == STM32_CHIPID_L1_HIGH
1316             || sl->chip_id == STM32_CHIPID_L152_RE || sl->chip_id == STM32_CHIPID_L0) {
1317         /* erase each page */
1318         int i = 0, num_pages = sl->flash_size/sl->flash_pgsz;
1319         for (i = 0; i < num_pages; i++) {
1320             /* addr must be an addr inside the page */
1321             stm32_addr_t addr = sl->flash_base + i * sl->flash_pgsz;
1322             if (stlink_erase_flash_page(sl, addr) == -1) {
1323                 WLOG("Failed to erase_flash_page(%#zx) == -1\n", addr);
1324                 return -1;
1325             }
1326             fprintf(stdout,"\rFlash page at %5d/%5d erased", i, num_pages);
1327             fflush(stdout);
1328         }
1329         fprintf(stdout, "\n");
1330     } else {
1331         /* wait for ongoing op to finish */
1332         wait_flash_busy(sl);
1333
1334         /* unlock if locked */
1335         unlock_flash_if(sl);
1336
1337         /* set the mass erase bit */
1338         set_flash_cr_mer(sl);
1339
1340         /* start erase operation, reset by hw with bsy bit */
1341         set_flash_cr_strt(sl);
1342
1343         /* wait for completion */
1344         wait_flash_busy_progress(sl);
1345
1346         /* relock the flash */
1347         lock_flash(sl);
1348
1349         /* todo: verify the erased memory */
1350     }
1351     return 0;
1352 }
1353
1354 int init_flash_loader(stlink_t *sl, flash_loader_t* fl) {
1355     size_t size;
1356
1357     /* allocate the loader in sram */
1358     if (write_loader_to_sram(sl, &fl->loader_addr, &size) == -1) {
1359         WLOG("Failed to write flash loader to sram!\n");
1360         return -1;
1361     }
1362
1363     /* allocate a one page buffer in sram right after loader */
1364     fl->buf_addr = fl->loader_addr + size;
1365     ILOG("Successfully loaded flash loader in sram\n");
1366     return 0;
1367 }
1368
1369 int write_loader_to_sram(stlink_t *sl, stm32_addr_t* addr, size_t* size) {
1370     /* from openocd, contrib/loaders/flash/stm32.s */
1371     static const uint8_t loader_code_stm32vl[] = {
1372         0x08, 0x4c, /* ldr      r4, STM32_FLASH_BASE */
1373         0x1c, 0x44, /* add      r4, r3 */
1374         /* write_half_word: */
1375         0x01, 0x23, /* movs     r3, #0x01 */
1376         0x23, 0x61, /* str      r3, [r4, #STM32_FLASH_CR_OFFSET] */
1377         0x30, 0xf8, 0x02, 0x3b, /* ldrh r3, [r0], #0x02 */
1378         0x21, 0xf8, 0x02, 0x3b, /* strh r3, [r1], #0x02 */
1379         /* busy: */
1380         0xe3, 0x68, /* ldr      r3, [r4, #STM32_FLASH_SR_OFFSET] */
1381         0x13, 0xf0, 0x01, 0x0f, /* tst  r3, #0x01 */
1382         0xfb, 0xd0, /* beq      busy */
1383         0x13, 0xf0, 0x14, 0x0f, /* tst  r3, #0x14 */
1384         0x01, 0xd1, /* bne      exit */
1385         0x01, 0x3a, /* subs     r2, r2, #0x01 */
1386         0xf0, 0xd1, /* bne      write_half_word */
1387         /* exit: */
1388         0x00, 0xbe, /* bkpt     #0x00 */
1389         0x00, 0x20, 0x02, 0x40, /* STM32_FLASH_BASE: .word 0x40022000 */
1390     };
1391
1392     /* flashloaders/stm32f0.s -- thumb1 only, same sequence as for STM32VL, bank ignored */
1393     static const uint8_t loader_code_stm32f0[] = {
1394 #if 1
1395         /*
1396          * These two NOPs here are a safety precaution, added by Pekka Nikander
1397          * while debugging the STM32F05x support.  They may not be needed, but
1398          * there were strange problems with simpler programs, like a program
1399          * that had just a breakpoint or a program that first moved zero to register r2
1400          * and then had a breakpoint.  So, it appears safest to have these two nops.
1401          *
1402          * Feel free to remove them, if you dare, but then please do test the result
1403          * rigorously.  Also, if you remove these, it may be a good idea first to
1404          * #if 0 them out, with a comment when these were taken out, and to remove
1405          * these only a few months later...  But YMMV.
1406          */
1407         0x00, 0x30, //     nop     /* add r0,#0 */
1408         0x00, 0x30, //     nop     /* add r0,#0 */
1409 #endif
1410         0x0A, 0x4C, //     ldr     r4, STM32_FLASH_BASE
1411         0x01, 0x25, //     mov     r5, #1            /*  FLASH_CR_PG, FLASH_SR_BUSY */
1412         0x04, 0x26, //     mov     r6, #4            /*  PGERR  */
1413         // write_half_word:
1414         0x23, 0x69, //     ldr     r3, [r4, #16]     /*  FLASH->CR   */
1415         0x2B, 0x43, //     orr     r3, r5
1416         0x23, 0x61, //     str     r3, [r4, #16]     /*  FLASH->CR |= FLASH_CR_PG */
1417         0x03, 0x88, //     ldrh    r3, [r0]          /*  r3 = *sram */
1418         0x0B, 0x80, //     strh    r3, [r1]          /*  *flash = r3 */
1419         // busy:
1420         0xE3, 0x68, //     ldr     r3, [r4, #12]     /*  FLASH->SR  */
1421         0x2B, 0x42, //     tst     r3, r5            /*  FLASH_SR_BUSY  */
1422         0xFC, 0xD0, //     beq     busy
1423
1424         0x33, 0x42, //     tst     r3, r6            /*  PGERR  */
1425         0x04, 0xD1, //     bne     exit
1426
1427         0x02, 0x30, //     add     r0, r0, #2        /*  sram += 2  */
1428         0x02, 0x31, //     add     r1, r1, #2        /*  flash += 2  */
1429         0x01, 0x3A, //     sub     r2, r2, #0x01     /*  count--  */
1430         0x00, 0x2A, //     cmp     r2, #0
1431         0xF0, 0xD1, //     bne     write_half_word
1432         // exit:
1433         0x23, 0x69, //     ldr     r3, [r4, #16]     /*  FLASH->CR  */
1434         0xAB, 0x43, //     bic     r3, r5
1435         0x23, 0x61, //     str     r3, [r4, #16]     /*  FLASH->CR &= ~FLASH_CR_PG  */
1436         0x00, 0xBE, //     bkpt #0x00
1437         0x00, 0x20, 0x02, 0x40, /* STM32_FLASH_BASE: .word 0x40022000 */
1438     };
1439
1440     static const uint8_t loader_code_stm32l[] = {
1441
1442         /* openocd.git/contrib/loaders/flash/stm32lx.S
1443            r0, input, dest addr
1444            r1, input, source addr
1445            r2, input, word count
1446            r3, output, word count
1447            */
1448
1449         0x00, 0x23,
1450         0x04, 0xe0,
1451
1452         0x51, 0xf8, 0x04, 0xcb,
1453         0x40, 0xf8, 0x04, 0xcb,
1454         0x01, 0x33,
1455
1456         0x93, 0x42,
1457         0xf8, 0xd3,
1458         0x00, 0xbe
1459     };
1460
1461     static const uint8_t loader_code_stm32l0[] = {
1462
1463         /*
1464            r0, input, dest addr
1465            r1, input, source addr
1466            r2, input, word count
1467            r3, output, word count
1468          */
1469
1470         0x00, 0x23,
1471         0x04, 0xe0,
1472
1473         0x0c, 0x68,
1474         0x04, 0x60,
1475         0x01, 0x33,
1476         0x04, 0x31,
1477         0x04, 0x30,
1478
1479         0x93, 0x42,
1480         0xf8, 0xd3,
1481         0x00, 0xbe
1482     };
1483
1484     static const uint8_t loader_code_stm32f4[] = {
1485         // flashloaders/stm32f4.s
1486
1487         0x07, 0x4b,
1488
1489         0x62, 0xb1,
1490         0x04, 0x68,
1491         0x0c, 0x60,
1492
1493         0xdc, 0x89,
1494         0x14, 0xf0, 0x01, 0x0f,
1495         0xfb, 0xd1,
1496         0x00, 0xf1, 0x04, 0x00,
1497         0x01, 0xf1, 0x04, 0x01,
1498         0xa2, 0xf1, 0x01, 0x02,
1499         0xf1, 0xe7,
1500
1501         0x00, 0xbe,
1502
1503         0x00, 0x3c, 0x02, 0x40,
1504     };
1505
1506     static const uint8_t loader_code_stm32f4_lv[] = {
1507         // flashloaders/stm32f4lv.s
1508         0x92, 0x00,
1509
1510         0x08, 0x4b,
1511         0x62, 0xb1,
1512         0x04, 0x78,
1513         0x0c, 0x70,
1514
1515         0xdc, 0x89,
1516         0x14, 0xf0, 0x01, 0x0f,
1517         0xfb, 0xd1,
1518         0x00, 0xf1, 0x01, 0x00,
1519         0x01, 0xf1, 0x01, 0x01,
1520         0xa2, 0xf1, 0x01, 0x02,
1521         0xf1, 0xe7,
1522
1523         0x00, 0xbe,
1524         0x00, 0xbf,
1525
1526         0x00, 0x3c, 0x02, 0x40,
1527     };
1528
1529     static const uint8_t loader_code_stm32l4[] = {
1530         // flashloaders/stm32l4.s
1531         0x08, 0x4b,             // start: ldr   r3, [pc, #32] ; <flash_base>
1532         0x72, 0xb1,             // next:  cbz   r2, <done>
1533         0x04, 0x68,             //        ldr   r4, [r0, #0]
1534         0x45, 0x68,             //        ldr   r5, [r0, #4]
1535         0x0c, 0x60,             //        str   r4, [r1, #0]
1536         0x4d, 0x60,             //        str   r5, [r1, #4]
1537         0x5c, 0x8a,             // wait:  ldrh  r4, [r3, #18]
1538         0x14, 0xf0, 0x01, 0x0f, //        tst.w r4, #1
1539         0xfb, 0xd1,             //        bne.n <wait>
1540         0x00, 0xf1, 0x08, 0x00, //        add.w r0, r0, #8
1541         0x01, 0xf1, 0x08, 0x01, //        add.w r1, r1, #8
1542         0xa2, 0xf1, 0x02, 0x02, //        add.w r2, r2, #2
1543         0xef, 0xe7,             //        b.n   <next>
1544         0x00, 0xbe,             // done:  bkpt  0x0000
1545         0x00, 0x20, 0x02, 0x40  // flash_base:  .word 0x40022000
1546     };
1547
1548         static const uint8_t loader_code_stm32f7[] = {
1549         0x08, 0x4b,
1550         0x72, 0xb1,
1551         0x04, 0x68,
1552         0x0c, 0x60,
1553         0xbf, 0xf3, 0x4f, 0x8f,        // DSB Memory barrier for in order flash write
1554         0xdc, 0x89,
1555         0x14, 0xf0, 0x01, 0x0f,
1556         0xfb, 0xd1,
1557         0x00, 0xf1, 0x04, 0x00,
1558         0x01, 0xf1, 0x04, 0x01,
1559         0xa2, 0xf1, 0x01, 0x02,
1560         0xef, 0xe7,
1561         0x00, 0xbe,                   //     bkpt       #0x00
1562         0x00, 0x3c, 0x02, 0x40,
1563     };
1564
1565     const uint8_t* loader_code;
1566     size_t loader_size;
1567
1568     if (sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_CAT2
1569             || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS || sl->chip_id == STM32_CHIPID_L1_HIGH
1570             || sl->chip_id == STM32_CHIPID_L152_RE) { /* stm32l */
1571         loader_code = loader_code_stm32l;
1572         loader_size = sizeof(loader_code_stm32l);
1573     } else if (sl->core_id == STM32VL_CORE_ID 
1574             || sl->chip_id == STM32_CHIPID_F3
1575             || sl->chip_id == STM32_CHIPID_F3_SMALL
1576             || sl->chip_id == STM32_CHIPID_F303_HIGH
1577             || sl->chip_id == STM32_CHIPID_F37x
1578             || sl->chip_id == STM32_CHIPID_F334) {
1579         loader_code = loader_code_stm32vl;
1580         loader_size = sizeof(loader_code_stm32vl);
1581     } else if (sl->chip_id == STM32_CHIPID_F2 || sl->chip_id == STM32_CHIPID_F4 || (sl->chip_id == STM32_CHIPID_F4_DE) ||
1582             sl->chip_id == STM32_CHIPID_F4_LP || sl->chip_id == STM32_CHIPID_F4_HD || (sl->chip_id == STM32_CHIPID_F411RE) ||
1583             (sl->chip_id == STM32_CHIPID_F446) || (sl->chip_id == STM32_CHIPID_F4_DSI)){
1584         int voltage = stlink_target_voltage(sl);
1585         if (voltage > 2700) {
1586             loader_code = loader_code_stm32f4;
1587             loader_size = sizeof(loader_code_stm32f4);
1588         } else {
1589             loader_code = loader_code_stm32f4_lv;
1590             loader_size = sizeof(loader_code_stm32f4_lv);
1591         }
1592     } else if (sl->chip_id == STM32_CHIPID_F7){
1593         loader_code = loader_code_stm32f7;
1594         loader_size = sizeof(loader_code_stm32f7);
1595     } 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) {
1596         loader_code = loader_code_stm32f0;
1597         loader_size = sizeof(loader_code_stm32f0);
1598     } else if (sl->chip_id == STM32_CHIPID_L0) {
1599         loader_code = loader_code_stm32l0;
1600         loader_size = sizeof(loader_code_stm32l0);
1601     } else if (sl->chip_id == STM32_CHIPID_L4) {
1602         loader_code = loader_code_stm32l4;
1603         loader_size = sizeof(loader_code_stm32l4);
1604     } else {
1605         ELOG("unknown coreid, not sure what flash loader to use, aborting!: %x\n", sl->core_id);
1606         return -1;
1607     }
1608
1609     memcpy(sl->q_buf, loader_code, loader_size);
1610     stlink_write_mem32(sl, sl->sram_base, loader_size);
1611
1612     *addr = sl->sram_base;
1613     *size = loader_size;
1614
1615     /* success */
1616     return 0;
1617 }
1618
1619 int stlink_fcheck_flash(stlink_t *sl, const char* path, stm32_addr_t addr) {
1620     /* check the contents of path are at addr */
1621
1622     int res;
1623     mapped_file_t mf = MAPPED_FILE_INITIALIZER;
1624
1625     if (map_file(&mf, path) == -1)
1626         return -1;
1627
1628     res = check_file(sl, &mf, addr);
1629
1630     unmap_file(&mf);
1631
1632     return res;
1633 }
1634
1635 /**
1636  * Verify addr..addr+len is binary identical to base...base+len
1637  * @param sl stlink context
1638  * @param address stm device address
1639  * @param data host side buffer to check against
1640  * @param length how much
1641  * @return 0 for success, -ve for failure
1642  */
1643 int stlink_verify_write_flash(stlink_t *sl, stm32_addr_t address, uint8_t *data, unsigned length) {
1644     size_t off;
1645     size_t cmp_size = (sl->flash_pgsz > 0x1800)? 0x1800:sl->flash_pgsz;
1646     ILOG("Starting verification of write complete\n");
1647     for (off = 0; off < length; off += cmp_size) {
1648         size_t aligned_size;
1649
1650         /* adjust last page size */
1651         if ((off + cmp_size) > length)
1652             cmp_size = length - off;
1653
1654         aligned_size = cmp_size;
1655         if (aligned_size & (4 - 1))
1656             aligned_size = (cmp_size + 4) & ~(4 - 1);
1657
1658         stlink_read_mem32(sl, address + off, aligned_size);
1659
1660         if (memcmp(sl->q_buf, data + off, cmp_size)) {
1661             ELOG("Verification of flash failed at offset: %zd\n", off);
1662             return -1;
1663         }
1664     }
1665     ILOG("Flash written and verified! jolly good!\n");
1666     return 0;
1667
1668 }
1669
1670 int stm32l1_write_half_pages(stlink_t *sl, stm32_addr_t addr, uint8_t* base, uint32_t len, uint32_t pagesize)
1671 {
1672     unsigned int count;
1673     unsigned int num_half_pages = len / pagesize;
1674     uint32_t val;
1675     uint32_t flash_regs_base;
1676     flash_loader_t fl;
1677
1678     if (sl->chip_id == STM32_CHIPID_L0) {
1679         flash_regs_base = STM32L0_FLASH_REGS_ADDR;
1680     } else {
1681         flash_regs_base = STM32L_FLASH_REGS_ADDR;
1682     }
1683
1684     ILOG("Starting Half page flash write for STM32L core id\n");
1685     /* flash loader initialization */
1686     if (init_flash_loader(sl, &fl) == -1) {
1687         WLOG("init_flash_loader() == -1\n");
1688         return -1;
1689     }
1690     /* Unlock already done */
1691     val = stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF);
1692     val |= (1 << FLASH_L1_FPRG);
1693     stlink_write_debug32(sl, flash_regs_base + FLASH_PECR_OFF, val);
1694
1695     val |= (1 << FLASH_L1_PROG);
1696     stlink_write_debug32(sl, flash_regs_base + FLASH_PECR_OFF, val);
1697     while ((stlink_read_debug32(sl, flash_regs_base + FLASH_SR_OFF) & (1 << 0)) != 0) {}
1698
1699     for (count = 0; count  < num_half_pages; count ++) {
1700         if (run_flash_loader(sl, &fl, addr + count * pagesize, base + count * pagesize, pagesize) == -1) {
1701             WLOG("l1_run_flash_loader(%#zx) failed! == -1\n", addr + count * pagesize);
1702             val = stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF);
1703             val &= ~((1 << FLASH_L1_FPRG) |(1 << FLASH_L1_PROG));
1704             stlink_write_debug32(sl, flash_regs_base + FLASH_PECR_OFF, val);
1705             return -1;
1706         }
1707         /* wait for sr.busy to be cleared */
1708         if (sl->verbose >= 1) {
1709             /* show progress. writing procedure is slow
1710                and previous errors are misleading */
1711             fprintf(stdout, "\r%3u/%u halfpages written", count + 1, num_half_pages);
1712             fflush(stdout);
1713         }
1714         while ((stlink_read_debug32(sl, flash_regs_base + FLASH_SR_OFF) & (1 << 0)) != 0) {
1715         }
1716     }
1717     val = stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF);
1718     val &= ~(1 << FLASH_L1_PROG);
1719     stlink_write_debug32(sl, flash_regs_base + FLASH_PECR_OFF, val);
1720     val = stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF);
1721     val &= ~(1 << FLASH_L1_FPRG);
1722     stlink_write_debug32(sl, flash_regs_base + FLASH_PECR_OFF, val);
1723
1724     return 0;
1725 }
1726
1727 int stlink_write_flash(stlink_t *sl, stm32_addr_t addr, uint8_t* base, uint32_t len) {
1728     size_t off;
1729     flash_loader_t fl;
1730     ILOG("Attempting to write %d (%#x) bytes to stm32 address: %u (%#x)\n",
1731             len, len, addr, addr);
1732     /* check addr range is inside the flash */
1733     stlink_calculate_pagesize(sl, addr);
1734     if (addr < sl->flash_base) {
1735         ELOG("addr too low %#x < %#x\n", addr, sl->flash_base);
1736         return -1;
1737     } else if ((addr + len) < addr) {
1738         ELOG("addr overruns\n");
1739         return -1;
1740     } else if ((addr + len) > (sl->flash_base + sl->flash_size)) {
1741         ELOG("addr too high\n");
1742         return -1;
1743     } else if (addr & 1) {
1744         ELOG("unaligned addr 0x%x\n", addr);
1745         return -1;
1746     } else if (len & 1) {
1747         WLOG("unaligned len 0x%x -- padding with zero\n", len);
1748         len += 1;
1749     } else if (addr & (sl->flash_pgsz - 1)) {
1750         ELOG("addr not a multiple of pagesize, not supported\n");
1751         return -1;
1752     }
1753
1754     // Make sure we've loaded the context with the chip details
1755     stlink_core_id(sl);
1756     /* erase each page */
1757     int page_count = 0;
1758     for (off = 0; off < len; off += stlink_calculate_pagesize(sl, addr + off)) {
1759         /* addr must be an addr inside the page */
1760         if (stlink_erase_flash_page(sl, addr + off) == -1) {
1761             ELOG("Failed to erase_flash_page(%#zx) == -1\n", addr + off);
1762             return -1;
1763         }
1764         fprintf(stdout,"\rFlash page at addr: 0x%08lx erased",
1765                 (unsigned long)addr + off);
1766         fflush(stdout);
1767         page_count++;
1768     }
1769     fprintf(stdout,"\n");
1770     ILOG("Finished erasing %d pages of %d (%#x) bytes\n",
1771             page_count, sl->flash_pgsz, sl->flash_pgsz);
1772
1773     if ((sl->chip_id == STM32_CHIPID_F2) ||
1774         (sl->chip_id == STM32_CHIPID_F4) ||
1775         (sl->chip_id == STM32_CHIPID_F4_DE) ||
1776         (sl->chip_id == STM32_CHIPID_F4_LP) ||
1777         (sl->chip_id == STM32_CHIPID_F4_HD) ||
1778         (sl->chip_id == STM32_CHIPID_F411RE) ||
1779         (sl->chip_id == STM32_CHIPID_F446) ||
1780         (sl->chip_id == STM32_CHIPID_F7) ||
1781         (sl->chip_id == STM32_CHIPID_L4) ||
1782                 (sl->chip_id == STM32_CHIPID_F4_DSI)) {
1783         /* todo: check write operation */
1784
1785         ILOG("Starting Flash write for F2/F4/L4\n");
1786         /* flash loader initialization */
1787         if (init_flash_loader(sl, &fl) == -1) {
1788             ELOG("init_flash_loader() == -1\n");
1789             return -1;
1790         }
1791
1792         /* First unlock the cr */
1793         unlock_flash_if(sl);
1794
1795         /* TODO: Check that Voltage range is 2.7 - 3.6 V */
1796         if (sl->chip_id != STM32_CHIPID_L4) {
1797             /* set parallelisim to 32 bit*/
1798             int voltage = stlink_target_voltage(sl);
1799             if (voltage > 2700) {
1800                 printf("enabling 32-bit flash writes\n");
1801                 write_flash_cr_psiz(sl, 2);
1802             } else {
1803                 printf("Target voltage (%d mV) too low for 32-bit flash, using 8-bit flash writes\n", voltage);
1804                 write_flash_cr_psiz(sl, 0);
1805             }
1806         } else {
1807             /* L4 does not have a byte-write mode */
1808             int voltage = stlink_target_voltage(sl);
1809             if (voltage < 1710) {
1810                 printf("Target voltage (%d mV) too low for flash writes!\n", voltage);
1811                 return -1;
1812             }
1813         }
1814
1815         /* set programming mode */
1816         set_flash_cr_pg(sl);
1817
1818         for(off = 0; off < len;) {
1819             size_t size = len - off > 0x8000 ? 0x8000 : len - off;
1820
1821             printf("size: %zu\n", size);
1822
1823             if (run_flash_loader(sl, &fl, addr + off, base + off, size) == -1) {
1824                 ELOG("run_flash_loader(%#zx) failed! == -1\n", addr + off);
1825                 return -1;
1826             }
1827
1828             off += size;
1829         }
1830
1831         /* Relock flash */
1832         lock_flash(sl);
1833
1834     }   //STM32F4END
1835
1836     else if (sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_CAT2
1837             || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS || sl->chip_id == STM32_CHIPID_L1_HIGH
1838             || sl->chip_id == STM32_CHIPID_L152_RE || sl->chip_id == STM32_CHIPID_L0) {
1839         /* use fast word write. todo: half page. */
1840         uint32_t val;
1841         uint32_t flash_regs_base;
1842         uint32_t pagesize;
1843
1844         if (sl->chip_id == STM32_CHIPID_L0) {
1845             flash_regs_base = STM32L0_FLASH_REGS_ADDR;
1846             pagesize = L0_WRITE_BLOCK_SIZE;
1847         } else {
1848             flash_regs_base = STM32L_FLASH_REGS_ADDR;
1849             pagesize = L1_WRITE_BLOCK_SIZE;
1850         }
1851
1852         /* todo: check write operation */
1853
1854         /* disable pecr protection */
1855         stlink_write_debug32(sl, flash_regs_base + FLASH_PEKEYR_OFF, 0x89abcdef);
1856         stlink_write_debug32(sl, flash_regs_base + FLASH_PEKEYR_OFF, 0x02030405);
1857
1858         /* check pecr.pelock is cleared */
1859         val = stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF);
1860         if (val & (1 << 0)) {
1861             fprintf(stderr, "pecr.pelock not clear\n");
1862             return -1;
1863         }
1864
1865         /* unlock program memory */
1866         stlink_write_debug32(sl, flash_regs_base + FLASH_PRGKEYR_OFF, 0x8c9daebf);
1867         stlink_write_debug32(sl, flash_regs_base + FLASH_PRGKEYR_OFF, 0x13141516);
1868
1869         /* check pecr.prglock is cleared */
1870         val = stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF);
1871         if (val & (1 << 1)) {
1872             fprintf(stderr, "pecr.prglock not clear\n");
1873             return -1;
1874         }
1875         off = 0;
1876         if (len > pagesize) {
1877             if (stm32l1_write_half_pages(sl, addr, base, len, pagesize) == -1) {
1878                 /* This may happen on a blank device! */
1879                 WLOG("\nwrite_half_pages failed == -1\n");
1880             } else {
1881                 off = (len / pagesize)*pagesize;
1882             }
1883         }
1884
1885         /* write remainingword in program memory */
1886         for ( ; off < len; off += sizeof(uint32_t)) {
1887             uint32_t data;
1888             if (off > 254)
1889                 fprintf(stdout, "\r");
1890
1891             if ((off % sl->flash_pgsz) > (sl->flash_pgsz -5)) {
1892                 fprintf(stdout, "\r%3zd/%3zd pages written",
1893                         off/sl->flash_pgsz, len/sl->flash_pgsz);
1894                 fflush(stdout);
1895             }
1896
1897             write_uint32((unsigned char*) &data, *(uint32_t*) (base + off));
1898             stlink_write_debug32(sl, addr + off, data);
1899
1900             /* wait for sr.busy to be cleared */
1901             while ((stlink_read_debug32(sl, flash_regs_base + FLASH_SR_OFF) & (1 << 0)) != 0)
1902                 ;
1903
1904             /* todo: check redo write operation */
1905
1906         }
1907         fprintf(stdout, "\n");
1908         /* reset lock bits */
1909         val = stlink_read_debug32(sl, flash_regs_base + FLASH_PECR_OFF)
1910             | (1 << 0) | (1 << 1) | (1 << 2);
1911         stlink_write_debug32(sl, flash_regs_base + FLASH_PECR_OFF, val);
1912     } else if (sl->core_id == STM32VL_CORE_ID ||
1913                 sl->core_id == STM32F0_CORE_ID ||
1914                 sl->chip_id == STM32_CHIPID_F3  ||
1915                 sl->chip_id == STM32_CHIPID_F3_SMALL  ||
1916                 sl->chip_id == STM32_CHIPID_F303_HIGH ||
1917                 sl->chip_id == STM32_CHIPID_F334 ||
1918                 sl->chip_id == STM32_CHIPID_F37x) {
1919         ILOG("Starting Flash write for VL/F0/F3 core id\n");
1920         /* flash loader initialization */
1921         if (init_flash_loader(sl, &fl) == -1) {
1922             ELOG("init_flash_loader() == -1\n");
1923             return -1;
1924         }
1925
1926         int write_block_count = 0;
1927         for (off = 0; off < len; off += sl->flash_pgsz) {
1928             /* adjust last write size */
1929             size_t size = sl->flash_pgsz;
1930             if ((off + sl->flash_pgsz) > len) size = len - off;
1931
1932             /* unlock and set programming mode */
1933             unlock_flash_if(sl);
1934             set_flash_cr_pg(sl);
1935             //DLOG("Finished setting flash cr pg, running loader!\n");
1936             if (run_flash_loader(sl, &fl, addr + off, base + off, size) == -1) {
1937                 ELOG("run_flash_loader(%#zx) failed! == -1\n", addr + off);
1938                 return -1;
1939             }
1940             lock_flash(sl);
1941             if (sl->verbose >= 1) {
1942                 /* show progress. writing procedure is slow
1943                    and previous errors are misleading */
1944                 fprintf(stdout, "\r%3u/%lu pages written", write_block_count++, (unsigned long)len/sl->flash_pgsz);
1945                 fflush(stdout);
1946             }
1947         }
1948         fprintf(stdout, "\n");
1949     } else {
1950         ELOG("unknown coreid, not sure how to write: %x\n", sl->core_id);
1951         return -1;
1952     }
1953
1954     return stlink_verify_write_flash(sl, addr, base, len);
1955 }
1956
1957 /**
1958  * Write the given binary file into flash at address "addr"
1959  * @param sl
1960  * @param path readable file path, should be binary image
1961  * @param addr where to start writing
1962  * @return 0 on success, -ve on failure.
1963  */
1964 int stlink_fwrite_flash(stlink_t *sl, const char* path, stm32_addr_t addr) {
1965     /* write the file in flash at addr */
1966     int err;
1967     unsigned int num_empty = 0, index;
1968     unsigned char erased_pattern = (sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_CAT2
1969             || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS || sl->chip_id == STM32_CHIPID_L1_HIGH
1970             || sl->chip_id == STM32_CHIPID_L152_RE) ? 0:0xff;
1971     mapped_file_t mf = MAPPED_FILE_INITIALIZER;
1972     if (map_file(&mf, path) == -1) {
1973         ELOG("map_file() == -1\n");
1974         return -1;
1975     }
1976     for(index = 0; index < mf.len; index ++) {
1977         if (mf.base[index] == erased_pattern)
1978             num_empty ++;
1979         else
1980             num_empty = 0;
1981     }
1982     /* Round down to words */
1983     num_empty -= (num_empty & 3);
1984     if(num_empty != 0) {
1985         ILOG("Ignoring %d bytes of 0x%02x at end of file\n", num_empty, erased_pattern);
1986         mf.len -= num_empty;
1987     }
1988     err = stlink_write_flash(sl, addr, mf.base, mf.len);
1989     /* set stack*/
1990     stlink_write_reg(sl, stlink_read_debug32(sl, addr    ),13);
1991     /* Set PC to the reset routine*/
1992     stlink_write_reg(sl, stlink_read_debug32(sl, addr + 4),15);
1993     stlink_run(sl);
1994     unmap_file(&mf);
1995     return err;
1996 }
1997
1998 int run_flash_loader(stlink_t *sl, flash_loader_t* fl, stm32_addr_t target, const uint8_t* buf, size_t size) {
1999
2000     reg rr;
2001     int i = 0;
2002     DLOG("Running flash loader, write address:%#x, size: %zd\n", target, size);
2003     // FIXME This can never return -1
2004     if (write_buffer_to_sram(sl, fl, buf, size) == -1) {
2005         // IMPOSSIBLE!
2006         ELOG("write_buffer_to_sram() == -1\n");
2007         return -1;
2008     }
2009
2010     if (sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_CAT2
2011             || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS || sl->chip_id == STM32_CHIPID_L1_HIGH
2012             || sl->chip_id == STM32_CHIPID_L152_RE || sl->chip_id == STM32_CHIPID_L0) {
2013
2014         size_t count = size / sizeof(uint32_t);
2015         if (size % sizeof(uint32_t)) ++count;
2016
2017         /* setup core */
2018         stlink_write_reg(sl, target, 0); /* target */
2019         stlink_write_reg(sl, fl->buf_addr, 1); /* source */
2020         stlink_write_reg(sl, count, 2); /* count (32 bits words) */
2021         stlink_write_reg(sl, fl->loader_addr, 15); /* pc register */
2022
2023     } else if (sl->core_id == STM32VL_CORE_ID ||
2024                 sl->core_id == STM32F0_CORE_ID ||
2025                 sl->chip_id == STM32_CHIPID_F3 ||
2026                 sl->chip_id == STM32_CHIPID_F3_SMALL ||
2027                 sl->chip_id == STM32_CHIPID_F303_HIGH ||
2028                 sl->chip_id == STM32_CHIPID_F37x ||
2029                 sl->chip_id == STM32_CHIPID_F334) {
2030
2031         size_t count = size / sizeof(uint16_t);
2032         if (size % sizeof(uint16_t)) ++count;
2033
2034         /* setup core */
2035         stlink_write_reg(sl, fl->buf_addr, 0); /* source */
2036         stlink_write_reg(sl, target, 1); /* target */
2037         stlink_write_reg(sl, count, 2); /* count (16 bits half words) */
2038         stlink_write_reg(sl, 0, 3); /* flash bank 0 (input) */
2039         stlink_write_reg(sl, fl->loader_addr, 15); /* pc register */
2040
2041     } else if (sl->chip_id == STM32_CHIPID_F2 || sl->chip_id == STM32_CHIPID_F4 || (sl->chip_id == STM32_CHIPID_F4_DE) ||
2042             sl->chip_id == STM32_CHIPID_F4_LP || sl->chip_id == STM32_CHIPID_F4_HD || (sl->chip_id == STM32_CHIPID_F411RE) ||
2043             (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)) {
2044
2045         size_t count = size / sizeof(uint32_t);
2046         if (size % sizeof(uint32_t)) ++count;
2047         if (sl->chip_id == STM32_CHIPID_L4) {
2048             if (count % 2) ++count;
2049         }
2050
2051         /* setup core */
2052         stlink_write_reg(sl, fl->buf_addr, 0); /* source */
2053         stlink_write_reg(sl, target, 1); /* target */
2054         stlink_write_reg(sl, count, 2); /* count (32 bits words) */
2055         stlink_write_reg(sl, fl->loader_addr, 15); /* pc register */
2056
2057     } else {
2058         fprintf(stderr, "unknown coreid 0x%x, don't know what flash loader to use\n", sl->core_id);
2059         return -1;
2060     }
2061
2062     /* run loader */
2063     stlink_run(sl);
2064
2065 #define WAIT_ROUNDS 10000
2066     /* wait until done (reaches breakpoint) */
2067     for (i = 0; i < WAIT_ROUNDS; i++) {
2068         usleep(10);
2069         if (is_core_halted(sl))
2070             break;
2071     }
2072
2073     if (i >= WAIT_ROUNDS) {
2074         ELOG("flash loader run error\n");
2075         return -1;
2076     }
2077
2078     /* check written byte count */
2079     if (sl->chip_id == STM32_CHIPID_L1_MEDIUM || sl->chip_id == STM32_CHIPID_L1_CAT2
2080             || sl->chip_id == STM32_CHIPID_L1_MEDIUM_PLUS || sl->chip_id == STM32_CHIPID_L1_HIGH
2081             || sl->chip_id == STM32_CHIPID_L152_RE || sl->chip_id == STM32_CHIPID_L0) {
2082
2083         size_t count = size / sizeof(uint32_t);
2084         if (size % sizeof(uint32_t)) ++count;
2085
2086         stlink_read_reg(sl, 3, &rr);
2087         if (rr.r[3] != count) {
2088             fprintf(stderr, "write error, count == %u\n", rr.r[3]);
2089             return -1;
2090         }
2091
2092     } else if (sl->core_id == STM32VL_CORE_ID ||
2093                 sl->core_id == STM32F0_CORE_ID ||
2094                 sl->chip_id == STM32_CHIPID_F3 ||
2095                 sl->chip_id == STM32_CHIPID_F3_SMALL ||
2096                 sl->chip_id == STM32_CHIPID_F303_HIGH ||
2097                 sl->chip_id == STM32_CHIPID_F37x ||
2098                 sl->chip_id == STM32_CHIPID_F334) {
2099
2100         stlink_read_reg(sl, 2, &rr);
2101         if (rr.r[2] != 0) {
2102             fprintf(stderr, "write error, count == %u\n", rr.r[2]);
2103             return -1;
2104         }
2105
2106     } else if (sl->chip_id == STM32_CHIPID_F2 || sl->chip_id == STM32_CHIPID_F4 || (sl->chip_id == STM32_CHIPID_F4_DE) ||
2107             sl->chip_id == STM32_CHIPID_F4_LP || sl->chip_id == STM32_CHIPID_F4_HD || (sl->chip_id == STM32_CHIPID_F411RE) ||
2108             (sl->chip_id == STM32_CHIPID_F446) || (sl->chip_id == STM32_CHIPID_F7) || (sl->chip_id == STM32_CHIPID_L4) ||
2109                         (sl->chip_id == STM32_CHIPID_F4_DSI)) {
2110
2111         stlink_read_reg(sl, 2, &rr);
2112         if (rr.r[2] != 0) {
2113             fprintf(stderr, "write error, count == %u\n", rr.r[2]);
2114             return -1;
2115         }
2116
2117     } else {
2118
2119         fprintf(stderr, "unknown coreid 0x%x, can't check written byte count\n", sl->core_id);
2120         return -1;
2121
2122     }
2123
2124     return 0;
2125 }