7 #include <libusb-1.0/libusb.h>
10 /* endianess related */
11 static inline unsigned int is_bigendian(void)
13 static volatile const unsigned int i = 1;
14 return *(volatile const char*) &i == 0;
17 static void write_uint32(unsigned char* buf, uint32_t ui)
19 if (!is_bigendian()) { // le -> le (don't swap)
20 buf[0] = ((unsigned char*) &ui)[0];
21 buf[1] = ((unsigned char*) &ui)[1];
22 buf[2] = ((unsigned char*) &ui)[2];
23 buf[3] = ((unsigned char*) &ui)[3];
25 buf[0] = ((unsigned char*) &ui)[3];
26 buf[1] = ((unsigned char*) &ui)[2];
27 buf[2] = ((unsigned char*) &ui)[1];
28 buf[3] = ((unsigned char*) &ui)[0];
32 static void write_uint16(unsigned char* buf, uint16_t ui)
34 if (!is_bigendian()) { // le -> le (don't swap)
35 buf[0] = ((unsigned char*) &ui)[0];
36 buf[1] = ((unsigned char*) &ui)[1];
38 buf[0] = ((unsigned char*) &ui)[1];
39 buf[1] = ((unsigned char*) &ui)[0];
43 static uint32_t read_uint32(const unsigned char *c, const int pt)
46 char *p = (char *) &ui;
48 if (!is_bigendian()) { // le -> le (don't swap)
62 static uint16_t read_uint16(const unsigned char *c, const int pt)
65 char *p = (char *) &ui;
67 if (!is_bigendian()) { // le -> le (don't swap)
77 /* libusb transport layer */
79 libusb_context* libusb_ctx = NULL;
83 libusb_device_handle* usb_handle;
84 struct libusb_transfer* req_trans;
85 struct libusb_transfer* rep_trans;
92 #define TRANS_FLAGS_IS_DONE (1 << 0)
93 #define TRANS_FLAGS_HAS_ERROR (1 << 1)
94 volatile unsigned long flags;
97 static void on_trans_done(struct libusb_transfer* trans)
99 struct trans_ctx* const ctx = trans->user_data;
101 if (trans->status != LIBUSB_TRANSFER_COMPLETED)
102 ctx->flags |= TRANS_FLAGS_HAS_ERROR;
104 ctx->flags |= TRANS_FLAGS_IS_DONE;
108 static int submit_wait(struct libusb_transfer* trans)
110 struct timeval start;
113 struct trans_ctx trans_ctx;
114 enum libusb_error error;
118 /* brief intrusion inside the libusb interface */
119 trans->callback = on_trans_done;
120 trans->user_data = &trans_ctx;
122 if ((error = libusb_submit_transfer(trans)))
124 printf("libusb_submit_transfer(%d)\n", error);
128 gettimeofday(&start, NULL);
130 while (trans_ctx.flags == 0)
132 struct timeval timeout;
135 if (libusb_handle_events_timeout(libusb_ctx, &timeout))
137 printf("libusb_handle_events()\n");
141 gettimeofday(&now, NULL);
142 timersub(&now, &start, &diff);
143 if (diff.tv_sec >= 3)
145 printf("libusb_handle_events() timeout\n");
150 if (trans_ctx.flags & TRANS_FLAGS_HAS_ERROR)
152 printf("libusb_handle_events() | has_error\n");
159 static ssize_t send_recv
161 struct stlink_libusb* handle,
162 unsigned char* txbuf, size_t txsize,
163 unsigned char* rxbuf, size_t rxsize
166 /* note: txbuf and rxbuf can point to the same area */
168 libusb_fill_bulk_transfer
178 printf("submit_wait(req)\n");
180 if (submit_wait(handle->req_trans)) return -1;
183 if (rxsize == 0) return 0;
185 /* read the response */
187 libusb_fill_bulk_transfer
197 printf("submit_wait(rep)\n");
199 if (submit_wait(handle->rep_trans)) return -1;
201 return handle->rep_trans->actual_length;
205 static inline int send_only
206 (struct stlink_libusb* handle, unsigned char* txbuf, size_t txsize)
208 return send_recv(handle, txbuf, txsize, NULL, 0);
212 /* stlink layer independant interface */
216 TRANSPORT_TYPE_ZERO = 0,
218 TRANSPORT_TYPE_LIBSG,
219 #endif /* CONFIG_USE_LIBSG */
220 #if CONFIG_USE_LIBUSB
221 TRANSPORT_TYPE_LIBUSB,
222 #endif /* CONFIG_USE_LIBUSB */
223 TRANSPORT_TYPE_INVALID
228 enum transport_type tt;
231 #if CONFIG_USE_LIBUSB
232 struct stlink_libusb libusb;
233 #endif /* CONFIG_USE_LIBUSB */
236 #endif /* CONFIG_USE_LIBSG */
239 unsigned char q_buf[64];
241 /* layer independant */
245 int stlink_initialize(enum transport_type tt)
249 #if CONFIG_USE_LIBUSB
250 case TRANSPORT_TYPE_LIBUSB:
252 if (libusb_ctx != NULL) return -1;
253 if (libusb_init(&libusb_ctx))
255 printf("libusb_init()\n");
260 #endif /* CONFIG_USE_LIBUSB */
268 void stlink_finalize(enum transport_type tt)
272 #if CONFIG_USE_LIBUSB
273 case TRANSPORT_TYPE_LIBUSB:
275 libusb_exit(libusb_ctx);
278 #endif /* CONFIG_USE_LIBUSB */
284 #if CONFIG_USE_LIBUSB
285 static int is_stlink_device(libusb_device* dev)
287 struct libusb_device_descriptor desc;
289 if (libusb_get_device_descriptor(dev, &desc))
292 printf("device: 0x%04x, 0x%04x\n", desc.idVendor, desc.idProduct);
294 if (desc.idVendor != 0x0483)
297 if (desc.idProduct != 0x3748)
302 #endif /* CONFIG_USE_LIBUSB */
305 void stlink_close(struct stlink*);
307 struct stlink* stlink_quirk_open
308 (enum transport_type tt, const char *dev_name, const int verbose)
310 struct stlink* sl = NULL;
312 sl = malloc(sizeof(struct stlink));
313 if (sl == NULL) goto on_error;
319 #if CONFIG_USE_LIBUSB
320 case TRANSPORT_TYPE_LIBUSB:
322 struct stlink_libusb* const slu = &sl->transport.libusb;
326 libusb_device** devs = NULL;
332 count = libusb_get_device_list(libusb_ctx, &devs);
335 printf("libusb_get_device_list\n");
336 goto on_libusb_error;
339 for (i = 0; i < count; ++i)
342 if (is_stlink_device(dev)) break;
344 if (i == count) return NULL;
346 if (libusb_open(dev, &slu->usb_handle))
348 printf("libusb_open()\n");
349 goto on_libusb_error;
352 if (libusb_get_configuration(slu->usb_handle, &config))
354 /* this may fail for a previous configured device */
355 printf("libusb_get_configuration()\n");
356 goto on_libusb_error;
361 printf("setting new configuration (%d -> 1)\n", config);
362 if (libusb_set_configuration(slu->usb_handle, 1))
364 /* this may fail for a previous configured device */
365 printf("libusb_set_configuration()\n");
366 goto on_libusb_error;
370 if (libusb_claim_interface(slu->usb_handle, 0))
372 printf("libusb_claim_interface()\n");
373 goto on_libusb_error;
376 slu->req_trans = libusb_alloc_transfer(0);
377 if (slu->req_trans == NULL)
379 printf("libusb_alloc_transfer\n");
380 goto on_libusb_error;
383 slu->rep_trans = libusb_alloc_transfer(0);
384 if (slu->rep_trans == NULL)
386 printf("libusb_alloc_transfer\n");
387 goto on_libusb_error;
390 slu->ep_rep = 1 /* ep rep */ | LIBUSB_ENDPOINT_IN;
391 slu->ep_req = 2 /* ep req */ | LIBUSB_ENDPOINT_OUT;
393 /* libusb_reset_device(slu->usb_handle); */
399 if (devs != NULL) libusb_free_device_list(devs, 1);
409 #endif /* CONFIG_USE_LIBUSB */
412 case transport_type_libsg:
416 #endif /* CONFIG_USE_LIBSG */
425 if (sl != NULL) free(sl);
429 void stlink_close(struct stlink *sl)
433 #if CONFIG_USE_LIBUSB
434 case TRANSPORT_TYPE_LIBUSB:
436 struct stlink_libusb* const handle = &sl->transport.libusb;
438 if (handle->req_trans != NULL)
439 libusb_free_transfer(handle->req_trans);
441 if (handle->rep_trans != NULL)
442 libusb_free_transfer(handle->rep_trans);
444 if (handle->usb_handle != NULL)
445 libusb_close(handle->usb_handle);
449 #endif /* CONFIG_USE_LIBUSB */
452 case TRANSPORT_TYPE_LIBSG:
456 #endif /* CONFIG_USE_LIBSG */
464 void stlink_version(struct stlink* sl)
468 #if CONFIG_USE_LIBUSB
469 case TRANSPORT_TYPE_LIBUSB:
471 struct stlink_libusb* const slu = &sl->transport.libusb;
472 unsigned char* const buf = sl->q_buf;
475 memset(buf, 0, sizeof(sl->q_buf));
476 buf[0] = STLINK_GET_VERSION;
479 size = send_recv(slu, buf, 16, buf, sizeof(sl->q_buf));
482 printf("[!] send_recv\n");
489 for (i = 0; i < size; ++i) printf("%02x", buf[i]);
496 #endif /* CONFIG_USE_LIBUSB */
502 int stlink_current_mode(struct stlink *sl)
508 #if CONFIG_USE_LIBUSB
509 case TRANSPORT_TYPE_LIBUSB:
511 struct stlink_libusb* const slu = &sl->transport.libusb;
512 unsigned char* const buf = sl->q_buf;
515 memset(buf, 0, sizeof(sl->q_buf));
517 buf[0] = STLINK_GET_CURRENT_MODE;
519 size = send_recv(slu, buf, 16, buf, sizeof(sl->q_buf));
522 printf("[!] send_recv\n");
526 /* mode = (int)read_uint16(buf, 0); */
530 printf("mode == 0x%x\n", mode);
535 #endif /* CONFIG_USE_LIBUSB */
543 void stlink_core_id(struct stlink *sl)
547 #if CONFIG_USE_LIBUSB
548 case TRANSPORT_TYPE_LIBUSB:
550 struct stlink_libusb* const slu = &sl->transport.libusb;
551 unsigned char* const buf = sl->q_buf;
554 memset(buf, 0, sizeof(sl->q_buf));
555 buf[0] = STLINK_DEBUG_COMMAND;
556 buf[1] = STLINK_DEBUG_READCOREID;
558 size = send_recv(slu, buf, 16, buf, sizeof(sl->q_buf));
561 printf("[!] send_recv\n");
565 sl->core_id = read_uint32(buf, 0);
568 printf("core_id == 0x%x\n", sl->core_id);
573 #endif /* CONFIG_USE_LIBUSB */
579 void stlink_status(struct stlink *sl)
583 #if CONFIG_USE_LIBUSB
584 case TRANSPORT_TYPE_LIBUSB:
586 struct stlink_libusb* const slu = &sl->transport.libusb;
587 unsigned char* const buf = sl->q_buf;
590 memset(buf, 0, sizeof(sl->q_buf));
592 buf[0] = STLINK_DEBUG_COMMAND;
593 buf[1] = STLINK_DEBUG_GETSTATUS;
595 size = send_recv(slu, buf, 16, buf, sizeof(sl->q_buf));
598 printf("[!] send_recv\n");
602 /* todo: stlink_core_stat */
605 printf("status == 0x%x\n", buf[0]);
610 #endif /* CONFIG_USE_LIBUSB */
616 void stlink_enter_swd_mode(struct stlink *sl)
620 #if CONFIG_USE_LIBUSB
621 case TRANSPORT_TYPE_LIBUSB:
623 struct stlink_libusb* const slu = &sl->transport.libusb;
624 unsigned char* const buf = sl->q_buf;
627 memset(buf, 0, sizeof(sl->q_buf));
629 buf[0] = STLINK_DEBUG_COMMAND;
630 buf[1] = 0x30; /* magic byte */
631 buf[2] = STLINK_DEBUG_ENTER_JTAG;
633 size = send_recv(slu, buf, 16, buf, sizeof(sl->q_buf));
636 printf("[!] send_recv\n");
642 #endif /* CONFIG_USE_LIBUSB */
648 void stlink_exit_dfu_mode(struct stlink *sl)
652 #if CONFIG_USE_LIBUSB
653 case TRANSPORT_TYPE_LIBUSB:
655 struct stlink_libusb* const slu = &sl->transport.libusb;
656 unsigned char* const buf = sl->q_buf;
659 memset(buf, 0, sizeof(sl->q_buf));
660 buf[0] = STLINK_DFU_COMMAND;
661 buf[1] = STLINK_DFU_EXIT;
663 size = send_only(slu, buf, 16);
666 printf("[!] send_recv\n");
672 #endif /* CONFIG_USE_LIBUSB */
678 void stlink_reset(struct stlink *sl)
682 #if CONFIG_USE_LIBUSB
683 case TRANSPORT_TYPE_LIBUSB:
685 struct stlink_libusb* const slu = &sl->transport.libusb;
686 unsigned char* const buf = sl->q_buf;
689 memset(buf, 0, sizeof(sl->q_buf));
690 buf[0] = STLINK_DEBUG_COMMAND;
691 buf[1] = STLINK_DEBUG_RESETSYS;
693 size = send_recv(slu, buf, 16, buf, sizeof(sl->q_buf));
696 printf("[!] send_recv\n");
702 #endif /* CONFIG_USE_LIBUSB */
708 void stlink_step(struct stlink *sl)
712 #if CONFIG_USE_LIBUSB
713 case TRANSPORT_TYPE_LIBUSB:
715 struct stlink_libusb* const slu = &sl->transport.libusb;
716 unsigned char* const buf = sl->q_buf;
719 memset(buf, 0, sizeof(sl->q_buf));
720 buf[0] = STLINK_DEBUG_COMMAND;
721 buf[1] = STLINK_DEBUG_STEPCORE;
723 size = send_recv(slu, buf, 16, buf, sizeof(sl->q_buf));
726 printf("[!] send_recv\n");
732 #endif /* CONFIG_USE_LIBUSB */
738 void stlink_run(struct stlink *sl)
742 #if CONFIG_USE_LIBUSB
743 case TRANSPORT_TYPE_LIBUSB:
745 struct stlink_libusb* const slu = &sl->transport.libusb;
746 unsigned char* const buf = sl->q_buf;
749 memset(buf, 0, sizeof(sl->q_buf));
750 buf[0] = STLINK_DEBUG_COMMAND;
751 buf[1] = STLINK_DEBUG_RUNCORE;
753 size = send_recv(slu, buf, 16, buf, sizeof(sl->q_buf));
756 printf("[!] send_recv\n");
762 #endif /* CONFIG_USE_LIBUSB */
768 void stlink_exit_debug_mode(struct stlink *sl)
772 #if CONFIG_USE_LIBUSB
773 case TRANSPORT_TYPE_LIBUSB:
775 struct stlink_libusb* const slu = &sl->transport.libusb;
776 unsigned char* const buf = sl->q_buf;
779 memset(buf, 0, sizeof(sl->q_buf));
780 buf[0] = STLINK_DEBUG_COMMAND;
781 buf[1] = STLINK_DEBUG_EXIT;
783 size = send_only(slu, buf, 16);
786 printf("[!] send_only\n");
792 #endif /* CONFIG_USE_LIBUSB */
801 int main(int ac, char** av)
805 stlink_initialize(TRANSPORT_TYPE_LIBUSB);
806 sl = stlink_quirk_open(TRANSPORT_TYPE_LIBUSB, NULL, 0);
809 printf("-- version\n");
812 if (stlink_current_mode(sl) == STLINK_DEV_DFU_MODE)
814 printf("-- exit_dfu_mode\n");
815 stlink_exit_dfu_mode(sl);
818 printf("-- enter_swd_mode\n");
819 stlink_enter_swd_mode(sl);
821 printf("-- current_mode\n");
822 stlink_current_mode(sl);
824 printf("-- core_id\n");
827 printf("-- status\n");
830 printf("-- reset\n");
833 printf("-- status\n");
843 printf("-- exit_debug_mode\n");
844 stlink_exit_debug_mode(sl);
848 stlink_finalize(TRANSPORT_TYPE_LIBUSB);