7 #include <libusb-1.0/libusb.h>
8 #include "stlink-common.h"
9 #include "stlink-usb.h"
11 void _stlink_usb_close(stlink_t* sl) {
12 struct stlink_libusb * const handle = sl->backend_data;
13 // maybe we couldn't even get the usb device?
15 if (handle->req_trans != NULL)
16 libusb_free_transfer(handle->req_trans);
18 if (handle->rep_trans != NULL)
19 libusb_free_transfer(handle->rep_trans);
21 if (handle->usb_handle != NULL)
22 libusb_close(handle->usb_handle);
24 libusb_exit(handle->libusb_ctx);
29 static void write_uint32(unsigned char* buf, uint32_t ui) {
30 if (!is_bigendian()) { // le -> le (don't swap)
31 buf[0] = ((unsigned char*) &ui)[0];
32 buf[1] = ((unsigned char*) &ui)[1];
33 buf[2] = ((unsigned char*) &ui)[2];
34 buf[3] = ((unsigned char*) &ui)[3];
36 buf[0] = ((unsigned char*) &ui)[3];
37 buf[1] = ((unsigned char*) &ui)[2];
38 buf[2] = ((unsigned char*) &ui)[1];
39 buf[3] = ((unsigned char*) &ui)[0];
43 static void write_uint16(unsigned char* buf, uint16_t ui) {
44 if (!is_bigendian()) { // le -> le (don't swap)
45 buf[0] = ((unsigned char*) &ui)[0];
46 buf[1] = ((unsigned char*) &ui)[1];
48 buf[0] = ((unsigned char*) &ui)[1];
49 buf[1] = ((unsigned char*) &ui)[0];
53 static uint32_t read_uint32(const unsigned char *c, const int pt) {
55 char *p = (char *) &ui;
57 if (!is_bigendian()) { // le -> le (don't swap)
73 #define TRANS_FLAGS_IS_DONE (1 << 0)
74 #define TRANS_FLAGS_HAS_ERROR (1 << 1)
75 volatile unsigned long flags;
78 static void on_trans_done(struct libusb_transfer * trans) {
79 struct trans_ctx * const ctx = trans->user_data;
81 if (trans->status != LIBUSB_TRANSFER_COMPLETED)
82 ctx->flags |= TRANS_FLAGS_HAS_ERROR;
84 ctx->flags |= TRANS_FLAGS_IS_DONE;
87 int submit_wait(struct stlink_libusb *slu, struct libusb_transfer * trans) {
91 struct trans_ctx trans_ctx;
92 enum libusb_error error;
96 /* brief intrusion inside the libusb interface */
97 trans->callback = on_trans_done;
98 trans->user_data = &trans_ctx;
100 if ((error = libusb_submit_transfer(trans))) {
101 printf("libusb_submit_transfer(%d)\n", error);
105 gettimeofday(&start, NULL);
107 while (trans_ctx.flags == 0) {
108 struct timeval timeout;
111 if (libusb_handle_events_timeout(slu->libusb_ctx, &timeout)) {
112 printf("libusb_handle_events()\n");
116 gettimeofday(&now, NULL);
117 timersub(&now, &start, &diff);
118 if (diff.tv_sec >= 3) {
119 printf("libusb_handle_events() timeout\n");
124 if (trans_ctx.flags & TRANS_FLAGS_HAS_ERROR) {
125 printf("libusb_handle_events() | has_error\n");
132 ssize_t send_recv(struct stlink_libusb* handle,
133 unsigned char* txbuf, size_t txsize,
134 unsigned char* rxbuf, size_t rxsize) {
135 /* note: txbuf and rxbuf can point to the same area */
137 libusb_fill_bulk_transfer(handle->req_trans, handle->usb_handle,
144 printf("submit_wait(req)\n");
146 if (submit_wait(handle, handle->req_trans)) return -1;
149 if (rxsize == 0) return 0;
151 /* read the response */
153 libusb_fill_bulk_transfer(handle->rep_trans, handle->usb_handle,
154 handle->ep_rep, rxbuf, rxsize, NULL, NULL, 0);
156 printf("submit_wait(rep)\n");
158 if (submit_wait(handle, handle->rep_trans)) return -1;
160 return handle->rep_trans->actual_length;
163 static inline int send_only
164 (struct stlink_libusb* handle, unsigned char* txbuf, size_t txsize) {
165 return send_recv(handle, txbuf, txsize, NULL, 0);
169 // KARL - fixme, common code! (or, one per backend)
170 // candidate for common code...
173 static int is_stlink_device(libusb_device * dev) {
174 struct libusb_device_descriptor desc;
176 if (libusb_get_device_descriptor(dev, &desc))
179 printf("device: 0x%04x, 0x%04x\n", desc.idVendor, desc.idProduct);
181 if (desc.idVendor != 0x0483)
184 if (desc.idProduct != 0x3748)
190 void _stlink_usb_version(stlink_t * sl) {
191 struct stlink_libusb * const slu = sl->backend_data;
192 unsigned char* const buf = sl->q_buf;
195 memset(buf, 0, sizeof (sl->q_buf));
196 buf[0] = STLINK_GET_VERSION;
199 size = send_recv(slu, buf, 16, buf, sizeof (sl->q_buf));
201 printf("[!] send_recv\n");
208 for (i = 0; i < size; ++i) printf("%02x", buf[i]);
214 void _stlink_usb_write_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
215 DD(sl, "oops! no write32 support yet, wanted to write %d bytes to %#x\n",
219 void _stlink_usb_write_mem8(stlink_t *sl, uint32_t addr, uint16_t len) {
220 DD(sl, "oops! no write8 support yet, wanted to write %d bytes to %#x\n",
225 int stlink_current_mode(stlink_t * sl) {
228 struct stlink_libusb * const slu = sl->backend_data;
229 unsigned char* const buf = sl->q_buf;
232 memset(buf, 0, sizeof (sl->q_buf));
234 buf[0] = STLINK_GET_CURRENT_MODE;
236 size = send_recv(slu, buf, 16, buf, sizeof (sl->q_buf));
238 printf("[!] send_recv\n");
242 /* mode = (int)read_uint16(buf, 0); */
246 printf("mode == 0x%x\n", mode);
253 void _stlink_usb_core_id(stlink_t * sl) {
254 struct stlink_libusb * const slu = sl->backend_data;
255 unsigned char* const buf = sl->q_buf;
258 memset(buf, 0, sizeof (sl->q_buf));
259 buf[0] = STLINK_DEBUG_COMMAND;
260 buf[1] = STLINK_DEBUG_READCOREID;
262 size = send_recv(slu, buf, 16, buf, sizeof (sl->q_buf));
264 printf("[!] send_recv\n");
268 sl->core_id = read_uint32(buf, 0);
271 void _stlink_usb_status(stlink_t * sl) {
272 struct stlink_libusb * const slu = sl->backend_data;
273 unsigned char* const buf = sl->q_buf;
276 memset(buf, 0, sizeof (sl->q_buf));
278 buf[0] = STLINK_DEBUG_COMMAND;
279 buf[1] = STLINK_DEBUG_GETSTATUS;
281 size = send_recv(slu, buf, 16, buf, sizeof (sl->q_buf));
283 printf("[!] send_recv\n");
287 /* todo: stlink_core_stat */
289 // FIXME - decode into sl->core_stat
291 printf("status == 0x%x\n", buf[0]);
296 void _stlink_enter_swd_mode(stlink_t * sl) {
297 struct stlink_libusb * const slu = sl->backend_data;
298 unsigned char* const buf = sl->q_buf;
301 memset(buf, 0, sizeof (sl->q_buf));
303 buf[0] = STLINK_DEBUG_COMMAND;
304 buf[1] = 0x30; /* needed byte */
305 buf[2] = STLINK_DEBUG_ENTER_JTAG;
307 size = send_recv(slu, buf, 16, buf, sizeof (sl->q_buf));
309 printf("[!] send_recv\n");
315 void _stlink_usb_exit_dfu_mode(stlink_t* sl) {
316 struct stlink_libusb * const slu = sl->backend_data;
317 unsigned char* const buf = sl->q_buf;
320 memset(buf, 0, sizeof (sl->q_buf));
321 buf[0] = STLINK_DFU_COMMAND;
322 buf[1] = STLINK_DFU_EXIT;
324 size = send_only(slu, buf, 16);
326 printf("[!] send_recv\n");
331 void _stlink_usb_reset(stlink_t * sl) {
332 struct stlink_libusb * const slu = sl->backend_data;
333 unsigned char* const buf = sl->q_buf;
336 memset(buf, 0, sizeof (sl->q_buf));
337 buf[0] = STLINK_DEBUG_COMMAND;
338 buf[1] = STLINK_DEBUG_RESETSYS;
340 size = send_recv(slu, buf, 16, buf, sizeof (sl->q_buf));
342 printf("[!] send_recv\n");
348 void stlink_step(stlink_t* sl) {
349 struct stlink_libusb * const slu = sl->backend_data;
350 unsigned char* const buf = sl->q_buf;
353 memset(buf, 0, sizeof (sl->q_buf));
354 buf[0] = STLINK_DEBUG_COMMAND;
355 buf[1] = STLINK_DEBUG_STEPCORE;
357 size = send_recv(slu, buf, 16, buf, sizeof (sl->q_buf));
359 printf("[!] send_recv\n");
364 void _stlink_usb_run(stlink_t* sl) {
365 struct stlink_libusb * const slu = sl->backend_data;
366 unsigned char* const buf = sl->q_buf;
369 memset(buf, 0, sizeof (sl->q_buf));
370 buf[0] = STLINK_DEBUG_COMMAND;
371 buf[1] = STLINK_DEBUG_RUNCORE;
373 size = send_recv(slu, buf, 16, buf, sizeof (sl->q_buf));
375 printf("[!] send_recv\n");
381 void _stlink_usb_exit_debug_mode(stlink_t *sl) {
382 struct stlink_libusb * const slu = sl->backend_data;
383 unsigned char* const buf = sl->q_buf;
386 memset(buf, 0, sizeof (sl->q_buf));
387 buf[0] = STLINK_DEBUG_COMMAND;
388 buf[1] = STLINK_DEBUG_EXIT;
390 size = send_only(slu, buf, 16);
392 printf("[!] send_only\n");
397 void stlink_read_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
398 struct stlink_libusb * const slu = sl->backend_data;
399 unsigned char* const buf = sl->q_buf;
402 /* assume len < sizeof(sl->q_buf) */
404 memset(buf, 0, sizeof (sl->q_buf));
405 buf[0] = STLINK_DEBUG_COMMAND;
406 buf[1] = STLINK_DEBUG_READMEM_32BIT;
407 write_uint32(buf + 2, addr);
408 write_uint16(buf + 6, len);
410 /* windows usb logs show only one byte is used for length ... */
411 buf[6] = (uint8_t) len;
414 size = send_recv(slu, buf, 0x10, buf, sizeof (sl->q_buf));
416 printf("[!] send_recv\n");
420 sl->q_len = (size_t) size;
422 stlink_print_data(sl);
426 stlink_backend_t _stlink_usb_backend = {
428 _stlink_usb_exit_debug_mode,
429 _stlink_enter_swd_mode,
431 _stlink_usb_exit_dfu_mode,
437 _stlink_usb_write_mem32,
438 _stlink_usb_write_mem8
441 stlink_t* stlink_open_usb(const char *dev_name, const int verbose) {
443 struct stlink_libusb* slu = NULL;
445 sl = malloc(sizeof (stlink_t));
446 slu = malloc(sizeof (struct stlink_libusb));
447 if (sl == NULL) goto on_error;
448 if (slu == NULL) goto on_error;
450 sl->verbose = verbose;
452 if (slu->libusb_ctx != NULL) {
453 fprintf(stderr, "reopening with an existing context? undefined behaviour!\n");
456 if (libusb_init(&(slu->libusb_ctx))) {
457 fprintf(stderr, "failed to init libusb context, wrong version of libraries?\n");
464 libusb_device** devs = NULL;
470 count = libusb_get_device_list(slu->libusb_ctx, &devs);
472 printf("libusb_get_device_list\n");
473 goto on_libusb_error;
476 for (i = 0; i < count; ++i) {
478 if (is_stlink_device(dev)) break;
480 if (i == count) return NULL;
482 if (libusb_open(dev, &(slu->usb_handle))) {
483 printf("libusb_open()\n");
484 goto on_libusb_error;
487 if (libusb_get_configuration(slu->usb_handle, &config)) {
488 /* this may fail for a previous configured device */
489 printf("libusb_get_configuration()\n");
490 goto on_libusb_error;
494 printf("setting new configuration (%d -> 1)\n", config);
495 if (libusb_set_configuration(slu->usb_handle, 1)) {
496 /* this may fail for a previous configured device */
497 printf("libusb_set_configuration()\n");
498 goto on_libusb_error;
502 if (libusb_claim_interface(slu->usb_handle, 0)) {
503 printf("libusb_claim_interface()\n");
504 goto on_libusb_error;
507 slu->req_trans = libusb_alloc_transfer(0);
508 if (slu->req_trans == NULL) {
509 printf("libusb_alloc_transfer\n");
510 goto on_libusb_error;
513 slu->rep_trans = libusb_alloc_transfer(0);
514 if (slu->rep_trans == NULL) {
515 printf("libusb_alloc_transfer\n");
516 goto on_libusb_error;
519 slu->ep_rep = 1 /* ep rep */ | LIBUSB_ENDPOINT_IN;
520 slu->ep_req = 2 /* ep req */ | LIBUSB_ENDPOINT_OUT;
522 /* libusb_reset_device(slu->usb_handle); */
529 libusb_free_device_list(devs, 1);
530 fprintf(stderr, "freed libusb device list\n");
538 sl->backend = &_stlink_usb_backend;
539 sl->backend_data = slu;
544 if (sl != NULL) free(sl);
545 if (slu != NULL) free(slu);