fed42ccfd3
The hidapi cmsis-dap backend is using a packet_size of 64+1: 64 is the bMaxPacketSize0 and 1 is the hid Report-Id. In hidapi::hid_write(), the packet_size is decremented by 1 and stored for the next transfer. The packet_size is now valid bMaxPacketSize0=64, so when hid_read() is called, libusb_bulk_transfer() finishes w/o timeout. For the libusb bulk backend, the same packet_size of 64+1 is used, but there's no hid_write() to decrement and store it for the next read. So the next time a read is done, it will try to read 64+1 bytes. Fix this by putting the packet logic within each backend. Use calloc() to allocate the struct cmsis_dap to be on safer side. Change-Id: I0c450adbc7674d5fcd8208dd23062d5cdd209efd Signed-off-by: Adrian Negreanu <adrian.negreanu@nxp.com> Reviewed-on: http://openocd.zylin.com/5920 Tested-by: jenkins Reviewed-by: Tarek BOCHKATI <tarek.bouchkati@gmail.com> Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
37 lines
1021 B
C
37 lines
1021 B
C
#ifndef OPENOCD_JTAG_DRIVERS_CMSIS_DAP_H
|
|
#define OPENOCD_JTAG_DRIVERS_CMSIS_DAP_H
|
|
|
|
#include <stdint.h>
|
|
|
|
struct cmsis_dap_backend;
|
|
struct cmsis_dap_backend_data;
|
|
struct command_registration;
|
|
|
|
struct cmsis_dap {
|
|
struct cmsis_dap_backend_data *bdata;
|
|
const struct cmsis_dap_backend *backend;
|
|
uint16_t packet_size;
|
|
int packet_count;
|
|
uint8_t *packet_buffer;
|
|
uint16_t packet_buffer_size;
|
|
uint8_t caps;
|
|
uint8_t mode;
|
|
};
|
|
|
|
struct cmsis_dap_backend {
|
|
const char *name;
|
|
int (*open)(struct cmsis_dap *dap, uint16_t vids[], uint16_t pids[], char *serial);
|
|
void (*close)(struct cmsis_dap *dap);
|
|
int (*read)(struct cmsis_dap *dap, int timeout_ms);
|
|
int (*write)(struct cmsis_dap *dap, int len, int timeout_ms);
|
|
int (*packet_buffer_alloc)(struct cmsis_dap *dap, unsigned int pkt_sz);
|
|
};
|
|
|
|
extern const struct cmsis_dap_backend cmsis_dap_hid_backend;
|
|
extern const struct cmsis_dap_backend cmsis_dap_usb_backend;
|
|
extern const struct command_registration cmsis_dap_usb_subcommand_handlers[];
|
|
|
|
#define REPORT_ID_SIZE 1
|
|
|
|
#endif
|