gs_libusb
gs_libusb copied to clipboard
Timeout error is retryable
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);
}