diff --git a/libfprint/core.c b/libfprint/core.c index 280fe65..a5daa30 100644 --- a/libfprint/core.c +++ b/libfprint/core.c @@ -542,6 +542,50 @@ API_EXPORTED int fp_dev_supports_dscv_print(struct fp_dev *dev, 0, print->driver_id, print->devtype, 0); } +libusb_device_handle * +fpi_dev_get_usb_dev(struct fp_dev *dev) +{ + return dev->udev; +} + +void * +fpi_dev_get_user_data (struct fp_dev *dev) +{ + return dev->priv; +} + +void +fpi_dev_set_user_data (struct fp_dev *dev, + void *user_data) +{ + dev->priv = user_data; +} + +int +fpi_dev_get_nr_enroll_stages(struct fp_dev *dev) +{ + return dev->nr_enroll_stages; +} + +void +fpi_dev_set_nr_enroll_stages(struct fp_dev *dev, + int nr_enroll_stages) +{ + dev->nr_enroll_stages = nr_enroll_stages; +} + +struct fp_print_data * +fpi_dev_get_verify_data(struct fp_dev *dev) +{ + return dev->verify_data; +} + +enum fp_dev_state +fpi_dev_get_dev_state(struct fp_dev *dev) +{ + return dev->state; +} + /** * fp_driver_get_name: * @drv: the driver diff --git a/libfprint/drivers/aes1610.c b/libfprint/drivers/aes1610.c index 3801eb1..c07a69b 100644 --- a/libfprint/drivers/aes1610.c +++ b/libfprint/drivers/aes1610.c @@ -140,7 +140,7 @@ static void generic_read_ignore_data(struct fpi_ssm *ssm, size_t bytes) data = g_malloc(bytes); dev = fpi_ssm_get_dev(ssm); - libusb_fill_bulk_transfer(transfer, dev->udev, EP_IN, data, bytes, + libusb_fill_bulk_transfer(transfer, fpi_dev_get_usb_dev(dev), EP_IN, data, bytes, generic_ignore_data_cb, ssm, BULK_TIMEOUT); r = libusb_submit_transfer(transfer); diff --git a/libfprint/drivers/aes2501.c b/libfprint/drivers/aes2501.c index 84def28..83c3a4f 100644 --- a/libfprint/drivers/aes2501.c +++ b/libfprint/drivers/aes2501.c @@ -218,7 +218,7 @@ static void generic_read_ignore_data(struct fpi_ssm *ssm, size_t bytes) } data = g_malloc(bytes); - libusb_fill_bulk_transfer(transfer, dev->udev, EP_IN, data, bytes, + libusb_fill_bulk_transfer(transfer, fpi_dev_get_usb_dev(dev), EP_IN, data, bytes, generic_ignore_data_cb, ssm, BULK_TIMEOUT); r = libusb_submit_transfer(transfer); diff --git a/libfprint/drivers/elan.c b/libfprint/drivers/elan.c index 640641c..f03b5e3 100644 --- a/libfprint/drivers/elan.c +++ b/libfprint/drivers/elan.c @@ -406,7 +406,7 @@ static void capture_complete(struct fpi_ssm *ssm) * completed, so we need to keep feeding it images till it's had enough. * But after that it can't finalize enrollemnt until this callback exits. * That's why we schedule elan_capture instead of running it directly. */ - if (dev->dev->state == DEV_STATE_ENROLLING + if (fpi_dev_get_dev_state(dev->dev) == DEV_STATE_ENROLLING && !fpi_timeout_add(10, elan_capture_async, dev)) fpi_imgdev_session_error(dev, -ETIME); diff --git a/libfprint/drivers/upeksonly.c b/libfprint/drivers/upeksonly.c index 8531185..72a9318 100644 --- a/libfprint/drivers/upeksonly.c +++ b/libfprint/drivers/upeksonly.c @@ -591,7 +591,8 @@ static void sm_write_regs(struct fpi_ssm *ssm, data = g_malloc(LIBUSB_CONTROL_SETUP_SIZE + 1); libusb_fill_control_setup(data, 0x40, 0x0c, 0, 0, 1); dev = fpi_ssm_get_dev(ssm); - libusb_fill_control_transfer(wrdata->transfer, dev->udev, data, + libusb_fill_control_transfer(wrdata->transfer, + fpi_dev_get_usb_dev(dev), data, write_regs_cb, wrdata, CTRL_TIMEOUT); wrdata->transfer->flags = LIBUSB_TRANSFER_SHORT_NOT_OK; diff --git a/libfprint/drivers/upektc_img.c b/libfprint/drivers/upektc_img.c index 914aa80..96a0b49 100644 --- a/libfprint/drivers/upektc_img.c +++ b/libfprint/drivers/upektc_img.c @@ -568,7 +568,7 @@ static void activate_run_state(struct fpi_ssm *ssm) data = g_malloc0(LIBUSB_CONTROL_SETUP_SIZE + 1); libusb_fill_control_setup(data, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, 0x0c, 0x100, 0x0400, 1); - libusb_fill_control_transfer(transfer, dev->udev, data, + libusb_fill_control_transfer(transfer, fpi_dev_get_usb_dev(dev), data, init_reqs_ctrl_cb, ssm, CTRL_TIMEOUT); r = libusb_submit_transfer(transfer); if (r < 0) { diff --git a/libfprint/drivers/upekts.c b/libfprint/drivers/upekts.c index ed71400..a2bf971 100644 --- a/libfprint/drivers/upekts.c +++ b/libfprint/drivers/upekts.c @@ -166,7 +166,7 @@ static struct libusb_transfer *alloc_send_cmd_transfer(struct fp_dev *dev, buf[urblen - 2] = crc >> 8; buf[urblen - 1] = crc & 0xff; - libusb_fill_bulk_transfer(transfer, dev->udev, EP_OUT, buf, urblen, + libusb_fill_bulk_transfer(transfer, fpi_dev_get_usb_dev(dev), EP_OUT, buf, urblen, callback, user_data, TIMEOUT); return transfer; } @@ -178,7 +178,7 @@ static struct libusb_transfer *alloc_send_cmd28_transfer(struct fp_dev *dev, uint16_t _innerlen = innerlen; size_t len = innerlen + 6; unsigned char *buf = g_malloc0(len); - struct upekts_dev *upekdev = dev->priv; + struct upekts_dev *upekdev = fpi_dev_get_user_data(dev); uint8_t seq = upekdev->seq + CMD_SEQ_INCREMENT; struct libusb_transfer *ret; @@ -417,7 +417,7 @@ static void read_msg_cb(struct libusb_transfer *transfer) fp_dbg("didn't fit in buffer, need to extend by %d bytes", needed); data = g_realloc((gpointer) data, MSG_READ_BUF_SIZE + needed); - libusb_fill_bulk_transfer(etransfer, udata->dev->udev, EP_IN, + libusb_fill_bulk_transfer(etransfer, fpi_dev_get_usb_dev(udata->dev), EP_IN, data + MSG_READ_BUF_SIZE, needed, read_msg_extend_cb, udata, TIMEOUT); @@ -456,7 +456,7 @@ static int __read_msg_async(struct read_msg_data *udata) return -ENOMEM; } - libusb_fill_bulk_transfer(transfer, udata->dev->udev, EP_IN, buf, + libusb_fill_bulk_transfer(transfer, fpi_dev_get_usb_dev(udata->dev), EP_IN, buf, MSG_READ_BUF_SIZE, read_msg_cb, udata, TIMEOUT); r = libusb_submit_transfer(transfer); if (r < 0) { @@ -530,7 +530,7 @@ static void initsm_read_msg_response_cb(struct fpi_ssm *ssm, unsigned char expect_subcmd, unsigned char subcmd) { struct fp_dev *dev = fpi_ssm_get_dev(ssm); - struct upekts_dev *upekdev = dev->priv; + struct upekts_dev *upekdev = fpi_dev_get_user_data(dev); if (status != READ_MSG_RESPONSE) { fp_err("expected response, got %d seq=%x in state %d", status, seq, @@ -594,7 +594,7 @@ static void initsm_read_msg_cmd_cb(struct fpi_ssm *ssm, enum read_msg_status status, uint8_t expect_seq, uint8_t seq) { struct fp_dev *dev = fpi_ssm_get_dev(ssm); - struct upekts_dev *upekdev = dev->priv; + struct upekts_dev *upekdev = fpi_dev_get_user_data(dev); if (status == READ_MSG_ERROR) { fpi_ssm_mark_aborted(ssm, -1); @@ -693,7 +693,7 @@ static void initsm_send_msg28_handler(struct fpi_ssm *ssm, static void initsm_run_state(struct fpi_ssm *ssm) { struct fp_dev *dev = fpi_ssm_get_dev(ssm); - struct upekts_dev *upekdev = dev->priv; + struct upekts_dev *upekdev = fpi_dev_get_user_data(dev); struct libusb_transfer *transfer; int r; @@ -710,7 +710,7 @@ static void initsm_run_state(struct fpi_ssm *ssm) data = g_malloc(LIBUSB_CONTROL_SETUP_SIZE + 1); libusb_fill_control_setup(data, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, 0x0c, 0x100, 0x0400, 1); - libusb_fill_control_transfer(transfer, dev->udev, data, + libusb_fill_control_transfer(transfer, fpi_dev_get_usb_dev(dev), data, ctrl400_cb, ssm, TIMEOUT); r = libusb_submit_transfer(transfer); @@ -805,7 +805,7 @@ static void read_msg01_cb(struct fp_dev *dev, enum read_msg_status status, void *user_data) { struct fpi_ssm *ssm = user_data; - struct upekts_dev *upekdev = dev->priv; + struct upekts_dev *upekdev = fpi_dev_get_user_data(dev); if (status == READ_MSG_ERROR) { fpi_ssm_mark_aborted(ssm, -1); @@ -867,7 +867,7 @@ static int dev_init(struct fp_dev *dev, unsigned long driver_data) struct upekts_dev *upekdev = NULL; int r; - r = libusb_claim_interface(dev->udev, 0); + r = libusb_claim_interface(fpi_dev_get_usb_dev(dev), 0); if (r < 0) { fp_err("could not claim interface 0: %s", libusb_error_name(r)); return r; @@ -875,8 +875,8 @@ static int dev_init(struct fp_dev *dev, unsigned long driver_data) upekdev = g_malloc(sizeof(*upekdev)); upekdev->seq = 0xf0; /* incremented to 0x00 before first cmd */ - dev->priv = upekdev; - dev->nr_enroll_stages = 3; + fpi_dev_set_user_data(dev, upekdev); + fpi_dev_set_nr_enroll_stages(dev, 3); fpi_drvcb_open_complete(dev, 0); return 0; @@ -884,8 +884,10 @@ static int dev_init(struct fp_dev *dev, unsigned long driver_data) static void dev_exit(struct fp_dev *dev) { - libusb_release_interface(dev->udev, 0); - g_free(dev->priv); + void *user_data; + libusb_release_interface(fpi_dev_get_usb_dev(dev), 0); + user_data = fpi_dev_get_user_data(dev); + g_free(user_data); fpi_drvcb_close_complete(dev); } @@ -936,7 +938,7 @@ static void enroll_start_sm_cb_msg28(struct fp_dev *dev, enum read_msg_status status, uint8_t seq, unsigned char subcmd, unsigned char *data, size_t data_len, void *user_data) { - struct upekts_dev *upekdev = dev->priv; + struct upekts_dev *upekdev = fpi_dev_get_user_data(dev); struct fpi_ssm *ssm = user_data; if (status != READ_MSG_RESPONSE) { @@ -999,7 +1001,7 @@ static void enroll_iterate(struct fp_dev *dev); static void e_handle_resp00(struct fp_dev *dev, unsigned char *data, size_t data_len) { - struct upekts_dev *upekdev = dev->priv; + struct upekts_dev *upekdev = fpi_dev_get_user_data(dev); unsigned char status; int result = 0; @@ -1161,7 +1163,7 @@ static void enroll_started(struct fpi_ssm *ssm) static int enroll_start(struct fp_dev *dev) { - struct upekts_dev *upekdev = dev->priv; + struct upekts_dev *upekdev = fpi_dev_get_user_data(dev); /* do_init state machine first */ struct fpi_ssm *ssm = fpi_ssm_new(dev, enroll_start_sm_run_state, @@ -1249,7 +1251,7 @@ static void verify_start_sm_run_state(struct fpi_ssm *ssm) fpi_ssm_start(initsm, verify_start_sm_cb_initsm); break; case VERIFY_INIT: ; - struct fp_print_data *print = dev->verify_data; + struct fp_print_data *print = fpi_dev_get_verify_data(dev); struct fp_print_data_item *item = print->prints->data; size_t data_len = sizeof(verify_hdr) + item->length; unsigned char *data = g_malloc(data_len); @@ -1355,7 +1357,7 @@ static void verify_rd2800_cb(struct fp_dev *dev, enum read_msg_status msgstat, uint8_t seq, unsigned char subcmd, unsigned char *data, size_t data_len, void *user_data) { - struct upekts_dev *upekdev = dev->priv; + struct upekts_dev *upekdev = fpi_dev_get_user_data(dev); if (msgstat != READ_MSG_RESPONSE) { fp_err("expected response, got %d seq=%x", msgstat, seq); @@ -1394,7 +1396,7 @@ static void verify_wr2800_cb(struct libusb_transfer *transfer) static void verify_iterate(struct fp_dev *dev) { - struct upekts_dev *upekdev = dev->priv; + struct upekts_dev *upekdev = fpi_dev_get_user_data(dev); if (upekdev->stop_verify) { do_verify_stop(dev); @@ -1430,7 +1432,7 @@ static void verify_iterate(struct fp_dev *dev) static void verify_started(struct fpi_ssm *ssm) { struct fp_dev *dev = fpi_ssm_get_dev(ssm); - struct upekts_dev *upekdev = dev->priv; + struct upekts_dev *upekdev = fpi_dev_get_user_data(dev); fpi_drvcb_verify_started(dev, fpi_ssm_get_error(ssm)); if (!fpi_ssm_get_error(ssm)) { @@ -1443,7 +1445,7 @@ static void verify_started(struct fpi_ssm *ssm) static int verify_start(struct fp_dev *dev) { - struct upekts_dev *upekdev = dev->priv; + struct upekts_dev *upekdev = fpi_dev_get_user_data(dev); struct fpi_ssm *ssm = fpi_ssm_new(dev, verify_start_sm_run_state, VERIFY_NUM_STATES); upekdev->stop_verify = FALSE; @@ -1453,7 +1455,7 @@ static int verify_start(struct fp_dev *dev) static int verify_stop(struct fp_dev *dev, gboolean iterating) { - struct upekts_dev *upekdev = dev->priv; + struct upekts_dev *upekdev = fpi_dev_get_user_data(dev); if (!iterating) do_verify_stop(dev); diff --git a/libfprint/drivers/vfs101.c b/libfprint/drivers/vfs101.c index 7e0a682..764628a 100644 --- a/libfprint/drivers/vfs101.c +++ b/libfprint/drivers/vfs101.c @@ -647,7 +647,7 @@ static int action_completed(struct fp_img_dev *dev) struct vfs101_dev *vdev = dev->priv; if ((dev->action == IMG_ACTION_ENROLL) && - (vdev->enroll_stage < dev->dev->nr_enroll_stages)) + (vdev->enroll_stage < fpi_dev_get_nr_enroll_stages(dev->dev))) /* Enroll not completed, return false */ return FALSE; diff --git a/libfprint/drivers_api.h b/libfprint/drivers_api.h index 98ac031..0bbfde8 100644 --- a/libfprint/drivers_api.h +++ b/libfprint/drivers_api.h @@ -71,48 +71,14 @@ enum fp_dev_state { DEV_STATE_CAPTURE_STOPPING, }; -struct fp_dev { - struct fp_driver *drv; - libusb_device_handle *udev; - uint32_t devtype; - void *priv; - - int nr_enroll_stages; - - /* read-only to drivers */ - struct fp_print_data *verify_data; - - /* drivers should not mess with any of the below */ - enum fp_dev_state state; - int __enroll_stage; - int unconditional_capture; - - /* async I/O callbacks and data */ - /* FIXME: convert this to generic state operational data mechanism? */ - fp_dev_open_cb open_cb; - void *open_cb_data; - fp_operation_stop_cb close_cb; - void *close_cb_data; - fp_enroll_stage_cb enroll_stage_cb; - void *enroll_stage_cb_data; - fp_operation_stop_cb enroll_stop_cb; - void *enroll_stop_cb_data; - fp_img_operation_cb verify_cb; - void *verify_cb_data; - fp_operation_stop_cb verify_stop_cb; - void *verify_stop_cb_data; - fp_identify_cb identify_cb; - void *identify_cb_data; - fp_operation_stop_cb identify_stop_cb; - void *identify_stop_cb_data; - fp_img_operation_cb capture_cb; - void *capture_cb_data; - fp_operation_stop_cb capture_stop_cb; - void *capture_stop_cb_data; - - /* FIXME: better place to put this? */ - struct fp_print_data **identify_gallery; -}; +struct fp_dev; +libusb_device_handle *fpi_dev_get_usb_dev(struct fp_dev *dev); +void *fpi_dev_get_user_data (struct fp_dev *dev); +void fpi_dev_set_user_data (struct fp_dev *dev, void *user_data); +int fpi_dev_get_nr_enroll_stages(struct fp_dev *dev); +void fpi_dev_set_nr_enroll_stages(struct fp_dev *dev, int nr_enroll_stages); +struct fp_print_data *fpi_dev_get_verify_data(struct fp_dev *dev); +enum fp_dev_state fpi_dev_get_dev_state(struct fp_dev *dev); enum fp_imgdev_state { IMGDEV_STATE_INACTIVE,