diff --git a/src/jtag/drivers/cmsis_dap_usb.c b/src/jtag/drivers/cmsis_dap_usb.c
index 14a23d4421511a3f6a81f05382e378009ca5a3ba..5f029f979c43e794c9d8a259a3559ba1c672cc2e 100644
--- a/src/jtag/drivers/cmsis_dap_usb.c
+++ b/src/jtag/drivers/cmsis_dap_usb.c
@@ -62,6 +62,7 @@
 static uint16_t cmsis_dap_vid[MAX_USB_IDS + 1] = { 0 };
 static uint16_t cmsis_dap_pid[MAX_USB_IDS + 1] = { 0 };
 static wchar_t *cmsis_dap_serial;
+static char *cmsis_dap_path;
 static bool swd_mode;
 
 #define PACKET_SIZE       (64 + 1)	/* 64 bytes plus report id */
@@ -230,8 +231,10 @@ static int cmsis_dap_usb_open(void)
 	struct hid_device_info *devs, *cur_dev;
 	unsigned short target_vid, target_pid;
 	wchar_t *target_serial = NULL;
+	char *target_path = NULL;
 
 	bool found = false;
+	bool path_found = false;
 	bool serial_found = false;
 
 	target_vid = 0;
@@ -269,9 +272,19 @@ static int cmsis_dap_usb_open(void)
 		}
 
 		if (found) {
+			if( cmsis_dap_path ){
+				if( cur_dev->path
+				 && !strcmp(cur_dev->path, cmsis_dap_path)
+				){ 
+					LOG_INFO("Using CMSIS-DAP device with path '%s'", cmsis_dap_path);
+					path_found = true; 
+					break;
+				}
+			} else
 			/* we have found an adapter, so exit further checks */
 			/* check serial number matches if given */
-			if (cmsis_dap_serial != NULL) {
+			if( cmsis_dap_serial ){
+				LOG_INFO(">>> Considering CMSIS-DAP device with path '%s' <<<", cur_dev->path);
 				if ((cur_dev->serial_number != NULL) && wcscmp(cmsis_dap_serial, cur_dev->serial_number) == 0) {
 					serial_found = true;
 					break;
@@ -288,8 +301,12 @@ static int cmsis_dap_usb_open(void)
 	if (NULL != cur_dev) {
 		target_vid = cur_dev->vendor_id;
 		target_pid = cur_dev->product_id;
-		if (serial_found)
+		if( serial_found ){
 			target_serial = cmsis_dap_serial;
+		}
+		if( path_found ){
+			target_path = cmsis_dap_path;
+		}
 	}
 
 	hid_free_enumeration(devs);
@@ -304,7 +321,11 @@ static int cmsis_dap_usb_open(void)
 		return ERROR_FAIL;
 	}
 
-	dev = hid_open(target_vid, target_pid, target_serial);
+	if( target_path ){
+		dev = hid_open_path(target_path);
+	} else {
+		dev = hid_open(target_vid, target_pid, target_serial);
+	}
 
 	if (dev == NULL) {
 		LOG_ERROR("unable to open CMSIS-DAP device 0x%x:0x%x", target_vid, target_pid);
@@ -1745,6 +1766,20 @@ COMMAND_HANDLER(cmsis_dap_handle_serial_command)
 	return ERROR_OK;
 }
 
+COMMAND_HANDLER(cmsis_dap_handle_path_command)
+{
+	if (CMD_ARGC == 1) {
+		cmsis_dap_path = strdup(CMD_ARGV[0]);
+		if( !cmsis_dap_path ){
+			LOG_ERROR("unable to allocate memory");
+			return ERROR_OK;
+		}
+	} else {
+		LOG_ERROR("expected exactly one argument to cmsis_dap_path <usb-path>");
+	}
+	return ERROR_OK;
+}
+
 static const struct command_registration cmsis_dap_subcommand_handlers[] = {
 	{
 		.name = "info",
@@ -1785,6 +1820,13 @@ static const struct command_registration cmsis_dap_command_handlers[] = {
 		.help = "set the serial number of the adapter",
 		.usage = "serial_string",
 	},
+	{
+		.name = "cmsis_dap_path",
+		.handler = &cmsis_dap_handle_path_command,
+		.mode = COMMAND_CONFIG,
+		.help = "set the path of the adapter",
+		.usage = "path_string",
+	},
 	COMMAND_REGISTRATION_DONE
 };