Hello Igor, This hack for firmware <= 0x0153 working.
diff --git a/libfprint/drivers/elan.c b/libfprint/drivers/elan.c index 1152509..a2cc013 100644 --- a/libfprint/drivers/elan.c +++ b/libfprint/drivers/elan.c @@ -45,6 +45,9 @@ static struct fpi_frame_asmbl_ctx assembling_ctx = { }; struct elan_dev { + /* const */ + unsigned short fwver; + /* device config */ unsigned short dev_type; /* number of pixels to discard on left and right (along raw image height) @@ -440,6 +443,11 @@ static int elan_need_calibration(struct elan_dev *elandev) { fp_dbg(""); + if (elandev->fwver <= 0x0153) { + fp_dbg("Old 0x%04x firmware. How to calibrate?",elandev->fwver); + return 0; + } + unsigned short calib_mean = elandev->last_read[0] * 0xff + elandev->last_read[1]; unsigned short *bg_data = ((GSList *) elandev->frames)->data; @@ -469,7 +477,7 @@ enum calibrate_states { CALIBRATE_NUM_STATES, }; -static void alibrate_run_state(struct fpi_ssm *ssm) +static void calibrate_run_state(struct fpi_ssm *ssm) { struct fp_img_dev *dev = ssm->priv; struct elan_dev *elandev = dev->priv; @@ -543,7 +551,7 @@ static void elan_calibrate(struct fp_img_dev *dev) elan_dev_reset(elandev); struct fpi_ssm *ssm = - fpi_ssm_new(dev->dev, alibrate_run_state, CALIBRATE_NUM_STATES); + fpi_ssm_new(dev->dev, calibrate_run_state, CALIBRATE_NUM_STATES); ssm->priv = dev; fpi_ssm_start(ssm, calibrate_complete); } @@ -572,8 +580,9 @@ static void activate_run_state(struct fpi_ssm *ssm) elan_run_cmd(ssm, &get_fw_ver_cmd, ELAN_CMD_TIMEOUT); break; case ACTIVATE_PRINT_FW_VER: - fp_dbg("FW ver %d.%d", elandev->last_read[0], - elandev->last_read[1]); + elandev->fwver = elandev->last_read[0]<<8 | elandev->last_read[1]; + fp_dbg("FW ver 0x%04x", elandev->fwver); + fpi_ssm_next_state(ssm); break; case ACTIVATE_GET_SENSOR_DIM: @@ -601,7 +610,10 @@ static void activate_run_state(struct fpi_ssm *ssm) fpi_ssm_next_state(ssm); break; case ACTIVATE_GET_MEAN: - elan_run_cmd(ssm, &get_calib_mean_cmd, ELAN_CMD_TIMEOUT); + if (elandev->fwver > 0x0153) + elan_run_cmd(ssm, &get_calib_mean_cmd, ELAN_CMD_TIMEOUT); + else + fpi_ssm_next_state(ssm); break; } } diff --git a/libfprint/drivers/elan.h b/libfprint/drivers/elan.h index ee2153c..562b272 100644 --- a/libfprint/drivers/elan.h +++ b/libfprint/drivers/elan.h @@ -113,6 +113,13 @@ static const struct elan_cmd reset_sensor_cmd = { .devices = ELAN_ALL_DEVICES, }; +static const struct elan_cmd status_cmd = { + .cmd = {0x40, 0x13}, + .response_len = 0x1, + .response_in = ELAN_EP_CMD_IN, + .devices = ELAN_ALL_DEVICES, +}; + static const struct elan_cmd fuse_load_cmd = { .cmd = {0x40, 0x14}, .response_len = 0x0,
_______________________________________________ fprint mailing list fprint@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/fprint