This is an automated email from Gerrit. "Samuel Dewan <samde...@me.com>" just uploaded a new patch set to Gerrit, which you can find at https://review.openocd.org/c/openocd/+/8033
-- gerrit commit ecf567039a997d9a8245e62eea94a5195970b6c0 Author: Samuel Dewan <samde...@me.com> Date: Fri Dec 1 14:16:22 2023 -0500 cmsis_dap_usb_hid: improve detection of probes with unusual report sizes 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 since it looks only the old "third generation" EDBG based programmers have 512 byte report sizes, and that 64 bytes will be more common in Microchip tools going forward. 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 <samde...@me.com> diff --git a/src/jtag/drivers/cmsis_dap_usb_hid.c b/src/jtag/drivers/cmsis_dap_usb_hid.c index 52dfd76165..203863a771 100644 --- a/src/jtag/drivers/cmsis_dap_usb_hid.c +++ b/src/jtag/drivers/cmsis_dap_usb_hid.c @@ -34,6 +34,35 @@ 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 */ + // 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); @@ -138,13 +167,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; --