elan: Use USB helpers

This commit is contained in:
Bastien Nocera 2018-09-27 15:09:59 +02:00
parent bcc1e7ae73
commit 4b9b34fa4d

View file

@ -73,7 +73,7 @@ struct elan_dev {
/* commands */ /* commands */
const struct elan_cmd *cmd; const struct elan_cmd *cmd;
int cmd_timeout; int cmd_timeout;
struct libusb_transfer *cur_transfer; fpi_usb_transfer *cur_transfer;
/* end commands */ /* end commands */
/* state */ /* state */
@ -319,11 +319,13 @@ static void elan_cmd_done(fpi_ssm *ssm)
fpi_ssm_next_state(ssm); fpi_ssm_next_state(ssm);
} }
static void elan_cmd_cb(struct libusb_transfer *transfer) static void elan_cmd_cb(struct libusb_transfer *transfer,
struct fp_dev *_dev,
fpi_ssm *ssm,
void *user_data)
{ {
fpi_ssm *ssm = transfer->user_data; struct fp_img_dev *dev = FP_IMG_DEV(_dev);
struct fp_img_dev *dev = fpi_ssm_get_user_data(ssm); struct elan_dev *elandev = FP_INSTANCE_DATA(_dev);
struct elan_dev *elandev = FP_INSTANCE_DATA(FP_DEV(dev));
G_DEBUG_HERE(); G_DEBUG_HERE();
@ -338,6 +340,7 @@ static void elan_cmd_cb(struct libusb_transfer *transfer)
fpi_ssm_mark_failed(ssm, -EPROTO); fpi_ssm_mark_failed(ssm, -EPROTO);
} else if (transfer->endpoint & LIBUSB_ENDPOINT_IN) { } else if (transfer->endpoint & LIBUSB_ENDPOINT_IN) {
/* just finished receiving */ /* just finished receiving */
elandev->last_read = g_memdup(transfer->buffer, transfer->actual_length);
dbg_buf(elandev->last_read, transfer->actual_length); dbg_buf(elandev->last_read, transfer->actual_length);
elan_cmd_done(ssm); elan_cmd_done(ssm);
} else { } else {
@ -366,6 +369,7 @@ static void elan_cmd_read(fpi_ssm *ssm, struct fp_img_dev *dev)
{ {
struct elan_dev *elandev = FP_INSTANCE_DATA(FP_DEV(dev)); struct elan_dev *elandev = FP_INSTANCE_DATA(FP_DEV(dev));
int response_len = elandev->cmd->response_len; int response_len = elandev->cmd->response_len;
unsigned char *buffer;
G_DEBUG_HERE(); G_DEBUG_HERE();
@ -380,16 +384,18 @@ static void elan_cmd_read(fpi_ssm *ssm, struct fp_img_dev *dev)
response_len = response_len =
elandev->raw_frame_height * elandev->frame_width * 2; elandev->raw_frame_height * elandev->frame_width * 2;
elandev->cur_transfer = fpi_usb_alloc(); g_clear_pointer(&elandev->last_read, g_free);
g_free(elandev->last_read); buffer = g_malloc(response_len);
elandev->last_read = g_malloc(response_len);
libusb_fill_bulk_transfer(elandev->cur_transfer, fpi_dev_get_usb_dev(FP_DEV(dev)), elandev->cur_transfer = fpi_usb_fill_bulk_transfer(FP_DEV(dev),
ssm,
elandev->cmd->response_in, elandev->cmd->response_in,
elandev->last_read, response_len, elan_cmd_cb, buffer,
ssm, elandev->cmd_timeout); response_len,
elandev->cur_transfer->flags = LIBUSB_TRANSFER_FREE_TRANSFER; elan_cmd_cb,
int r = libusb_submit_transfer(elandev->cur_transfer); NULL,
elandev->cmd_timeout);
int r = fpi_usb_submit_transfer(elandev->cur_transfer);
if (r < 0) if (r < 0)
fpi_ssm_mark_failed(ssm, r); fpi_ssm_mark_failed(ssm, r);
} }
@ -414,12 +420,15 @@ elan_run_cmd(fpi_ssm *ssm,
return; return;
} }
elandev->cur_transfer = fpi_usb_alloc(); elandev->cur_transfer = fpi_usb_fill_bulk_transfer(FP_DEV(dev),
libusb_fill_bulk_transfer(elandev->cur_transfer, fpi_dev_get_usb_dev(FP_DEV(dev)), ELAN_EP_CMD_OUT, ssm,
(char *) cmd->cmd, ELAN_CMD_LEN, elan_cmd_cb, ssm, ELAN_EP_CMD_OUT,
g_memdup((char *) cmd->cmd, ELAN_CMD_LEN),
ELAN_CMD_LEN,
elan_cmd_cb,
NULL,
elandev->cmd_timeout); elandev->cmd_timeout);
elandev->cur_transfer->flags = LIBUSB_TRANSFER_FREE_TRANSFER; int r = fpi_usb_submit_transfer(elandev->cur_transfer);
int r = libusb_submit_transfer(elandev->cur_transfer);
if (r < 0) if (r < 0)
fpi_ssm_mark_failed(ssm, r); fpi_ssm_mark_failed(ssm, r);
} }
@ -849,7 +858,7 @@ static void elan_change_state(struct fp_img_dev *dev)
case IMGDEV_STATE_INACTIVE: case IMGDEV_STATE_INACTIVE:
if (elandev->cur_transfer) if (elandev->cur_transfer)
/* deactivation will complete in transfer callback */ /* deactivation will complete in transfer callback */
libusb_cancel_transfer(elandev->cur_transfer); fpi_usb_cancel_transfer(elandev->cur_transfer);
else else
elan_deactivate(dev); elan_deactivate(dev);
break; break;