13 enum SCSI_Generic_Direction {SG_DXFER_TO_DEV=0, SG_DXFER_FROM_DEV=0x80};
15 void _stlink_usb_close(stlink_t* sl) {
19 struct stlink_libusb * const handle = sl->backend_data;
20 // maybe we couldn't even get the usb device?
22 if (handle->usb_handle != NULL) {
23 libusb_close(handle->usb_handle);
26 libusb_exit(handle->libusb_ctx);
31 ssize_t send_recv(struct stlink_libusb* handle, int terminate,
32 unsigned char* txbuf, size_t txsize,
33 unsigned char* rxbuf, size_t rxsize) {
34 /* note: txbuf and rxbuf can point to the same area */
37 if (libusb_bulk_transfer(handle->usb_handle, handle->ep_req,
45 if (libusb_bulk_transfer(handle->usb_handle, handle->ep_rep,
53 if ((handle->protocoll == 1) && terminate) {
54 /* Read the SG reply */
55 unsigned char sg_buf[13];
56 if (libusb_bulk_transfer(handle->usb_handle, handle->ep_rep,
62 /* The STLink doesn't seem to evaluate the sequence number */
63 handle->sg_transfer_idx++;
69 static inline int send_only
70 (struct stlink_libusb* handle, int terminate,
71 unsigned char* txbuf, size_t txsize) {
72 return send_recv(handle, terminate, txbuf, txsize, NULL, 0);
76 static int fill_command
77 (stlink_t * sl, enum SCSI_Generic_Direction dir, uint32_t len) {
78 struct stlink_libusb * const slu = sl->backend_data;
79 unsigned char* const cmd = sl->c_buf;
81 memset(cmd, 0, sizeof (sl->c_buf));
82 if(slu->protocoll == 1) {
87 write_uint32(&cmd[i], slu->sg_transfer_idx);
88 write_uint32(&cmd[i + 4], len);
90 cmd[i++] = (dir == SG_DXFER_FROM_DEV)?0x80:0;
91 cmd[i++] = 0; /* Logical unit */
92 cmd[i++] = 0xa; /* Command length */
97 int _stlink_usb_version(stlink_t *sl) {
98 struct stlink_libusb * const slu = sl->backend_data;
99 unsigned char* const data = sl->q_buf;
100 unsigned char* const cmd = sl->c_buf;
102 uint32_t rep_len = 6;
103 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
105 cmd[i++] = STLINK_GET_VERSION;
107 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
109 printf("[!] send_recv\n");
116 int32_t _stlink_usb_target_voltage(stlink_t *sl) {
117 struct stlink_libusb * const slu = sl->backend_data;
118 unsigned char* const rdata = sl->q_buf;
119 unsigned char* const cmd = sl->c_buf;
121 uint32_t rep_len = 8;
122 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
123 uint32_t factor, reading;
126 cmd[i++] = STLINK_GET_TARGET_VOLTAGE;
128 size = send_recv(slu, 1, cmd, slu->cmd_len, rdata, rep_len);
130 printf("[!] send_recv\n");
132 } else if (size != 8) {
133 printf("[!] wrong length\n");
137 factor = (rdata[3] << 24) | (rdata[2] << 16) | (rdata[1] << 8) | (rdata[0] << 0);
138 reading = (rdata[7] << 24) | (rdata[6] << 16) | (rdata[5] << 8) | (rdata[4] << 0);
139 voltage = 2400 * reading / factor;
144 int _stlink_usb_read_debug32(stlink_t *sl, uint32_t addr, uint32_t *data) {
145 struct stlink_libusb * const slu = sl->backend_data;
146 unsigned char* const rdata = sl->q_buf;
147 unsigned char* const cmd = sl->c_buf;
149 const int rep_len = 8;
151 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
152 cmd[i++] = STLINK_DEBUG_COMMAND;
153 cmd[i++] = STLINK_JTAG_READDEBUG_32BIT;
154 write_uint32(&cmd[i], addr);
155 size = send_recv(slu, 1, cmd, slu->cmd_len, rdata, rep_len);
157 printf("[!] send_recv\n");
160 *data = read_uint32(rdata, 4);
164 int _stlink_usb_write_debug32(stlink_t *sl, uint32_t addr, uint32_t data) {
165 struct stlink_libusb * const slu = sl->backend_data;
166 unsigned char* const rdata = sl->q_buf;
167 unsigned char* const cmd = sl->c_buf;
169 const int rep_len = 2;
171 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
172 cmd[i++] = STLINK_DEBUG_COMMAND;
173 cmd[i++] = STLINK_JTAG_WRITEDEBUG_32BIT;
174 write_uint32(&cmd[i], addr);
175 write_uint32(&cmd[i + 4], data);
176 size = send_recv(slu, 1, cmd, slu->cmd_len, rdata, rep_len);
178 printf("[!] send_recv\n");
185 int _stlink_usb_write_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
186 struct stlink_libusb * const slu = sl->backend_data;
187 unsigned char* const data = sl->q_buf;
188 unsigned char* const cmd = sl->c_buf;
191 i = fill_command(sl, SG_DXFER_TO_DEV, len);
192 cmd[i++] = STLINK_DEBUG_COMMAND;
193 cmd[i++] = STLINK_DEBUG_WRITEMEM_32BIT;
194 write_uint32(&cmd[i], addr);
195 write_uint16(&cmd[i + 4], len);
196 ret = send_only(slu, 0, cmd, slu->cmd_len);
200 ret = send_only(slu, 1, data, len);
207 int _stlink_usb_write_mem8(stlink_t *sl, uint32_t addr, uint16_t len) {
208 struct stlink_libusb * const slu = sl->backend_data;
209 unsigned char* const data = sl->q_buf;
210 unsigned char* const cmd = sl->c_buf;
213 i = fill_command(sl, SG_DXFER_TO_DEV, 0);
214 cmd[i++] = STLINK_DEBUG_COMMAND;
215 cmd[i++] = STLINK_DEBUG_WRITEMEM_8BIT;
216 write_uint32(&cmd[i], addr);
217 write_uint16(&cmd[i + 4], len);
218 ret = send_only(slu, 0, cmd, slu->cmd_len);
222 ret = send_only(slu, 1, data, len);
230 int _stlink_usb_current_mode(stlink_t * sl) {
231 struct stlink_libusb * const slu = sl->backend_data;
232 unsigned char* const cmd = sl->c_buf;
233 unsigned char* const data = sl->q_buf;
236 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
238 cmd[i++] = STLINK_GET_CURRENT_MODE;
239 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
241 printf("[!] send_recv\n");
247 int _stlink_usb_core_id(stlink_t * sl) {
248 struct stlink_libusb * const slu = sl->backend_data;
249 unsigned char* const cmd = sl->c_buf;
250 unsigned char* const data = sl->q_buf;
253 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
255 cmd[i++] = STLINK_DEBUG_COMMAND;
256 cmd[i++] = STLINK_DEBUG_READCOREID;
258 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
260 printf("[!] send_recv\n");
264 sl->core_id = read_uint32(data, 0);
268 int _stlink_usb_status(stlink_t * sl) {
269 struct stlink_libusb * const slu = sl->backend_data;
270 unsigned char* const data = sl->q_buf;
271 unsigned char* const cmd = sl->c_buf;
274 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
276 cmd[i++] = STLINK_DEBUG_COMMAND;
277 cmd[i++] = STLINK_DEBUG_GETSTATUS;
279 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
281 printf("[!] send_recv\n");
284 sl->q_len = (size_t) size;
289 int _stlink_usb_force_debug(stlink_t *sl) {
290 struct stlink_libusb *slu = sl->backend_data;
291 unsigned char* const data = sl->q_buf;
292 unsigned char* const cmd = sl->c_buf;
295 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
297 cmd[i++] = STLINK_DEBUG_COMMAND;
298 cmd[i++] = STLINK_DEBUG_FORCEDEBUG;
299 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
301 printf("[!] send_recv\n");
308 int _stlink_usb_enter_swd_mode(stlink_t * sl) {
309 struct stlink_libusb * const slu = sl->backend_data;
310 unsigned char* const cmd = sl->c_buf;
312 const int rep_len = 0;
313 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
315 cmd[i++] = STLINK_DEBUG_COMMAND;
316 cmd[i++] = STLINK_DEBUG_ENTER;
317 cmd[i++] = STLINK_DEBUG_ENTER_SWD;
319 size = send_only(slu, 1, cmd, slu->cmd_len);
321 printf("[!] send_recv\n");
328 int _stlink_usb_exit_dfu_mode(stlink_t* sl) {
329 struct stlink_libusb * const slu = sl->backend_data;
330 unsigned char* const cmd = sl->c_buf;
332 int i = fill_command(sl, SG_DXFER_FROM_DEV, 0);
334 cmd[i++] = STLINK_DFU_COMMAND;
335 cmd[i++] = STLINK_DFU_EXIT;
337 size = send_only(slu, 1, cmd, slu->cmd_len);
339 printf("[!] send_recv\n");
347 * TODO - not convinced this does anything...
350 int _stlink_usb_reset(stlink_t * sl) {
351 struct stlink_libusb * const slu = sl->backend_data;
352 unsigned char* const data = sl->q_buf;
353 unsigned char* const cmd = sl->c_buf;
356 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
358 cmd[i++] = STLINK_DEBUG_COMMAND;
359 cmd[i++] = STLINK_DEBUG_RESETSYS;
361 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
363 printf("[!] send_recv\n");
371 int _stlink_usb_jtag_reset(stlink_t * sl, int value) {
372 struct stlink_libusb * const slu = sl->backend_data;
373 unsigned char* const data = sl->q_buf;
374 unsigned char* const cmd = sl->c_buf;
377 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
379 cmd[i++] = STLINK_DEBUG_COMMAND;
380 cmd[i++] = STLINK_JTAG_DRIVE_NRST;
383 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
385 printf("[!] send_recv\n");
393 int _stlink_usb_step(stlink_t* sl) {
394 struct stlink_libusb * const slu = sl->backend_data;
395 unsigned char* const data = sl->q_buf;
396 unsigned char* const cmd = sl->c_buf;
399 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
401 cmd[i++] = STLINK_DEBUG_COMMAND;
402 cmd[i++] = STLINK_DEBUG_STEPCORE;
404 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
406 printf("[!] send_recv\n");
414 * This seems to do a good job of restarting things from the beginning?
417 int _stlink_usb_run(stlink_t* sl) {
418 struct stlink_libusb * const slu = sl->backend_data;
419 unsigned char* const data = sl->q_buf;
420 unsigned char* const cmd = sl->c_buf;
423 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
425 cmd[i++] = STLINK_DEBUG_COMMAND;
426 cmd[i++] = STLINK_DEBUG_RUNCORE;
428 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
430 printf("[!] send_recv\n");
437 int _stlink_usb_exit_debug_mode(stlink_t *sl) {
438 struct stlink_libusb * const slu = sl->backend_data;
439 unsigned char* const cmd = sl->c_buf;
441 int i = fill_command(sl, SG_DXFER_FROM_DEV, 0);
443 cmd[i++] = STLINK_DEBUG_COMMAND;
444 cmd[i++] = STLINK_DEBUG_EXIT;
446 size = send_only(slu, 1, cmd, slu->cmd_len);
448 printf("[!] send_only\n");
455 int _stlink_usb_read_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
456 struct stlink_libusb * const slu = sl->backend_data;
457 unsigned char* const data = sl->q_buf;
458 unsigned char* const cmd = sl->c_buf;
460 int i = fill_command(sl, SG_DXFER_FROM_DEV, len);
462 cmd[i++] = STLINK_DEBUG_COMMAND;
463 cmd[i++] = STLINK_DEBUG_READMEM_32BIT;
464 write_uint32(&cmd[i], addr);
465 write_uint16(&cmd[i + 4], len);
467 size = send_recv(slu, 1, cmd, slu->cmd_len, data, len);
469 printf("[!] send_recv\n");
473 sl->q_len = (size_t) size;
475 stlink_print_data(sl);
479 int _stlink_usb_read_all_regs(stlink_t *sl, reg *regp) {
480 struct stlink_libusb * const slu = sl->backend_data;
481 unsigned char* const cmd = sl->c_buf;
482 unsigned char* const data = sl->q_buf;
484 uint32_t rep_len = 84;
485 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
487 cmd[i++] = STLINK_DEBUG_COMMAND;
488 cmd[i++] = STLINK_DEBUG_READALLREGS;
489 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
491 printf("[!] send_recv\n");
494 sl->q_len = (size_t) size;
495 stlink_print_data(sl);
497 regp->r[i]= read_uint32(sl->q_buf, i*4);
498 regp->xpsr = read_uint32(sl->q_buf, 64);
499 regp->main_sp = read_uint32(sl->q_buf, 68);
500 regp->process_sp = read_uint32(sl->q_buf, 72);
501 regp->rw = read_uint32(sl->q_buf, 76);
502 regp->rw2 = read_uint32(sl->q_buf, 80);
506 DLOG("xpsr = 0x%08x\n", read_uint32(sl->q_buf, 64));
507 DLOG("main_sp = 0x%08x\n", read_uint32(sl->q_buf, 68));
508 DLOG("process_sp = 0x%08x\n", read_uint32(sl->q_buf, 72));
509 DLOG("rw = 0x%08x\n", read_uint32(sl->q_buf, 76));
510 DLOG("rw2 = 0x%08x\n", read_uint32(sl->q_buf, 80));
515 int _stlink_usb_read_reg(stlink_t *sl, int r_idx, reg *regp) {
516 struct stlink_libusb * const slu = sl->backend_data;
517 unsigned char* const data = sl->q_buf;
518 unsigned char* const cmd = sl->c_buf;
521 uint32_t rep_len = 4;
522 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
524 cmd[i++] = STLINK_DEBUG_COMMAND;
525 cmd[i++] = STLINK_DEBUG_READREG;
526 cmd[i++] = (uint8_t) r_idx;
527 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
529 printf("[!] send_recv\n");
532 sl->q_len = (size_t) size;
533 stlink_print_data(sl);
534 r = read_uint32(sl->q_buf, 0);
535 DLOG("r_idx (%2d) = 0x%08x\n", r_idx, r);
545 regp->process_sp = r;
548 regp->rw = r; /* XXX ?(primask, basemask etc.) */
551 regp->rw2 = r; /* XXX ?(primask, basemask etc.) */
560 /* See section C1.6 of the ARMv7-M Architecture Reference Manual */
561 int _stlink_usb_read_unsupported_reg(stlink_t *sl, int r_idx, reg *regp) {
565 sl->q_buf[0] = (unsigned char) r_idx;
566 for (int i = 1; i < 4; i++) {
570 ret = _stlink_usb_write_mem32(sl, DCRSR, 4);
574 _stlink_usb_read_mem32(sl, DCRDR, 4);
578 r = read_uint32(sl->q_buf, 0);
579 DLOG("r_idx (%2d) = 0x%08x\n", r_idx, r);
583 regp->primask = (uint8_t) (r & 0xFF);
584 regp->basepri = (uint8_t) ((r>>8) & 0xFF);
585 regp->faultmask = (uint8_t) ((r>>16) & 0xFF);
586 regp->control = (uint8_t) ((r>>24) & 0xFF);
592 regp->s[r_idx - 0x40] = r;
599 int _stlink_usb_read_all_unsupported_regs(stlink_t *sl, reg *regp) {
602 ret = _stlink_usb_read_unsupported_reg(sl, 0x14, regp);
606 ret = _stlink_usb_read_unsupported_reg(sl, 0x21, regp);
610 for (int i = 0; i < 32; i++) {
611 ret = _stlink_usb_read_unsupported_reg(sl, 0x40+i, regp);
619 /* See section C1.6 of the ARMv7-M Architecture Reference Manual */
620 int _stlink_usb_write_unsupported_reg(stlink_t *sl, uint32_t val, int r_idx, reg *regp) {
623 if (r_idx >= 0x1C && r_idx <= 0x1F) { /* primask, basepri, faultmask, or control */
624 /* These are held in the same register */
625 ret = _stlink_usb_read_unsupported_reg(sl, 0x14, regp);
629 val = (uint8_t) (val>>24);
632 case 0x1C: /* control */
633 val = (((uint32_t) val) << 24) | (((uint32_t) regp->faultmask) << 16) | (((uint32_t) regp->basepri) << 8) | ((uint32_t) regp->primask);
635 case 0x1D: /* faultmask */
636 val = (((uint32_t) regp->control) << 24) | (((uint32_t) val) << 16) | (((uint32_t) regp->basepri) << 8) | ((uint32_t) regp->primask);
638 case 0x1E: /* basepri */
639 val = (((uint32_t) regp->control) << 24) | (((uint32_t) regp->faultmask) << 16) | (((uint32_t) val) << 8) | ((uint32_t) regp->primask);
641 case 0x1F: /* primask */
642 val = (((uint32_t) regp->control) << 24) | (((uint32_t) regp->faultmask) << 16) | (((uint32_t) regp->basepri) << 8) | ((uint32_t) val);
649 write_uint32(sl->q_buf, val);
651 ret = _stlink_usb_write_mem32(sl, DCRDR, 4);
655 sl->q_buf[0] = (unsigned char) r_idx;
660 return _stlink_usb_write_mem32(sl, DCRSR, 4);
663 int _stlink_usb_write_reg(stlink_t *sl, uint32_t reg, int idx) {
664 struct stlink_libusb * const slu = sl->backend_data;
665 unsigned char* const data = sl->q_buf;
666 unsigned char* const cmd = sl->c_buf;
668 uint32_t rep_len = 2;
669 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
671 cmd[i++] = STLINK_DEBUG_COMMAND;
672 cmd[i++] = STLINK_DEBUG_WRITEREG;
674 write_uint32(&cmd[i], reg);
675 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
677 printf("[!] send_recv\n");
680 sl->q_len = (size_t) size;
681 stlink_print_data(sl);
686 stlink_backend_t _stlink_usb_backend = {
688 _stlink_usb_exit_debug_mode,
689 _stlink_usb_enter_swd_mode,
690 NULL, // no enter_jtag_mode here...
691 _stlink_usb_exit_dfu_mode,
694 _stlink_usb_jtag_reset,
698 _stlink_usb_read_debug32,
699 _stlink_usb_read_mem32,
700 _stlink_usb_write_debug32,
701 _stlink_usb_write_mem32,
702 _stlink_usb_write_mem8,
703 _stlink_usb_read_all_regs,
704 _stlink_usb_read_reg,
705 _stlink_usb_read_all_unsupported_regs,
706 _stlink_usb_read_unsupported_reg,
707 _stlink_usb_write_unsupported_reg,
708 _stlink_usb_write_reg,
710 _stlink_usb_current_mode,
711 _stlink_usb_force_debug,
712 _stlink_usb_target_voltage
715 stlink_t *stlink_open_usb(enum ugly_loglevel verbose, bool reset, char serial[16])
718 struct stlink_libusb* slu = NULL;
722 sl = calloc(1, sizeof (stlink_t));
723 slu = calloc(1, sizeof (struct stlink_libusb));
725 goto on_malloc_error;
727 goto on_malloc_error;
730 sl->backend = &_stlink_usb_backend;
731 sl->backend_data = slu;
733 sl->core_stat = STLINK_CORE_STAT_UNKNOWN;
734 if (libusb_init(&(slu->libusb_ctx))) {
735 WLOG("failed to init libusb context, wrong version of libraries?\n");
739 libusb_device **list;
740 int cnt = libusb_get_device_list(slu->libusb_ctx, &list);
741 struct libusb_device_descriptor desc;
745 /* @TODO: Reading a environment variable in a usb open function is not very nice, this
746 should be refactored and moved into the CLI tools, and instead of giving USB_BUS:USB_ADDR a real stlink
747 serial string should be passed to this function. Probably people are using this but this is very odd because
748 as programmer can change to multiple busses and it is better to detect them based on serial. */
749 char *device = getenv("STLINK_DEVICE");
751 char *c = strchr(device,':');
753 WLOG("STLINK_DEVICE must be <USB_BUS>:<USB_ADDR> format\n");
759 ILOG("bus %03d dev %03d\n",devBus, devAddr);
763 libusb_get_device_descriptor( list[cnt], &desc );
764 if (desc.idVendor != USB_ST_VID)
767 if (devBus && devAddr) {
768 if ((libusb_get_bus_number(list[cnt]) != devBus)
769 || (libusb_get_device_address(list[cnt]) != devAddr)) {
774 if ((desc.idProduct == USB_STLINK_32L_PID) || (desc.idProduct == USB_STLINK_NUCLEO_PID)) {
775 struct libusb_device_handle *handle;
777 libusb_open(list[cnt], &handle);
778 sl->serial_size = libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber,
779 (unsigned char *)sl->serial, sizeof(sl->serial));
780 libusb_close(handle);
782 if ((serial == NULL) || (*serial == 0))
785 if (sl->serial_size < 0)
788 if (memcmp(serial, &sl->serial, sl->serial_size) == 0)
794 if (desc.idProduct == USB_STLINK_PID) {
801 WLOG ("Couldn't find %s ST-Link/V2 devices\n",(devBus && devAddr)?"matched":"any");
804 ret = libusb_open(list[cnt], &slu->usb_handle);
806 WLOG("Error %d (%s) opening ST-Link/V2 device %03d:%03d\n",
807 ret, strerror (errno), libusb_get_bus_number(list[cnt]), libusb_get_device_address(list[cnt]));
812 libusb_free_device_list(list, 1);
814 if (libusb_kernel_driver_active(slu->usb_handle, 0) == 1) {
815 ret = libusb_detach_kernel_driver(slu->usb_handle, 0);
817 WLOG("libusb_detach_kernel_driver(() error %s\n", strerror(-ret));
818 goto on_libusb_error;
822 if (libusb_get_configuration(slu->usb_handle, &config)) {
823 /* this may fail for a previous configured device */
824 WLOG("libusb_get_configuration()\n");
825 goto on_libusb_error;
829 printf("setting new configuration (%d -> 1)\n", config);
830 if (libusb_set_configuration(slu->usb_handle, 1)) {
831 /* this may fail for a previous configured device */
832 WLOG("libusb_set_configuration() failed\n");
833 goto on_libusb_error;
837 if (libusb_claim_interface(slu->usb_handle, 0)) {
838 WLOG("Stlink usb device found, but unable to claim (probably already in use?)\n");
839 goto on_libusb_error;
842 // TODO - could use the scanning techniq from stm8 code here...
843 slu->ep_rep = 1 /* ep rep */ | LIBUSB_ENDPOINT_IN;
844 if (desc.idProduct == USB_STLINK_NUCLEO_PID) {
845 slu->ep_req = 1 /* ep req */ | LIBUSB_ENDPOINT_OUT;
847 slu->ep_req = 2 /* ep req */ | LIBUSB_ENDPOINT_OUT;
850 slu->sg_transfer_idx = 0;
851 // TODO - never used at the moment, always CMD_SIZE
852 slu->cmd_len = (slu->protocoll == 1)? STLINK_SG_SIZE: STLINK_CMD_SIZE;
854 if (stlink_current_mode(sl) == STLINK_DEV_DFU_MODE) {
855 ILOG("-- exit_dfu_mode\n");
856 stlink_exit_dfu_mode(sl);
859 if (stlink_current_mode(sl) != STLINK_DEV_DEBUG_MODE) {
860 stlink_enter_swd_mode(sl);
869 ret = stlink_load_device_params(sl);
881 libusb_exit(slu->libusb_ctx);
892 static size_t stlink_probe_usb_devs(libusb_device **devs, stlink_t **sldevs[]) {
901 while ((dev = devs[i++]) != NULL) {
902 struct libusb_device_descriptor desc;
903 int r = libusb_get_device_descriptor(dev, &desc);
905 WLOG("failed to get libusb device descriptor\n");
909 if (desc.idProduct != USB_STLINK_32L_PID &&
910 desc.idProduct != USB_STLINK_NUCLEO_PID)
916 /* Allocate list of pointers */
917 _sldevs = calloc(slcnt, sizeof(stlink_t *));
923 /* Open stlinks and attach to list */
925 while ((dev = devs[i++]) != NULL) {
926 struct libusb_device_descriptor desc;
927 ret = libusb_get_device_descriptor(dev, &desc);
929 WLOG("failed to get libusb device descriptor\n");
933 if (desc.idProduct != USB_STLINK_32L_PID &&
934 desc.idProduct != USB_STLINK_NUCLEO_PID)
937 struct libusb_device_handle* handle;
939 memset(serial, 0, sizeof(serial));
941 ret = libusb_open(dev, &handle);
943 WLOG("failed to get libusb device descriptor\n");
947 ret = libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, (unsigned char *)&serial, sizeof(serial));
951 libusb_close(handle);
954 sl = stlink_open_usb(0, 1, serial);
962 /* Something went wrong */
973 size_t stlink_probe_usb(stlink_t **stdevs[]) {
974 libusb_device **devs;
981 r = libusb_init(NULL);
985 cnt = libusb_get_device_list(NULL, &devs);
989 slcnt = stlink_probe_usb_devs(devs, &sldevs);
990 libusb_free_device_list(devs, 1);
998 void stlink_probe_usb_free(stlink_t ***stdevs, size_t size) {
999 if (stdevs == NULL || *stdevs == NULL || size == 0)
1002 for (size_t n = 0; n < size; n++)
1003 stlink_close((*stdevs)[n]);