From 397fbd5749f9a1999b5ad0fb35b20e54a50a5341 Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Thu, 21 Oct 2021 17:51:28 +0200 Subject: [PATCH] cmsis: Only cmsis internal use must differentiate between HID and Bulk access Missing DAP_SWD_SEQUENCE may eventually need a distinction visible from outside later. --- src/platforms/hosted/bmp_libusb.c | 10 +++------ src/platforms/hosted/cmsis_dap.c | 23 +++++++++++++------- src/platforms/hosted/platform.c | 36 +++++++++++-------------------- src/platforms/hosted/platform.h | 3 +-- 4 files changed, 31 insertions(+), 41 deletions(-) diff --git a/src/platforms/hosted/bmp_libusb.c b/src/platforms/hosted/bmp_libusb.c index b14dce09..d2949320 100644 --- a/src/platforms/hosted/bmp_libusb.c +++ b/src/platforms/hosted/bmp_libusb.c @@ -91,13 +91,9 @@ static bmp_type_t find_cmsis_dap_interface(libusb_device *dev,bmp_info_t *info) if (!strstr(interface_string, "CMSIS")) { continue; } + type = BMP_TYPE_CMSIS_DAP; - if (interface->bInterfaceClass == 0x03) { - type = BMP_TYPE_CMSIS_DAP_V1; - - } else if (interface->bInterfaceClass == 0xff && interface->bNumEndpoints == 2) { - type = BMP_TYPE_CMSIS_DAP_V2; - + if (interface->bInterfaceClass == 0xff && interface->bNumEndpoints == 2) { info->interface_num = interface->bInterfaceNumber; for (int j = 0; j < interface->bNumEndpoints; j++) { @@ -228,7 +224,7 @@ int find_debuggers(BMP_CL_OPTIONS_t *cl_opts,bmp_info_t *info) ((type = find_cmsis_dap_interface(dev, info)) != BMP_TYPE_NONE)) { /* find_cmsis_dap_interface has set valid type*/ } else if ((strstr(manufacturer, "CMSIS")) || (strstr(product, "CMSIS"))) { - type = BMP_TYPE_CMSIS_DAP_V1; + type = BMP_TYPE_CMSIS_DAP; } else if (desc.idVendor == VENDOR_ID_STLINK) { if ((desc.idProduct == PRODUCT_ID_STLINKV2) || (desc.idProduct == PRODUCT_ID_STLINKV21) || diff --git a/src/platforms/hosted/cmsis_dap.c b/src/platforms/hosted/cmsis_dap.c index 002c44a4..c06ef9e2 100644 --- a/src/platforms/hosted/cmsis_dap.c +++ b/src/platforms/hosted/cmsis_dap.c @@ -45,8 +45,13 @@ uint8_t dap_caps; uint8_t mode; +typedef enum cmsis_type_s { + CMSIS_TYPE_NONE = 0, + CMSIS_TYPE_HID, + CMSIS_TYPE_BULK +} cmsis_type_t; /*- Variables ---------------------------------------------------------------*/ -static bmp_type_t type; +static cmsis_type_t type; static libusb_device_handle *usb_handle = NULL; static uint8_t in_ep; static uint8_t out_ep; @@ -58,10 +63,11 @@ static bool has_swd_sequence = false; /* LPC845 Breakout Board Rev. 0 report invalid response with > 65 bytes */ int dap_init(bmp_info_t *info) { - type = info->bmp_type; + type = (info->in_ep && info->out_ep) ? CMSIS_TYPE_BULK : CMSIS_TYPE_HID; int size; - if (type == BMP_TYPE_CMSIS_DAP_V1) { + if (type == CMSIS_TYPE_HID) { + DEBUG_INFO("Using hid transfer\n"); if (hid_init()) return -1; size = strlen(info->serial); @@ -79,7 +85,8 @@ int dap_init(bmp_info_t *info) handle = hid_open(info->vid, info->pid, (serial[0]) ? serial : NULL); if (!handle) return -1; - } else if (type == BMP_TYPE_CMSIS_DAP_V2) { + } else if (type == CMSIS_TYPE_BULK) { + DEBUG_INFO("Using bulk transfer\n"); usb_handle = libusb_open_device_with_vid_pid(info->libusb_ctx, info->vid, info->pid); if (!usb_handle) { DEBUG_WARN("WARN: libusb_open_device_with_vid_pid() failed\n"); @@ -175,12 +182,12 @@ static uint32_t dap_dp_read_reg(ADIv5_DP_t *dp, uint16_t addr) void dap_exit_function(void) { - if (type == BMP_TYPE_CMSIS_DAP_V1) { + if (type == CMSIS_TYPE_HID) { if (handle) { dap_disconnect(); hid_close(handle); } - } else if (type == BMP_TYPE_CMSIS_DAP_V2) { + } else if (type == CMSIS_TYPE_BULK) { if (usb_handle) { dap_disconnect(); libusb_close(usb_handle); @@ -208,7 +215,7 @@ int dbg_dap_cmd(uint8_t *data, int size, int rsize) for(int i = 0; (i < 32) && (i < rsize + 1); i++) DEBUG_WIRE("%02x.", buffer[i]); DEBUG_WIRE("\n"); - if (type == BMP_TYPE_CMSIS_DAP_V1) { + if (type == CMSIS_TYPE_HID) { res = hid_write(handle, buffer, rsize + 1); if (res < 0) { DEBUG_WARN( "Error: %ls\n", hid_error(handle)); @@ -219,7 +226,7 @@ int dbg_dap_cmd(uint8_t *data, int size, int rsize) DEBUG_WARN( "debugger read(): %ls\n", hid_error(handle)); exit(-1); } - } else if (type == BMP_TYPE_CMSIS_DAP_V2) { + } else if (type == CMSIS_TYPE_BULK) { int transferred = 0; res = libusb_bulk_transfer(usb_handle, out_ep, buffer + 1, rsize, &transferred, 0); diff --git a/src/platforms/hosted/platform.c b/src/platforms/hosted/platform.c index df657d5f..4faed409 100644 --- a/src/platforms/hosted/platform.c +++ b/src/platforms/hosted/platform.c @@ -52,8 +52,7 @@ static void exit_function(void) { libusb_exit_function(&info); switch (info.bmp_type) { - case BMP_TYPE_CMSIS_DAP_V1: - case BMP_TYPE_CMSIS_DAP_V2: + case BMP_TYPE_CMSIS_DAP: dap_exit_function(); break; default: @@ -93,8 +92,7 @@ void platform_init(int argc, char **argv) if (stlink_init( &info)) exit(-1); break; - case BMP_TYPE_CMSIS_DAP_V1: - case BMP_TYPE_CMSIS_DAP_V2: + case BMP_TYPE_CMSIS_DAP: if (dap_init( &info)) exit(-1); break; @@ -126,8 +124,7 @@ int platform_adiv5_swdp_scan(uint32_t targetid) switch (info.bmp_type) { case BMP_TYPE_BMP: case BMP_TYPE_LIBFTDI: - case BMP_TYPE_CMSIS_DAP_V1: - case BMP_TYPE_CMSIS_DAP_V2: + case BMP_TYPE_CMSIS_DAP: return adiv5_swdp_scan(targetid); break; case BMP_TYPE_STLINKV2: @@ -156,8 +153,7 @@ int swdptap_init(ADIv5_DP_t *dp) switch (info.bmp_type) { case BMP_TYPE_BMP: return remote_swdptap_init(dp); - case BMP_TYPE_CMSIS_DAP_V1: - case BMP_TYPE_CMSIS_DAP_V2: + case BMP_TYPE_CMSIS_DAP: return dap_swdptap_init(dp); case BMP_TYPE_STLINKV2: case BMP_TYPE_JLINK: @@ -184,8 +180,7 @@ int platform_jtag_scan(const uint8_t *lrlens) case BMP_TYPE_BMP: case BMP_TYPE_LIBFTDI: case BMP_TYPE_JLINK: - case BMP_TYPE_CMSIS_DAP_V1: - case BMP_TYPE_CMSIS_DAP_V2: + case BMP_TYPE_CMSIS_DAP: return jtag_scan(lrlens); case BMP_TYPE_STLINKV2: return jtag_scan_stlinkv2(&info, lrlens); @@ -206,8 +201,7 @@ int platform_jtagtap_init(void) return libftdi_jtagtap_init(&jtag_proc); case BMP_TYPE_JLINK: return jlink_jtagtap_init(&info, &jtag_proc); - case BMP_TYPE_CMSIS_DAP_V1: - case BMP_TYPE_CMSIS_DAP_V2: + case BMP_TYPE_CMSIS_DAP: return cmsis_dap_jtagtap_init(&jtag_proc); default: return -1; @@ -226,8 +220,7 @@ void platform_adiv5_dp_defaults(ADIv5_DP_t *dp) return remote_adiv5_dp_defaults(dp); case BMP_TYPE_STLINKV2: return stlink_adiv5_dp_defaults(dp); - case BMP_TYPE_CMSIS_DAP_V1: - case BMP_TYPE_CMSIS_DAP_V2: + case BMP_TYPE_CMSIS_DAP: return dap_adiv5_dp_defaults(dp); default: break; @@ -243,8 +236,7 @@ int platform_jtag_dp_init(ADIv5_DP_t *dp) return 0; case BMP_TYPE_STLINKV2: return stlink_jtag_dp_init(dp); - case BMP_TYPE_CMSIS_DAP_V1: - case BMP_TYPE_CMSIS_DAP_V2: + case BMP_TYPE_CMSIS_DAP: return dap_jtag_dp_init(dp); default: return 0; @@ -263,10 +255,8 @@ char *platform_ident(void) return "STLINKV2"; case BMP_TYPE_LIBFTDI: return "LIBFTDI"; - case BMP_TYPE_CMSIS_DAP_V1: - return "CMSIS_DAP_V1"; - case BMP_TYPE_CMSIS_DAP_V2: - return "CMSIS_DAP_V2"; + case BMP_TYPE_CMSIS_DAP: + return "CMSIS_DAP"; case BMP_TYPE_JLINK: return "JLINK"; } @@ -331,8 +321,7 @@ void platform_max_frequency_set(uint32_t freq) case BMP_TYPE_BMP: remote_max_frequency_set(freq); break; - case BMP_TYPE_CMSIS_DAP_V1: - case BMP_TYPE_CMSIS_DAP_V2: + case BMP_TYPE_CMSIS_DAP: dap_swj_clock(freq); break; case BMP_TYPE_LIBFTDI: @@ -363,8 +352,7 @@ uint32_t platform_max_frequency_get(void) switch (info.bmp_type) { case BMP_TYPE_BMP: return remote_max_frequency_get(); - case BMP_TYPE_CMSIS_DAP_V1: - case BMP_TYPE_CMSIS_DAP_V2: + case BMP_TYPE_CMSIS_DAP: return dap_swj_clock(0); break; case BMP_TYPE_LIBFTDI: diff --git a/src/platforms/hosted/platform.h b/src/platforms/hosted/platform.h index 80a29e2b..3ac453de 100644 --- a/src/platforms/hosted/platform.h +++ b/src/platforms/hosted/platform.h @@ -35,8 +35,7 @@ typedef enum bmp_type_s { BMP_TYPE_BMP, BMP_TYPE_STLINKV2, BMP_TYPE_LIBFTDI, - BMP_TYPE_CMSIS_DAP_V1, - BMP_TYPE_CMSIS_DAP_V2, + BMP_TYPE_CMSIS_DAP, BMP_TYPE_JLINK } bmp_type_t;