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

Reply via email to