11 #include "stlink-common.h"
12 #include "stlink-usb.h"
13 #include "uglylogging.h"
15 enum SCSI_Generic_Direction {SG_DXFER_TO_DEV=0, SG_DXFER_FROM_DEV=0x80};
17 void _stlink_usb_close(stlink_t* sl) {
18 struct stlink_libusb * const handle = sl->backend_data;
19 // maybe we couldn't even get the usb device?
21 if (handle->usb_handle != NULL) {
22 libusb_close(handle->usb_handle);
25 libusb_exit(handle->libusb_ctx);
30 ssize_t send_recv(struct stlink_libusb* handle, int terminate,
31 unsigned char* txbuf, size_t txsize,
32 unsigned char* rxbuf, size_t rxsize) {
33 /* note: txbuf and rxbuf can point to the same area */
36 if (libusb_bulk_transfer(handle->usb_handle, handle->ep_req,
44 if (libusb_bulk_transfer(handle->usb_handle, handle->ep_rep,
52 if ((handle->protocoll == 1) && terminate) {
53 /* Read the SG reply */
54 unsigned char sg_buf[13];
55 if (libusb_bulk_transfer(handle->usb_handle, handle->ep_rep,
61 /* The STLink doesn't seem to evaluate the sequence number */
62 handle->sg_transfer_idx++;
68 static inline int send_only
69 (struct stlink_libusb* handle, int terminate,
70 unsigned char* txbuf, size_t txsize) {
71 return send_recv(handle, terminate, txbuf, txsize, NULL, 0);
75 static int fill_command
76 (stlink_t * sl, enum SCSI_Generic_Direction dir, uint32_t len) {
77 struct stlink_libusb * const slu = sl->backend_data;
78 unsigned char* const cmd = sl->c_buf;
80 memset(cmd, 0, sizeof (sl->c_buf));
81 if(slu->protocoll == 1) {
86 write_uint32(&cmd[i], slu->sg_transfer_idx);
87 write_uint32(&cmd[i + 4], len);
89 cmd[i++] = (dir == SG_DXFER_FROM_DEV)?0x80:0;
90 cmd[i++] = 0; /* Logical unit */
91 cmd[i++] = 0xa; /* Command length */
96 void _stlink_usb_version(stlink_t *sl) {
97 struct stlink_libusb * const slu = sl->backend_data;
98 unsigned char* const data = sl->q_buf;
99 unsigned char* const cmd = sl->c_buf;
101 uint32_t rep_len = 6;
102 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
104 cmd[i++] = STLINK_GET_VERSION;
106 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
108 printf("[!] send_recv\n");
113 int32_t _stlink_usb_target_voltage(stlink_t *sl) {
114 struct stlink_libusb * const slu = sl->backend_data;
115 unsigned char* const rdata = sl->q_buf;
116 unsigned char* const cmd = sl->c_buf;
118 uint32_t rep_len = 8;
119 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
120 uint32_t factor, reading;
123 cmd[i++] = STLINK_GET_TARGET_VOLTAGE;
125 size = send_recv(slu, 1, cmd, slu->cmd_len, rdata, rep_len);
127 printf("[!] send_recv\n");
129 } else if (size != 8) {
130 printf("[!] wrong length\n");
134 factor = (rdata[3] << 24) | (rdata[2] << 16) | (rdata[1] << 8) | (rdata[0] << 0);
135 reading = (rdata[7] << 24) | (rdata[6] << 16) | (rdata[5] << 8) | (rdata[4] << 0);
136 voltage = 2400 * reading / factor;
141 uint32_t _stlink_usb_read_debug32(stlink_t *sl, uint32_t addr) {
142 struct stlink_libusb * const slu = sl->backend_data;
143 unsigned char* const rdata = sl->q_buf;
144 unsigned char* const cmd = sl->c_buf;
146 const int rep_len = 8;
148 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
149 cmd[i++] = STLINK_DEBUG_COMMAND;
150 cmd[i++] = STLINK_JTAG_READDEBUG_32BIT;
151 write_uint32(&cmd[i], addr);
152 size = send_recv(slu, 1, cmd, slu->cmd_len, rdata, rep_len);
154 printf("[!] send_recv\n");
157 return read_uint32(rdata, 4);
160 void _stlink_usb_write_debug32(stlink_t *sl, uint32_t addr, uint32_t data) {
161 struct stlink_libusb * const slu = sl->backend_data;
162 unsigned char* const rdata = sl->q_buf;
163 unsigned char* const cmd = sl->c_buf;
165 const int rep_len = 2;
167 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
168 cmd[i++] = STLINK_DEBUG_COMMAND;
169 cmd[i++] = STLINK_JTAG_WRITEDEBUG_32BIT;
170 write_uint32(&cmd[i], addr);
171 write_uint32(&cmd[i + 4], data);
172 size = send_recv(slu, 1, cmd, slu->cmd_len, rdata, rep_len);
174 printf("[!] send_recv\n");
179 void _stlink_usb_write_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
180 struct stlink_libusb * const slu = sl->backend_data;
181 unsigned char* const data = sl->q_buf;
182 unsigned char* const cmd = sl->c_buf;
184 int i = fill_command(sl, SG_DXFER_TO_DEV, len);
185 cmd[i++] = STLINK_DEBUG_COMMAND;
186 cmd[i++] = STLINK_DEBUG_WRITEMEM_32BIT;
187 write_uint32(&cmd[i], addr);
188 write_uint16(&cmd[i + 4], len);
189 send_only(slu, 0, cmd, slu->cmd_len);
191 send_only(slu, 1, data, len);
194 void _stlink_usb_write_mem8(stlink_t *sl, uint32_t addr, uint16_t len) {
195 struct stlink_libusb * const slu = sl->backend_data;
196 unsigned char* const data = sl->q_buf;
197 unsigned char* const cmd = sl->c_buf;
199 int i = fill_command(sl, SG_DXFER_TO_DEV, 0);
200 cmd[i++] = STLINK_DEBUG_COMMAND;
201 cmd[i++] = STLINK_DEBUG_WRITEMEM_8BIT;
202 write_uint32(&cmd[i], addr);
203 write_uint16(&cmd[i + 4], len);
204 send_only(slu, 0, cmd, slu->cmd_len);
205 send_only(slu, 1, data, len);
209 int _stlink_usb_current_mode(stlink_t * sl) {
210 struct stlink_libusb * const slu = sl->backend_data;
211 unsigned char* const cmd = sl->c_buf;
212 unsigned char* const data = sl->q_buf;
215 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
217 cmd[i++] = STLINK_GET_CURRENT_MODE;
218 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
220 printf("[!] send_recv\n");
226 void _stlink_usb_core_id(stlink_t * sl) {
227 struct stlink_libusb * const slu = sl->backend_data;
228 unsigned char* const cmd = sl->c_buf;
229 unsigned char* const data = sl->q_buf;
232 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
234 cmd[i++] = STLINK_DEBUG_COMMAND;
235 cmd[i++] = STLINK_DEBUG_READCOREID;
237 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
239 printf("[!] send_recv\n");
243 sl->core_id = read_uint32(data, 0);
246 void _stlink_usb_status(stlink_t * sl) {
247 struct stlink_libusb * const slu = sl->backend_data;
248 unsigned char* const data = sl->q_buf;
249 unsigned char* const cmd = sl->c_buf;
252 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
254 cmd[i++] = STLINK_DEBUG_COMMAND;
255 cmd[i++] = STLINK_DEBUG_GETSTATUS;
257 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
259 printf("[!] send_recv\n");
264 void _stlink_usb_force_debug(stlink_t *sl) {
265 struct stlink_libusb *slu = sl->backend_data;
266 unsigned char* const data = sl->q_buf;
267 unsigned char* const cmd = sl->c_buf;
270 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
272 cmd[i++] = STLINK_DEBUG_COMMAND;
273 cmd[i++] = STLINK_DEBUG_FORCEDEBUG;
274 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
276 printf("[!] send_recv\n");
281 void _stlink_usb_enter_swd_mode(stlink_t * sl) {
282 struct stlink_libusb * const slu = sl->backend_data;
283 unsigned char* const cmd = sl->c_buf;
285 const int rep_len = 0;
286 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
288 cmd[i++] = STLINK_DEBUG_COMMAND;
289 cmd[i++] = STLINK_DEBUG_ENTER;
290 cmd[i++] = STLINK_DEBUG_ENTER_SWD;
292 size = send_only(slu, 1, cmd, slu->cmd_len);
294 printf("[!] send_recv\n");
299 void _stlink_usb_exit_dfu_mode(stlink_t* sl) {
300 struct stlink_libusb * const slu = sl->backend_data;
301 unsigned char* const cmd = sl->c_buf;
303 int i = fill_command(sl, SG_DXFER_FROM_DEV, 0);
305 cmd[i++] = STLINK_DFU_COMMAND;
306 cmd[i++] = STLINK_DFU_EXIT;
308 size = send_only(slu, 1, cmd, slu->cmd_len);
310 printf("[!] send_recv\n");
316 * TODO - not convinced this does anything...
319 void _stlink_usb_reset(stlink_t * sl) {
320 struct stlink_libusb * const slu = sl->backend_data;
321 unsigned char* const data = sl->q_buf;
322 unsigned char* const cmd = sl->c_buf;
325 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
327 cmd[i++] = STLINK_DEBUG_COMMAND;
328 cmd[i++] = STLINK_DEBUG_RESETSYS;
330 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
332 printf("[!] send_recv\n");
338 void _stlink_usb_jtag_reset(stlink_t * sl, int value) {
339 struct stlink_libusb * const slu = sl->backend_data;
340 unsigned char* const data = sl->q_buf;
341 unsigned char* const cmd = sl->c_buf;
344 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
346 cmd[i++] = STLINK_DEBUG_COMMAND;
347 cmd[i++] = STLINK_JTAG_DRIVE_NRST;
350 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
352 printf("[!] send_recv\n");
358 void _stlink_usb_step(stlink_t* sl) {
359 struct stlink_libusb * const slu = sl->backend_data;
360 unsigned char* const data = sl->q_buf;
361 unsigned char* const cmd = sl->c_buf;
364 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
366 cmd[i++] = STLINK_DEBUG_COMMAND;
367 cmd[i++] = STLINK_DEBUG_STEPCORE;
369 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
371 printf("[!] send_recv\n");
377 * This seems to do a good job of restarting things from the beginning?
380 void _stlink_usb_run(stlink_t* sl) {
381 struct stlink_libusb * const slu = sl->backend_data;
382 unsigned char* const data = sl->q_buf;
383 unsigned char* const cmd = sl->c_buf;
386 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
388 cmd[i++] = STLINK_DEBUG_COMMAND;
389 cmd[i++] = STLINK_DEBUG_RUNCORE;
391 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
393 printf("[!] send_recv\n");
398 void _stlink_usb_exit_debug_mode(stlink_t *sl) {
399 struct stlink_libusb * const slu = sl->backend_data;
400 unsigned char* const cmd = sl->c_buf;
402 int i = fill_command(sl, SG_DXFER_FROM_DEV, 0);
404 cmd[i++] = STLINK_DEBUG_COMMAND;
405 cmd[i++] = STLINK_DEBUG_EXIT;
407 size = send_only(slu, 1, cmd, slu->cmd_len);
409 printf("[!] send_only\n");
414 void _stlink_usb_read_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
415 struct stlink_libusb * const slu = sl->backend_data;
416 unsigned char* const data = sl->q_buf;
417 unsigned char* const cmd = sl->c_buf;
419 int i = fill_command(sl, SG_DXFER_FROM_DEV, len);
421 cmd[i++] = STLINK_DEBUG_COMMAND;
422 cmd[i++] = STLINK_DEBUG_READMEM_32BIT;
423 write_uint32(&cmd[i], addr);
424 write_uint16(&cmd[i + 4], len);
426 size = send_recv(slu, 1, cmd, slu->cmd_len, data, len);
428 printf("[!] send_recv\n");
432 sl->q_len = (size_t) size;
434 stlink_print_data(sl);
437 void _stlink_usb_read_all_regs(stlink_t *sl, reg *regp) {
438 struct stlink_libusb * const slu = sl->backend_data;
439 unsigned char* const cmd = sl->c_buf;
440 unsigned char* const data = sl->q_buf;
442 uint32_t rep_len = 84;
443 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
445 cmd[i++] = STLINK_DEBUG_COMMAND;
446 cmd[i++] = STLINK_DEBUG_READALLREGS;
447 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
449 printf("[!] send_recv\n");
452 sl->q_len = (size_t) size;
453 stlink_print_data(sl);
455 regp->r[i]= read_uint32(sl->q_buf, i*4);
456 regp->xpsr = read_uint32(sl->q_buf, 64);
457 regp->main_sp = read_uint32(sl->q_buf, 68);
458 regp->process_sp = read_uint32(sl->q_buf, 72);
459 regp->rw = read_uint32(sl->q_buf, 76);
460 regp->rw2 = read_uint32(sl->q_buf, 80);
464 DLOG("xpsr = 0x%08x\n", read_uint32(sl->q_buf, 64));
465 DLOG("main_sp = 0x%08x\n", read_uint32(sl->q_buf, 68));
466 DLOG("process_sp = 0x%08x\n", read_uint32(sl->q_buf, 72));
467 DLOG("rw = 0x%08x\n", read_uint32(sl->q_buf, 76));
468 DLOG("rw2 = 0x%08x\n", read_uint32(sl->q_buf, 80));
471 void _stlink_usb_read_reg(stlink_t *sl, int r_idx, reg *regp) {
472 struct stlink_libusb * const slu = sl->backend_data;
473 unsigned char* const data = sl->q_buf;
474 unsigned char* const cmd = sl->c_buf;
477 uint32_t rep_len = 4;
478 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
480 cmd[i++] = STLINK_DEBUG_COMMAND;
481 cmd[i++] = STLINK_DEBUG_READREG;
482 cmd[i++] = (uint8_t) r_idx;
483 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
485 printf("[!] send_recv\n");
488 sl->q_len = (size_t) size;
489 stlink_print_data(sl);
490 r = read_uint32(sl->q_buf, 0);
491 DLOG("r_idx (%2d) = 0x%08x\n", r_idx, r);
501 regp->process_sp = r;
504 regp->rw = r; /* XXX ?(primask, basemask etc.) */
507 regp->rw2 = r; /* XXX ?(primask, basemask etc.) */
514 /* See section C1.6 of the ARMv7-M Architecture Reference Manual */
515 void _stlink_usb_read_unsupported_reg(stlink_t *sl, int r_idx, reg *regp) {
518 sl->q_buf[0] = (unsigned char) r_idx;
519 for (int i = 1; i < 4; i++) {
523 _stlink_usb_write_mem32(sl, DCRSR, 4);
524 _stlink_usb_read_mem32(sl, DCRDR, 4);
526 r = read_uint32(sl->q_buf, 0);
527 DLOG("r_idx (%2d) = 0x%08x\n", r_idx, r);
531 regp->primask = (uint8_t) (r & 0xFF);
532 regp->basepri = (uint8_t) ((r>>8) & 0xFF);
533 regp->faultmask = (uint8_t) ((r>>16) & 0xFF);
534 regp->control = (uint8_t) ((r>>24) & 0xFF);
540 regp->s[r_idx - 0x40] = r;
545 void _stlink_usb_read_all_unsupported_regs(stlink_t *sl, reg *regp) {
546 _stlink_usb_read_unsupported_reg(sl, 0x14, regp);
547 _stlink_usb_read_unsupported_reg(sl, 0x21, regp);
549 for (int i = 0; i < 32; i++) {
550 _stlink_usb_read_unsupported_reg(sl, 0x40+i, regp);
554 /* See section C1.6 of the ARMv7-M Architecture Reference Manual */
555 void _stlink_usb_write_unsupported_reg(stlink_t *sl, uint32_t val, int r_idx, reg *regp) {
556 if (r_idx >= 0x1C && r_idx <= 0x1F) { /* primask, basepri, faultmask, or control */
557 /* These are held in the same register */
558 _stlink_usb_read_unsupported_reg(sl, 0x14, regp);
560 val = (uint8_t) (val>>24);
563 case 0x1C: /* control */
564 val = (((uint32_t) val) << 24) | (((uint32_t) regp->faultmask) << 16) | (((uint32_t) regp->basepri) << 8) | ((uint32_t) regp->primask);
566 case 0x1D: /* faultmask */
567 val = (((uint32_t) regp->control) << 24) | (((uint32_t) val) << 16) | (((uint32_t) regp->basepri) << 8) | ((uint32_t) regp->primask);
569 case 0x1E: /* basepri */
570 val = (((uint32_t) regp->control) << 24) | (((uint32_t) regp->faultmask) << 16) | (((uint32_t) val) << 8) | ((uint32_t) regp->primask);
572 case 0x1F: /* primask */
573 val = (((uint32_t) regp->control) << 24) | (((uint32_t) regp->faultmask) << 16) | (((uint32_t) regp->basepri) << 8) | ((uint32_t) val);
580 write_uint32(sl->q_buf, val);
582 _stlink_usb_write_mem32(sl, DCRDR, 4);
584 sl->q_buf[0] = (unsigned char) r_idx;
589 _stlink_usb_write_mem32(sl, DCRSR, 4);
592 void _stlink_usb_write_reg(stlink_t *sl, uint32_t reg, int idx) {
593 struct stlink_libusb * const slu = sl->backend_data;
594 unsigned char* const data = sl->q_buf;
595 unsigned char* const cmd = sl->c_buf;
597 uint32_t rep_len = 2;
598 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
600 cmd[i++] = STLINK_DEBUG_COMMAND;
601 cmd[i++] = STLINK_DEBUG_WRITEREG;
603 write_uint32(&cmd[i], reg);
604 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
606 printf("[!] send_recv\n");
609 sl->q_len = (size_t) size;
610 stlink_print_data(sl);
613 stlink_backend_t _stlink_usb_backend = {
615 _stlink_usb_exit_debug_mode,
616 _stlink_usb_enter_swd_mode,
617 NULL, // no enter_jtag_mode here...
618 _stlink_usb_exit_dfu_mode,
621 _stlink_usb_jtag_reset,
625 _stlink_usb_read_debug32,
626 _stlink_usb_read_mem32,
627 _stlink_usb_write_debug32,
628 _stlink_usb_write_mem32,
629 _stlink_usb_write_mem8,
630 _stlink_usb_read_all_regs,
631 _stlink_usb_read_reg,
632 _stlink_usb_read_all_unsupported_regs,
633 _stlink_usb_read_unsupported_reg,
634 _stlink_usb_write_unsupported_reg,
635 _stlink_usb_write_reg,
637 _stlink_usb_current_mode,
638 _stlink_usb_force_debug,
639 _stlink_usb_target_voltage
643 stlink_t* stlink_open_usb(const int verbose, int reset, char *p_usb_iserial) {
645 struct stlink_libusb* slu = NULL;
647 libusb_device** devs = NULL;
650 sl = malloc(sizeof (stlink_t));
651 slu = malloc(sizeof (struct stlink_libusb));
652 if (sl == NULL) goto on_error;
653 if (slu == NULL) goto on_error;
654 memset(sl, 0, sizeof (stlink_t));
655 memset(slu, 0, sizeof (struct stlink_libusb));
658 sl->backend = &_stlink_usb_backend;
659 sl->backend_data = slu;
661 sl->core_stat = STLINK_CORE_STAT_UNKNOWN;
662 if (libusb_init(&(slu->libusb_ctx))) {
663 WLOG("failed to init libusb context, wrong version of libraries?\n");
667 libusb_device **list;
668 int cnt = libusb_get_device_list(slu->libusb_ctx, &list);
669 struct libusb_device_descriptor desc;
673 char *device = getenv("STLINK_DEVICE");
675 char *c = strchr(device,':');
677 WLOG("STLINK_DEVICE must be <USB_BUS>:<USB_ADDR> format\n");
683 ILOG("bus %03d dev %03d\n",devBus, devAddr);
686 libusb_get_device_descriptor( list[cnt], &desc );
687 if (desc.idVendor!=USB_ST_VID) continue;
688 if (devBus && devAddr)
689 if ((libusb_get_bus_number(list[cnt])!=devBus) || (libusb_get_device_address(list[cnt])!=devAddr)) continue;
690 if ( (desc.idProduct == USB_STLINK_32L_PID) || (desc.idProduct == USB_STLINK_NUCLEO_PID) ){
691 if ((p_usb_iserial != NULL)){
692 unsigned char buffer[13];
693 struct libusb_device_handle* handle;
694 libusb_open(list[cnt], &handle);
695 libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, buffer, 13);
696 libusb_close(handle);
697 if (memcmp(p_usb_iserial,&buffer,12) == 0){
706 if (desc.idProduct == USB_STLINK_PID) {
713 WLOG ("Couldn't find %s ST-Link/V2 devices\n",(devBus && devAddr)?"matched":"any");
716 int error = libusb_open(list[cnt], &slu->usb_handle);
718 WLOG("Error %d (%s) opening ST-Link/V2 device %03d:%03d\n",
719 error, strerror (errno), libusb_get_bus_number(list[cnt]), libusb_get_device_address(list[cnt]));
724 libusb_free_device_list(list, 1);
727 if (libusb_kernel_driver_active(slu->usb_handle, 0) == 1) {
730 r = libusb_detach_kernel_driver(slu->usb_handle, 0);
732 WLOG("libusb_detach_kernel_driver(() error %s\n", strerror(-r));
733 goto on_libusb_error;
737 if (libusb_get_configuration(slu->usb_handle, &config)) {
738 /* this may fail for a previous configured device */
739 WLOG("libusb_get_configuration()\n");
740 goto on_libusb_error;
744 printf("setting new configuration (%d -> 1)\n", config);
745 if (libusb_set_configuration(slu->usb_handle, 1)) {
746 /* this may fail for a previous configured device */
747 WLOG("libusb_set_configuration() failed\n");
748 goto on_libusb_error;
752 if (libusb_claim_interface(slu->usb_handle, 0)) {
753 WLOG("libusb_claim_interface() failed\n");
754 goto on_libusb_error;
757 // TODO - could use the scanning techniq from stm8 code here...
758 slu->ep_rep = 1 /* ep rep */ | LIBUSB_ENDPOINT_IN;
759 if (desc.idProduct == USB_STLINK_NUCLEO_PID) {
760 slu->ep_req = 1 /* ep req */ | LIBUSB_ENDPOINT_OUT;
762 slu->ep_req = 2 /* ep req */ | LIBUSB_ENDPOINT_OUT;
765 slu->sg_transfer_idx = 0;
766 // TODO - never used at the moment, always CMD_SIZE
767 slu->cmd_len = (slu->protocoll == 1)? STLINK_SG_SIZE: STLINK_CMD_SIZE;
771 if (stlink_current_mode(sl) == STLINK_DEV_DFU_MODE) {
772 ILOG("-- exit_dfu_mode\n");
773 stlink_exit_dfu_mode(sl);
776 if (stlink_current_mode(sl) != STLINK_DEV_DEBUG_MODE) {
777 stlink_enter_swd_mode(sl);
785 error = stlink_load_device_params(sl);
789 libusb_free_device_list(devs, 1);
802 libusb_exit(slu->libusb_ctx);
803 if (sl != NULL) free(sl);
804 if (slu != NULL) free(slu);