X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Ffx2lafw%2Fprotocol.c;h=12fc9e2c061166405b494ad813c6c704d146d1fe;hb=2a8f2d41adcd0aa9e498c4eea2a5f82263039e5c;hp=e12fd0bd5a988ee210d3cb170fc59cdbd835c687;hpb=b9d530920fa97ab92d5f78f6f00a1ffc73259f2f;p=libsigrok.git diff --git a/src/hardware/fx2lafw/protocol.c b/src/hardware/fx2lafw/protocol.c index e12fd0bd..12fc9e2c 100644 --- a/src/hardware/fx2lafw/protocol.c +++ b/src/hardware/fx2lafw/protocol.c @@ -18,6 +18,7 @@ * along with this program. If not, see . */ +#include #include #include #include "protocol.h" @@ -38,6 +39,8 @@ struct cmd_start_acquisition { #pragma pack(pop) +#define USB_TIMEOUT 100 + static int command_get_fw_version(libusb_device_handle *devhdl, struct version_info *vi) { @@ -45,7 +48,7 @@ static int command_get_fw_version(libusb_device_handle *devhdl, ret = libusb_control_transfer(devhdl, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN, CMD_GET_FW_VERSION, 0x0000, 0x0000, - (unsigned char *)vi, sizeof(struct version_info), 100); + (unsigned char *)vi, sizeof(struct version_info), USB_TIMEOUT); if (ret < 0) { sr_err("Unable to get version info: %s.", @@ -65,7 +68,7 @@ static int command_get_revid_version(struct sr_dev_inst *sdi, uint8_t *revid) cmd = devc->dslogic ? DS_CMD_GET_REVID_VERSION : CMD_GET_REVID_VERSION; ret = libusb_control_transfer(devhdl, LIBUSB_REQUEST_TYPE_VENDOR | - LIBUSB_ENDPOINT_IN, cmd, 0x0000, 0x0000, revid, 1, 100); + LIBUSB_ENDPOINT_IN, cmd, 0x0000, 0x0000, revid, 1, USB_TIMEOUT); if (ret < 0) { sr_err("Unable to get REVID: %s.", libusb_error_name(ret)); @@ -126,7 +129,7 @@ SR_PRIV int fx2lafw_command_start_acquisition(const struct sr_dev_inst *sdi) /* Send the control message. */ ret = libusb_control_transfer(usb->devhdl, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT, CMD_START, 0x0000, 0x0000, - (unsigned char *)&cmd, sizeof(cmd), 100); + (unsigned char *)&cmd, sizeof(cmd), USB_TIMEOUT); if (ret < 0) { sr_err("Unable to send start command: %s.", libusb_error_name(ret)); @@ -140,7 +143,7 @@ SR_PRIV int fx2lafw_command_start_acquisition(const struct sr_dev_inst *sdi) * Check the USB configuration to determine if this is an fx2lafw device. * * @return TRUE if the device's configuration profile matches fx2lafw - * configuration, FALSE otherwise. + * configuration, FALSE otherwise. */ SR_PRIV gboolean match_manuf_prod(libusb_device *dev, const char *manufacturer, const char *product) @@ -154,8 +157,7 @@ SR_PRIV gboolean match_manuf_prod(libusb_device *dev, const char *manufacturer, ret = FALSE; while (!ret) { /* Assume the FW has not been loaded, unless proven wrong. */ - if (libusb_get_device_descriptor(dev, &des) != 0) - break; + libusb_get_device_descriptor(dev, &des); if (libusb_open(dev, &hdl) != 0) break; @@ -163,13 +165,13 @@ SR_PRIV gboolean match_manuf_prod(libusb_device *dev, const char *manufacturer, if (libusb_get_string_descriptor_ascii(hdl, des.iManufacturer, strdesc, sizeof(strdesc)) < 0) break; - if (strncmp((const char *)strdesc, manufacturer, 6)) + if (strcmp((const char *)strdesc, manufacturer)) break; if (libusb_get_string_descriptor_ascii(hdl, des.iProduct, strdesc, sizeof(strdesc)) < 0) break; - if (strncmp((const char *)strdesc, product, 7)) + if (strcmp((const char *)strdesc, product)) break; ret = TRUE; @@ -192,7 +194,7 @@ SR_PRIV int fx2lafw_dev_open(struct sr_dev_inst *sdi, struct sr_dev_driver *di) uint8_t revid; char connection_id[64]; - drvc = di->priv; + drvc = di->context; devc = sdi->priv; usb = sdi->conn; @@ -208,11 +210,7 @@ SR_PRIV int fx2lafw_dev_open(struct sr_dev_inst *sdi, struct sr_dev_driver *di) } for (i = 0; i < device_count; i++) { - if ((ret = libusb_get_device_descriptor(devlist[i], &des))) { - sr_err("Failed to get device descriptor: %s.", - libusb_error_name(ret)); - continue; - } + libusb_get_device_descriptor(devlist[i], &des); if (des.idVendor != devc->profile->vid || des.idProduct != devc->profile->pid) @@ -242,6 +240,16 @@ SR_PRIV int fx2lafw_dev_open(struct sr_dev_inst *sdi, struct sr_dev_driver *di) break; } + if (libusb_has_capability(LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER)) { + if (libusb_kernel_driver_active(usb->devhdl, USB_INTERFACE) == 1) { + if ((ret = libusb_detach_kernel_driver(usb->devhdl, USB_INTERFACE)) < 0) { + sr_err("Failed to detach kernel driver: %s.", + libusb_error_name(ret)); + return SR_ERR; + } + } + } + ret = command_get_fw_version(usb->devhdl, &vi); if (ret != SR_OK) { sr_err("Failed to get firmware version."); @@ -373,7 +381,7 @@ static void resubmit_transfer(struct libusb_transfer *transfer) } -SR_PRIV void fx2lafw_receive_transfer(struct libusb_transfer *transfer) +SR_PRIV void LIBUSB_CALL fx2lafw_receive_transfer(struct libusb_transfer *transfer) { struct sr_dev_inst *sdi; struct dev_context *devc; @@ -396,8 +404,8 @@ SR_PRIV void fx2lafw_receive_transfer(struct libusb_transfer *transfer) return; } - sr_dbg("receive_transfer(): status %d received %d bytes.", - transfer->status, transfer->actual_length); + sr_dbg("receive_transfer(): status %s received %d bytes.", + libusb_error_name(transfer->status), transfer->actual_length); /* Save incoming transfer before reusing the transfer struct. */ unitsize = devc->sample_wide ? 2 : 1;