mirror of
https://gitlab.freedesktop.org/libfprint/libfprint.git
synced 2025-11-15 07:38:12 +00:00
Compare commits
21 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a68fce0f2c | ||
|
|
1f5e0821e0 | ||
|
|
d6b4adec73 | ||
|
|
9e7bfa05b3 | ||
|
|
9ecd6236ee | ||
|
|
a07011bac2 | ||
|
|
f7290255e0 | ||
|
|
29048c51db | ||
|
|
42676dd300 | ||
|
|
45c5d17f3b | ||
|
|
fc76db562e | ||
|
|
9f93f5ded7 | ||
|
|
74c4125827 | ||
|
|
4f6d908390 | ||
|
|
575bd369d5 | ||
|
|
304219b65c | ||
|
|
23bca2a8ac | ||
|
|
4bf064d873 | ||
|
|
d2c2410a6f | ||
|
|
e8f9cc1fce | ||
|
|
0ee274946d |
9
NEWS
9
NEWS
@@ -1,6 +1,15 @@
|
|||||||
This file lists notable changes in each release. For the full history of all
|
This file lists notable changes in each release. For the full history of all
|
||||||
changes, see ChangeLog.
|
changes, see ChangeLog.
|
||||||
|
|
||||||
|
2021-06-30: v1.92.1 release
|
||||||
|
|
||||||
|
Highlights:
|
||||||
|
* elanmoc: New driver for ELAN match-on-chip devices
|
||||||
|
* egis0570: New driver for some Egis Technology devices
|
||||||
|
* synaptics: Fix empty identify causing enroll issues
|
||||||
|
* elan: Support more PIDs
|
||||||
|
* misc: Architecture related bugfixes
|
||||||
|
|
||||||
2021-06-30: v1.92.0 release
|
2021-06-30: v1.92.0 release
|
||||||
|
|
||||||
Highlights:
|
Highlights:
|
||||||
|
|||||||
@@ -64,6 +64,11 @@ usb:v08FFp5731*
|
|||||||
usb:v5501p08FF*
|
usb:v5501p08FF*
|
||||||
ID_AUTOSUSPEND=1
|
ID_AUTOSUSPEND=1
|
||||||
|
|
||||||
|
# Supported by libfprint driver egis0570
|
||||||
|
usb:v1C7Ap0570*
|
||||||
|
usb:v1C7Ap0571*
|
||||||
|
ID_AUTOSUSPEND=1
|
||||||
|
|
||||||
# Supported by libfprint driver elan
|
# Supported by libfprint driver elan
|
||||||
usb:v04F3p0903*
|
usb:v04F3p0903*
|
||||||
usb:v04F3p0907*
|
usb:v04F3p0907*
|
||||||
@@ -123,6 +128,11 @@ usb:v04F3p0C42*
|
|||||||
usb:v04F3p0C4D*
|
usb:v04F3p0C4D*
|
||||||
usb:v04F3p0C4F*
|
usb:v04F3p0C4F*
|
||||||
usb:v04F3p0C63*
|
usb:v04F3p0C63*
|
||||||
|
usb:v04F3p0C6E*
|
||||||
|
ID_AUTOSUSPEND=1
|
||||||
|
|
||||||
|
# Supported by libfprint driver elanmoc
|
||||||
|
usb:v04F3p0C7E*
|
||||||
ID_AUTOSUSPEND=1
|
ID_AUTOSUSPEND=1
|
||||||
|
|
||||||
# Supported by libfprint driver etes603
|
# Supported by libfprint driver etes603
|
||||||
@@ -260,7 +270,6 @@ usb:v147Ep1002*
|
|||||||
usb:v1491p0088*
|
usb:v1491p0088*
|
||||||
usb:v16D1p1027*
|
usb:v16D1p1027*
|
||||||
usb:v1C7Ap0300*
|
usb:v1C7Ap0300*
|
||||||
usb:v1C7Ap0570*
|
|
||||||
usb:v1C7Ap0575*
|
usb:v1C7Ap0575*
|
||||||
usb:v27C6p5042*
|
usb:v27C6p5042*
|
||||||
usb:v27C6p5110*
|
usb:v27C6p5110*
|
||||||
|
|||||||
@@ -365,7 +365,7 @@ capture_read_stripe_data_cb (FpiUsbTransfer *transfer,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
fp_dbg ("Got %lu bytes of data", actual_length);
|
fp_dbg ("Got %" G_GSIZE_FORMAT " bytes of data", actual_length);
|
||||||
while (actual_length)
|
while (actual_length)
|
||||||
{
|
{
|
||||||
gssize payload_length;
|
gssize payload_length;
|
||||||
@@ -386,7 +386,7 @@ capture_read_stripe_data_cb (FpiUsbTransfer *transfer,
|
|||||||
(priv->stripe_packet->data[AESX660_RESPONSE_SIZE_MSB_OFFSET] << 8);
|
(priv->stripe_packet->data[AESX660_RESPONSE_SIZE_MSB_OFFSET] << 8);
|
||||||
fp_dbg ("Got frame, type %.2x payload of size %.4lx",
|
fp_dbg ("Got frame, type %.2x payload of size %.4lx",
|
||||||
priv->stripe_packet->data[AESX660_RESPONSE_TYPE_OFFSET],
|
priv->stripe_packet->data[AESX660_RESPONSE_TYPE_OFFSET],
|
||||||
payload_length);
|
(long) payload_length);
|
||||||
|
|
||||||
still_needed_len = MAX (0, AESX660_HEADER_SIZE + payload_length - (gssize) priv->stripe_packet->len);
|
still_needed_len = MAX (0, AESX660_HEADER_SIZE + payload_length - (gssize) priv->stripe_packet->len);
|
||||||
copy_len = MIN (actual_length, still_needed_len);
|
copy_len = MIN (actual_length, still_needed_len);
|
||||||
@@ -441,7 +441,7 @@ capture_run_state (FpiSsm *ssm, FpDevice *_dev)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case CAPTURE_SET_IDLE:
|
case CAPTURE_SET_IDLE:
|
||||||
fp_dbg ("Got %lu frames", priv->strips_len);
|
fp_dbg ("Got %" G_GSIZE_FORMAT " frames", priv->strips_len);
|
||||||
aesX660_send_cmd (ssm, _dev, set_idle_cmd, sizeof (set_idle_cmd),
|
aesX660_send_cmd (ssm, _dev, set_idle_cmd, sizeof (set_idle_cmd),
|
||||||
capture_set_idle_cmd_cb);
|
capture_set_idle_cmd_cb);
|
||||||
break;
|
break;
|
||||||
|
|||||||
444
libfprint/drivers/egis0570.c
Normal file
444
libfprint/drivers/egis0570.c
Normal file
@@ -0,0 +1,444 @@
|
|||||||
|
/*
|
||||||
|
* Egis Technology Inc. (aka. LighTuning) 0570 driver for libfprint
|
||||||
|
* Copyright (C) 2021 Maxim Kolesnikov <kolesnikov@svyazcom.ru>
|
||||||
|
* Copyright (C) 2021 Saeed/Ali Rk <saeed.ali.rahimi@gmail.com>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define FP_COMPONENT "egis0570"
|
||||||
|
|
||||||
|
#include "egis0570.h"
|
||||||
|
#include "drivers_api.h"
|
||||||
|
|
||||||
|
/* Packet types */
|
||||||
|
#define PKT_TYPE_INIT 0
|
||||||
|
#define PKT_TYPE_REPEAT 1
|
||||||
|
|
||||||
|
/* Struct */
|
||||||
|
struct _FpDeviceEgis0570
|
||||||
|
{
|
||||||
|
FpImageDevice parent;
|
||||||
|
|
||||||
|
gboolean running;
|
||||||
|
gboolean stop;
|
||||||
|
|
||||||
|
GSList *strips;
|
||||||
|
guint8 *background;
|
||||||
|
gsize strips_len;
|
||||||
|
|
||||||
|
int pkt_num;
|
||||||
|
int pkt_type;
|
||||||
|
};
|
||||||
|
G_DECLARE_FINAL_TYPE (FpDeviceEgis0570, fpi_device_egis0570, FPI, DEVICE_EGIS0570, FpImageDevice);
|
||||||
|
G_DEFINE_TYPE (FpDeviceEgis0570, fpi_device_egis0570, FP_TYPE_IMAGE_DEVICE);
|
||||||
|
|
||||||
|
static unsigned char
|
||||||
|
egis_get_pixel (struct fpi_frame_asmbl_ctx *ctx, struct fpi_frame *frame, unsigned int x, unsigned int y)
|
||||||
|
{
|
||||||
|
return frame->data[x + y * ctx->frame_width];
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct fpi_frame_asmbl_ctx assembling_ctx = {
|
||||||
|
.frame_width = EGIS0570_IMGWIDTH,
|
||||||
|
.frame_height = EGIS0570_RFMGHEIGHT,
|
||||||
|
.image_width = EGIS0570_IMGWIDTH * 4 / 3,
|
||||||
|
.get_pixel = egis_get_pixel,
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Service
|
||||||
|
*/
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
is_last_pkt (FpDevice *dev)
|
||||||
|
{
|
||||||
|
FpDeviceEgis0570 *self = FPI_DEVICE_EGIS0570 (dev);
|
||||||
|
|
||||||
|
int type = self->pkt_type;
|
||||||
|
int num = self->pkt_num;
|
||||||
|
|
||||||
|
gboolean r;
|
||||||
|
|
||||||
|
r = ((type == PKT_TYPE_INIT) && (num == (EGIS0570_INIT_TOTAL - 1)));
|
||||||
|
r |= ((type == PKT_TYPE_REPEAT) && (num == (EGIS0570_REPEAT_TOTAL - 1)));
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns a bit for each frame on whether or not a finger has been detected.
|
||||||
|
* e.g. 00110 means that there is a finger in frame two and three.
|
||||||
|
*/
|
||||||
|
static char
|
||||||
|
postprocess_frames (FpDeviceEgis0570 *self, guint8 * img)
|
||||||
|
{
|
||||||
|
size_t mean[EGIS0570_IMGCOUNT] = {0, 0, 0, 0, 0};
|
||||||
|
|
||||||
|
if (!self->background)
|
||||||
|
{
|
||||||
|
self->background = g_malloc (EGIS0570_IMGWIDTH * EGIS0570_RFMGHEIGHT);
|
||||||
|
memset (self->background, 255, EGIS0570_IMGWIDTH * EGIS0570_RFMGHEIGHT);
|
||||||
|
|
||||||
|
for (size_t k = 0; k < EGIS0570_IMGCOUNT; k += 1)
|
||||||
|
{
|
||||||
|
guint8 * frame = &img[(k * EGIS0570_IMGSIZE) + EGIS0570_RFMDIS * EGIS0570_IMGWIDTH];
|
||||||
|
|
||||||
|
for (size_t i = 0; i < EGIS0570_IMGWIDTH * EGIS0570_RFMGHEIGHT; i += 1)
|
||||||
|
self->background[i] = MIN (self->background[i], frame[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t k = 0; k < EGIS0570_IMGCOUNT; k += 1)
|
||||||
|
{
|
||||||
|
guint8 * frame = &img[(k * EGIS0570_IMGSIZE) + EGIS0570_RFMDIS * EGIS0570_IMGWIDTH];
|
||||||
|
|
||||||
|
for (size_t i = 0; i < EGIS0570_IMGWIDTH * EGIS0570_RFMGHEIGHT; i += 1)
|
||||||
|
{
|
||||||
|
if (frame[i] - EGIS0570_MARGIN > self->background[i])
|
||||||
|
frame[i] -= self->background[i];
|
||||||
|
else
|
||||||
|
frame[i] = 0;
|
||||||
|
|
||||||
|
mean[k] += frame[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
mean[k] /= EGIS0570_IMGWIDTH * EGIS0570_RFMGHEIGHT;
|
||||||
|
}
|
||||||
|
|
||||||
|
char result = 0;
|
||||||
|
|
||||||
|
for (size_t k = 0; k < EGIS0570_IMGCOUNT; k += 1)
|
||||||
|
{
|
||||||
|
fp_dbg ("Finger status (picture number, mean) : %ld , %ld", k, mean[k]);
|
||||||
|
if (mean[k] > EGIS0570_MIN_MEAN)
|
||||||
|
result |= 1 << k;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Device communication
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
data_resp_cb (FpiUsbTransfer *transfer, FpDevice *dev, gpointer user_data, GError *error)
|
||||||
|
{
|
||||||
|
unsigned char *stripdata;
|
||||||
|
gboolean end = FALSE;
|
||||||
|
FpImageDevice *img_self = FP_IMAGE_DEVICE (dev);
|
||||||
|
FpDeviceEgis0570 *self = FPI_DEVICE_EGIS0570 (dev);
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
fpi_ssm_mark_failed (transfer->ssm, error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int where_finger_is = postprocess_frames (self, transfer->buffer);
|
||||||
|
|
||||||
|
if (where_finger_is > 0)
|
||||||
|
{
|
||||||
|
FpiImageDeviceState state;
|
||||||
|
|
||||||
|
fpi_image_device_report_finger_status (img_self, TRUE);
|
||||||
|
|
||||||
|
g_object_get (dev, "fpi-image-device-state", &state, NULL);
|
||||||
|
if (state == FPI_IMAGE_DEVICE_STATE_CAPTURE)
|
||||||
|
{
|
||||||
|
for (size_t k = 0; k < EGIS0570_IMGCOUNT; k += 1)
|
||||||
|
{
|
||||||
|
if (where_finger_is & (1 << k))
|
||||||
|
{
|
||||||
|
struct fpi_frame *stripe = g_malloc (EGIS0570_IMGWIDTH * EGIS0570_RFMGHEIGHT + sizeof (struct fpi_frame));
|
||||||
|
stripe->delta_x = 0;
|
||||||
|
stripe->delta_y = 0;
|
||||||
|
stripdata = stripe->data;
|
||||||
|
memcpy (stripdata, (transfer->buffer) + (((k) * EGIS0570_IMGSIZE) + EGIS0570_IMGWIDTH * EGIS0570_RFMDIS), EGIS0570_IMGWIDTH * EGIS0570_RFMGHEIGHT);
|
||||||
|
self->strips = g_slist_prepend (self->strips, stripe);
|
||||||
|
self->strips_len += 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
end = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
end = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (end)
|
||||||
|
{
|
||||||
|
if (!self->stop && (self->strips_len > 0))
|
||||||
|
{
|
||||||
|
FpImage *img;
|
||||||
|
self->strips = g_slist_reverse (self->strips);
|
||||||
|
fpi_do_movement_estimation (&assembling_ctx, self->strips);
|
||||||
|
img = fpi_assemble_frames (&assembling_ctx, self->strips);
|
||||||
|
img->flags |= (FPI_IMAGE_COLORS_INVERTED | FPI_IMAGE_PARTIAL);
|
||||||
|
g_slist_free_full (self->strips, g_free);
|
||||||
|
self->strips = NULL;
|
||||||
|
self->strips_len = 0;
|
||||||
|
FpImage *resizeImage = fpi_image_resize (img, EGIS0570_RESIZE, EGIS0570_RESIZE);
|
||||||
|
fpi_image_device_image_captured (img_self, resizeImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
fpi_image_device_report_finger_status (img_self, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
fpi_ssm_next_state (transfer->ssm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
recv_data_resp (FpiSsm *ssm, FpDevice *dev)
|
||||||
|
{
|
||||||
|
FpiUsbTransfer *transfer = fpi_usb_transfer_new (dev);
|
||||||
|
|
||||||
|
fpi_usb_transfer_fill_bulk (transfer, EGIS0570_EPIN, EGIS0570_INPSIZE);
|
||||||
|
|
||||||
|
transfer->ssm = ssm;
|
||||||
|
transfer->short_is_error = TRUE;
|
||||||
|
|
||||||
|
fpi_usb_transfer_submit (transfer, EGIS0570_TIMEOUT, NULL, data_resp_cb, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
cmd_resp_cb (FpiUsbTransfer *transfer, FpDevice *dev, gpointer user_data, GError *error)
|
||||||
|
{
|
||||||
|
if (error)
|
||||||
|
fpi_ssm_mark_failed (transfer->ssm, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
recv_cmd_resp (FpiSsm *ssm, FpDevice *dev)
|
||||||
|
{
|
||||||
|
FpiUsbTransfer *transfer = fpi_usb_transfer_new (dev);
|
||||||
|
|
||||||
|
fpi_usb_transfer_fill_bulk (transfer, EGIS0570_EPIN, EGIS0570_PKTSIZE);
|
||||||
|
|
||||||
|
transfer->ssm = ssm;
|
||||||
|
|
||||||
|
fpi_usb_transfer_submit (transfer, EGIS0570_TIMEOUT, NULL, cmd_resp_cb, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
send_cmd_req (FpiSsm *ssm, FpDevice *dev, unsigned char *pkt)
|
||||||
|
{
|
||||||
|
FpiUsbTransfer *transfer = fpi_usb_transfer_new (dev);
|
||||||
|
|
||||||
|
fpi_usb_transfer_fill_bulk_full (transfer, EGIS0570_EPOUT, pkt, EGIS0570_PKTSIZE, NULL);
|
||||||
|
|
||||||
|
transfer->ssm = ssm;
|
||||||
|
transfer->short_is_error = TRUE;
|
||||||
|
|
||||||
|
fpi_usb_transfer_submit (transfer, EGIS0570_TIMEOUT, NULL, fpi_ssm_usb_transfer_cb, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SSM States
|
||||||
|
*/
|
||||||
|
|
||||||
|
enum sm_states {
|
||||||
|
SM_INIT,
|
||||||
|
SM_START,
|
||||||
|
SM_REQ,
|
||||||
|
SM_RESP,
|
||||||
|
SM_REC_DATA,
|
||||||
|
SM_DONE,
|
||||||
|
SM_STATES_NUM
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
ssm_run_state (FpiSsm *ssm, FpDevice *dev)
|
||||||
|
{
|
||||||
|
FpDeviceEgis0570 *self = FPI_DEVICE_EGIS0570 (dev);
|
||||||
|
FpImageDevice *img_dev = FP_IMAGE_DEVICE (dev);
|
||||||
|
|
||||||
|
switch (fpi_ssm_get_cur_state (ssm))
|
||||||
|
{
|
||||||
|
case SM_INIT:
|
||||||
|
self->pkt_type = PKT_TYPE_INIT;
|
||||||
|
fpi_ssm_next_state (ssm);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SM_START:
|
||||||
|
if (self->stop)
|
||||||
|
{
|
||||||
|
fp_dbg ("deactivating, marking completed");
|
||||||
|
fpi_ssm_mark_completed (ssm);
|
||||||
|
fpi_image_device_deactivate_complete (img_dev, NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self->pkt_num = 0;
|
||||||
|
fpi_ssm_next_state (ssm);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SM_REQ:
|
||||||
|
if (self->pkt_type == PKT_TYPE_INIT)
|
||||||
|
send_cmd_req (ssm, dev, init_pkts[self->pkt_num]);
|
||||||
|
else
|
||||||
|
send_cmd_req (ssm, dev, repeat_pkts[self->pkt_num]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SM_RESP:
|
||||||
|
if (is_last_pkt (dev) == FALSE)
|
||||||
|
{
|
||||||
|
recv_cmd_resp (ssm, dev);
|
||||||
|
self->pkt_num += 1;
|
||||||
|
fpi_ssm_jump_to_state (ssm, SM_REQ);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (self->pkt_type == PKT_TYPE_INIT)
|
||||||
|
self->pkt_type = PKT_TYPE_REPEAT;
|
||||||
|
|
||||||
|
fpi_ssm_next_state (ssm);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SM_REC_DATA:
|
||||||
|
recv_data_resp (ssm, dev);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SM_DONE:
|
||||||
|
fpi_ssm_jump_to_state (ssm, SM_START);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Activation
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
loop_complete (FpiSsm *ssm, FpDevice *dev, GError *error)
|
||||||
|
{
|
||||||
|
FpImageDevice *img_dev = FP_IMAGE_DEVICE (dev);
|
||||||
|
FpDeviceEgis0570 *self = FPI_DEVICE_EGIS0570 (dev);
|
||||||
|
|
||||||
|
self->running = FALSE;
|
||||||
|
g_clear_pointer (&self->background, g_free);
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
fpi_image_device_session_error (img_dev, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
dev_activate (FpImageDevice *dev)
|
||||||
|
{
|
||||||
|
FpDeviceEgis0570 *self = FPI_DEVICE_EGIS0570 (dev);
|
||||||
|
FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (dev), ssm_run_state, SM_STATES_NUM);
|
||||||
|
|
||||||
|
self->stop = FALSE;
|
||||||
|
|
||||||
|
fpi_ssm_start (ssm, loop_complete);
|
||||||
|
|
||||||
|
self->running = TRUE;
|
||||||
|
|
||||||
|
fpi_image_device_activate_complete (dev, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Opening
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
dev_init (FpImageDevice *dev)
|
||||||
|
{
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
g_usb_device_claim_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), 0, 0, &error);
|
||||||
|
|
||||||
|
fpi_image_device_open_complete (dev, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Closing
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
dev_deinit (FpImageDevice *dev)
|
||||||
|
{
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), 0, 0, &error);
|
||||||
|
|
||||||
|
fpi_image_device_close_complete (dev, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Deactivation
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
dev_deactivate (FpImageDevice *dev)
|
||||||
|
{
|
||||||
|
FpDeviceEgis0570 *self = FPI_DEVICE_EGIS0570 (dev);
|
||||||
|
|
||||||
|
if (self->running)
|
||||||
|
self->stop = TRUE;
|
||||||
|
else
|
||||||
|
fpi_image_device_deactivate_complete (dev, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Driver data
|
||||||
|
*/
|
||||||
|
|
||||||
|
static const FpIdEntry id_table[] = {
|
||||||
|
{ .vid = 0x1c7a, .pid = 0x0570, },
|
||||||
|
{ .vid = 0x1c7a, .pid = 0x0571, },
|
||||||
|
{ .vid = 0, .pid = 0, },
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
fpi_device_egis0570_init (FpDeviceEgis0570 *self)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fpi_device_egis0570_class_init (FpDeviceEgis0570Class *klass)
|
||||||
|
{
|
||||||
|
FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass);
|
||||||
|
FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass);
|
||||||
|
|
||||||
|
dev_class->id = "egis0570";
|
||||||
|
dev_class->full_name = "Egis Technology Inc. (aka. LighTuning) 0570";
|
||||||
|
dev_class->type = FP_DEVICE_TYPE_USB;
|
||||||
|
dev_class->id_table = id_table;
|
||||||
|
dev_class->scan_type = FP_SCAN_TYPE_SWIPE;
|
||||||
|
|
||||||
|
img_class->img_open = dev_init;
|
||||||
|
img_class->img_close = dev_deinit;
|
||||||
|
img_class->activate = dev_activate;
|
||||||
|
img_class->deactivate = dev_deactivate;
|
||||||
|
|
||||||
|
img_class->img_width = EGIS0570_IMGWIDTH;
|
||||||
|
img_class->img_height = -1;
|
||||||
|
|
||||||
|
img_class->bz3_threshold = EGIS0570_BZ3_THRESHOLD; /* security issue */
|
||||||
|
}
|
||||||
177
libfprint/drivers/egis0570.h
Normal file
177
libfprint/drivers/egis0570.h
Normal file
@@ -0,0 +1,177 @@
|
|||||||
|
/*
|
||||||
|
* Egis Technology Inc. (aka. LighTuning) 0570 driver for libfprint
|
||||||
|
* Copyright (C) 2021 Maxim Kolesnikov <kolesnikov@svyazcom.ru>
|
||||||
|
* Copyright (C) 2021 Saeed/Ali Rk <saeed.ali.rahimi@gmail.com>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __EGIS0570_H
|
||||||
|
|
||||||
|
#define __EGIS0570_H 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Device data
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define EGIS0570_CONF 1
|
||||||
|
#define EGIS0570_INTF 0
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Device endpoints
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define EGIS0570_EPOUT 0x04 /* ( 4 | FPI_USB_ENDPOINT_OUT ) */
|
||||||
|
#define EGIS0570_EPIN 0x83 /* ( 3 | FPI_USB_ENDPOINT_IN ) */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialization packets (7 bytes each)
|
||||||
|
*
|
||||||
|
* First 4 bytes are equivalent to string "EGIS", which must be just a company identificator
|
||||||
|
* Other 3 bytes are not recognized yet and may be not important, as they are always the same
|
||||||
|
|
||||||
|
* Answers for each packet contain 7 bytes again
|
||||||
|
* First 4 bytes are reversed "EGIS", which is "SIGE", which is company ID again
|
||||||
|
* Other 3 bytes are not recognized yet
|
||||||
|
* But there is a pattern.
|
||||||
|
* Sending last packet makes sensor return image
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define EGIS0570_TIMEOUT 10000
|
||||||
|
#define EGIS0570_PKTSIZE 7
|
||||||
|
|
||||||
|
#define EGIS0570_INIT_TOTAL (sizeof ((init_pkts)) / sizeof ((init_pkts[0])))
|
||||||
|
|
||||||
|
static unsigned char init_pkts[][EGIS0570_PKTSIZE] =
|
||||||
|
{
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x01, 0x20, 0x3f },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x01, 0x58, 0x3f },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x01, 0x21, 0x09 },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x01, 0x57, 0x09 },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x01, 0x22, 0x03 },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x01, 0x56, 0x03 },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x01, 0x23, 0x01 },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x01, 0x55, 0x01 },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x01, 0x24, 0x01 },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x01, 0x54, 0x01 },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x01, 0x16, 0x3e },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x01, 0x09, 0x0b },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x01, 0x14, 0x03 },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x01, 0x15, 0x00 },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x01, 0x02, 0x0f },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x01, 0x10, 0x00 },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x01, 0x11, 0x38 },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x01, 0x12, 0x00 },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x01, 0x13, 0x71 },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x01, 0x03, 0x80 },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x00, 0x02, 0x80 },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x01, 0x02, 0x2f },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x06, 0x00, 0xfe } /* image returned after this packet */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* There is another Packet !
|
||||||
|
* That just Work the same !!
|
||||||
|
* And the Size is different !!!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
#define EGIS0570_INIT_TOTAL2 (sizeof((init_pkts2)) / sizeof((init_pkts2[0])))
|
||||||
|
|
||||||
|
static unsigned char init_pkts2[][EGIS0570_PKTSIZE] =
|
||||||
|
{
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x01, 0x10, 0x00},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x01, 0x11, 0x38},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x01, 0x12, 0x00},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x01, 0x13, 0x71},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x01, 0x20, 0x3f},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x01, 0x58, 0x3f},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x01, 0x21, 0x07},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x01, 0x57, 0x07},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x01, 0x22, 0x02},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x01, 0x56, 0x02},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x01, 0x23, 0x00},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x01, 0x55, 0x00},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x01, 0x24, 0x00},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x01, 0x54, 0x00},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x01, 0x25, 0x00},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x01, 0x53, 0x00},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x01, 0x15, 0x00},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x01, 0x16, 0x3b},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x01, 0x09, 0x0a},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x01, 0x14, 0x00},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x01, 0x02, 0x0f},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x01, 0x03, 0x80},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x00, 0x02, 0x80},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x01, 0x02, 0x2f},
|
||||||
|
{0x45, 0x47, 0x49, 0x53, 0x06, 0x00, 0xfe}
|
||||||
|
};
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* After sending initial packets device returns image data (32512 bytes)
|
||||||
|
* To ask device to send image data again, host needs to send four additional packets
|
||||||
|
* Further work is to repeatedly send four repeat packets and read image data
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define EGIS0570_INPSIZE 32512
|
||||||
|
|
||||||
|
/* 5 image with captured in different time of size 114 * 57 = 6498
|
||||||
|
* 5 * 6498 = 32490 plus 22 extra unrecognized char size data
|
||||||
|
* Two continuous image in this 5 images may have time delay of less than 20ms
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define EGIS0570_IMGSIZE 6498
|
||||||
|
#define EGIS0570_IMGWIDTH 114
|
||||||
|
#define EGIS0570_IMGHEIGHT 57
|
||||||
|
|
||||||
|
/* size of middle area that is used from each frame */
|
||||||
|
#define EGIS0570_RFMGHEIGHT 17
|
||||||
|
/* rows to ignore from top and bottom of the image*/
|
||||||
|
#define EGIS0570_RFMDIS (EGIS0570_IMGHEIGHT - EGIS0570_RFMGHEIGHT) / 2
|
||||||
|
#define EGIS0570_IMGCOUNT 5
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Image repeat request
|
||||||
|
* First 4 bytes are the same as in initialization packets
|
||||||
|
* Have no idea what the other 3 bytes mean
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define EGIS0570_REPEAT_TOTAL (sizeof ((repeat_pkts)) / sizeof ((repeat_pkts[0])))
|
||||||
|
|
||||||
|
static unsigned char repeat_pkts[][EGIS0570_PKTSIZE] =
|
||||||
|
{
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x01, 0x02, 0x0f },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x00, 0x02, 0x0f },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x01, 0x02, 0x2f },
|
||||||
|
{ 0x45, 0x47, 0x49, 0x53, 0x06, 0x00, 0xfe } /* image returned after this packet */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This sensor is small so I decided to reduce bz3_threshold from
|
||||||
|
* 40 to 10 to have more success to fail ratio
|
||||||
|
* Bozorth3 Algorithm seems not fine at the end
|
||||||
|
* foreget about security :))
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define EGIS0570_BZ3_THRESHOLD 25 /* and even less What a joke */
|
||||||
|
|
||||||
|
#define EGIS0570_MIN_MEAN 20
|
||||||
|
#define EGIS0570_MARGIN 3
|
||||||
|
|
||||||
|
#define EGIS0570_RESIZE 2
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -218,6 +218,7 @@ static const FpIdEntry elan_id_table[] = {
|
|||||||
{.vid = ELAN_VEND_ID, .pid = 0x0c4d, .driver_data = ELAN_ALL_DEV},
|
{.vid = ELAN_VEND_ID, .pid = 0x0c4d, .driver_data = ELAN_ALL_DEV},
|
||||||
{.vid = ELAN_VEND_ID, .pid = 0x0c4f, .driver_data = ELAN_ALL_DEV},
|
{.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 = 0x0c63, .driver_data = ELAN_ALL_DEV},
|
||||||
|
{.vid = ELAN_VEND_ID, .pid = 0x0c6e, .driver_data = ELAN_ALL_DEV},
|
||||||
{.vid = 0, .pid = 0, .driver_data = 0},
|
{.vid = 0, .pid = 0, .driver_data = 0},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
1134
libfprint/drivers/elanmoc/elanmoc.c
Normal file
1134
libfprint/drivers/elanmoc/elanmoc.c
Normal file
File diff suppressed because it is too large
Load Diff
195
libfprint/drivers/elanmoc/elanmoc.h
Normal file
195
libfprint/drivers/elanmoc/elanmoc.h
Normal file
@@ -0,0 +1,195 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2021 Elan Microelectronics
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "fpi-device.h"
|
||||||
|
#include "fpi-ssm.h"
|
||||||
|
#include <libusb.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
G_DECLARE_FINAL_TYPE (FpiDeviceElanmoc, fpi_device_elanmoc, FPI, DEVICE_ELANMOC, FpDevice)
|
||||||
|
|
||||||
|
#define ELAN_MOC_DRIVER_FULLNAME "Elan MOC Sensors"
|
||||||
|
#define ELAN_M0C_CMD_LEN 0x3
|
||||||
|
#define ELAN_EP_CMD_OUT (0x1 | LIBUSB_ENDPOINT_OUT)
|
||||||
|
#define ELAN_EP_CMD_IN (0x3 | LIBUSB_ENDPOINT_IN)
|
||||||
|
#define ELAN_EP_MOC_CMD_IN (0x4 | LIBUSB_ENDPOINT_IN)
|
||||||
|
#define ELAN_EP_IMG_IN (0x2 | LIBUSB_ENDPOINT_IN)
|
||||||
|
|
||||||
|
#define ELAN_MOC_CMD_TIMEOUT 2000
|
||||||
|
#define ELAN_MOC_CAL_RETRY 500
|
||||||
|
#define ELAN_MOC_ENROLL_TIMES 9
|
||||||
|
#define ELAN_MAX_USER_ID_LEN 92
|
||||||
|
#define ELAN_MAX_ENROLL_NUM 9
|
||||||
|
|
||||||
|
#define ELAN_MSG_VERIFY_ERR 0xfd
|
||||||
|
#define ELAN_MSG_DIRTY 0xfb
|
||||||
|
#define ELAN_MSG_AREA_NOT_ENOUGH 0xfe
|
||||||
|
#define ELAN_MSG_TOO_HIGH 0x41
|
||||||
|
#define ELAN_MSG_TOO_LEFT 0x42
|
||||||
|
#define ELAN_MSG_TOO_LOW 0x43
|
||||||
|
#define ELAN_MSG_TOO_RIGHT 0x44
|
||||||
|
#define ELAN_MSG_OK 0x00
|
||||||
|
|
||||||
|
#define ELAN_MAX_HDR_LEN 3
|
||||||
|
#define ELAN_USERDATE_SIZE (ELAN_MAX_USER_ID_LEN + 3)
|
||||||
|
|
||||||
|
#define ELAN_MSG_DRIVER_VERSION "1004"
|
||||||
|
|
||||||
|
struct elanmoc_cmd
|
||||||
|
{
|
||||||
|
unsigned char cmd_header[ELAN_MAX_HDR_LEN];
|
||||||
|
int cmd_len;
|
||||||
|
int resp_len;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct elanmoc_cmd fw_ver_cmd = {
|
||||||
|
.cmd_header = {0x40, 0x19},
|
||||||
|
.cmd_len = 2,
|
||||||
|
.resp_len = 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct elanmoc_cmd sensor_dim_cmd = {
|
||||||
|
.cmd_header = {0x00, 0x0c},
|
||||||
|
.cmd_len = 2,
|
||||||
|
.resp_len = 4,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct elanmoc_cmd cal_status_cmd = {
|
||||||
|
.cmd_header = {0x40, 0xff, 0x00},
|
||||||
|
.cmd_len = 3,
|
||||||
|
.resp_len = 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct elanmoc_cmd enrolled_number_cmd = {
|
||||||
|
.cmd_header = {0x40, 0xff, 0x04},
|
||||||
|
.cmd_len = 3,
|
||||||
|
.resp_len = 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct elanmoc_cmd elanmoc_verify_cmd = {
|
||||||
|
.cmd_header = {0x40, 0xff, 0x73},
|
||||||
|
.cmd_len = 5,
|
||||||
|
.resp_len = 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct elanmoc_cmd elanmoc_above_cmd = {
|
||||||
|
.cmd_header = {0x40, 0xff, 0x02},
|
||||||
|
.cmd_len = 3,
|
||||||
|
.resp_len = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct elanmoc_cmd elanmoc_enroll_cmd = {
|
||||||
|
.cmd_header = {0x40, 0xff, 0x01},
|
||||||
|
.cmd_len = 7,
|
||||||
|
.resp_len = 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct elanmoc_cmd elanmoc_delete_cmd = {
|
||||||
|
.cmd_header = {0x40, 0xff, 0x13},
|
||||||
|
.cmd_len = 128,
|
||||||
|
.resp_len = 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct elanmoc_cmd elanmoc_enroll_commit_cmd = {
|
||||||
|
.cmd_header = {0x40, 0xff, 0x11},
|
||||||
|
.cmd_len = 128,
|
||||||
|
.resp_len = 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct elanmoc_cmd elanmoc_remove_all_cmd = {
|
||||||
|
.cmd_header = {0x40, 0xff, 0x98},
|
||||||
|
.cmd_len = 3,
|
||||||
|
.resp_len = 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct elanmoc_cmd elanmoc_get_userid_cmd = {
|
||||||
|
.cmd_header = {0x43, 0x21, 0x00},
|
||||||
|
.cmd_len = 3,
|
||||||
|
.resp_len = 97,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct elanmoc_cmd elanmoc_set_mod_cmd = {
|
||||||
|
.cmd_header = {0x40, 0xff, 0x14},
|
||||||
|
.cmd_len = 4,
|
||||||
|
.resp_len = 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct elanmoc_cmd elanmoc_check_reenroll_cmd = {
|
||||||
|
.cmd_header = {0x40, 0xff, 0x22},
|
||||||
|
.cmd_len = 5,
|
||||||
|
.resp_len = 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef void (*ElanCmdMsgCallback) (FpiDeviceElanmoc *self,
|
||||||
|
GError *error);
|
||||||
|
|
||||||
|
enum moc_enroll_states {
|
||||||
|
MOC_ENROLL_GET_ENROLLED_NUM,
|
||||||
|
MOC_ENROLL_REENROLL_CHECK,
|
||||||
|
MOC_ENROLL_WAIT_FINGER,
|
||||||
|
MOC_ENROLL_COMMIT_RESULT,
|
||||||
|
MOC_ENROLL_NUM_STATES,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum moc_list_states {
|
||||||
|
MOC_LIST_GET_ENROLLED,
|
||||||
|
MOC_LIST_GET_FINGER,
|
||||||
|
MOC_LIST_NUM_STATES,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum delete_states {
|
||||||
|
DELETE_SEND_CMD,
|
||||||
|
DELETE_NUM_STATES,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum dev_init_states {
|
||||||
|
DEV_WAIT_READY,
|
||||||
|
DEV_SET_MODE,
|
||||||
|
DEV_GET_VER,
|
||||||
|
DEV_GET_DIM,
|
||||||
|
DEV_GET_ENROLLED,
|
||||||
|
DEV_INIT_STATES,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum dev_exit_states {
|
||||||
|
DEV_EXIT_ABOVE,
|
||||||
|
DEV_EXIT_STATES,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _FpiDeviceElanmoc
|
||||||
|
{
|
||||||
|
FpDevice parent;
|
||||||
|
FpiSsm *task_ssm;
|
||||||
|
FpiSsm *cmd_ssm;
|
||||||
|
FpiUsbTransfer *cmd_transfer;
|
||||||
|
gboolean cmd_cancelable;
|
||||||
|
gsize cmd_len_in;
|
||||||
|
unsigned short fw_ver;
|
||||||
|
unsigned char x_trace;
|
||||||
|
unsigned char y_trace;
|
||||||
|
int num_frames;
|
||||||
|
int curr_enrolled;
|
||||||
|
int cancel_result;
|
||||||
|
int cmd_retry_cnt;
|
||||||
|
int list_index;
|
||||||
|
GPtrArray *list_result;
|
||||||
|
};
|
||||||
@@ -1219,7 +1219,7 @@ elanspi_guess_image (FpiDeviceElanSpi *self, guint16 *raw_image)
|
|||||||
|
|
||||||
sq_stddev /= (frame_width * frame_height);
|
sq_stddev /= (frame_width * frame_height);
|
||||||
|
|
||||||
fp_dbg ("<guess> stddev=%ld, ip=%d, is_fp=%d, is_empty=%d", sq_stddev, invalid_percent, is_fp, is_empty);
|
fp_dbg ("<guess> stddev=%" G_GUINT64_FORMAT "d, ip=%d, is_fp=%d, is_empty=%d", sq_stddev, invalid_percent, is_fp, is_empty);
|
||||||
|
|
||||||
if (invalid_percent < ELANSPI_MAX_REAL_INVALID_PERCENT)
|
if (invalid_percent < ELANSPI_MAX_REAL_INVALID_PERCENT)
|
||||||
is_fp += 1;
|
is_fp += 1;
|
||||||
|
|||||||
@@ -717,6 +717,21 @@ identify_msg_cb (FpiDeviceSynaptics *self,
|
|||||||
static void
|
static void
|
||||||
identify (FpDevice *device)
|
identify (FpDevice *device)
|
||||||
{
|
{
|
||||||
|
GPtrArray *prints = NULL;
|
||||||
|
|
||||||
|
fpi_device_get_identify_data (device, &prints);
|
||||||
|
|
||||||
|
/* Identify over no prints does not work for synaptics.
|
||||||
|
* This *may* make sense for other devices though, as identify may return
|
||||||
|
* a matched print even if it is not in the list of prints.
|
||||||
|
*/
|
||||||
|
if (prints->len == 0)
|
||||||
|
{
|
||||||
|
fpi_device_identify_report (device, NULL, NULL, NULL);
|
||||||
|
fpi_device_identify_complete (device, NULL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
init_identify_msg (device);
|
init_identify_msg (device);
|
||||||
compose_and_send_identify_msg (device);
|
compose_and_send_identify_msg (device);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ struct _FpiDeviceUpeksonly
|
|||||||
int num_flying;
|
int num_flying;
|
||||||
|
|
||||||
GSList *rows;
|
GSList *rows;
|
||||||
size_t num_rows;
|
unsigned num_rows;
|
||||||
unsigned char *rowbuf;
|
unsigned char *rowbuf;
|
||||||
int rowbuf_offset;
|
int rowbuf_offset;
|
||||||
|
|
||||||
@@ -215,7 +215,7 @@ handoff_img (FpImageDevice *dev)
|
|||||||
|
|
||||||
self->rows = g_slist_reverse (self->rows);
|
self->rows = g_slist_reverse (self->rows);
|
||||||
|
|
||||||
fp_dbg ("%lu rows", self->num_rows);
|
fp_dbg ("%u rows", self->num_rows);
|
||||||
img = fpi_assemble_lines (&self->assembling_ctx, self->rows, self->num_rows);
|
img = fpi_assemble_lines (&self->assembling_ctx, self->rows, self->num_rows);
|
||||||
|
|
||||||
g_slist_free_full (self->rows, g_free);
|
g_slist_free_full (self->rows, g_free);
|
||||||
@@ -295,7 +295,7 @@ row_complete (FpImageDevice *dev)
|
|||||||
if (self->num_blank > FINGER_REMOVED_THRESHOLD)
|
if (self->num_blank > FINGER_REMOVED_THRESHOLD)
|
||||||
{
|
{
|
||||||
self->finger_state = FINGER_REMOVED;
|
self->finger_state = FINGER_REMOVED;
|
||||||
fp_dbg ("detected finger removal. Blank rows: %d, Full rows: %lu",
|
fp_dbg ("detected finger removal. Blank rows: %d, Full rows: %u",
|
||||||
self->num_blank, self->num_rows);
|
self->num_blank, self->num_rows);
|
||||||
handoff_img (dev);
|
handoff_img (dev);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -411,7 +411,7 @@ dev_init (FpImageDevice *dev)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
fp_err ("Device variant %lu is not known", driver_data);
|
fp_err ("Device variant %" G_GUINT64_FORMAT " is not known", driver_data);
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
fpi_image_device_open_complete (dev, fpi_device_error_new (FP_DEVICE_ERROR_GENERAL));
|
fpi_image_device_open_complete (dev, fpi_device_error_new (FP_DEVICE_ERROR_GENERAL));
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -221,7 +221,7 @@ capture_read_data_cb (FpiUsbTransfer *transfer, FpDevice *device,
|
|||||||
if (response_size > transfer->actual_length)
|
if (response_size > transfer->actual_length)
|
||||||
{
|
{
|
||||||
fp_dbg ("response_size is %lu, actual_length is %d",
|
fp_dbg ("response_size is %lu, actual_length is %d",
|
||||||
response_size, (gint) transfer->actual_length);
|
(gulong) response_size, (gint) transfer->actual_length);
|
||||||
fp_dbg ("Waiting for rest of transfer");
|
fp_dbg ("Waiting for rest of transfer");
|
||||||
BUG_ON (self->response_rest);
|
BUG_ON (self->response_rest);
|
||||||
self->response_rest = response_size - transfer->actual_length;
|
self->response_rest = response_size - transfer->actual_length;
|
||||||
@@ -309,7 +309,7 @@ capture_read_data_cb (FpiUsbTransfer *transfer, FpDevice *device,
|
|||||||
data);
|
data);
|
||||||
BUG_ON (self->image_size != IMAGE_SIZE);
|
BUG_ON (self->image_size != IMAGE_SIZE);
|
||||||
fp_dbg ("Image size is %lu",
|
fp_dbg ("Image size is %lu",
|
||||||
self->image_size);
|
(gulong) self->image_size);
|
||||||
img = fp_image_new (IMAGE_WIDTH, IMAGE_HEIGHT);
|
img = fp_image_new (IMAGE_WIDTH, IMAGE_HEIGHT);
|
||||||
img->flags |= FPI_IMAGE_PARTIAL;
|
img->flags |= FPI_IMAGE_PARTIAL;
|
||||||
memcpy (img->data, self->image_bits,
|
memcpy (img->data, self->image_bits,
|
||||||
|
|||||||
@@ -366,7 +366,7 @@ read_msg_cb (FpiUsbTransfer *transfer, FpDevice *device,
|
|||||||
fp_err ("async msg read too short (%d)",
|
fp_err ("async msg read too short (%d)",
|
||||||
(gint) transfer->actual_length);
|
(gint) transfer->actual_length);
|
||||||
error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||||
"Packet from device was too short (%lu)",
|
"Packet from device was too short (%" G_GSSIZE_FORMAT ")",
|
||||||
transfer->actual_length);
|
transfer->actual_length);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@@ -993,7 +993,7 @@ e_handle_resp00 (FpDevice *dev, unsigned char *data,
|
|||||||
|
|
||||||
if (data_len != 14)
|
if (data_len != 14)
|
||||||
{
|
{
|
||||||
fp_err ("received 3001 poll response of %lu bytes?", data_len);
|
fp_err ("received 3001 poll response of %" G_GSIZE_FORMAT " bytes?", data_len);
|
||||||
do_enroll_stop (dev, NULL,
|
do_enroll_stop (dev, NULL,
|
||||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||||
"received 3001 response with wrong length"));
|
"received 3001 response with wrong length"));
|
||||||
@@ -1090,7 +1090,7 @@ e_handle_resp02 (FpDevice *dev, unsigned char *data,
|
|||||||
|
|
||||||
if (data_len < sizeof (scan_comp))
|
if (data_len < sizeof (scan_comp))
|
||||||
{
|
{
|
||||||
fp_err ("fingerprint data too short (%lu bytes)", data_len);
|
fp_err ("fingerprint data too short (%" G_GSIZE_FORMAT "u bytes)", data_len);
|
||||||
error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, "fingerprint data too short");
|
error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, "fingerprint data too short");
|
||||||
}
|
}
|
||||||
else if (memcmp (data, scan_comp, sizeof (scan_comp)) != 0)
|
else if (memcmp (data, scan_comp, sizeof (scan_comp)) != 0)
|
||||||
@@ -1318,7 +1318,7 @@ v_handle_resp00 (FpDevice *dev, unsigned char *data,
|
|||||||
|
|
||||||
if (data_len != 14)
|
if (data_len != 14)
|
||||||
{
|
{
|
||||||
fp_warn ("received 3001 poll response of %lu bytes?", data_len);
|
fp_warn ("received 3001 poll response of %" G_GSIZE_FORMAT "u bytes?", data_len);
|
||||||
error = fpi_device_error_new (FP_DEVICE_ERROR_PROTO);
|
error = fpi_device_error_new (FP_DEVICE_ERROR_PROTO);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -192,7 +192,7 @@ process_cmds (FpDeviceVirtualDevice * self,
|
|||||||
{
|
{
|
||||||
guint64 sleep_ms = g_ascii_strtoull (cmd + strlen (SLEEP_CMD_PREFIX), NULL, 10);
|
guint64 sleep_ms = g_ascii_strtoull (cmd + strlen (SLEEP_CMD_PREFIX), NULL, 10);
|
||||||
|
|
||||||
g_debug ("Sleeping %lums", sleep_ms);
|
g_debug ("Sleeping %" G_GUINT64_FORMAT "ms", sleep_ms);
|
||||||
self->sleep_timeout_id = g_timeout_add (sleep_ms, sleep_timeout_cb, self);
|
self->sleep_timeout_id = g_timeout_add (sleep_ms, sleep_timeout_cb, self);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -275,7 +275,7 @@ recv_instruction_cb (GObject *source_object,
|
|||||||
gsize bytes;
|
gsize bytes;
|
||||||
|
|
||||||
bytes = fpi_device_virtual_listener_read_finish (listener, res, &error);
|
bytes = fpi_device_virtual_listener_read_finish (listener, res, &error);
|
||||||
fp_dbg ("Got instructions of length %ld", bytes);
|
fp_dbg ("Got instructions of length %" G_GSIZE_FORMAT, bytes);
|
||||||
|
|
||||||
if (error)
|
if (error)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -281,7 +281,7 @@ fp_print_class_init (FpPrintClass *klass)
|
|||||||
"Type",
|
"Type",
|
||||||
"Private: The type of the print data",
|
"Private: The type of the print data",
|
||||||
FPI_TYPE_PRINT_TYPE,
|
FPI_TYPE_PRINT_TYPE,
|
||||||
FPI_PRINT_RAW,
|
FPI_PRINT_UNDEFINED,
|
||||||
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
|
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -323,7 +323,7 @@ transfer_chunk (FpiSpiTransfer *transfer, gsize full_length, gsize *transferred)
|
|||||||
{
|
{
|
||||||
if (skip < transfer->length_wr && len < block_size)
|
if (skip < transfer->length_wr && len < block_size)
|
||||||
{
|
{
|
||||||
xfer[transfers].tx_buf = (guint64) transfer->buffer_wr + skip;
|
xfer[transfers].tx_buf = (gsize) transfer->buffer_wr + skip;
|
||||||
xfer[transfers].len = MIN (block_size, transfer->length_wr - skip);
|
xfer[transfers].len = MIN (block_size, transfer->length_wr - skip);
|
||||||
|
|
||||||
len += xfer[transfers].len;
|
len += xfer[transfers].len;
|
||||||
@@ -340,7 +340,7 @@ transfer_chunk (FpiSpiTransfer *transfer, gsize full_length, gsize *transferred)
|
|||||||
{
|
{
|
||||||
if (skip < transfer->length_rd && len < block_size)
|
if (skip < transfer->length_rd && len < block_size)
|
||||||
{
|
{
|
||||||
xfer[transfers].rx_buf = (guint64) transfer->buffer_rd + skip;
|
xfer[transfers].rx_buf = (gsize) transfer->buffer_rd + skip;
|
||||||
xfer[transfers].len = MIN (block_size, transfer->length_rd - skip);
|
xfer[transfers].len = MIN (block_size, transfer->length_rd - skip);
|
||||||
|
|
||||||
len += xfer[transfers].len;
|
len += xfer[transfers].len;
|
||||||
|
|||||||
@@ -75,7 +75,6 @@ static const FpIdEntry whitelist_id_table[] = {
|
|||||||
{ .vid = 0x1491, .pid = 0x0088 },
|
{ .vid = 0x1491, .pid = 0x0088 },
|
||||||
{ .vid = 0x16d1, .pid = 0x1027 },
|
{ .vid = 0x16d1, .pid = 0x1027 },
|
||||||
{ .vid = 0x1c7a, .pid = 0x0300 },
|
{ .vid = 0x1c7a, .pid = 0x0300 },
|
||||||
{ .vid = 0x1c7a, .pid = 0x0570 },
|
|
||||||
{ .vid = 0x1c7a, .pid = 0x0575 },
|
{ .vid = 0x1c7a, .pid = 0x0575 },
|
||||||
{ .vid = 0x27c6, .pid = 0x5042 },
|
{ .vid = 0x27c6, .pid = 0x5042 },
|
||||||
{ .vid = 0x27c6, .pid = 0x5110 },
|
{ .vid = 0x27c6, .pid = 0x5110 },
|
||||||
|
|||||||
@@ -80,128 +80,91 @@ nbis_sources = [
|
|||||||
'nbis/mindtct/xytreps.c',
|
'nbis/mindtct/xytreps.c',
|
||||||
]
|
]
|
||||||
|
|
||||||
aeslib = false
|
driver_sources = {
|
||||||
aesx660 = false
|
'upekts' :
|
||||||
aes3k = false
|
[ 'drivers/upekts.c', 'drivers/upek_proto.c' ],
|
||||||
|
'upektc' :
|
||||||
|
[ 'drivers/upektc.c' ],
|
||||||
|
'upeksonly' :
|
||||||
|
[ 'drivers/upeksonly.c' ],
|
||||||
|
'uru4000' :
|
||||||
|
[ 'drivers/uru4000.c' ],
|
||||||
|
'aes1610' :
|
||||||
|
[ 'drivers/aes1610.c' ],
|
||||||
|
'aes1660' :
|
||||||
|
[ 'drivers/aes1660.c' ],
|
||||||
|
'aes2501' :
|
||||||
|
[ 'drivers/aes2501.c' ],
|
||||||
|
'aes2550' :
|
||||||
|
[ 'drivers/aes2550.c' ],
|
||||||
|
'aes2660' :
|
||||||
|
[ 'drivers/aes2660.c' ],
|
||||||
|
'aes3500' :
|
||||||
|
[ 'drivers/aes3500.c' ],
|
||||||
|
'aes4000' :
|
||||||
|
[ 'drivers/aes4000.c' ],
|
||||||
|
'vcom5s' :
|
||||||
|
[ 'drivers/vcom5s.c' ],
|
||||||
|
'vfs101' :
|
||||||
|
[ 'drivers/vfs101.c' ],
|
||||||
|
'vfs301' :
|
||||||
|
[ 'drivers/vfs301.c', 'drivers/vfs301_proto.c' ],
|
||||||
|
'vfs5011' :
|
||||||
|
[ 'drivers/vfs5011.c' ],
|
||||||
|
'vfs7552' :
|
||||||
|
[ 'drivers/vfs7552.c' ],
|
||||||
|
'upektc_img' :
|
||||||
|
[ 'drivers/upektc_img.c', 'drivers/upek_proto.c' ],
|
||||||
|
'etes603' :
|
||||||
|
[ 'drivers/etes603.c' ],
|
||||||
|
'egis0570' :
|
||||||
|
[ 'drivers/egis0570.c' ],
|
||||||
|
'vfs0050' :
|
||||||
|
[ 'drivers/vfs0050.c' ],
|
||||||
|
'elan' :
|
||||||
|
[ 'drivers/elan.c' ],
|
||||||
|
'elanmoc' :
|
||||||
|
[ 'drivers/elanmoc/elanmoc.c' ],
|
||||||
|
'elanspi' :
|
||||||
|
[ 'drivers/elanspi.c' ],
|
||||||
|
'nb1010' :
|
||||||
|
[ 'drivers/nb1010.c' ],
|
||||||
|
'virtual_image' :
|
||||||
|
[ 'drivers/virtual-image.c' ],
|
||||||
|
'virtual_device' :
|
||||||
|
[ 'drivers/virtual-device.c' ],
|
||||||
|
'virtual_device_storage' :
|
||||||
|
[ 'drivers/virtual-device-storage.c' ],
|
||||||
|
'synaptics' :
|
||||||
|
[ 'drivers/synaptics/synaptics.c', 'drivers/synaptics/bmkt_message.c' ],
|
||||||
|
'goodixmoc' :
|
||||||
|
[ 'drivers/goodixmoc/goodix.c', 'drivers/goodixmoc/goodix_proto.c' ],
|
||||||
|
}
|
||||||
|
|
||||||
|
helper_sources = {
|
||||||
|
'aeslib' :
|
||||||
|
[ 'drivers/aeslib.c' ],
|
||||||
|
'aesx660' :
|
||||||
|
[ 'drivers/aesx660.c' ],
|
||||||
|
'aes3k' :
|
||||||
|
[ 'drivers/aes3k.c' ],
|
||||||
|
'nss' :
|
||||||
|
[ ],
|
||||||
|
'udev' :
|
||||||
|
[ ],
|
||||||
|
'virtual' :
|
||||||
|
[ 'drivers/virtual-device-listener.c' ],
|
||||||
|
}
|
||||||
|
|
||||||
drivers_sources = []
|
drivers_sources = []
|
||||||
drivers_cflags = []
|
drivers_cflags = []
|
||||||
foreach driver: drivers
|
foreach driver: drivers
|
||||||
if driver == 'upekts'
|
drivers_sources += driver_sources[driver]
|
||||||
drivers_sources += [ 'drivers/upekts.c', 'drivers/upek_proto.c' ]
|
endforeach
|
||||||
endif
|
foreach helper : driver_helpers
|
||||||
if driver == 'upektc'
|
drivers_sources += helper_sources[helper]
|
||||||
drivers_sources += [ 'drivers/upektc.c' ]
|
|
||||||
endif
|
|
||||||
if driver == 'upeksonly'
|
|
||||||
drivers_sources += [ 'drivers/upeksonly.c' ]
|
|
||||||
endif
|
|
||||||
if driver == 'uru4000'
|
|
||||||
drivers_sources += [ 'drivers/uru4000.c' ]
|
|
||||||
endif
|
|
||||||
if driver == 'aes1610'
|
|
||||||
drivers_sources += [ 'drivers/aes1610.c' ]
|
|
||||||
aeslib = true
|
|
||||||
endif
|
|
||||||
if driver == 'aes1660'
|
|
||||||
drivers_sources += [ 'drivers/aes1660.c' ]
|
|
||||||
aeslib = true
|
|
||||||
aesx660 = true
|
|
||||||
endif
|
|
||||||
if driver == 'aes2501'
|
|
||||||
drivers_sources += [ 'drivers/aes2501.c' ]
|
|
||||||
aeslib = true
|
|
||||||
endif
|
|
||||||
if driver == 'aes2550'
|
|
||||||
drivers_sources += [ 'drivers/aes2550.c' ]
|
|
||||||
aeslib = true
|
|
||||||
endif
|
|
||||||
if driver == 'aes2660'
|
|
||||||
drivers_sources += [ 'drivers/aes2660.c' ]
|
|
||||||
aeslib = true
|
|
||||||
aesx660 = true
|
|
||||||
endif
|
|
||||||
if driver == 'aes3500'
|
|
||||||
drivers_sources += [ 'drivers/aes3500.c' ]
|
|
||||||
aeslib = true
|
|
||||||
aes3k = true
|
|
||||||
endif
|
|
||||||
if driver == 'aes4000'
|
|
||||||
drivers_sources += [ 'drivers/aes4000.c' ]
|
|
||||||
aeslib = true
|
|
||||||
aes3k = true
|
|
||||||
endif
|
|
||||||
if driver == 'vcom5s'
|
|
||||||
drivers_sources += [ 'drivers/vcom5s.c' ]
|
|
||||||
endif
|
|
||||||
if driver == 'vfs101'
|
|
||||||
drivers_sources += [ 'drivers/vfs101.c' ]
|
|
||||||
endif
|
|
||||||
if driver == 'vfs301'
|
|
||||||
drivers_sources += [ 'drivers/vfs301.c', 'drivers/vfs301_proto.c' ]
|
|
||||||
endif
|
|
||||||
if driver == 'vfs5011'
|
|
||||||
drivers_sources += [ 'drivers/vfs5011.c' ]
|
|
||||||
endif
|
|
||||||
if driver == 'vfs7552'
|
|
||||||
drivers_sources += [ 'drivers/vfs7552.c' ]
|
|
||||||
endif
|
|
||||||
if driver == 'upektc_img'
|
|
||||||
drivers_sources += [ 'drivers/upektc_img.c', 'drivers/upek_proto.c' ]
|
|
||||||
endif
|
|
||||||
if driver == 'etes603'
|
|
||||||
drivers_sources += [ 'drivers/etes603.c' ]
|
|
||||||
endif
|
|
||||||
if driver == 'vfs0050'
|
|
||||||
drivers_sources += [ 'drivers/vfs0050.c' ]
|
|
||||||
endif
|
|
||||||
if driver == 'elan'
|
|
||||||
drivers_sources += [ 'drivers/elan.c' ]
|
|
||||||
endif
|
|
||||||
if driver == 'elanspi'
|
|
||||||
drivers_sources += [ 'drivers/elanspi.c' ]
|
|
||||||
endif
|
|
||||||
if driver == 'virtual_image'
|
|
||||||
drivers_sources += [ 'drivers/virtual-image.c' ]
|
|
||||||
endif
|
|
||||||
if driver == 'virtual_device'
|
|
||||||
drivers_sources += [ 'drivers/virtual-device.c' ]
|
|
||||||
endif
|
|
||||||
if driver == 'virtual_device_storage'
|
|
||||||
drivers_sources += [ 'drivers/virtual-device-storage.c' ]
|
|
||||||
endif
|
|
||||||
if driver.startswith('virtual_')
|
|
||||||
drivers_sources += [ 'drivers/virtual-device-listener.c' ]
|
|
||||||
endif
|
|
||||||
if driver == 'synaptics'
|
|
||||||
drivers_sources += [
|
|
||||||
'drivers/synaptics/synaptics.c',
|
|
||||||
'drivers/synaptics/bmkt_message.c',
|
|
||||||
]
|
|
||||||
endif
|
|
||||||
if driver == 'goodixmoc'
|
|
||||||
drivers_sources += [
|
|
||||||
'drivers/goodixmoc/goodix.c',
|
|
||||||
'drivers/goodixmoc/goodix_proto.c',
|
|
||||||
]
|
|
||||||
endif
|
|
||||||
if driver == 'nb1010'
|
|
||||||
drivers_sources += [
|
|
||||||
'drivers/nb1010.c',
|
|
||||||
]
|
|
||||||
endif
|
|
||||||
endforeach
|
endforeach
|
||||||
|
|
||||||
if aeslib
|
|
||||||
drivers_sources += [ 'drivers/aeslib.c' ]
|
|
||||||
endif
|
|
||||||
if aesx660
|
|
||||||
drivers_sources += ['drivers/aesx660.c' ]
|
|
||||||
endif
|
|
||||||
if aes3k
|
|
||||||
drivers_sources += ['drivers/aes3k.c' ]
|
|
||||||
endif
|
|
||||||
|
|
||||||
other_sources = []
|
|
||||||
|
|
||||||
fp_enums = gnome.mkenums_simple('fp-enums',
|
fp_enums = gnome.mkenums_simple('fp-enums',
|
||||||
sources: libfprint_public_headers,
|
sources: libfprint_public_headers,
|
||||||
@@ -220,6 +183,28 @@ enums_dep = declare_dependency(
|
|||||||
sources: [ fp_enums_h, fpi_enums_h ]
|
sources: [ fp_enums_h, fpi_enums_h ]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Export the drivers' types to the core code
|
||||||
|
drivers_type_list = []
|
||||||
|
drivers_type_func = []
|
||||||
|
drivers_type_list += '#include <glib-object.h>'
|
||||||
|
drivers_type_list += '#include "fpi-context.h"'
|
||||||
|
drivers_type_list += ''
|
||||||
|
drivers_type_func += 'GArray *'
|
||||||
|
drivers_type_func += 'fpi_get_driver_types (void)'
|
||||||
|
drivers_type_func += '{'
|
||||||
|
drivers_type_func += ' GArray *drivers = g_array_new (TRUE, FALSE, sizeof (GType));'
|
||||||
|
drivers_type_func += ' GType t;'
|
||||||
|
drivers_type_func += ''
|
||||||
|
foreach driver: supported_drivers
|
||||||
|
drivers_type_list += 'extern GType (fpi_device_' + driver + '_get_type) (void);'
|
||||||
|
drivers_type_func += ' t = fpi_device_' + driver + '_get_type ();'
|
||||||
|
drivers_type_func += ' g_array_append_val (drivers, t);'
|
||||||
|
drivers_type_func += ''
|
||||||
|
endforeach
|
||||||
|
drivers_type_list += ''
|
||||||
|
drivers_type_func += ' return drivers;'
|
||||||
|
drivers_type_func += '}'
|
||||||
|
|
||||||
drivers_sources += configure_file(input: 'empty_file',
|
drivers_sources += configure_file(input: 'empty_file',
|
||||||
output: 'fpi-drivers.c',
|
output: 'fpi-drivers.c',
|
||||||
capture: true,
|
capture: true,
|
||||||
@@ -234,11 +219,8 @@ deps = [
|
|||||||
glib_dep,
|
glib_dep,
|
||||||
gobject_dep,
|
gobject_dep,
|
||||||
gusb_dep,
|
gusb_dep,
|
||||||
gudev_dep,
|
|
||||||
imaging_dep,
|
|
||||||
mathlib_dep,
|
mathlib_dep,
|
||||||
nss_dep,
|
] + optional_deps
|
||||||
]
|
|
||||||
|
|
||||||
# These are empty and only exist so that the include directories are created
|
# These are empty and only exist so that the include directories are created
|
||||||
# in the build tree. This silences a build time warning.
|
# in the build tree. This silences a build time warning.
|
||||||
@@ -285,7 +267,6 @@ libfprint = shared_library(versioned_libname.split('lib')[1],
|
|||||||
sources: [
|
sources: [
|
||||||
fp_enums,
|
fp_enums,
|
||||||
libfprint_sources,
|
libfprint_sources,
|
||||||
other_sources,
|
|
||||||
],
|
],
|
||||||
soversion: soversion,
|
soversion: soversion,
|
||||||
version: libversion,
|
version: libversion,
|
||||||
|
|||||||
115
meson.build
115
meson.build
@@ -1,5 +1,5 @@
|
|||||||
project('libfprint', [ 'c', 'cpp' ],
|
project('libfprint', [ 'c', 'cpp' ],
|
||||||
version: '1.92.0',
|
version: '1.92.1',
|
||||||
license: 'LGPLv2.1+',
|
license: 'LGPLv2.1+',
|
||||||
default_options: [
|
default_options: [
|
||||||
'buildtype=debugoptimized',
|
'buildtype=debugoptimized',
|
||||||
@@ -113,9 +113,11 @@ default_drivers = [
|
|||||||
'vfs301',
|
'vfs301',
|
||||||
'vfs0050',
|
'vfs0050',
|
||||||
'etes603',
|
'etes603',
|
||||||
|
'egis0570',
|
||||||
'vcom5s',
|
'vcom5s',
|
||||||
'synaptics',
|
'synaptics',
|
||||||
'elan',
|
'elan',
|
||||||
|
'elanmoc',
|
||||||
'uru4000',
|
'uru4000',
|
||||||
'upektc',
|
'upektc',
|
||||||
'upeksonly',
|
'upeksonly',
|
||||||
@@ -144,10 +146,32 @@ if drivers == [ 'default' ]
|
|||||||
drivers = default_drivers
|
drivers = default_drivers
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# For detection whether udev is needed
|
driver_helper_mapping = {
|
||||||
udev_drivers = [
|
'aes1610' : [ 'aeslib' ],
|
||||||
'elanspi'
|
'aes1660' : [ 'aeslib', 'aesx660' ],
|
||||||
]
|
'aes2501' : [ 'aeslib' ],
|
||||||
|
'aes2550' : [ 'aeslib' ],
|
||||||
|
'aes2660' : [ 'aeslib', 'aesx660' ],
|
||||||
|
'aes3500' : [ 'aeslib', 'aes3k' ],
|
||||||
|
'aes4000' : [ 'aeslib', 'aes3k' ],
|
||||||
|
'uru4000' : [ 'nss' ],
|
||||||
|
'elanspi' : [ 'udev' ],
|
||||||
|
'virtual_image' : [ 'virtual' ],
|
||||||
|
'virtual_device' : [ 'virtual' ],
|
||||||
|
'virtual_device_storage' : [ 'virtual' ],
|
||||||
|
}
|
||||||
|
|
||||||
|
driver_helpers = []
|
||||||
|
foreach driver : drivers
|
||||||
|
if driver in driver_helper_mapping
|
||||||
|
foreach helper : driver_helper_mapping[driver]
|
||||||
|
if helper not in driver_helpers
|
||||||
|
driver_helpers += helper
|
||||||
|
endif
|
||||||
|
endforeach
|
||||||
|
endif
|
||||||
|
endforeach
|
||||||
|
|
||||||
|
|
||||||
if drivers.length() == 0 or drivers[0] == ''
|
if drivers.length() == 0 or drivers[0] == ''
|
||||||
error('Cannot build libfprint without drivers, please specify a valid value for the drivers option')
|
error('Cannot build libfprint without drivers, please specify a valid value for the drivers option')
|
||||||
@@ -165,41 +189,46 @@ else
|
|||||||
endforeach
|
endforeach
|
||||||
endif
|
endif
|
||||||
|
|
||||||
nss_dep = dependency('', required: false)
|
|
||||||
imaging_dep = dependency('', required: false)
|
|
||||||
gudev_dep = dependency('', required: false)
|
|
||||||
libfprint_conf.set10('HAVE_PIXMAN', false)
|
|
||||||
|
|
||||||
udev_rules = get_option('udev_rules')
|
udev_rules = get_option('udev_rules')
|
||||||
install_udev_rules = udev_rules.enabled()
|
install_udev_rules = udev_rules.enabled()
|
||||||
|
|
||||||
foreach driver: drivers
|
optional_deps = []
|
||||||
if driver == 'uru4000'
|
|
||||||
nss_dep = dependency('nss', required: false)
|
# Resolve extra dependencies
|
||||||
if not nss_dep.found()
|
foreach i : driver_helpers
|
||||||
error('NSS is required for the URU4000/URU4500 driver')
|
foreach d, helpers : driver_helper_mapping
|
||||||
|
if i in helpers
|
||||||
|
driver = d
|
||||||
|
break
|
||||||
endif
|
endif
|
||||||
endif
|
endforeach
|
||||||
if driver == 'aes3500' or driver == 'aes4000' or driver == 'elanspi'
|
|
||||||
|
if i == 'aes3k'
|
||||||
imaging_dep = dependency('pixman-1', required: false)
|
imaging_dep = dependency('pixman-1', required: false)
|
||||||
if not imaging_dep.found()
|
if not imaging_dep.found()
|
||||||
error('pixman is required for imaging support')
|
error('pixman is required for @0@ and possibly others'.format(driver))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
libfprint_conf.set10('HAVE_PIXMAN', true)
|
libfprint_conf.set10('HAVE_PIXMAN', true)
|
||||||
endif
|
optional_deps += imaging_dep
|
||||||
if udev_drivers.contains(driver)
|
elif i == 'nss'
|
||||||
install_udev_rules = true
|
nss_dep = dependency('nss', required: false)
|
||||||
|
if not nss_dep.found()
|
||||||
gudev_dep = dependency('gudev-1.0', required: false)
|
error('nss is required for @0@ and possibly others'.format(driver))
|
||||||
if not gudev_dep.found()
|
|
||||||
error('udev is required for SPI support')
|
|
||||||
endif
|
|
||||||
|
|
||||||
libfprint_conf.set10('HAVE_UDEV', true)
|
|
||||||
endif
|
endif
|
||||||
if not all_drivers.contains(driver)
|
|
||||||
error('Invalid driver \'' + driver + '\'')
|
optional_deps += nss_dep
|
||||||
|
elif i == 'udev'
|
||||||
|
install_udev_rules = true
|
||||||
|
|
||||||
|
gudev_dep = dependency('gudev-1.0', required: false)
|
||||||
|
if not gudev_dep.found()
|
||||||
|
error('udev is required for SPI support')
|
||||||
|
endif
|
||||||
|
|
||||||
|
libfprint_conf.set10('HAVE_UDEV', true)
|
||||||
|
|
||||||
|
optional_deps += gudev_dep
|
||||||
endif
|
endif
|
||||||
endforeach
|
endforeach
|
||||||
|
|
||||||
@@ -229,28 +258,6 @@ if default_drivers_are_enabled and supported_drivers != drivers
|
|||||||
default_drivers_are_enabled = false
|
default_drivers_are_enabled = false
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Export the drivers' types to the core code
|
|
||||||
drivers_type_list = []
|
|
||||||
drivers_type_func = []
|
|
||||||
drivers_type_list += '#include <glib-object.h>'
|
|
||||||
drivers_type_list += '#include "fpi-context.h"'
|
|
||||||
drivers_type_list += ''
|
|
||||||
drivers_type_func += 'GArray *'
|
|
||||||
drivers_type_func += 'fpi_get_driver_types (void)'
|
|
||||||
drivers_type_func += '{'
|
|
||||||
drivers_type_func += ' GArray *drivers = g_array_new (TRUE, FALSE, sizeof (GType));'
|
|
||||||
drivers_type_func += ' GType t;'
|
|
||||||
drivers_type_func += ''
|
|
||||||
foreach driver: supported_drivers
|
|
||||||
drivers_type_list += 'extern GType (fpi_device_' + driver + '_get_type) (void);'
|
|
||||||
drivers_type_func += ' t = fpi_device_' + driver + '_get_type ();'
|
|
||||||
drivers_type_func += ' g_array_append_val (drivers, t);'
|
|
||||||
drivers_type_func += ''
|
|
||||||
endforeach
|
|
||||||
drivers_type_list += ''
|
|
||||||
drivers_type_func += ' return drivers;'
|
|
||||||
drivers_type_func += '}'
|
|
||||||
|
|
||||||
root_inc = include_directories('.')
|
root_inc = include_directories('.')
|
||||||
|
|
||||||
udev_hwdb = get_option('udev_hwdb')
|
udev_hwdb = get_option('udev_hwdb')
|
||||||
@@ -285,9 +292,11 @@ if get_option('gtk-examples')
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Some dependency resolving happens inside here
|
||||||
|
subdir('libfprint')
|
||||||
|
|
||||||
configure_file(output: 'config.h', configuration: libfprint_conf)
|
configure_file(output: 'config.h', configuration: libfprint_conf)
|
||||||
|
|
||||||
subdir('libfprint')
|
|
||||||
subdir('examples')
|
subdir('examples')
|
||||||
if get_option('doc')
|
if get_option('doc')
|
||||||
gnome = import('gnome')
|
gnome = import('gnome')
|
||||||
|
|||||||
@@ -12,8 +12,11 @@ case "$1" in
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
ARGS=4
|
||||||
|
JOBS=4
|
||||||
|
|
||||||
pushd "$SRCROOT"
|
pushd "$SRCROOT"
|
||||||
uncrustify -c "$CFG" $OPTS `git ls-tree --name-only -r HEAD | grep -E '.*\.[ch]$' | grep -v nbis | grep -v fpi-byte | grep -v build/`
|
git ls-tree --name-only -r HEAD | grep -E '.*\.[ch]$' | grep -v nbis | grep -v fpi-byte | grep -v build/ | xargs -n$ARGS -P $JOBS uncrustify -c "$CFG" $OPTS
|
||||||
RES=$?
|
RES=$?
|
||||||
popd
|
popd
|
||||||
exit $RES
|
exit $RES
|
||||||
|
|||||||
BIN
tests/egis0570/capture.pcapng
Executable file
BIN
tests/egis0570/capture.pcapng
Executable file
Binary file not shown.
BIN
tests/egis0570/capture.png
Normal file
BIN
tests/egis0570/capture.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 100 KiB |
228
tests/egis0570/device
Normal file
228
tests/egis0570/device
Normal file
@@ -0,0 +1,228 @@
|
|||||||
|
P: /devices/pci0000:00/0000:00:14.0/usb1/1-9
|
||||||
|
N: bus/usb/001/005=12011001000000087A1C700541100102030109022000010100A0320904000002FF0000000705830240000007050402400003
|
||||||
|
E: DEVNAME=/dev/bus/usb/001/005
|
||||||
|
E: DEVTYPE=usb_device
|
||||||
|
E: DRIVER=usb
|
||||||
|
E: PRODUCT=1c7a/570/1041
|
||||||
|
E: TYPE=0/0/0
|
||||||
|
E: BUSNUM=001
|
||||||
|
E: DEVNUM=005
|
||||||
|
E: MAJOR=189
|
||||||
|
E: MINOR=4
|
||||||
|
E: SUBSYSTEM=usb
|
||||||
|
E: ID_VENDOR=EgisTec
|
||||||
|
E: ID_VENDOR_ENC=EgisTec
|
||||||
|
E: ID_VENDOR_ID=1c7a
|
||||||
|
E: ID_MODEL=EgisTec_Touch_Fingerprint_Sensor
|
||||||
|
E: ID_MODEL_ENC=EgisTec\x20Touch\x20Fingerprint\x20Sensor
|
||||||
|
E: ID_MODEL_ID=0570
|
||||||
|
E: ID_REVISION=1041
|
||||||
|
E: ID_SERIAL=EgisTec_EgisTec_Touch_Fingerprint_Sensor_W700B41B
|
||||||
|
E: ID_SERIAL_SHORT=W700B41B
|
||||||
|
E: ID_BUS=usb
|
||||||
|
E: ID_USB_INTERFACES=:ff0000:
|
||||||
|
E: ID_VENDOR_FROM_DATABASE=LighTuning Technology Inc.
|
||||||
|
E: ID_PATH=pci-0000:00:14.0-usb-0:9
|
||||||
|
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_9
|
||||||
|
E: LIBFPRINT_DRIVER=Hardcoded whitelist
|
||||||
|
A: authorized=1
|
||||||
|
A: avoid_reset_quirk=0
|
||||||
|
A: bConfigurationValue=1
|
||||||
|
A: bDeviceClass=00
|
||||||
|
A: bDeviceProtocol=00
|
||||||
|
A: bDeviceSubClass=00
|
||||||
|
A: bMaxPacketSize0=8
|
||||||
|
A: bMaxPower=100mA
|
||||||
|
A: bNumConfigurations=1
|
||||||
|
A: bNumInterfaces= 1
|
||||||
|
A: bcdDevice=1041
|
||||||
|
A: bmAttributes=a0
|
||||||
|
A: busnum=1
|
||||||
|
A: configuration=
|
||||||
|
H: descriptors=12011001000000087A1C700541100102030109022000010100A0320904000002FF0000000705830240000007050402400003
|
||||||
|
A: dev=189:4
|
||||||
|
A: devnum=5
|
||||||
|
A: devpath=9
|
||||||
|
L: driver=../../../../../bus/usb/drivers/usb
|
||||||
|
A: idProduct=0570
|
||||||
|
A: idVendor=1c7a
|
||||||
|
A: ltm_capable=no
|
||||||
|
A: manufacturer=EgisTec
|
||||||
|
A: maxchild=0
|
||||||
|
L: port=../1-0:1.0/usb1-port9
|
||||||
|
A: power/active_duration=362352
|
||||||
|
A: power/async=enabled
|
||||||
|
A: power/autosuspend=2
|
||||||
|
A: power/autosuspend_delay_ms=2000
|
||||||
|
A: power/connected_duration=5526124
|
||||||
|
A: power/control=auto
|
||||||
|
A: power/level=auto
|
||||||
|
A: power/persist=1
|
||||||
|
A: power/runtime_active_kids=0
|
||||||
|
A: power/runtime_active_time=365097
|
||||||
|
A: power/runtime_enabled=enabled
|
||||||
|
A: power/runtime_status=active
|
||||||
|
A: power/runtime_suspended_time=5160752
|
||||||
|
A: power/runtime_usage=0
|
||||||
|
A: power/wakeup=disabled
|
||||||
|
A: power/wakeup_abort_count=
|
||||||
|
A: power/wakeup_active=
|
||||||
|
A: power/wakeup_active_count=
|
||||||
|
A: power/wakeup_count=
|
||||||
|
A: power/wakeup_expire_count=
|
||||||
|
A: power/wakeup_last_time_ms=
|
||||||
|
A: power/wakeup_max_time_ms=
|
||||||
|
A: power/wakeup_total_time_ms=
|
||||||
|
A: product=EgisTec Touch Fingerprint Sensor
|
||||||
|
A: quirks=0x0
|
||||||
|
A: removable=fixed
|
||||||
|
A: rx_lanes=1
|
||||||
|
A: serial=W700B41B
|
||||||
|
A: speed=12
|
||||||
|
A: tx_lanes=1
|
||||||
|
A: urbnum=8040
|
||||||
|
A: version= 1.10
|
||||||
|
|
||||||
|
P: /devices/pci0000:00/0000:00:14.0/usb1
|
||||||
|
N: bus/usb/001/001=12010002090001406B1D020008050302010109021900010100E0000904000001090000000705810304000C
|
||||||
|
E: DEVNAME=/dev/bus/usb/001/001
|
||||||
|
E: DEVTYPE=usb_device
|
||||||
|
E: DRIVER=usb
|
||||||
|
E: PRODUCT=1d6b/2/508
|
||||||
|
E: TYPE=9/0/1
|
||||||
|
E: BUSNUM=001
|
||||||
|
E: DEVNUM=001
|
||||||
|
E: MAJOR=189
|
||||||
|
E: MINOR=0
|
||||||
|
E: SUBSYSTEM=usb
|
||||||
|
E: ID_VENDOR=Linux_5.8.0-59-generic_xhci-hcd
|
||||||
|
E: ID_VENDOR_ENC=Linux\x205.8.0-59-generic\x20xhci-hcd
|
||||||
|
E: ID_VENDOR_ID=1d6b
|
||||||
|
E: ID_MODEL=xHCI_Host_Controller
|
||||||
|
E: ID_MODEL_ENC=xHCI\x20Host\x20Controller
|
||||||
|
E: ID_MODEL_ID=0002
|
||||||
|
E: ID_REVISION=0508
|
||||||
|
E: ID_SERIAL=Linux_5.8.0-59-generic_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
|
||||||
|
E: ID_SERIAL_SHORT=0000:00:14.0
|
||||||
|
E: ID_BUS=usb
|
||||||
|
E: ID_USB_INTERFACES=:090000:
|
||||||
|
E: ID_VENDOR_FROM_DATABASE=Linux Foundation
|
||||||
|
E: ID_MODEL_FROM_DATABASE=2.0 root hub
|
||||||
|
E: ID_PATH=pci-0000:00:14.0
|
||||||
|
E: ID_PATH_TAG=pci-0000_00_14_0
|
||||||
|
E: ID_FOR_SEAT=usb-pci-0000_00_14_0
|
||||||
|
E: TAGS=:seat:
|
||||||
|
A: authorized=1
|
||||||
|
A: authorized_default=1
|
||||||
|
A: avoid_reset_quirk=0
|
||||||
|
A: bConfigurationValue=1
|
||||||
|
A: bDeviceClass=09
|
||||||
|
A: bDeviceProtocol=01
|
||||||
|
A: bDeviceSubClass=00
|
||||||
|
A: bMaxPacketSize0=64
|
||||||
|
A: bMaxPower=0mA
|
||||||
|
A: bNumConfigurations=1
|
||||||
|
A: bNumInterfaces= 1
|
||||||
|
A: bcdDevice=0508
|
||||||
|
A: bmAttributes=e0
|
||||||
|
A: busnum=1
|
||||||
|
A: configuration=
|
||||||
|
H: descriptors=12010002090001406B1D020008050302010109021900010100E0000904000001090000000705810304000C
|
||||||
|
A: dev=189:0
|
||||||
|
A: devnum=1
|
||||||
|
A: devpath=0
|
||||||
|
L: driver=../../../../bus/usb/drivers/usb
|
||||||
|
A: idProduct=0002
|
||||||
|
A: idVendor=1d6b
|
||||||
|
A: interface_authorized_default=1
|
||||||
|
A: ltm_capable=no
|
||||||
|
A: manufacturer=Linux 5.8.0-59-generic xhci-hcd
|
||||||
|
A: maxchild=12
|
||||||
|
A: power/active_duration=378024
|
||||||
|
A: power/async=enabled
|
||||||
|
A: power/autosuspend=0
|
||||||
|
A: power/autosuspend_delay_ms=0
|
||||||
|
A: power/connected_duration=5527220
|
||||||
|
A: power/control=auto
|
||||||
|
A: power/level=auto
|
||||||
|
A: power/runtime_active_kids=1
|
||||||
|
A: power/runtime_active_time=377962
|
||||||
|
A: power/runtime_enabled=enabled
|
||||||
|
A: power/runtime_status=active
|
||||||
|
A: power/runtime_suspended_time=5149253
|
||||||
|
A: power/runtime_usage=0
|
||||||
|
A: power/wakeup=disabled
|
||||||
|
A: power/wakeup_abort_count=
|
||||||
|
A: power/wakeup_active=
|
||||||
|
A: power/wakeup_active_count=
|
||||||
|
A: power/wakeup_count=
|
||||||
|
A: power/wakeup_expire_count=
|
||||||
|
A: power/wakeup_last_time_ms=
|
||||||
|
A: power/wakeup_max_time_ms=
|
||||||
|
A: power/wakeup_total_time_ms=
|
||||||
|
A: product=xHCI Host Controller
|
||||||
|
A: quirks=0x0
|
||||||
|
A: removable=unknown
|
||||||
|
A: rx_lanes=1
|
||||||
|
A: serial=0000:00:14.0
|
||||||
|
A: speed=480
|
||||||
|
A: tx_lanes=1
|
||||||
|
A: urbnum=956
|
||||||
|
A: version= 2.00
|
||||||
|
|
||||||
|
P: /devices/pci0000:00/0000:00:14.0
|
||||||
|
E: DRIVER=xhci_hcd
|
||||||
|
E: PCI_CLASS=C0330
|
||||||
|
E: PCI_ID=8086:9D2F
|
||||||
|
E: PCI_SUBSYS_ID=1025:118E
|
||||||
|
E: PCI_SLOT_NAME=0000:00:14.0
|
||||||
|
E: MODALIAS=pci:v00008086d00009D2Fsv00001025sd0000118Ebc0Csc03i30
|
||||||
|
E: SUBSYSTEM=pci
|
||||||
|
E: ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
|
||||||
|
E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
|
||||||
|
E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI
|
||||||
|
E: ID_VENDOR_FROM_DATABASE=Intel Corporation
|
||||||
|
E: ID_MODEL_FROM_DATABASE=Sunrise Point-LP USB 3.0 xHCI Controller
|
||||||
|
A: ari_enabled=0
|
||||||
|
A: broken_parity_status=0
|
||||||
|
A: class=0x0c0330
|
||||||
|
H: config=86802F9D060490022130030C00008000040021A400000000000000000000000000000000000000000000000025108E11000000007000000000000000FF010000
|
||||||
|
A: consistent_dma_mask_bits=64
|
||||||
|
A: d3cold_allowed=1
|
||||||
|
A: dbc=disabled
|
||||||
|
A: device=0x9d2f
|
||||||
|
A: dma_mask_bits=64
|
||||||
|
L: driver=../../../bus/pci/drivers/xhci_hcd
|
||||||
|
A: driver_override=(null)
|
||||||
|
A: enable=1
|
||||||
|
A: irq=127
|
||||||
|
A: local_cpulist=0-7
|
||||||
|
A: local_cpus=ff
|
||||||
|
A: modalias=pci:v00008086d00009D2Fsv00001025sd0000118Ebc0Csc03i30
|
||||||
|
A: msi_bus=1
|
||||||
|
A: msi_irqs/127=msi
|
||||||
|
A: numa_node=-1
|
||||||
|
A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 9 10 2112 10\nxHCI ring segments 32 36 4096 36\nbuffer-2048 1 2 2048 1\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0
|
||||||
|
A: power/async=enabled
|
||||||
|
A: power/control=on
|
||||||
|
A: power/runtime_active_kids=1
|
||||||
|
A: power/runtime_active_time=5524703
|
||||||
|
A: power/runtime_enabled=forbidden
|
||||||
|
A: power/runtime_status=active
|
||||||
|
A: power/runtime_suspended_time=3373
|
||||||
|
A: power/runtime_usage=1
|
||||||
|
A: power/wakeup=enabled
|
||||||
|
A: power/wakeup_abort_count=0
|
||||||
|
A: power/wakeup_active=0
|
||||||
|
A: power/wakeup_active_count=0
|
||||||
|
A: power/wakeup_count=0
|
||||||
|
A: power/wakeup_expire_count=0
|
||||||
|
A: power/wakeup_last_time_ms=0
|
||||||
|
A: power/wakeup_max_time_ms=0
|
||||||
|
A: power/wakeup_total_time_ms=0
|
||||||
|
A: resource=0x00000000a4210000 0x00000000a421ffff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000
|
||||||
|
A: revision=0x21
|
||||||
|
A: subsystem_device=0x118e
|
||||||
|
A: subsystem_vendor=0x1025
|
||||||
|
A: vendor=0x8086
|
||||||
|
|
||||||
BIN
tests/elanmoc/custom.pcapng
Normal file
BIN
tests/elanmoc/custom.pcapng
Normal file
Binary file not shown.
83
tests/elanmoc/custom.py
Executable file
83
tests/elanmoc/custom.py
Executable file
@@ -0,0 +1,83 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import gi
|
||||||
|
gi.require_version('FPrint', '2.0')
|
||||||
|
from gi.repository import FPrint, GLib
|
||||||
|
|
||||||
|
ctx = GLib.main_context_default()
|
||||||
|
|
||||||
|
c = FPrint.Context()
|
||||||
|
c.enumerate()
|
||||||
|
devices = c.get_devices()
|
||||||
|
|
||||||
|
d = devices[0]
|
||||||
|
del devices
|
||||||
|
|
||||||
|
assert d.get_driver() == "elanmoc"
|
||||||
|
assert not d.has_feature(FPrint.DeviceFeature.CAPTURE)
|
||||||
|
assert d.has_feature(FPrint.DeviceFeature.IDENTIFY)
|
||||||
|
assert d.has_feature(FPrint.DeviceFeature.VERIFY)
|
||||||
|
assert not d.has_feature(FPrint.DeviceFeature.DUPLICATES_CHECK)
|
||||||
|
assert d.has_feature(FPrint.DeviceFeature.STORAGE)
|
||||||
|
assert d.has_feature(FPrint.DeviceFeature.STORAGE_LIST)
|
||||||
|
assert d.has_feature(FPrint.DeviceFeature.STORAGE_DELETE)
|
||||||
|
assert not d.has_feature(FPrint.DeviceFeature.STORAGE_CLEAR)
|
||||||
|
|
||||||
|
d.open_sync()
|
||||||
|
|
||||||
|
template = FPrint.Print.new(d)
|
||||||
|
|
||||||
|
def enroll_progress(*args):
|
||||||
|
#assert d.get_finger_status() == FPrint.FingerStatusFlags.NEEDED
|
||||||
|
print("finger status: ", d.get_finger_status())
|
||||||
|
print('enroll progress: ' + str(args))
|
||||||
|
|
||||||
|
def identify_done(dev, res):
|
||||||
|
global identified
|
||||||
|
identified = True
|
||||||
|
identify_match, identify_print = dev.identify_finish(res)
|
||||||
|
print('indentification_done: ', identify_match, identify_print)
|
||||||
|
assert identify_match.equal(identify_print)
|
||||||
|
|
||||||
|
# List, enroll, list, verify, identify, delete
|
||||||
|
print("enrolling")
|
||||||
|
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||||
|
p = d.enroll_sync(template, None, enroll_progress, None)
|
||||||
|
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||||
|
print("enroll done")
|
||||||
|
|
||||||
|
print("listing")
|
||||||
|
stored = d.list_prints_sync()
|
||||||
|
print("listing done")
|
||||||
|
assert len(stored) == 1
|
||||||
|
assert stored[0].equal(p)
|
||||||
|
print("verifying")
|
||||||
|
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||||
|
verify_res, verify_print = d.verify_sync(p)
|
||||||
|
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||||
|
print("verify done")
|
||||||
|
del p
|
||||||
|
assert verify_res == True
|
||||||
|
|
||||||
|
identified = False
|
||||||
|
deserialized_prints = []
|
||||||
|
for p in stored:
|
||||||
|
deserialized_prints.append(FPrint.Print.deserialize(p.serialize()))
|
||||||
|
assert deserialized_prints[-1].equal(p)
|
||||||
|
del stored
|
||||||
|
|
||||||
|
print('async identifying')
|
||||||
|
d.identify(deserialized_prints, callback=identify_done)
|
||||||
|
del deserialized_prints
|
||||||
|
|
||||||
|
while not identified:
|
||||||
|
ctx.iteration(True)
|
||||||
|
|
||||||
|
print("deleting")
|
||||||
|
d.delete_print_sync(p)
|
||||||
|
print("delete done")
|
||||||
|
|
||||||
|
d.close_sync()
|
||||||
|
|
||||||
|
del d
|
||||||
|
del c
|
||||||
223
tests/elanmoc/device
Normal file
223
tests/elanmoc/device
Normal file
@@ -0,0 +1,223 @@
|
|||||||
|
P: /devices/pci0000:00/0000:00:14.0/usb1/1-3
|
||||||
|
N: bus/usb/001/017=1201000200000040F3047E0C06030102000109025300010100A0320904000008FF0000000921100100012215000705810240000107050102400001070582024000010705020240000107058302400001070503024000010705840240000107050402400001
|
||||||
|
E: DEVNAME=/dev/bus/usb/001/017
|
||||||
|
E: DEVTYPE=usb_device
|
||||||
|
E: DRIVER=usb
|
||||||
|
E: PRODUCT=4f3/c7e/306
|
||||||
|
E: TYPE=0/0/0
|
||||||
|
E: BUSNUM=001
|
||||||
|
E: DEVNUM=017
|
||||||
|
E: MAJOR=189
|
||||||
|
E: MINOR=16
|
||||||
|
E: SUBSYSTEM=usb
|
||||||
|
E: ID_VENDOR=ELAN
|
||||||
|
E: ID_VENDOR_ENC=ELAN
|
||||||
|
E: ID_VENDOR_ID=04f3
|
||||||
|
E: ID_MODEL=ELAN:ARM-M4
|
||||||
|
E: ID_MODEL_ENC=ELAN:ARM-M4
|
||||||
|
E: ID_MODEL_ID=0c7e
|
||||||
|
E: ID_REVISION=0306
|
||||||
|
E: ID_SERIAL=ELAN_ELAN:ARM-M4
|
||||||
|
E: ID_BUS=usb
|
||||||
|
E: ID_USB_INTERFACES=:ff0000:
|
||||||
|
E: ID_VENDOR_FROM_DATABASE=Elan Microelectronics Corp.
|
||||||
|
E: ID_PATH=pci-0000:00:14.0-usb-0:3
|
||||||
|
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_3
|
||||||
|
E: ID_FOR_SEAT=usb-pci-0000_00_14_0-usb-0_3
|
||||||
|
E: TAGS=:seat:
|
||||||
|
E: CURRENT_TAGS=:seat:
|
||||||
|
A: authorized=1\n
|
||||||
|
A: avoid_reset_quirk=0\n
|
||||||
|
A: bConfigurationValue=1\n
|
||||||
|
A: bDeviceClass=00\n
|
||||||
|
A: bDeviceProtocol=00\n
|
||||||
|
A: bDeviceSubClass=00\n
|
||||||
|
A: bMaxPacketSize0=64\n
|
||||||
|
A: bMaxPower=100mA\n
|
||||||
|
A: bNumConfigurations=1\n
|
||||||
|
A: bNumInterfaces= 1\n
|
||||||
|
A: bcdDevice=0306\n
|
||||||
|
A: bmAttributes=a0\n
|
||||||
|
A: busnum=1\n
|
||||||
|
A: configuration=
|
||||||
|
H: descriptors=1201000200000040F3047E0C06030102000109025300010100A0320904000008FF0000000921100100012215000705810240000107050102400001070582024000010705020240000107058302400001070503024000010705840240000107050402400001
|
||||||
|
A: dev=189:16\n
|
||||||
|
A: devnum=17\n
|
||||||
|
A: devpath=3\n
|
||||||
|
L: driver=../../../../../bus/usb/drivers/usb
|
||||||
|
L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:1c/device:1d/device:20
|
||||||
|
A: idProduct=0c7e\n
|
||||||
|
A: idVendor=04f3\n
|
||||||
|
A: ltm_capable=no\n
|
||||||
|
A: manufacturer=ELAN\n
|
||||||
|
A: maxchild=0\n
|
||||||
|
L: port=../1-0:1.0/usb1-port3
|
||||||
|
A: power/active_duration=2748\n
|
||||||
|
A: power/autosuspend=2\n
|
||||||
|
A: power/autosuspend_delay_ms=2000\n
|
||||||
|
A: power/connected_duration=18266\n
|
||||||
|
A: power/control=auto\n
|
||||||
|
A: power/level=auto\n
|
||||||
|
A: power/persist=1\n
|
||||||
|
A: power/runtime_active_time=2603\n
|
||||||
|
A: power/runtime_status=active\n
|
||||||
|
A: power/runtime_suspended_time=15422\n
|
||||||
|
A: power/wakeup=disabled\n
|
||||||
|
A: power/wakeup_abort_count=\n
|
||||||
|
A: power/wakeup_active=\n
|
||||||
|
A: power/wakeup_active_count=\n
|
||||||
|
A: power/wakeup_count=\n
|
||||||
|
A: power/wakeup_expire_count=\n
|
||||||
|
A: power/wakeup_last_time_ms=\n
|
||||||
|
A: power/wakeup_max_time_ms=\n
|
||||||
|
A: power/wakeup_total_time_ms=\n
|
||||||
|
A: product=ELAN:ARM-M4\n
|
||||||
|
A: quirks=0x0\n
|
||||||
|
A: removable=removable\n
|
||||||
|
A: rx_lanes=1\n
|
||||||
|
A: speed=12\n
|
||||||
|
A: tx_lanes=1\n
|
||||||
|
A: urbnum=12\n
|
||||||
|
A: version= 2.00\n
|
||||||
|
|
||||||
|
P: /devices/pci0000:00/0000:00:14.0/usb1
|
||||||
|
N: bus/usb/001/001=12010002090001406B1D020012050302010109021900010100E0000904000001090000000705810304000C
|
||||||
|
E: DEVNAME=/dev/bus/usb/001/001
|
||||||
|
E: DEVTYPE=usb_device
|
||||||
|
E: DRIVER=usb
|
||||||
|
E: PRODUCT=1d6b/2/512
|
||||||
|
E: TYPE=9/0/1
|
||||||
|
E: BUSNUM=001
|
||||||
|
E: DEVNUM=001
|
||||||
|
E: MAJOR=189
|
||||||
|
E: MINOR=0
|
||||||
|
E: SUBSYSTEM=usb
|
||||||
|
E: ID_VENDOR=Linux_5.12.12-300.fc34.x86_64_xhci-hcd
|
||||||
|
E: ID_VENDOR_ENC=Linux\x205.12.12-300.fc34.x86_64\x20xhci-hcd
|
||||||
|
E: ID_VENDOR_ID=1d6b
|
||||||
|
E: ID_MODEL=xHCI_Host_Controller
|
||||||
|
E: ID_MODEL_ENC=xHCI\x20Host\x20Controller
|
||||||
|
E: ID_MODEL_ID=0002
|
||||||
|
E: ID_REVISION=0512
|
||||||
|
E: ID_SERIAL=Linux_5.12.12-300.fc34.x86_64_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
|
||||||
|
E: ID_SERIAL_SHORT=0000:00:14.0
|
||||||
|
E: ID_BUS=usb
|
||||||
|
E: ID_USB_INTERFACES=:090000:
|
||||||
|
E: ID_VENDOR_FROM_DATABASE=Linux Foundation
|
||||||
|
E: ID_AUTOSUSPEND=1
|
||||||
|
E: ID_MODEL_FROM_DATABASE=2.0 root hub
|
||||||
|
E: ID_PATH=pci-0000:00:14.0
|
||||||
|
E: ID_PATH_TAG=pci-0000_00_14_0
|
||||||
|
E: ID_FOR_SEAT=usb-pci-0000_00_14_0
|
||||||
|
E: TAGS=:seat:
|
||||||
|
E: CURRENT_TAGS=:seat:
|
||||||
|
A: authorized=1\n
|
||||||
|
A: authorized_default=1\n
|
||||||
|
A: avoid_reset_quirk=0\n
|
||||||
|
A: bConfigurationValue=1\n
|
||||||
|
A: bDeviceClass=09\n
|
||||||
|
A: bDeviceProtocol=01\n
|
||||||
|
A: bDeviceSubClass=00\n
|
||||||
|
A: bMaxPacketSize0=64\n
|
||||||
|
A: bMaxPower=0mA\n
|
||||||
|
A: bNumConfigurations=1\n
|
||||||
|
A: bNumInterfaces= 1\n
|
||||||
|
A: bcdDevice=0512\n
|
||||||
|
A: bmAttributes=e0\n
|
||||||
|
A: busnum=1\n
|
||||||
|
A: configuration=
|
||||||
|
H: descriptors=12010002090001406B1D020012050302010109021900010100E0000904000001090000000705810304000C
|
||||||
|
A: dev=189:0\n
|
||||||
|
A: devnum=1\n
|
||||||
|
A: devpath=0\n
|
||||||
|
L: driver=../../../../bus/usb/drivers/usb
|
||||||
|
L: firmware_node=../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:1c/device:1d
|
||||||
|
A: idProduct=0002\n
|
||||||
|
A: idVendor=1d6b\n
|
||||||
|
A: interface_authorized_default=1\n
|
||||||
|
A: ltm_capable=no\n
|
||||||
|
A: manufacturer=Linux 5.12.12-300.fc34.x86_64 xhci-hcd\n
|
||||||
|
A: maxchild=12\n
|
||||||
|
A: power/active_duration=187216979\n
|
||||||
|
A: power/autosuspend=0\n
|
||||||
|
A: power/autosuspend_delay_ms=0\n
|
||||||
|
A: power/connected_duration=187239996\n
|
||||||
|
A: power/control=auto\n
|
||||||
|
A: power/level=auto\n
|
||||||
|
A: power/runtime_active_time=187220224\n
|
||||||
|
A: power/runtime_status=active\n
|
||||||
|
A: power/runtime_suspended_time=0\n
|
||||||
|
A: power/wakeup=disabled\n
|
||||||
|
A: power/wakeup_abort_count=\n
|
||||||
|
A: power/wakeup_active=\n
|
||||||
|
A: power/wakeup_active_count=\n
|
||||||
|
A: power/wakeup_count=\n
|
||||||
|
A: power/wakeup_expire_count=\n
|
||||||
|
A: power/wakeup_last_time_ms=\n
|
||||||
|
A: power/wakeup_max_time_ms=\n
|
||||||
|
A: power/wakeup_total_time_ms=\n
|
||||||
|
A: product=xHCI Host Controller\n
|
||||||
|
A: quirks=0x0\n
|
||||||
|
A: removable=unknown\n
|
||||||
|
A: rx_lanes=1\n
|
||||||
|
A: serial=0000:00:14.0\n
|
||||||
|
A: speed=480\n
|
||||||
|
A: tx_lanes=1\n
|
||||||
|
A: urbnum=3372\n
|
||||||
|
A: version= 2.00\n
|
||||||
|
|
||||||
|
P: /devices/pci0000:00/0000:00:14.0
|
||||||
|
E: DRIVER=xhci_hcd
|
||||||
|
E: PCI_CLASS=C0330
|
||||||
|
E: PCI_ID=8086:9DED
|
||||||
|
E: PCI_SUBSYS_ID=17AA:2292
|
||||||
|
E: PCI_SLOT_NAME=0000:00:14.0
|
||||||
|
E: MODALIAS=pci:v00008086d00009DEDsv000017AAsd00002292bc0Csc03i30
|
||||||
|
E: SUBSYSTEM=pci
|
||||||
|
E: ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
|
||||||
|
E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
|
||||||
|
E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI
|
||||||
|
E: ID_VENDOR_FROM_DATABASE=Intel Corporation
|
||||||
|
E: ID_AUTOSUSPEND=1
|
||||||
|
E: ID_MODEL_FROM_DATABASE=Cannon Point-LP USB 3.1 xHCI Controller
|
||||||
|
A: ari_enabled=0\n
|
||||||
|
A: broken_parity_status=0\n
|
||||||
|
A: class=0x0c0330\n
|
||||||
|
H: config=8680ED9D060490021130030C00008000040022EA000000000000000000000000000000000000000000000000AA179222000000007000000000000000FF010000
|
||||||
|
A: consistent_dma_mask_bits=64\n
|
||||||
|
A: d3cold_allowed=1\n
|
||||||
|
A: dbc=disabled\n
|
||||||
|
A: device=0x9ded\n
|
||||||
|
A: dma_mask_bits=64\n
|
||||||
|
L: driver=../../../bus/pci/drivers/xhci_hcd
|
||||||
|
A: driver_override=(null)\n
|
||||||
|
A: enable=1\n
|
||||||
|
L: firmware_node=../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:1c
|
||||||
|
A: irq=128\n
|
||||||
|
A: local_cpulist=0-7\n
|
||||||
|
A: local_cpus=ff\n
|
||||||
|
A: modalias=pci:v00008086d00009DEDsv000017AAsd00002292bc0Csc03i30\n
|
||||||
|
A: msi_bus=1\n
|
||||||
|
A: msi_irqs/128=msi\n
|
||||||
|
A: numa_node=-1\n
|
||||||
|
A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 11 12 2112 12\nxHCI ring segments 58 62 4096 62\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 6 32 128 1\nbuffer-32 0 0 32 0\n
|
||||||
|
A: power/control=on\n
|
||||||
|
A: power/runtime_active_time=187221117\n
|
||||||
|
A: power/runtime_status=active\n
|
||||||
|
A: power/runtime_suspended_time=0\n
|
||||||
|
A: power/wakeup=enabled\n
|
||||||
|
A: power/wakeup_abort_count=0\n
|
||||||
|
A: power/wakeup_active=0\n
|
||||||
|
A: power/wakeup_active_count=0\n
|
||||||
|
A: power/wakeup_count=0\n
|
||||||
|
A: power/wakeup_expire_count=0\n
|
||||||
|
A: power/wakeup_last_time_ms=0\n
|
||||||
|
A: power/wakeup_max_time_ms=0\n
|
||||||
|
A: power/wakeup_total_time_ms=0\n
|
||||||
|
A: power_state=D0\n
|
||||||
|
A: resource=0x00000000ea220000 0x00000000ea22ffff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n
|
||||||
|
A: revision=0x11\n
|
||||||
|
A: subsystem_device=0x2292\n
|
||||||
|
A: subsystem_vendor=0x17aa\n
|
||||||
|
A: vendor=0x8086\n
|
||||||
|
|
||||||
@@ -24,14 +24,17 @@ envs.set('NO_AT_BRIDGE', '1')
|
|||||||
drivers_tests = [
|
drivers_tests = [
|
||||||
'aes3500',
|
'aes3500',
|
||||||
'elan',
|
'elan',
|
||||||
|
'elanmoc',
|
||||||
'elanspi',
|
'elanspi',
|
||||||
'synaptics',
|
'synaptics',
|
||||||
|
'upektc_img',
|
||||||
'vfs0050',
|
'vfs0050',
|
||||||
'vfs301',
|
'vfs301',
|
||||||
'vfs5011',
|
'vfs5011',
|
||||||
'vfs7552',
|
'vfs7552',
|
||||||
'goodixmoc',
|
'goodixmoc',
|
||||||
'nb1010',
|
'nb1010',
|
||||||
|
'egis0570',
|
||||||
]
|
]
|
||||||
|
|
||||||
if get_option('introspection')
|
if get_option('introspection')
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ try:
|
|||||||
if version < (0, 13, 2):
|
if version < (0, 13, 2):
|
||||||
print('umockdev is too old for test to be reliable, expect random failures!')
|
print('umockdev is too old for test to be reliable, expect random failures!')
|
||||||
print('Please update umockdev to at least 0.13.2.')
|
print('Please update umockdev to at least 0.13.2.')
|
||||||
pcap_supported = version >= (0, 16) or os.getenv('CI_PROJECT_NAME') == "libfprint"
|
pcap_supported = version >= (0, 16, 2) or os.getenv('CI_PROJECT_NAME') == "libfprint"
|
||||||
spi_supported = version >= (0, 16) or os.getenv('CI_PROJECT_NAME') == "libfprint"
|
spi_supported = version >= (0, 16) or os.getenv('CI_PROJECT_NAME') == "libfprint"
|
||||||
|
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
|
|||||||
BIN
tests/upektc_img/capture.pcapng
Normal file
BIN
tests/upektc_img/capture.pcapng
Normal file
Binary file not shown.
BIN
tests/upektc_img/capture.png
Normal file
BIN
tests/upektc_img/capture.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 27 KiB |
319
tests/upektc_img/device
Normal file
319
tests/upektc_img/device
Normal file
@@ -0,0 +1,319 @@
|
|||||||
|
P: /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.3
|
||||||
|
N: bus/usb/001/003=12010101000000087E14162002000102000109022700010100A0320904000003FF000000070581024000000705020240000007058303040014
|
||||||
|
E: DEVNAME=/dev/bus/usb/001/003
|
||||||
|
E: DEVTYPE=usb_device
|
||||||
|
E: DRIVER=usb
|
||||||
|
E: PRODUCT=147e/2016/2
|
||||||
|
E: TYPE=0/0/0
|
||||||
|
E: BUSNUM=001
|
||||||
|
E: DEVNUM=003
|
||||||
|
E: MAJOR=189
|
||||||
|
E: MINOR=2
|
||||||
|
E: SUBSYSTEM=usb
|
||||||
|
E: ID_VENDOR=UPEK
|
||||||
|
E: ID_VENDOR_ENC=UPEK
|
||||||
|
E: ID_VENDOR_ID=147e
|
||||||
|
E: ID_MODEL=Biometric_Coprocessor
|
||||||
|
E: ID_MODEL_ENC=Biometric\x20Coprocessor
|
||||||
|
E: ID_MODEL_ID=2016
|
||||||
|
E: ID_REVISION=0002
|
||||||
|
E: ID_SERIAL=UPEK_Biometric_Coprocessor
|
||||||
|
E: ID_BUS=usb
|
||||||
|
E: ID_USB_INTERFACES=:ff0000:
|
||||||
|
E: ID_VENDOR_FROM_DATABASE=Upek
|
||||||
|
E: ID_MODEL_FROM_DATABASE=Biometric Touchchip/Touchstrip Fingerprint Sensor
|
||||||
|
E: ID_PATH=pci-0000:00:1a.0-usb-0:1.3
|
||||||
|
E: ID_PATH_TAG=pci-0000_00_1a_0-usb-0_1_3
|
||||||
|
E: LIBFPRINT_DRIVER=Upek TouchChip Fingerprint Coprocessor
|
||||||
|
E: ID_FOR_SEAT=usb-pci-0000_00_1a_0-usb-0_1_3
|
||||||
|
E: TAGS=:seat:
|
||||||
|
E: CURRENT_TAGS=:seat:
|
||||||
|
A: authorized=1\n
|
||||||
|
A: avoid_reset_quirk=0\n
|
||||||
|
A: bConfigurationValue=1\n
|
||||||
|
A: bDeviceClass=00\n
|
||||||
|
A: bDeviceProtocol=00\n
|
||||||
|
A: bDeviceSubClass=00\n
|
||||||
|
A: bMaxPacketSize0=8\n
|
||||||
|
A: bMaxPower=100mA\n
|
||||||
|
A: bNumConfigurations=1\n
|
||||||
|
A: bNumInterfaces= 1\n
|
||||||
|
A: bcdDevice=0002\n
|
||||||
|
A: bmAttributes=a0\n
|
||||||
|
A: busnum=1\n
|
||||||
|
A: configuration=
|
||||||
|
H: descriptors=12010101000000087E14162002000102000109022700010100A0320904000003FF000000070581024000000705020240000007058303040014
|
||||||
|
A: dev=189:2\n
|
||||||
|
A: devnum=3\n
|
||||||
|
A: devpath=1.3\n
|
||||||
|
L: driver=../../../../../../bus/usb/drivers/usb
|
||||||
|
L: firmware_node=../../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:2d/device:2e/device:2f/device:32
|
||||||
|
A: idProduct=2016\n
|
||||||
|
A: idVendor=147e\n
|
||||||
|
A: ltm_capable=no\n
|
||||||
|
A: manufacturer=UPEK\n
|
||||||
|
A: maxchild=0\n
|
||||||
|
L: port=../1-1:1.0/1-1-port3
|
||||||
|
A: power/active_duration=757220\n
|
||||||
|
A: power/async=enabled\n
|
||||||
|
A: power/autosuspend=2\n
|
||||||
|
A: power/autosuspend_delay_ms=2000\n
|
||||||
|
A: power/connected_duration=857556\n
|
||||||
|
A: power/control=auto\n
|
||||||
|
A: power/level=auto\n
|
||||||
|
A: power/persist=1\n
|
||||||
|
A: power/runtime_active_kids=0\n
|
||||||
|
A: power/runtime_active_time=762579\n
|
||||||
|
A: power/runtime_enabled=enabled\n
|
||||||
|
A: power/runtime_status=active\n
|
||||||
|
A: power/runtime_suspended_time=94791\n
|
||||||
|
A: power/runtime_usage=0\n
|
||||||
|
A: power/wakeup=disabled\n
|
||||||
|
A: power/wakeup_abort_count=\n
|
||||||
|
A: power/wakeup_active=\n
|
||||||
|
A: power/wakeup_active_count=\n
|
||||||
|
A: power/wakeup_count=\n
|
||||||
|
A: power/wakeup_expire_count=\n
|
||||||
|
A: power/wakeup_last_time_ms=\n
|
||||||
|
A: power/wakeup_max_time_ms=\n
|
||||||
|
A: power/wakeup_total_time_ms=\n
|
||||||
|
A: product=Biometric Coprocessor\n
|
||||||
|
A: quirks=0x0\n
|
||||||
|
A: removable=fixed\n
|
||||||
|
A: rx_lanes=1\n
|
||||||
|
A: speed=12\n
|
||||||
|
A: tx_lanes=1\n
|
||||||
|
A: urbnum=620\n
|
||||||
|
A: version= 1.01\n
|
||||||
|
|
||||||
|
P: /devices/pci0000:00/0000:00:1a.0/usb1/1-1
|
||||||
|
N: bus/usb/001/002=12010002090001408780200000000000000109021900010100E0000904000001090000000705810301000C
|
||||||
|
E: DEVNAME=/dev/bus/usb/001/002
|
||||||
|
E: DEVTYPE=usb_device
|
||||||
|
E: DRIVER=usb
|
||||||
|
E: PRODUCT=8087/20/0
|
||||||
|
E: TYPE=9/0/1
|
||||||
|
E: BUSNUM=001
|
||||||
|
E: DEVNUM=002
|
||||||
|
E: MAJOR=189
|
||||||
|
E: MINOR=1
|
||||||
|
E: SUBSYSTEM=usb
|
||||||
|
E: ID_VENDOR=8087
|
||||||
|
E: ID_VENDOR_ENC=8087
|
||||||
|
E: ID_VENDOR_ID=8087
|
||||||
|
E: ID_MODEL=0020
|
||||||
|
E: ID_MODEL_ENC=0020
|
||||||
|
E: ID_MODEL_ID=0020
|
||||||
|
E: ID_REVISION=0000
|
||||||
|
E: ID_SERIAL=8087_0020
|
||||||
|
E: ID_BUS=usb
|
||||||
|
E: ID_USB_INTERFACES=:090000:
|
||||||
|
E: ID_VENDOR_FROM_DATABASE=Intel Corp.
|
||||||
|
E: ID_MODEL_FROM_DATABASE=Integrated Rate Matching Hub
|
||||||
|
E: ID_PATH=pci-0000:00:1a.0-usb-0:1
|
||||||
|
E: ID_PATH_TAG=pci-0000_00_1a_0-usb-0_1
|
||||||
|
E: ID_FOR_SEAT=usb-pci-0000_00_1a_0-usb-0_1
|
||||||
|
E: TAGS=:seat:
|
||||||
|
E: CURRENT_TAGS=:seat:
|
||||||
|
A: authorized=1\n
|
||||||
|
A: avoid_reset_quirk=0\n
|
||||||
|
A: bConfigurationValue=1\n
|
||||||
|
A: bDeviceClass=09\n
|
||||||
|
A: bDeviceProtocol=01\n
|
||||||
|
A: bDeviceSubClass=00\n
|
||||||
|
A: bMaxPacketSize0=64\n
|
||||||
|
A: bMaxPower=0mA\n
|
||||||
|
A: bNumConfigurations=1\n
|
||||||
|
A: bNumInterfaces= 1\n
|
||||||
|
A: bcdDevice=0000\n
|
||||||
|
A: bmAttributes=e0\n
|
||||||
|
A: busnum=1\n
|
||||||
|
A: configuration=
|
||||||
|
H: descriptors=12010002090001408780200000000000000109021900010100E0000904000001090000000705810301000C
|
||||||
|
A: dev=189:1\n
|
||||||
|
A: devnum=2\n
|
||||||
|
A: devpath=1\n
|
||||||
|
L: driver=../../../../../bus/usb/drivers/usb
|
||||||
|
L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:2d/device:2e/device:2f
|
||||||
|
A: idProduct=0020\n
|
||||||
|
A: idVendor=8087\n
|
||||||
|
A: ltm_capable=no\n
|
||||||
|
A: maxchild=6\n
|
||||||
|
L: port=../1-0:1.0/usb1-port1
|
||||||
|
A: power/active_duration=776368\n
|
||||||
|
A: power/async=enabled\n
|
||||||
|
A: power/autosuspend=0\n
|
||||||
|
A: power/autosuspend_delay_ms=0\n
|
||||||
|
A: power/connected_duration=858060\n
|
||||||
|
A: power/control=auto\n
|
||||||
|
A: power/level=auto\n
|
||||||
|
A: power/runtime_active_kids=3\n
|
||||||
|
A: power/runtime_active_time=779955\n
|
||||||
|
A: power/runtime_enabled=enabled\n
|
||||||
|
A: power/runtime_status=active\n
|
||||||
|
A: power/runtime_suspended_time=77820\n
|
||||||
|
A: power/runtime_usage=0\n
|
||||||
|
A: power/wakeup=disabled\n
|
||||||
|
A: power/wakeup_abort_count=\n
|
||||||
|
A: power/wakeup_active=\n
|
||||||
|
A: power/wakeup_active_count=\n
|
||||||
|
A: power/wakeup_count=\n
|
||||||
|
A: power/wakeup_expire_count=\n
|
||||||
|
A: power/wakeup_last_time_ms=\n
|
||||||
|
A: power/wakeup_max_time_ms=\n
|
||||||
|
A: power/wakeup_total_time_ms=\n
|
||||||
|
A: quirks=0x0\n
|
||||||
|
A: removable=fixed\n
|
||||||
|
A: rx_lanes=1\n
|
||||||
|
A: speed=480\n
|
||||||
|
A: tx_lanes=1\n
|
||||||
|
A: urbnum=2620\n
|
||||||
|
A: version= 2.00\n
|
||||||
|
|
||||||
|
P: /devices/pci0000:00/0000:00:1a.0/usb1
|
||||||
|
N: bus/usb/001/001=12010002090000406B1D020010050302010109021900010100E0000904000001090000000705810304000C
|
||||||
|
E: DEVNAME=/dev/bus/usb/001/001
|
||||||
|
E: DEVTYPE=usb_device
|
||||||
|
E: DRIVER=usb
|
||||||
|
E: PRODUCT=1d6b/2/510
|
||||||
|
E: TYPE=9/0/0
|
||||||
|
E: BUSNUM=001
|
||||||
|
E: DEVNUM=001
|
||||||
|
E: MAJOR=189
|
||||||
|
E: MINOR=0
|
||||||
|
E: SUBSYSTEM=usb
|
||||||
|
E: ID_VENDOR=Linux_5.10.0-8-amd64_ehci_hcd
|
||||||
|
E: ID_VENDOR_ENC=Linux\x205.10.0-8-amd64\x20ehci_hcd
|
||||||
|
E: ID_VENDOR_ID=1d6b
|
||||||
|
E: ID_MODEL=EHCI_Host_Controller
|
||||||
|
E: ID_MODEL_ENC=EHCI\x20Host\x20Controller
|
||||||
|
E: ID_MODEL_ID=0002
|
||||||
|
E: ID_REVISION=0510
|
||||||
|
E: ID_SERIAL=Linux_5.10.0-8-amd64_ehci_hcd_EHCI_Host_Controller_0000:00:1a.0
|
||||||
|
E: ID_SERIAL_SHORT=0000:00:1a.0
|
||||||
|
E: ID_BUS=usb
|
||||||
|
E: ID_USB_INTERFACES=:090000:
|
||||||
|
E: ID_VENDOR_FROM_DATABASE=Linux Foundation
|
||||||
|
E: ID_AUTOSUSPEND=1
|
||||||
|
E: ID_MODEL_FROM_DATABASE=2.0 root hub
|
||||||
|
E: ID_PATH=pci-0000:00:1a.0
|
||||||
|
E: ID_PATH_TAG=pci-0000_00_1a_0
|
||||||
|
E: ID_FOR_SEAT=usb-pci-0000_00_1a_0
|
||||||
|
E: TAGS=:seat:
|
||||||
|
E: CURRENT_TAGS=:seat:
|
||||||
|
A: authorized=1\n
|
||||||
|
A: authorized_default=1\n
|
||||||
|
A: avoid_reset_quirk=0\n
|
||||||
|
A: bConfigurationValue=1\n
|
||||||
|
A: bDeviceClass=09\n
|
||||||
|
A: bDeviceProtocol=00\n
|
||||||
|
A: bDeviceSubClass=00\n
|
||||||
|
A: bMaxPacketSize0=64\n
|
||||||
|
A: bMaxPower=0mA\n
|
||||||
|
A: bNumConfigurations=1\n
|
||||||
|
A: bNumInterfaces= 1\n
|
||||||
|
A: bcdDevice=0510\n
|
||||||
|
A: bmAttributes=e0\n
|
||||||
|
A: busnum=1\n
|
||||||
|
A: configuration=
|
||||||
|
H: descriptors=12010002090000406B1D020010050302010109021900010100E0000904000001090000000705810304000C
|
||||||
|
A: dev=189:0\n
|
||||||
|
A: devnum=1\n
|
||||||
|
A: devpath=0\n
|
||||||
|
L: driver=../../../../bus/usb/drivers/usb
|
||||||
|
L: firmware_node=../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:2d/device:2e
|
||||||
|
A: idProduct=0002\n
|
||||||
|
A: idVendor=1d6b\n
|
||||||
|
A: interface_authorized_default=1\n
|
||||||
|
A: ltm_capable=no\n
|
||||||
|
A: manufacturer=Linux 5.10.0-8-amd64 ehci_hcd\n
|
||||||
|
A: maxchild=3\n
|
||||||
|
A: power/active_duration=780512\n
|
||||||
|
A: power/async=enabled\n
|
||||||
|
A: power/autosuspend=0\n
|
||||||
|
A: power/autosuspend_delay_ms=0\n
|
||||||
|
A: power/connected_duration=858228\n
|
||||||
|
A: power/control=auto\n
|
||||||
|
A: power/level=auto\n
|
||||||
|
A: power/runtime_active_kids=1\n
|
||||||
|
A: power/runtime_active_time=780500\n
|
||||||
|
A: power/runtime_enabled=enabled\n
|
||||||
|
A: power/runtime_status=active\n
|
||||||
|
A: power/runtime_suspended_time=77697\n
|
||||||
|
A: power/runtime_usage=0\n
|
||||||
|
A: power/wakeup=disabled\n
|
||||||
|
A: power/wakeup_abort_count=\n
|
||||||
|
A: power/wakeup_active=\n
|
||||||
|
A: power/wakeup_active_count=\n
|
||||||
|
A: power/wakeup_count=\n
|
||||||
|
A: power/wakeup_expire_count=\n
|
||||||
|
A: power/wakeup_last_time_ms=\n
|
||||||
|
A: power/wakeup_max_time_ms=\n
|
||||||
|
A: power/wakeup_total_time_ms=\n
|
||||||
|
A: product=EHCI Host Controller\n
|
||||||
|
A: quirks=0x0\n
|
||||||
|
A: removable=unknown\n
|
||||||
|
A: rx_lanes=1\n
|
||||||
|
A: serial=0000:00:1a.0\n
|
||||||
|
A: speed=480\n
|
||||||
|
A: tx_lanes=1\n
|
||||||
|
A: urbnum=1071\n
|
||||||
|
A: version= 2.00\n
|
||||||
|
|
||||||
|
P: /devices/pci0000:00/0000:00:1a.0
|
||||||
|
E: DRIVER=ehci-pci
|
||||||
|
E: PCI_CLASS=C0320
|
||||||
|
E: PCI_ID=8086:3B3C
|
||||||
|
E: PCI_SUBSYS_ID=17AA:2163
|
||||||
|
E: PCI_SLOT_NAME=0000:00:1a.0
|
||||||
|
E: MODALIAS=pci:v00008086d00003B3Csv000017AAsd00002163bc0Csc03i20
|
||||||
|
E: SUBSYSTEM=pci
|
||||||
|
E: ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
|
||||||
|
E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
|
||||||
|
E: ID_PCI_INTERFACE_FROM_DATABASE=EHCI
|
||||||
|
E: ID_VENDOR_FROM_DATABASE=Intel Corporation
|
||||||
|
E: ID_MODEL_FROM_DATABASE=5 Series/3400 Series Chipset USB2 Enhanced Host Controller
|
||||||
|
A: ari_enabled=0\n
|
||||||
|
A: broken_parity_status=0\n
|
||||||
|
A: class=0x0c0320\n
|
||||||
|
A: companion=
|
||||||
|
H: config=86803C3B060190020620030C00000000008072F2000000000000000000000000000000000000000000000000AA1763210000000050000000000000000B040000000000000000000000000000000000000158C2C9000000000A98A020000000002020A7070000000001000001000008C00000DF3F0000000000000000000000000000800011890C13A000000000000000000000000000000013000603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AAFF00000000000000000000000000000000000000000004F340BB0000000088858000870F060828171B30
|
||||||
|
A: consistent_dma_mask_bits=32\n
|
||||||
|
A: d3cold_allowed=1\n
|
||||||
|
A: device=0x3b3c\n
|
||||||
|
A: dma_mask_bits=32\n
|
||||||
|
L: driver=../../../bus/pci/drivers/ehci-pci
|
||||||
|
A: driver_override=(null)\n
|
||||||
|
A: enable=1\n
|
||||||
|
L: firmware_node=../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:2d
|
||||||
|
A: irq=23\n
|
||||||
|
A: local_cpulist=0-3\n
|
||||||
|
A: local_cpus=f\n
|
||||||
|
A: modalias=pci:v00008086d00003B3Csv000017AAsd00002163bc0Csc03i20\n
|
||||||
|
A: msi_bus=1\n
|
||||||
|
A: numa_node=-1\n
|
||||||
|
A: pools=poolinfo - 0.1\nehci_sitd 0 0 96 0\nehci_itd 0 0 192 0\nehci_qh 9 42 96 1\nehci_qtd 13 42 96 1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\n
|
||||||
|
A: power/async=enabled\n
|
||||||
|
A: power/control=on\n
|
||||||
|
A: power/runtime_active_kids=1\n
|
||||||
|
A: power/runtime_active_time=859876\n
|
||||||
|
A: power/runtime_enabled=forbidden\n
|
||||||
|
A: power/runtime_status=active\n
|
||||||
|
A: power/runtime_suspended_time=0\n
|
||||||
|
A: power/runtime_usage=1\n
|
||||||
|
A: power/wakeup=enabled\n
|
||||||
|
A: power/wakeup_abort_count=0\n
|
||||||
|
A: power/wakeup_active=0\n
|
||||||
|
A: power/wakeup_active_count=0\n
|
||||||
|
A: power/wakeup_count=0\n
|
||||||
|
A: power/wakeup_expire_count=0\n
|
||||||
|
A: power/wakeup_last_time_ms=0\n
|
||||||
|
A: power/wakeup_max_time_ms=0\n
|
||||||
|
A: power/wakeup_total_time_ms=0\n
|
||||||
|
A: resource=0x00000000f2728000 0x00000000f27283ff 0x0000000000040200\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n
|
||||||
|
A: revision=0x06\n
|
||||||
|
A: subsystem_device=0x2163\n
|
||||||
|
A: subsystem_vendor=0x17aa\n
|
||||||
|
A: uframe_periodic_max=100\n
|
||||||
|
A: vendor=0x8086\n
|
||||||
|
|
||||||
Reference in New Issue
Block a user