This is an automated email from Gerrit.

"Tomas Vanek <van...@fbl.cz>" just uploaded a new patch set to Gerrit, which 
you can find at https://review.openocd.org/c/openocd/+/7107

-- gerrit

commit b65133505f8cf6936deac9cd398027ebbcfa56fc
Author: Tomas Vanek <van...@fbl.cz>
Date:   Tue Aug 2 09:16:21 2022 +0200

    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 <van...@fbl.cz>

diff --git a/src/jtag/drivers/kitprog.c b/src/jtag/drivers/kitprog.c
index 7122d57575..f800b7b92c 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;

-- 

Reply via email to