gs_libusb icon indicating copy to clipboard operation
gs_libusb copied to clipboard

Timeout error is retryable

Open CTurt opened this issue 5 years ago • 0 comments

do_raw_read and do_write fail after a timeout, but it will often succeed if retried once more:

Changing these functions to loop on LIBUSB_ERROR_TIMEOUT makes the library much more stable:

uint8_t do_raw_read(gscomms * g) {
  unsigned char data;

  int rc;

  do {
    rc = libusb_control_transfer(
          g->dev,
          REQTYPE_READ,
          REQ_MOS_READ,
          MOS_PORT_BASE,
          MOS_PP_STATUS_REG,
          &data,
          1,
          TIMEOUT);

    if (rc != 1) {
        fprintf(stderr, "read failed: %s\n", libusb_error_name(rc));
    }
  } while(rc == LIBUSB_ERROR_TIMEOUT);

  return data;
}

void do_write(gscomms * g, uint8_t data,int flagged) {
  uint8_t flagged_data = (flagged ? 0x10 : 0) | (data & 0xf);
  
  int rc;

  do {
    rc = libusb_control_transfer(
          g->dev,
          REQTYPE_WRITE,
          REQ_MOS_WRITE,
          MOS_PORT_BASE | flagged_data,
          MOS_PP_DATA_REG,
          NULL,
          0,
          TIMEOUT);

      if(rc != 0) {
       fprintf(stderr, "write failed: %s\n", libusb_error_name(rc));
      }
  } while (rc == LIBUSB_ERROR_TIMEOUT); 
}

CTurt avatar Feb 29 '20 23:02 CTurt