Skip to content

Commit

Permalink
cmsis_dap_usb_hid: improve detection of probes with unusual report sizes
Browse files Browse the repository at this point in the history
Currently all Atmel CMSIS-DAP interfaces are assumed to have 512 byte
reports except for the mEDBG (found on Xplained Mini boards) and the nEDBG
(found on Curiosity Nano boards). This check is far from exaustive and it
results in some Microchip programmers (like the MPLAB Snap and PICkit 4)
not working correctly with OpenOCD.

Instead of assuming that Atmel programmers have 512 byte reports unless we
know otherwise, this commit flips the logic around. Only the older "third
generation" EDBG based programmers have 512 byte report sizes, and that 64
bytes will be more common in Microchip tools going forward.

The list of PIDs for 3rd generation Microchip programmers comes from
toolinfo.py from Microchip's pyedbglib.

This commit adds a more generic "quirks" list that will allow programmers
with unusual report sizes to be added easily in the future.

Change-Id: Ic39a4bdcd67c4c93d5707657c6ee5d216bc4437a
Signed-off-by: Samuel Dewan <[email protected]>
Reviewed-on: https://review.openocd.org/c/openocd/+/8033
Tested-by: jenkins
Reviewed-by: Tomas Vanek <[email protected]>
  • Loading branch information
samueldewan authored and tom-van committed Dec 15, 2023
1 parent c1ae95f commit 3413ae6
Showing 1 changed file with 38 additions and 6 deletions.
44 changes: 38 additions & 6 deletions src/jtag/drivers/cmsis_dap_usb_hid.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,36 @@ struct cmsis_dap_backend_data {
hid_device *dev_handle;
};

struct cmsis_dap_report_size {
unsigned short vid;
unsigned short pid;
unsigned int report_size;
};

static const struct cmsis_dap_report_size report_size_quirks[] = {
/* Third gen Atmel tools use a report size of 512 */
/* This list of PIDs comes from toolinfo.py in Microchip's pyedbglib. */
// Atmel JTAG-ICE 3
{ .vid = 0x03eb, .pid = 0x2140, .report_size = 512 },
// Atmel-ICE
{ .vid = 0x03eb, .pid = 0x2141, .report_size = 512 },
// Atmel Power Debugger
{ .vid = 0x03eb, .pid = 0x2144, .report_size = 512 },
// EDBG (found on Xplained Pro boards)
{ .vid = 0x03eb, .pid = 0x2111, .report_size = 512 },
// Zero (???)
{ .vid = 0x03eb, .pid = 0x2157, .report_size = 512 },
// EDBG with Mass Storage (found on Xplained Pro boards)
{ .vid = 0x03eb, .pid = 0x2169, .report_size = 512 },
// Commercially available EDBG (for third-party use)
{ .vid = 0x03eb, .pid = 0x216a, .report_size = 512 },
// Kraken (???)
{ .vid = 0x03eb, .pid = 0x2170, .report_size = 512 },

{ .vid = 0, .pid = 0, .report_size = 0 }
};


static void cmsis_dap_hid_close(struct cmsis_dap *dap);
static int cmsis_dap_hid_alloc(struct cmsis_dap *dap, unsigned int pkt_sz);
static void cmsis_dap_hid_free(struct cmsis_dap *dap);
Expand Down Expand Up @@ -139,13 +169,15 @@ static int cmsis_dap_hid_open(struct cmsis_dap *dap, uint16_t vids[], uint16_t p

unsigned int packet_size = 64;

/* atmel cmsis-dap uses 512 byte reports */
/* except when it doesn't e.g. with mEDBG on SAMD10 Xplained
* board */
/* Check for adapters that are known to have unusual report lengths. */
for (i = 0; report_size_quirks[i].vid != 0; i++) {
if (report_size_quirks[i].vid == target_vid &&
report_size_quirks[i].pid == target_pid) {
packet_size = report_size_quirks[i].report_size;
}
}
/* TODO: HID report descriptor should be parsed instead of
* hardcoding a match by VID */
if (target_vid == 0x03eb && target_pid != 0x2145 && target_pid != 0x2175)
packet_size = 512;
* hardcoding a match by VID/PID */

dap->bdata->dev_handle = dev;

Expand Down

0 comments on commit 3413ae6

Please sign in to comment.