elan: Support 0x0c01~0x0c33

This commit is contained in:
Igor Filatov 2018-02-04 17:18:07 +02:00 committed by Bastien Nocera
parent 65bbdff3fc
commit b098399bbc
2 changed files with 68 additions and 26 deletions

View file

@ -805,27 +805,12 @@ static void dev_deactivate(struct fp_img_dev *dev)
elan_deactivate(dev); elan_deactivate(dev);
} }
static const struct usb_id id_table[] = {
{.vendor = ELAN_VENDOR_ID,.product = 0x0903,.driver_data =
ELAN_ALL_DEVICES},
{.vendor = ELAN_VENDOR_ID,.product = 0x0907,.driver_data = ELAN_0907},
{.vendor = ELAN_VENDOR_ID,.product = 0x0c03,.driver_data =
ELAN_ALL_DEVICES},
{.vendor = ELAN_VENDOR_ID,.product = 0x0c16,.driver_data =
ELAN_ALL_DEVICES},
{.vendor = ELAN_VENDOR_ID,.product = 0x0c1a,.driver_data =
ELAN_ALL_DEVICES},
{.vendor = ELAN_VENDOR_ID,.product = 0x0c26,.driver_data =
ELAN_ALL_DEVICES},
{0, 0, 0,},
};
struct fp_img_driver elan_driver = { struct fp_img_driver elan_driver = {
.driver = { .driver = {
.id = ELAN_ID, .id = ELAN_ID,
.name = FP_COMPONENT, .name = FP_COMPONENT,
.full_name = "ElanTech Fingerprint Sensor", .full_name = "ElanTech Fingerprint Sensor",
.id_table = id_table, .id_table = elan_id_table,
.scan_type = FP_SCAN_TYPE_SWIPE, .scan_type = FP_SCAN_TYPE_SWIPE,
}, },
.flags = 0, .flags = 0,

View file

@ -24,10 +24,10 @@
#include <string.h> #include <string.h>
#include <libusb.h> #include <libusb.h>
#define ELAN_VENDOR_ID 0x04f3 #define ELAN_VEND_ID 0x04f3
/* a default device type */ /* a default device type */
#define ELAN_ALL_DEVICES 0 #define ELAN_ALL_DEV 0
/* devices with quirks */ /* devices with quirks */
#define ELAN_0907 1 #define ELAN_0907 1
@ -78,14 +78,14 @@ static const struct elan_cmd get_sensor_dim_cmd = {
.cmd = {0x00, 0x0c}, .cmd = {0x00, 0x0c},
.response_len = 0x4, .response_len = 0x4,
.response_in = ELAN_EP_CMD_IN, .response_in = ELAN_EP_CMD_IN,
.devices = ELAN_ALL_DEVICES, .devices = ELAN_ALL_DEV,
}; };
static const struct elan_cmd get_fw_ver_cmd = { static const struct elan_cmd get_fw_ver_cmd = {
.cmd = {0x40, 0x19}, .cmd = {0x40, 0x19},
.response_len = 0x2, .response_len = 0x2,
.response_in = ELAN_EP_CMD_IN, .response_in = ELAN_EP_CMD_IN,
.devices = ELAN_ALL_DEVICES, .devices = ELAN_ALL_DEV,
}; };
/* unknown, returns 0x0 0x1 on 0907 */ /* unknown, returns 0x0 0x1 on 0907 */
@ -102,28 +102,28 @@ static const struct elan_cmd get_image_cmd = {
* device */ * device */
.response_len = -1, .response_len = -1,
.response_in = ELAN_EP_IMG_IN, .response_in = ELAN_EP_IMG_IN,
.devices = ELAN_ALL_DEVICES, .devices = ELAN_ALL_DEV,
}; };
static const struct elan_cmd read_sensor_status_cmd = { static const struct elan_cmd read_sensor_status_cmd = {
.cmd = {0x40, 0x13}, .cmd = {0x40, 0x13},
.response_len = 0x1, .response_len = 0x1,
.response_in = ELAN_EP_CMD_IN, .response_in = ELAN_EP_CMD_IN,
.devices = ELAN_ALL_DEVICES, .devices = ELAN_ALL_DEV,
}; };
static const struct elan_cmd get_calib_status_cmd = { static const struct elan_cmd get_calib_status_cmd = {
.cmd = {0x40, 0x23}, .cmd = {0x40, 0x23},
.response_len = 0x1, .response_len = 0x1,
.response_in = ELAN_EP_CMD_IN, .response_in = ELAN_EP_CMD_IN,
.devices = ELAN_ALL_DEVICES, .devices = ELAN_ALL_DEV,
}; };
static const struct elan_cmd get_calib_mean_cmd = { static const struct elan_cmd get_calib_mean_cmd = {
.cmd = {0x40, 0x24}, .cmd = {0x40, 0x24},
.response_len = 0x2, .response_len = 0x2,
.response_in = ELAN_EP_CMD_IN, .response_in = ELAN_EP_CMD_IN,
.devices = ELAN_ALL_DEVICES, .devices = ELAN_ALL_DEV,
}; };
static const struct elan_cmd led_on_cmd = { static const struct elan_cmd led_on_cmd = {
@ -139,7 +139,7 @@ static const struct elan_cmd pre_scan_cmd = {
.cmd = {0x40, 0x3f}, .cmd = {0x40, 0x3f},
.response_len = 0x1, .response_len = 0x1,
.response_in = ELAN_EP_CMD_IN, .response_in = ELAN_EP_CMD_IN,
.devices = ELAN_ALL_DEVICES, .devices = ELAN_ALL_DEV,
}; };
/* led off, stop waiting for finger */ /* led off, stop waiting for finger */
@ -147,7 +147,64 @@ static const struct elan_cmd stop_cmd = {
.cmd = {0x00, 0x0b}, .cmd = {0x00, 0x0b},
.response_len = ELAN_CMD_SKIP_READ, .response_len = ELAN_CMD_SKIP_READ,
.response_in = ELAN_EP_CMD_IN, .response_in = ELAN_EP_CMD_IN,
.devices = ELAN_ALL_DEVICES, .devices = ELAN_ALL_DEV,
};
static const struct usb_id elan_id_table[] = {
{.vendor = ELAN_VEND_ID,.product = 0x0903,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0907,.driver_data = ELAN_0907},
{.vendor = ELAN_VEND_ID,.product = 0x0c01,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c02,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c03,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c04,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c05,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c06,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c07,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c08,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c09,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c0a,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c0b,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c0c,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c0d,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c0e,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c0f,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c10,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c11,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c12,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c13,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c14,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c15,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c16,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c17,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c18,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c19,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c1a,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c1b,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c1c,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c1d,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c1e,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c1f,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c20,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c21,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c22,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c23,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c24,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c25,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c26,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c27,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c28,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c29,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c2a,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c2b,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c2c,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c2d,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c2e,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c2f,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c30,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c31,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c32,.driver_data = ELAN_ALL_DEV},
{.vendor = ELAN_VEND_ID,.product = 0x0c33,.driver_data = ELAN_ALL_DEV},
{0, 0, 0,},
}; };
static void elan_cmd_done(struct fpi_ssm *ssm); static void elan_cmd_done(struct fpi_ssm *ssm);