aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomas Vanek <vanekt@fbl.cz>2022-08-02 09:16:21 +0200
committerAntonio Borneo <borneo.antonio@gmail.com>2022-08-27 16:15:01 +0000
commit65de7c95f41e78746dc41e6173bbee4106a758f9 (patch)
tree4f395d2024494891872adf6854077bfa3c72e7dd
parent1a9d9916193ee7884d942b6119163557edc8dad2 (diff)
downloadriscv-openocd-65de7c95f41e78746dc41e6173bbee4106a758f9.zip
riscv-openocd-65de7c95f41e78746dc41e6173bbee4106a758f9.tar.gz
riscv-openocd-65de7c95f41e78746dc41e6173bbee4106a758f9.tar.bz2
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 <vanekt@fbl.cz> Reviewed-on: https://review.openocd.org/c/openocd/+/7107 Tested-by: jenkins Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
-rw-r--r--src/jtag/drivers/kitprog.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/jtag/drivers/kitprog.c b/src/jtag/drivers/kitprog.c
index 7122d57..f800b7b 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;