jtag/drivers/cmsis_dap: use oocd_libusb_dev_mem_alloc() helper
On some systems (at least Windows/CYGWIN and macOS) libusb_dev_mem_alloc()
simply returns NULL. The helper can fall-back to malloc() to allocate
CMSIS-DAP pending command/response buffers.
Fixes: fd75e9e542
(jtag/drivers/cmsis_dap_bulk: use asynchronous libusb transfer)
Signed-off-by: Tomas Vanek <vanekt@fbl.cz>
Change-Id: I89660f6747ad9d494b8192711cbbee5764e058fa
Reviewed-on: https://review.openocd.org/c/openocd/+/8044
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
Tested-by: jenkins
This commit is contained in:
parent
ed00ee9ce0
commit
09f0d04e7f
|
@ -33,12 +33,6 @@
|
||||||
#include "cmsis_dap.h"
|
#include "cmsis_dap.h"
|
||||||
#include "libusb_helper.h"
|
#include "libusb_helper.h"
|
||||||
|
|
||||||
#if !defined(LIBUSB_API_VERSION) || (LIBUSB_API_VERSION < 0x01000105) \
|
|
||||||
|| defined(_WIN32) || defined(__CYGWIN__)
|
|
||||||
#define libusb_dev_mem_alloc(dev, sz) malloc(sz)
|
|
||||||
#define libusb_dev_mem_free(dev, buffer, sz) free(buffer)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
CMSIS_DAP_TRANSFER_PENDING = 0, /* must be 0, used in libusb_handle_events_completed */
|
CMSIS_DAP_TRANSFER_PENDING = 0, /* must be 0, used in libusb_handle_events_completed */
|
||||||
CMSIS_DAP_TRANSFER_IDLE,
|
CMSIS_DAP_TRANSFER_IDLE,
|
||||||
|
@ -599,33 +593,34 @@ static int cmsis_dap_usb_alloc(struct cmsis_dap *dap, unsigned int pkt_sz)
|
||||||
dap->command = dap->packet_buffer;
|
dap->command = dap->packet_buffer;
|
||||||
dap->response = dap->packet_buffer;
|
dap->response = dap->packet_buffer;
|
||||||
|
|
||||||
|
struct cmsis_dap_backend_data *bdata = dap->bdata;
|
||||||
for (unsigned int i = 0; i < MAX_PENDING_REQUESTS; i++) {
|
for (unsigned int i = 0; i < MAX_PENDING_REQUESTS; i++) {
|
||||||
dap->bdata->command_transfers[i].buffer =
|
bdata->command_transfers[i].buffer =
|
||||||
libusb_dev_mem_alloc(dap->bdata->dev_handle, pkt_sz);
|
oocd_libusb_dev_mem_alloc(bdata->dev_handle, pkt_sz);
|
||||||
if (!dap->bdata->command_transfers[i].buffer) {
|
|
||||||
LOG_ERROR("unable to allocate CMSIS-DAP packet buffer");
|
bdata->response_transfers[i].buffer =
|
||||||
return ERROR_FAIL;
|
oocd_libusb_dev_mem_alloc(bdata->dev_handle, pkt_sz);
|
||||||
}
|
|
||||||
dap->bdata->response_transfers[i].buffer =
|
if (!bdata->command_transfers[i].buffer
|
||||||
libusb_dev_mem_alloc(dap->bdata->dev_handle, pkt_sz);
|
|| !bdata->response_transfers[i].buffer) {
|
||||||
if (!dap->bdata->response_transfers[i].buffer) {
|
LOG_ERROR("unable to allocate CMSIS-DAP pending packet buffer");
|
||||||
LOG_ERROR("unable to allocate CMSIS-DAP packet buffer");
|
|
||||||
return ERROR_FAIL;
|
return ERROR_FAIL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cmsis_dap_usb_free(struct cmsis_dap *dap)
|
static void cmsis_dap_usb_free(struct cmsis_dap *dap)
|
||||||
{
|
{
|
||||||
|
struct cmsis_dap_backend_data *bdata = dap->bdata;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < MAX_PENDING_REQUESTS; i++) {
|
for (unsigned int i = 0; i < MAX_PENDING_REQUESTS; i++) {
|
||||||
libusb_dev_mem_free(dap->bdata->dev_handle,
|
oocd_libusb_dev_mem_free(bdata->dev_handle,
|
||||||
dap->bdata->command_transfers[i].buffer, dap->packet_size);
|
bdata->command_transfers[i].buffer, dap->packet_size);
|
||||||
dap->bdata->command_transfers[i].buffer = NULL;
|
oocd_libusb_dev_mem_free(bdata->dev_handle,
|
||||||
libusb_dev_mem_free(dap->bdata->dev_handle,
|
bdata->response_transfers[i].buffer, dap->packet_size);
|
||||||
dap->bdata->response_transfers[i].buffer, dap->packet_size);
|
bdata->command_transfers[i].buffer = NULL;
|
||||||
dap->bdata->response_transfers[i].buffer = NULL;
|
bdata->response_transfers[i].buffer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
free(dap->packet_buffer);
|
free(dap->packet_buffer);
|
||||||
|
|
Loading…
Reference in New Issue