Skip to content

Commit ecb22b2

Browse files
committed
ftdispi: ft2232_spi_wr_and_rd: use dedicated buffer for MPSSE command to
avoid overflow. Simplify code, improve error message (issue #524 and
1 parent 5644850 commit ecb22b2

File tree

1 file changed

+16
-19
lines changed

1 file changed

+16
-19
lines changed

src/ftdispi.cpp

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -168,15 +168,18 @@ int FtdiSpi::ft2232_spi_wr_and_rd(//struct ftdi_spi *spi,
168168
uint32_t writecnt,
169169
const uint8_t * writearr, uint8_t * readarr)
170170
{
171-
uint32_t max_xfer = (readarr) ? _buffer_size : 4096;
171+
// -3: for MPSSE instruction
172+
const uint32_t max_xfer = ((readarr) ? _buffer_size : 4096);
172173
uint8_t buf[max_xfer];
173-
int i = 0;
174+
uint8_t cmd[] = {
175+
static_cast<uint8_t>(((readarr) ? (MPSSE_DO_READ | _rd_mode) : 0) |
176+
((writearr) ? (MPSSE_DO_WRITE | _wr_mode) : 0)),
177+
0, 0};
174178
int ret = 0;
175179

176180
uint8_t *rx_ptr = readarr;
177181
uint8_t *tx_ptr = (uint8_t *)writearr;
178182
uint32_t len = writecnt;
179-
uint32_t xfer;
180183

181184
if (_cs_mode == SPI_CS_AUTO) {
182185
clearCs();
@@ -190,33 +193,27 @@ int FtdiSpi::ft2232_spi_wr_and_rd(//struct ftdi_spi *spi,
190193
* operations.
191194
*/
192195
while (len > 0) {
193-
xfer = (len > max_xfer) ? max_xfer : len;
194-
195-
buf[i++] = ((readarr) ? (MPSSE_DO_READ | _rd_mode) : 0) |
196-
((writearr) ? (MPSSE_DO_WRITE | _wr_mode) : 0);
197-
buf[i++] = (xfer - 1) & 0xff;
198-
buf[i++] = ((xfer - 1) >> 8) & 0xff;
196+
const uint32_t xfer = (len > max_xfer) ? max_xfer : len;
197+
cmd[1] = ((xfer - 1) >> 0) & 0xff;
198+
cmd[2] = ((xfer - 1) >> 8) & 0xff;
199+
mpsse_store(cmd, 3);
199200
if (writearr) {
200-
memcpy(buf + i, tx_ptr, xfer);
201+
memcpy(buf, tx_ptr, xfer);
201202
tx_ptr += xfer;
202-
i += xfer;
203203
}
204204

205-
ret = mpsse_store(buf, i);
205+
ret = mpsse_store(buf, xfer);
206206
if (ret)
207207
printf("send_buf failed before read: %i %s\n", ret, ftdi_get_error_string(_ftdi));
208-
i = 0;
209208
if (readarr) {
210-
//if (ret == 0) {
211209
ret = mpsse_read(rx_ptr, xfer);
212-
if ((uint32_t)ret != xfer)
213-
printf("get_buf failed: %i\n", ret);
214-
//}
210+
if (ret < 0)
211+
printf("get_buf failed: %i %s\n", ret, ftdi_get_error_string(_ftdi));
215212
rx_ptr += xfer;
216213
} else {
217214
ret = mpsse_write();
218-
if ((uint32_t)ret != xfer+3)
219-
printf("error %d %d\n", ret, i);
215+
if (ret < 0)
216+
printf("error: %i %s\n", ret, ftdi_get_error_string(_ftdi));
220217
}
221218
len -= xfer;
222219

0 commit comments

Comments
 (0)