8 #include <libusb-1.0/libusb.h>
9 #include "stlink-common.h"
10 #include "stlink-usb.h"
12 void _stlink_usb_close(stlink_t* sl) {
13 struct stlink_libusb * const handle = sl->backend_data;
14 // maybe we couldn't even get the usb device?
16 if (handle->req_trans != NULL)
17 libusb_free_transfer(handle->req_trans);
19 if (handle->rep_trans != NULL)
20 libusb_free_transfer(handle->rep_trans);
22 if (handle->usb_handle != NULL)
23 libusb_close(handle->usb_handle);
25 libusb_exit(handle->libusb_ctx);
32 #define TRANS_FLAGS_IS_DONE (1 << 0)
33 #define TRANS_FLAGS_HAS_ERROR (1 << 1)
34 volatile unsigned long flags;
37 static void on_trans_done(struct libusb_transfer * trans) {
38 struct trans_ctx * const ctx = trans->user_data;
40 if (trans->status != LIBUSB_TRANSFER_COMPLETED)
41 ctx->flags |= TRANS_FLAGS_HAS_ERROR;
43 ctx->flags |= TRANS_FLAGS_IS_DONE;
46 int submit_wait(struct stlink_libusb *slu, struct libusb_transfer * trans) {
50 struct trans_ctx trans_ctx;
51 enum libusb_error error;
55 /* brief intrusion inside the libusb interface */
56 trans->callback = on_trans_done;
57 trans->user_data = &trans_ctx;
59 if ((error = libusb_submit_transfer(trans))) {
60 printf("libusb_submit_transfer(%d)\n", error);
64 gettimeofday(&start, NULL);
66 while (trans_ctx.flags == 0) {
67 struct timeval timeout;
70 if (libusb_handle_events_timeout(slu->libusb_ctx, &timeout)) {
71 printf("libusb_handle_events()\n");
75 gettimeofday(&now, NULL);
76 timersub(&now, &start, &diff);
77 if (diff.tv_sec >= 3) {
78 printf("libusb_handle_events() timeout\n");
83 if (trans_ctx.flags & TRANS_FLAGS_HAS_ERROR) {
84 printf("libusb_handle_events() | has_error\n");
91 ssize_t send_recv(struct stlink_libusb* handle,
92 unsigned char* txbuf, size_t txsize,
93 unsigned char* rxbuf, size_t rxsize) {
94 /* note: txbuf and rxbuf can point to the same area */
96 libusb_fill_bulk_transfer(handle->req_trans, handle->usb_handle,
103 printf("submit_wait(req)\n");
105 if (submit_wait(handle, handle->req_trans)) return -1;
108 if (rxsize == 0) return 0;
110 /* read the response */
112 libusb_fill_bulk_transfer(handle->rep_trans, handle->usb_handle,
113 handle->ep_rep, rxbuf, rxsize, NULL, NULL, 0);
115 printf("submit_wait(rep)\n");
117 if (submit_wait(handle, handle->rep_trans)) return -1;
119 return handle->rep_trans->actual_length;
122 static inline int send_only
123 (struct stlink_libusb* handle, unsigned char* txbuf, size_t txsize) {
124 return send_recv(handle, txbuf, txsize, NULL, 0);
128 // KARL - fixme, common code! (or, one per backend)
129 // candidate for common code...
132 static int is_stlink_device(libusb_device * dev) {
133 struct libusb_device_descriptor desc;
135 if (libusb_get_device_descriptor(dev, &desc))
138 printf("device: 0x%04x, 0x%04x\n", desc.idVendor, desc.idProduct);
140 if (desc.idVendor != USB_ST_VID)
143 if (desc.idProduct != USB_STLINK_32L_PID)
149 void _stlink_usb_version(stlink_t *sl) {
150 struct stlink_libusb * const slu = sl->backend_data;
151 unsigned char* const buf = sl->q_buf;
154 memset(buf, 0, sizeof (sl->q_buf));
155 buf[0] = STLINK_GET_VERSION;
158 size = send_recv(slu, buf, STLINK_CMD_SIZE, buf, sizeof (sl->q_buf));
160 printf("[!] send_recv\n");
167 for (i = 0; i < size; ++i) printf("%02x", buf[i]);
173 void _stlink_usb_write_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
174 struct stlink_libusb * const slu = sl->backend_data;
175 unsigned char* const buf = sl->q_buf;
176 unsigned char *cmd_buf = sl->c_buf;
178 memset(cmd_buf, 0, STLINK_CMD_SIZE);
179 cmd_buf[0] = STLINK_DEBUG_COMMAND;
180 cmd_buf[1] = STLINK_DEBUG_WRITEMEM_32BIT;
181 write_uint32(cmd_buf + 2, addr);
182 write_uint16(cmd_buf + 6, len);
183 send_only(slu, cmd_buf, STLINK_CMD_SIZE);
185 assert((len & 3) == 0);
186 stlink_print_data(sl);
187 send_only(slu, buf, len);
191 void _stlink_usb_write_mem8(stlink_t *sl, uint32_t addr, uint16_t len) {
192 struct stlink_libusb * const slu = sl->backend_data;
193 unsigned char* const buf = sl->q_buf;
194 unsigned char *cmd_buf = sl->c_buf;
196 memset(cmd_buf, 0, STLINK_CMD_SIZE);
197 cmd_buf[0] = STLINK_DEBUG_COMMAND;
198 cmd_buf[1] = STLINK_DEBUG_WRITEMEM_8BIT;
199 write_uint32(cmd_buf + 2, addr);
200 write_uint16(cmd_buf + 6, len);
201 send_only(slu, cmd_buf, STLINK_CMD_SIZE);
203 stlink_print_data(sl);
204 send_only(slu, buf, len);
208 int _stlink_usb_current_mode(stlink_t * sl) {
209 struct stlink_libusb * const slu = sl->backend_data;
210 unsigned char* const buf = sl->q_buf;
212 memset(buf, 0, sizeof (sl->q_buf));
213 buf[0] = STLINK_GET_CURRENT_MODE;
214 size = send_recv(slu, buf, STLINK_CMD_SIZE, buf, sizeof (sl->q_buf));
216 printf("[!] send_recv\n");
222 void _stlink_usb_core_id(stlink_t * sl) {
223 struct stlink_libusb * const slu = sl->backend_data;
224 unsigned char* const buf = sl->q_buf;
227 memset(buf, 0, sizeof (sl->q_buf));
228 buf[0] = STLINK_DEBUG_COMMAND;
229 buf[1] = STLINK_DEBUG_READCOREID;
231 size = send_recv(slu, buf, STLINK_CMD_SIZE, buf, sizeof (sl->q_buf));
233 printf("[!] send_recv\n");
237 sl->core_id = read_uint32(buf, 0);
240 void _stlink_usb_status(stlink_t * sl) {
241 struct stlink_libusb * const slu = sl->backend_data;
242 unsigned char* const buf = sl->q_buf;
245 memset(buf, 0, sizeof (sl->q_buf));
247 buf[0] = STLINK_DEBUG_COMMAND;
248 buf[1] = STLINK_DEBUG_GETSTATUS;
250 size = send_recv(slu, buf, STLINK_CMD_SIZE, buf, sizeof (sl->q_buf));
252 printf("[!] send_recv\n");
256 /* todo: stlink_core_stat */
258 // FIXME - decode into sl->core_stat
260 printf("status == 0x%x\n", buf[0]);
265 void _stlink_usb_force_debug(stlink_t *sl) {
266 struct stlink_libusb *slu = sl->backend_data;
267 unsigned char* const buf = sl->q_buf;
270 memset(buf, 0, sizeof (sl->q_buf));
272 buf[0] = STLINK_DEBUG_COMMAND;
273 buf[1] = STLINK_DEBUG_FORCEDEBUG;
274 size = send_recv(slu, buf, STLINK_CMD_SIZE, buf, sizeof (sl->q_buf));
276 printf("[!] send_recv\n");
282 void _stlink_usb_enter_swd_mode(stlink_t * sl) {
283 struct stlink_libusb * const slu = sl->backend_data;
284 unsigned char* const buf = sl->q_buf;
287 memset(buf, 0, sizeof (sl->q_buf));
289 buf[0] = STLINK_DEBUG_COMMAND;
290 buf[1] = STLINK_SWD_ENTER;
291 buf[2] = STLINK_DEBUG_ENTER_SWD;
293 size = send_recv(slu, buf, STLINK_CMD_SIZE, buf, sizeof (sl->q_buf));
295 printf("[!] send_recv\n");
300 void _stlink_usb_exit_dfu_mode(stlink_t* sl) {
301 struct stlink_libusb * const slu = sl->backend_data;
302 unsigned char* const buf = sl->q_buf;
305 memset(buf, 0, sizeof (sl->q_buf));
306 buf[0] = STLINK_DFU_COMMAND;
307 buf[1] = STLINK_DFU_EXIT;
309 size = send_only(slu, buf, 16);
311 printf("[!] send_recv\n");
317 * TODO - not convinced this does anything...
320 void _stlink_usb_reset(stlink_t * sl) {
321 struct stlink_libusb * const slu = sl->backend_data;
322 unsigned char* const buf = sl->q_buf;
325 memset(buf, 0, sizeof (sl->q_buf));
326 buf[0] = STLINK_DEBUG_COMMAND;
327 buf[1] = STLINK_DEBUG_RESETSYS;
329 size = send_recv(slu, buf, STLINK_CMD_SIZE, buf, sizeof (sl->q_buf));
331 printf("[!] send_recv\n");
337 void _stlink_usb_step(stlink_t* sl) {
338 struct stlink_libusb * const slu = sl->backend_data;
339 unsigned char* const buf = sl->q_buf;
342 memset(buf, 0, sizeof (sl->q_buf));
343 buf[0] = STLINK_DEBUG_COMMAND;
344 buf[1] = STLINK_DEBUG_STEPCORE;
346 size = send_recv(slu, buf, STLINK_CMD_SIZE, buf, sizeof (sl->q_buf));
348 printf("[!] send_recv\n");
354 * This seems to do a good job of restarting things from the beginning?
357 void _stlink_usb_run(stlink_t* sl) {
358 struct stlink_libusb * const slu = sl->backend_data;
359 unsigned char* const buf = sl->q_buf;
362 memset(buf, 0, sizeof (sl->q_buf));
363 buf[0] = STLINK_DEBUG_COMMAND;
364 buf[1] = STLINK_DEBUG_RUNCORE;
366 size = send_recv(slu, buf, STLINK_CMD_SIZE, buf, sizeof (sl->q_buf));
368 printf("[!] send_recv\n");
374 void _stlink_usb_exit_debug_mode(stlink_t *sl) {
375 struct stlink_libusb * const slu = sl->backend_data;
376 unsigned char* const buf = sl->q_buf;
379 memset(buf, 0, sizeof (sl->q_buf));
380 buf[0] = STLINK_DEBUG_COMMAND;
381 buf[1] = STLINK_DEBUG_EXIT;
383 size = send_only(slu, buf, 16);
385 printf("[!] send_only\n");
390 void _stlink_usb_read_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
391 struct stlink_libusb * const slu = sl->backend_data;
392 unsigned char* const buf = sl->q_buf;
395 /* assume len < sizeof(sl->q_buf) */
397 memset(buf, 0, sizeof (sl->q_buf));
398 buf[0] = STLINK_DEBUG_COMMAND;
399 buf[1] = STLINK_DEBUG_READMEM_32BIT;
400 write_uint32(buf + 2, addr);
401 /* windows usb logs show only one byte is used for length ... */
402 // Presumably, this is because usb transfers can't be 16 bits worth of bytes long...
404 buf[6] = (uint8_t) len;
406 size = send_recv(slu, buf, STLINK_CMD_SIZE, buf, sizeof (sl->q_buf));
408 printf("[!] send_recv\n");
412 sl->q_len = (size_t) size;
414 stlink_print_data(sl);
420 void _stlink_usb_read_all_regs(stlink_t *sl, reg *regp) {
421 struct stlink_libusb * const slu = sl->backend_data;
422 unsigned char* const buf = sl->q_buf;
423 unsigned char* const cmd_buf = sl->c_buf;
427 memset(cmd_buf, 0, STLINK_CMD_SIZE);
428 cmd_buf[0] = STLINK_DEBUG_COMMAND;
429 cmd_buf[1] = STLINK_DEBUG_READALLREGS;
430 size = send_recv(slu, cmd_buf, STLINK_CMD_SIZE, buf, 84);
432 printf("[!] send_recv\n");
435 sl->q_len = (size_t) size;
436 stlink_print_data(sl);
438 regp->r[i]= read_uint32(sl->q_buf, i*4);
439 regp->xpsr = read_uint32(sl->q_buf, 64);
440 regp->main_sp = read_uint32(sl->q_buf, 68);
441 regp->process_sp = read_uint32(sl->q_buf, 72);
442 regp->rw = read_uint32(sl->q_buf, 76);
443 regp->rw2 = read_uint32(sl->q_buf, 80);
447 DD(sl, "xpsr = 0x%08x\n", read_uint32(sl->q_buf, 64));
448 DD(sl, "main_sp = 0x%08x\n", read_uint32(sl->q_buf, 68));
449 DD(sl, "process_sp = 0x%08x\n", read_uint32(sl->q_buf, 72));
450 DD(sl, "rw = 0x%08x\n", read_uint32(sl->q_buf, 76));
451 DD(sl, "rw2 = 0x%08x\n", read_uint32(sl->q_buf, 80));
456 static void _stlink_usb_read_all_regs(stlink_t *sl, reg *regp) {
457 struct stlink_libusb * const slu = sl->backend_data;
458 unsigned char* const buf = sl->q_buf;
459 unsigned char* const cmd_buf = sl->c_buf;
463 #define STLINK_JTAG_COMMAND 0xf2
464 #define STLINK_JTAG_READALLREGS2 0x3a
465 memset(cmd_buf, 0, STLINK_CMD_SIZE);
466 cmd_buf[0] = STLINK_JTAG_COMMAND;
467 cmd_buf[1] = STLINK_JTAG_READALLREGS2;
468 size = send_recv(slu, cmd_buf, STLINK_CMD_SIZE, buf, 84);
471 printf("[!] send_recv\n");
475 sl->q_len = (size_t) size;
478 regp->r[i]= read_uint32(sl->q_buf, i*4);
480 regp->xpsr = read_uint32(sl->q_buf, 64);
481 regp->main_sp = read_uint32(sl->q_buf, 68);
482 regp->process_sp = read_uint32(sl->q_buf, 72);
483 regp->rw = read_uint32(sl->q_buf, 76);
484 regp->rw2 = read_uint32(sl->q_buf, 80);
487 #endif /* stlinkv1 */
489 void _stlink_usb_read_reg(stlink_t *sl, int r_idx, reg *regp) {
490 struct stlink_libusb * const slu = sl->backend_data;
491 unsigned char* const buf = sl->q_buf;
492 unsigned char* const cmd_buf = sl->c_buf;
496 memset(cmd_buf, 0, STLINK_CMD_SIZE);
497 cmd_buf[0] = STLINK_DEBUG_COMMAND;
498 cmd_buf[1] = STLINK_DEBUG_READREG;
499 cmd_buf[2] = (uint8_t) r_idx;
500 size = send_recv(slu, cmd_buf, STLINK_CMD_SIZE, buf, 4);
502 printf("[!] send_recv\n");
505 sl->q_len = (size_t) size;
506 stlink_print_data(sl);
507 r = read_uint32(sl->q_buf, 0);
508 DD(sl, "r_idx (%2d) = 0x%08x\n", r_idx, r);
518 regp->process_sp = r;
521 regp->rw = r; //XXX ?(primask, basemask etc.)
524 regp->rw2 = r; //XXX ?(primask, basemask etc.)
534 void _stlink_usb_write_reg(stlink_t *sl, uint32_t reg, int idx) {
535 struct stlink_libusb * const slu = sl->backend_data;
536 unsigned char* const buf = sl->q_buf;
537 unsigned char *cmd_buf = sl->c_buf;
540 memset(cmd_buf, 0, STLINK_CMD_SIZE);
541 cmd_buf[0] = STLINK_DEBUG_COMMAND;
542 cmd_buf[1] = STLINK_DEBUG_WRITEREG;
544 write_uint32(cmd_buf + 3, reg);
545 size = send_recv(slu, cmd_buf, STLINK_CMD_SIZE, buf, 2);
547 printf("[!] send_recv\n");
550 sl->q_len = (size_t) size;
551 stlink_print_data(sl);
556 void _stlink_usb_write_reg(stlink_t *sl, uint32_t reg, int idx) {
557 struct stlink_libusb * const slu = sl->backend_data;
558 unsigned char* const buf = sl->q_buf;
559 unsigned char *cmd_buf = sl->c_buf;
562 #define STLINK_JTAG_WRITEREG2 0x34
563 memset(cmd_buf, 0, STLINK_CMD_SIZE);
564 cmd_buf[0] = STLINK_JTAG_COMMAND;
565 cmd_buf[1] = STLINK_JTAG_WRITEREG2;
567 write_uint32(cmd_buf + 3, reg);
568 size = send_recv(slu, cmd_buf, STLINK_CMD_SIZE, buf, 2);
570 printf("[!] send_recv\n");
573 sl->q_len = (size_t) size;
574 stlink_print_data(sl);
577 #endif /* stlinkv1 */
580 stlink_backend_t _stlink_usb_backend = {
582 _stlink_usb_exit_debug_mode,
583 _stlink_usb_enter_swd_mode,
584 NULL, // no enter_jtag_mode here...
585 _stlink_usb_exit_dfu_mode,
591 _stlink_usb_read_mem32,
592 _stlink_usb_write_mem32,
593 _stlink_usb_write_mem8,
594 _stlink_usb_read_all_regs,
595 _stlink_usb_read_reg,
596 _stlink_usb_write_reg,
598 _stlink_usb_current_mode,
599 _stlink_usb_force_debug
603 stlink_t* stlink_open_usb(const char *dev_name, const int verbose) {
605 struct stlink_libusb* slu = NULL;
610 sl = malloc(sizeof (stlink_t));
611 slu = malloc(sizeof (struct stlink_libusb));
612 if (sl == NULL) goto on_error;
613 if (slu == NULL) goto on_error;
615 sl->verbose = verbose;
617 if (slu->libusb_ctx != NULL) {
618 fprintf(stderr, "reopening with an existing context? undefined behaviour!\n");
621 if (libusb_init(&(slu->libusb_ctx))) {
622 fprintf(stderr, "failed to init libusb context, wrong version of libraries?\n");
629 libusb_device** devs = NULL;
635 count = libusb_get_device_list(slu->libusb_ctx, &devs);
637 printf("libusb_get_device_list\n");
638 goto on_libusb_error;
641 for (i = 0; i < count; ++i) {
643 if (is_stlink_device(dev)) break;
645 if (i == count) return NULL;
647 if (libusb_open(dev, &(slu->usb_handle))) {
648 printf("libusb_open()\n");
649 goto on_libusb_error;
652 if (libusb_get_configuration(slu->usb_handle, &config)) {
653 /* this may fail for a previous configured device */
654 printf("libusb_get_configuration()\n");
655 goto on_libusb_error;
659 printf("setting new configuration (%d -> 1)\n", config);
660 if (libusb_set_configuration(slu->usb_handle, 1)) {
661 /* this may fail for a previous configured device */
662 printf("libusb_set_configuration()\n");
663 goto on_libusb_error;
667 if (libusb_claim_interface(slu->usb_handle, 0)) {
668 printf("libusb_claim_interface()\n");
669 goto on_libusb_error;
672 slu->req_trans = libusb_alloc_transfer(0);
673 if (slu->req_trans == NULL) {
674 printf("libusb_alloc_transfer\n");
675 goto on_libusb_error;
678 slu->rep_trans = libusb_alloc_transfer(0);
679 if (slu->rep_trans == NULL) {
680 printf("libusb_alloc_transfer\n");
681 goto on_libusb_error;
684 slu->ep_rep = 1 /* ep rep */ | LIBUSB_ENDPOINT_IN;
685 slu->ep_req = 2 /* ep req */ | LIBUSB_ENDPOINT_OUT;
687 /* libusb_reset_device(slu->usb_handle); */
694 libusb_free_device_list(devs, 1);
695 fprintf(stderr, "freed libusb device list\n");
703 sl->backend = &_stlink_usb_backend;
704 sl->backend_data = slu;
706 /* flash memory settings */
707 sl->flash_base = STM32_FLASH_BASE;
708 sl->flash_size = STM32_FLASH_SIZE;
709 sl->flash_pgsz = STM32_FLASH_PGSZ;
712 sl->sys_base = STM32_SYSTEM_BASE;
713 sl->sys_size = STM32_SYSTEM_SIZE;
715 /* sram memory settings */
716 sl->sram_base = STM32_SRAM_BASE;
717 sl->sram_size = STM32L_SRAM_SIZE;
723 if (sl != NULL) free(sl);
724 if (slu != NULL) free(slu);