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