@@ -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
549541int 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
567553void 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 ;
0 commit comments