From 6f29d9ecd1e1c856e9ed0bd87f2aa1dc2a45e9ac Mon Sep 17 00:00:00 2001 From: Gwenhael Goavec-Merou Date: Sun, 9 Mar 2025 08:37:29 +0100 Subject: [PATCH] ftdispi: fixed ft2232_spi_wr_and_rd: buffer is empty when transaction is read-only --- src/ftdispi.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/ftdispi.cpp b/src/ftdispi.cpp index 105a824..f32ace0 100644 --- a/src/ftdispi.cpp +++ b/src/ftdispi.cpp @@ -171,7 +171,7 @@ int FtdiSpi::ft2232_spi_wr_and_rd(//struct ftdi_spi *spi, const uint8_t * writearr, uint8_t * readarr) { // -3: for MPSSE instruction - const uint32_t max_xfer = ((readarr) ? _buffer_size : 4096); + const uint16_t max_xfer = ((readarr) ? _buffer_size : 4096); uint8_t buf[max_xfer]; uint8_t cmd[] = { static_cast(((readarr) ? (MPSSE_DO_READ | _rd_mode) : 0) | @@ -195,16 +195,18 @@ int FtdiSpi::ft2232_spi_wr_and_rd(//struct ftdi_spi *spi, * operations. */ while (len > 0) { - const uint32_t xfer = (len > max_xfer) ? max_xfer : len; - cmd[1] = ((xfer - 1) >> 0) & 0xff; - cmd[2] = ((xfer - 1) >> 8) & 0xff; + const uint16_t xfer = (len > max_xfer) ? max_xfer : len; + cmd[1] = static_cast(((xfer - 1) >> 0) & 0xff); + cmd[2] = static_cast(((xfer - 1) >> 8) & 0xff); + uint16_t xfer_len = 0; // 0 when read-only + mpsse_store(cmd, 3); if (writearr) { memcpy(buf, tx_ptr, xfer); tx_ptr += xfer; + xfer_len = xfer; } - - ret = mpsse_store(buf, xfer); + ret = mpsse_store(buf, xfer_len); if (ret) { printError("send_buf failed before read with error: " + std::string(ftdi_get_error_string(_ftdi)) + " (" +