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