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