Hello,
I take time to create a POC for 04f3:0903 Elan Microelectronics Corp
driver.
I think it is working too for 0x0C03.
Can someone test it (poc_0903_0C03.diff)?
I found a bug in elan.c (see bugframesup30.diff) and a small typo
(typo.diff).
Thank you.
diff --git a/libfprint/drivers/elan.c b/libfprint/drivers/elan.c
index ab8f90b..d5b55e8 100644
--- a/libfprint/drivers/elan.c
+++ b/libfprint/drivers/elan.c
@@ -306,7 +306,8 @@ static void elan_deactivate_run_state(struct fpi_ssm *ssm)
{
switch (ssm->cur_state) {
case DEACTIVATE:
- elan_run_cmds(ssm, deactivate_cmds, deactivate_cmds_len,
+ /* 0x0b seems to shutdown device definitively */
+ elan_run_cmds(ssm, read_cmds, read_cmds_len,
ELAN_CMD_TIMEOUT);
break;
}
@@ -348,7 +349,7 @@ static void elan_capture_run_state(struct fpi_ssm *ssm)
switch (ssm->cur_state) {
case CAPTURE_START:
- elan_run_cmds(ssm, capture_start_cmds, capture_start_cmds_len,
+ elan_run_cmds(ssm, read_cmds, read_cmds_len,
ELAN_CMD_TIMEOUT);
break;
case CAPTURE_WAIT_FINGER:
@@ -435,31 +436,16 @@ static void elan_capture(struct fp_img_dev *dev)
}
enum calibrate_states {
- CALIBRATE_START_1,
- CALIBRATE_READ_DATA_1,
- CALIBRATE_END_1,
- CALIBRATE_START_2,
- CALIBRATE_READ_DATA_2,
- CALIBRATE_END_2,
+ CALIBRATE_READ_DATA,
CALIBRATE_NUM_STATES,
};
static void elan_calibrate_run_state(struct fpi_ssm *ssm)
{
switch (ssm->cur_state) {
- case CALIBRATE_START_1:
- case CALIBRATE_START_2:
- elan_run_cmds(ssm, calibrate_start_cmds,
- calibrate_start_cmds_len, ELAN_CMD_TIMEOUT);
- break;
- case CALIBRATE_READ_DATA_1:
- case CALIBRATE_READ_DATA_2:
- elan_run_cmds(ssm, read_cmds, read_cmds_len, ELAN_CMD_TIMEOUT);
- break;
- case CALIBRATE_END_1:
- case CALIBRATE_END_2:
- elan_run_cmds(ssm, calibrate_end_cmds, calibrate_end_cmds_len,
- ELAN_CMD_TIMEOUT);
+ case CALIBRATE_READ_DATA:
+ elan_run_cmds(ssm, read_cmds, read_cmds_len, ELAN_CMD_TIMEOUT);
+ break;
}
}
@@ -497,10 +483,11 @@ static void elan_calibrate(struct fp_img_dev *dev)
enum activate_states {
ACTIVATE_GET_SENSOR_DIM,
ACTIVATE_SET_SENSOR_DIM,
- ACTIVATE_START,
+ ACTIVATE_NUM_STATES,
+
ACTIVATE_READ_DATA,
+ ACTIVATE_START,
ACTIVATE_END,
- ACTIVATE_NUM_STATES,
};
static void elan_activate_run_state(struct fpi_ssm *ssm)
@@ -609,7 +596,8 @@ static void dev_deactivate(struct fp_img_dev *dev)
}
static const struct usb_id id_table[] = {
- {.vendor = 0x04f3,.product = 0x0907},
+ {.vendor = 0x04f3,.product = 0x0903},
+ {.vendor = 0x04f3,.product = 0x0c03},
{0, 0, 0,},
};
diff --git a/libfprint/drivers/elan.h b/libfprint/drivers/elan.h
index 468fe27..5acdc43 100644
--- a/libfprint/drivers/elan.h
+++ b/libfprint/drivers/elan.h
@@ -26,7 +26,7 @@
/* number of pixels to discard on left and right (along raw image height)
* because they have different intensity from the rest of the frame */
-#define ELAN_FRAME_MARGIN 12
+#define ELAN_FRAME_MARGIN 0
/* min and max frames in a capture */
#define ELAN_MIN_FRAMES 7
diff --git a/libfprint/drivers/elan.c b/libfprint/drivers/elan.c
index 976ce07..ab8f90b 100644
--- a/libfprint/drivers/elan.c
+++ b/libfprint/drivers/elan.c
@@ -371,6 +371,8 @@ static void elan_capture_run_state(struct fpi_ssm *ssm)
/* quickly stop if finger is removed */
elandev->cmd_timeout = ELAN_FINGER_TIMEOUT;
fpi_ssm_jump_to_state(ssm, CAPTURE_WAIT_FINGER);
+ } else {
+ fpi_ssm_next_state(ssm);
}
break;
}
diff --git a/libfprint/drivers/elan.h b/libfprint/drivers/elan.h
index 1b47dbc..468fe27 100644
--- a/libfprint/drivers/elan.h
+++ b/libfprint/drivers/elan.h
@@ -79,7 +79,7 @@ static const struct elan_cmd init_start_cmds[] = {
static const size_t init_start_cmds_len = array_n_elements(init_start_cmds);
static const struct elan_cmd read_cmds[] = {
- /* raw frame sizes are calculated from image dimesions reported by the
+ /* raw frame sizes are calculated from image dimensions reported by the
* device */
{
.cmd = {0x00, 0x09},
_______________________________________________
fprint mailing list
fprint@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/fprint