From 65de7c95f41e78746dc41e6173bbee4106a758f9 Mon Sep 17 00:00:00 2001 From: Tomas Vanek Date: Tue, 2 Aug 2022 09:16:21 +0200 Subject: [PATCH] jtag/drivers/kitprog: workaround serious firmware problem Since commit 88f429ead019fd6df96ec15f0d897385f3cef0d0 5321: target/cortex_m: faster reading of all CPU registers debugging with a kitprog adapter freezes at debug entry. How to replicate: openocd -f interface/kitprog.cfg -f target/psoc4.cfg Connect to telnet server. Make sure the target is running: resume Halt the target: halt Without this patch OpenOCD freezes in kitprog_hid_command() in library call hid_write(). Reduce the number of SWD transactions sent in one USB bulk write as a workaround, simply use shorter buffer. For details see the comment in src/jtag/drivers/kitprog.c Change-Id: I0116894d5ebf1655f6011f0d35acdbbc178cd48c Signed-off-by: Tomas Vanek Reviewed-on: https://review.openocd.org/c/openocd/+/7107 Tested-by: jenkins Reviewed-by: Antonio Borneo --- src/jtag/drivers/kitprog.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/jtag/drivers/kitprog.c b/src/jtag/drivers/kitprog.c index 7122d5757..f800b7b92 100644 --- a/src/jtag/drivers/kitprog.c +++ b/src/jtag/drivers/kitprog.c @@ -79,8 +79,24 @@ #define HID_COMMAND_CONFIGURE 0x8f #define HID_COMMAND_BOOTLOADER 0xa0 -/* 512 bytes seems to work reliably */ -#define SWD_MAX_BUFFER_LENGTH 512 +/* 512 bytes seemed to work reliably. + * It works with both full queue of mostly reads or mostly writes. + * + * Unfortunately the commit 88f429ead019fd6df96ec15f0d897385f3cef0d0 + * 5321: target/cortex_m: faster reading of all CPU registers + * revealed a serious Kitprog firmware problem: + * If the queue contains more than 63 transactions in the repeated pattern + * one write, two reads, the firmware fails badly. + * Sending 64 transactions makes the adapter to loose the connection with the + * device. Sending 65 or more transactions causes the adapter to stop + * receiving USB HID commands, next kitprog_hid_command() stops in hid_write(). + * + * The problem was detected with KitProg v2.12 and v2.16. + * We can guess the problem is something like a buffer or stack overflow. + * + * Use shorter buffer as a workaround. 300 bytes (= 60 transactions) works. + */ +#define SWD_MAX_BUFFER_LENGTH 300 struct kitprog { hid_device *hid_handle;