Skip to content

Commit ec902ab

Browse files
committed
esp_usb_jtag: added xfer method to handle/simplify libusb_bulk_transfer calls
1 parent f0e0962 commit ec902ab

File tree

2 files changed

+57
-53
lines changed

2 files changed

+57
-53
lines changed

src/esp_usb_jtag.cpp

Lines changed: 55 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -461,13 +461,8 @@ int esp_usb_jtag::writeTMS(const uint8_t *tms, uint32_t len,
461461
}
462462

463463
if (buffer_idx >= sizeof(buf) /*buf full*/ || i == len - 1 /*last*/) {
464-
int ret = libusb_bulk_transfer(dev_handle,
465-
/*endpoint*/ ESPUSBJTAG_WRITE_EP,
466-
/*data*/ buf,
467-
/*length*/ buffer_idx,
468-
/*transf.len*/ &transferred_length,
469-
/*timeout ms*/ ESPUSBJTAG_TIMEOUT_MS);
470-
if (ret != 0) {
464+
int ret = xfer(buf, NULL, buffer_idx);
465+
if (ret < 0) {
471466
cerr << "writeTMS: usb bulk write failed " << ret << endl;
472467
return -EXIT_FAILURE;
473468
}
@@ -509,14 +504,11 @@ int esp_usb_jtag::toggleClk(uint8_t tms, uint8_t tdi, uint32_t len)
509504
}
510505

511506
if (buffer_idx >= sizeof(buf) /*buf full*/ || i == len - 1 /*last*/) {
512-
int ret = libusb_bulk_transfer(dev_handle,
513-
/*endpoint*/ ESPUSBJTAG_WRITE_EP,
514-
/*data*/ buf,
515-
/*length*/ buffer_idx,
516-
/*transferred length*/ &transferred_length,
517-
/*timeout ms*/ ESPUSBJTAG_TIMEOUT_MS);
518-
if (ret != 0) {
519-
cerr << "toggleClk: usb bulk write failed " << ret << endl;
507+
int ret = xfer(buf, NULL, buffer_idx);
508+
if (ret < 0) {
509+
char mess[128];
510+
snprintf(mess, 256, "ESP USB Jtag: toggleClk failed with error %d", ret);
511+
printError(mess);
520512
return -EXIT_FAILURE;
521513
}
522514
cerr << "clk" << endl;
@@ -548,38 +540,58 @@ int esp_usb_jtag::setio(int srst, int tms, int tdi, int tck)
548540

549541
int esp_usb_jtag::flush()
550542
{
551-
uint8_t buf[1] = { (CMD_FLUSH<<3) | CMD_FLUSH };
552-
int transferred_length; // never used
553-
int ret = libusb_bulk_transfer(dev_handle,
554-
/*endpoint*/ ESPUSBJTAG_WRITE_EP,
555-
/*data*/ buf,
556-
/*length*/ sizeof(buf),
557-
/*transferred length*/ &transferred_length,
558-
/*timeout ms*/ ESPUSBJTAG_TIMEOUT_MS);
559-
if (ret != 0) {
560-
cerr << "flush: usb bulk write failed " << ret << endl;
543+
const uint8_t buf = (CMD_FLUSH << 4) | CMD_FLUSH;
544+
printInfo("flush");
545+
546+
if (xfer(&buf, NULL, 1) < 0) {
547+
printError("ESP USB Jtag: flush failed");
561548
return -EXIT_FAILURE;
562549
}
563-
cerr << "flush" << endl;
564550
return 0;
565551
}
566552

567553
void esp_usb_jtag::drain_in()
568554
{
569555
uint8_t dummy_rx[64];
570-
int transferred_length = 1;
571-
while(transferred_length > 0) {
572-
transferred_length = 0;
573-
libusb_bulk_transfer(dev_handle,
574-
/*endpoint*/ ESPUSBJTAG_READ_EP,
575-
/*data*/ dummy_rx,
576-
/*length*/ sizeof(dummy_rx),
577-
/*transferred length*/ &transferred_length,
578-
/*timeout ms*/ ESPUSBJTAG_TIMEOUT_MS);
579-
}
556+
int ret = 1;
557+
do {
558+
ret = xfer(NULL, dummy_rx, sizeof(dummy_rx));
559+
if (ret < 0) {
560+
printError("ESP USB Jtag drain_in failed");
561+
return;
562+
}
563+
} while(ret > 0);
580564
cerr << "drain_in" << endl;
581565
}
582566

567+
int esp_usb_jtag::xfer(const uint8_t *tx, uint8_t *rx, const uint16_t length)
568+
{
569+
char m[128];
570+
bool is_read = (rx != NULL), is_write = (tx != NULL);
571+
snprintf(m, 128, "xfer: rx: %d tx: %d length %d", is_read, is_write, length);
572+
printInfo(m);
573+
const unsigned char endpoint = (is_write) ? ESPUSBJTAG_WRITE_EP : ESPUSBJTAG_READ_EP;
574+
uint8_t *data = (is_write) ? (uint8_t *)tx : rx;
575+
if (is_write) {
576+
for (int i = 0; i < length; i++) {
577+
printf("%02x ", data[i]);
578+
}
579+
printf("\n");
580+
}
581+
int transferred_length = 0;
582+
int ret = libusb_bulk_transfer(dev_handle, endpoint, data, length,
583+
&transferred_length, ESPUSBJTAG_TIMEOUT_MS);
584+
585+
if (ret < 0) {
586+
char mess[128];
587+
snprintf(mess, 128, "xfer: usb bulk write failed with error %d", ret);
588+
printError(mess);
589+
return -EXIT_FAILURE;
590+
}
591+
592+
return (ret == 0) ? transferred_length : ret;
593+
}
594+
583595
// TODO
584596
// [ ] odd len
585597
// [ ] end (DR_SHIFT, IR_SHIFT)
@@ -637,13 +649,8 @@ int esp_usb_jtag::writeTDI(const uint8_t *tx, uint8_t *rx, uint32_t len, bool en
637649
for(int j = 0; j < tx_buffer_idx; j++)
638650
cerr << " " << std::hex << (int)tx_buf[j];
639651
cerr << endl;
640-
ret = libusb_bulk_transfer(dev_handle,
641-
/*endpoint*/ ESPUSBJTAG_WRITE_EP,
642-
/*data*/ tx_buf,
643-
/*length*/ tx_buffer_idx,
644-
/*transferred length*/ &transferred_length,
645-
/*timeout ms*/ ESPUSBJTAG_TIMEOUT_MS);
646-
if (ret != 0)
652+
ret = xfer(tx_buf, NULL, tx_buffer_idx);
653+
if (ret < 0)
647654
{
648655
cerr << "writeTDI: usb bulk write failed " << ret << endl;
649656
return -EXIT_FAILURE;
@@ -661,24 +668,19 @@ int esp_usb_jtag::writeTDI(const uint8_t *tx, uint8_t *rx, uint32_t len, bool en
661668
// read_byte_len = 1;
662669
int received_bytes = 0;
663670
while(received_bytes < read_byte_len) {
664-
ret = libusb_bulk_transfer(dev_handle,
665-
/*endpoint*/ ESPUSBJTAG_READ_EP,
666-
/*data*/ &(rx[(i>>3)+received_bytes]),
667-
/*length*/ read_byte_len-received_bytes,
668-
/*transferred length*/ &transferred_length,
669-
/*timeout ms*/ ESPUSBJTAG_TIMEOUT_MS);
670-
if (ret != 0) {
671+
ret = xfer(NULL, &(rx[(i>>3)+received_bytes]), read_byte_len - received_bytes);
672+
if (ret < 0) {
671673
cerr << "writeTDI: usb bulk read failed " << ret << endl;
672674
// return -EXIT_FAILURE;
673675
break;
674676
}
675677
cerr << "writeTDI read" << endl;
676-
if (read_byte_len != transferred_length) {
677-
cerr << "writeTDI: usb bulk read expected=" << read_byte_len << " received=" << transferred_length << endl;
678+
if (read_byte_len != ret) {
679+
cerr << "writeTDI: usb bulk read expected=" << read_byte_len << " received=" << ret << endl;
678680
// return -EXIT_FAILURE;
679681
break;
680682
}
681-
received_bytes += transferred_length;
683+
received_bytes += ret;
682684
}
683685
tx_buffer_idx = 0; // reset
684686
bits_in_tx_buf = 0;

src/esp_usb_jtag.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ class esp_usb_jtag : public JtagInterface {
4343
int flush() override;
4444

4545
private:
46+
int xfer(const uint8_t *tx, uint8_t *rx, uint16_t length);
47+
4648
int8_t _verbose;
4749

4850
// int sendBitBang(uint8_t mask, uint8_t val, uint8_t *read, bool last);

0 commit comments

Comments
 (0)