libusb-compat: usbbus_bulk_read/write -> transfer

This commit is contained in:
Philippe Teuwen 2013-10-15 02:04:42 +02:00
parent a4129edb69
commit c2504e0825
4 changed files with 29 additions and 45 deletions

View File

@ -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);
}

View File

@ -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__

View File

@ -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;

View File

@ -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));