diff --git a/libfprint/drivers/elan.c b/libfprint/drivers/elan.c index 1b5d1e70..af631732 100644 --- a/libfprint/drivers/elan.c +++ b/libfprint/drivers/elan.c @@ -547,6 +547,13 @@ capture_run_state (FpiSsm *ssm, FpDevice *dev) fpi_image_device_report_finger_status (idev, TRUE); elan_run_cmd (ssm, dev, &get_image_cmd, ELAN_CMD_TIMEOUT); } + else if (self->dev_type == ELAN_0C58 && self->last_read && + (self->last_read[0] == 0x00 || self->last_read[0] == 0xaf)) + { + /* 0x00 - not ready + * 0xaf - finger removed or sensor busy (seen on 0x0c58) */ + fpi_ssm_jump_to_state_delayed (ssm, CAPTURE_WAIT_FINGER, 10); + } else { /* XXX: The timeout is emulated incorrectly, resulting in a zero byte read. */ @@ -795,7 +802,7 @@ elan_calibrate (FpiDeviceElan *self) g_return_if_fail (!self->active); self->active = TRUE; - self->calib_atts_left = ELAN_CALIBRATION_ATTEMPTS; + self->calib_atts_left = ELAN_CALIBRATION_ATTEMPTS (self->dev_type); FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (self), calibrate_run_state, CALIBRATE_NUM_STATES); diff --git a/libfprint/drivers/elan.h b/libfprint/drivers/elan.h index 7d089945..6bbaae04 100644 --- a/libfprint/drivers/elan.h +++ b/libfprint/drivers/elan.h @@ -31,6 +31,7 @@ #define ELAN_0907 (1 << 0) #define ELAN_0C03 (1 << 1) #define ELAN_0C42 (1 << 2) +#define ELAN_0C58 (1 << 3) /* devices which don't require frame rotation before assembling */ #define ELAN_NOT_ROTATED ELAN_0C03 @@ -44,7 +45,9 @@ /* times to retry reading calibration status during one session * generally prevents calibration from looping indefinitely */ -#define ELAN_CALIBRATION_ATTEMPTS 10 +#define ELAN_DEFAULT_CALIBRATION_ATTEMPTS 10 +#define ELAN_CALIBRATION_ATTEMPTS(dev_type) \ + ((dev_type) == ELAN_0C58 ? 30 : ELAN_DEFAULT_CALIBRATION_ATTEMPTS) /* min and max frames in a capture */ #define ELAN_MIN_FRAMES 7 @@ -220,7 +223,7 @@ static const FpIdEntry elan_id_table[] = { {.vid = ELAN_VEND_ID, .pid = 0x0c4f, .driver_data = ELAN_ALL_DEV}, {.vid = ELAN_VEND_ID, .pid = 0x0c63, .driver_data = ELAN_ALL_DEV}, {.vid = ELAN_VEND_ID, .pid = 0x0c6e, .driver_data = ELAN_ALL_DEV}, - {.vid = ELAN_VEND_ID, .pid = 0x0c58, .driver_data = ELAN_ALL_DEV}, + {.vid = ELAN_VEND_ID, .pid = 0x0c58, .driver_data = ELAN_0C58}, {.vid = 0, .pid = 0, .driver_data = 0}, };