From f9a62b418bcbed51622d0bd18fbc0fb65bd8d527 Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Sun, 19 Sep 2021 17:28:41 +0200 Subject: [PATCH] ftdiJtagMPSSE: Fix TCK toggle for large numbers. --- src/ftdiJtagMPSSE.cpp | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/ftdiJtagMPSSE.cpp b/src/ftdiJtagMPSSE.cpp index cca8a41..2a34d0e 100644 --- a/src/ftdiJtagMPSSE.cpp +++ b/src/ftdiJtagMPSSE.cpp @@ -169,17 +169,24 @@ int FtdiJtagMPSSE::toggleClk(uint8_t tms, uint8_t tdi, uint32_t clk_len) if (_ftdi->type == TYPE_2232H || _ftdi->type == TYPE_4232H || _ftdi->type == TYPE_232H) { uint8_t buf[] = {static_cast(0x8f), 0, 0}; - if (clk_len > 8) { - buf[1] = ((len / 8) ) & 0xff; - buf[2] = ((len / 8) >> 8) & 0xff; - mpsse_store(buf, 3); - len %= 8; - } - - if (len > 0) { - buf[0] = 0x8E; - buf[1] = len - 1; - mpsse_store(buf, 2); + while (len) { + unsigned int chunk = len; + if (chunk > 0x10000 * 8) + chunk = 0x10000 * 8; + if (chunk > 8) { + unsigned cycles8 = chunk / 8; + len -= cycles8 * 8; + cycles8 --; + buf[1] = ((cycles8) ) & 0xff; + buf[2] = ((cycles8) >> 8) & 0xff; + mpsse_store(buf, 3); + } + if (len && len < 9) { + buf[0] = 0x8E; + buf[1] = len - 1; + mpsse_store(buf, 2); + len = 0; + } } ret = clk_len; } else {