Merge with master
[fw/stlink] / src / stlink-usb.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <stdint.h>
5 #include <sys/time.h>
6 #include <sys/types.h>
7 #include <libusb.h>
8 #include <errno.h>
9 #include <unistd.h>
10
11 #include "stlink-common.h"
12 #include "stlink-usb.h"
13 #include "uglylogging.h"
14
15 enum SCSI_Generic_Direction {SG_DXFER_TO_DEV=0, SG_DXFER_FROM_DEV=0x80};
16
17 void _stlink_usb_close(stlink_t* sl) {
18     if (!sl)
19         return;
20
21     struct stlink_libusb * const handle = sl->backend_data;
22     // maybe we couldn't even get the usb device?
23     if (handle != NULL) {
24         if (handle->usb_handle != NULL) {
25             libusb_close(handle->usb_handle);
26         }
27
28         libusb_exit(handle->libusb_ctx);
29         free(handle);
30     }
31 }
32
33 ssize_t send_recv(struct stlink_libusb* handle, int terminate,
34         unsigned char* txbuf, size_t txsize,
35         unsigned char* rxbuf, size_t rxsize) {
36     /* note: txbuf and rxbuf can point to the same area */
37     int res = 0;
38
39     if (libusb_bulk_transfer(handle->usb_handle, handle->ep_req,
40             txbuf,
41             txsize,
42             &res,
43             3000))
44         return -1;
45
46     if (rxsize != 0) {
47         if (libusb_bulk_transfer(handle->usb_handle, handle->ep_rep,
48                 rxbuf,
49                 rxsize,
50                 &res,
51                 3000))
52             return -1;
53     }
54
55     if ((handle->protocoll == 1) && terminate) {
56         /* Read the SG reply */
57         unsigned char sg_buf[13];
58         if (libusb_bulk_transfer(handle->usb_handle, handle->ep_rep,
59                 sg_buf,
60                 13,
61                 &res,
62                 3000))
63             return -1;
64         /* The STLink doesn't seem to evaluate the sequence number */
65         handle->sg_transfer_idx++;
66     }
67
68     return res;
69 }
70
71 static inline int send_only
72 (struct stlink_libusb* handle, int terminate,
73  unsigned char* txbuf, size_t txsize) {
74     return send_recv(handle, terminate, txbuf, txsize, NULL, 0);
75 }
76
77
78 static int fill_command
79 (stlink_t * sl, enum SCSI_Generic_Direction dir, uint32_t len) {
80     struct stlink_libusb * const slu = sl->backend_data;
81     unsigned char* const cmd = sl->c_buf;
82     int i = 0;
83     memset(cmd, 0, sizeof (sl->c_buf));
84     if(slu->protocoll == 1) {
85         cmd[i++] = 'U';
86         cmd[i++] = 'S';
87         cmd[i++] = 'B';
88         cmd[i++] = 'C';
89         write_uint32(&cmd[i], slu->sg_transfer_idx);
90         write_uint32(&cmd[i + 4], len);
91         i += 8;
92         cmd[i++] = (dir == SG_DXFER_FROM_DEV)?0x80:0;
93         cmd[i++] = 0; /* Logical unit */
94         cmd[i++] = 0xa; /* Command length */
95     }
96     return i;
97 }
98
99 int _stlink_usb_version(stlink_t *sl) {
100     struct stlink_libusb * const slu = sl->backend_data;
101     unsigned char* const data = sl->q_buf;
102     unsigned char* const cmd  = sl->c_buf;
103     ssize_t size;
104     uint32_t rep_len = 6;
105     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
106
107     cmd[i++] = STLINK_GET_VERSION;
108
109     size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
110     if (size == -1) {
111         printf("[!] send_recv\n");
112         return size;
113     }
114
115     return 0;
116 }
117
118 int32_t _stlink_usb_target_voltage(stlink_t *sl) {
119     struct stlink_libusb * const slu = sl->backend_data;
120     unsigned char* const rdata = sl->q_buf;
121     unsigned char* const cmd  = sl->c_buf;
122     ssize_t size;
123     uint32_t rep_len = 8;
124     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
125     uint32_t factor, reading;
126     int voltage;
127
128     cmd[i++] = STLINK_GET_TARGET_VOLTAGE;
129
130     size = send_recv(slu, 1, cmd, slu->cmd_len, rdata, rep_len);
131     if (size == -1) {
132         printf("[!] send_recv\n");
133         return -1;
134     } else if (size != 8) {
135         printf("[!] wrong length\n");
136         return -1;
137     }
138
139     factor = (rdata[3] << 24) | (rdata[2] << 16) | (rdata[1] << 8) | (rdata[0] << 0);
140     reading = (rdata[7] << 24) | (rdata[6] << 16) | (rdata[5] << 8) | (rdata[4] << 0);
141     voltage = 2400 * reading / factor;
142
143     return voltage;
144 }
145
146 int _stlink_usb_read_debug32(stlink_t *sl, uint32_t addr, uint32_t *data) {
147     struct stlink_libusb * const slu = sl->backend_data;
148     unsigned char* const rdata = sl->q_buf;
149     unsigned char* const cmd  = sl->c_buf;
150     ssize_t size;
151     const int rep_len = 8;
152
153     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
154     cmd[i++] = STLINK_DEBUG_COMMAND;
155     cmd[i++] = STLINK_JTAG_READDEBUG_32BIT;
156     write_uint32(&cmd[i], addr);
157     size = send_recv(slu, 1, cmd, slu->cmd_len, rdata, rep_len);
158     if (size == -1) {
159         printf("[!] send_recv\n");
160         return size;
161     }
162     *data = read_uint32(rdata, 4);
163     return 0;
164 }
165
166 int _stlink_usb_write_debug32(stlink_t *sl, uint32_t addr, uint32_t data) {
167     struct stlink_libusb * const slu = sl->backend_data;
168     unsigned char* const rdata = sl->q_buf;
169     unsigned char* const cmd  = sl->c_buf;
170     ssize_t size;
171     const int rep_len = 2;
172
173     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
174     cmd[i++] = STLINK_DEBUG_COMMAND;
175     cmd[i++] = STLINK_JTAG_WRITEDEBUG_32BIT;
176     write_uint32(&cmd[i], addr);
177     write_uint32(&cmd[i + 4], data);
178     size = send_recv(slu, 1, cmd, slu->cmd_len, rdata, rep_len);
179     if (size == -1) {
180         printf("[!] send_recv\n");
181         return size;
182     }
183
184     return 0;
185 }
186
187 int _stlink_usb_write_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
188     struct stlink_libusb * const slu = sl->backend_data;
189     unsigned char* const data = sl->q_buf;
190     unsigned char* const cmd  = sl->c_buf;
191     int i, ret;
192
193     i = fill_command(sl, SG_DXFER_TO_DEV, len);
194     cmd[i++] = STLINK_DEBUG_COMMAND;
195     cmd[i++] = STLINK_DEBUG_WRITEMEM_32BIT;
196     write_uint32(&cmd[i], addr);
197     write_uint16(&cmd[i + 4], len);
198     ret = send_only(slu, 0, cmd, slu->cmd_len);
199     if (ret == -1)
200         return ret;
201
202     ret = send_only(slu, 1, data, len);
203     if (ret == -1)
204         return ret;
205
206     return 0;
207 }
208
209 int _stlink_usb_write_mem8(stlink_t *sl, uint32_t addr, uint16_t len) {
210     struct stlink_libusb * const slu = sl->backend_data;
211     unsigned char* const data = sl->q_buf;
212     unsigned char* const cmd  = sl->c_buf;
213     int i, ret;
214
215     i = fill_command(sl, SG_DXFER_TO_DEV, 0);
216     cmd[i++] = STLINK_DEBUG_COMMAND;
217     cmd[i++] = STLINK_DEBUG_WRITEMEM_8BIT;
218     write_uint32(&cmd[i], addr);
219     write_uint16(&cmd[i + 4], len);
220     ret = send_only(slu, 0, cmd, slu->cmd_len);
221     if (ret == -1)
222         return ret;
223
224     ret = send_only(slu, 1, data, len);
225     if (ret == -1)
226         return ret;
227
228     return 0;
229 }
230
231
232 int _stlink_usb_current_mode(stlink_t * sl) {
233     struct stlink_libusb * const slu = sl->backend_data;
234     unsigned char* const cmd  = sl->c_buf;
235     unsigned char* const data = sl->q_buf;
236     ssize_t size;
237     int rep_len = 2;
238     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
239
240     cmd[i++] = STLINK_GET_CURRENT_MODE;
241     size = send_recv(slu, 1, cmd,  slu->cmd_len, data, rep_len);
242     if (size == -1) {
243         printf("[!] send_recv\n");
244         return -1;
245     }
246     return sl->q_buf[0];
247 }
248
249 int _stlink_usb_core_id(stlink_t * sl) {
250     struct stlink_libusb * const slu = sl->backend_data;
251     unsigned char* const cmd  = sl->c_buf;
252     unsigned char* const data = sl->q_buf;
253     ssize_t size;
254     int rep_len = 4;
255     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
256
257     cmd[i++] = STLINK_DEBUG_COMMAND;
258     cmd[i++] = STLINK_DEBUG_READCOREID;
259
260     size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
261     if (size == -1) {
262         printf("[!] send_recv\n");
263         return -1;
264     }
265
266     sl->core_id = read_uint32(data, 0);
267     return 0;
268 }
269
270 int _stlink_usb_status(stlink_t * sl) {
271     struct stlink_libusb * const slu = sl->backend_data;
272     unsigned char* const data = sl->q_buf;
273     unsigned char* const cmd  = sl->c_buf;
274     ssize_t size;
275     int rep_len = 2;
276     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
277
278     cmd[i++] = STLINK_DEBUG_COMMAND;
279     cmd[i++] = STLINK_DEBUG_GETSTATUS;
280
281     size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
282     if (size == -1) {
283         printf("[!] send_recv\n");
284         return size;
285     }
286     sl->q_len = (size_t) size;
287
288     return 0;
289 }
290
291 int _stlink_usb_force_debug(stlink_t *sl) {
292     struct stlink_libusb *slu = sl->backend_data;
293     unsigned char* const data = sl->q_buf;
294     unsigned char* const cmd  = sl->c_buf;
295     ssize_t size;
296     int rep_len = 2;
297     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
298
299     cmd[i++] = STLINK_DEBUG_COMMAND;
300     cmd[i++] = STLINK_DEBUG_FORCEDEBUG;
301     size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
302     if (size == -1) {
303         printf("[!] send_recv\n");
304         return size;
305     }
306
307     return 0;
308 }
309
310 int _stlink_usb_enter_swd_mode(stlink_t * sl) {
311     struct stlink_libusb * const slu = sl->backend_data;
312     unsigned char* const cmd  = sl->c_buf;
313     ssize_t size;
314     const int rep_len = 0;
315     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
316
317     cmd[i++] = STLINK_DEBUG_COMMAND;
318     cmd[i++] = STLINK_DEBUG_ENTER;
319     cmd[i++] = STLINK_DEBUG_ENTER_SWD;
320
321     size = send_only(slu, 1, cmd, slu->cmd_len);
322     if (size == -1) {
323         printf("[!] send_recv\n");
324         return size;
325     }
326
327     return 0;
328 }
329
330 int _stlink_usb_exit_dfu_mode(stlink_t* sl) {
331     struct stlink_libusb * const slu = sl->backend_data;
332     unsigned char* const cmd = sl->c_buf;
333     ssize_t size;
334     int i = fill_command(sl, SG_DXFER_FROM_DEV, 0);
335
336     cmd[i++] = STLINK_DFU_COMMAND;
337     cmd[i++] = STLINK_DFU_EXIT;
338
339     size = send_only(slu, 1, cmd, slu->cmd_len);
340     if (size == -1) {
341         printf("[!] send_recv\n");
342         return size;
343     }
344
345     return 0;
346 }
347
348 /**
349  * TODO - not convinced this does anything...
350  * @param sl
351  */
352 int _stlink_usb_reset(stlink_t * sl) {
353     struct stlink_libusb * const slu = sl->backend_data;
354     unsigned char* const data = sl->q_buf;
355     unsigned char* const cmd = sl->c_buf;
356     ssize_t size;
357     int rep_len = 2;
358     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
359
360     cmd[i++] = STLINK_DEBUG_COMMAND;
361     cmd[i++] = STLINK_DEBUG_RESETSYS;
362
363     size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
364     if (size == -1) {
365         printf("[!] send_recv\n");
366         return size;
367     }
368
369     return 0;
370 }
371
372
373 int _stlink_usb_jtag_reset(stlink_t * sl, int value) {
374     struct stlink_libusb * const slu = sl->backend_data;
375     unsigned char* const data = sl->q_buf;
376     unsigned char* const cmd = sl->c_buf;
377     ssize_t size;
378     int rep_len = 2;
379     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
380
381     cmd[i++] = STLINK_DEBUG_COMMAND;
382     cmd[i++] = STLINK_JTAG_DRIVE_NRST;
383     cmd[i++] = value;
384
385     size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
386     if (size == -1) {
387         printf("[!] send_recv\n");
388         return size;
389     }
390
391     return 0;
392 }
393
394
395 int _stlink_usb_step(stlink_t* sl) {
396     struct stlink_libusb * const slu = sl->backend_data;
397     unsigned char* const data = sl->q_buf;
398     unsigned char* const cmd = sl->c_buf;
399     ssize_t size;
400     int rep_len = 2;
401     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
402
403     cmd[i++] = STLINK_DEBUG_COMMAND;
404     cmd[i++] = STLINK_DEBUG_STEPCORE;
405
406     size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
407     if (size == -1) {
408         printf("[!] send_recv\n");
409         return size;
410     }
411
412     return 0;
413 }
414
415 /**
416  * This seems to do a good job of restarting things from the beginning?
417  * @param sl
418  */
419 int _stlink_usb_run(stlink_t* sl) {
420     struct stlink_libusb * const slu = sl->backend_data;
421     unsigned char* const data = sl->q_buf;
422     unsigned char* const cmd = sl->c_buf;
423     ssize_t size;
424     int rep_len = 2;
425     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
426
427     cmd[i++] = STLINK_DEBUG_COMMAND;
428     cmd[i++] = STLINK_DEBUG_RUNCORE;
429
430     size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
431     if (size == -1) {
432         printf("[!] send_recv\n");
433         return size;
434     }
435
436     return 0;
437 }
438
439 int _stlink_usb_exit_debug_mode(stlink_t *sl) {
440     struct stlink_libusb * const slu = sl->backend_data;
441     unsigned char* const cmd = sl->c_buf;
442     ssize_t size;
443     int i = fill_command(sl, SG_DXFER_FROM_DEV, 0);
444
445     cmd[i++] = STLINK_DEBUG_COMMAND;
446     cmd[i++] = STLINK_DEBUG_EXIT;
447
448     size = send_only(slu, 1, cmd, slu->cmd_len);
449     if (size == -1) {
450         printf("[!] send_only\n");
451         return size;
452     }
453
454     return 0;
455 }
456
457 int _stlink_usb_read_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
458     struct stlink_libusb * const slu = sl->backend_data;
459     unsigned char* const data = sl->q_buf;
460     unsigned char* const cmd = sl->c_buf;
461     ssize_t size;
462     int i = fill_command(sl, SG_DXFER_FROM_DEV, len);
463
464     cmd[i++] = STLINK_DEBUG_COMMAND;
465     cmd[i++] = STLINK_DEBUG_READMEM_32BIT;
466     write_uint32(&cmd[i], addr);
467     write_uint16(&cmd[i + 4], len);
468
469     size = send_recv(slu, 1, cmd, slu->cmd_len, data, len);
470     if (size == -1) {
471         printf("[!] send_recv\n");
472         return size;
473     }
474
475     sl->q_len = (size_t) size;
476
477     stlink_print_data(sl);
478     return 0;
479 }
480
481 int _stlink_usb_read_all_regs(stlink_t *sl, reg *regp) {
482     struct stlink_libusb * const slu = sl->backend_data;
483     unsigned char* const cmd = sl->c_buf;
484     unsigned char* const data = sl->q_buf;
485     ssize_t size;
486     uint32_t rep_len = 84;
487     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
488
489     cmd[i++] = STLINK_DEBUG_COMMAND;
490     cmd[i++] = STLINK_DEBUG_READALLREGS;
491     size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
492     if (size == -1) {
493         printf("[!] send_recv\n");
494         return size;
495     }
496     sl->q_len = (size_t) size;
497     stlink_print_data(sl);
498     for(i=0; i<16; i++)
499         regp->r[i]= read_uint32(sl->q_buf, i*4);
500     regp->xpsr       = read_uint32(sl->q_buf, 64);
501     regp->main_sp    = read_uint32(sl->q_buf, 68);
502     regp->process_sp = read_uint32(sl->q_buf, 72);
503     regp->rw         = read_uint32(sl->q_buf, 76);
504     regp->rw2        = read_uint32(sl->q_buf, 80);
505     if (sl->verbose < 2)
506         return 0;
507
508     DLOG("xpsr       = 0x%08x\n", read_uint32(sl->q_buf, 64));
509     DLOG("main_sp    = 0x%08x\n", read_uint32(sl->q_buf, 68));
510     DLOG("process_sp = 0x%08x\n", read_uint32(sl->q_buf, 72));
511     DLOG("rw         = 0x%08x\n", read_uint32(sl->q_buf, 76));
512     DLOG("rw2        = 0x%08x\n", read_uint32(sl->q_buf, 80));
513
514     return 0;
515 }
516
517 int _stlink_usb_read_reg(stlink_t *sl, int r_idx, reg *regp) {
518     struct stlink_libusb * const slu = sl->backend_data;
519     unsigned char* const data = sl->q_buf;
520     unsigned char* const cmd  = sl->c_buf;
521     ssize_t size;
522     uint32_t r;
523     uint32_t rep_len = 4;
524     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
525
526     cmd[i++] = STLINK_DEBUG_COMMAND;
527     cmd[i++] = STLINK_DEBUG_READREG;
528     cmd[i++] = (uint8_t) r_idx;
529     size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
530     if (size == -1) {
531         printf("[!] send_recv\n");
532         return size;
533     }
534     sl->q_len = (size_t) size;
535     stlink_print_data(sl);
536     r = read_uint32(sl->q_buf, 0);
537     DLOG("r_idx (%2d) = 0x%08x\n", r_idx, r);
538
539     switch (r_idx) {
540     case 16:
541         regp->xpsr = r;
542         break;
543     case 17:
544         regp->main_sp = r;
545         break;
546     case 18:
547         regp->process_sp = r;
548         break;
549     case 19:
550         regp->rw = r; /* XXX ?(primask, basemask etc.) */
551         break;
552     case 20:
553         regp->rw2 = r; /* XXX ?(primask, basemask etc.) */
554         break;
555     default:
556         regp->r[r_idx] = r;
557     }
558
559     return 0;
560 }
561
562 /* See section C1.6 of the ARMv7-M Architecture Reference Manual */
563 int _stlink_usb_read_unsupported_reg(stlink_t *sl, int r_idx, reg *regp) {
564     uint32_t r;
565     int ret;
566
567     sl->q_buf[0] = (unsigned char) r_idx;
568     for (int i = 1; i < 4; i++) {
569         sl->q_buf[i] = 0;
570     }
571
572     ret = _stlink_usb_write_mem32(sl, DCRSR, 4);
573     if (ret == -1)
574         return ret;
575
576     _stlink_usb_read_mem32(sl, DCRDR, 4);
577     if (ret == -1)
578         return ret;
579
580     r = read_uint32(sl->q_buf, 0);
581     DLOG("r_idx (%2d) = 0x%08x\n", r_idx, r);
582
583     switch (r_idx) {
584     case 0x14:
585         regp->primask = (uint8_t) (r & 0xFF);
586         regp->basepri = (uint8_t) ((r>>8) & 0xFF);
587         regp->faultmask = (uint8_t) ((r>>16) & 0xFF);
588         regp->control = (uint8_t) ((r>>24) & 0xFF);
589         break;
590     case 0x21:
591         regp->fpscr = r;
592         break;
593     default:
594         regp->s[r_idx - 0x40] = r;
595         break;
596     }
597
598     return 0;
599 }
600
601 int _stlink_usb_read_all_unsupported_regs(stlink_t *sl, reg *regp) {
602     int ret;
603
604     ret = _stlink_usb_read_unsupported_reg(sl, 0x14, regp);
605     if (ret == -1)
606         return ret;
607
608     ret = _stlink_usb_read_unsupported_reg(sl, 0x21, regp);
609     if (ret == -1)
610         return ret;
611
612     for (int i = 0; i < 32; i++) {
613         ret = _stlink_usb_read_unsupported_reg(sl, 0x40+i, regp);
614         if (ret == -1)
615             return ret;
616     }
617
618     return 0;
619 }
620
621 /* See section C1.6 of the ARMv7-M Architecture Reference Manual */
622 int _stlink_usb_write_unsupported_reg(stlink_t *sl, uint32_t val, int r_idx, reg *regp) {
623     int ret;
624
625     if (r_idx >= 0x1C && r_idx <= 0x1F) { /* primask, basepri, faultmask, or control */
626         /* These are held in the same register */
627         ret = _stlink_usb_read_unsupported_reg(sl, 0x14, regp);
628         if (ret == -1)
629             return ret;
630
631         val = (uint8_t) (val>>24);
632
633         switch (r_idx) {
634         case 0x1C:  /* control */
635             val = (((uint32_t) val) << 24) | (((uint32_t) regp->faultmask) << 16) | (((uint32_t) regp->basepri) << 8) | ((uint32_t) regp->primask);
636             break;
637         case 0x1D:  /* faultmask */
638             val = (((uint32_t) regp->control) << 24) | (((uint32_t) val) << 16) | (((uint32_t) regp->basepri) << 8) | ((uint32_t) regp->primask);
639             break;
640         case 0x1E:  /* basepri */
641             val = (((uint32_t) regp->control) << 24) | (((uint32_t) regp->faultmask) << 16) | (((uint32_t) val) << 8) | ((uint32_t) regp->primask);
642             break;
643         case 0x1F:  /* primask */
644             val = (((uint32_t) regp->control) << 24) | (((uint32_t) regp->faultmask) << 16) | (((uint32_t) regp->basepri) << 8) | ((uint32_t) val);
645             break;
646         }
647
648         r_idx = 0x14;
649     }
650
651     write_uint32(sl->q_buf, val);
652
653     ret = _stlink_usb_write_mem32(sl, DCRDR, 4);
654     if (ret == -1)
655         return ret;
656
657     sl->q_buf[0] = (unsigned char) r_idx;
658     sl->q_buf[1] = 0;
659     sl->q_buf[2] = 0x01;
660     sl->q_buf[3] = 0;
661
662     return _stlink_usb_write_mem32(sl, DCRSR, 4);
663 }
664
665 int _stlink_usb_write_reg(stlink_t *sl, uint32_t reg, int idx) {
666     struct stlink_libusb * const slu = sl->backend_data;
667     unsigned char* const data = sl->q_buf;
668     unsigned char* const cmd  = sl->c_buf;
669     ssize_t size;
670     uint32_t rep_len = 2;
671     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
672
673     cmd[i++] = STLINK_DEBUG_COMMAND;
674     cmd[i++] = STLINK_DEBUG_WRITEREG;
675     cmd[i++] = idx;
676     write_uint32(&cmd[i], reg);
677     size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
678     if (size == -1) {
679         printf("[!] send_recv\n");
680         return size;
681     }
682     sl->q_len = (size_t) size;
683     stlink_print_data(sl);
684
685     return 0;
686 }
687
688 stlink_backend_t _stlink_usb_backend = {
689     _stlink_usb_close,
690     _stlink_usb_exit_debug_mode,
691     _stlink_usb_enter_swd_mode,
692     NULL,  // no enter_jtag_mode here...
693     _stlink_usb_exit_dfu_mode,
694     _stlink_usb_core_id,
695     _stlink_usb_reset,
696     _stlink_usb_jtag_reset,
697     _stlink_usb_run,
698     _stlink_usb_status,
699     _stlink_usb_version,
700     _stlink_usb_read_debug32,
701     _stlink_usb_read_mem32,
702     _stlink_usb_write_debug32,
703     _stlink_usb_write_mem32,
704     _stlink_usb_write_mem8,
705     _stlink_usb_read_all_regs,
706     _stlink_usb_read_reg,
707     _stlink_usb_read_all_unsupported_regs,
708     _stlink_usb_read_unsupported_reg,
709     _stlink_usb_write_unsupported_reg,
710     _stlink_usb_write_reg,
711     _stlink_usb_step,
712     _stlink_usb_current_mode,
713     _stlink_usb_force_debug,
714     _stlink_usb_target_voltage
715 };
716
717
718 stlink_t* stlink_open_usb(const int verbose, int reset, char *p_usb_iserial) {
719     stlink_t* sl = NULL;
720     struct stlink_libusb* slu = NULL;
721     int error = -1;
722     int config;
723
724     sl = calloc(1, sizeof (stlink_t));
725     slu = calloc(1, sizeof (struct stlink_libusb));
726     if (sl == NULL) goto on_malloc_error;
727     if (slu == NULL) goto on_malloc_error;
728
729     ugly_init(verbose);
730     sl->backend = &_stlink_usb_backend;
731     sl->backend_data = slu;
732
733     sl->core_stat = STLINK_CORE_STAT_UNKNOWN;
734     if (libusb_init(&(slu->libusb_ctx))) {
735         WLOG("failed to init libusb context, wrong version of libraries?\n");
736         goto on_error;
737     }
738
739     libusb_device **list;
740     int cnt = libusb_get_device_list(slu->libusb_ctx, &list);
741     struct libusb_device_descriptor desc;
742     int devBus =0;
743     int devAddr=0;
744
745     char *device = getenv("STLINK_DEVICE");
746     if (device) {
747         char *c = strchr(device,':');
748         if (c==NULL) {
749             WLOG("STLINK_DEVICE must be <USB_BUS>:<USB_ADDR> format\n");
750             goto on_error;
751         }
752         devBus=atoi(device);
753         *c++=0;
754         devAddr=atoi(c);
755         ILOG("bus %03d dev %03d\n",devBus, devAddr);
756     }
757     while (cnt--){
758         libusb_get_device_descriptor( list[cnt], &desc );
759         if (desc.idVendor!=USB_ST_VID) continue;
760         if (devBus && devAddr)
761             if ((libusb_get_bus_number(list[cnt])!=devBus) || (libusb_get_device_address(list[cnt])!=devAddr)) continue;
762         if ( (desc.idProduct == USB_STLINK_32L_PID) || (desc.idProduct == USB_STLINK_NUCLEO_PID) ){
763             if ((p_usb_iserial != NULL)){
764                 struct libusb_device_handle* handle;
765                 libusb_open(list[cnt], &handle);
766                 libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, (unsigned char *)sl->serial, sizeof(sl->serial));
767                 libusb_close(handle);
768                 if (memcmp(p_usb_iserial,&sl->serial, sizeof(sl->serial) - 1) == 0){
769                     break;
770                 }else{
771                     continue;
772                 }
773             }else{
774                 break;
775             }
776         }
777         if (desc.idProduct == USB_STLINK_PID) {
778             slu->protocoll = 1;
779             break;
780         }
781     }
782
783     if (cnt < 0) {
784         WLOG ("Couldn't find %s ST-Link/V2 devices\n",(devBus && devAddr)?"matched":"any");
785         goto on_error;
786     } else {
787         int error = libusb_open(list[cnt], &slu->usb_handle);
788         if( error !=0 ) {
789             WLOG("Error %d (%s) opening ST-Link/V2 device %03d:%03d\n", 
790         error, strerror (errno), libusb_get_bus_number(list[cnt]), libusb_get_device_address(list[cnt]));
791             goto on_error;
792         }
793     }
794
795     libusb_free_device_list(list, 1);
796
797
798     if (libusb_kernel_driver_active(slu->usb_handle, 0) == 1) {
799         int r;
800
801         r = libusb_detach_kernel_driver(slu->usb_handle, 0);
802         if (r<0) {
803             WLOG("libusb_detach_kernel_driver(() error %s\n", strerror(-r));
804             goto on_libusb_error;
805         }
806     }
807
808     if (libusb_get_configuration(slu->usb_handle, &config)) {
809         /* this may fail for a previous configured device */
810         WLOG("libusb_get_configuration()\n");
811         goto on_libusb_error;
812     }
813
814     if (config != 1) {
815         printf("setting new configuration (%d -> 1)\n", config);
816         if (libusb_set_configuration(slu->usb_handle, 1)) {
817             /* this may fail for a previous configured device */
818             WLOG("libusb_set_configuration() failed\n");
819             goto on_libusb_error;
820         }
821     }
822
823     if (libusb_claim_interface(slu->usb_handle, 0)) {
824         WLOG("libusb_claim_interface() failed\n");
825         goto on_libusb_error;
826     }
827
828     // TODO - could use the scanning techniq from stm8 code here...
829     slu->ep_rep = 1 /* ep rep */ | LIBUSB_ENDPOINT_IN;
830     if (desc.idProduct == USB_STLINK_NUCLEO_PID) {
831         slu->ep_req = 1 /* ep req */ | LIBUSB_ENDPOINT_OUT;
832     } else {
833         slu->ep_req = 2 /* ep req */ | LIBUSB_ENDPOINT_OUT;
834     }
835
836     slu->sg_transfer_idx = 0;
837     // TODO - never used at the moment, always CMD_SIZE
838     slu->cmd_len = (slu->protocoll == 1)? STLINK_SG_SIZE: STLINK_CMD_SIZE;
839
840     /* success */
841
842     if (stlink_current_mode(sl) == STLINK_DEV_DFU_MODE) {
843         ILOG("-- exit_dfu_mode\n");
844         stlink_exit_dfu_mode(sl);
845     }
846
847     if (stlink_current_mode(sl) != STLINK_DEV_DEBUG_MODE) {
848         stlink_enter_swd_mode(sl);
849     }
850
851     if (reset) {
852         stlink_reset(sl);
853         usleep(10000);
854     }
855     stlink_version(sl);
856     error = stlink_load_device_params(sl);
857
858 on_libusb_error:
859     if (error == -1) {
860         stlink_close(sl);
861         return NULL;
862     }
863
864     /* success */
865     return sl;
866
867 on_error:
868     if( slu->libusb_ctx)
869         libusb_exit(slu->libusb_ctx);
870 on_malloc_error:
871     if (sl != NULL) free(sl);
872     if (slu != NULL) free(slu);
873     return NULL;
874 }
875
876 static size_t stlink_probe_usb_devs(libusb_device **devs, stlink_t **sldevs[]) {
877     stlink_t **_sldevs;
878     libusb_device *dev;
879     int i = 0;
880     size_t slcnt = 0;
881     size_t slcur = 0;
882
883     /* Count stlink */
884     while ((dev = devs[i++]) != NULL) {
885         struct libusb_device_descriptor desc;
886         int r = libusb_get_device_descriptor(dev, &desc);
887         if (r < 0) {
888             fprintf(stderr, "failed to get device descriptor");
889             break;
890         }
891
892         if (desc.idProduct != USB_STLINK_32L_PID &&
893             desc.idProduct != USB_STLINK_NUCLEO_PID)
894             continue;
895
896         slcnt++;
897     }
898
899     /* Allocate list of pointers */
900     _sldevs = calloc(slcnt, sizeof(stlink_t *));
901     if (!_sldevs) {
902         *sldevs = NULL;
903         return 0;
904     }
905
906     /* Open stlinks and attach to list */
907     i = 0;
908     while ((dev = devs[i++]) != NULL) {
909         struct libusb_device_descriptor desc;
910         int r = libusb_get_device_descriptor(dev, &desc);
911         if (r < 0) {
912             fprintf(stderr, "failed to get device descriptor");
913             break;
914         }
915
916         if (desc.idProduct != USB_STLINK_32L_PID &&
917             desc.idProduct != USB_STLINK_NUCLEO_PID)
918             continue;
919
920         struct libusb_device_handle* handle;
921         char serial[13];
922         memset(serial, 0, sizeof(serial));
923
924         libusb_open(dev, &handle);
925         libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, (unsigned char *)&serial, sizeof(serial));
926         libusb_close(handle);
927
928         stlink_t *sl = NULL;
929         sl = stlink_open_usb(0, 1, serial);
930         if (!sl)
931             continue;
932
933         _sldevs[slcur] = sl;
934         slcur++;
935     }
936
937     *sldevs = _sldevs;
938     return slcnt;
939 }
940
941 size_t stlink_probe_usb(stlink_t **stdevs[]) {
942     libusb_device **devs;
943     stlink_t **sldevs;
944
945     size_t slcnt = 0;
946     int r;
947     ssize_t cnt;
948
949     r = libusb_init(NULL);
950     if (r < 0)
951         return 0;
952
953     cnt = libusb_get_device_list(NULL, &devs);
954     if (cnt < 0)
955         return 0;
956
957     slcnt = stlink_probe_usb_devs(devs, &sldevs);
958     libusb_free_device_list(devs, 1);
959
960     libusb_exit(NULL);
961
962     *stdevs = sldevs;
963     return slcnt;
964 }
965
966 void stlink_probe_usb_free(stlink_t ***stdevs, size_t size) {
967     if (stdevs == NULL || *stdevs == NULL || size == 0)
968         return;
969
970     for (size_t n = 0; n < size; n++)
971         stlink_close((*stdevs)[n]);
972     free(*stdevs);
973     *stdevs = NULL;
974 }