ftdiJtagMPSSE: improve a bit USB transaction

This commit is contained in:
Gwenhael Goavec-Merou 2021-09-18 14:54:40 +02:00
parent 57c0f16be4
commit 3698b98976
1 changed files with 29 additions and 9 deletions

View File

@ -230,6 +230,14 @@ int FtdiJtagMPSSE::writeTDI(uint8_t *tdi, uint8_t *tdo, uint32_t len, bool last)
throw std::exception(); throw std::exception();
} }
/* if only one full byte use BITMODE to reduce
* transaction size
*/
if (nb_byte == 1 && nb_bit == 0) {
nb_byte = 0;
nb_bit = 8;
}
while (nb_byte != 0) { while (nb_byte != 0) {
int xfer_len = (nb_byte > xfer) ? xfer : nb_byte; int xfer_len = (nb_byte > xfer) ? xfer : nb_byte;
tx_buf[1] = (((xfer_len - 1) ) & 0xff); // low tx_buf[1] = (((xfer_len - 1) ) & 0xff); // low
@ -245,13 +253,14 @@ int FtdiJtagMPSSE::writeTDI(uint8_t *tdi, uint8_t *tdo, uint32_t len, bool last)
} else if (_ch552WA) { } else if (_ch552WA) {
mpsse_write(); mpsse_write();
ftdi_read_data(_ftdi, c, xfer_len); ftdi_read_data(_ftdi, c, xfer_len);
} else { } else if (!last) {
mpsse_write(); mpsse_write();
} }
nb_byte -= xfer_len; nb_byte -= xfer_len;
} }
unsigned char last_bit = (tdi) ? *tx_ptr : 0; unsigned char last_bit = (tdi) ? *tx_ptr : 0;
bool double_write = true;
if (nb_bit != 0) { if (nb_bit != 0) {
display("%s read/write %d bit\n", __func__, nb_bit); display("%s read/write %d bit\n", __func__, nb_bit);
@ -262,8 +271,9 @@ int FtdiJtagMPSSE::writeTDI(uint8_t *tdi, uint8_t *tdo, uint32_t len, bool last)
display("%s last_bit %x size %d\n", __func__, last_bit, nb_bit-1); display("%s last_bit %x size %d\n", __func__, last_bit, nb_bit-1);
mpsse_store(last_bit); mpsse_store(last_bit);
} }
if (tdo) { if (tdo && !last) {
mpsse_read(rx_ptr, 1); mpsse_read(rx_ptr, 1);
double_write = false;
/* realign we have read nb_bit /* realign we have read nb_bit
* since LSB add bit by the left and shift * since LSB add bit by the left and shift
* we need to complete shift * we need to complete shift
@ -271,9 +281,15 @@ int FtdiJtagMPSSE::writeTDI(uint8_t *tdi, uint8_t *tdo, uint32_t len, bool last)
*rx_ptr >>= (8 - nb_bit); *rx_ptr >>= (8 - nb_bit);
display("%s %x\n", __func__, *rx_ptr); display("%s %x\n", __func__, *rx_ptr);
} else if (_ch552WA) { } else if (_ch552WA) {
mpsse_write(); if (tdo) {
ftdi_read_data(_ftdi, c, nb_bit); mpsse_read(rx_ptr, 1);
} else { double_write = false;
*rx_ptr >>= (8 - nb_bit);
} else {
mpsse_write();
ftdi_read_data(_ftdi, c, nb_bit);
}
} else if (!last) {
mpsse_write(); mpsse_write();
} }
} }
@ -298,11 +314,15 @@ int FtdiJtagMPSSE::writeTDI(uint8_t *tdi, uint8_t *tdo, uint32_t len, bool last)
// and to move to EXIT_XR TMS = 1 // and to move to EXIT_XR TMS = 1
mpsse_store(tx_buf, 3); mpsse_store(tx_buf, 3);
if (tdo) { if (tdo) {
unsigned char c; unsigned char c[2];
mpsse_read(&c, 1); int index = 0;
mpsse_read(c, 1 + ((double_write)?1:0));
if (double_write) {
*rx_ptr = c[index] >> (8-nb_bit);
index++;
}
/* in this case for 1 one it's always bit 7 */ /* in this case for 1 one it's always bit 7 */
*rx_ptr |= ((c & 0x80) << (7 - nb_bit)); *rx_ptr |= ((c[index] & 0x80) << (7 - nb_bit));
display("%s %x\n", __func__, c);
} else if (_ch552WA) { } else if (_ch552WA) {
mpsse_write(); mpsse_write();
ftdi_read_data(_ftdi, c, 1); ftdi_read_data(_ftdi, c, 1);