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