jtag/drivers/kitprog: workaround serious firmware problem

Since commit 88f429ead0
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>
This commit is contained in:
Tomas Vanek 2022-08-02 09:16:21 +02:00 committed by Antonio Borneo
parent 1a9d991619
commit 65de7c95f4
1 changed files with 18 additions and 2 deletions

View File

@ -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;