Merge branch 'master' of https://github.com/texane/stlink
[fw/stlink] / src / stlink-usb.c
1 #include <assert.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <stdint.h>
6 #include <time.h>
7 #include <sys/types.h>
8 #include <libusb-1.0/libusb.h>
9 #include "stlink-common.h"
10 #include "stlink-usb.h"
11
12 void _stlink_usb_close(stlink_t* sl) {
13     struct stlink_libusb * const handle = sl->backend_data;
14     // maybe we couldn't even get the usb device?
15     if (handle != NULL) {
16         if (handle->req_trans != NULL)
17             libusb_free_transfer(handle->req_trans);
18
19         if (handle->rep_trans != NULL)
20             libusb_free_transfer(handle->rep_trans);
21
22         if (handle->usb_handle != NULL)
23             libusb_close(handle->usb_handle);
24
25         libusb_exit(handle->libusb_ctx);
26         free(handle);
27     }
28 }
29
30
31 struct trans_ctx {
32 #define TRANS_FLAGS_IS_DONE (1 << 0)
33 #define TRANS_FLAGS_HAS_ERROR (1 << 1)
34     volatile unsigned long flags;
35 };
36
37 static void on_trans_done(struct libusb_transfer * trans) {
38     struct trans_ctx * const ctx = trans->user_data;
39
40     if (trans->status != LIBUSB_TRANSFER_COMPLETED)
41         ctx->flags |= TRANS_FLAGS_HAS_ERROR;
42
43     ctx->flags |= TRANS_FLAGS_IS_DONE;
44 }
45
46 int submit_wait(struct stlink_libusb *slu, struct libusb_transfer * trans) {
47     struct timeval start;
48     struct timeval now;
49     struct timeval diff;
50     struct trans_ctx trans_ctx;
51     enum libusb_error error;
52
53     trans_ctx.flags = 0;
54
55     /* brief intrusion inside the libusb interface */
56     trans->callback = on_trans_done;
57     trans->user_data = &trans_ctx;
58
59     if ((error = libusb_submit_transfer(trans))) {
60         printf("libusb_submit_transfer(%d)\n", error);
61         return -1;
62     }
63
64     gettimeofday(&start, NULL);
65
66     while (trans_ctx.flags == 0) {
67         struct timeval timeout;
68         timeout.tv_sec = 3;
69         timeout.tv_usec = 0;
70         if (libusb_handle_events_timeout(slu->libusb_ctx, &timeout)) {
71             printf("libusb_handle_events()\n");
72             return -1;
73         }
74
75         gettimeofday(&now, NULL);
76         timersub(&now, &start, &diff);
77         if (diff.tv_sec >= 3) {
78             printf("libusb_handle_events() timeout\n");
79             return -1;
80         }
81     }
82
83     if (trans_ctx.flags & TRANS_FLAGS_HAS_ERROR) {
84         printf("libusb_handle_events() | has_error\n");
85         return -1;
86     }
87
88     return 0;
89 }
90
91 ssize_t send_recv(struct stlink_libusb* handle,
92         unsigned char* txbuf, size_t txsize,
93         unsigned char* rxbuf, size_t rxsize) {
94     /* note: txbuf and rxbuf can point to the same area */
95
96     libusb_fill_bulk_transfer(handle->req_trans, handle->usb_handle,
97             handle->ep_req,
98             txbuf, txsize,
99             NULL, NULL,
100             0
101             );
102
103     printf("submit_wait(req)\n");
104
105     if (submit_wait(handle, handle->req_trans)) return -1;
106
107     /* send_only */
108     if (rxsize == 0) return 0;
109
110     /* read the response */
111
112     libusb_fill_bulk_transfer(handle->rep_trans, handle->usb_handle,
113             handle->ep_rep, rxbuf, rxsize, NULL, NULL, 0);
114
115     printf("submit_wait(rep)\n");
116
117     if (submit_wait(handle, handle->rep_trans)) return -1;
118
119     return handle->rep_trans->actual_length;
120 }
121
122 static inline int send_only
123 (struct stlink_libusb* handle, unsigned char* txbuf, size_t txsize) {
124     return send_recv(handle, txbuf, txsize, NULL, 0);
125 }
126
127
128 // KARL - fixme, common code! (or, one per backend)
129 // candidate for common code...
130
131
132 static int is_stlink_device(libusb_device * dev) {
133     struct libusb_device_descriptor desc;
134
135     if (libusb_get_device_descriptor(dev, &desc))
136         return 0;
137
138     printf("device: 0x%04x, 0x%04x\n", desc.idVendor, desc.idProduct);
139
140     if (desc.idVendor != USB_ST_VID)
141         return 0;
142
143     if (desc.idProduct != USB_STLINK_32L_PID)
144         return 0;
145
146     return 1;
147 }
148
149 void _stlink_usb_version(stlink_t *sl) {
150     struct stlink_libusb * const slu = sl->backend_data;
151     unsigned char* const buf = sl->q_buf;
152     ssize_t size;
153
154     memset(buf, 0, sizeof (sl->q_buf));
155     buf[0] = STLINK_GET_VERSION;
156     buf[1] = 0x80;
157
158     size = send_recv(slu, buf, STLINK_CMD_SIZE, buf, 6);
159     if (size == -1) {
160         printf("[!] send_recv\n");
161         return;
162     }
163
164 #if 1 /* DEBUG */
165     {
166         ssize_t i;
167         for (i = 0; i < size; ++i) printf("%02x", buf[i]);
168         printf("\n");
169     }
170 #endif /* DEBUG */
171 }
172
173 void _stlink_usb_write_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
174     struct stlink_libusb * const slu = sl->backend_data;
175     unsigned char* const buf = sl->q_buf;
176     unsigned char *cmd_buf = sl->c_buf;
177
178     memset(cmd_buf, 0, STLINK_CMD_SIZE);
179     cmd_buf[0] = STLINK_DEBUG_COMMAND;
180     cmd_buf[1] =  STLINK_DEBUG_WRITEMEM_32BIT;
181     write_uint32(cmd_buf + 2, addr);
182     write_uint16(cmd_buf + 6, len);
183     send_only(slu, cmd_buf, STLINK_CMD_SIZE);
184
185 #if Q_BUF_LEN < UINT16_MAX
186     assert(len < sizeof(sl->q_buf));  // makes a compiler warning? always true?
187 #endif
188     assert((len & 3) == 0); 
189     send_only(slu, buf, len);
190
191 }
192
193 void _stlink_usb_write_mem8(stlink_t *sl, uint32_t addr, uint16_t len) {
194     struct stlink_libusb * const slu = sl->backend_data;
195     unsigned char* const buf = sl->q_buf;
196     unsigned char *cmd_buf = sl->c_buf;
197
198     memset(cmd_buf, 0, STLINK_CMD_SIZE);
199     cmd_buf[0] = STLINK_DEBUG_COMMAND;
200     cmd_buf[1] =  STLINK_DEBUG_WRITEMEM_8BIT;
201     write_uint32(cmd_buf + 2, addr);
202     write_uint16(cmd_buf + 6, len);
203     send_only(slu, cmd_buf, STLINK_CMD_SIZE);
204
205 #if Q_BUF_LEN < UINT16_MAX
206     assert(len < sizeof(sl->q_buf));  // makes a compiler warning? always true?
207 #endif
208     send_only(slu, buf, len);
209 }
210
211
212 int _stlink_usb_current_mode(stlink_t * sl) {
213     struct stlink_libusb * const slu = sl->backend_data;
214     unsigned char* const buf = sl->q_buf;
215     ssize_t size;
216     memset(buf, 0, sizeof (sl->q_buf));
217     buf[0] = STLINK_GET_CURRENT_MODE;
218     size = send_recv(slu, buf, STLINK_CMD_SIZE, buf, 2);
219     if (size == -1) {
220         printf("[!] send_recv\n");
221         return -1;
222     }
223     return sl->q_buf[0];
224 }
225
226 void _stlink_usb_core_id(stlink_t * sl) {
227     struct stlink_libusb * const slu = sl->backend_data;
228     unsigned char* const buf = sl->q_buf;
229     ssize_t size;
230
231     memset(buf, 0, sizeof (sl->q_buf));
232     buf[0] = STLINK_DEBUG_COMMAND;
233     buf[1] = STLINK_DEBUG_READCOREID;
234
235     size = send_recv(slu, buf, STLINK_CMD_SIZE, buf, 4);
236     if (size == -1) {
237         printf("[!] send_recv\n");
238         return;
239     }
240
241     sl->core_id = read_uint32(buf, 0);
242 }
243
244 void _stlink_usb_status(stlink_t * sl) {
245     struct stlink_libusb * const slu = sl->backend_data;
246     unsigned char* const buf = sl->q_buf;
247     ssize_t size;
248
249     memset(buf, 0, sizeof (sl->q_buf));
250
251     buf[0] = STLINK_DEBUG_COMMAND;
252     buf[1] = STLINK_DEBUG_GETSTATUS;
253
254     size = send_recv(slu, buf, STLINK_CMD_SIZE, buf, 2);
255     if (size == -1) {
256         printf("[!] send_recv\n");
257         return;
258     }
259
260     /* todo: stlink_core_stat */
261
262     // FIXME - decode into sl->core_stat
263 #if 1 /* DEBUG */
264     printf("status == 0x%x\n", buf[0]);
265 #endif /* DEBUG */
266
267 }
268
269 void _stlink_usb_force_debug(stlink_t *sl) {
270     struct stlink_libusb *slu = sl->backend_data;
271     unsigned char* const buf = sl->q_buf;
272     ssize_t size;
273
274     memset(buf, 0, sizeof (sl->q_buf));
275
276     buf[0] = STLINK_DEBUG_COMMAND;
277     buf[1] = STLINK_DEBUG_FORCEDEBUG;
278     size = send_recv(slu, buf, STLINK_CMD_SIZE, buf, 2);
279     if (size == -1) {
280         printf("[!] send_recv\n");
281         return;
282     }
283 }
284
285
286 void _stlink_usb_enter_swd_mode(stlink_t * sl) {
287     struct stlink_libusb * const slu = sl->backend_data;
288     unsigned char* const buf = sl->q_buf;
289     ssize_t size;
290
291     memset(buf, 0, sizeof (sl->q_buf));
292
293     buf[0] = STLINK_DEBUG_COMMAND;
294     buf[1] = STLINK_SWD_ENTER;
295     buf[2] = STLINK_DEBUG_ENTER_SWD;
296
297     size = send_recv(slu, buf, STLINK_CMD_SIZE, buf, 2);
298     if (size == -1) {
299         printf("[!] send_recv\n");
300         return;
301     }
302 }
303
304 void _stlink_usb_exit_dfu_mode(stlink_t* sl) {
305     struct stlink_libusb * const slu = sl->backend_data;
306     unsigned char* const buf = sl->q_buf;
307     ssize_t size;
308
309     memset(buf, 0, sizeof (sl->q_buf));
310     buf[0] = STLINK_DFU_COMMAND;
311     buf[1] = STLINK_DFU_EXIT;
312
313     size = send_only(slu, buf, 16);
314     if (size == -1) {
315         printf("[!] send_recv\n");
316         return;
317     }
318 }
319
320 /**
321  * TODO - not convinced this does anything...
322  * @param sl
323  */
324 void _stlink_usb_reset(stlink_t * sl) {
325     struct stlink_libusb * const slu = sl->backend_data;
326     unsigned char* const buf = sl->q_buf;
327     ssize_t size;
328
329     memset(buf, 0, sizeof (sl->q_buf));
330     buf[0] = STLINK_DEBUG_COMMAND;
331     buf[1] = STLINK_DEBUG_RESETSYS;
332
333     size = send_recv(slu, buf, STLINK_CMD_SIZE, buf, sizeof (sl->q_buf));
334     if (size == -1) {
335         printf("[!] send_recv\n");
336         return;
337     }
338 }
339
340
341 void _stlink_usb_step(stlink_t* sl) {
342     struct stlink_libusb * const slu = sl->backend_data;
343     unsigned char* const buf = sl->q_buf;
344     ssize_t size;
345
346     memset(buf, 0, sizeof (sl->q_buf));
347     buf[0] = STLINK_DEBUG_COMMAND;
348     buf[1] = STLINK_DEBUG_STEPCORE;
349
350     size = send_recv(slu, buf, STLINK_CMD_SIZE, buf, 2);
351     if (size == -1) {
352         printf("[!] send_recv\n");
353         return;
354     }
355 }
356
357 /**
358  * This seems to do a good job of restarting things from the beginning?
359  * @param sl
360  */
361 void _stlink_usb_run(stlink_t* sl) {
362     struct stlink_libusb * const slu = sl->backend_data;
363     unsigned char* const buf = sl->q_buf;
364     ssize_t size;
365
366     memset(buf, 0, sizeof (sl->q_buf));
367     buf[0] = STLINK_DEBUG_COMMAND;
368     buf[1] = STLINK_DEBUG_RUNCORE;
369
370     size = send_recv(slu, buf, STLINK_CMD_SIZE, buf, 2);
371     if (size == -1) {
372         printf("[!] send_recv\n");
373         return;
374     }
375
376 }
377
378 void _stlink_usb_exit_debug_mode(stlink_t *sl) {
379     struct stlink_libusb * const slu = sl->backend_data;
380     unsigned char* const buf = sl->q_buf;
381     ssize_t size;
382
383     memset(buf, 0, sizeof (sl->q_buf));
384     buf[0] = STLINK_DEBUG_COMMAND;
385     buf[1] = STLINK_DEBUG_EXIT;
386
387     size = send_only(slu, buf, 16);
388     if (size == -1) {
389         printf("[!] send_only\n");
390         return;
391     }
392 }
393
394 void _stlink_usb_read_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
395     struct stlink_libusb * const slu = sl->backend_data;
396     unsigned char* const buf = sl->q_buf;
397     ssize_t size;
398
399     /* assume len < sizeof(sl->q_buf) */
400
401     memset(buf, 0, sizeof (sl->q_buf));
402     buf[0] = STLINK_DEBUG_COMMAND;
403     buf[1] = STLINK_DEBUG_READMEM_32BIT;
404     write_uint32(buf + 2, addr);
405     /* windows usb logs show only one byte is used for length ... */
406     // Presumably, this is because usb transfers can't be 16 bits worth of bytes long...
407     assert (len < 256);
408     buf[6] = (uint8_t) len;
409
410     size = send_recv(slu, buf, STLINK_CMD_SIZE, buf, len);
411     if (size == -1) {
412         printf("[!] send_recv\n");
413         return;
414     }
415
416     sl->q_len = (size_t) size;
417
418     stlink_print_data(sl);
419 }
420
421
422 #if 1 /* stlinkv1 */
423
424 void _stlink_usb_read_all_regs(stlink_t *sl, reg *regp) {
425     struct stlink_libusb * const slu = sl->backend_data;
426     unsigned char* const buf = sl->q_buf;
427     unsigned char* const cmd_buf = sl->c_buf;
428     ssize_t size;
429     int i;
430
431     memset(cmd_buf, 0, STLINK_CMD_SIZE);
432     cmd_buf[0] = STLINK_DEBUG_COMMAND;
433     cmd_buf[1] = STLINK_DEBUG_READALLREGS;
434     size = send_recv(slu, cmd_buf, STLINK_CMD_SIZE, buf, 84);
435     if (size == -1) {
436         printf("[!] send_recv\n");
437         return;
438     }
439     sl->q_len = (size_t) size;
440     stlink_print_data(sl);
441     for(i=0; i<16; i++)
442         regp->r[i]= read_uint32(sl->q_buf, i*4);
443     regp->xpsr       = read_uint32(sl->q_buf, 64);
444     regp->main_sp    = read_uint32(sl->q_buf, 68);
445     regp->process_sp = read_uint32(sl->q_buf, 72);
446     regp->rw         = read_uint32(sl->q_buf, 76);
447     regp->rw2        = read_uint32(sl->q_buf, 80);
448     if (sl->verbose < 2)
449         return;
450
451     DD(sl, "xpsr       = 0x%08x\n", read_uint32(sl->q_buf, 64));
452     DD(sl, "main_sp    = 0x%08x\n", read_uint32(sl->q_buf, 68));
453     DD(sl, "process_sp = 0x%08x\n", read_uint32(sl->q_buf, 72));
454     DD(sl, "rw         = 0x%08x\n", read_uint32(sl->q_buf, 76));
455     DD(sl, "rw2        = 0x%08x\n", read_uint32(sl->q_buf, 80));
456 }
457
458 #else /* stlinkv2 */
459
460 static void _stlink_usb_read_all_regs(stlink_t *sl, reg *regp) {
461     struct stlink_libusb * const slu = sl->backend_data;
462     unsigned char* const buf = sl->q_buf;
463     unsigned char* const cmd_buf = sl->c_buf;
464     ssize_t size;
465     int i;
466
467 #define STLINK_JTAG_COMMAND 0xf2
468 #define STLINK_JTAG_READALLREGS2 0x3a
469     memset(cmd_buf, 0, STLINK_CMD_SIZE);
470     cmd_buf[0] = STLINK_JTAG_COMMAND;
471     cmd_buf[1] = STLINK_JTAG_READALLREGS2;
472     size = send_recv(slu, cmd_buf, STLINK_CMD_SIZE, buf, 84);
473
474     if (size == -1) {
475         printf("[!] send_recv\n");
476         return;
477     }
478
479     sl->q_len = (size_t) size;
480
481     for(i=0; i<16; i++)
482       regp->r[i]= read_uint32(sl->q_buf, i*4);
483
484     regp->xpsr       = read_uint32(sl->q_buf, 64);
485     regp->main_sp    = read_uint32(sl->q_buf, 68);
486     regp->process_sp = read_uint32(sl->q_buf, 72);
487     regp->rw         = read_uint32(sl->q_buf, 76);
488     regp->rw2        = read_uint32(sl->q_buf, 80);
489 }
490
491 #endif /* stlinkv1 */
492
493 void _stlink_usb_read_reg(stlink_t *sl, int r_idx, reg *regp) {
494     struct stlink_libusb * const slu = sl->backend_data;
495     unsigned char* const buf = sl->q_buf;
496     unsigned char* const cmd_buf = sl->c_buf;
497     ssize_t size;
498     uint32_t r;
499
500     memset(cmd_buf, 0, STLINK_CMD_SIZE);
501     cmd_buf[0] = STLINK_DEBUG_COMMAND;
502     cmd_buf[1] = STLINK_DEBUG_READREG;
503     cmd_buf[2] = (uint8_t) r_idx;
504     size = send_recv(slu, cmd_buf, STLINK_CMD_SIZE, buf, 4);
505     if (size == -1) {
506         printf("[!] send_recv\n");
507         return;
508     }
509     sl->q_len = (size_t) size;
510     stlink_print_data(sl);
511     r = read_uint32(sl->q_buf, 0);
512     DD(sl, "r_idx (%2d) = 0x%08x\n", r_idx, r);
513     
514     switch (r_idx) {
515     case 16:
516         regp->xpsr = r;
517         break;
518     case 17:
519         regp->main_sp = r;
520         break;
521     case 18:
522         regp->process_sp = r;
523         break;
524     case 19:
525         regp->rw = r; //XXX ?(primask, basemask etc.)
526         break;
527     case 20:
528         regp->rw2 = r; //XXX ?(primask, basemask etc.)
529         break;
530     default:
531         regp->r[r_idx] = r;
532     }
533 }
534
535
536 #if 1 /* stlinkv1 */
537
538 void _stlink_usb_write_reg(stlink_t *sl, uint32_t reg, int idx) {
539     struct stlink_libusb * const slu = sl->backend_data;
540     unsigned char* const buf = sl->q_buf;
541     unsigned char *cmd_buf = sl->c_buf;
542     ssize_t size;
543
544     memset(cmd_buf, 0, STLINK_CMD_SIZE);
545     cmd_buf[0] = STLINK_DEBUG_COMMAND;
546     cmd_buf[1] = STLINK_DEBUG_WRITEREG;
547     cmd_buf[2] = idx;
548     write_uint32(cmd_buf + 3, reg);
549     size = send_recv(slu, cmd_buf, STLINK_CMD_SIZE, buf, 2);
550     if (size == -1) {
551         printf("[!] send_recv\n");
552         return;
553     }
554     sl->q_len = (size_t) size;
555     stlink_print_data(sl);
556 }
557
558 #else /* stlinkv2 */
559
560 void _stlink_usb_write_reg(stlink_t *sl, uint32_t reg, int idx) {
561     struct stlink_libusb * const slu = sl->backend_data;
562     unsigned char* const buf = sl->q_buf;
563     unsigned char *cmd_buf = sl->c_buf;
564     ssize_t size;
565
566 #define STLINK_JTAG_WRITEREG2 0x34
567     memset(cmd_buf, 0, STLINK_CMD_SIZE);
568     cmd_buf[0] = STLINK_JTAG_COMMAND;
569     cmd_buf[1] = STLINK_JTAG_WRITEREG2;
570     cmd_buf[2] = idx;
571     write_uint32(cmd_buf + 3, reg);
572     size = send_recv(slu, cmd_buf, STLINK_CMD_SIZE, buf, 2);
573     if (size == -1) {
574         printf("[!] send_recv\n");
575         return;
576     }
577     sl->q_len = (size_t) size;
578     stlink_print_data(sl);
579 }
580
581 #endif /* stlinkv1 */
582
583
584 stlink_backend_t _stlink_usb_backend = {
585     _stlink_usb_close,
586     _stlink_usb_exit_debug_mode,
587     _stlink_usb_enter_swd_mode,
588     NULL,  // no enter_jtag_mode here...
589     _stlink_usb_exit_dfu_mode,
590     _stlink_usb_core_id,
591     _stlink_usb_reset,
592     _stlink_usb_run,
593     _stlink_usb_status,
594     _stlink_usb_version,
595     _stlink_usb_read_mem32,
596     _stlink_usb_write_mem32,
597     _stlink_usb_write_mem8,
598     _stlink_usb_read_all_regs,
599     _stlink_usb_read_reg,
600     _stlink_usb_write_reg,
601     _stlink_usb_step,
602     _stlink_usb_current_mode,
603     _stlink_usb_force_debug
604 };
605
606
607 stlink_t* stlink_open_usb(const char *dev_name, const int verbose) {
608     stlink_t* sl = NULL;
609     struct stlink_libusb* slu = NULL;
610
611     /* unused */
612     dev_name = dev_name;
613
614     sl = malloc(sizeof (stlink_t));
615     slu = malloc(sizeof (struct stlink_libusb));
616     if (sl == NULL) goto on_error;
617     if (slu == NULL) goto on_error;
618
619     sl->verbose = verbose;
620     
621     if (slu->libusb_ctx != NULL) {
622         fprintf(stderr, "reopening with an existing context? undefined behaviour!\n");
623         goto on_error;
624     } else {
625         if (libusb_init(&(slu->libusb_ctx))) {
626             fprintf(stderr, "failed to init libusb context, wrong version of libraries?\n");
627             goto on_error;
628         }
629     }
630
631     int error = -1;
632
633     libusb_device** devs = NULL;
634     libusb_device* dev;
635     ssize_t i;
636     ssize_t count;
637     int config;
638
639     count = libusb_get_device_list(slu->libusb_ctx, &devs);
640     if (count < 0) {
641         printf("libusb_get_device_list\n");
642         goto on_libusb_error;
643     }
644
645     for (i = 0; i < count; ++i) {
646         dev = devs[i];
647         if (is_stlink_device(dev)) break;
648     }
649     if (i == count) return NULL;
650
651     if (libusb_open(dev, &(slu->usb_handle))) {
652         printf("libusb_open()\n");
653         goto on_libusb_error;
654     }
655
656     if (libusb_get_configuration(slu->usb_handle, &config)) {
657         /* this may fail for a previous configured device */
658         printf("libusb_get_configuration()\n");
659         goto on_libusb_error;
660     }
661
662     if (config != 1) {
663         printf("setting new configuration (%d -> 1)\n", config);
664         if (libusb_set_configuration(slu->usb_handle, 1)) {
665             /* this may fail for a previous configured device */
666             printf("libusb_set_configuration()\n");
667             goto on_libusb_error;
668         }
669     }
670
671     if (libusb_claim_interface(slu->usb_handle, 0)) {
672         printf("libusb_claim_interface()\n");
673         goto on_libusb_error;
674     }
675
676     slu->req_trans = libusb_alloc_transfer(0);
677     if (slu->req_trans == NULL) {
678         printf("libusb_alloc_transfer\n");
679         goto on_libusb_error;
680     }
681
682     slu->rep_trans = libusb_alloc_transfer(0);
683     if (slu->rep_trans == NULL) {
684         printf("libusb_alloc_transfer\n");
685         goto on_libusb_error;
686     }
687
688     slu->ep_rep = 1 /* ep rep */ | LIBUSB_ENDPOINT_IN;
689     slu->ep_req = 2 /* ep req */ | LIBUSB_ENDPOINT_OUT;
690
691     /* libusb_reset_device(slu->usb_handle); */
692
693     /* success */
694     error = 0;
695
696 on_libusb_error:
697     if (devs != NULL) {
698         libusb_free_device_list(devs, 1);
699         fprintf(stderr, "freed libusb device list\n");
700     }
701
702     if (error == -1) {
703         stlink_close(sl);
704         return NULL;
705     }
706
707     sl->backend = &_stlink_usb_backend;
708     sl->backend_data = slu;
709     /* success */
710     return sl;
711
712 on_error:
713     if (sl != NULL) free(sl);
714     if (slu != NULL) free(slu);
715     return 0;
716 }
717