Expose JTAG NRST
[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 static int fill_command
154 (stlink_t * sl, enum SCSI_Generic_Direction dir, uint32_t len) {
155     struct stlink_libusb * const slu = sl->backend_data;
156     unsigned char* const cmd = sl->c_buf;
157     int i = 0;
158     memset(cmd, 0, sizeof (sl->c_buf));
159     if(slu->protocoll == 1) {
160         fprintf(stderr, "This is never used....\n");
161         cmd[i++] = 'U';
162         cmd[i++] = 'S';
163         cmd[i++] = 'B';
164         cmd[i++] = 'C';
165         write_uint32(&cmd[i], slu->sg_transfer_idx);
166         write_uint32(&cmd[i + 4], len);
167         i += 8;
168         cmd[i++] = (dir == SG_DXFER_FROM_DEV)?0x80:0;
169         cmd[i++] = 0; /* Logical unit */
170         cmd[i++] = 0xa; /* Command length */
171     }
172     return i;
173 }
174
175 void _stlink_usb_version(stlink_t *sl) {
176     struct stlink_libusb * const slu = sl->backend_data;
177     unsigned char* const data = sl->q_buf;
178     unsigned char* const cmd  = sl->c_buf;
179     ssize_t size;
180     uint32_t rep_len = 6;
181     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
182
183     cmd[i++] = STLINK_GET_VERSION;
184
185     size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
186     if (size == -1) {
187         printf("[!] send_recv\n");
188         return;
189     }
190 }
191
192 void _stlink_usb_write_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
193     struct stlink_libusb * const slu = sl->backend_data;
194     unsigned char* const data = sl->q_buf;
195     unsigned char* const cmd  = sl->c_buf;
196
197     int i = fill_command(sl, SG_DXFER_TO_DEV, len);
198     cmd[i++] = STLINK_DEBUG_COMMAND;
199     cmd[i++] = STLINK_DEBUG_WRITEMEM_32BIT;
200     write_uint32(&cmd[i], addr);
201     write_uint16(&cmd[i + 4], len);
202     send_only(slu, 0, cmd, slu->cmd_len);
203
204     send_only(slu, 1, data, len);
205 }
206
207 void _stlink_usb_write_mem8(stlink_t *sl, uint32_t addr, uint16_t len) {
208     struct stlink_libusb * const slu = sl->backend_data;
209     unsigned char* const data = sl->q_buf;
210     unsigned char* const cmd  = sl->c_buf;
211
212     int i = fill_command(sl, SG_DXFER_TO_DEV, 0);
213     cmd[i++] = STLINK_DEBUG_COMMAND;
214     cmd[i++] = STLINK_DEBUG_WRITEMEM_8BIT;
215     write_uint32(&cmd[i], addr);
216     write_uint16(&cmd[i + 4], len);
217     send_only(slu, 0, cmd, slu->cmd_len);
218     send_only(slu, 1, data, len);
219 }
220
221
222 int _stlink_usb_current_mode(stlink_t * sl) {
223     struct stlink_libusb * const slu = sl->backend_data;
224     unsigned char* const cmd  = sl->c_buf;
225     unsigned char* const data = sl->q_buf;
226     ssize_t size;
227     int rep_len = 2;
228     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
229     
230     cmd[i++] = STLINK_GET_CURRENT_MODE;
231     size = send_recv(slu, 1, cmd,  slu->cmd_len, data, rep_len);
232     if (size == -1) {
233         printf("[!] send_recv\n");
234         return -1;
235     }
236     return sl->q_buf[0];
237 }
238
239 void _stlink_usb_core_id(stlink_t * sl) {
240     struct stlink_libusb * const slu = sl->backend_data;
241     unsigned char* const cmd  = sl->c_buf;
242     unsigned char* const data = sl->q_buf;
243     ssize_t size;
244     int rep_len = 4;
245     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
246
247     cmd[i++] = STLINK_DEBUG_COMMAND;
248     cmd[i++] = STLINK_DEBUG_READCOREID;
249
250     size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
251     if (size == -1) {
252         printf("[!] send_recv\n");
253         return;
254     }
255
256     sl->core_id = read_uint32(data, 0);
257 }
258
259 void _stlink_usb_status(stlink_t * sl) {
260     struct stlink_libusb * const slu = sl->backend_data;
261     unsigned char* const data = sl->q_buf;
262     unsigned char* const cmd  = sl->c_buf;
263     ssize_t size;
264     int rep_len = 2;
265     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
266
267     cmd[i++] = STLINK_DEBUG_COMMAND;
268     cmd[i++] = STLINK_DEBUG_GETSTATUS;
269
270     size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
271     if (size == -1) {
272         printf("[!] send_recv\n");
273         return;
274     }
275 }
276
277 void _stlink_usb_force_debug(stlink_t *sl) {
278     struct stlink_libusb *slu = sl->backend_data;
279     unsigned char* const data = sl->q_buf;
280     unsigned char* const cmd  = sl->c_buf;
281     ssize_t size;
282     int rep_len = 2;
283     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
284
285     cmd[i++] = STLINK_DEBUG_COMMAND;
286     cmd[i++] = STLINK_DEBUG_FORCEDEBUG;
287     size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
288     if (size == -1) {
289         printf("[!] send_recv\n");
290         return;
291     }
292 }
293
294 void _stlink_usb_enter_swd_mode(stlink_t * sl) {
295     struct stlink_libusb * const slu = sl->backend_data;
296     unsigned char* const cmd  = sl->c_buf;
297     ssize_t size;
298     const int rep_len = 0;
299     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
300
301     cmd[i++] = STLINK_DEBUG_COMMAND;
302     cmd[i++] = STLINK_DEBUG_ENTER;
303     cmd[i++] = STLINK_DEBUG_ENTER_SWD;
304
305     size = send_only(slu, 1, cmd, slu->cmd_len);
306     if (size == -1) {
307         printf("[!] send_recv\n");
308         return;
309     }
310 }
311
312 void _stlink_usb_exit_dfu_mode(stlink_t* sl) {
313     struct stlink_libusb * const slu = sl->backend_data;
314     unsigned char* const cmd = sl->c_buf;
315     ssize_t size;
316     int i = fill_command(sl, SG_DXFER_FROM_DEV, 0);
317
318     cmd[i++] = STLINK_DFU_COMMAND;
319     cmd[i++] = STLINK_DFU_EXIT;
320
321     size = send_only(slu, 1, cmd, slu->cmd_len);
322     if (size == -1) {
323         printf("[!] send_recv\n");
324         return;
325     }
326 }
327
328 /**
329  * TODO - not convinced this does anything...
330  * @param sl
331  */
332 void _stlink_usb_reset(stlink_t * sl) {
333     struct stlink_libusb * const slu = sl->backend_data;
334     unsigned char* const data = sl->q_buf;
335     unsigned char* const cmd = sl->c_buf;
336     ssize_t size;
337     int rep_len = 2;
338     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
339
340     cmd[i++] = STLINK_DEBUG_COMMAND;
341     cmd[i++] = STLINK_DEBUG_RESETSYS;
342
343     size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
344     if (size == -1) {
345         printf("[!] send_recv\n");
346         return;
347     }
348 }
349
350
351 void _stlink_usb_jtag_reset(stlink_t * sl, int value) {
352     struct stlink_libusb * const slu = sl->backend_data;
353     unsigned char* const data = sl->q_buf;
354     unsigned char* const cmd = sl->c_buf;
355     ssize_t size;
356     int rep_len = 2;
357     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
358
359     cmd[i++] = STLINK_DEBUG_COMMAND;
360     cmd[i++] = STLINK_JTAG_DRIVE_NRST;
361     cmd[i++] = (value)?0:1;
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;
367     }
368 }
369
370
371 void _stlink_usb_step(stlink_t* sl) {
372     struct stlink_libusb * const slu = sl->backend_data;
373     unsigned char* const data = sl->q_buf;
374     unsigned char* const cmd = sl->c_buf;
375     ssize_t size;
376     int rep_len = 2;
377     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
378
379     cmd[i++] = STLINK_DEBUG_COMMAND;
380     cmd[i++] = STLINK_DEBUG_STEPCORE;
381
382     size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
383     if (size == -1) {
384         printf("[!] send_recv\n");
385         return;
386     }
387 }
388
389 /**
390  * This seems to do a good job of restarting things from the beginning?
391  * @param sl
392  */
393 void _stlink_usb_run(stlink_t* sl) {
394     struct stlink_libusb * const slu = sl->backend_data;
395     unsigned char* const data = sl->q_buf;
396     unsigned char* const cmd = sl->c_buf;
397     ssize_t size;
398     int rep_len = 2;
399     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
400
401     cmd[i++] = STLINK_DEBUG_COMMAND;
402     cmd[i++] = STLINK_DEBUG_RUNCORE;
403
404     size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
405     if (size == -1) {
406         printf("[!] send_recv\n");
407         return;
408     }
409 }
410
411 void _stlink_usb_exit_debug_mode(stlink_t *sl) {
412     struct stlink_libusb * const slu = sl->backend_data;
413     unsigned char* const cmd = sl->c_buf;
414     ssize_t size;
415     int i = fill_command(sl, SG_DXFER_FROM_DEV, 0);
416
417     cmd[i++] = STLINK_DEBUG_COMMAND;
418     cmd[i++] = STLINK_DEBUG_EXIT;
419
420     size = send_only(slu, 1, cmd, slu->cmd_len);
421     if (size == -1) {
422         printf("[!] send_only\n");
423         return;
424     }
425 }
426
427 void _stlink_usb_read_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
428     struct stlink_libusb * const slu = sl->backend_data;
429     unsigned char* const data = sl->q_buf;
430     unsigned char* const cmd = sl->c_buf;
431     ssize_t size;
432     int i = fill_command(sl, SG_DXFER_FROM_DEV, len);
433
434     cmd[i++] = STLINK_DEBUG_COMMAND;
435     cmd[i++] = STLINK_DEBUG_READMEM_32BIT;
436     write_uint32(&cmd[i], addr);
437     write_uint16(&cmd[i + 4], len);
438
439     size = send_recv(slu, 1, cmd, slu->cmd_len, data, len);
440     if (size == -1) {
441         printf("[!] send_recv\n");
442         return;
443     }
444
445     sl->q_len = (size_t) size;
446
447     stlink_print_data(sl);
448 }
449
450 void _stlink_usb_read_all_regs(stlink_t *sl, reg *regp) {
451     struct stlink_libusb * const slu = sl->backend_data;
452     unsigned char* const cmd = sl->c_buf;
453     unsigned char* const data = sl->q_buf;
454     ssize_t size;
455     uint32_t rep_len = 84;
456     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
457
458     cmd[i++] = STLINK_DEBUG_COMMAND;
459     cmd[i++] = STLINK_DEBUG_READALLREGS;
460     size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
461     if (size == -1) {
462         printf("[!] send_recv\n");
463         return;
464     }
465     sl->q_len = (size_t) size;
466     stlink_print_data(sl);
467     for(i=0; i<16; i++)
468         regp->r[i]= read_uint32(sl->q_buf, i*4);
469     regp->xpsr       = read_uint32(sl->q_buf, 64);
470     regp->main_sp    = read_uint32(sl->q_buf, 68);
471     regp->process_sp = read_uint32(sl->q_buf, 72);
472     regp->rw         = read_uint32(sl->q_buf, 76);
473     regp->rw2        = read_uint32(sl->q_buf, 80);
474     if (sl->verbose < 2)
475         return;
476
477     DLOG("xpsr       = 0x%08x\n", read_uint32(sl->q_buf, 64));
478     DLOG("main_sp    = 0x%08x\n", read_uint32(sl->q_buf, 68));
479     DLOG("process_sp = 0x%08x\n", read_uint32(sl->q_buf, 72));
480     DLOG("rw         = 0x%08x\n", read_uint32(sl->q_buf, 76));
481     DLOG("rw2        = 0x%08x\n", read_uint32(sl->q_buf, 80));
482 }
483
484 void _stlink_usb_read_reg(stlink_t *sl, int r_idx, reg *regp) {
485     struct stlink_libusb * const slu = sl->backend_data;
486     unsigned char* const data = sl->q_buf;
487     unsigned char* const cmd  = sl->c_buf;
488     ssize_t size;
489     uint32_t r;
490     uint32_t rep_len = 4;
491     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
492
493     cmd[i++] = STLINK_DEBUG_COMMAND;
494     cmd[i++] = STLINK_DEBUG_READREG;
495     cmd[i++] = (uint8_t) r_idx;
496     size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
497     if (size == -1) {
498         printf("[!] send_recv\n");
499         return;
500     }
501     sl->q_len = (size_t) size;
502     stlink_print_data(sl);
503     r = read_uint32(sl->q_buf, 0);
504     DLOG("r_idx (%2d) = 0x%08x\n", r_idx, r);
505     
506     switch (r_idx) {
507     case 16:
508         regp->xpsr = r;
509         break;
510     case 17:
511         regp->main_sp = r;
512         break;
513     case 18:
514         regp->process_sp = r;
515         break;
516     case 19:
517         regp->rw = r; /* XXX ?(primask, basemask etc.) */
518         break;
519     case 20:
520         regp->rw2 = r; /* XXX ?(primask, basemask etc.) */
521         break;
522     default:
523         regp->r[r_idx] = r;
524     }
525 }
526
527 void _stlink_usb_write_reg(stlink_t *sl, uint32_t reg, int idx) {
528     struct stlink_libusb * const slu = sl->backend_data;
529     unsigned char* const data = sl->q_buf;
530     unsigned char* const cmd  = sl->c_buf;
531     ssize_t size;
532     uint32_t rep_len = 2;
533     int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
534
535     cmd[i++] = STLINK_DEBUG_COMMAND;
536     cmd[i++] = STLINK_DEBUG_WRITEREG;
537     cmd[i++] = idx;
538     write_uint32(&cmd[i], reg);
539     size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
540     if (size == -1) {
541         printf("[!] send_recv\n");
542         return;
543     }
544     sl->q_len = (size_t) size;
545     stlink_print_data(sl);
546 }
547
548 stlink_backend_t _stlink_usb_backend = {
549     _stlink_usb_close,
550     _stlink_usb_exit_debug_mode,
551     _stlink_usb_enter_swd_mode,
552     NULL,  // no enter_jtag_mode here...
553     _stlink_usb_exit_dfu_mode,
554     _stlink_usb_core_id,
555     _stlink_usb_reset,
556     _stlink_usb_jtag_reset,
557     _stlink_usb_run,
558     _stlink_usb_status,
559     _stlink_usb_version,
560     _stlink_usb_read_mem32,
561     _stlink_usb_write_mem32,
562     _stlink_usb_write_mem8,
563     _stlink_usb_read_all_regs,
564     _stlink_usb_read_reg,
565     _stlink_usb_write_reg,
566     _stlink_usb_step,
567     _stlink_usb_current_mode,
568     _stlink_usb_force_debug
569 };
570
571
572 stlink_t* stlink_open_usb(const int verbose) {
573     stlink_t* sl = NULL;
574     struct stlink_libusb* slu = NULL;
575     int error = -1;
576     libusb_device** devs = NULL;
577     int config;
578
579     sl = malloc(sizeof (stlink_t));
580     slu = malloc(sizeof (struct stlink_libusb));
581     if (sl == NULL) goto on_error;
582     if (slu == NULL) goto on_error;
583     memset(sl, 0, sizeof (stlink_t));
584     memset(slu, 0, sizeof (struct stlink_libusb));
585
586     ugly_init(verbose);
587     sl->backend = &_stlink_usb_backend;
588     sl->backend_data = slu;
589     
590     sl->core_stat = STLINK_CORE_STAT_UNKNOWN;
591
592     if (libusb_init(&(slu->libusb_ctx))) {
593         WLOG("failed to init libusb context, wrong version of libraries?\n");
594         goto on_error;
595     }
596     
597     slu->usb_handle = libusb_open_device_with_vid_pid(slu->libusb_ctx, USB_ST_VID, USB_STLINK_32L_PID);
598     if (slu->usb_handle == NULL) {
599                 // TODO - free usb context too...
600                 WLOG("Couldn't find any ST-Link/V2 devices");
601         goto on_error;
602     }
603     
604     if (libusb_kernel_driver_active(slu->usb_handle, 0) == 1) {
605         int r;
606         
607         r = libusb_detach_kernel_driver(slu->usb_handle, 0);
608         if (r<0) {
609             WLOG("libusb_detach_kernel_driver(() error %s\n", strerror(-r));
610             goto on_libusb_error;
611         }
612     }
613
614     if (libusb_get_configuration(slu->usb_handle, &config)) {
615         /* this may fail for a previous configured device */
616         WLOG("libusb_get_configuration()\n");
617         goto on_libusb_error;
618     }
619
620     if (config != 1) {
621         printf("setting new configuration (%d -> 1)\n", config);
622         if (libusb_set_configuration(slu->usb_handle, 1)) {
623             /* this may fail for a previous configured device */
624             WLOG("libusb_set_configuration() failed\n");
625             goto on_libusb_error;
626         }
627     }
628
629     if (libusb_claim_interface(slu->usb_handle, 0)) {
630         WLOG("libusb_claim_interface() failed\n");
631         goto on_libusb_error;
632     }
633
634     slu->req_trans = libusb_alloc_transfer(0);
635     if (slu->req_trans == NULL) {
636         WLOG("libusb_alloc_transfer failed\n");
637         goto on_libusb_error;
638     }
639
640     slu->rep_trans = libusb_alloc_transfer(0);
641     if (slu->rep_trans == NULL) {
642         WLOG("libusb_alloc_transfer failed\n");
643         goto on_libusb_error;
644     }
645     // TODO - could use the scanning techniq from stm8 code here...
646     slu->ep_rep = 1 /* ep rep */ | LIBUSB_ENDPOINT_IN;
647     slu->ep_req = 2 /* ep req */ | LIBUSB_ENDPOINT_OUT;
648
649     slu->sg_transfer_idx = 0;
650     // TODO - never used at the moment, always CMD_SIZE
651     slu->cmd_len = (slu->protocoll == 1)? STLINK_SG_SIZE: STLINK_CMD_SIZE;
652
653     /* success */
654
655     if (stlink_current_mode(sl) == STLINK_DEV_DFU_MODE) {
656       ILOG("-- exit_dfu_mode\n");
657       stlink_exit_dfu_mode(sl);
658     }
659
660     if (stlink_current_mode(sl) != STLINK_DEV_DEBUG_MODE) {
661       stlink_enter_swd_mode(sl);
662     }
663
664     stlink_version(sl);
665     stlink_load_device_params(sl);
666
667     error = 0;
668
669 on_libusb_error:
670     if (devs != NULL) {
671         libusb_free_device_list(devs, 1);
672     }
673
674     if (error == -1) {
675         stlink_close(sl);
676         return NULL;
677     }
678
679     /* success */
680     return sl;
681
682 on_error:
683     if( slu->libusb_ctx)
684         libusb_exit(slu->libusb_ctx);
685     if (sl != NULL) free(sl);
686     if (slu != NULL) free(slu);
687     return 0;
688 }
689