mirror of
https://gitlab.freedesktop.org/libfprint/libfprint.git
synced 2026-09-10 21:06:51 +00:00
Compare commits
113
Commits
+7
-2
@@ -7,6 +7,7 @@ include:
|
||||
- remote: 'https://gitlab.gnome.org/GNOME/citemplates/-/raw/71e636e012ae0ab04c5e0fe40ca73ada91ae6bde/flatpak/flatpak_ci_initiative.yml'
|
||||
|
||||
default:
|
||||
interruptible: true
|
||||
# Auto-retry jobs in case of infra failures
|
||||
retry:
|
||||
max: 1
|
||||
@@ -21,7 +22,7 @@ variables:
|
||||
FDO_DISTRIBUTION_TAG: $LIBFPRINT_IMAGE_TAG
|
||||
FDO_DISTRIBUTION_VERSION: rawhide
|
||||
FDO_UPSTREAM_REPO: "libfprint/$CI_PROJECT_NAME"
|
||||
FEDORA_IMAGE: "$CI_REGISTRY/libfprint/$CI_PROJECT_NAME/fedora/$FDO_DISTRIBUTION_VERSION:$FDO_DISTRIBUTION_TAG"
|
||||
FEDORA_IMAGE: "registry.freedesktop.org/libfprint/$CI_PROJECT_NAME/fedora/$FDO_DISTRIBUTION_VERSION:$FDO_DISTRIBUTION_TAG"
|
||||
LAST_ABI_BREAK: "056ea541ddc97f5806cffbd99a12dc87e4da3546"
|
||||
|
||||
workflow:
|
||||
@@ -286,11 +287,15 @@ pages:
|
||||
needs:
|
||||
- job: test
|
||||
artifacts: true
|
||||
- job: build
|
||||
artifacts: true
|
||||
script:
|
||||
- mkdir public
|
||||
- mv _build/meson-logs/coveragereport public/coverage
|
||||
- mv _build/meson-logs/coveragereport public/coverage || true
|
||||
- mv _build/doc/html public/doc
|
||||
artifacts:
|
||||
paths:
|
||||
- public
|
||||
rules:
|
||||
- if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE == "push"
|
||||
- if: $CI_COMMIT_TAG
|
||||
|
||||
@@ -44,4 +44,6 @@
|
||||
libgusb \
|
||||
libusb \
|
||||
openssl \
|
||||
pixman
|
||||
pixman \
|
||||
python3-gobject \
|
||||
python3-gobject-base
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
#!/bin/sh
|
||||
#!/bin/sh -x
|
||||
|
||||
# This wrapper just disables the malloc checker
|
||||
exec /usr/bin/scan-build --status-bugs -disable-checker unix.Malloc --exclude "_build/meson-private" "$@"
|
||||
exec /usr/bin/scan-build --status-bugs -disable-checker unix.Malloc \
|
||||
--exclude "$PWD/_build/meson-private" \
|
||||
--exclude "$PWD/meson-private" \
|
||||
"$@"
|
||||
|
||||
+35
-1
@@ -77,6 +77,12 @@ usb:v1C7Ap0571*
|
||||
ID_AUTOSUSPEND=1
|
||||
ID_PERSIST=0
|
||||
|
||||
# Supported by libfprint driver egis_etu905
|
||||
usb:v1C7Ap05AE*
|
||||
usb:v1C7Ap9201*
|
||||
ID_AUTOSUSPEND=1
|
||||
ID_PERSIST=0
|
||||
|
||||
# Supported by libfprint driver egismoc
|
||||
usb:v1C7Ap0582*
|
||||
usb:v1C7Ap0583*
|
||||
@@ -162,12 +168,14 @@ usb:v04F3p0C8C*
|
||||
usb:v04F3p0C8D*
|
||||
usb:v04F3p0C98*
|
||||
usb:v04F3p0C99*
|
||||
usb:v04F3p0C9C*
|
||||
usb:v04F3p0C9D*
|
||||
usb:v04F3p0C9F*
|
||||
usb:v04F3p0CA3*
|
||||
usb:v04F3p0CA7*
|
||||
usb:v04F3p0CA8*
|
||||
usb:v04F3p0CB0*
|
||||
usb:v04F3p0CB2*
|
||||
ID_AUTOSUSPEND=1
|
||||
ID_PERSIST=0
|
||||
|
||||
@@ -184,7 +192,12 @@ usb:v2808pA959*
|
||||
usb:v2808pA99A*
|
||||
usb:v2808pA57A*
|
||||
usb:v2808pA78A*
|
||||
usb:v2808pA97A*
|
||||
usb:v2808p1579*
|
||||
usb:v2808p077A*
|
||||
usb:v2808p079A*
|
||||
usb:v2808p5158*
|
||||
usb:v2808p6553*
|
||||
ID_AUTOSUSPEND=1
|
||||
ID_PERSIST=0
|
||||
|
||||
@@ -198,12 +211,14 @@ usb:v10A5pD205*
|
||||
usb:v10A5p9524*
|
||||
usb:v10A5p9544*
|
||||
usb:v10A5pC844*
|
||||
usb:v10A5p9B24*
|
||||
ID_AUTOSUSPEND=1
|
||||
ID_PERSIST=0
|
||||
|
||||
# Supported by libfprint driver goodixmoc
|
||||
usb:v27C6p5840*
|
||||
usb:v27C6p6014*
|
||||
usb:v27C6p6090*
|
||||
usb:v27C6p6092*
|
||||
usb:v27C6p6094*
|
||||
usb:v27C6p609A*
|
||||
@@ -233,8 +248,15 @@ usb:v27C6p659A*
|
||||
usb:v27C6p659C*
|
||||
usb:v27C6p6A94*
|
||||
usb:v27C6p6512*
|
||||
usb:v27C6p6890*
|
||||
usb:v27C6p689A*
|
||||
usb:v27C6p66A9*
|
||||
usb:v27C6p6984*
|
||||
ID_AUTOSUSPEND=1
|
||||
ID_PERSIST=0
|
||||
|
||||
# Supported by libfprint driver mafpmoc
|
||||
usb:v3274p8012*
|
||||
ID_AUTOSUSPEND=1
|
||||
ID_PERSIST=0
|
||||
|
||||
@@ -247,6 +269,12 @@ usb:v298Dp1010*
|
||||
usb:v0BDAp5813*
|
||||
usb:v0BDAp5816*
|
||||
usb:v2541pFA03*
|
||||
usb:v3274p9003*
|
||||
ID_AUTOSUSPEND=1
|
||||
ID_PERSIST=0
|
||||
|
||||
# Supported by libfprint driver secugen
|
||||
usb:v1162p2200*
|
||||
ID_AUTOSUSPEND=1
|
||||
ID_PERSIST=0
|
||||
|
||||
@@ -281,6 +309,7 @@ usb:v06CBp0174*
|
||||
usb:v06CBp019D*
|
||||
usb:v06CBp019F*
|
||||
usb:v06CBp01A0*
|
||||
usb:v06CBp01A4*
|
||||
ID_AUTOSUSPEND=1
|
||||
ID_PERSIST=0
|
||||
|
||||
@@ -384,10 +413,12 @@ usb:v06CBp0088*
|
||||
usb:v06CBp008A*
|
||||
usb:v06CBp009A*
|
||||
usb:v06CBp009B*
|
||||
usb:v06CBp00A1*
|
||||
usb:v06CBp00A2*
|
||||
usb:v06CBp00A8*
|
||||
usb:v06CBp00B7*
|
||||
usb:v06CBp00BB*
|
||||
usb:v06CBp00BC*
|
||||
usb:v06CBp00BE*
|
||||
usb:v06CBp00CB*
|
||||
usb:v06CBp00C9*
|
||||
@@ -416,9 +447,11 @@ usb:v0A5Cp5867*
|
||||
usb:v0BDAp5812*
|
||||
usb:v10A5p0007*
|
||||
usb:v10A5p9200*
|
||||
usb:v10A5p9201*
|
||||
usb:v10A5p9800*
|
||||
usb:v10A5pA120*
|
||||
usb:v10A5pA900*
|
||||
usb:v10A5pA921*
|
||||
usb:v10A5pE340*
|
||||
usb:v1188p9545*
|
||||
usb:v138Ap0007*
|
||||
@@ -472,16 +505,17 @@ usb:v27C6p5E0A*
|
||||
usb:v27C6p581A*
|
||||
usb:v27C6p589A*
|
||||
usb:v27C6p5F10*
|
||||
usb:v27C6p5F91*
|
||||
usb:v27C6p6382*
|
||||
usb:v2808p9338*
|
||||
usb:v2808p9348*
|
||||
usb:v2808p93A9*
|
||||
usb:v2808pA658*
|
||||
usb:v2808pC652*
|
||||
usb:v2808pA553*
|
||||
usb:v298Dp2020*
|
||||
usb:v298Dp2033*
|
||||
usb:v2DF0p0003*
|
||||
usb:v3274p8012*
|
||||
usb:v3538p0930*
|
||||
ID_AUTOSUSPEND=1
|
||||
ID_PERSIST=0
|
||||
|
||||
@@ -75,6 +75,7 @@ fp_device_clear_storage_sync
|
||||
fp_device_suspend_sync
|
||||
fp_device_resume_sync
|
||||
FpDevice
|
||||
FpTemperature
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
@@ -134,6 +135,134 @@ fpi_line_asmbl_ctx
|
||||
fpi_assemble_lines
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>fpi-byte-reader</FILE>
|
||||
<TITLE>FpiByteReader</TITLE>
|
||||
FpiByteReader
|
||||
fpi_byte_reader_new
|
||||
fpi_byte_reader_new_bytes
|
||||
fpi_byte_reader_free
|
||||
fpi_byte_reader_init
|
||||
fpi_byte_reader_init_bytes
|
||||
fpi_byte_reader_peek_sub_reader
|
||||
fpi_byte_reader_get_sub_reader
|
||||
fpi_byte_reader_set_pos
|
||||
fpi_byte_reader_get_pos
|
||||
fpi_byte_reader_get_remaining
|
||||
fpi_byte_reader_get_size
|
||||
fpi_byte_reader_skip
|
||||
fpi_byte_reader_get_bytes
|
||||
fpi_byte_reader_peek_bytes
|
||||
fpi_byte_reader_get_uint8
|
||||
fpi_byte_reader_get_int8
|
||||
fpi_byte_reader_peek_uint8
|
||||
fpi_byte_reader_peek_int8
|
||||
fpi_byte_reader_get_uint16_le
|
||||
fpi_byte_reader_get_int16_le
|
||||
fpi_byte_reader_peek_uint16_le
|
||||
fpi_byte_reader_peek_int16_le
|
||||
fpi_byte_reader_get_uint16_be
|
||||
fpi_byte_reader_get_int16_be
|
||||
fpi_byte_reader_peek_uint16_be
|
||||
fpi_byte_reader_peek_int16_be
|
||||
fpi_byte_reader_get_uint24_le
|
||||
fpi_byte_reader_get_int24_le
|
||||
fpi_byte_reader_peek_uint24_le
|
||||
fpi_byte_reader_peek_int24_le
|
||||
fpi_byte_reader_get_uint24_be
|
||||
fpi_byte_reader_get_int24_be
|
||||
fpi_byte_reader_peek_uint24_be
|
||||
fpi_byte_reader_peek_int24_be
|
||||
fpi_byte_reader_get_uint32_le
|
||||
fpi_byte_reader_get_int32_le
|
||||
fpi_byte_reader_peek_uint32_le
|
||||
fpi_byte_reader_peek_int32_le
|
||||
fpi_byte_reader_get_uint32_be
|
||||
fpi_byte_reader_get_int32_be
|
||||
fpi_byte_reader_peek_uint32_be
|
||||
fpi_byte_reader_peek_int32_be
|
||||
fpi_byte_reader_get_uint64_le
|
||||
fpi_byte_reader_get_int64_le
|
||||
fpi_byte_reader_peek_uint64_le
|
||||
fpi_byte_reader_peek_int64_le
|
||||
fpi_byte_reader_get_uint64_be
|
||||
fpi_byte_reader_get_int64_be
|
||||
fpi_byte_reader_peek_uint64_be
|
||||
fpi_byte_reader_peek_int64_be
|
||||
fpi_byte_reader_get_float32_le
|
||||
fpi_byte_reader_peek_float32_le
|
||||
fpi_byte_reader_get_float32_be
|
||||
fpi_byte_reader_peek_float32_be
|
||||
fpi_byte_reader_get_float64_le
|
||||
fpi_byte_reader_peek_float64_le
|
||||
fpi_byte_reader_get_float64_be
|
||||
fpi_byte_reader_peek_float64_be
|
||||
fpi_byte_reader_get_data
|
||||
fpi_byte_reader_peek_data
|
||||
fpi_byte_reader_get_data_static
|
||||
fpi_byte_reader_peek_data_static
|
||||
fpi_byte_reader_dup_data
|
||||
fpi_byte_reader_masked_scan_uint32
|
||||
fpi_byte_reader_masked_scan_uint32_peek
|
||||
fpi_byte_reader_skip_string
|
||||
fpi_byte_reader_skip_string_utf8
|
||||
fpi_byte_reader_skip_string_utf16
|
||||
fpi_byte_reader_skip_string_utf32
|
||||
fpi_byte_reader_peek_string
|
||||
fpi_byte_reader_peek_string_utf8
|
||||
fpi_byte_reader_get_string_utf8
|
||||
fpi_byte_reader_dup_string_utf8
|
||||
fpi_byte_reader_dup_string_utf16
|
||||
fpi_byte_reader_dup_string_utf32
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>fpi-byte-writer</FILE>
|
||||
<TITLE>FpiByteWriter</TITLE>
|
||||
FpiByteWriter
|
||||
fpi_byte_writer_new
|
||||
fpi_byte_writer_new_with_size
|
||||
fpi_byte_writer_new_with_data
|
||||
fpi_byte_writer_init
|
||||
fpi_byte_writer_init_with_size
|
||||
fpi_byte_writer_init_with_data
|
||||
fpi_byte_writer_reset
|
||||
fpi_byte_writer_reset_and_get_bytes
|
||||
fpi_byte_writer_reset_and_get_data
|
||||
fpi_byte_writer_free
|
||||
fpi_byte_writer_free_and_get_data
|
||||
fpi_byte_writer_get_remaining
|
||||
fpi_byte_writer_ensure_free_space
|
||||
fpi_byte_writer_put_bytes
|
||||
fpi_byte_writer_put_uint8
|
||||
fpi_byte_writer_put_uint16_be
|
||||
fpi_byte_writer_put_uint24_be
|
||||
fpi_byte_writer_put_uint32_be
|
||||
fpi_byte_writer_put_uint64_be
|
||||
fpi_byte_writer_put_uint16_le
|
||||
fpi_byte_writer_put_uint24_le
|
||||
fpi_byte_writer_put_uint32_le
|
||||
fpi_byte_writer_put_uint64_le
|
||||
fpi_byte_writer_put_int8
|
||||
fpi_byte_writer_put_int16_be
|
||||
fpi_byte_writer_put_int24_be
|
||||
fpi_byte_writer_put_int32_be
|
||||
fpi_byte_writer_put_int64_be
|
||||
fpi_byte_writer_put_int16_le
|
||||
fpi_byte_writer_put_int24_le
|
||||
fpi_byte_writer_put_int32_le
|
||||
fpi_byte_writer_put_int64_le
|
||||
fpi_byte_writer_put_float32_be
|
||||
fpi_byte_writer_put_float64_be
|
||||
fpi_byte_writer_put_float32_le
|
||||
fpi_byte_writer_put_float64_le
|
||||
fpi_byte_writer_put_string_utf8
|
||||
fpi_byte_writer_put_string_utf16
|
||||
fpi_byte_writer_put_string_utf32
|
||||
fpi_byte_writer_put_data
|
||||
fpi_byte_writer_fill
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>fpi-context</FILE>
|
||||
fpi_get_driver_types
|
||||
@@ -153,6 +282,7 @@ fpi_device_get_current_action
|
||||
fpi_device_retry_new
|
||||
fpi_device_error_new
|
||||
fpi_device_retry_new_msg
|
||||
fpi_device_emulation_mode_enabled
|
||||
fpi_device_error_new_msg
|
||||
fpi_device_get_driver_data
|
||||
fpi_device_get_enroll_data
|
||||
@@ -218,9 +348,12 @@ fpi_image_device_set_bz3_threshold
|
||||
<SECTION>
|
||||
<FILE>fpi-log</FILE>
|
||||
fp_dbg
|
||||
fp_dbg_hex_dump_bytes
|
||||
fp_dbg_hex_dump_data
|
||||
fp_info
|
||||
fp_warn
|
||||
fp_err
|
||||
fpi_log_is_debug_transfer_enabled
|
||||
BUG_ON
|
||||
BUG
|
||||
</SECTION>
|
||||
|
||||
@@ -48,6 +48,12 @@
|
||||
<xi:include href="xml/fpi-log.xml"/>
|
||||
</chapter>
|
||||
|
||||
<chapter id="driver-data">
|
||||
<title>Binary buffer I/O</title>
|
||||
<xi:include href="xml/fpi-byte-reader.xml"/>
|
||||
<xi:include href="xml/fpi-byte-writer.xml"/>
|
||||
</chapter>
|
||||
|
||||
<chapter id="driver-img">
|
||||
<title>Image manipulation</title>
|
||||
<xi:include href="xml/fpi-image.xml"/>
|
||||
|
||||
@@ -121,7 +121,7 @@ start_clear_storage (FpDevice *dev, ClearStorageData *clear_storage_data)
|
||||
{
|
||||
char buffer[20];
|
||||
|
||||
g_print ("Clear device storage? [Y/n]? ");
|
||||
g_print ("Clear device storage? [y/N]? ");
|
||||
if (fgets (buffer, sizeof (buffer), stdin) &&
|
||||
(buffer[0] == 'Y' || buffer[0] == 'y'))
|
||||
{
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,230 @@
|
||||
/*
|
||||
* Driver for Egis Technology (LighTuning) Match-On-Chip sensors
|
||||
*
|
||||
* 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"
|
||||
|
||||
G_DECLARE_FINAL_TYPE (FpiDeviceEgisEtu905, fpi_device_egis_etu905, FPI, DEVICE_EGIS_ETU905, FpDevice)
|
||||
|
||||
#define EGIS_ETU905_DRIVER_FULLNAME "Egis Technology (LighTuning) Match-on-Chip"
|
||||
|
||||
#define EGIS_ETU905_DRIVER_CHECK_PREFIX_TYPE1 (1 << 0)
|
||||
#define EGIS_ETU905_DRIVER_CHECK_PREFIX_TYPE2 (1 << 1)
|
||||
#define EGIS_ETU905_DRIVER_MAX_ENROLL_STAGES_20 (1 << 2)
|
||||
|
||||
#define EGIS_ETU905_EP_CMD_OUT (0x02 | FPI_USB_ENDPOINT_OUT)
|
||||
#define EGIS_ETU905_EP_CMD_IN (0x81 | FPI_USB_ENDPOINT_IN)
|
||||
#define EGIS_ETU905_EP_CMD_INTERRUPT_IN 0x83
|
||||
|
||||
#define EGIS_ETU905_USB_CONTROL_TIMEOUT 5000
|
||||
#define EGIS_ETU905_USB_SEND_TIMEOUT 5000
|
||||
#define EGIS_ETU905_USB_RECV_TIMEOUT 5000
|
||||
#define EGIS_ETU905_USB_INTERRUPT_TIMEOUT 0 /* No timeout for waiting for finger down */
|
||||
|
||||
#define EGIS_ETU905_USB_IN_RECV_LENGTH 4096
|
||||
#define EGIS_ETU905_USB_INTERRUPT_IN_RECV_LENGTH 64
|
||||
|
||||
#define EGIS_ETU905_MAX_ENROLL_STAGES_DEFAULT 12
|
||||
#define EGIS_ETU905_MAX_ENROLL_NUM 12
|
||||
#define EGIS_ETU905_FINGERPRINT_DATA_SIZE 32
|
||||
#define EGIS_ETU905_LIST_RESPONSE_PREFIX_SIZE 14
|
||||
#define EGIS_ETU905_LIST_RESPONSE_SUFFIX_SIZE 2
|
||||
|
||||
#define EGIS_ETU905_PARA_4_SIZE 68
|
||||
|
||||
#define EGIS_ETU905_PARA_1_VALUE 0
|
||||
#define EGIS_ETU905_PARA_2_VALUE 0
|
||||
#define EGIS_ETU905_PARA_3_VALUE 32
|
||||
|
||||
#pragma pack(push, 1)
|
||||
typedef struct
|
||||
{
|
||||
guchar reserve_para_1;
|
||||
gushort reserve_para_2;
|
||||
gushort reserve_para_3;
|
||||
guchar reserve_para_4[EGIS_ETU905_PARA_4_SIZE];
|
||||
} EgismocSidData;
|
||||
#pragma pack(pop)
|
||||
|
||||
/* standard prefixes for all read/writes */
|
||||
|
||||
static const guchar egis_etu905_write_prefix[] = {'E', 'G', 'I', 'S', 0x00, 0x00, 0x00, 0x01};
|
||||
static const gsize egis_etu905_write_prefix_len = sizeof (egis_etu905_write_prefix) / sizeof (egis_etu905_write_prefix[0]);
|
||||
|
||||
static const guchar egis_etu905_read_prefix[] = {'S', 'I', 'G', 'E', 0x00, 0x00, 0x00, 0x01};
|
||||
static const gsize egis_etu905_read_prefix_len = sizeof (egis_etu905_read_prefix) / sizeof (egis_etu905_read_prefix[0]);
|
||||
|
||||
|
||||
/* hard-coded command payloads */
|
||||
|
||||
static const guchar cmd_fw_version[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x0c};
|
||||
static const gsize cmd_fw_version_len = sizeof (cmd_fw_version) / sizeof (cmd_fw_version[0]);
|
||||
static const guchar rsp_fw_version_suffix[] = {0x90, 0x00};
|
||||
static const gsize rsp_fw_version_suffix_len = sizeof (rsp_fw_version_suffix) / sizeof (rsp_fw_version_suffix[0]);
|
||||
|
||||
static const guchar cmd_init[] = {0x00, 0x00, 0x00, 0x29, 0x50, 0x81, 0x80, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x12, 0x00, 0x45, 0x67, 0x69, 0x73,
|
||||
0x46, 0x50, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x00, 0x51, 0xc6, 0xbd, 0x71};
|
||||
static const gsize cmd_init_len = sizeof (cmd_init) / sizeof (cmd_init[0]);
|
||||
|
||||
static const guchar cmd_list[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x19, 0x04, 0x00, 0x00, 0x01, 0x40};
|
||||
static const gsize cmd_list_len = sizeof (cmd_list) / sizeof (cmd_list[0]);
|
||||
|
||||
static const guchar cmd_sensor_reset[] = {0x00, 0x00, 0x00, 0x04, 0x50, 0x1a, 0x00, 0x00};
|
||||
static const gsize cmd_sensor_reset_len = sizeof (cmd_sensor_reset) / sizeof (cmd_sensor_reset[0]);
|
||||
|
||||
static const guchar cmd_sensor_check[] = {0x00, 0x00, 0x00, 0x04, 0x50, 0x17, 0x02, 0x00};
|
||||
static const gsize cmd_sensor_check_len = sizeof (cmd_sensor_check) / sizeof (cmd_sensor_check[0]);
|
||||
|
||||
static const guchar cmd_sensor_identify[] = {0x00, 0x00, 0x00, 0x04, 0x50, 0x17, 0x01, 0x01};
|
||||
static const gsize cmd_sensor_identify_len = sizeof (cmd_sensor_identify) / sizeof (cmd_sensor_identify[0]);
|
||||
|
||||
static const guchar rsp_identify_match_suffix[] = {0x90, 0x00};
|
||||
static const gsize rsp_identify_match_suffix_len = sizeof (rsp_identify_match_suffix) / sizeof (rsp_identify_match_suffix[0]);
|
||||
|
||||
static const guchar rsp_identify_notmatch_suffix[] = {0x90, 0x04};
|
||||
static const gsize rsp_identify_notmatch_suffix_len = sizeof (rsp_identify_notmatch_suffix) / sizeof (rsp_identify_notmatch_suffix[0]);
|
||||
|
||||
static const guchar cmd_enroll_starting[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x16, 0x01, 0x00, 0x00, 0x00, 0x20};
|
||||
static const gsize cmd_enroll_starting_len = sizeof (cmd_enroll_starting) / sizeof (cmd_enroll_starting[0]);
|
||||
|
||||
static const guchar cmd_sensor_start_capture[] = {0x00, 0x00, 0x00, 0x04, 0x50, 0x16, 0x02, 0x01};
|
||||
static const gsize cmd_sensor_start_capture_len = sizeof (cmd_sensor_start_capture) / sizeof (cmd_sensor_start_capture[0]);
|
||||
|
||||
static const guchar cmd_read_capture[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x16, 0x02, 0x02, 0x00, 0x00, 0x02};
|
||||
static const gsize cmd_read_capture_len = sizeof (cmd_read_capture) / sizeof (cmd_read_capture[0]);
|
||||
|
||||
static const guchar cmd_duplicate_check[] = {0x00, 0x00, 0x00, 0x04, 0x50, 0x16, 0x05, 0x00};
|
||||
static const gsize cmd_duplicate_check_len = sizeof (cmd_duplicate_check) / sizeof (cmd_duplicate_check[0]);
|
||||
|
||||
static const guchar rsp_read_success_prefix[] = {0x00, 0x00, 0x00, 0x04};
|
||||
static const gsize rsp_read_success_prefix_len = sizeof (rsp_read_success_prefix) / sizeof (rsp_read_success_prefix[0]);
|
||||
static const guchar rsp_read_success_suffix[] = {0x90, 0x00};
|
||||
static const gsize rsp_read_success_suffix_len = sizeof (rsp_read_success_suffix) / sizeof (rsp_read_success_suffix[0]);
|
||||
static const guchar rsp_read_offcenter_prefix[] = {0x00, 0x00, 0x00, 0x04};
|
||||
static const gsize rsp_read_offcenter_prefix_len = sizeof (rsp_read_offcenter_prefix) / sizeof (rsp_read_offcenter_prefix[0]);
|
||||
static const guchar rsp_read_offcenter_suffix[] = {0x64, 0x91};
|
||||
static const gsize rsp_read_offcenter_suffix_len = sizeof (rsp_read_offcenter_suffix) / sizeof (rsp_read_offcenter_suffix[0]);
|
||||
static const guchar rsp_read_dirty_prefix[] = {0x00, 0x00, 0x00, 0x02, 0x64};
|
||||
static const gsize rsp_read_dirty_prefix_len = sizeof (rsp_read_dirty_prefix) / sizeof (rsp_read_dirty_prefix[0]);
|
||||
|
||||
static const guchar cmd_commit_starting[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x16, 0x05, 0x00, 0x00, 0x00, 0x20};
|
||||
static const gsize cmd_commit_starting_len = sizeof (cmd_commit_starting) / sizeof (cmd_commit_starting[0]);
|
||||
|
||||
static const guchar cmd_enroll_discard[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x16, 0x04, 0x00, 0x00, 0x00, 0x20};
|
||||
static const gsize cmd_enroll_discard_len = sizeof (cmd_enroll_discard) / sizeof (cmd_enroll_discard[0]);
|
||||
|
||||
static const guchar cmd_identify_cancel[] = {0x00, 0x00, 0x00, 0x04, 0x50, 0x04, 0x01, 0x00};
|
||||
static const gsize cmd_identify_cancel_len = sizeof (cmd_identify_cancel) / sizeof (cmd_identify_cancel[0]);
|
||||
|
||||
static const guchar cmd_identify_cancel_result[] = {0x00, 0x00, 0x00, 0x04, 0x50, 0x04, 0x02, 0x00};
|
||||
static const gsize cmd_identify_cancel_result_len = sizeof (cmd_identify_cancel_result) / sizeof (cmd_identify_cancel_result[0]);
|
||||
|
||||
/* prefixes/suffixes and other things for dynamically created command payloads */
|
||||
|
||||
#define EGIS_ETU905_CHECK_BYTES_LENGTH 2
|
||||
#define EGIS_ETU905_IDENTIFY_RESPONSE_PRINT_ID_OFFSET 46
|
||||
#define EGIS_ETU905_CMD_CHECK_SEPARATOR_LENGTH 32
|
||||
|
||||
static const guchar cmd_new_print_prefix_type2[] = {0x00, 0x00, 0x00, 0x50, 0x50, 0x16, 0x03, 0x00, 0x00, 0x00, 0x49};
|
||||
static const gsize cmd_new_print_prefix_type2_len = sizeof (cmd_new_print_prefix_type2) / sizeof (cmd_new_print_prefix_type2[0]);
|
||||
|
||||
static const guchar cmd_delete_prefix[] = {0x50, 0x18, 0x04, 0x00, 0x00};
|
||||
static const gsize cmd_delete_prefix_len = sizeof (cmd_delete_prefix) / sizeof (cmd_delete_prefix[0]);
|
||||
static const guchar rsp_delete_success_prefix[] = {0x00, 0x00, 0x00, 0x02, 0x90, 0x00};
|
||||
static const gsize rsp_delete_success_prefix_len = sizeof (rsp_delete_success_prefix) / sizeof (rsp_delete_success_prefix[0]);
|
||||
|
||||
static const guchar cmd_check_prefix_type1[] = {0x50, 0x17, 0x03, 0x00, 0x00};
|
||||
static const gsize cmd_check_prefix_type1_len = sizeof (cmd_check_prefix_type1) / sizeof (cmd_check_prefix_type1[0]);
|
||||
static const guchar cmd_check_prefix_type2[] = {0x50, 0x17, 0x03, 0x80, 0x00};
|
||||
static const gsize cmd_check_prefix_type2_len = sizeof (cmd_check_prefix_type2) / sizeof (cmd_check_prefix_type2[0]);
|
||||
static const guchar cmd_check_suffix[] = {0x00, 0x40};
|
||||
static const gsize cmd_check_suffix_len = sizeof (cmd_check_suffix) / sizeof (cmd_check_suffix[0]);
|
||||
static const guchar rsp_check_not_yet_enrolled_suffix[] = {0x90, 0x04};
|
||||
static const gsize rsp_check_not_yet_enrolled_suffix_len = sizeof (rsp_check_not_yet_enrolled_suffix) / sizeof (rsp_check_not_yet_enrolled_suffix[0]);
|
||||
|
||||
|
||||
/* SSM task states and various status enums */
|
||||
|
||||
typedef enum {
|
||||
CMD_SEND,
|
||||
CMD_GET,
|
||||
CMD_STATES,
|
||||
} CommandStates;
|
||||
|
||||
typedef enum {
|
||||
DEV_GET_FW_VERSION,
|
||||
DEV_INIT_CONTROL,
|
||||
DEV_INIT_STATES,
|
||||
} DeviceInitStates;
|
||||
|
||||
typedef enum {
|
||||
IDENTIFY_GET_ENROLLED_IDS,
|
||||
IDENTIFY_CHECK_ENROLLED_NUM,
|
||||
IDENTIFY_SENSOR_RESET,
|
||||
IDENTIFY_SENSOR_IDENTIFY,
|
||||
IDENTIFY_WAIT_FINGER,
|
||||
IDENTIFY_SENSOR_CHECK,
|
||||
IDENTIFY_CHECK,
|
||||
IDENTIFY_SEND_CANCEL_RESULT,
|
||||
IDENTIFY_COMPLETE_SENSOR_RESET,
|
||||
IDENTIFY_COMPLETE,
|
||||
|
||||
/* Cleanup states follow */
|
||||
IDENTIFY_CANCEL,
|
||||
IDENTIFY_STATES,
|
||||
} IdentifyStates;
|
||||
|
||||
typedef enum {
|
||||
ENROLL_START,
|
||||
ENROLL_CAPTURE_SENSOR_RESET,
|
||||
ENROLL_CAPTURE_SENSOR_START_CAPTURE,
|
||||
ENROLL_CAPTURE_WAIT_FINGER,
|
||||
ENROLL_CAPTURE_READ_RESPONSE,
|
||||
ENROLL_DUPLICATE_CHECK,
|
||||
ENROLL_COMMIT_START,
|
||||
ENROLL_COMMIT,
|
||||
ENROLL_COMMIT_SENSOR_RESET,
|
||||
ENROLL_COMPLETE,
|
||||
|
||||
/* Cleanup states follow */
|
||||
ENROLL_CANCEL,
|
||||
ENROLL_STATES,
|
||||
} EnrollStates;
|
||||
|
||||
typedef enum {
|
||||
ENROLL_STATUS_DEVICE_FULL,
|
||||
ENROLL_STATUS_DUPLICATE,
|
||||
ENROLL_STATUS_PARTIAL_OK,
|
||||
ENROLL_STATUS_RETRY,
|
||||
ENROLL_STATUS_COMPLETE,
|
||||
} EnrollStatus;
|
||||
|
||||
typedef enum {
|
||||
LIST_GET_ENROLLED_IDS,
|
||||
LIST_RETURN_ENROLLED_PRINTS,
|
||||
LIST_STATES,
|
||||
} ListStates;
|
||||
|
||||
typedef enum {
|
||||
DELETE_GET_ENROLLED_IDS,
|
||||
DELETE_DELETE,
|
||||
DELETE_STATES,
|
||||
} DeleteStates;
|
||||
@@ -1500,7 +1500,7 @@ egismoc_probe (FpDevice *device)
|
||||
return;
|
||||
}
|
||||
|
||||
if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") == 0)
|
||||
if (fpi_device_emulation_mode_enabled (FP_DEVICE (device)))
|
||||
serial = g_strdup ("emulated-device");
|
||||
else
|
||||
serial = g_usb_device_get_string_descriptor (usb_dev,
|
||||
|
||||
@@ -547,10 +547,17 @@ capture_run_state (FpiSsm *ssm, FpDevice *dev)
|
||||
fpi_image_device_report_finger_status (idev, TRUE);
|
||||
elan_run_cmd (ssm, dev, &get_image_cmd, ELAN_CMD_TIMEOUT);
|
||||
}
|
||||
else if (self->dev_type == ELAN_0C58 && self->last_read &&
|
||||
(self->last_read[0] == 0x00 || self->last_read[0] == 0xaf))
|
||||
{
|
||||
/* 0x00 - not ready
|
||||
* 0xaf - finger removed or sensor busy (seen on 0x0c58) */
|
||||
fpi_ssm_jump_to_state_delayed (ssm, CAPTURE_WAIT_FINGER, 10);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* XXX: The timeout is emulated incorrectly, resulting in a zero byte read. */
|
||||
if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") == 0)
|
||||
if (fpi_device_emulation_mode_enabled (FP_DEVICE (self)))
|
||||
fpi_ssm_mark_completed (ssm);
|
||||
else
|
||||
fpi_ssm_mark_failed (ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO));
|
||||
@@ -795,7 +802,7 @@ elan_calibrate (FpiDeviceElan *self)
|
||||
|
||||
g_return_if_fail (!self->active);
|
||||
self->active = TRUE;
|
||||
self->calib_atts_left = ELAN_CALIBRATION_ATTEMPTS;
|
||||
self->calib_atts_left = ELAN_CALIBRATION_ATTEMPTS (self->dev_type);
|
||||
|
||||
FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (self), calibrate_run_state,
|
||||
CALIBRATE_NUM_STATES);
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#define ELAN_0907 (1 << 0)
|
||||
#define ELAN_0C03 (1 << 1)
|
||||
#define ELAN_0C42 (1 << 2)
|
||||
#define ELAN_0C58 (1 << 3)
|
||||
|
||||
/* devices which don't require frame rotation before assembling */
|
||||
#define ELAN_NOT_ROTATED ELAN_0C03
|
||||
@@ -44,7 +45,9 @@
|
||||
|
||||
/* times to retry reading calibration status during one session
|
||||
* generally prevents calibration from looping indefinitely */
|
||||
#define ELAN_CALIBRATION_ATTEMPTS 10
|
||||
#define ELAN_DEFAULT_CALIBRATION_ATTEMPTS 10
|
||||
#define ELAN_CALIBRATION_ATTEMPTS(dev_type) \
|
||||
((dev_type) == ELAN_0C58 ? 30 : ELAN_DEFAULT_CALIBRATION_ATTEMPTS)
|
||||
|
||||
/* min and max frames in a capture */
|
||||
#define ELAN_MIN_FRAMES 7
|
||||
@@ -220,7 +223,7 @@ static const FpIdEntry elan_id_table[] = {
|
||||
{.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 = 0x0c6e, .driver_data = ELAN_ALL_DEV},
|
||||
{.vid = ELAN_VEND_ID, .pid = 0x0c58, .driver_data = ELAN_ALL_DEV},
|
||||
{.vid = ELAN_VEND_ID, .pid = 0x0c58, .driver_data = ELAN_0C58},
|
||||
{.vid = 0, .pid = 0, .driver_data = 0},
|
||||
};
|
||||
|
||||
|
||||
@@ -33,12 +33,14 @@ static const FpIdEntry id_table[] = {
|
||||
{ .vid = 0x04f3, .pid = 0x0c8d, },
|
||||
{ .vid = 0x04f3, .pid = 0x0c98, },
|
||||
{ .vid = 0x04f3, .pid = 0x0c99, },
|
||||
{ .vid = 0x04f3, .pid = 0x0c9c, },
|
||||
{ .vid = 0x04f3, .pid = 0x0c9d, },
|
||||
{ .vid = 0x04f3, .pid = 0x0c9f, },
|
||||
{ .vid = 0x04f3, .pid = 0x0ca3, },
|
||||
{ .vid = 0x04f3, .pid = 0x0ca7, },
|
||||
{ .vid = 0x04f3, .pid = 0x0ca8, },
|
||||
{ .vid = 0x04f3, .pid = 0x0cb0, },
|
||||
{ .vid = 0x04f3, .pid = 0x0cb2, },
|
||||
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
||||
};
|
||||
|
||||
|
||||
@@ -94,7 +94,7 @@ static void
|
||||
elanspi_do_hwreset (FpiDeviceElanSpi *self, GError **err)
|
||||
{
|
||||
/* Skip in emulation mode, since we don't mock hid devices */
|
||||
if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") == 0)
|
||||
if (fpi_device_emulation_mode_enabled (FP_DEVICE (self)))
|
||||
return;
|
||||
|
||||
/*
|
||||
@@ -485,7 +485,8 @@ elanspi_capture_old_handler (FpiSsm *ssm, FpDevice *dev)
|
||||
if (!(self->sensor_status & 4))
|
||||
{
|
||||
/* has the timeout expired? -- disabled in testing since valgrind is very slow */
|
||||
if (g_get_monotonic_time () > self->capture_timeout && g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") != 0)
|
||||
if (g_get_monotonic_time () > self->capture_timeout &&
|
||||
!fpi_device_emulation_mode_enabled (FP_DEVICE (self)))
|
||||
{
|
||||
/* end with a timeout */
|
||||
fpi_ssm_mark_failed (ssm, g_error_new (G_IO_ERROR, G_IO_ERROR_TIMED_OUT, "timed out waiting for new line"));
|
||||
|
||||
@@ -22,6 +22,9 @@
|
||||
|
||||
#define FP_COMPONENT "focaltech_moc"
|
||||
|
||||
#define FOCALTECH_QUIRK_SINGLE_SLOT 1
|
||||
#define FOCALTECH_MOC_STATIC_USER_ID "focaltech_moc_static_id"
|
||||
|
||||
#include "drivers_api.h"
|
||||
|
||||
G_DEFINE_TYPE (FpiDeviceFocaltechMoc, fpi_device_focaltech_moc, FP_TYPE_DEVICE)
|
||||
@@ -34,7 +37,12 @@ static const FpIdEntry id_table[] = {
|
||||
{ .vid = 0x2808, .pid = 0xa99a, },
|
||||
{ .vid = 0x2808, .pid = 0xa57a, },
|
||||
{ .vid = 0x2808, .pid = 0xa78a, },
|
||||
{ .vid = 0x2808, .pid = 0xa97a, },
|
||||
{ .vid = 0x2808, .pid = 0x1579, },
|
||||
{ .vid = 0x2808, .pid = 0x077A, },
|
||||
{ .vid = 0x2808, .pid = 0x079A, },
|
||||
{ .vid = 0x2808, .pid = 0x5158, },
|
||||
{ .vid = 0x2808, .pid = 0x6553, .driver_data = FOCALTECH_QUIRK_SINGLE_SLOT, },
|
||||
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
||||
};
|
||||
|
||||
@@ -191,6 +199,22 @@ focaltech_moc_check_cmd (uint8_t *response_buf, uint16_t len)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
focaltech_moc_require_response_len (FpiDeviceFocaltechMoc *self,
|
||||
gsize length_in,
|
||||
gsize minimum_length,
|
||||
const char *context)
|
||||
{
|
||||
if (length_in >= minimum_length)
|
||||
return TRUE;
|
||||
|
||||
fpi_ssm_mark_failed (self->task_ssm,
|
||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||
"%s: short response (%zu < %zu)",
|
||||
context, length_in, minimum_length));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
fp_cmd_receive_cb (FpiUsbTransfer *transfer,
|
||||
FpDevice *device,
|
||||
@@ -1040,10 +1064,15 @@ focaltech_moc_get_enrolled_info_cb (FpiDeviceFocaltechMoc *self,
|
||||
return;
|
||||
}
|
||||
|
||||
if (!focaltech_moc_require_response_len (self, length_in,
|
||||
sizeof (FpCmd) + sizeof (uint8_t),
|
||||
"get enrolled info"))
|
||||
return;
|
||||
|
||||
fp_cmd = (FpCmd *) buffer_in;
|
||||
items = (struct EnrolledInfoItem *) (fp_cmd + 1);
|
||||
|
||||
if (fp_cmd->code != 0x04)
|
||||
if (fp_cmd->code != 0x04 && fp_cmd->code != 0x09)
|
||||
{
|
||||
fpi_ssm_mark_failed (self->task_ssm,
|
||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||
@@ -1051,8 +1080,25 @@ focaltech_moc_get_enrolled_info_cb (FpiDeviceFocaltechMoc *self,
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy (&data->enrolled_info->items[0], items,
|
||||
FOCALTECH_MOC_MAX_FINGERS * sizeof (struct EnrolledInfoItem));
|
||||
if (fp_cmd->code == 0x04)
|
||||
{
|
||||
if (!focaltech_moc_require_response_len (self, length_in,
|
||||
sizeof (FpCmd) +
|
||||
FOCALTECH_MOC_MAX_FINGERS * sizeof (struct EnrolledInfoItem) +
|
||||
sizeof (uint8_t),
|
||||
"get enrolled info"))
|
||||
return;
|
||||
memcpy (&data->enrolled_info->items[0], items,
|
||||
FOCALTECH_MOC_MAX_FINGERS * sizeof (struct EnrolledInfoItem));
|
||||
|
||||
}
|
||||
else if (fp_cmd->code == 0x09)
|
||||
{
|
||||
memset (data->enrolled_info->actived, 0, FOCALTECH_MOC_MAX_FINGERS);
|
||||
memset (&data->enrolled_info->items[0], 0,
|
||||
FOCALTECH_MOC_MAX_FINGERS * sizeof (struct EnrolledInfoItem));
|
||||
}
|
||||
|
||||
fpi_ssm_next_state (self->task_ssm);
|
||||
}
|
||||
}
|
||||
@@ -1104,10 +1150,15 @@ focaltech_moc_get_enrolled_list_cb (FpiDeviceFocaltechMoc *self,
|
||||
return;
|
||||
}
|
||||
|
||||
if (!focaltech_moc_require_response_len (self, length_in,
|
||||
sizeof (FpCmd) + sizeof (uint8_t),
|
||||
"get enrolled list"))
|
||||
return;
|
||||
|
||||
fp_cmd = (FpCmd *) buffer_in;
|
||||
uid_list = (struct UidList *) (fp_cmd + 1);
|
||||
|
||||
if (fp_cmd->code != 0x04)
|
||||
if (fp_cmd->code != 0x04 && fp_cmd->code != 0x09)
|
||||
{
|
||||
fpi_ssm_mark_failed (self->task_ssm,
|
||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||
@@ -1116,46 +1167,57 @@ focaltech_moc_get_enrolled_list_cb (FpiDeviceFocaltechMoc *self,
|
||||
else
|
||||
{
|
||||
FpActionData *data = fpi_ssm_get_data (self->task_ssm);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < FOCALTECH_MOC_MAX_FINGERS; i++)
|
||||
if (fp_cmd->code == 0x04)
|
||||
{
|
||||
if (uid_list->actived[i] != 0)
|
||||
if (!focaltech_moc_require_response_len (self, length_in,
|
||||
sizeof (FpCmd) +
|
||||
sizeof (struct UidList) +
|
||||
sizeof (uint8_t),
|
||||
"get enrolled list"))
|
||||
return;
|
||||
for (size_t i = 0; i < FOCALTECH_MOC_MAX_FINGERS; i++)
|
||||
{
|
||||
struct UserId *user_id = &uid_list->uid[i];
|
||||
FpPrint *print = fp_print_new (FP_DEVICE (self));
|
||||
struct EnrolledInfoItem *item = NULL;
|
||||
int index;
|
||||
|
||||
fp_info ("focaltechmoc add slot: %d", i);
|
||||
|
||||
fprint_set_uid (print, user_id->uid, sizeof (user_id->uid));
|
||||
|
||||
if (focaltech_moc_get_enrolled_info_item (self, user_id->uid, &item, &index) == 0)
|
||||
if (uid_list->actived[i] != 0)
|
||||
{
|
||||
g_autofree gchar *userid_safe = NULL;
|
||||
const gchar *username;
|
||||
userid_safe = g_strndup ((const char *) &item->user_id, FOCALTECH_MOC_USER_ID_LENGTH);
|
||||
fp_dbg ("%s", userid_safe);
|
||||
fpi_print_fill_from_user_id (print, userid_safe);
|
||||
memcpy (data->enrolled_info->user_id[index].uid, user_id->uid, 32);
|
||||
data->enrolled_info->user_des[index].finger = fp_print_get_finger (print);
|
||||
username = fp_print_get_username (print);
|
||||
struct UserId *user_id = &uid_list->uid[i];
|
||||
FpPrint *print = fp_print_new (FP_DEVICE (self));
|
||||
struct EnrolledInfoItem *item = NULL;
|
||||
int index;
|
||||
|
||||
if (username != NULL)
|
||||
strncpy (data->enrolled_info->user_des[index].username, username, 64);
|
||||
fp_info ("focaltechmoc add slot: %zu", i);
|
||||
|
||||
fprint_set_uid (print, user_id->uid, sizeof (user_id->uid));
|
||||
|
||||
if (focaltech_moc_get_enrolled_info_item (self, user_id->uid, &item, &index) == 0)
|
||||
{
|
||||
g_autofree gchar *userid_safe = NULL;
|
||||
const gchar *username;
|
||||
|
||||
userid_safe = g_strndup ((const char *) &item->user_id, FOCALTECH_MOC_USER_ID_LENGTH);
|
||||
fp_dbg ("%s", userid_safe);
|
||||
fpi_print_fill_from_user_id (print, userid_safe);
|
||||
memcpy (data->enrolled_info->user_id[index].uid, user_id->uid, 32);
|
||||
data->enrolled_info->user_des[index].finger = fp_print_get_finger (print);
|
||||
username = fp_print_get_username (print);
|
||||
|
||||
if (username != NULL)
|
||||
g_strlcpy (data->enrolled_info->user_des[index].username,
|
||||
username,
|
||||
sizeof (data->enrolled_info->user_des[index].username));
|
||||
}
|
||||
|
||||
g_ptr_array_add (data->list_result, g_object_ref_sink (print));
|
||||
}
|
||||
|
||||
g_ptr_array_add (data->list_result, g_object_ref_sink (print));
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < FOCALTECH_MOC_MAX_FINGERS; i++)
|
||||
{
|
||||
struct EnrolledInfoItem *item = &data->enrolled_info->items[i];
|
||||
for (size_t i = 0; i < FOCALTECH_MOC_MAX_FINGERS; i++)
|
||||
{
|
||||
struct EnrolledInfoItem *item = &data->enrolled_info->items[i];
|
||||
|
||||
if (data->enrolled_info->actived[i] == 0)
|
||||
memset (item, 0, sizeof (struct EnrolledInfoItem));
|
||||
if (data->enrolled_info->actived[i] == 0)
|
||||
memset (item, 0, sizeof (struct EnrolledInfoItem));
|
||||
}
|
||||
}
|
||||
|
||||
fpi_ssm_next_state (self->task_ssm);
|
||||
@@ -1277,9 +1339,21 @@ focaltech_moc_start_enroll_cb (FpiDeviceFocaltechMoc *self,
|
||||
}
|
||||
else
|
||||
{
|
||||
guint64 quirk = fpi_device_get_driver_data (FP_DEVICE (self));
|
||||
|
||||
fpi_device_get_enroll_data (FP_DEVICE (self), &print);
|
||||
fprint_set_uid (print, user_id->uid, sizeof (user_id->uid));
|
||||
userid_safe = fpi_print_generate_user_id (print);
|
||||
|
||||
if (quirk == FOCALTECH_QUIRK_SINGLE_SLOT)
|
||||
{
|
||||
fp_info ("Applying SINGLE_SLOT quirk: Forcing static User ID");
|
||||
userid_safe = g_strdup (FOCALTECH_MOC_STATIC_USER_ID);
|
||||
}
|
||||
else
|
||||
{
|
||||
userid_safe = fpi_print_generate_user_id (print);
|
||||
}
|
||||
|
||||
userid_len = strlen (userid_safe);
|
||||
userid_len = MIN (FOCALTECH_MOC_USER_ID_LENGTH, userid_len);
|
||||
fp_info ("focaltechmoc user id: %s", userid_safe);
|
||||
@@ -1348,9 +1422,14 @@ focaltech_moc_set_enrolled_info_cb (FpiDeviceFocaltechMoc *self,
|
||||
return;
|
||||
}
|
||||
|
||||
if (!focaltech_moc_require_response_len (self, length_in,
|
||||
sizeof (FpCmd) + sizeof (uint8_t),
|
||||
"set enrolled info"))
|
||||
return;
|
||||
|
||||
fp_cmd = (FpCmd *) buffer_in;
|
||||
|
||||
if (fp_cmd->code != 0x04)
|
||||
if (fp_cmd->code != 0x04 && fp_cmd->code != 0x09)
|
||||
{
|
||||
fpi_ssm_mark_failed (self->task_ssm,
|
||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||
@@ -1375,9 +1454,14 @@ focaltech_moc_commit_cb (FpiDeviceFocaltechMoc *self,
|
||||
return;
|
||||
}
|
||||
|
||||
if (!focaltech_moc_require_response_len (self, length_in,
|
||||
sizeof (FpCmd) + sizeof (uint8_t),
|
||||
"commit"))
|
||||
return;
|
||||
|
||||
fp_cmd = (FpCmd *) buffer_in;
|
||||
|
||||
if (fp_cmd->code != 0x04)
|
||||
if (fp_cmd->code != 0x04 && fp_cmd->code != 0x09)
|
||||
{
|
||||
fpi_ssm_mark_failed (self->task_ssm,
|
||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||
@@ -1570,9 +1654,14 @@ focaltech_moc_delete_cb (FpiDeviceFocaltechMoc *self,
|
||||
return;
|
||||
}
|
||||
|
||||
if (!focaltech_moc_require_response_len (self, length_in,
|
||||
sizeof (FpCmd) + sizeof (uint8_t),
|
||||
"delete"))
|
||||
return;
|
||||
|
||||
fp_cmd = (FpCmd *) buffer_in;
|
||||
|
||||
if (fp_cmd->code != 0x04)
|
||||
if (fp_cmd->code != 0x04 && fp_cmd->code != 0x09)
|
||||
{
|
||||
fpi_ssm_mark_failed (self->task_ssm,
|
||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||
@@ -1767,8 +1856,9 @@ static void
|
||||
focaltech_moc_delete_print (FpDevice *device)
|
||||
{
|
||||
FpiDeviceFocaltechMoc *self = FPI_DEVICE_FOCALTECH_MOC (device);
|
||||
FpActionData *data = g_new0 (FpActionData, 1);
|
||||
FpActionData *data = NULL;
|
||||
|
||||
data = g_new0 (FpActionData, 1);
|
||||
data->enrolled_info = g_new0 (struct EnrolledInfo, 1);
|
||||
data->list_result = g_ptr_array_new_with_free_func (g_object_unref);
|
||||
|
||||
@@ -1779,6 +1869,87 @@ focaltech_moc_delete_print (FpDevice *device)
|
||||
fpi_ssm_start (self->task_ssm, task_ssm_done);
|
||||
}
|
||||
|
||||
enum moc_clear_storage_states {
|
||||
MOC_CLEAR_STORAGE_SEND,
|
||||
MOC_CLEAR_STORAGE_NUM_STATES,
|
||||
};
|
||||
|
||||
static void
|
||||
focaltech_moc_clear_storage_cb (FpiDeviceFocaltechMoc *self,
|
||||
uint8_t *buffer_in,
|
||||
gsize length_in,
|
||||
GError *error)
|
||||
{
|
||||
FpCmd *fp_cmd = NULL;
|
||||
|
||||
if (error)
|
||||
{
|
||||
fp_warn ("Mass erase command completed with warning: %s", error->message);
|
||||
fpi_ssm_mark_failed (self->task_ssm, error);
|
||||
return;
|
||||
}
|
||||
|
||||
if (length_in == 0)
|
||||
{
|
||||
fpi_device_clear_storage_complete (FP_DEVICE (self), NULL);
|
||||
fpi_ssm_next_state (self->task_ssm);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!focaltech_moc_require_response_len (self, length_in,
|
||||
sizeof (FpCmd) + sizeof (uint8_t),
|
||||
"clear storage"))
|
||||
return;
|
||||
|
||||
fp_cmd = (FpCmd *) buffer_in;
|
||||
|
||||
if (fp_cmd->code != 0x04 && fp_cmd->code != 0x09)
|
||||
{
|
||||
fpi_ssm_mark_failed (self->task_ssm,
|
||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||
"Clear storage failed: unexpected response code 0x%02x",
|
||||
fp_cmd->code));
|
||||
return;
|
||||
}
|
||||
|
||||
fpi_device_clear_storage_complete (FP_DEVICE (self), NULL);
|
||||
fpi_ssm_next_state (self->task_ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
focaltech_clear_storage_run_state (FpiSsm *ssm, FpDevice *device)
|
||||
{
|
||||
guint64 quirk = fpi_device_get_driver_data (device);
|
||||
guint8 *cmd_buf = NULL;
|
||||
uint16_t cmd_len = 0;
|
||||
uint16_t resp_len = 0;
|
||||
|
||||
switch (fpi_ssm_get_cur_state (ssm))
|
||||
{
|
||||
case MOC_CLEAR_STORAGE_SEND:
|
||||
resp_len = quirk == FOCALTECH_QUIRK_SINGLE_SLOT ? 0 : sizeof (uint8_t);
|
||||
cmd_buf = focaltech_moc_compose_cmd (0xac, NULL, cmd_len);
|
||||
|
||||
focaltech_moc_get_cmd (device, cmd_buf,
|
||||
sizeof (FpCmd) + cmd_len + sizeof (uint8_t),
|
||||
sizeof (FpCmd) + resp_len + sizeof (uint8_t),
|
||||
FALSE,
|
||||
focaltech_moc_clear_storage_cb);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
focaltech_moc_clear_storage (FpDevice *device)
|
||||
{
|
||||
FpiDeviceFocaltechMoc *self = FPI_DEVICE_FOCALTECH_MOC (device);
|
||||
|
||||
self->task_ssm = fpi_ssm_new (device,
|
||||
focaltech_clear_storage_run_state,
|
||||
MOC_CLEAR_STORAGE_NUM_STATES);
|
||||
fpi_ssm_start (self->task_ssm, task_ssm_done);
|
||||
}
|
||||
|
||||
enum moc_list_states {
|
||||
MOC_LIST_GET_ENROLLED_INFO,
|
||||
MOC_LIST_GET_ENROLLED_LIST,
|
||||
@@ -1854,6 +2025,17 @@ fpi_device_focaltech_moc_init (FpiDeviceFocaltechMoc *self)
|
||||
G_DEBUG_HERE ();
|
||||
}
|
||||
|
||||
static void
|
||||
focaltech_moc_probe (FpDevice *device)
|
||||
{
|
||||
guint64 quirk = fpi_device_get_driver_data (device);
|
||||
|
||||
if (quirk == FOCALTECH_QUIRK_SINGLE_SLOT)
|
||||
fpi_device_update_features (device, FP_DEVICE_FEATURE_STORAGE_DELETE, 0);
|
||||
|
||||
fpi_device_probe_complete (device, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
fpi_device_focaltech_moc_class_init (FpiDeviceFocaltechMocClass *klass)
|
||||
{
|
||||
@@ -1868,12 +2050,14 @@ fpi_device_focaltech_moc_class_init (FpiDeviceFocaltechMocClass *klass)
|
||||
dev_class->nr_enroll_stages = FOCALTECH_MOC_MAX_FINGERS;
|
||||
dev_class->temp_hot_seconds = -1;
|
||||
|
||||
dev_class->probe = focaltech_moc_probe;
|
||||
dev_class->open = focaltech_moc_open;
|
||||
dev_class->close = focaltech_moc_close;
|
||||
dev_class->verify = focaltech_moc_identify;
|
||||
dev_class->enroll = focaltech_moc_enroll;
|
||||
dev_class->identify = focaltech_moc_identify;
|
||||
dev_class->delete = focaltech_moc_delete_print;
|
||||
dev_class->clear_storage = focaltech_moc_clear_storage;
|
||||
dev_class->list = focaltech_moc_list;
|
||||
|
||||
fpi_device_class_auto_initialize_features (dev_class);
|
||||
|
||||
@@ -72,6 +72,7 @@ static const FpIdEntry id_table[] = {
|
||||
{ .vid = 0x10A5, .pid = 0x9524, },
|
||||
{ .vid = 0x10A5, .pid = 0x9544, },
|
||||
{ .vid = 0x10A5, .pid = 0xC844, },
|
||||
{ .vid = 0x10A5, .pid = 0x9B24, },
|
||||
/* terminating entry */
|
||||
{ .vid = 0, .pid = 0, .driver_data = 0 },
|
||||
};
|
||||
@@ -271,13 +272,14 @@ static void
|
||||
fpc_cmd_ssm_done (FpiSsm *ssm, FpDevice *dev, GError *error)
|
||||
{
|
||||
FpiDeviceFpcMoc *self = FPI_DEVICE_FPCMOC (dev);
|
||||
CommandData *data = fpi_ssm_get_data (ssm);
|
||||
CommandData *data;
|
||||
|
||||
self->cmd_ssm = NULL;
|
||||
/* Notify about the SSM failure from here instead. */
|
||||
if (error)
|
||||
{
|
||||
fp_err ("%s error: %s ", G_STRFUNC, error->message);
|
||||
data = fpi_ssm_get_data (ssm);
|
||||
if (data->callback)
|
||||
data->callback (self, NULL, error);
|
||||
}
|
||||
|
||||
@@ -480,6 +480,35 @@ fp_verify_cb (FpiDeviceGoodixMoc *self,
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
fp_verify_finger_mode_cb (FpiDeviceGoodixMoc *self,
|
||||
gxfp_cmd_response_t *resp,
|
||||
GError *error)
|
||||
{
|
||||
if (error)
|
||||
{
|
||||
fpi_ssm_mark_failed (self->task_ssm, error);
|
||||
return;
|
||||
}
|
||||
/* if reach max timeout(5sec) finger not up, try again */
|
||||
if (resp->finger_status.status == GX_ERROR_WAIT_FINGER_UP_TIMEOUT)
|
||||
{
|
||||
fpi_ssm_jump_to_state (self->task_ssm, GOODIX_VERIFY_WAIT_FINGER_UP);
|
||||
return;
|
||||
}
|
||||
else if (resp->finger_status.status != GX_SUCCESS)
|
||||
{
|
||||
fpi_ssm_mark_failed (self->task_ssm,
|
||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||
"Switch finger mode failed"));
|
||||
return;
|
||||
}
|
||||
fpi_device_report_finger_status_changes (FP_DEVICE (self),
|
||||
FP_FINGER_STATUS_NONE,
|
||||
FP_FINGER_STATUS_PRESENT);
|
||||
fpi_ssm_next_state (self->task_ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
fp_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
||||
{
|
||||
@@ -520,6 +549,17 @@ fp_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
||||
fp_verify_cb);
|
||||
break;
|
||||
|
||||
case GOODIX_VERIFY_WAIT_FINGER_UP:
|
||||
{
|
||||
guint8 dummy = 0;
|
||||
goodix_sensor_cmd (self, MOC_CMD0_FINGER_MODE, MOC_CMD1_SET_FINGER_UP,
|
||||
true,
|
||||
&dummy,
|
||||
1,
|
||||
fp_verify_finger_mode_cb);
|
||||
}
|
||||
break;
|
||||
|
||||
case GOODIX_VERIFY_PWR_BTN_SHIELD_OFF:
|
||||
goodix_sensor_cmd (self, MOC_CMD0_PWR_BTN_SHIELD, MOC_CMD1_PWR_BTN_SHIELD_OFF,
|
||||
false,
|
||||
@@ -731,7 +771,7 @@ fp_enroll_update_cb (FpiDeviceGoodixMoc *self,
|
||||
NULL,
|
||||
fpi_device_retry_new (FP_DEVICE_RETRY_REMOVE_FINGER));
|
||||
}
|
||||
else if (resp->enroll_update.rollback)
|
||||
else if (resp->enroll_update.rollback || resp->result == 0x73)
|
||||
{
|
||||
fpi_device_enroll_progress (FP_DEVICE (self),
|
||||
self->enroll_stage,
|
||||
@@ -930,7 +970,7 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
||||
user_id_len = MIN (100, user_id_len);
|
||||
finger = 1;
|
||||
|
||||
if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") == 0)
|
||||
if (fpi_device_emulation_mode_enabled (FP_DEVICE (self)))
|
||||
memset (self->template_id, 0, TEMPLATE_ID_SIZE);
|
||||
uid = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE,
|
||||
user_id,
|
||||
@@ -1350,7 +1390,7 @@ gx_fp_probe (FpDevice *device)
|
||||
if (!g_usb_device_claim_interface (usb_dev, 0, 0, &error))
|
||||
goto err_close;
|
||||
|
||||
if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") == 0)
|
||||
if (fpi_device_emulation_mode_enabled (FP_DEVICE (self)))
|
||||
{
|
||||
|
||||
serial = g_strdup ("emulated-device");
|
||||
@@ -1377,6 +1417,7 @@ gx_fp_probe (FpDevice *device)
|
||||
case 0x60A2:
|
||||
case 0x60A4:
|
||||
case 0x6014:
|
||||
case 0x6090:
|
||||
case 0x6092:
|
||||
case 0x6094:
|
||||
case 0x609A:
|
||||
@@ -1397,6 +1438,8 @@ gx_fp_probe (FpDevice *device)
|
||||
case 0x6582:
|
||||
case 0x6A94:
|
||||
case 0x659A:
|
||||
case 0x6890:
|
||||
case 0x6984:
|
||||
self->max_enroll_stage = 12;
|
||||
break;
|
||||
|
||||
@@ -1626,6 +1669,7 @@ fpi_device_goodixmoc_init (FpiDeviceGoodixMoc *self)
|
||||
static const FpIdEntry id_table[] = {
|
||||
{ .vid = 0x27c6, .pid = 0x5840, },
|
||||
{ .vid = 0x27c6, .pid = 0x6014, },
|
||||
{ .vid = 0x27c6, .pid = 0x6090, },
|
||||
{ .vid = 0x27c6, .pid = 0x6092, },
|
||||
{ .vid = 0x27c6, .pid = 0x6094, },
|
||||
{ .vid = 0x27c6, .pid = 0x609A, },
|
||||
@@ -1655,8 +1699,10 @@ static const FpIdEntry id_table[] = {
|
||||
{ .vid = 0x27c6, .pid = 0x659C, },
|
||||
{ .vid = 0x27c6, .pid = 0x6A94, },
|
||||
{ .vid = 0x27c6, .pid = 0x6512, },
|
||||
{ .vid = 0x27c6, .pid = 0x6890, },
|
||||
{ .vid = 0x27c6, .pid = 0x689A, },
|
||||
{ .vid = 0x27c6, .pid = 0x66A9, },
|
||||
{ .vid = 0x27c6, .pid = 0x6984, },
|
||||
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
||||
};
|
||||
|
||||
|
||||
@@ -58,6 +58,7 @@ typedef enum {
|
||||
GOODIX_VERIFY_PWR_BTN_SHIELD_ON = 0,
|
||||
GOODIX_VERIFY_CAPTURE,
|
||||
GOODIX_VERIFY_IDENTIFY,
|
||||
GOODIX_VERIFY_WAIT_FINGER_UP,
|
||||
GOODIX_VERIFY_PWR_BTN_SHIELD_OFF,
|
||||
GOODIX_VERIFY_NUM_STATES,
|
||||
} GoodixVerifyState;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,261 @@
|
||||
#pragma once
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <glib.h>
|
||||
#include <math.h>
|
||||
#include "fpi-device.h"
|
||||
#include "fpi-ssm.h"
|
||||
#include "pwd.h"
|
||||
#include <sys/utsname.h>
|
||||
|
||||
G_DECLARE_FINAL_TYPE (FpiDeviceMafpmoc, fpi_device_mafpmoc, FPI, DEVICE_MAFPMOC, FpDevice)
|
||||
|
||||
#define PRINT_CMD 0
|
||||
#define PRINT_SSM_DEBUG 0
|
||||
|
||||
#define MAFP_INTERFACE_CLASS G_USB_DEVICE_CLASS_VENDOR_SPECIFIC
|
||||
#define MAFP_INTERFACE_SUB_CLASS 0x01
|
||||
#define MAFP_INTERFACE_PROTOCOL 0x01
|
||||
|
||||
/* Usb port setting */
|
||||
#define MAFP_EP_BULK_OUT 0x03
|
||||
#define MAFP_EP_BULK_IN 0x83
|
||||
#define MAFP_EP_INT_IN 0x82
|
||||
|
||||
/* Command transfer timeout: ms */
|
||||
#define CMD_TIMEOUT 5000
|
||||
#define DATA_TIMEOUT 5000
|
||||
#define CTRL_TIMEOUT 200
|
||||
|
||||
#define MAFP_USB_BUFFER_SIZE 512
|
||||
#define PACKAGE_CRC_SIZE 2
|
||||
#define PACKAGE_HEADER_SIZE 9
|
||||
#define PACKAGE_DATA_SIZE_MAX (MAFP_USB_BUFFER_SIZE - PACKAGE_HEADER_SIZE - PACKAGE_CRC_SIZE)
|
||||
|
||||
#define TEMPLATE_ID_SIZE 2
|
||||
#define TEMPLATE_UID_SIZE 128
|
||||
#define DEVICE_SN_SIZE 32
|
||||
#define MAX_FINGER_NUM 10
|
||||
#define MAX_USER_NUM 3
|
||||
#define MAX_NOTEPAD_PAGE 16
|
||||
|
||||
#define MOC_CMD_GET_IMAGE 0x01
|
||||
#define MOC_CMD_GEN_FEATURE 0x02
|
||||
#define MOC_CMD_SEARCH 0x04
|
||||
#define MOC_CMD_GEN_TEMPLATE 0x05
|
||||
#define MOC_CMD_SAVE_TEMPLATE 0x06
|
||||
#define MOC_CMD_READ_TEMPLATE 0x07
|
||||
#define MOC_CMD_DELETE_TEMPLATE 0x0C
|
||||
#define MOC_CMD_EMPTY 0x0D
|
||||
#define MOC_CMD_WRITE_NOTEPAD 0x18
|
||||
#define MOC_CMD_READ_NOTEPAD 0x19
|
||||
#define MOC_CMD_GET_TEMPLATE_NUM 0x1D
|
||||
#define MOC_CMD_GET_TEMPLATE_TABLE 0x1F
|
||||
#define MOC_CMD_CANCEL 0x30
|
||||
#define MOC_CMD_SLEEP 0x33
|
||||
#define MOC_CMD_HANDSHAKE 0x35
|
||||
#define MOC_CMD_CALIBRATE 0x36
|
||||
#define MOC_CMD_FACTORY_RESET 0x3B
|
||||
#define MOC_CMD_FACTORY_TEST 0x56
|
||||
#define MOC_CMD_MATCH_WITHFID 0x66
|
||||
#define MOC_CMD_GET_MAX_ID 0x6d
|
||||
#define MOC_CMD_DUPAREA_TEST 0x6f
|
||||
#define MOC_CMD_SAVE_TEMPLATE_INFO 0x86
|
||||
#define MOC_CMD_GET_TEMPLATE_INFO 0x87
|
||||
#define MOC_CMD_GET_INIT_STATUS 0x88
|
||||
|
||||
#define MAFP_SUCCESS 0
|
||||
#define MAFP_RE_TPL_NUM_OVERSIZE 0x0B
|
||||
#define MAFP_RE_GET_IMAGE_SUCCESS 0x00
|
||||
#define MAFP_RE_GET_IMAGE_NONE 0x02
|
||||
/* calibrate error (un-calibrate or calibrate failed) */
|
||||
#define MAFP_RE_CALIBRATE_ERROR 0x02
|
||||
|
||||
#define MAFP_HANDSHAKE_CODE1 'M'
|
||||
#define MAFP_HANDSHAKE_CODE2 'A'
|
||||
|
||||
/* Default enroll stages number */
|
||||
#define DEFAULT_ENROLL_SAMPLES 12
|
||||
#define MAFP_ENV_ENROLL_SAMPLES "MAFP_ENROLL_SAMPLES"
|
||||
|
||||
#define MAFP_ENROLL_IDENTIFY_DISABLED 0
|
||||
#define MAFP_ENROLL_IDENTIFY_ENABLED 1
|
||||
#define MAFP_ENROLL_IDENTIFY_ONCE 2
|
||||
#define MAFP_ENROLL_DUPLICATE_DELETE_DISABLED 0
|
||||
#define MAFP_ENROLL_DUPLICATE_DELETE_ENABLED 1
|
||||
#define MAFP_ENROLL_DUPLICATE_AREA_DENY 0
|
||||
#define MAFP_ENROLL_DUPLICATE_AREA_ALLOW 1
|
||||
|
||||
#define MAFP_SLEEP_INT_WAIT 0
|
||||
#define MAFP_SLEEP_INT_CHECK 1
|
||||
#define MAFP_SLEEP_INT_REFRESH 2
|
||||
|
||||
#define MAFP_PRESS_WAIT_UP 0
|
||||
#define MAFP_PRESS_WAIT_DOWN 1
|
||||
|
||||
#define MAFP_IMAGE_ERR_TRRIGER 30
|
||||
|
||||
typedef enum {
|
||||
MAPF_CMD_SEND = 0,
|
||||
MAPF_CMD_RECEIVE,
|
||||
MAPF_CMD_DATA_RECEIVE,
|
||||
MAPF_CMD_TRANSFER_STATES,
|
||||
} MapfCmdState;
|
||||
|
||||
typedef enum {
|
||||
MAPF_INIT_CLEAN_EPIN = 0,
|
||||
MAPF_INIT_CLEAN_EPOUT,
|
||||
MAPF_INIT_CLEAN_EPIN2,
|
||||
MAPF_INIT_HANDSHAKE,
|
||||
MAPF_INIT_MODULE_STATUS,
|
||||
MAPF_INIT_STATES,
|
||||
} MapfInitState;
|
||||
|
||||
typedef enum {
|
||||
MAFP_ENROLL_PWR_BTN_SHIELD_ON = 0,
|
||||
MAFP_ENROLL_CHECK_EMPTY,
|
||||
MAFP_ENROLL_TEMPLATE_TABLE,
|
||||
MAFP_ENROLL_READ_TEMPLATE,
|
||||
MAFP_ENROLL_VERIFY_GET_IMAGE,
|
||||
MAFP_ENROLL_CHECK_INT_PARA,
|
||||
MAFP_ENROLL_DETECT_MODE,
|
||||
MAFP_ENROLL_ENABLE_INT,
|
||||
MAFP_ENROLL_WAIT_INT,
|
||||
MAFP_ENROLL_DISBALE_INT,
|
||||
MAFP_ENROLL_REFRESH_INT_PARA,
|
||||
MAFP_ENROLL_VERIFY_GENERATE_FEATURE,
|
||||
MAFP_ENROLL_VERIFY_DUPLICATE_AREA,
|
||||
MAFP_ENROLL_VERIFY_SEARCH,
|
||||
MAFP_ENROLL_VERIFY_SEARCH_STEP, //match assigned id
|
||||
MAFP_ENROLL_GET_TEMPLATE_INFO,
|
||||
MAFP_ENROLL_SAVE_TEMPLATE_INFO,
|
||||
MAFP_ENROLL_SAVE_TEMPLATE,
|
||||
MAFP_ENROLL_DELETE_TEMPLATE_INFO_IF_FAILED,
|
||||
MAFP_ENROLL_EXIT,
|
||||
MAFP_ENROLL_STATES,
|
||||
} MapfEnrollState;
|
||||
|
||||
typedef enum {
|
||||
MAPF_VERIFY_PWR_BTN_SHIELD_ON = 0,
|
||||
MAPF_VERIFY_TEMPLATE_TABLE,
|
||||
MAPF_VERIFY_GET_STARTUP_RESULT,
|
||||
MAPF_VERIFY_GET_IMAGE,
|
||||
MAPF_VERIFY_CHECK_INT_PARA,
|
||||
MAPF_VERIFY_DETECT_MODE,
|
||||
MAPF_VERIFY_ENABLE_INT,
|
||||
MAPF_VERIFY_WAIT_INT,
|
||||
MAPF_VERIFY_DISBALE_INT,
|
||||
MAPF_VERIFY_REFRESH_INT_PARA,
|
||||
MAPF_VERIFY_GENERATE_FEATURE,
|
||||
MAPF_VERIFY_SEARCH_STEP, //match assigned id
|
||||
MAPF_VERIFY_GET_TEMPLATE_INFO,
|
||||
MAPF_VERIFY_EXIT,
|
||||
MAPF_VERIFY_STATES,
|
||||
} MapfVerifyState;
|
||||
|
||||
typedef enum {
|
||||
MAPF_LIST_TEMPLATE_TABLE = 0,
|
||||
MAPF_LIST_GET_TEMPLATE_INFO,
|
||||
MAPF_LIST_STATES,
|
||||
} MapfListState;
|
||||
|
||||
typedef enum {
|
||||
MAPF_DELETE_TEMPLATE_TABLE = 0,
|
||||
MAPF_DELETE_GET_TEMPLATE_INFO,
|
||||
MAPF_DELETE_CLEAR_TEMPLATE_INFO,
|
||||
MAPF_DELETE_TEMPLATE,
|
||||
MAPF_DELETE_STATES,
|
||||
} MapfDeleteState;
|
||||
|
||||
typedef enum {
|
||||
MAPF_EMPTY_TEMPLATE = 0,
|
||||
MAPF_EMPTY_STATES,
|
||||
} MapfDeleteAllState;
|
||||
|
||||
typedef enum {
|
||||
MAPF_PACK_CMD = 0x01, //cmd packet
|
||||
MAPF_PACK_DATA = 0x02, //data packet, with more data packets later, must follow cmd or answer packet
|
||||
MAPF_PACK_ANSWER = 0x07, //answer packet for cmd packet
|
||||
MAPF_PACK_END = 0x08, //last data packet
|
||||
MAPF_PACK_DATA_ANDSWER = 0x09, //answer packet for data packet
|
||||
} MapfPackMark;
|
||||
|
||||
#pragma pack(push, 1)
|
||||
typedef struct _mafp_handshake
|
||||
{
|
||||
uint8_t code[2];
|
||||
/*uint8_t state;
|
||||
uint8_t desc[16];
|
||||
uint8_t ver[4];*/
|
||||
} mafp_handshake_t, *pmafp_handshake_t;
|
||||
|
||||
typedef struct _mafp_search
|
||||
{
|
||||
uint8_t id[2];
|
||||
uint8_t score[2];
|
||||
} mafp_search_t, *pmafp_search_t;
|
||||
|
||||
typedef struct _mafp_tpl_table
|
||||
{
|
||||
uint8_t used_num;
|
||||
uint8_t list[256];
|
||||
} mafp_tpl_table_t, *pmafp_tpl_table_t;
|
||||
|
||||
typedef struct _mafp_tpl_info
|
||||
{
|
||||
char uid[128];
|
||||
} mafp_tpl_info_t, *pmafp_tpl_info_t;
|
||||
|
||||
typedef struct _mafp_boot_handshake
|
||||
{
|
||||
char code[2];
|
||||
uint8_t state;
|
||||
char descrip[16];
|
||||
uint32_t version;
|
||||
} mafp_boot_handshake_t, *pmafp_boot_handshake_t;
|
||||
|
||||
typedef struct _mafp_template
|
||||
{
|
||||
char sn[32];
|
||||
uint16_t id;
|
||||
char uid[128];
|
||||
} mafp_template_t, *pmafp_template_t;
|
||||
#pragma pack(pop)
|
||||
|
||||
typedef struct _mafp_templates
|
||||
{
|
||||
uint16_t index;
|
||||
uint16_t total_num;
|
||||
uint16_t priv_num;
|
||||
mafp_template_t total_list[256];
|
||||
mafp_template_t priv_list[MAX_FINGER_NUM];
|
||||
GPtrArray *list;
|
||||
} mafp_templates_t, *pmafp_templates_t;
|
||||
|
||||
typedef struct _fp_cmd_response
|
||||
{
|
||||
uint8_t result;
|
||||
union
|
||||
{
|
||||
mafp_handshake_t handshake;
|
||||
mafp_search_t search;
|
||||
mafp_tpl_table_t tpl_table;
|
||||
mafp_tpl_info_t tpl_info;
|
||||
mafp_boot_handshake_t boot_handshake;
|
||||
};
|
||||
} mafp_cmd_response_t, *pmafp_cmd_response_t;
|
||||
|
||||
typedef struct _pack_header
|
||||
{
|
||||
uint8_t head0;
|
||||
uint8_t head1;
|
||||
uint8_t addr0;
|
||||
uint8_t addr1;
|
||||
uint8_t addr2;
|
||||
uint8_t addr3;
|
||||
uint8_t flag;
|
||||
uint8_t frame_len0;
|
||||
uint8_t frame_len1;
|
||||
} pack_header, *ppack_header;
|
||||
@@ -30,6 +30,7 @@ static const FpIdEntry id_table[] = {
|
||||
{ .vid = 0x0bda, .pid = 0x5813, },
|
||||
{ .vid = 0x0bda, .pid = 0x5816, },
|
||||
{ .vid = 0x2541, .pid = 0xfa03, },
|
||||
{ .vid = 0x3274, .pid = 0x9003, },
|
||||
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
||||
};
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -61,6 +61,7 @@ static const FpIdEntry id_table[] = {
|
||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x019D, },
|
||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x019F, },
|
||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x01A0, },
|
||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x01A4, },
|
||||
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
||||
};
|
||||
|
||||
@@ -1210,7 +1211,7 @@ prob_msg_cb (FpiDeviceSynaptics *self,
|
||||
return;
|
||||
}
|
||||
|
||||
if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") == 0)
|
||||
if (fpi_device_emulation_mode_enabled (FP_DEVICE (self)))
|
||||
serial = g_strdup ("emulated-device");
|
||||
else
|
||||
serial = g_usb_device_get_string_descriptor (usb_dev,
|
||||
|
||||
@@ -1380,7 +1380,7 @@ dev_init (FpImageDevice *dev)
|
||||
|
||||
g_clear_pointer (&self->rand, g_rand_free);
|
||||
self->rand = g_rand_new ();
|
||||
if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") == 0)
|
||||
if (fpi_device_emulation_mode_enabled (FP_DEVICE (dev)))
|
||||
g_rand_set_seed (self->rand, 0xFACADE);
|
||||
|
||||
driver_data = fpi_device_get_driver_data (FP_DEVICE (dev));
|
||||
|
||||
@@ -119,7 +119,7 @@ async_abort_callback (FpiUsbTransfer *transfer, FpDevice *device,
|
||||
|
||||
/* In normal case endpoint is empty */
|
||||
if (g_error_matches (error, G_USB_DEVICE_ERROR, G_USB_DEVICE_ERROR_TIMED_OUT) ||
|
||||
(g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") == 0 && transfer->actual_length == 0))
|
||||
(fpi_device_emulation_mode_enabled (device) && transfer->actual_length == 0))
|
||||
{
|
||||
g_clear_error (&error);
|
||||
fpi_ssm_next_state (transfer->ssm);
|
||||
|
||||
@@ -77,6 +77,7 @@ dev_identify (FpDevice *dev)
|
||||
&idx))
|
||||
{
|
||||
match = g_ptr_array_index (prints, idx);
|
||||
fp_print_set_finger (new_scan, fp_print_get_finger (match));
|
||||
}
|
||||
|
||||
if (!self->match_reported)
|
||||
|
||||
@@ -165,11 +165,7 @@ process_cmds (FpDeviceVirtualDevice * self,
|
||||
{
|
||||
g_autofree gchar *cmd = NULL;
|
||||
|
||||
/* TODO: g_ptr_array_steal_index requires GLib 2.58, we depend on 2.56 */
|
||||
cmd = g_ptr_array_index (self->pending_commands, 0);
|
||||
g_ptr_array_index (self->pending_commands, 0) = NULL;
|
||||
g_ptr_array_remove_index (self->pending_commands, 0);
|
||||
|
||||
cmd = g_ptr_array_steal_index (self->pending_commands, 0);
|
||||
g_debug ("Processing command %s", cmd);
|
||||
|
||||
/* These are always processed. */
|
||||
@@ -549,6 +545,9 @@ dev_verify (FpDevice *dev)
|
||||
else
|
||||
{
|
||||
success = fp_print_equal (print, new_scan);
|
||||
|
||||
if (success)
|
||||
fp_print_set_finger (new_scan, fp_print_get_finger (print));
|
||||
}
|
||||
|
||||
if (!self->match_reported)
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "fpi-compat.h"
|
||||
#include "fpi-enums.h"
|
||||
#include "fpi-assembling.h"
|
||||
#include "fpi-device.h"
|
||||
#include "fpi-image-device.h"
|
||||
|
||||
+77
-73
@@ -605,18 +605,16 @@ fp_print_equal (FpPrint *self, FpPrint *other)
|
||||
if (g_strcmp0 (self->device_id, other->device_id))
|
||||
return FALSE;
|
||||
|
||||
if (self->type == FPI_PRINT_RAW)
|
||||
switch (self->type)
|
||||
{
|
||||
case FPI_PRINT_RAW:
|
||||
return g_variant_equal (self->data, other->data);
|
||||
}
|
||||
else if (self->type == FPI_PRINT_NBIS)
|
||||
{
|
||||
guint i;
|
||||
|
||||
case FPI_PRINT_NBIS:
|
||||
if (self->prints->len != other->prints->len)
|
||||
return FALSE;
|
||||
|
||||
for (i = 0; i < self->prints->len; i++)
|
||||
for (guint i = 0; i < self->prints->len; i++)
|
||||
{
|
||||
struct xyt_struct *a = g_ptr_array_index (self->prints, i);
|
||||
struct xyt_struct *b = g_ptr_array_index (other->prints, i);
|
||||
@@ -626,11 +624,12 @@ fp_print_equal (FpPrint *self, FpPrint *other)
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
case FPI_PRINT_UNDEFINED:
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
|
||||
g_return_val_if_reached (FALSE);
|
||||
}
|
||||
|
||||
#define FPI_PRINT_VARIANT_TYPE G_VARIANT_TYPE ("(issbymsmsia{sv}v)")
|
||||
@@ -765,7 +764,7 @@ fp_print_deserialize (const guchar *data,
|
||||
g_autoptr(GVariant) value = NULL;
|
||||
g_autoptr(GVariant) print_data = NULL;
|
||||
g_autoptr(GDate) date = NULL;
|
||||
guchar *aligned_data = NULL;
|
||||
g_autoptr(GBytes) bytes = NULL;
|
||||
guint8 finger_int8;
|
||||
FpFinger finger;
|
||||
g_autofree gchar *username = NULL;
|
||||
@@ -787,14 +786,10 @@ fp_print_deserialize (const guchar *data,
|
||||
* of this function (meaning we don't need to keep the data around.
|
||||
*/
|
||||
|
||||
/* To support GLIB < 2.60 we need to make sure that the memory is aligned correctly.
|
||||
* We also need to copy the backing store for the raw data that we may keep for
|
||||
* longer. */
|
||||
aligned_data = g_malloc (length - 3);
|
||||
memcpy (aligned_data, data + 3, length - 3);
|
||||
raw_value = g_variant_new_from_data (FPI_PRINT_VARIANT_TYPE,
|
||||
aligned_data, length - 3,
|
||||
FALSE, g_free, aligned_data);
|
||||
/* We need to copy the backing store for the raw data that we may keep for
|
||||
* longer. Using a GBytes also ensures the data is correctly aligned. */
|
||||
bytes = g_bytes_new (data + 3, length - 3);
|
||||
raw_value = g_variant_new_from_bytes (FPI_PRINT_VARIANT_TYPE, bytes, FALSE);
|
||||
|
||||
if (!raw_value)
|
||||
goto invalid_format;
|
||||
@@ -821,72 +816,81 @@ fp_print_deserialize (const guchar *data,
|
||||
finger = finger_int8;
|
||||
|
||||
/* Assume data is valid at this point if the values are somewhat sane. */
|
||||
if (type == FPI_PRINT_NBIS)
|
||||
switch (type)
|
||||
{
|
||||
g_autoptr(GVariant) prints = g_variant_get_child_value (print_data, 0);
|
||||
guint i;
|
||||
case FPI_PRINT_NBIS:
|
||||
{
|
||||
g_autoptr(GVariant) prints = g_variant_get_child_value (print_data, 0);
|
||||
guint i;
|
||||
|
||||
result = g_object_new (FP_TYPE_PRINT,
|
||||
"driver", driver,
|
||||
"device-id", device_id,
|
||||
"device-stored", device_stored,
|
||||
NULL);
|
||||
g_object_ref_sink (result);
|
||||
fpi_print_set_type (result, FPI_PRINT_NBIS);
|
||||
for (i = 0; i < g_variant_n_children (prints); i++)
|
||||
{
|
||||
g_autofree struct xyt_struct *xyt = NULL;
|
||||
const gint32 *xcol, *ycol, *thetacol;
|
||||
gsize xlen, ylen, thetalen;
|
||||
g_autoptr(GVariant) xyt_data = NULL;
|
||||
GVariant *child;
|
||||
result = g_object_new (FP_TYPE_PRINT,
|
||||
"driver", driver,
|
||||
"device-id", device_id,
|
||||
"device-stored", device_stored,
|
||||
NULL);
|
||||
g_object_ref_sink (result);
|
||||
fpi_print_set_type (result, FPI_PRINT_NBIS);
|
||||
for (i = 0; i < g_variant_n_children (prints); i++)
|
||||
{
|
||||
g_autofree struct xyt_struct *xyt = NULL;
|
||||
const gint32 *xcol, *ycol, *thetacol;
|
||||
gsize xlen, ylen, thetalen;
|
||||
g_autoptr(GVariant) xyt_data = NULL;
|
||||
GVariant *child;
|
||||
|
||||
xyt_data = g_variant_get_child_value (prints, i);
|
||||
xyt_data = g_variant_get_child_value (prints, i);
|
||||
|
||||
child = g_variant_get_child_value (xyt_data, 0);
|
||||
xcol = g_variant_get_fixed_array (child, &xlen, sizeof (gint32));
|
||||
g_variant_unref (child);
|
||||
child = g_variant_get_child_value (xyt_data, 0);
|
||||
xcol = g_variant_get_fixed_array (child, &xlen, sizeof (gint32));
|
||||
g_variant_unref (child);
|
||||
|
||||
child = g_variant_get_child_value (xyt_data, 1);
|
||||
ycol = g_variant_get_fixed_array (child, &ylen, sizeof (gint32));
|
||||
g_variant_unref (child);
|
||||
child = g_variant_get_child_value (xyt_data, 1);
|
||||
ycol = g_variant_get_fixed_array (child, &ylen, sizeof (gint32));
|
||||
g_variant_unref (child);
|
||||
|
||||
child = g_variant_get_child_value (xyt_data, 2);
|
||||
thetacol = g_variant_get_fixed_array (child, &thetalen, sizeof (gint32));
|
||||
g_variant_unref (child);
|
||||
child = g_variant_get_child_value (xyt_data, 2);
|
||||
thetacol = g_variant_get_fixed_array (child, &thetalen, sizeof (gint32));
|
||||
g_variant_unref (child);
|
||||
|
||||
if (xlen != ylen || xlen != thetalen)
|
||||
goto invalid_format;
|
||||
if (xlen != ylen || xlen != thetalen)
|
||||
goto invalid_format;
|
||||
|
||||
if (xlen > G_N_ELEMENTS (xyt->xcol))
|
||||
goto invalid_format;
|
||||
if (xlen > G_N_ELEMENTS (xyt->xcol))
|
||||
goto invalid_format;
|
||||
|
||||
xyt = g_new0 (struct xyt_struct, 1);
|
||||
xyt->nrows = xlen;
|
||||
memcpy (xyt->xcol, xcol, sizeof (xcol[0]) * xlen);
|
||||
memcpy (xyt->ycol, ycol, sizeof (xcol[0]) * xlen);
|
||||
memcpy (xyt->thetacol, thetacol, sizeof (xcol[0]) * xlen);
|
||||
xyt = g_new0 (struct xyt_struct, 1);
|
||||
xyt->nrows = xlen;
|
||||
memcpy (xyt->xcol, xcol, sizeof (xcol[0]) * xlen);
|
||||
memcpy (xyt->ycol, ycol, sizeof (xcol[0]) * xlen);
|
||||
memcpy (xyt->thetacol, thetacol, sizeof (xcol[0]) * xlen);
|
||||
|
||||
g_ptr_array_add (result->prints, g_steal_pointer (&xyt));
|
||||
}
|
||||
}
|
||||
else if (type == FPI_PRINT_RAW)
|
||||
{
|
||||
g_autoptr(GVariant) fp_data = g_variant_get_child_value (print_data, 0);
|
||||
g_ptr_array_add (result->prints, g_steal_pointer (&xyt));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
result = g_object_new (FP_TYPE_PRINT,
|
||||
"fpi-type", type,
|
||||
"driver", driver,
|
||||
"device-id", device_id,
|
||||
"device-stored", device_stored,
|
||||
"fpi-data", fp_data,
|
||||
NULL);
|
||||
g_object_ref_sink (result);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_warning ("Invalid print type: 0x%X", type);
|
||||
goto invalid_format;
|
||||
case FPI_PRINT_RAW:
|
||||
{
|
||||
g_autoptr(GVariant) fp_data = g_variant_get_child_value (print_data, 0);
|
||||
|
||||
result = g_object_new (FP_TYPE_PRINT,
|
||||
"fpi-type", type,
|
||||
"driver", driver,
|
||||
"device-id", device_id,
|
||||
"device-stored", device_stored,
|
||||
"fpi-data", fp_data,
|
||||
NULL);
|
||||
g_object_ref_sink (result);
|
||||
}
|
||||
break;
|
||||
|
||||
case FPI_PRINT_UNDEFINED:
|
||||
{
|
||||
g_autofree char *type_str = g_enum_to_string (fpi_print_type_get_type (), type);
|
||||
g_warning ("Invalid print type: 0x%X (%s)", type, type_str);
|
||||
|
||||
goto invalid_format;
|
||||
}
|
||||
}
|
||||
|
||||
date = g_date_new_julian (julian_date);
|
||||
|
||||
@@ -65,6 +65,31 @@ fpi_byte_reader_new (const guint8 * data, guint size)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* fpi_byte_reader_new_bytes: (skip)
|
||||
* @bytes: (in) (transfer none): a #GBytes instance from which the
|
||||
* #FpiByteReader should read
|
||||
*
|
||||
* Create a new #FpiByteReader instance, which will read from @bytes.
|
||||
*
|
||||
* Free-function: fpi_byte_reader_free
|
||||
*
|
||||
* Returns: (transfer full): a new #FpiByteReader instance
|
||||
*/
|
||||
FpiByteReader *
|
||||
fpi_byte_reader_new_bytes (GBytes * bytes)
|
||||
{
|
||||
const guint8 *data;
|
||||
gsize size = 0;
|
||||
|
||||
g_return_val_if_fail (bytes != NULL, NULL);
|
||||
|
||||
data = g_bytes_get_data (bytes, &size);
|
||||
g_return_val_if_fail (size <= G_MAXUINT, NULL);
|
||||
|
||||
return fpi_byte_reader_new (data, (guint) size);
|
||||
}
|
||||
|
||||
/**
|
||||
* fpi_byte_reader_free:
|
||||
* @reader: (in) (transfer full): a #FpiByteReader instance
|
||||
@@ -100,6 +125,30 @@ fpi_byte_reader_init (FpiByteReader * reader, const guint8 * data, guint size)
|
||||
reader->byte = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* fpi_byte_reader_init_bytes:
|
||||
* @reader: a #FpiByteReader instance
|
||||
* @bytes: (in) (transfer none): a #GBytes instance from which
|
||||
* the #FpiByteReader should read
|
||||
*
|
||||
* Initializes a #FpiByteReader instance to read from @bytes. This function
|
||||
* can be called on already initialized instances.
|
||||
*/
|
||||
FpiByteReader *
|
||||
fpi_byte_reader_init_bytes (FpiByteReader * reader, GBytes * bytes)
|
||||
{
|
||||
g_return_val_if_fail (reader != NULL, NULL);
|
||||
g_return_val_if_fail (bytes != NULL, NULL);
|
||||
|
||||
gsize size = 0;
|
||||
const guint8 *data = g_bytes_get_data (bytes, &size);
|
||||
|
||||
g_return_val_if_fail (size <= G_MAXUINT, NULL);
|
||||
fpi_byte_reader_init (reader, data, (guint) size);
|
||||
|
||||
return reader;
|
||||
}
|
||||
|
||||
/**
|
||||
* fpi_byte_reader_peek_sub_reader: (skip)
|
||||
* @reader: an existing and initialized #FpiByteReader instance
|
||||
@@ -799,6 +848,41 @@ fpi_byte_reader_peek_data (const FpiByteReader * reader, guint size,
|
||||
return fpi_byte_reader_peek_data_inline (reader, size, val);
|
||||
}
|
||||
|
||||
/**
|
||||
* fpi_byte_reader_get_data_fixed:
|
||||
* @reader: a #FpiByteReader instance
|
||||
* @size: Size in bytes
|
||||
* @val: (out) (array length=size): address of a buffer to copy data into
|
||||
*
|
||||
* Copies @size bytes from the current data position into @val if at
|
||||
* least @size bytes are left, and updates the current position.
|
||||
*
|
||||
* Returns: %TRUE if successful, %FALSE otherwise.
|
||||
*/
|
||||
gboolean
|
||||
(fpi_byte_reader_get_data_static) (FpiByteReader * reader, guint size,
|
||||
const guint8 * val)
|
||||
{
|
||||
return (fpi_byte_reader_get_data_inline_static) (reader, size, val);
|
||||
}
|
||||
|
||||
/**
|
||||
* fpi_byte_reader_peek_data_fixed:
|
||||
* @reader: a #FpiByteReader instance
|
||||
* @size: Size in bytes
|
||||
* @val: (out) (array length=size): address of a buffer to copy data into
|
||||
*
|
||||
* Like fpi_byte_reader_get_data_fixed() but does not advance the position.
|
||||
*
|
||||
* Returns: %TRUE if successful, %FALSE otherwise.
|
||||
*/
|
||||
gboolean
|
||||
(fpi_byte_reader_peek_data_static) (const FpiByteReader * reader, guint size,
|
||||
guint8 * val)
|
||||
{
|
||||
return (fpi_byte_reader_peek_data_inline_static) (reader, size, val);
|
||||
}
|
||||
|
||||
/**
|
||||
* fpi_byte_reader_dup_data:
|
||||
* @reader: a #FpiByteReader instance
|
||||
|
||||
@@ -50,6 +50,7 @@ typedef struct {
|
||||
|
||||
FpiByteReader * fpi_byte_reader_new (const guint8 *data, guint size) G_GNUC_MALLOC;
|
||||
|
||||
FpiByteReader * fpi_byte_reader_new_bytes (GBytes *bytes) G_GNUC_MALLOC;
|
||||
|
||||
void fpi_byte_reader_free (FpiByteReader *reader);
|
||||
|
||||
@@ -57,6 +58,9 @@ void fpi_byte_reader_free (FpiByteReader *reader);
|
||||
void fpi_byte_reader_init (FpiByteReader *reader, const guint8 *data, guint size);
|
||||
|
||||
|
||||
FpiByteReader * fpi_byte_reader_init_bytes (FpiByteReader *reader, GBytes *bytes);
|
||||
|
||||
|
||||
gboolean fpi_byte_reader_peek_sub_reader (FpiByteReader * reader,
|
||||
FpiByteReader * sub_reader,
|
||||
guint size);
|
||||
@@ -218,8 +222,21 @@ gboolean fpi_byte_reader_dup_data (FpiByteReader * reader, guint s
|
||||
gboolean fpi_byte_reader_get_data (FpiByteReader * reader, guint size, const guint8 ** val);
|
||||
|
||||
|
||||
gboolean fpi_byte_reader_get_data_static (FpiByteReader * reader, guint size, const guint8 * val);
|
||||
|
||||
|
||||
gboolean fpi_byte_reader_peek_data (const FpiByteReader * reader, guint size, const guint8 ** val);
|
||||
|
||||
|
||||
gboolean fpi_byte_reader_peek_data_static (const FpiByteReader * reader, guint size, guint8 * val);
|
||||
|
||||
|
||||
GBytes * fpi_byte_reader_get_bytes (FpiByteReader *reader, guint size);
|
||||
|
||||
|
||||
GBytes * fpi_byte_reader_peek_bytes (const FpiByteReader *reader, guint size);
|
||||
|
||||
|
||||
#define fpi_byte_reader_dup_string(reader,str) \
|
||||
fpi_byte_reader_dup_string_utf8(reader,str)
|
||||
|
||||
@@ -642,6 +659,60 @@ fpi_byte_reader_peek_data_inline (const FpiByteReader * reader, guint size, cons
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static inline GBytes *
|
||||
fpi_byte_reader_peek_bytes_inline (const FpiByteReader *reader, guint size)
|
||||
{
|
||||
const guint8 *data;
|
||||
|
||||
g_return_val_if_fail (reader != NULL, NULL);
|
||||
|
||||
if (G_UNLIKELY (size > reader->size || fpi_byte_reader_get_remaining_unchecked (reader) < size))
|
||||
return NULL;
|
||||
|
||||
data = fpi_byte_reader_peek_data_unchecked (reader);
|
||||
return g_bytes_new_static (data, size);
|
||||
}
|
||||
|
||||
static inline GBytes *
|
||||
fpi_byte_reader_get_bytes_inline (FpiByteReader *reader, guint size)
|
||||
{
|
||||
const guint8 *data;
|
||||
|
||||
g_return_val_if_fail (reader != NULL, NULL);
|
||||
|
||||
if (G_UNLIKELY (size > reader->size || fpi_byte_reader_get_remaining_unchecked (reader) < size))
|
||||
return NULL;
|
||||
|
||||
data = fpi_byte_reader_get_data_unchecked (reader, size);
|
||||
return g_bytes_new_static (data, size);
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
(fpi_byte_reader_get_data_inline_static) (FpiByteReader * reader, guint size, const guint8 * val)
|
||||
{
|
||||
g_return_val_if_fail (reader != NULL, FALSE);
|
||||
g_return_val_if_fail (val != NULL, FALSE);
|
||||
|
||||
if (G_UNLIKELY (size > reader->size || fpi_byte_reader_get_remaining_unchecked (reader) < size))
|
||||
return FALSE;
|
||||
|
||||
memcpy ((void *) val, fpi_byte_reader_get_data_unchecked (reader, size), size);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
(fpi_byte_reader_peek_data_inline_static) (const FpiByteReader * reader, guint size, guint8 * val)
|
||||
{
|
||||
g_return_val_if_fail (reader != NULL, FALSE);
|
||||
g_return_val_if_fail (val != NULL, FALSE);
|
||||
|
||||
if (G_UNLIKELY (size > reader->size || fpi_byte_reader_get_remaining_unchecked (reader) < size))
|
||||
return FALSE;
|
||||
|
||||
memcpy (val, fpi_byte_reader_peek_data_unchecked (reader), size);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static inline guint
|
||||
fpi_byte_reader_get_pos_inline (const FpiByteReader * reader)
|
||||
{
|
||||
@@ -672,6 +743,35 @@ fpi_byte_reader_skip_inline (FpiByteReader * reader, guint nbytes)
|
||||
G_LIKELY(fpi_byte_reader_peek_data_inline(reader,size,val))
|
||||
#define fpi_byte_reader_skip(reader,nbytes) \
|
||||
G_LIKELY(fpi_byte_reader_skip_inline(reader,nbytes))
|
||||
#define fpi_byte_reader_get_bytes(reader,size) \
|
||||
fpi_byte_reader_get_bytes_inline(reader,size)
|
||||
#define fpi_byte_reader_peek_bytes(reader,size) \
|
||||
fpi_byte_reader_peek_bytes_inline(reader,size)
|
||||
|
||||
/**
|
||||
* fpi_byte_reader_get_data_static:
|
||||
* @reader: a #FpiByteReader
|
||||
* @val: fixed-size array (e.g. `uint8_t buf[32]`)
|
||||
*
|
||||
* Reads @size bytes from @reader directly into @val, where @size is
|
||||
* deduced via `sizeof()` - only safe with true C arrays.
|
||||
*
|
||||
* Returns: %TRUE on success, %FALSE otherwise.
|
||||
*/
|
||||
#define fpi_byte_reader_get_data_static(reader,val) \
|
||||
(fpi_byte_reader_get_data_static) (reader,sizeof(val),val)
|
||||
|
||||
/**
|
||||
* fpi_byte_reader_peek_data_static:
|
||||
* @reader: a #FpiByteReader
|
||||
* @val: fixed-size array (e.g. `uint8_t buf[32]`)
|
||||
*
|
||||
* Like fpi_byte_reader_get_data_static() but does not advance the position.
|
||||
*
|
||||
* Returns: %TRUE on success, %FALSE otherwise.
|
||||
*/
|
||||
#define fpi_byte_reader_peek_data_static(reader,val) \
|
||||
(fpi_byte_reader_peek_data_static) (reader,sizeof(val),val)
|
||||
|
||||
#endif /* FPI_BYTE_READER_DISABLE_INLINES */
|
||||
|
||||
|
||||
@@ -219,6 +219,36 @@ fpi_byte_writer_reset_and_get_data (FpiByteWriter * writer)
|
||||
return data;
|
||||
}
|
||||
|
||||
/**
|
||||
* fpi_byte_writer_reset_and_get_bytes:
|
||||
* @writer: #FpiByteWriter instance
|
||||
*
|
||||
* Resets @writer and returns the current data as a #GBytes.
|
||||
*
|
||||
* Returns: (transfer full): the current data as a #GBytes.
|
||||
*/
|
||||
GBytes *
|
||||
fpi_byte_writer_reset_and_get_bytes (FpiByteWriter * writer)
|
||||
{
|
||||
GBytes *bytes;
|
||||
|
||||
g_return_val_if_fail (writer != NULL, NULL);
|
||||
|
||||
if (!writer->owned)
|
||||
{
|
||||
bytes = g_bytes_new (g_steal_pointer (&writer->parent.data),
|
||||
writer->parent.size);
|
||||
}
|
||||
else
|
||||
{
|
||||
bytes = g_bytes_new_take ((gpointer) g_steal_pointer (&writer->parent.data),
|
||||
writer->parent.size);
|
||||
}
|
||||
|
||||
fpi_byte_writer_reset (writer);
|
||||
return g_steal_pointer (&bytes);
|
||||
}
|
||||
|
||||
/**
|
||||
* fpi_byte_writer_free:
|
||||
* @writer: (in) (transfer full): #FpiByteWriter instance
|
||||
@@ -602,6 +632,15 @@ CREATE_WRITE_STRING_FUNC (32, guint32);
|
||||
*
|
||||
* Returns: %TRUE if the value could be written
|
||||
*/
|
||||
/**
|
||||
* fpi_byte_writer_put_bytes:
|
||||
* @writer: #FpiByteWriter instance
|
||||
* @bytes: (transfer none): Data to write
|
||||
*
|
||||
* Writes the contents of @bytes to @writer.
|
||||
*
|
||||
* Returns: %TRUE if the value could be written
|
||||
*/
|
||||
/**
|
||||
* fpi_byte_writer_fill:
|
||||
* @writer: #FpiByteWriter instance
|
||||
|
||||
@@ -77,6 +77,9 @@ void fpi_byte_writer_reset (FpiByteWriter *writer);
|
||||
|
||||
guint8 * fpi_byte_writer_reset_and_get_data (FpiByteWriter *writer);
|
||||
|
||||
|
||||
GBytes * fpi_byte_writer_reset_and_get_bytes (FpiByteWriter *writer);
|
||||
|
||||
/**
|
||||
* fpi_byte_writer_get_pos:
|
||||
* @writer: #FpiByteWriter instance
|
||||
@@ -204,6 +207,9 @@ gboolean fpi_byte_writer_put_float64_le (FpiByteWriter *writer, gdoubl
|
||||
gboolean fpi_byte_writer_put_data (FpiByteWriter *writer, const guint8 *data, guint size);
|
||||
|
||||
|
||||
gboolean fpi_byte_writer_put_bytes (FpiByteWriter *writer, const GBytes *bytes);
|
||||
|
||||
|
||||
gboolean fpi_byte_writer_fill (FpiByteWriter *writer, guint8 value, guint size);
|
||||
|
||||
|
||||
@@ -338,6 +344,18 @@ fpi_byte_writer_put_data_inline (FpiByteWriter * writer, const guint8 * data,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
fpi_byte_writer_put_bytes_inline (FpiByteWriter * writer, const GBytes * bytes)
|
||||
{
|
||||
g_return_val_if_fail (writer != NULL, FALSE);
|
||||
g_return_val_if_fail (bytes != NULL, FALSE);
|
||||
const guint8 *data;
|
||||
gsize size;
|
||||
|
||||
data = g_bytes_get_data ((GBytes *) bytes, &size);
|
||||
return fpi_byte_writer_put_data_inline (writer, data, size);
|
||||
}
|
||||
|
||||
static inline void
|
||||
fpi_byte_writer_fill_unchecked (FpiByteWriter * writer, guint8 value, guint size)
|
||||
{
|
||||
@@ -413,6 +431,10 @@ fpi_byte_writer_fill_inline (FpiByteWriter * writer, guint8 value, guint size)
|
||||
|
||||
#define fpi_byte_writer_put_data(writer, data, size) \
|
||||
G_LIKELY (fpi_byte_writer_put_data_inline (writer, data, size))
|
||||
#define fpi_byte_writer_put_data_static(writer, data) \
|
||||
G_LIKELY (fpi_byte_writer_put_data_inline (writer, data, sizeof (data)))
|
||||
#define fpi_byte_writer_put_bytes(writer, bytes) \
|
||||
G_LIKELY (fpi_byte_writer_put_bytes_inline (writer, bytes))
|
||||
#define fpi_byte_writer_fill(writer, val, size) \
|
||||
G_LIKELY (fpi_byte_writer_fill_inline (writer, val, size))
|
||||
|
||||
|
||||
+59
-1
@@ -22,10 +22,12 @@
|
||||
#include <math.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <gmodule.h>
|
||||
|
||||
#include "fpi-log.h"
|
||||
|
||||
#include "fp-device-private.h"
|
||||
#include "tests/fpi-test-emulation.h"
|
||||
|
||||
/**
|
||||
* SECTION: fpi-device
|
||||
@@ -50,8 +52,64 @@ fp_device_get_instance_private (FpDevice *self)
|
||||
g_type_class_get_instance_private_offset (dev_class));
|
||||
}
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (GModule, g_module_close)
|
||||
|
||||
/**
|
||||
* fpi_device_emulation_mode_enabled:
|
||||
* @device: The #FpDevice to check
|
||||
*
|
||||
* Checks if the device is running in emulation mode, which is enabled by
|
||||
* setting the FP_DEVICE_EMULATION environment variable to a '1' value but
|
||||
* only when the test emulation library is loaded.
|
||||
* This is used by some drivers to enable special behavior for testing
|
||||
* and development purposes.
|
||||
*/
|
||||
gboolean
|
||||
(fpi_device_emulation_mode_enabled) (FpDevice *device)
|
||||
{
|
||||
static gboolean (*real_fn)(FpDevice *) = NULL;
|
||||
static gsize emulation_mode = 0;
|
||||
|
||||
if (g_once_init_enter (&emulation_mode))
|
||||
{
|
||||
if (g_strcmp0 (g_getenv (FPI_EMULATION_ENV_VAR), "1") == 0)
|
||||
{
|
||||
const char *dirs[] = {
|
||||
FPI_EMULATION_HELPER_BUILDDIR,
|
||||
FPI_EMULATION_HELPER_INSTALLDIR,
|
||||
};
|
||||
|
||||
for (size_t i = 0; i < G_N_ELEMENTS (dirs); ++i)
|
||||
{
|
||||
g_autofree char *path = NULL;
|
||||
g_autoptr(GModule) mod = NULL;
|
||||
gpointer sym;
|
||||
|
||||
path = g_build_filename (dirs[i], FPI_EMULATION_HELPER_MODULE, NULL);
|
||||
if (!(mod = g_module_open (path, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL)))
|
||||
continue;
|
||||
|
||||
if (!g_module_symbol (mod, "fpi_device_emulation_mode_enabled", &sym))
|
||||
continue;
|
||||
|
||||
real_fn = (gboolean (*)(FpDevice *)) sym;
|
||||
g_steal_pointer (&mod);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
g_once_init_leave (&emulation_mode, real_fn ? TRUE : G_MAXSIZE);
|
||||
}
|
||||
|
||||
if (real_fn)
|
||||
return real_fn (device);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* fpi_device_class_auto_initialize_features:
|
||||
* @device_class: An #FpDeviceClass to initialize
|
||||
*
|
||||
* Initializes the #FpDeviceClass @features flags checking what device vfuncs
|
||||
* are implemented.
|
||||
@@ -1796,7 +1854,7 @@ fpi_device_suspend_completed (FpDevice *device)
|
||||
* current action will be cancelled before the error is forwarded to the
|
||||
* application.
|
||||
*
|
||||
* It is recommended to set @error to #FP_ERROR_NOT_IMPLEMENTED.
|
||||
* It is recommended to set @error to #FP_DEVICE_ERROR_NOT_SUPPORTED.
|
||||
*/
|
||||
void
|
||||
fpi_device_suspend_complete (FpDevice *device,
|
||||
|
||||
@@ -38,6 +38,13 @@ typedef enum {
|
||||
|
||||
/**
|
||||
* FpIdEntry:
|
||||
* @pid: The USB product ID (for USB devices)
|
||||
* @vid: The USB vendor ID (for USB devices)
|
||||
* @virtual_envvar: Environment variable name (for virtual devices)
|
||||
* @driver_data: Optional driver-specific data, defaults to 0
|
||||
* @udev_types: Subtypes for udev-based devices
|
||||
* @spi_acpi_id: ACPI ID (for SPI devices)
|
||||
* @hid_id: HID device identifier (for HID devices)
|
||||
*
|
||||
* An entry in the table of supported hardware. For USB devices, the product ID
|
||||
* and vendor ID should be provided. The optional @driver_data field defaults
|
||||
@@ -325,4 +332,11 @@ gboolean fpi_device_report_finger_status_changes (FpDevice *device,
|
||||
FpFingerStatusFlags added_status,
|
||||
FpFingerStatusFlags removed_status);
|
||||
|
||||
/* Debugging utilities */
|
||||
|
||||
#define fpi_device_emulation_mode_enabled(dev) \
|
||||
G_UNLIKELY ((fpi_device_emulation_mode_enabled) ((dev)))
|
||||
|
||||
gboolean (fpi_device_emulation_mode_enabled) (FpDevice *device);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
* @FPI_IMAGE_V_FLIPPED: the image is vertically flipped
|
||||
* @FPI_IMAGE_H_FLIPPED: the image is horizontally flipped
|
||||
* @FPI_IMAGE_COLORS_INVERTED: the colours are inverted
|
||||
* @FPI_IMAGE_PARTIAL: the image is a partial scan
|
||||
*
|
||||
* Flags used in an #FpImage structure to describe the contained image.
|
||||
* This is useful for image drivers as they can simply set these flags and
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
/*
|
||||
* FpiLog - Internal logging functions
|
||||
* Copyright (C) 2020 Benjamin Berg <bberg@redhat.com>
|
||||
* Copyright (C) 2025 Joshua Grisham <josh@joshuagrisham.com>
|
||||
* Copyright (C) 2026 Marco Trevisan (Treviño) <mail@3v1n0.net>
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include "fpi-log.h"
|
||||
|
||||
/**
|
||||
* fpi_log_is_debug_transfer_enabled:
|
||||
*
|
||||
* Checks if the %FP_DEBUG_TRANSFER environment variable is set.
|
||||
*
|
||||
* Returns: %TRUE if %FP_DEBUG_TRANSFER is set, %FALSE otherwise
|
||||
*/
|
||||
gboolean
|
||||
fpi_log_is_debug_transfer_enabled (void)
|
||||
{
|
||||
static gsize debug_transfer_enabled = 0;
|
||||
|
||||
if (g_once_init_enter (&debug_transfer_enabled))
|
||||
{
|
||||
gsize enabled = g_getenv ("FP_DEBUG_TRANSFER") != NULL ? TRUE : G_MAXSIZE;
|
||||
g_once_init_leave (&debug_transfer_enabled, enabled);
|
||||
}
|
||||
|
||||
return debug_transfer_enabled == TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* fpi_dbg_hex_dump_data:
|
||||
* @buf: Bytes buffer to dump
|
||||
* @len: Length of @buf to dump
|
||||
*
|
||||
* Prints hex dump of @buf to fp_dbg()
|
||||
*/
|
||||
void
|
||||
(fpi_dbg_hex_dump_data) (const gchar *log_domain,
|
||||
const guint8 *buf,
|
||||
gsize len)
|
||||
{
|
||||
g_autoptr(GString) line = NULL;
|
||||
|
||||
if (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, log_domain))
|
||||
return;
|
||||
|
||||
if (G_UNLIKELY (len == 0 || !buf))
|
||||
return;
|
||||
|
||||
line = g_string_new ("");
|
||||
|
||||
for (gint i = 0; i < len; i++)
|
||||
g_string_append_printf (line, "%02x", buf[i]);
|
||||
|
||||
if (line->len)
|
||||
g_log (log_domain, G_LOG_LEVEL_DEBUG, "%s", line->str);
|
||||
}
|
||||
|
||||
/**
|
||||
* fpi_dbg_hex_dump_bytes:
|
||||
* @bytes: #GBytes to dump
|
||||
*
|
||||
* Prints hex dump of @bytes to fp_dbg()
|
||||
*/
|
||||
void
|
||||
(fpi_dbg_hex_dump_bytes) (const gchar *log_domain,
|
||||
GBytes *bytes)
|
||||
{
|
||||
gsize length = 0;
|
||||
const guint8 *data = g_bytes_get_data (bytes, &length);
|
||||
|
||||
(fpi_dbg_hex_dump_data) (log_domain, data, length);
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
/*
|
||||
* Copyright (C) 2007-2008 Daniel Drake <dsd@gentoo.org>
|
||||
* Copyright (C) 2018 Bastien Nocera <hadess@hadess.net>
|
||||
* Copyright (C) 2026 Marco Trevisan (Treviño) <mail@3v1n0.net>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@@ -96,3 +97,32 @@
|
||||
* Same as BUG_ON() but is always true.
|
||||
*/
|
||||
#define BUG() BUG_ON (1)
|
||||
|
||||
void (fpi_dbg_hex_dump_data) (const gchar *log_domain,
|
||||
const guint8 *buf,
|
||||
gsize len);
|
||||
|
||||
/**
|
||||
* fp_dbg_hex_dump_data:
|
||||
* @buf: Bytes buffer to dump
|
||||
* @len: Length of @buf to dump
|
||||
*
|
||||
* Prints hex dump of @buf to fp_dbg()
|
||||
*/
|
||||
#define fp_dbg_hex_dump_data(buf, len) \
|
||||
(fpi_dbg_hex_dump_data) (G_LOG_DOMAIN, (buf), (len))
|
||||
|
||||
void (fpi_dbg_hex_dump_bytes) (const gchar *log_domain,
|
||||
GBytes *bytes);
|
||||
|
||||
/**
|
||||
* fp_dbg_hex_dump_bytes:
|
||||
* @bytes: #GBytes to dump
|
||||
*
|
||||
* Prints hex dump of @bytes to fp_dbg()
|
||||
*/
|
||||
#define fp_dbg_hex_dump_bytes(bytes) \
|
||||
(fpi_dbg_hex_dump_bytes) \
|
||||
(G_LOG_DOMAIN, (bytes))
|
||||
|
||||
gboolean fpi_log_is_debug_transfer_enabled (void);
|
||||
|
||||
@@ -196,7 +196,7 @@ fpi_print_add_from_image (FpPrint *print,
|
||||
|
||||
/**
|
||||
* fpi_print_bz3_match:
|
||||
* @template: A #FpPrint containing one or more prints
|
||||
* @print_template: A #FpPrint containing one or more prints
|
||||
* @print: A newly scanned #FpPrint to test
|
||||
* @bz3_threshold: The BZ3 match threshold
|
||||
* @error: Return location for error
|
||||
@@ -210,14 +210,17 @@ fpi_print_add_from_image (FpPrint *print,
|
||||
* Returns: Whether the prints match, @error will be set if #FPI_MATCH_ERROR is returned
|
||||
*/
|
||||
FpiMatchResult
|
||||
fpi_print_bz3_match (FpPrint *template, FpPrint *print, gint bz3_threshold, GError **error)
|
||||
fpi_print_bz3_match (FpPrint *print_template,
|
||||
FpPrint *print,
|
||||
gint bz3_threshold,
|
||||
GError **error)
|
||||
{
|
||||
struct xyt_struct *pstruct;
|
||||
gint probe_len;
|
||||
gint i;
|
||||
|
||||
/* XXX: Use a different error type? */
|
||||
if (template->type != FPI_PRINT_NBIS || print->type != FPI_PRINT_NBIS)
|
||||
if (print_template->type != FPI_PRINT_NBIS || print->type != FPI_PRINT_NBIS)
|
||||
{
|
||||
*error = fpi_device_error_new_msg (FP_DEVICE_ERROR_NOT_SUPPORTED,
|
||||
"It is only possible to match NBIS type print data");
|
||||
@@ -234,11 +237,11 @@ fpi_print_bz3_match (FpPrint *template, FpPrint *print, gint bz3_threshold, GErr
|
||||
pstruct = g_ptr_array_index (print->prints, 0);
|
||||
probe_len = bozorth_probe_init (pstruct);
|
||||
|
||||
for (i = 0; i < template->prints->len; i++)
|
||||
for (i = 0; i < print_template->prints->len; i++)
|
||||
{
|
||||
struct xyt_struct *gstruct;
|
||||
gint score;
|
||||
gstruct = g_ptr_array_index (template->prints, i);
|
||||
gstruct = g_ptr_array_index (print_template->prints, i);
|
||||
score = bozorth_to_gallery (probe_len, pstruct, gstruct);
|
||||
fp_dbg ("score %d/%d", score, bz3_threshold);
|
||||
|
||||
@@ -292,7 +295,7 @@ fpi_print_generate_user_id (FpPrint *print)
|
||||
if (!username)
|
||||
username = "nobody";
|
||||
|
||||
if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") == 0)
|
||||
if (fpi_device_emulation_mode_enabled (NULL))
|
||||
rand_id = 0;
|
||||
else
|
||||
rand_id = g_random_int ();
|
||||
|
||||
@@ -42,7 +42,7 @@ gboolean fpi_print_add_from_image (FpPrint *print,
|
||||
FpImage *image,
|
||||
GError **error);
|
||||
|
||||
FpiMatchResult fpi_print_bz3_match (FpPrint *temp,
|
||||
FpiMatchResult fpi_print_bz3_match (FpPrint *print_template,
|
||||
FpPrint *print,
|
||||
gint bz3_threshold,
|
||||
GError **error);
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
*/
|
||||
|
||||
#include "fpi-spi-transfer.h"
|
||||
#include "fpi-log.h"
|
||||
#include <sys/ioctl.h>
|
||||
#include <linux/spi/spidev.h>
|
||||
#include <errno.h>
|
||||
@@ -41,38 +42,17 @@ static gsize block_size = 0;
|
||||
* Drivers should always use this API rather than calling read/write/ioctl on
|
||||
* the spidev device.
|
||||
*
|
||||
* Setting G_MESSAGES_DEBUG and FP_DEBUG_TRANSFER will result in the message
|
||||
* Setting %G_MESSAGES_DEBUG and %FP_DEBUG_TRANSFER will result in the message
|
||||
* content to be dumped.
|
||||
*/
|
||||
|
||||
|
||||
G_DEFINE_BOXED_TYPE (FpiSpiTransfer, fpi_spi_transfer, fpi_spi_transfer_ref, fpi_spi_transfer_unref)
|
||||
|
||||
static void
|
||||
dump_buffer (guchar *buf, gssize dump_len)
|
||||
{
|
||||
g_autoptr(GString) line = NULL;
|
||||
|
||||
line = g_string_new ("");
|
||||
/* Dump the buffer. */
|
||||
for (gssize i = 0; i < dump_len; i++)
|
||||
{
|
||||
g_string_append_printf (line, "%02x ", buf[i]);
|
||||
if ((i + 1) % 16 == 0)
|
||||
{
|
||||
g_debug ("%s", line->str);
|
||||
g_string_set_size (line, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (line->len)
|
||||
g_debug ("%s", line->str);
|
||||
}
|
||||
|
||||
static void
|
||||
log_transfer (FpiSpiTransfer *transfer, gboolean submit, GError *error)
|
||||
{
|
||||
if (g_getenv ("FP_DEBUG_TRANSFER"))
|
||||
if (fpi_log_is_debug_transfer_enabled ())
|
||||
{
|
||||
if (submit)
|
||||
{
|
||||
@@ -82,7 +62,7 @@ log_transfer (FpiSpiTransfer *transfer, gboolean submit, GError *error)
|
||||
transfer->length_rd);
|
||||
|
||||
if (transfer->buffer_wr)
|
||||
dump_buffer (transfer->buffer_wr, transfer->length_wr);
|
||||
fp_dbg_hex_dump_data (transfer->buffer_wr, transfer->length_wr);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -98,7 +78,7 @@ log_transfer (FpiSpiTransfer *transfer, gboolean submit, GError *error)
|
||||
transfer->length_wr,
|
||||
transfer->length_rd);
|
||||
if (transfer->buffer_rd)
|
||||
dump_buffer (transfer->buffer_rd, transfer->length_rd);
|
||||
fp_dbg_hex_dump_data (transfer->buffer_rd, transfer->length_rd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+20
-14
@@ -615,7 +615,7 @@ fpi_ssm_get_cur_state (FpiSsm *machine)
|
||||
*
|
||||
* Returns the error code set by fpi_ssm_mark_failed().
|
||||
*
|
||||
* Returns: (transfer none): a error code
|
||||
* Returns: (transfer none): a #GError or %NULL if not set.
|
||||
*/
|
||||
GError *
|
||||
fpi_ssm_get_error (FpiSsm *machine)
|
||||
@@ -631,7 +631,7 @@ fpi_ssm_get_error (FpiSsm *machine)
|
||||
*
|
||||
* Returns the error code set by fpi_ssm_mark_failed().
|
||||
*
|
||||
* Returns: (transfer full): a error code
|
||||
* Returns: (transfer full): a #GError or %NULL if not set.
|
||||
*/
|
||||
GError *
|
||||
fpi_ssm_dup_error (FpiSsm *machine)
|
||||
@@ -657,6 +657,8 @@ fpi_ssm_dup_error (FpiSsm *machine)
|
||||
void
|
||||
fpi_ssm_silence_debug (FpiSsm *machine)
|
||||
{
|
||||
g_return_if_fail (machine != NULL);
|
||||
|
||||
machine->silence = TRUE;
|
||||
}
|
||||
|
||||
@@ -665,10 +667,10 @@ fpi_ssm_silence_debug (FpiSsm *machine)
|
||||
* @transfer: a #FpiUsbTransfer
|
||||
* @device: a #FpDevice
|
||||
* @unused_data: User data (unused)
|
||||
* @error: The #GError or %NULL
|
||||
* @error: (transfer full): a #GError or %NULL.
|
||||
*
|
||||
* Can be used in as a #FpiUsbTransfer callback handler to automatically
|
||||
* advance or fail a statemachine on transfer completion.
|
||||
* advance or fail a state machine on transfer completion.
|
||||
*
|
||||
* Make sure to set the #FpiSsm on the transfer.
|
||||
*/
|
||||
@@ -676,10 +678,11 @@ void
|
||||
fpi_ssm_usb_transfer_cb (FpiUsbTransfer *transfer, FpDevice *device,
|
||||
gpointer unused_data, GError *error)
|
||||
{
|
||||
g_return_if_fail (transfer != NULL);
|
||||
g_return_if_fail (transfer->ssm);
|
||||
|
||||
if (error)
|
||||
fpi_ssm_mark_failed (transfer->ssm, error);
|
||||
fpi_ssm_mark_failed (transfer->ssm, g_steal_pointer (&error));
|
||||
else
|
||||
fpi_ssm_next_state (transfer->ssm);
|
||||
}
|
||||
@@ -691,10 +694,10 @@ fpi_ssm_usb_transfer_cb (FpiUsbTransfer *transfer, FpDevice *device,
|
||||
* @weak_ptr: A #gpointer pointer to nullify. You can pass a pointer to any
|
||||
* #gpointer to nullify when the callback is completed. I.e a
|
||||
* pointer to the current #FpiUsbTransfer.
|
||||
* @error: The #GError or %NULL
|
||||
* @error: (transfer full): a #GError or %NULL.
|
||||
*
|
||||
* Can be used in as a #FpiUsbTransfer callback handler to automatically
|
||||
* advance or fail a statemachine on transfer completion.
|
||||
* advance or fail a state machine on transfer completion.
|
||||
* Passing a #gpointer* as @weak_ptr permits to nullify it once we're done
|
||||
* with the transfer.
|
||||
*
|
||||
@@ -705,12 +708,13 @@ fpi_ssm_usb_transfer_with_weak_pointer_cb (FpiUsbTransfer *transfer,
|
||||
FpDevice *device, gpointer weak_ptr,
|
||||
GError *error)
|
||||
{
|
||||
g_return_if_fail (transfer != NULL);
|
||||
g_return_if_fail (transfer->ssm);
|
||||
|
||||
if (weak_ptr)
|
||||
g_nullify_pointer ((gpointer *) weak_ptr);
|
||||
|
||||
fpi_ssm_usb_transfer_cb (transfer, device, weak_ptr, error);
|
||||
fpi_ssm_usb_transfer_cb (transfer, device, weak_ptr, g_steal_pointer (&error));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -718,10 +722,10 @@ fpi_ssm_usb_transfer_with_weak_pointer_cb (FpiUsbTransfer *transfer,
|
||||
* @transfer: a #FpiSpiTransfer
|
||||
* @device: a #FpDevice
|
||||
* @unused_data: User data (unused)
|
||||
* @error: The #GError or %NULL
|
||||
* @error: (transfer full): a #GError or %NULL.
|
||||
*
|
||||
* Can be used in as a #FpiSpiTransfer callback handler to automatically
|
||||
* advance or fail a statemachine on transfer completion.
|
||||
* advance or fail a state machine on transfer completion.
|
||||
*
|
||||
* Make sure to set the #FpiSsm on the transfer.
|
||||
*/
|
||||
@@ -729,10 +733,11 @@ void
|
||||
fpi_ssm_spi_transfer_cb (FpiSpiTransfer *transfer, FpDevice *device,
|
||||
gpointer unused_data, GError *error)
|
||||
{
|
||||
g_return_if_fail (transfer != NULL);
|
||||
g_return_if_fail (transfer->ssm);
|
||||
|
||||
if (error)
|
||||
fpi_ssm_mark_failed (transfer->ssm, error);
|
||||
fpi_ssm_mark_failed (transfer->ssm, g_steal_pointer (&error));
|
||||
else
|
||||
fpi_ssm_next_state (transfer->ssm);
|
||||
}
|
||||
@@ -744,10 +749,10 @@ fpi_ssm_spi_transfer_cb (FpiSpiTransfer *transfer, FpDevice *device,
|
||||
* @weak_ptr: A #gpointer pointer to nullify. You can pass a pointer to any
|
||||
* #gpointer to nullify when the callback is completed. I.e a
|
||||
* pointer to the current #FpiSpiTransfer.
|
||||
* @error: The #GError or %NULL
|
||||
* @error: (transfer full): a #GError or %NULL.
|
||||
*
|
||||
* Can be used in as a #FpiSpiTransfer callback handler to automatically
|
||||
* advance or fail a statemachine on transfer completion.
|
||||
* advance or fail a state machine on transfer completion.
|
||||
* Passing a #gpointer* as @weak_ptr permits to nullify it once we're done
|
||||
* with the transfer.
|
||||
*
|
||||
@@ -758,10 +763,11 @@ fpi_ssm_spi_transfer_with_weak_pointer_cb (FpiSpiTransfer *transfer,
|
||||
FpDevice *device, gpointer weak_ptr,
|
||||
GError *error)
|
||||
{
|
||||
g_return_if_fail (transfer != NULL);
|
||||
g_return_if_fail (transfer->ssm);
|
||||
|
||||
if (weak_ptr)
|
||||
g_nullify_pointer ((gpointer *) weak_ptr);
|
||||
|
||||
fpi_ssm_spi_transfer_cb (transfer, device, weak_ptr, error);
|
||||
fpi_ssm_spi_transfer_cb (transfer, device, weak_ptr, g_steal_pointer (&error));
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
*/
|
||||
|
||||
#include "fpi-usb-transfer.h"
|
||||
#include "fpi-log.h"
|
||||
|
||||
/**
|
||||
* SECTION:fpi-usb-transfer
|
||||
@@ -30,6 +31,9 @@
|
||||
*
|
||||
* Drivers should use this API only rather than accessing the GUsbDevice
|
||||
* directly in most cases.
|
||||
*
|
||||
* Setting %G_MESSAGES_DEBUG and %FP_DEBUG_TRANSFER will result in the message
|
||||
* content to be dumped.
|
||||
*/
|
||||
|
||||
|
||||
@@ -38,7 +42,7 @@ G_DEFINE_BOXED_TYPE (FpiUsbTransfer, fpi_usb_transfer, fpi_usb_transfer_ref, fpi
|
||||
static void
|
||||
log_transfer (FpiUsbTransfer *transfer, gboolean submit, GError *error)
|
||||
{
|
||||
if (g_getenv ("FP_DEBUG_TRANSFER"))
|
||||
if (fpi_log_is_debug_transfer_enabled ())
|
||||
{
|
||||
if (!submit)
|
||||
{
|
||||
@@ -65,25 +69,9 @@ log_transfer (FpiUsbTransfer *transfer, gboolean submit, GError *error)
|
||||
|
||||
if (!submit == !!(transfer->endpoint & FPI_USB_ENDPOINT_IN))
|
||||
{
|
||||
g_autoptr(GString) line = NULL;
|
||||
gssize dump_len;
|
||||
|
||||
dump_len = (transfer->endpoint & FPI_USB_ENDPOINT_IN) ? transfer->actual_length : transfer->length;
|
||||
|
||||
line = g_string_new ("");
|
||||
/* Dump the buffer. */
|
||||
for (gint i = 0; i < dump_len; i++)
|
||||
{
|
||||
g_string_append_printf (line, "%02x ", transfer->buffer[i]);
|
||||
if ((i + 1) % 16 == 0)
|
||||
{
|
||||
g_debug ("%s", line->str);
|
||||
g_string_set_size (line, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (line->len)
|
||||
g_debug ("%s", line->str);
|
||||
fp_dbg_hex_dump_data (transfer->buffer,
|
||||
(transfer->endpoint & FPI_USB_ENDPOINT_IN) ?
|
||||
transfer->actual_length : transfer->length);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -344,7 +332,8 @@ transfer_finish_cb (GObject *source_object, GAsyncResult *res, gpointer user_dat
|
||||
{
|
||||
error = g_error_new (G_USB_DEVICE_ERROR,
|
||||
G_USB_DEVICE_ERROR_IO,
|
||||
"Unexpected short error of %zd size (expected %zd)", transfer->actual_length, transfer->length);
|
||||
"Unexpected short error of %zd size (expected %zd)",
|
||||
transfer->actual_length, transfer->length);
|
||||
}
|
||||
|
||||
callback = transfer->callback;
|
||||
@@ -548,3 +537,23 @@ fpi_usb_transfer_submit_sync (FpiUsbTransfer *transfer,
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* fpi_usb_transfer_set_short_error:
|
||||
* @transfer: The transfer to submit, must have been filled.
|
||||
* @short_is_error: Whether a short transfer should be considered an error
|
||||
*
|
||||
* Sets whether a short transfer (a transfer in which the transferred length
|
||||
* does not match the expected length) should be considered an error
|
||||
*
|
||||
* By default, short transfers are not considered an error, but
|
||||
* drivers can enforce a further check by setting this flag.
|
||||
*/
|
||||
void
|
||||
fpi_usb_transfer_set_short_error (FpiUsbTransfer *transfer,
|
||||
gboolean short_is_error)
|
||||
{
|
||||
g_return_if_fail (transfer);
|
||||
|
||||
transfer->short_is_error = short_is_error;
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
" <url type=\"homepage\">https://fprint.freedesktop.org</url>\n" \
|
||||
" <url type=\"vcs-browser\">https://gitlab.freedesktop.org/libfprint/libfprint</url>\n" \
|
||||
" <url type=\"help\">https://fprint.freedesktop.org/libfprint-dev</url>\n" \
|
||||
" <url type=\"bugtracker\">https://gitlab.freedesktop.org/libfprint/libfprint/-/issues</url>\n" \
|
||||
" <url type=\"bugtracker\">https://gitlab.freedesktop.org/libfprint/libfprint/-/work_items</url>\n" \
|
||||
" <summary>Async fingerprint readers library</summary>\n" \
|
||||
" <description>\n" \
|
||||
" <p>\n" \
|
||||
@@ -78,6 +78,8 @@ main (void)
|
||||
g_autoptr(GString) provided_modules = g_string_new (NULL);
|
||||
g_autoptr(GError) error = NULL;
|
||||
|
||||
g_log_writer_default_set_use_stderr (TRUE);
|
||||
|
||||
g_array_sort (drivers, driver_compare);
|
||||
|
||||
for (guint i = 0; i < drivers->len; ++i)
|
||||
|
||||
@@ -64,10 +64,12 @@ static const FpIdEntry allowlist_id_table[] = {
|
||||
{ .vid = 0x06cb, .pid = 0x008a },
|
||||
{ .vid = 0x06cb, .pid = 0x009a },
|
||||
{ .vid = 0x06cb, .pid = 0x009b },
|
||||
{ .vid = 0x06cb, .pid = 0x00a1 },
|
||||
{ .vid = 0x06cb, .pid = 0x00a2 },
|
||||
{ .vid = 0x06cb, .pid = 0x00a8 },
|
||||
{ .vid = 0x06cb, .pid = 0x00b7 },
|
||||
{ .vid = 0x06cb, .pid = 0x00bb },
|
||||
{ .vid = 0x06cb, .pid = 0x00bc },
|
||||
{ .vid = 0x06cb, .pid = 0x00be },
|
||||
{ .vid = 0x06cb, .pid = 0x00cb },
|
||||
{ .vid = 0x06cb, .pid = 0x00c9 },
|
||||
@@ -96,9 +98,11 @@ static const FpIdEntry allowlist_id_table[] = {
|
||||
{ .vid = 0x0bda, .pid = 0x5812 },
|
||||
{ .vid = 0x10a5, .pid = 0x0007 },
|
||||
{ .vid = 0x10a5, .pid = 0x9200 },
|
||||
{ .vid = 0x10a5, .pid = 0x9201 },
|
||||
{ .vid = 0x10a5, .pid = 0x9800 },
|
||||
{ .vid = 0x10a5, .pid = 0xa120 },
|
||||
{ .vid = 0x10a5, .pid = 0xa900 },
|
||||
{ .vid = 0x10a5, .pid = 0xa921 },
|
||||
{ .vid = 0x10a5, .pid = 0xe340 },
|
||||
{ .vid = 0x1188, .pid = 0x9545 },
|
||||
{ .vid = 0x138a, .pid = 0x0007 },
|
||||
@@ -152,16 +156,17 @@ static const FpIdEntry allowlist_id_table[] = {
|
||||
{ .vid = 0x27c6, .pid = 0x581a },
|
||||
{ .vid = 0x27c6, .pid = 0x589a },
|
||||
{ .vid = 0x27c6, .pid = 0x5f10 },
|
||||
{ .vid = 0x27c6, .pid = 0x5f91 },
|
||||
{ .vid = 0x27c6, .pid = 0x6382 },
|
||||
{ .vid = 0x2808, .pid = 0x9338 },
|
||||
{ .vid = 0x2808, .pid = 0x9348 },
|
||||
{ .vid = 0x2808, .pid = 0x93a9 },
|
||||
{ .vid = 0x2808, .pid = 0xa658 },
|
||||
{ .vid = 0x2808, .pid = 0xc652 },
|
||||
{ .vid = 0x2808, .pid = 0xa553 },
|
||||
{ .vid = 0x298d, .pid = 0x2020 },
|
||||
{ .vid = 0x298d, .pid = 0x2033 },
|
||||
{ .vid = 0x2df0, .pid = 0x0003 },
|
||||
{ .vid = 0x3274, .pid = 0x8012 },
|
||||
{ .vid = 0x3538, .pid = 0x0930 },
|
||||
{ .vid = 0 },
|
||||
};
|
||||
|
||||
+69
-81
@@ -21,6 +21,7 @@ libfprint_private_sources = [
|
||||
'fpi-device.c',
|
||||
'fpi-image-device.c',
|
||||
'fpi-image.c',
|
||||
'fpi-log.c',
|
||||
'fpi-print.c',
|
||||
'fpi-ssm.c',
|
||||
'fpi-usb-transfer.c',
|
||||
@@ -87,87 +88,66 @@ nbis_sources = [
|
||||
]
|
||||
|
||||
driver_sources = {
|
||||
'upekts' :
|
||||
[ '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' ],
|
||||
'egismoc' :
|
||||
[ 'drivers/egismoc/egismoc.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' ],
|
||||
'fpcmoc' :
|
||||
[ 'drivers/fpcmoc/fpc.c' ],
|
||||
'realtek' :
|
||||
[ 'drivers/realtek/realtek.c' ],
|
||||
'focaltech_moc' :
|
||||
[ 'drivers/focaltech_moc/focaltech_moc.c' ],
|
||||
'upekts' : files(
|
||||
'drivers/upekts.c',
|
||||
'drivers/upek_proto.c',
|
||||
),
|
||||
'upektc' : files('drivers/upektc.c'),
|
||||
'upeksonly' : files('drivers/upeksonly.c'),
|
||||
'uru4000' : files('drivers/uru4000.c'),
|
||||
'aes1610' : files('drivers/aes1610.c'),
|
||||
'aes1660' : files('drivers/aes1660.c'),
|
||||
'aes2501' : files('drivers/aes2501.c'),
|
||||
'aes2550' : files('drivers/aes2550.c'),
|
||||
'aes2660' : files('drivers/aes2660.c'),
|
||||
'aes3500' : files('drivers/aes3500.c'),
|
||||
'aes4000' : files('drivers/aes4000.c'),
|
||||
'vcom5s' : files('drivers/vcom5s.c'),
|
||||
'vfs101' : files('drivers/vfs101.c'),
|
||||
'vfs301' : files(
|
||||
'drivers/vfs301.c',
|
||||
'drivers/vfs301_proto.c',
|
||||
),
|
||||
'vfs5011' : files('drivers/vfs5011.c'),
|
||||
'vfs7552' : files('drivers/vfs7552.c'),
|
||||
'upektc_img' : files(
|
||||
'drivers/upektc_img.c',
|
||||
'drivers/upek_proto.c',
|
||||
),
|
||||
'etes603' : files('drivers/etes603.c'),
|
||||
'egis0570' : files('drivers/egis0570.c'),
|
||||
'egismoc' : files('drivers/egismoc/egismoc.c'),
|
||||
'egis_etu905' : files('drivers/egismoc/egis_etu905.c'),
|
||||
'vfs0050' : files('drivers/vfs0050.c'),
|
||||
'elan' : files('drivers/elan.c'),
|
||||
'elanmoc' : files('drivers/elanmoc/elanmoc.c'),
|
||||
'elanspi' : files('drivers/elanspi.c'),
|
||||
'nb1010' : files('drivers/nb1010.c'),
|
||||
'virtual_image' : files('drivers/virtual-image.c'),
|
||||
'virtual_device' : files('drivers/virtual-device.c'),
|
||||
'virtual_device_storage' : files('drivers/virtual-device-storage.c'),
|
||||
'synaptics' : files(
|
||||
'drivers/synaptics/synaptics.c',
|
||||
'drivers/synaptics/bmkt_message.c',
|
||||
),
|
||||
'goodixmoc' : files(
|
||||
'drivers/goodixmoc/goodix.c',
|
||||
'drivers/goodixmoc/goodix_proto.c',
|
||||
),
|
||||
'fpcmoc' : files('drivers/fpcmoc/fpc.c'),
|
||||
'realtek' : files('drivers/realtek/realtek.c'),
|
||||
'focaltech_moc' : files('drivers/focaltech_moc/focaltech_moc.c'),
|
||||
'mafpmoc' : files('drivers/mafpmoc/mafpmoc.c'),
|
||||
'secugen' : files('drivers/secugen.c'),
|
||||
}
|
||||
|
||||
helper_sources = {
|
||||
'aeslib' :
|
||||
[ 'drivers/aeslib.c' ],
|
||||
'aesx660' :
|
||||
[ 'drivers/aesx660.c' ],
|
||||
'aes3k' :
|
||||
[ 'drivers/aes3k.c' ],
|
||||
'openssl' :
|
||||
[ ],
|
||||
'udev' :
|
||||
[ ],
|
||||
'virtual' :
|
||||
[ 'drivers/virtual-device-listener.c' ],
|
||||
'aeslib': files('drivers/aeslib.c'),
|
||||
'aesx660': files('drivers/aesx660.c'),
|
||||
'aes3k': files('drivers/aes3k.c'),
|
||||
'openssl': files(),
|
||||
'udev': files(),
|
||||
'virtual': files('drivers/virtual-device-listener.c'),
|
||||
}
|
||||
|
||||
drivers_sources = []
|
||||
@@ -231,6 +211,7 @@ deps = [
|
||||
enums_dep,
|
||||
gio_dep,
|
||||
glib_dep,
|
||||
gmodule_dep,
|
||||
gobject_dep,
|
||||
gusb_dep,
|
||||
mathlib_dep,
|
||||
@@ -255,6 +236,7 @@ libnbis = static_library('nbis',
|
||||
'-Wno-discarded-qualifiers',
|
||||
'-Wno-array-bounds',
|
||||
'-Wno-array-parameter',
|
||||
'-Wno-unused-but-set-variable',
|
||||
]),
|
||||
install: false)
|
||||
|
||||
@@ -322,7 +304,9 @@ udev_hwdb = executable('fprint-list-udev-hwdb',
|
||||
'fprint-list-udev-hwdb.c',
|
||||
dependencies: libfprint_private_dep,
|
||||
link_with: libfprint_drivers,
|
||||
install: false)
|
||||
install: false,
|
||||
link_args: ['-Wl,--disable-new-dtags'],
|
||||
)
|
||||
|
||||
udev_hwdb_generator = custom_target('udev-hwdb',
|
||||
output: 'autosuspend.hwdb',
|
||||
@@ -336,7 +320,9 @@ metainfo = executable('fprint-list-metainfo',
|
||||
'fprint-list-metainfo.c',
|
||||
dependencies: libfprint_private_dep,
|
||||
link_with: libfprint_drivers,
|
||||
install: false)
|
||||
install: false,
|
||||
link_args: ['-Wl,--disable-new-dtags'],
|
||||
)
|
||||
|
||||
metainfo_generator = custom_target('metainfo',
|
||||
output: 'org.freedesktop.libfprint.metainfo.xml',
|
||||
@@ -352,7 +338,9 @@ if install_udev_rules
|
||||
'fprint-list-udev-rules.c',
|
||||
dependencies: libfprint_private_dep,
|
||||
link_with: libfprint_drivers,
|
||||
install: false)
|
||||
install: false,
|
||||
link_args: ['-Wl,--disable-new-dtags'],
|
||||
)
|
||||
|
||||
custom_target('udev-rules',
|
||||
output: '70-@0@.rules'.format(versioned_libname),
|
||||
|
||||
@@ -93,6 +93,7 @@ versioned_libname = meson.project_name() + '-' + soversion.to_string()
|
||||
glib_dep = dependency('glib-2.0', version: '>=' + glib_min_version)
|
||||
gio_dep = dependency('gio-unix-2.0', version: '>=' + glib_min_version)
|
||||
gobject_dep = dependency('gobject-2.0', version: '>=' + glib_min_version)
|
||||
gmodule_dep = dependency('gmodule-2.0', version: '>=' + glib_min_version)
|
||||
gusb_dep = dependency('gusb', version: '>= 0.2.0')
|
||||
mathlib_dep = cc.find_library('m', required: false)
|
||||
|
||||
@@ -131,6 +132,7 @@ default_drivers = [
|
||||
'etes603',
|
||||
'egis0570',
|
||||
'egismoc',
|
||||
'egis_etu905',
|
||||
'vcom5s',
|
||||
'synaptics',
|
||||
'elan',
|
||||
@@ -144,6 +146,8 @@ default_drivers = [
|
||||
'fpcmoc',
|
||||
'realtek',
|
||||
'focaltech_moc',
|
||||
'mafpmoc',
|
||||
'secugen',
|
||||
]
|
||||
|
||||
spi_drivers = [
|
||||
@@ -165,6 +169,7 @@ endian_independent_drivers = virtual_drivers + [
|
||||
'aes4000',
|
||||
'egis0570',
|
||||
'egismoc',
|
||||
'egis_etu905',
|
||||
'elanmoc',
|
||||
'etes603',
|
||||
'focaltech_moc',
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/python3
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import cairo
|
||||
import sys
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/python3
|
||||
#!/usr/bin/env python3
|
||||
|
||||
BUILDDIR='@BUILDDIR@'
|
||||
SRCDIR='@SRCDIR@'
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,137 @@
|
||||
#!/usr/bin/python3
|
||||
import traceback
|
||||
|
||||
import sys
|
||||
import gi
|
||||
|
||||
gi.require_version('FPrint', '2.0')
|
||||
from gi.repository import FPrint, GLib, Gio
|
||||
|
||||
# Exit with error on any exception, included those happening in async callbacks
|
||||
sys.excepthook = lambda *args: (traceback.print_exception(*args), sys.exit(1))
|
||||
|
||||
ctx = GLib.main_context_default()
|
||||
|
||||
c = FPrint.Context()
|
||||
c.enumerate()
|
||||
devices = c.get_devices()
|
||||
|
||||
d = devices[0]
|
||||
del devices
|
||||
|
||||
assert d.get_driver() == "egis_etu905"
|
||||
assert not d.has_feature(FPrint.DeviceFeature.CAPTURE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.IDENTIFY)
|
||||
assert d.has_feature(FPrint.DeviceFeature.VERIFY)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_LIST)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_DELETE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_CLEAR)
|
||||
|
||||
d.open_sync()
|
||||
|
||||
def enroll_progress(*args):
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.PRESENT
|
||||
print("enroll progress stage: " + str(args[1]))
|
||||
|
||||
def identify_done(dev, res):
|
||||
global identified
|
||||
identified = True
|
||||
identify_match, identify_print = dev.identify_finish(res)
|
||||
print("MATCH FOUND!" if identify_match else "NO MATCH FOUND")
|
||||
assert identify_match.equal(identify_print)
|
||||
|
||||
# List
|
||||
print("--- LISTING ---")
|
||||
stored = d.list_prints_sync()
|
||||
prints1 = len(stored)
|
||||
print(f"--- LIST DONE: Found {prints1} prints before enroll---")
|
||||
|
||||
# Enroll
|
||||
print("--- ENROLLING ---")
|
||||
template = FPrint.Print.new(d)
|
||||
|
||||
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 ---")
|
||||
del template
|
||||
|
||||
# List
|
||||
print("--- LISTING ---")
|
||||
stored = d.list_prints_sync()
|
||||
prints2 = len(stored)
|
||||
print(f"--- LIST DONE: Found {prints2} prints after enroll---")
|
||||
assert (prints2 - prints1) == 1
|
||||
|
||||
# Cancel test - start async identify and cancel it
|
||||
print("--- TESTING CANCELLATION ---")
|
||||
deserialized_prints = []
|
||||
for sp in stored:
|
||||
deserialized_prints.append(FPrint.Print.deserialize(sp.serialize()))
|
||||
|
||||
cancellable = Gio.Cancellable()
|
||||
identify_cancelled = False
|
||||
cancel_result = None
|
||||
|
||||
def identify_cancelled_cb(dev, res):
|
||||
global identify_cancelled, cancel_result
|
||||
identify_cancelled = True
|
||||
try:
|
||||
result = dev.identify_finish(res)
|
||||
cancel_result = result
|
||||
except Exception as e:
|
||||
cancel_result = e
|
||||
print(f"Identify cancelled with error: {e}")
|
||||
|
||||
d.identify(deserialized_prints, cancellable=cancellable, callback=identify_cancelled_cb)
|
||||
cancellable.cancel()
|
||||
|
||||
while not identify_cancelled:
|
||||
ctx.iteration(True)
|
||||
print(f"--- CANCELLATION TEST DONE, result: {cancel_result} ---")
|
||||
del deserialized_prints
|
||||
|
||||
# Verify
|
||||
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(f"--- VERIFY DONE: Result {verify_res} ---")
|
||||
|
||||
# Identify
|
||||
print("--- ASYNC IDENTIFYING ---")
|
||||
identified = False
|
||||
deserialized_prints = []
|
||||
for p in stored:
|
||||
deserialized_prints.append(FPrint.Print.deserialize(p.serialize()))
|
||||
assert deserialized_prints[-1].equal(p)
|
||||
|
||||
d.identify(deserialized_prints, callback=identify_done)
|
||||
del deserialized_prints
|
||||
|
||||
while not identified:
|
||||
ctx.iteration(True)
|
||||
print("--- IDENTIFY DONE ---")
|
||||
|
||||
# Delete
|
||||
print("--- DELETING ---")
|
||||
p_to_delete = next((sp for sp in stored if sp.equal(p)), None)
|
||||
if p_to_delete:
|
||||
d.delete_print_sync(p_to_delete)
|
||||
print("--- DELETE DONE ---")
|
||||
del p_to_delete
|
||||
del p
|
||||
|
||||
# List
|
||||
print("--- LISTING ---")
|
||||
stored = d.list_prints_sync()
|
||||
prints3 = len(stored)
|
||||
print(f"--- LIST DONE: Found {prints3} prints after deleting---")
|
||||
assert (prints2 - prints3) == 1
|
||||
del stored
|
||||
|
||||
d.close_sync()
|
||||
|
||||
del d
|
||||
del c
|
||||
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/python3
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import traceback
|
||||
import sys
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/python3
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import traceback
|
||||
import sys
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/python3
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import traceback
|
||||
import sys
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/python3
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import traceback
|
||||
import sys
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/python3
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import traceback
|
||||
import sys
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,73 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
import traceback
|
||||
import sys
|
||||
import gi
|
||||
|
||||
gi.require_version('FPrint', '2.0')
|
||||
from gi.repository import FPrint, GLib
|
||||
|
||||
sys.excepthook = lambda *args: (traceback.print_exception(*args), sys.exit(1))
|
||||
|
||||
ctx = GLib.main_context_default()
|
||||
|
||||
c = FPrint.Context()
|
||||
c.enumerate()
|
||||
devices = c.get_devices()
|
||||
|
||||
d = next((dev for dev in devices if dev.get_driver() == "focaltech_moc"), None)
|
||||
|
||||
if d is None:
|
||||
print("Error: Focaltech driver not loaded for any discovered device.")
|
||||
sys.exit(1)
|
||||
|
||||
del devices
|
||||
|
||||
d.open_sync()
|
||||
assert d.get_driver() == "focaltech_moc"
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_LIST)
|
||||
assert not d.has_feature(FPrint.DeviceFeature.STORAGE_DELETE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_CLEAR)
|
||||
|
||||
|
||||
print("Clearing storage (0xAC)...")
|
||||
d.clear_storage_sync()
|
||||
|
||||
template = FPrint.Print.new(d)
|
||||
|
||||
def enroll_progress(*args):
|
||||
print('Enroll progress: ' + str(args))
|
||||
|
||||
print("Enrolling (Perform 12 taps now)...")
|
||||
p = d.enroll_sync(template, None, enroll_progress, None)
|
||||
print("Enroll done.")
|
||||
|
||||
print("Listing prints...")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 1
|
||||
assert stored[0].equal(p)
|
||||
print("List verified.")
|
||||
|
||||
print("Verifying...")
|
||||
verify_res, verify_print = d.verify_sync(p)
|
||||
assert verify_res == True
|
||||
print("Verify done.")
|
||||
|
||||
print("Delete is a no-op here")
|
||||
d.delete_print_sync(p)
|
||||
|
||||
print('Identifying...')
|
||||
match, identify_print = d.identify_sync(stored, None, None, None)
|
||||
|
||||
print('Identification SUCCESS')
|
||||
assert match.equal(identify_print)
|
||||
assert match.equal(p)
|
||||
|
||||
print("Clearing storage...")
|
||||
d.clear_storage_sync()
|
||||
|
||||
final_list = d.list_prints_sync()
|
||||
assert len(final_list) == 0
|
||||
print("Cleanup verified.")
|
||||
|
||||
d.close_sync()
|
||||
@@ -0,0 +1,267 @@
|
||||
P: /devices/pci0000:00/0000:00:14.0/usb3/3-2
|
||||
N: bus/usb/003/002=12010102000000400828536501210301020109022000010104A0FA0904000002DCA0B0000705010240000007058202400000
|
||||
E: BUSNUM=003
|
||||
E: CURRENT_TAGS=:seat:
|
||||
E: DEVNAME=/dev/bus/usb/003/002
|
||||
E: DEVNUM=002
|
||||
E: DEVTYPE=usb_device
|
||||
E: DRIVER=usb
|
||||
E: ID_AUTOSUSPEND=1
|
||||
E: ID_BUS=usb
|
||||
E: ID_FOR_SEAT=usb-pci-0000_00_14_0-usb-0_2
|
||||
E: ID_MODEL=Focaltech_FT9365_ESS
|
||||
E: ID_MODEL_ENC=Focaltech\x20FT9365\x20ESS
|
||||
E: ID_MODEL_ID=6553
|
||||
E: ID_PATH=pci-0000:00:14.0-usb-0:2
|
||||
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_2
|
||||
E: ID_PATH_WITH_USB_REVISION=pci-0000:00:14.0-usbv2-0:2
|
||||
E: ID_PERSIST=0
|
||||
E: ID_REVISION=2101
|
||||
E: ID_SERIAL=Generic_Focaltech_FT9365_ESS_201801010001
|
||||
E: ID_SERIAL_SHORT=201801010001
|
||||
E: ID_USB_INTERFACES=:dca0b0:
|
||||
E: ID_USB_MODEL=Focaltech_FT9365_ESS
|
||||
E: ID_USB_MODEL_ENC=Focaltech\x20FT9365\x20ESS
|
||||
E: ID_USB_MODEL_ID=6553
|
||||
E: ID_USB_REVISION=2101
|
||||
E: ID_USB_SERIAL=Generic_Focaltech_FT9365_ESS_201801010001
|
||||
E: ID_USB_SERIAL_SHORT=201801010001
|
||||
E: ID_USB_VENDOR=Generic
|
||||
E: ID_USB_VENDOR_ENC=Generic
|
||||
E: ID_USB_VENDOR_ID=2808
|
||||
E: ID_VENDOR=Generic
|
||||
E: ID_VENDOR_ENC=Generic
|
||||
E: ID_VENDOR_ID=2808
|
||||
E: MAJOR=189
|
||||
E: MINOR=257
|
||||
E: PRODUCT=2808/6553/2101
|
||||
E: SUBSYSTEM=usb
|
||||
E: TAGS=:seat:
|
||||
E: TYPE=0/0/0
|
||||
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=500mA\n
|
||||
A: bNumConfigurations=1\n
|
||||
A: bNumInterfaces= 1\n
|
||||
A: bcdDevice=2101\n
|
||||
A: bmAttributes=a0\n
|
||||
H: bos_descriptors=050F2900021C100500DF60DDD88945C74C9CD2659D9E648A9F000003066E0315000810110103000000
|
||||
A: busnum=3\n
|
||||
A: configuration=Focaltech FT9365 ESS\n
|
||||
H: descriptors=12010102000000400828536501210301020109022000010104A0FA0904000002DCA0B0000705010240000007058202400000
|
||||
A: dev=189:257\n
|
||||
A: devnum=2\n
|
||||
A: devpath=2\n
|
||||
L: driver=../../../../../bus/usb/drivers/usb
|
||||
L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:56/device:57/device:59
|
||||
A: idProduct=6553\n
|
||||
A: idVendor=2808\n
|
||||
A: ltm_capable=no\n
|
||||
A: manufacturer=Generic\n
|
||||
A: maxchild=0\n
|
||||
A: physical_location/dock=no\n
|
||||
A: physical_location/horizontal_position=left\n
|
||||
A: physical_location/lid=no\n
|
||||
A: physical_location/panel=top\n
|
||||
A: physical_location/vertical_position=upper\n
|
||||
L: port=../3-0:1.0/usb3-port2
|
||||
A: power/active_duration=886464\n
|
||||
A: power/autosuspend=2\n
|
||||
A: power/autosuspend_delay_ms=2000\n
|
||||
A: power/connected_duration=15109711\n
|
||||
A: power/control=auto\n
|
||||
A: power/level=auto\n
|
||||
A: power/persist=0\n
|
||||
A: power/runtime_active_time=894614\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=14214859\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=Focaltech FT9365 ESS\n
|
||||
A: quirks=0x0\n
|
||||
A: removable=fixed\n
|
||||
A: rx_lanes=1\n
|
||||
A: serial=201801010001\n
|
||||
A: speed=12\n
|
||||
A: tx_lanes=1\n
|
||||
A: urbnum=12224\n
|
||||
A: version= 2.01\n
|
||||
|
||||
P: /devices/pci0000:00/0000:00:14.0/usb3
|
||||
N: bus/usb/003/001=12010002090001406B1D020018060302010109021900010100E0000904000001090000000705810304000C
|
||||
E: BUSNUM=003
|
||||
E: CURRENT_TAGS=:seat:
|
||||
E: DEVNAME=/dev/bus/usb/003/001
|
||||
E: DEVNUM=001
|
||||
E: DEVTYPE=usb_device
|
||||
E: DRIVER=usb
|
||||
E: ID_AUTOSUSPEND=1
|
||||
E: ID_BUS=usb
|
||||
E: ID_FOR_SEAT=usb-pci-0000_00_14_0
|
||||
E: ID_MODEL=xHCI_Host_Controller
|
||||
E: ID_MODEL_ENC=xHCI\x20Host\x20Controller
|
||||
E: ID_MODEL_FROM_DATABASE=2.0 root hub
|
||||
E: ID_MODEL_ID=0002
|
||||
E: ID_PATH=pci-0000:00:14.0
|
||||
E: ID_PATH_TAG=pci-0000_00_14_0
|
||||
E: ID_REVISION=0618
|
||||
E: ID_SERIAL=Linux_6.18.9-arch1-2_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
|
||||
E: ID_SERIAL_SHORT=0000:00:14.0
|
||||
E: ID_USB_INTERFACES=:090000:
|
||||
E: ID_USB_MODEL=xHCI_Host_Controller
|
||||
E: ID_USB_MODEL_ENC=xHCI\x20Host\x20Controller
|
||||
E: ID_USB_MODEL_ID=0002
|
||||
E: ID_USB_REVISION=0618
|
||||
E: ID_USB_SERIAL=Linux_6.18.9-arch1-2_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
|
||||
E: ID_USB_SERIAL_SHORT=0000:00:14.0
|
||||
E: ID_USB_VENDOR=Linux_6.18.9-arch1-2_xhci-hcd
|
||||
E: ID_USB_VENDOR_ENC=Linux\x206.18.9-arch1-2\x20xhci-hcd
|
||||
E: ID_USB_VENDOR_ID=1d6b
|
||||
E: ID_VENDOR=Linux_6.18.9-arch1-2_xhci-hcd
|
||||
E: ID_VENDOR_ENC=Linux\x206.18.9-arch1-2\x20xhci-hcd
|
||||
E: ID_VENDOR_FROM_DATABASE=Linux Foundation
|
||||
E: ID_VENDOR_ID=1d6b
|
||||
E: MAJOR=189
|
||||
E: MINOR=256
|
||||
E: PRODUCT=1d6b/2/618
|
||||
E: SUBSYSTEM=usb
|
||||
E: TAGS=:seat:
|
||||
E: TYPE=9/0/1
|
||||
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=0618\n
|
||||
A: bmAttributes=e0\n
|
||||
A: busnum=3\n
|
||||
A: configuration=
|
||||
H: descriptors=12010002090001406B1D020018060302010109021900010100E0000904000001090000000705810304000C
|
||||
A: dev=189:256\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:56/device:57
|
||||
A: idProduct=0002\n
|
||||
A: idVendor=1d6b\n
|
||||
A: interface_authorized_default=1\n
|
||||
A: ltm_capable=no\n
|
||||
A: manufacturer=Linux 6.18.9-arch1-2 xhci-hcd\n
|
||||
A: maxchild=12\n
|
||||
A: power/active_duration=7247968\n
|
||||
A: power/autosuspend=0\n
|
||||
A: power/autosuspend_delay_ms=0\n
|
||||
A: power/connected_duration=15109854\n
|
||||
A: power/control=auto\n
|
||||
A: power/level=auto\n
|
||||
A: power/runtime_active_time=7247962\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=7861889\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=1929\n
|
||||
A: version= 2.00\n
|
||||
|
||||
P: /devices/pci0000:00/0000:00:14.0
|
||||
E: DRIVER=xhci_hcd
|
||||
E: ID_AUTOSUSPEND=1
|
||||
E: ID_MODEL_FROM_DATABASE=Alder Lake PCH USB 3.2 xHCI Host Controller
|
||||
E: ID_PATH=pci-0000:00:14.0
|
||||
E: ID_PATH_TAG=pci-0000_00_14_0
|
||||
E: ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
|
||||
E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI
|
||||
E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
|
||||
E: ID_VENDOR_FROM_DATABASE=Intel Corporation
|
||||
E: MODALIAS=pci:v00008086d000051EDsv0000144Dsd0000C1D9bc0Csc03i30
|
||||
E: PCI_CLASS=C0330
|
||||
E: PCI_ID=8086:51ED
|
||||
E: PCI_SLOT_NAME=0000:00:14.0
|
||||
E: PCI_SUBSYS_ID=144D:C1D9
|
||||
E: SUBSYSTEM=pci
|
||||
A: ari_enabled=0\n
|
||||
A: broken_parity_status=0\n
|
||||
A: class=0x0c0330\n
|
||||
H: config=8680ED51060490020130030C00008000040012016000000000000000000000000000000000000000000000004D14D9C1000000007000000000000000FF010000FD0134A089C27F8000000000000000003F6DD80F000000000000000000000000316000000000000000000000000000000180C2C10800000000000000000000000590B7001804E0FE000000000000000009B014F01000400100000000C10A080000080E00001800008F50020000010000090000018680C00009001014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B50F110112000000
|
||||
A: consistent_dma_mask_bits=64\n
|
||||
A: d3cold_allowed=1\n
|
||||
A: dbc=disabled\n
|
||||
A: dbc_bInterfaceProtocol=01\n
|
||||
A: dbc_bcdDevice=0010\n
|
||||
A: dbc_idProduct=0010\n
|
||||
A: dbc_idVendor=1d6b\n
|
||||
A: dbc_poll_interval_ms=64\n
|
||||
A: device=0x51ed\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:56
|
||||
A: index=5\n
|
||||
A: irq=131\n
|
||||
A: label=Onboard - Other\n
|
||||
A: local_cpulist=0-11\n
|
||||
A: local_cpus=fff\n
|
||||
A: modalias=pci:v00008086d000051EDsv0000144Dsd0000C1D9bc0Csc03i30\n
|
||||
A: msi_bus=1\n
|
||||
A: msi_irqs/131=msi\n
|
||||
A: msi_irqs/132=msi\n
|
||||
A: msi_irqs/133=msi\n
|
||||
A: msi_irqs/134=msi\n
|
||||
A: msi_irqs/135=msi\n
|
||||
A: msi_irqs/136=msi\n
|
||||
A: msi_irqs/137=msi\n
|
||||
A: msi_irqs/138=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 256 port bw ctx arrays 0 0 256 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 8 9 2112 9\nxHCI ring segments 33 33 4096 33\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/control=auto\n
|
||||
A: power/runtime_active_time=7261537\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=7861354\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=0x0000006001120000 0x000000600112ffff 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=0x01\n
|
||||
A: subsystem_device=0xc1d9\n
|
||||
A: subsystem_vendor=0x144d\n
|
||||
A: vendor=0x8086\n
|
||||
|
||||
Binary file not shown.
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/python3
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import traceback
|
||||
import sys
|
||||
@@ -27,10 +27,14 @@ 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)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_CLEAR)
|
||||
|
||||
d.open_sync()
|
||||
|
||||
print("Clear")
|
||||
d.clear_storage_sync()
|
||||
print("Clear done")
|
||||
|
||||
template = FPrint.Print.new(d)
|
||||
|
||||
def enroll_progress(*args):
|
||||
|
||||
+249
-361
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/python3
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import traceback
|
||||
import sys
|
||||
|
||||
Binary file not shown.
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/python3
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import traceback
|
||||
import sys
|
||||
|
||||
+315
-103
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -0,0 +1,96 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
import traceback
|
||||
import sys
|
||||
import gi
|
||||
|
||||
gi.require_version('FPrint', '2.0')
|
||||
from gi.repository import FPrint, GLib
|
||||
|
||||
# Exit with error on any exception, included those happening in async callbacks
|
||||
sys.excepthook = lambda *args: (traceback.print_exception(*args), sys.exit(1))
|
||||
|
||||
ctx = GLib.main_context_default()
|
||||
|
||||
c = FPrint.Context()
|
||||
c.enumerate()
|
||||
devices = c.get_devices()
|
||||
|
||||
d = devices[0]
|
||||
del devices
|
||||
|
||||
assert d.get_driver() == "mafpmoc"
|
||||
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 d.has_feature(FPrint.DeviceFeature.STORAGE_CLEAR)
|
||||
|
||||
d.open_sync()
|
||||
|
||||
d.clear_storage_sync()
|
||||
|
||||
template = FPrint.Print.new(d)
|
||||
|
||||
def enroll_progress(*args):
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NEEDED
|
||||
print('enroll progress: ' + str(args))
|
||||
|
||||
def identify_done(dev, res):
|
||||
global identified, identify_match
|
||||
|
||||
identified = True
|
||||
identify_match, identify_print = dev.identify_finish(res)
|
||||
print('indentification_done. match:', identify_match.get_description(),
|
||||
'print:', identify_print.get_description())
|
||||
assert identify_match.equal(identify_print)
|
||||
|
||||
# List, enroll, list, verify, identify, delete
|
||||
print("enrolling")
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
enrolled = 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(enrolled)
|
||||
print("verifying")
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
verify_res, verify_print = d.verify_sync(enrolled)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
print("verify done")
|
||||
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')
|
||||
identify_match = None
|
||||
d.identify(deserialized_prints, callback=identify_done)
|
||||
del deserialized_prints
|
||||
|
||||
while not identified:
|
||||
ctx.iteration(True)
|
||||
|
||||
assert identify_match.equal(enrolled)
|
||||
|
||||
print("deleting")
|
||||
d.delete_print_sync(enrolled)
|
||||
print("delete done")
|
||||
|
||||
del enrolled
|
||||
|
||||
d.close_sync()
|
||||
|
||||
del d
|
||||
del c
|
||||
@@ -0,0 +1,375 @@
|
||||
P: /devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-2/1-2.1
|
||||
N: bus/usb/001/013=12011001000000087432128000010102030109022700010100A0320904000003FF010100070583024000010705030240000107058203100001
|
||||
E: DEVNAME=/dev/bus/usb/001/013
|
||||
E: DEVTYPE=usb_device
|
||||
E: DRIVER=usb
|
||||
E: PRODUCT=3274/8012/100
|
||||
E: TYPE=0/0/0
|
||||
E: BUSNUM=001
|
||||
E: DEVNUM=013
|
||||
E: MAJOR=189
|
||||
E: MINOR=12
|
||||
E: SUBSYSTEM=usb
|
||||
E: ID_VENDOR=MicroarrayTechnology
|
||||
E: ID_VENDOR_ENC=MicroarrayTechnology
|
||||
E: ID_VENDOR_ID=3274
|
||||
E: ID_MODEL=MAFP_General_Device
|
||||
E: ID_MODEL_ENC=MAFP\x20General\x20Device\x20
|
||||
E: ID_MODEL_ID=8012
|
||||
E: ID_REVISION=0100
|
||||
E: ID_SERIAL=MicroarrayTechnology_MAFP_General_Device_1120031604020321
|
||||
E: ID_SERIAL_SHORT=1120031604020321
|
||||
E: ID_BUS=usb
|
||||
E: ID_USB_INTERFACES=:ff0101:
|
||||
E: ID_PATH=pci-0000:02:00.0-usb-0:2.1
|
||||
E: ID_PATH_TAG=pci-0000_02_00_0-usb-0_2_1
|
||||
E: ID_FOR_SEAT=usb-pci-0000_02_00_0-usb-0_2_1
|
||||
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=0100\n
|
||||
A: bmAttributes=a0\n
|
||||
A: busnum=1\n
|
||||
A: configuration=
|
||||
H: descriptors=12011001000000087432128000010102030109022700010100A0320904000003FF010100070583024000010705030240000107058203100001
|
||||
A: dev=189:12\n
|
||||
A: devnum=13\n
|
||||
A: devpath=2.1\n
|
||||
L: driver=../../../../../../../bus/usb/drivers/usb
|
||||
A: idProduct=8012\n
|
||||
A: idVendor=3274\n
|
||||
A: ltm_capable=no\n
|
||||
A: manufacturer=MicroarrayTechnology\n
|
||||
A: maxchild=0\n
|
||||
L: port=../1-2:1.0/1-2-port1
|
||||
A: power/active_duration=28368880\n
|
||||
A: power/async=enabled\n
|
||||
A: power/autosuspend=2\n
|
||||
A: power/autosuspend_delay_ms=2000\n
|
||||
A: power/connected_duration=28368880\n
|
||||
A: power/control=on\n
|
||||
A: power/level=on\n
|
||||
A: power/persist=1\n
|
||||
A: power/runtime_active_kids=0\n
|
||||
A: power/runtime_active_time=28368091\n
|
||||
A: power/runtime_enabled=forbidden\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=0\n
|
||||
A: power/runtime_usage=2\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=MAFP General Device \n
|
||||
A: quirks=0x0\n
|
||||
A: removable=unknown\n
|
||||
A: rx_lanes=1\n
|
||||
A: serial=1120031604020321\n
|
||||
A: speed=12\n
|
||||
A: tx_lanes=1\n
|
||||
A: urbnum=3289\n
|
||||
A: version= 1.10\n
|
||||
|
||||
P: /devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-2
|
||||
N: bus/usb/001/003=12011001090000080F0E020000010102000109021900010101E000090400000109000001070581030100FF
|
||||
E: DEVNAME=/dev/bus/usb/001/003
|
||||
E: DEVTYPE=usb_device
|
||||
E: DRIVER=usb
|
||||
E: PRODUCT=e0f/2/100
|
||||
E: TYPE=9/0/0
|
||||
E: BUSNUM=001
|
||||
E: DEVNUM=003
|
||||
E: MAJOR=189
|
||||
E: MINOR=2
|
||||
E: SUBSYSTEM=usb
|
||||
E: ID_VENDOR=VMware__Inc.
|
||||
E: ID_VENDOR_ENC=VMware\x2c\x20Inc.
|
||||
E: ID_VENDOR_ID=0e0f
|
||||
E: ID_MODEL=VMware_Virtual_USB_Hub
|
||||
E: ID_MODEL_ENC=VMware\x20Virtual\x20USB\x20Hub
|
||||
E: ID_MODEL_ID=0002
|
||||
E: ID_REVISION=0100
|
||||
E: ID_SERIAL=VMware__Inc._VMware_Virtual_USB_Hub
|
||||
E: ID_BUS=usb
|
||||
E: ID_USB_INTERFACES=:090000:
|
||||
E: ID_VENDOR_FROM_DATABASE=VMware, Inc.
|
||||
E: ID_MODEL_FROM_DATABASE=Virtual USB Hub
|
||||
E: ID_PATH=pci-0000:02:00.0-usb-0:2
|
||||
E: ID_PATH_TAG=pci-0000_02_00_0-usb-0_2
|
||||
E: ID_FOR_SEAT=usb-pci-0000_02_00_0-usb-0_2
|
||||
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=00\n
|
||||
A: bDeviceSubClass=00\n
|
||||
A: bMaxPacketSize0=8\n
|
||||
A: bMaxPower=0mA\n
|
||||
A: bNumConfigurations=1\n
|
||||
A: bNumInterfaces= 1\n
|
||||
A: bcdDevice=0100\n
|
||||
A: bmAttributes=e0\n
|
||||
A: busnum=1\n
|
||||
A: configuration=VMware, Inc.\n
|
||||
H: descriptors=12011001090000080F0E020000010102000109021900010101E000090400000109000001070581030100FF
|
||||
A: dev=189:2\n
|
||||
A: devnum=3\n
|
||||
A: devpath=2\n
|
||||
L: driver=../../../../../../bus/usb/drivers/usb
|
||||
A: idProduct=0002\n
|
||||
A: idVendor=0e0f\n
|
||||
A: ltm_capable=no\n
|
||||
A: manufacturer=VMware, Inc.\n
|
||||
A: maxchild=7\n
|
||||
L: port=../1-0:1.0/usb1-port2
|
||||
A: power/active_duration=68737416\n
|
||||
A: power/async=enabled\n
|
||||
A: power/autosuspend=0\n
|
||||
A: power/autosuspend_delay_ms=0\n
|
||||
A: power/connected_duration=352042384\n
|
||||
A: power/control=auto\n
|
||||
A: power/level=auto\n
|
||||
A: power/runtime_active_kids=1\n
|
||||
A: power/runtime_active_time=68737343\n
|
||||
A: power/runtime_enabled=enabled\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=283304757\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=VMware Virtual USB Hub\n
|
||||
A: quirks=0x0\n
|
||||
A: removable=unknown\n
|
||||
A: rx_lanes=1\n
|
||||
A: speed=12\n
|
||||
A: tx_lanes=1\n
|
||||
A: urbnum=2459\n
|
||||
A: version= 1.10\n
|
||||
|
||||
P: /devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1
|
||||
N: bus/usb/001/001=12011001090000406B1D010005060302010109021900010100E000090400000109000000070581030200FF
|
||||
E: DEVNAME=/dev/bus/usb/001/001
|
||||
E: DEVTYPE=usb_device
|
||||
E: DRIVER=usb
|
||||
E: PRODUCT=1d6b/1/605
|
||||
E: TYPE=9/0/0
|
||||
E: BUSNUM=001
|
||||
E: DEVNUM=001
|
||||
E: MAJOR=189
|
||||
E: MINOR=0
|
||||
E: SUBSYSTEM=usb
|
||||
E: ID_VENDOR=Linux_6.5.0-27-generic_uhci_hcd
|
||||
E: ID_VENDOR_ENC=Linux\x206.5.0-27-generic\x20uhci_hcd
|
||||
E: ID_VENDOR_ID=1d6b
|
||||
E: ID_MODEL=UHCI_Host_Controller
|
||||
E: ID_MODEL_ENC=UHCI\x20Host\x20Controller
|
||||
E: ID_MODEL_ID=0001
|
||||
E: ID_REVISION=0605
|
||||
E: ID_SERIAL=Linux_6.5.0-27-generic_uhci_hcd_UHCI_Host_Controller_0000:02:00.0
|
||||
E: ID_SERIAL_SHORT=0000:02:00.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=1.1 root hub
|
||||
E: ID_PATH=pci-0000:02:00.0
|
||||
E: ID_PATH_TAG=pci-0000_02_00_0
|
||||
E: ID_FOR_SEAT=usb-pci-0000_02_00_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=0605\n
|
||||
A: bmAttributes=e0\n
|
||||
A: busnum=1\n
|
||||
A: configuration=
|
||||
H: descriptors=12011001090000406B1D010005060302010109021900010100E000090400000109000000070581030200FF
|
||||
A: dev=189:0\n
|
||||
A: devnum=1\n
|
||||
A: devpath=0\n
|
||||
L: driver=../../../../../bus/usb/drivers/usb
|
||||
A: idProduct=0001\n
|
||||
A: idVendor=1d6b\n
|
||||
A: interface_authorized_default=1\n
|
||||
A: ltm_capable=no\n
|
||||
A: manufacturer=Linux 6.5.0-27-generic uhci_hcd\n
|
||||
A: maxchild=2\n
|
||||
A: power/active_duration=352042808\n
|
||||
A: power/async=enabled\n
|
||||
A: power/autosuspend=0\n
|
||||
A: power/autosuspend_delay_ms=0\n
|
||||
A: power/connected_duration=352042820\n
|
||||
A: power/control=auto\n
|
||||
A: power/level=auto\n
|
||||
A: power/runtime_active_kids=2\n
|
||||
A: power/runtime_active_time=352042818\n
|
||||
A: power/runtime_enabled=enabled\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=0\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=UHCI Host Controller\n
|
||||
A: quirks=0x0\n
|
||||
A: removable=unknown\n
|
||||
A: rx_lanes=1\n
|
||||
A: serial=0000:02:00.0\n
|
||||
A: speed=12\n
|
||||
A: tx_lanes=1\n
|
||||
A: urbnum=157\n
|
||||
A: version= 1.10\n
|
||||
|
||||
P: /devices/pci0000:00/0000:00:11.0/0000:02:00.0
|
||||
E: DRIVER=uhci_hcd
|
||||
E: PCI_CLASS=C0300
|
||||
E: PCI_ID=15AD:0774
|
||||
E: PCI_SUBSYS_ID=15AD:1976
|
||||
E: PCI_SLOT_NAME=0000:02:00.0
|
||||
E: MODALIAS=pci:v000015ADd00000774sv000015ADsd00001976bc0Csc03i00
|
||||
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=UHCI
|
||||
E: ID_VENDOR_FROM_DATABASE=VMware
|
||||
E: ID_MODEL_FROM_DATABASE=USB1.1 UHCI Controller
|
||||
A: acpi_index=16777728\n
|
||||
A: ari_enabled=0\n
|
||||
A: broken_parity_status=0\n
|
||||
A: class=0x0c0300\n
|
||||
H: config=AD157407050090020000030C0040000000000000000000000000000000000000812000000000000000000000AD1576190000000040000000000000000A010000130006030000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
A: consistent_dma_mask_bits=32\n
|
||||
A: d3cold_allowed=0\n
|
||||
A: device=0x0774\n
|
||||
A: dma_mask_bits=32\n
|
||||
L: driver=../../../../bus/pci/drivers/uhci_hcd
|
||||
A: driver_override=(null)\n
|
||||
A: enable=1\n
|
||||
L: firmware_node=../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:05/device:06
|
||||
A: irq=18\n
|
||||
A: label=usb\n
|
||||
A: local_cpulist=0-1\n
|
||||
A: local_cpus=00000000,00000000,00000000,00000003\n
|
||||
A: modalias=pci:v000015ADd00000774sv000015ADsd00001976bc0Csc03i00\n
|
||||
A: msi_bus=1\n
|
||||
A: numa_node=-1\n
|
||||
A: pools=poolinfo - 0.1\nuhci_qh 18 32 128 1\nuhci_td 11 192 64 3\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 3 32 128 1\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=352043941\n
|
||||
A: power/runtime_enabled=forbidden\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=0\n
|
||||
A: power/runtime_usage=2\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: reset_method=af_flr bus\n
|
||||
A: resource=0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000002080 0x000000000000209f 0x0000000000040101\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=0x00\n
|
||||
A: subsystem_device=0x1976\n
|
||||
A: subsystem_vendor=0x15ad\n
|
||||
A: vendor=0x15ad\n
|
||||
|
||||
P: /devices/pci0000:00/0000:00:11.0
|
||||
E: PCI_CLASS=60401
|
||||
E: PCI_ID=15AD:0790
|
||||
E: PCI_SUBSYS_ID=15AD:0790
|
||||
E: PCI_SLOT_NAME=0000:00:11.0
|
||||
E: MODALIAS=pci:v000015ADd00000790sv000015ADsd00000790bc06sc04i01
|
||||
E: SUBSYSTEM=pci
|
||||
E: ID_PCI_CLASS_FROM_DATABASE=Bridge
|
||||
E: ID_PCI_SUBCLASS_FROM_DATABASE=PCI bridge
|
||||
E: ID_PCI_INTERFACE_FROM_DATABASE=Subtractive decode
|
||||
E: ID_VENDOR_FROM_DATABASE=VMware
|
||||
E: ID_MODEL_FROM_DATABASE=PCI bridge
|
||||
A: ari_enabled=0\n
|
||||
A: broken_parity_status=0\n
|
||||
A: class=0x060401\n
|
||||
H: config=AD1590070700900202010406084001000000000000000000000202442030800250FDF0FDB1E7F1E70000000000000000000000004000000000000000FF0006000D000000AD15900700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
A: consistent_dma_mask_bits=32\n
|
||||
A: d3cold_allowed=0\n
|
||||
A: device=0x0790\n
|
||||
A: dma_mask_bits=32\n
|
||||
A: driver_override=(null)\n
|
||||
A: enable=1\n
|
||||
L: firmware_node=../../LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:05
|
||||
A: irq=0\n
|
||||
A: local_cpulist=0-1\n
|
||||
A: local_cpus=00000000,00000000,00000000,00000003\n
|
||||
A: modalias=pci:v000015ADd00000790sv000015ADsd00000790bc06sc04i01\n
|
||||
A: msi_bus=1\n
|
||||
A: numa_node=-1\n
|
||||
A: power/async=enabled\n
|
||||
A: power/control=on\n
|
||||
A: power/runtime_active_kids=5\n
|
||||
A: power/runtime_active_time=352044194\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=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: power_state=D0\n
|
||||
A: resource=0x0000000000000000 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\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000002000 0x0000000000003fff 0x0000000000000100\n0x00000000fd500000 0x00000000fdffffff 0x0000000000000200\n0x00000000e7b00000 0x00000000e7ffffff 0x0000000000102201\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n
|
||||
A: revision=0x02\n
|
||||
A: secondary_bus_number=2\n
|
||||
A: subordinate_bus_number=2\n
|
||||
A: subsystem_device=0x0790\n
|
||||
A: subsystem_vendor=0x15ad\n
|
||||
A: vendor=0x15ad\n
|
||||
A: waiting_for_supplier=0\n
|
||||
|
||||
+70
-38
@@ -10,9 +10,10 @@ envs.set('G_TEST_SRCDIR', meson.current_source_dir())
|
||||
envs.set('G_TEST_BUILDDIR', meson.current_build_dir())
|
||||
envs.prepend('LD_LIBRARY_PATH', meson.project_build_root() / 'libfprint')
|
||||
|
||||
# Set FP_DEVICE_EMULATION so that drivers can adapt (e.g. to use fixed
|
||||
# Set fp_device_emulation_env_var so that drivers can adapt (e.g. to use fixed
|
||||
# random numbers rather than proper ones)
|
||||
envs.set('FP_DEVICE_EMULATION', '1')
|
||||
fp_device_emulation_env_var = 'FP_DEVICE_EMULATION'
|
||||
envs.set(fp_device_emulation_env_var, '1')
|
||||
|
||||
# Set a colon-separated list of native drivers we enable in tests
|
||||
envs.set('FP_DRIVERS_ALLOWLIST', ':'.join([
|
||||
@@ -32,34 +33,38 @@ installed_tests_execdir = libexecdir / 'installed-tests' / versioned_libname
|
||||
installed_tests_testdir = datadir / 'installed-tests' / versioned_libname
|
||||
installed_tests_libdir = libdir
|
||||
|
||||
drivers_tests = [
|
||||
'aes2501',
|
||||
'aes3500',
|
||||
'elan',
|
||||
'elan-cobo',
|
||||
'elanmoc',
|
||||
'elanspi',
|
||||
'synaptics',
|
||||
'upektc_img',
|
||||
'upektc_img-tcs1s',
|
||||
'uru4000-msv2',
|
||||
'uru4000-4500',
|
||||
'vfs0050',
|
||||
'vfs301',
|
||||
'vfs5011',
|
||||
'vfs7552',
|
||||
'goodixmoc',
|
||||
'nb1010',
|
||||
'egis0570',
|
||||
'egismoc',
|
||||
'egismoc-05a1',
|
||||
'egismoc-0586',
|
||||
'egismoc-0587',
|
||||
'fpcmoc',
|
||||
'realtek',
|
||||
'realtek-5816',
|
||||
'focaltech_moc',
|
||||
]
|
||||
drivers_tests = {
|
||||
'aes2501': {},
|
||||
'aes3500': {},
|
||||
'elan': {},
|
||||
'elan-cobo': {},
|
||||
'elanmoc': {},
|
||||
'elanspi': {},
|
||||
'synaptics': {},
|
||||
'upektc_img': {},
|
||||
'upektc_img-tcs1s': {},
|
||||
'uru4000-msv2': {},
|
||||
'uru4000-4500': {},
|
||||
'vfs0050': {},
|
||||
'vfs301': {},
|
||||
'vfs5011': {},
|
||||
'vfs7552': {},
|
||||
'goodixmoc': {},
|
||||
'nb1010': {},
|
||||
'egis0570': {},
|
||||
'egismoc': {},
|
||||
'egis_etu905': {},
|
||||
'egismoc-05a1': {},
|
||||
'egismoc-0586': {},
|
||||
'egismoc-0587': {},
|
||||
'fpcmoc': {},
|
||||
'realtek': {},
|
||||
'realtek-5816': {},
|
||||
'focaltech_moc': { 'timeout': 30 },
|
||||
'focaltech_moc-6553': {},
|
||||
'mafpmoc': {},
|
||||
'secugen': {},
|
||||
}
|
||||
|
||||
if get_option('introspection')
|
||||
conf = configuration_data()
|
||||
@@ -70,6 +75,25 @@ if get_option('introspection')
|
||||
output: 'create-driver-test.py')
|
||||
endif
|
||||
|
||||
test_emulation_lib = shared_library('fprint-test-emulation',
|
||||
'test-emulation.c',
|
||||
dependencies: libfprint_private_dep,
|
||||
install: installed_tests,
|
||||
install_dir: installed_tests_execdir,
|
||||
)
|
||||
|
||||
# Paths where the test-emulation helper may be loaded via dlopen
|
||||
test_emulation = configuration_data()
|
||||
test_emulation.set_quoted('FPI_EMULATION_ENV_VAR',
|
||||
fp_device_emulation_env_var)
|
||||
test_emulation.set_quoted('FPI_EMULATION_HELPER_BUILDDIR',
|
||||
meson.project_build_root() / 'tests')
|
||||
test_emulation.set_quoted('FPI_EMULATION_HELPER_INSTALLDIR',
|
||||
libexecdir / 'installed-tests' / versioned_libname)
|
||||
test_emulation.set_quoted('FPI_EMULATION_HELPER_MODULE',
|
||||
fs.name(test_emulation_lib.full_path()))
|
||||
configure_file(output: 'fpi-test-emulation.h', configuration: test_emulation)
|
||||
|
||||
env_parser_cmd = '''
|
||||
import os;
|
||||
print(" ".join([f"{k}={v}" for k, v in os.environ.items()
|
||||
@@ -129,7 +153,10 @@ if get_option('introspection')
|
||||
python3,
|
||||
args: ut_args,
|
||||
suite: ut_suite,
|
||||
depends: libfprint_typelib,
|
||||
depends: [
|
||||
libfprint_typelib,
|
||||
test_emulation_lib,
|
||||
],
|
||||
env: envs,
|
||||
)
|
||||
endforeach
|
||||
@@ -166,7 +193,7 @@ if get_option('introspection')
|
||||
endforeach
|
||||
|
||||
driver_tests_enabled = false
|
||||
foreach driver_test: drivers_tests
|
||||
foreach driver_test, args: drivers_tests
|
||||
driver_name = driver_test.split('-')[0]
|
||||
driver_envs = envs
|
||||
driver_envs.set('FP_DRIVERS_ALLOWLIST', driver_name)
|
||||
@@ -182,8 +209,11 @@ if get_option('introspection')
|
||||
],
|
||||
env: driver_envs,
|
||||
suite: ['drivers'],
|
||||
timeout: 15,
|
||||
depends: libfprint_typelib,
|
||||
timeout: args.get('timeout', 15),
|
||||
depends: [
|
||||
libfprint_typelib,
|
||||
test_emulation_lib,
|
||||
],
|
||||
)
|
||||
|
||||
if installed_tests
|
||||
@@ -322,14 +352,16 @@ foreach test_name: unit_tests
|
||||
endforeach
|
||||
|
||||
# Run udev rule generator with fatal warnings
|
||||
envs.set('UDEV_HWDB', udev_hwdb.full_path())
|
||||
envs.set('UDEV_HWDB_CHECK_CONTENTS', default_drivers_are_enabled ? '1' : '0')
|
||||
envs.set('G_MESSAGES_DEBUG', '')
|
||||
hwdb_envs = envs
|
||||
hwdb_envs.set('UDEV_HWDB', udev_hwdb.full_path())
|
||||
hwdb_envs.set('UDEV_HWDB_CHECK_CONTENTS', default_drivers_are_enabled ? '1' : '0')
|
||||
hwdb_envs.set('G_MESSAGES_DEBUG', '')
|
||||
test('udev-hwdb',
|
||||
find_program('test-generated-hwdb.sh'),
|
||||
depends: udev_hwdb,
|
||||
suite: ['data', 'no-valgrind'],
|
||||
env: envs)
|
||||
env: hwdb_envs,
|
||||
)
|
||||
|
||||
appstreamcli = find_program('appstreamcli', required: false)
|
||||
if appstreamcli.found()
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/python3
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import traceback
|
||||
import sys
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/python3
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import traceback
|
||||
import sys
|
||||
|
||||
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 112 KiB |
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/python3
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import gi
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
* Copyright (C) 2026 Canonical, Ltd.
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include "fpi-device.h"
|
||||
#include "fpi-test-emulation.h"
|
||||
|
||||
gboolean
|
||||
(fpi_device_emulation_mode_enabled) (FpDevice *device)
|
||||
{
|
||||
static gsize emulation_mode = 0;
|
||||
|
||||
if (g_once_init_enter (&emulation_mode))
|
||||
g_once_init_leave (&emulation_mode,
|
||||
g_strcmp0 (g_getenv (FPI_EMULATION_ENV_VAR), "1") == 0 ?
|
||||
TRUE : G_MAXSIZE);
|
||||
|
||||
return emulation_mode == TRUE;
|
||||
}
|
||||
@@ -17,6 +17,8 @@
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
typedef enum {
|
||||
|
||||
@@ -95,3 +95,24 @@
|
||||
fun:realloc
|
||||
obj:/usr/lib/*/libpython3*.so.*
|
||||
}
|
||||
|
||||
{
|
||||
ignore__pygobject_possible_leaks
|
||||
Memcheck:Leak
|
||||
match-leak-kinds: possible
|
||||
...
|
||||
obj:/usr/lib*/python*/site-packages/gi/_gi.cpython-*.so
|
||||
obj:/usr/lib*/libpython3.*.so.*
|
||||
}
|
||||
|
||||
{
|
||||
ignore__pygobject_instance_leaks
|
||||
Memcheck:Leak
|
||||
match-leak-kinds: definite
|
||||
...
|
||||
fun:g_type_create_instance
|
||||
fun:gi_info_new_full
|
||||
...
|
||||
obj:/usr/lib*/python*/site-packages/gi/_gi.cpython-*.so
|
||||
obj:/usr/lib*/libpython3.*.so.*
|
||||
}
|
||||
|
||||
@@ -123,13 +123,17 @@ class VirtualDeviceBase(unittest.TestCase):
|
||||
del self.ctx
|
||||
super().tearDown()
|
||||
|
||||
def sleep_multiplier(self):
|
||||
return 5 if 'UNDER_VALGRIND' in os.environ else 1
|
||||
|
||||
def wait_timeout(self, interval):
|
||||
multiplier = self.sleep_multiplier()
|
||||
timeout_reached = False
|
||||
def on_timeout():
|
||||
nonlocal timeout_reached
|
||||
timeout_reached = True
|
||||
|
||||
GLib.timeout_add(interval, on_timeout)
|
||||
GLib.timeout_add(interval * multiplier, on_timeout)
|
||||
while not timeout_reached:
|
||||
ctx.iteration(False)
|
||||
|
||||
@@ -183,8 +187,7 @@ class VirtualDeviceBase(unittest.TestCase):
|
||||
|
||||
def send_sleep(self, interval):
|
||||
self.assertGreater(interval, 0)
|
||||
multiplier = 5 if 'UNDER_VALGRIND' in os.environ else 1
|
||||
self.send_command('SLEEP', interval * multiplier)
|
||||
self.send_command('SLEEP', interval * self.sleep_multiplier())
|
||||
|
||||
def enroll_print(self, nick, finger, username='testuser', retry_scan=-1):
|
||||
self._enrolled = None
|
||||
|
||||
Reference in New Issue
Block a user