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 void _stlink_usb_read_debug32(stlink_t *sl, uint32_t addr, uint32_t *data) {
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 *data = read_uint32(rdata, 4);
161 void _stlink_usb_write_debug32(stlink_t *sl, uint32_t addr, uint32_t data) {
162 struct stlink_libusb * const slu = sl->backend_data;
163 unsigned char* const rdata = sl->q_buf;
164 unsigned char* const cmd = sl->c_buf;
166 const int rep_len = 2;
168 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
169 cmd[i++] = STLINK_DEBUG_COMMAND;
170 cmd[i++] = STLINK_JTAG_WRITEDEBUG_32BIT;
171 write_uint32(&cmd[i], addr);
172 write_uint32(&cmd[i + 4], data);
173 size = send_recv(slu, 1, cmd, slu->cmd_len, rdata, rep_len);
175 printf("[!] send_recv\n");
180 void _stlink_usb_write_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
181 struct stlink_libusb * const slu = sl->backend_data;
182 unsigned char* const data = sl->q_buf;
183 unsigned char* const cmd = sl->c_buf;
185 int i = fill_command(sl, SG_DXFER_TO_DEV, len);
186 cmd[i++] = STLINK_DEBUG_COMMAND;
187 cmd[i++] = STLINK_DEBUG_WRITEMEM_32BIT;
188 write_uint32(&cmd[i], addr);
189 write_uint16(&cmd[i + 4], len);
190 send_only(slu, 0, cmd, slu->cmd_len);
192 send_only(slu, 1, data, len);
195 void _stlink_usb_write_mem8(stlink_t *sl, uint32_t addr, uint16_t len) {
196 struct stlink_libusb * const slu = sl->backend_data;
197 unsigned char* const data = sl->q_buf;
198 unsigned char* const cmd = sl->c_buf;
200 int i = fill_command(sl, SG_DXFER_TO_DEV, 0);
201 cmd[i++] = STLINK_DEBUG_COMMAND;
202 cmd[i++] = STLINK_DEBUG_WRITEMEM_8BIT;
203 write_uint32(&cmd[i], addr);
204 write_uint16(&cmd[i + 4], len);
205 send_only(slu, 0, cmd, slu->cmd_len);
206 send_only(slu, 1, data, len);
210 int _stlink_usb_current_mode(stlink_t * sl) {
211 struct stlink_libusb * const slu = sl->backend_data;
212 unsigned char* const cmd = sl->c_buf;
213 unsigned char* const data = sl->q_buf;
216 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
218 cmd[i++] = STLINK_GET_CURRENT_MODE;
219 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
221 printf("[!] send_recv\n");
227 void _stlink_usb_core_id(stlink_t * sl) {
228 struct stlink_libusb * const slu = sl->backend_data;
229 unsigned char* const cmd = sl->c_buf;
230 unsigned char* const data = sl->q_buf;
233 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
235 cmd[i++] = STLINK_DEBUG_COMMAND;
236 cmd[i++] = STLINK_DEBUG_READCOREID;
238 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
240 printf("[!] send_recv\n");
244 sl->core_id = read_uint32(data, 0);
247 void _stlink_usb_status(stlink_t * sl) {
248 struct stlink_libusb * const slu = sl->backend_data;
249 unsigned char* const data = sl->q_buf;
250 unsigned char* const cmd = sl->c_buf;
253 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
255 cmd[i++] = STLINK_DEBUG_COMMAND;
256 cmd[i++] = STLINK_DEBUG_GETSTATUS;
258 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
260 printf("[!] send_recv\n");
263 sl->q_len = (size_t) size;
266 void _stlink_usb_force_debug(stlink_t *sl) {
267 struct stlink_libusb *slu = sl->backend_data;
268 unsigned char* const data = sl->q_buf;
269 unsigned char* const cmd = sl->c_buf;
272 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
274 cmd[i++] = STLINK_DEBUG_COMMAND;
275 cmd[i++] = STLINK_DEBUG_FORCEDEBUG;
276 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
278 printf("[!] send_recv\n");
283 void _stlink_usb_enter_swd_mode(stlink_t * sl) {
284 struct stlink_libusb * const slu = sl->backend_data;
285 unsigned char* const cmd = sl->c_buf;
287 const int rep_len = 0;
288 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
290 cmd[i++] = STLINK_DEBUG_COMMAND;
291 cmd[i++] = STLINK_DEBUG_ENTER;
292 cmd[i++] = STLINK_DEBUG_ENTER_SWD;
294 size = send_only(slu, 1, cmd, slu->cmd_len);
296 printf("[!] send_recv\n");
301 void _stlink_usb_exit_dfu_mode(stlink_t* sl) {
302 struct stlink_libusb * const slu = sl->backend_data;
303 unsigned char* const cmd = sl->c_buf;
305 int i = fill_command(sl, SG_DXFER_FROM_DEV, 0);
307 cmd[i++] = STLINK_DFU_COMMAND;
308 cmd[i++] = STLINK_DFU_EXIT;
310 size = send_only(slu, 1, cmd, slu->cmd_len);
312 printf("[!] send_recv\n");
318 * TODO - not convinced this does anything...
321 void _stlink_usb_reset(stlink_t * sl) {
322 struct stlink_libusb * const slu = sl->backend_data;
323 unsigned char* const data = sl->q_buf;
324 unsigned char* const cmd = sl->c_buf;
327 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
329 cmd[i++] = STLINK_DEBUG_COMMAND;
330 cmd[i++] = STLINK_DEBUG_RESETSYS;
332 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
334 printf("[!] send_recv\n");
340 void _stlink_usb_jtag_reset(stlink_t * sl, int value) {
341 struct stlink_libusb * const slu = sl->backend_data;
342 unsigned char* const data = sl->q_buf;
343 unsigned char* const cmd = sl->c_buf;
346 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
348 cmd[i++] = STLINK_DEBUG_COMMAND;
349 cmd[i++] = STLINK_JTAG_DRIVE_NRST;
352 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
354 printf("[!] send_recv\n");
360 void _stlink_usb_step(stlink_t* sl) {
361 struct stlink_libusb * const slu = sl->backend_data;
362 unsigned char* const data = sl->q_buf;
363 unsigned char* const cmd = sl->c_buf;
366 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
368 cmd[i++] = STLINK_DEBUG_COMMAND;
369 cmd[i++] = STLINK_DEBUG_STEPCORE;
371 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
373 printf("[!] send_recv\n");
379 * This seems to do a good job of restarting things from the beginning?
382 void _stlink_usb_run(stlink_t* sl) {
383 struct stlink_libusb * const slu = sl->backend_data;
384 unsigned char* const data = sl->q_buf;
385 unsigned char* const cmd = sl->c_buf;
388 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
390 cmd[i++] = STLINK_DEBUG_COMMAND;
391 cmd[i++] = STLINK_DEBUG_RUNCORE;
393 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
395 printf("[!] send_recv\n");
400 void _stlink_usb_exit_debug_mode(stlink_t *sl) {
401 struct stlink_libusb * const slu = sl->backend_data;
402 unsigned char* const cmd = sl->c_buf;
404 int i = fill_command(sl, SG_DXFER_FROM_DEV, 0);
406 cmd[i++] = STLINK_DEBUG_COMMAND;
407 cmd[i++] = STLINK_DEBUG_EXIT;
409 size = send_only(slu, 1, cmd, slu->cmd_len);
411 printf("[!] send_only\n");
416 void _stlink_usb_read_mem32(stlink_t *sl, uint32_t addr, uint16_t len) {
417 struct stlink_libusb * const slu = sl->backend_data;
418 unsigned char* const data = sl->q_buf;
419 unsigned char* const cmd = sl->c_buf;
421 int i = fill_command(sl, SG_DXFER_FROM_DEV, len);
423 cmd[i++] = STLINK_DEBUG_COMMAND;
424 cmd[i++] = STLINK_DEBUG_READMEM_32BIT;
425 write_uint32(&cmd[i], addr);
426 write_uint16(&cmd[i + 4], len);
428 size = send_recv(slu, 1, cmd, slu->cmd_len, data, len);
430 printf("[!] send_recv\n");
434 sl->q_len = (size_t) size;
436 stlink_print_data(sl);
439 void _stlink_usb_read_all_regs(stlink_t *sl, reg *regp) {
440 struct stlink_libusb * const slu = sl->backend_data;
441 unsigned char* const cmd = sl->c_buf;
442 unsigned char* const data = sl->q_buf;
444 uint32_t rep_len = 84;
445 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
447 cmd[i++] = STLINK_DEBUG_COMMAND;
448 cmd[i++] = STLINK_DEBUG_READALLREGS;
449 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
451 printf("[!] send_recv\n");
454 sl->q_len = (size_t) size;
455 stlink_print_data(sl);
457 regp->r[i]= read_uint32(sl->q_buf, i*4);
458 regp->xpsr = read_uint32(sl->q_buf, 64);
459 regp->main_sp = read_uint32(sl->q_buf, 68);
460 regp->process_sp = read_uint32(sl->q_buf, 72);
461 regp->rw = read_uint32(sl->q_buf, 76);
462 regp->rw2 = read_uint32(sl->q_buf, 80);
466 DLOG("xpsr = 0x%08x\n", read_uint32(sl->q_buf, 64));
467 DLOG("main_sp = 0x%08x\n", read_uint32(sl->q_buf, 68));
468 DLOG("process_sp = 0x%08x\n", read_uint32(sl->q_buf, 72));
469 DLOG("rw = 0x%08x\n", read_uint32(sl->q_buf, 76));
470 DLOG("rw2 = 0x%08x\n", read_uint32(sl->q_buf, 80));
473 void _stlink_usb_read_reg(stlink_t *sl, int r_idx, reg *regp) {
474 struct stlink_libusb * const slu = sl->backend_data;
475 unsigned char* const data = sl->q_buf;
476 unsigned char* const cmd = sl->c_buf;
479 uint32_t rep_len = 4;
480 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
482 cmd[i++] = STLINK_DEBUG_COMMAND;
483 cmd[i++] = STLINK_DEBUG_READREG;
484 cmd[i++] = (uint8_t) r_idx;
485 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
487 printf("[!] send_recv\n");
490 sl->q_len = (size_t) size;
491 stlink_print_data(sl);
492 r = read_uint32(sl->q_buf, 0);
493 DLOG("r_idx (%2d) = 0x%08x\n", r_idx, r);
503 regp->process_sp = r;
506 regp->rw = r; /* XXX ?(primask, basemask etc.) */
509 regp->rw2 = r; /* XXX ?(primask, basemask etc.) */
516 /* See section C1.6 of the ARMv7-M Architecture Reference Manual */
517 void _stlink_usb_read_unsupported_reg(stlink_t *sl, int r_idx, reg *regp) {
520 sl->q_buf[0] = (unsigned char) r_idx;
521 for (int i = 1; i < 4; i++) {
525 _stlink_usb_write_mem32(sl, DCRSR, 4);
526 _stlink_usb_read_mem32(sl, DCRDR, 4);
528 r = read_uint32(sl->q_buf, 0);
529 DLOG("r_idx (%2d) = 0x%08x\n", r_idx, r);
533 regp->primask = (uint8_t) (r & 0xFF);
534 regp->basepri = (uint8_t) ((r>>8) & 0xFF);
535 regp->faultmask = (uint8_t) ((r>>16) & 0xFF);
536 regp->control = (uint8_t) ((r>>24) & 0xFF);
542 regp->s[r_idx - 0x40] = r;
547 void _stlink_usb_read_all_unsupported_regs(stlink_t *sl, reg *regp) {
548 _stlink_usb_read_unsupported_reg(sl, 0x14, regp);
549 _stlink_usb_read_unsupported_reg(sl, 0x21, regp);
551 for (int i = 0; i < 32; i++) {
552 _stlink_usb_read_unsupported_reg(sl, 0x40+i, regp);
556 /* See section C1.6 of the ARMv7-M Architecture Reference Manual */
557 void _stlink_usb_write_unsupported_reg(stlink_t *sl, uint32_t val, int r_idx, reg *regp) {
558 if (r_idx >= 0x1C && r_idx <= 0x1F) { /* primask, basepri, faultmask, or control */
559 /* These are held in the same register */
560 _stlink_usb_read_unsupported_reg(sl, 0x14, regp);
562 val = (uint8_t) (val>>24);
565 case 0x1C: /* control */
566 val = (((uint32_t) val) << 24) | (((uint32_t) regp->faultmask) << 16) | (((uint32_t) regp->basepri) << 8) | ((uint32_t) regp->primask);
568 case 0x1D: /* faultmask */
569 val = (((uint32_t) regp->control) << 24) | (((uint32_t) val) << 16) | (((uint32_t) regp->basepri) << 8) | ((uint32_t) regp->primask);
571 case 0x1E: /* basepri */
572 val = (((uint32_t) regp->control) << 24) | (((uint32_t) regp->faultmask) << 16) | (((uint32_t) val) << 8) | ((uint32_t) regp->primask);
574 case 0x1F: /* primask */
575 val = (((uint32_t) regp->control) << 24) | (((uint32_t) regp->faultmask) << 16) | (((uint32_t) regp->basepri) << 8) | ((uint32_t) val);
582 write_uint32(sl->q_buf, val);
584 _stlink_usb_write_mem32(sl, DCRDR, 4);
586 sl->q_buf[0] = (unsigned char) r_idx;
591 _stlink_usb_write_mem32(sl, DCRSR, 4);
594 void _stlink_usb_write_reg(stlink_t *sl, uint32_t reg, int idx) {
595 struct stlink_libusb * const slu = sl->backend_data;
596 unsigned char* const data = sl->q_buf;
597 unsigned char* const cmd = sl->c_buf;
599 uint32_t rep_len = 2;
600 int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
602 cmd[i++] = STLINK_DEBUG_COMMAND;
603 cmd[i++] = STLINK_DEBUG_WRITEREG;
605 write_uint32(&cmd[i], reg);
606 size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
608 printf("[!] send_recv\n");
611 sl->q_len = (size_t) size;
612 stlink_print_data(sl);
615 stlink_backend_t _stlink_usb_backend = {
617 _stlink_usb_exit_debug_mode,
618 _stlink_usb_enter_swd_mode,
619 NULL, // no enter_jtag_mode here...
620 _stlink_usb_exit_dfu_mode,
623 _stlink_usb_jtag_reset,
627 _stlink_usb_read_debug32,
628 _stlink_usb_read_mem32,
629 _stlink_usb_write_debug32,
630 _stlink_usb_write_mem32,
631 _stlink_usb_write_mem8,
632 _stlink_usb_read_all_regs,
633 _stlink_usb_read_reg,
634 _stlink_usb_read_all_unsupported_regs,
635 _stlink_usb_read_unsupported_reg,
636 _stlink_usb_write_unsupported_reg,
637 _stlink_usb_write_reg,
639 _stlink_usb_current_mode,
640 _stlink_usb_force_debug,
641 _stlink_usb_target_voltage
645 stlink_t* stlink_open_usb(const int verbose, int reset, char *p_usb_iserial) {
647 struct stlink_libusb* slu = NULL;
651 sl = malloc(sizeof (stlink_t));
652 slu = malloc(sizeof (struct stlink_libusb));
653 if (sl == NULL) goto on_error;
654 if (slu == NULL) goto on_error;
655 memset(sl, 0, sizeof (stlink_t));
656 memset(slu, 0, sizeof (struct stlink_libusb));
659 sl->backend = &_stlink_usb_backend;
660 sl->backend_data = slu;
662 sl->core_stat = STLINK_CORE_STAT_UNKNOWN;
663 if (libusb_init(&(slu->libusb_ctx))) {
664 WLOG("failed to init libusb context, wrong version of libraries?\n");
668 libusb_device **list;
669 int cnt = libusb_get_device_list(slu->libusb_ctx, &list);
670 struct libusb_device_descriptor desc;
674 char *device = getenv("STLINK_DEVICE");
676 char *c = strchr(device,':');
678 WLOG("STLINK_DEVICE must be <USB_BUS>:<USB_ADDR> format\n");
684 ILOG("bus %03d dev %03d\n",devBus, devAddr);
687 libusb_get_device_descriptor( list[cnt], &desc );
688 if (desc.idVendor!=USB_ST_VID) continue;
689 if (devBus && devAddr)
690 if ((libusb_get_bus_number(list[cnt])!=devBus) || (libusb_get_device_address(list[cnt])!=devAddr)) continue;
691 if ( (desc.idProduct == USB_STLINK_32L_PID) || (desc.idProduct == USB_STLINK_NUCLEO_PID) ){
692 if ((p_usb_iserial != NULL)){
693 unsigned char buffer[13];
694 struct libusb_device_handle* handle;
695 libusb_open(list[cnt], &handle);
696 libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, buffer, 13);
697 libusb_close(handle);
698 if (memcmp(p_usb_iserial,&buffer,12) == 0){
707 if (desc.idProduct == USB_STLINK_PID) {
714 WLOG ("Couldn't find %s ST-Link/V2 devices\n",(devBus && devAddr)?"matched":"any");
717 int error = libusb_open(list[cnt], &slu->usb_handle);
719 WLOG("Error %d (%s) opening ST-Link/V2 device %03d:%03d\n",
720 error, strerror (errno), libusb_get_bus_number(list[cnt]), libusb_get_device_address(list[cnt]));
725 libusb_free_device_list(list, 1);
728 if (libusb_kernel_driver_active(slu->usb_handle, 0) == 1) {
731 r = libusb_detach_kernel_driver(slu->usb_handle, 0);
733 WLOG("libusb_detach_kernel_driver(() error %s\n", strerror(-r));
734 goto on_libusb_error;
738 if (libusb_get_configuration(slu->usb_handle, &config)) {
739 /* this may fail for a previous configured device */
740 WLOG("libusb_get_configuration()\n");
741 goto on_libusb_error;
745 printf("setting new configuration (%d -> 1)\n", config);
746 if (libusb_set_configuration(slu->usb_handle, 1)) {
747 /* this may fail for a previous configured device */
748 WLOG("libusb_set_configuration() failed\n");
749 goto on_libusb_error;
753 if (libusb_claim_interface(slu->usb_handle, 0)) {
754 WLOG("libusb_claim_interface() failed\n");
755 goto on_libusb_error;
758 // TODO - could use the scanning techniq from stm8 code here...
759 slu->ep_rep = 1 /* ep rep */ | LIBUSB_ENDPOINT_IN;
760 if (desc.idProduct == USB_STLINK_NUCLEO_PID) {
761 slu->ep_req = 1 /* ep req */ | LIBUSB_ENDPOINT_OUT;
763 slu->ep_req = 2 /* ep req */ | LIBUSB_ENDPOINT_OUT;
766 slu->sg_transfer_idx = 0;
767 // TODO - never used at the moment, always CMD_SIZE
768 slu->cmd_len = (slu->protocoll == 1)? STLINK_SG_SIZE: STLINK_CMD_SIZE;
772 if (stlink_current_mode(sl) == STLINK_DEV_DFU_MODE) {
773 ILOG("-- exit_dfu_mode\n");
774 stlink_exit_dfu_mode(sl);
777 if (stlink_current_mode(sl) != STLINK_DEV_DEBUG_MODE) {
778 stlink_enter_swd_mode(sl);
786 error = stlink_load_device_params(sl);
799 libusb_exit(slu->libusb_ctx);
800 if (sl != NULL) free(sl);
801 if (slu != NULL) free(slu);