diff --git a/libnfc/buses/usbbus.c b/libnfc/buses/usbbus.c index ad77db2..e894340 100644 --- a/libnfc/buses/usbbus.c +++ b/libnfc/buses/usbbus.c @@ -617,33 +617,12 @@ int usbbus_set_configuration(usbbus_device_handle *dev, int configuration) int usbbus_get_string_simple(usbbus_device_handle *dev, int index, char *buf, size_t buflen) { return libusb_get_string_descriptor_ascii((libusb_device_handle *)dev, index & 0xff, - (unsigned char *) buf, (int) buflen); + (unsigned char *) buf, (int) buflen); } -static int usbbus_bulk_io(usbbus_device_handle *dev, int ep, unsigned char *bytes, - int size, int timeout) +int usbbus_bulk_transfer(usbbus_device_handle *dev, int ep, char *bytes, int size, int *actual_length, int timeout) { - int actual_length; - int r; - r = libusb_bulk_transfer((libusb_device_handle *)dev, ep & 0xff, bytes, size, - &actual_length, timeout); - - /* if we timed out but did transfer some data, report as successful short - * read. FIXME: is this how libusb-0.1 works? */ - if (r == 0 || (r == LIBUSB_ERROR_TIMEOUT && actual_length > 0)) - return actual_length; - - return r; -} - -int usbbus_bulk_read(usbbus_device_handle *dev, int ep, char *bytes, int size, int timeout) -{ - return usbbus_bulk_io(dev, ep, (unsigned char *) bytes, size, timeout); -} - -int usbbus_bulk_write(usbbus_device_handle *dev, int ep, const char *bytes, int size, int timeout) -{ - return usbbus_bulk_io(dev, ep, (unsigned char *)bytes, size, timeout); + return libusb_bulk_transfer((libusb_device_handle *)dev, ep & 0xff, (unsigned char *)bytes, size, actual_length, timeout); } int usbbus_claim_interface(usbbus_device_handle *dev, int interface) @@ -666,7 +645,7 @@ int usbbus_reset(usbbus_device_handle *dev) return libusb_reset_device((libusb_device_handle *)dev); } -const char * usbbus_strerror(int errcode) +const char *usbbus_strerror(int errcode) { return libusb_strerror((enum libusb_error)errcode); } diff --git a/libnfc/buses/usbbus.h b/libnfc/buses/usbbus.h index 8a642e3..abf71fc 100644 --- a/libnfc/buses/usbbus.h +++ b/libnfc/buses/usbbus.h @@ -163,13 +163,12 @@ usbbus_device_handle *usbbus_open(struct usbbus_device *dev); void usbbus_close(usbbus_device_handle *dev); int usbbus_set_configuration(usbbus_device_handle *dev, int configuration); int usbbus_get_string_simple(usbbus_device_handle *dev, int index, char *buf, size_t buflen); -int usbbus_bulk_read(usbbus_device_handle *dev, int ep, char *bytes, int size, int timeout); -int usbbus_bulk_write(usbbus_device_handle *dev, int ep, const char *bytes, int size, int timeout); +int usbbus_bulk_transfer(usbbus_device_handle *dev, int ep, char *bytes, int size, int *actual_length, int timeout); int usbbus_claim_interface(usbbus_device_handle *dev, int interface); int usbbus_release_interface(usbbus_device_handle *dev, int interface); int usbbus_set_interface_alt_setting(usbbus_device_handle *dev, int interface, int alternate); int usbbus_reset(usbbus_device_handle *dev); -const char * usbbus_strerror(int errcode); +const char *usbbus_strerror(int errcode); struct usbbus_bus *usbbus_get_busses(void); #endif // __NFC_BUS_USB_H__ diff --git a/libnfc/drivers/acr122_usb.c b/libnfc/drivers/acr122_usb.c index a2472e9..2abf4b7 100644 --- a/libnfc/drivers/acr122_usb.c +++ b/libnfc/drivers/acr122_usb.c @@ -217,10 +217,12 @@ static int acr122_usb_send_apdu(nfc_device *pnd, static int acr122_usb_bulk_read(struct acr122_usb_data *data, uint8_t abtRx[], const size_t szRx, const int timeout) { - int res = usbbus_bulk_read(data->pudh, data->uiEndPointIn, (char *) abtRx, szRx, timeout); - if (res > 0) { - LOG_HEX(NFC_LOG_GROUP_COM, "RX", abtRx, res); - } else if (res < 0) { + int actual_length; + int res = usbbus_bulk_transfer(data->pudh, data->uiEndPointIn, (char *) abtRx, szRx, &actual_length, timeout); + if (res == 0) { + LOG_HEX(NFC_LOG_GROUP_COM, "RX", abtRx, actual_length); + res = actual_length; + } else { if (res != USBBUS_ERROR_TIMEOUT) { res = NFC_EIO; log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to read from USB (%s)", usbbus_strerror(res)); @@ -235,13 +237,14 @@ static int acr122_usb_bulk_write(struct acr122_usb_data *data, uint8_t abtTx[], const size_t szTx, const int timeout) { LOG_HEX(NFC_LOG_GROUP_COM, "TX", abtTx, szTx); - int res = usbbus_bulk_write(data->pudh, data->uiEndPointOut, (char *) abtTx, szTx, timeout); - if (res > 0) { + int actual_length; + int res = usbbus_bulk_transfer(data->pudh, data->uiEndPointOut, (char *) abtTx, szTx, &actual_length, timeout); + if (res == 0) { // HACK This little hack is a well know problem of USB, see http://www.libusb.org/ticket/6 for more details - if ((res % data->uiMaxPacketSize) == 0) { - usbbus_bulk_write(data->pudh, data->uiEndPointOut, "\0", 0, timeout); + if ((actual_length > 0) && ((actual_length % data->uiMaxPacketSize) == 0)) { + usbbus_bulk_transfer(data->pudh, data->uiEndPointOut, "\0", 0, &actual_length, timeout); } - } else if (res < 0) { + } else { log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to write to USB (%s)", usbbus_strerror(res)); if (res == USBBUS_ERROR_TIMEOUT) { res = NFC_ETIMEOUT; diff --git a/libnfc/drivers/pn53x_usb.c b/libnfc/drivers/pn53x_usb.c index 87db2d8..44094f7 100644 --- a/libnfc/drivers/pn53x_usb.c +++ b/libnfc/drivers/pn53x_usb.c @@ -89,10 +89,12 @@ int pn53x_usb_init(nfc_device *pnd); static int pn53x_usb_bulk_read(struct pn53x_usb_data *data, uint8_t abtRx[], const size_t szRx, const int timeout) { - int res = usbbus_bulk_read(data->pudh, data->uiEndPointIn, (char *) abtRx, szRx, timeout); - if (res > 0) { - LOG_HEX(NFC_LOG_GROUP_COM, "RX", abtRx, res); - } else if (res < 0) { + int actual_length; + int res = usbbus_bulk_transfer(data->pudh, data->uiEndPointIn, (char *) abtRx, szRx, &actual_length, timeout); + if (res == 0) { + LOG_HEX(NFC_LOG_GROUP_COM, "RX", abtRx, actual_length); + res = actual_length; + } else { if (res != USBBUS_ERROR_TIMEOUT) log_put(NFC_LOG_GROUP_COM, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to read from USB (%s)", usbbus_strerror(res)); } @@ -103,11 +105,12 @@ static int pn53x_usb_bulk_write(struct pn53x_usb_data *data, uint8_t abtTx[], const size_t szTx, const int timeout) { LOG_HEX(NFC_LOG_GROUP_COM, "TX", abtTx, szTx); - int res = usbbus_bulk_write(data->pudh, data->uiEndPointOut, (char *) abtTx, szTx, timeout); - if (res > 0) { + int actual_length; + int res = usbbus_bulk_transfer(data->pudh, data->uiEndPointOut, (char *) abtTx, szTx, &actual_length, timeout); + if (res == 0) { // HACK This little hack is a well know problem of USB, see http://www.libusb.org/ticket/6 for more details - if ((res % data->uiMaxPacketSize) == 0) { - usbbus_bulk_write(data->pudh, data->uiEndPointOut, "\0", 0, timeout); + if ((actual_length > 0) && ((actual_length % data->uiMaxPacketSize) == 0)) { + usbbus_bulk_transfer(data->pudh, data->uiEndPointOut, "\0", 0, &actual_length, timeout); } } else { log_put(NFC_LOG_GROUP_COM, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to write to USB (%s)", usbbus_strerror(res));