stlink_stat(sl, "core reset");
}
+// Arm-core reset -> halted state.
+
+void _stlink_sg_jtag_reset(stlink_t *sl, int value) {
+ struct stlink_libsg *sg = sl->backend_data;
+ clear_cdb(sg);
+ sg->cdb_cmd_blk[1] = STLINK_JTAG_DRIVE_NRST;
+ sg->cdb_cmd_blk[2] = (value)?0:1;
+ sl->q_len = 3;
+ sg->q_addr = 2;
+ stlink_q(sl);
+ stlink_stat(sl, "core reset");
+}
+
// Arm-core status: halted or running.
void _stlink_sg_status(stlink_t *sl) {
_stlink_sg_exit_dfu_mode,
_stlink_sg_core_id,
_stlink_sg_reset,
+ _stlink_sg_jtag_reset,
_stlink_sg_run,
_stlink_sg_status,
_stlink_sg_version,
if (slsg->usb_handle == NULL) {
WLOG("Failed to find an stlink v1 by VID:PID\n");
libusb_close(slsg->usb_handle);
+ libusb_exit(slsg->libusb_ctx);
free(sl);
free(slsg);
return NULL;
if (r < 0) {
WLOG("libusb_detach_kernel_driver(() error %s\n", strerror(-r));
libusb_close(slsg->usb_handle);
+ libusb_exit(slsg->libusb_ctx);
free(sl);
free(slsg);
return NULL;
/* this may fail for a previous configured device */
WLOG("libusb_get_configuration()\n");
libusb_close(slsg->usb_handle);
+ libusb_exit(slsg->libusb_ctx);
free(sl);
free(slsg);
return NULL;
/* this may fail for a previous configured device */
WLOG("libusb_set_configuration() failed\n");
libusb_close(slsg->usb_handle);
+ libusb_exit(slsg->libusb_ctx);
free(sl);
free(slsg);
return NULL;
if (libusb_claim_interface(slsg->usb_handle, 0)) {
WLOG("libusb_claim_interface() failed\n");
libusb_close(slsg->usb_handle);
+ libusb_exit(slsg->libusb_ctx);
free(sl);
free(slsg);
return NULL;