From a88582761f43b379548308134f223651ac366567 Mon Sep 17 00:00:00 2001 From: huan_huang Date: Tue, 9 Jul 2024 14:27:48 +0800 Subject: [PATCH] realtek: add support for rts5816 Signed-off-by: huan_huang --- data/autosuspend.hwdb | 1 + libfprint/drivers/realtek/realtek.c | 300 +++++++++++++++++++++------- libfprint/drivers/realtek/realtek.h | 96 +++++---- tests/meson.build | 3 +- tests/realtek-5816/custom.pcapng | Bin 0 -> 30968 bytes tests/realtek-5816/custom.py | 110 ++++++++++ tests/realtek-5816/device | 250 +++++++++++++++++++++++ tests/realtek/custom.pcapng | Bin 29128 -> 30968 bytes tests/realtek/device | 72 +++---- 9 files changed, 695 insertions(+), 137 deletions(-) create mode 100644 tests/realtek-5816/custom.pcapng create mode 100755 tests/realtek-5816/custom.py create mode 100644 tests/realtek-5816/device diff --git a/data/autosuspend.hwdb b/data/autosuspend.hwdb index adeec541..73345574 100644 --- a/data/autosuspend.hwdb +++ b/data/autosuspend.hwdb @@ -227,6 +227,7 @@ usb:v298Dp1010* # Supported by libfprint driver realtek usb:v0BDAp5813* +usb:v0BDAp5816* ID_AUTOSUSPEND=1 ID_PERSIST=0 diff --git a/libfprint/drivers/realtek/realtek.c b/libfprint/drivers/realtek/realtek.c index 45322908..28380901 100644 --- a/libfprint/drivers/realtek/realtek.c +++ b/libfprint/drivers/realtek/realtek.c @@ -28,6 +28,7 @@ G_DEFINE_TYPE (FpiDeviceRealtek, fpi_device_realtek, FP_TYPE_DEVICE) static const FpIdEntry id_table[] = { { .vid = 0x0bda, .pid = 0x5813, }, + { .vid = 0x0bda, .pid = 0x5816, }, { .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */ }; @@ -92,6 +93,50 @@ fp_task_ssm_generic_cb (FpiDeviceRealtek *self, fpi_ssm_next_state (self->task_ssm); } +static void +fp_get_device_info_cb (FpiDeviceRealtek *self, + uint8_t *buffer_in, + GError *error) +{ + if (error) + { + fpi_ssm_mark_failed (self->task_ssm, error); + return; + } + + self->template_len = TEMPLATE_LEN_COMMON; + + fpi_ssm_next_state (self->task_ssm); +} + +static void +fp_update_template_cb (FpiDeviceRealtek *self, + uint8_t *buffer_in, + GError *error) +{ + if (error) + { + fpi_ssm_mark_failed (self->task_ssm, error); + return; + } + + fpi_ssm_jump_to_state (self->task_ssm, FP_RTK_VERIFY_NUM_STATES); +} + +static void +fp_enroll_commit_cb (FpiDeviceRealtek *self, + uint8_t *buffer_in, + GError *error) +{ + if (error) + { + fpi_ssm_mark_failed (self->task_ssm, error); + return; + } + + fpi_ssm_jump_to_state (self->task_ssm, FP_RTK_ENROLL_NUM_STATES); +} + static void fp_finish_capture_cb (FpiDeviceRealtek *self, uint8_t *buffer_in, @@ -103,8 +148,17 @@ fp_finish_capture_cb (FpiDeviceRealtek *self, return; } - gint capture_status = buffer_in[0]; + /* We hope this polling CMD can be completed before the action is cancelled */ + GCancellable *cancellable = fpi_device_get_cancellable (FP_DEVICE (self)); + if (g_cancellable_is_cancelled (cancellable)) + { + fpi_ssm_mark_failed (self->task_ssm, + fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, + "Action is cancelled!")); + return; + } + gint capture_status = buffer_in[0]; if (capture_status == 0) { fpi_device_report_finger_status_changes (FP_DEVICE (self), @@ -238,7 +292,6 @@ fp_identify_feature_cb (FpiDeviceRealtek *self, } gint in_status = buffer_in[0]; - if (in_status == FP_RTK_CMD_ERR) { fpi_ssm_mark_failed (self->task_ssm, @@ -291,7 +344,7 @@ fp_identify_feature_cb (FpiDeviceRealtek *self, else { fpi_device_identify_report (device, print, match, error); - fpi_ssm_mark_completed (self->task_ssm); + fpi_ssm_jump_to_state (self->task_ssm, FP_RTK_VERIFY_NUM_STATES); } return; } @@ -340,9 +393,9 @@ fp_get_delete_pos_cb (FpiDeviceRealtek *self, for (gint i = 0; i < self->template_num; i++) { - if (buffer_in[i * TEMPLATE_LEN] != 0) + if (buffer_in[i * self->template_len] != 0) { - memcpy (temp_userid, buffer_in + i * TEMPLATE_LEN + UID_OFFSET, DEFAULT_UID_LEN); + memcpy (temp_userid, buffer_in + i * self->template_len + UID_OFFSET, DEFAULT_UID_LEN); if (g_strcmp0 (fp_print_get_description (print), (const char *) temp_userid) == 0) { self->pos_index = i; @@ -380,10 +433,25 @@ fp_get_enroll_num_cb (FpiDeviceRealtek *self, } static void -fp_get_template_cb (FpiDeviceRealtek *self, - uint8_t *buffer_in, - GError *error) +fp_verify_get_template_cb (FpiDeviceRealtek *self, + uint8_t *buffer_in, + GError *error) { + if (error) + { + fpi_ssm_mark_failed (self->task_ssm, error); + return; + } + + fpi_ssm_next_state (self->task_ssm); +} + +static void +fp_enroll_get_template_cb (FpiDeviceRealtek *self, + uint8_t *buffer_in, + GError *error) +{ + g_autofree guchar *seq_list = NULL; gboolean found = FALSE; if (error) @@ -394,7 +462,7 @@ fp_get_template_cb (FpiDeviceRealtek *self, for (gint i = 0; i < self->template_num; i++) { - if (buffer_in[i * TEMPLATE_LEN] == 0) + if (buffer_in[i * self->template_len] == 0) { self->pos_index = i; found = TRUE; @@ -425,7 +493,6 @@ fp_check_duplicate_cb (FpiDeviceRealtek *self, } gint in_status = buffer_in[0]; - if (in_status == FP_RTK_CMD_ERR) { fpi_ssm_mark_failed (self->task_ssm, @@ -471,10 +538,10 @@ fp_list_cb (FpiDeviceRealtek *self, for (gint i = 0; i < self->template_num; i++) { - if (buffer_in[i * TEMPLATE_LEN] != 0) + if (buffer_in[i * self->template_len] != 0) { FpPrint *print = NULL; - print = fp_print_from_data (self, buffer_in + i * TEMPLATE_LEN + SUBFACTOR_OFFSET); + print = fp_print_from_data (self, buffer_in + i * self->template_len + SUBFACTOR_OFFSET); g_ptr_array_add (list_result, g_object_ref_sink (print)); found = TRUE; } @@ -518,11 +585,11 @@ parse_status (guint8 *buffer, gint status_type) { switch (status_type) { - case FP_RTK_MSG_PLAINTEXT_NO_STATUS: + case FP_RTK_MSG_NO_STATUS: return 0; break; - case FP_RTK_MSG_PLAINTEXT: + case FP_RTK_MSG_DEFAULT: return buffer[0]; break; @@ -621,13 +688,13 @@ fp_cmd_run_state (FpiSsm *ssm, FpDevice *dev) break; case FP_RTK_CMD_TRANS_DATA: - if (self->cmd_type == FP_RTK_CMD_ONLY) + if (self->cmd_type == FP_RTK_CMD_BULK_ONLY) { fpi_ssm_jump_to_state (ssm, FP_RTK_CMD_GET_STATUS); break; } - if (self->cmd_type == FP_RTK_CMD_WRITE) + if (self->cmd_type == FP_RTK_CMD_BULK_WRITE) { if (self->data_transfer) { @@ -688,10 +755,10 @@ fp_cmd_ssm_done (FpiSsm *ssm, FpDevice *dev, GError *error) } static FpiUsbTransfer * -prepare_transfer (FpDevice *dev, - guint8 *data, - gsize data_len, - GDestroyNotify free_func) +prepare_bulk_transfer (FpDevice *dev, + guint8 *data, + gsize data_len, + GDestroyNotify free_func) { g_autoptr(FpiUsbTransfer) transfer = NULL; @@ -708,29 +775,100 @@ prepare_transfer (FpDevice *dev, return g_steal_pointer (&transfer); } + static void -realtek_sensor_cmd (FpiDeviceRealtek *self, - guint8 *cmd, - guint8 *trans_data, - FpRtkMsgType message_type, - gboolean bwait_data_delay, - SynCmdMsgCallback callback) +fp_ctrl_cmd_cb (FpiUsbTransfer *transfer, + FpDevice *device, + gpointer user_data, + GError *error) +{ + FpiDeviceRealtek *self = FPI_DEVICE_REALTEK (device); + g_autofree CommandData *data = g_steal_pointer (&user_data); + + g_return_if_fail (data != NULL); + + if (error) + { + fpi_ssm_mark_failed (transfer->ssm, error); + return; + } + + if (transfer->direction == G_USB_DEVICE_DIRECTION_HOST_TO_DEVICE) + { + if (data->callback) + data->callback (self, NULL, NULL); + } + else + { + if (transfer->actual_length == 0) + { + fp_info ("Control transfer receive data failed!"); + fpi_ssm_mark_failed (transfer->ssm, + fpi_device_error_new (FP_DEVICE_ERROR_DATA_INVALID)); + return; + } + + if (data->callback) + data->callback (self, transfer->buffer, NULL); + } +} + +static void +rtk_send_ctrl_cmd (FpiDeviceRealtek *self, + struct rtk_cmd_ctrl *ctrl_cmd, + guint8 *cmd_data, + SynCmdMsgCallback callback) +{ + FpiUsbTransfer *transfer = NULL; + g_autofree CommandData *data = g_new0 (CommandData, 1); + + data->callback = callback; + + transfer = fpi_usb_transfer_new (FP_DEVICE (self)); + fpi_usb_transfer_fill_control (transfer, + ctrl_cmd->direction, + G_USB_DEVICE_REQUEST_TYPE_VENDOR, + G_USB_DEVICE_RECIPIENT_DEVICE, + ctrl_cmd->request, + ctrl_cmd->value, + ctrl_cmd->index, + ctrl_cmd->len); + + transfer->ssm = self->task_ssm; + if (ctrl_cmd->direction == G_USB_DEVICE_DIRECTION_DEVICE_TO_HOST && + cmd_data != NULL && ctrl_cmd->len != 0) + memcpy (transfer->buffer, cmd_data, ctrl_cmd->len); + + fpi_usb_transfer_submit (transfer, + CMD_TIMEOUT, + NULL, + fp_ctrl_cmd_cb, + g_steal_pointer (&data)); +} + +static void +rtk_sensor_bulk_cmd (FpiDeviceRealtek *self, + guint8 *cmd, + guint8 *trans_data, + FpRtkMsgType message_type, + gboolean bwait_data_delay, + SynCmdMsgCallback callback) { g_autoptr(FpiUsbTransfer) cmd_transfer = NULL; g_autoptr(FpiUsbTransfer) data_transfer = NULL; CommandData *data = g_new0 (CommandData, 1); - self->cmd_type = GET_CMD_TYPE (cmd[0]); + self->cmd_type = GET_BULK_CMD_TYPE (cmd[0]); self->message_type = message_type; self->trans_data_len = GET_TRANS_DATA_LEN (cmd[11], cmd[10]); self->cmd_cancellable = bwait_data_delay; - cmd_transfer = prepare_transfer (FP_DEVICE (self), cmd, FP_RTK_CMD_TOTAL_LEN, NULL); + cmd_transfer = prepare_bulk_transfer (FP_DEVICE (self), cmd, FP_RTK_CMD_BULK_TOTAL_LEN, NULL); self->cmd_transfer = g_steal_pointer (&cmd_transfer); - if ((self->cmd_type == FP_RTK_CMD_WRITE) && trans_data) + if ((self->cmd_type == FP_RTK_CMD_BULK_WRITE) && trans_data) { - data_transfer = prepare_transfer (FP_DEVICE (self), trans_data, self->trans_data_len, g_free); + data_transfer = prepare_bulk_transfer (FP_DEVICE (self), trans_data, self->trans_data_len, g_free); self->data_transfer = g_steal_pointer (&data_transfer); } @@ -829,34 +967,49 @@ fp_verify_sm_run_state (FpiSsm *ssm, FpDevice *device) switch (fpi_ssm_get_cur_state (ssm)) { + case FP_RTK_VERIFY_GET_TEMPLATE: + g_assert (self->template_num > 0); + + co_get_template.data_len[0] = GET_LEN_L (self->template_len * self->template_num); + co_get_template.data_len[1] = GET_LEN_H (self->template_len * self->template_num); + cmd_buf = (guint8 *) &co_get_template; + rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_verify_get_template_cb); + break; + case FP_RTK_VERIFY_CAPTURE: fpi_device_report_finger_status_changes (device, FP_FINGER_STATUS_NEEDED, FP_FINGER_STATUS_NONE); cmd_buf = (guint8 *) &co_start_capture; - realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 1, fp_task_ssm_generic_cb); + rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb); break; case FP_RTK_VERIFY_FINISH_CAPTURE: cmd_buf = (guint8 *) &co_finish_capture; - realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 1, fp_finish_capture_cb); + rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_finish_capture_cb); break; case FP_RTK_VERIFY_ACCEPT_SAMPLE: co_accept_sample.param[0] = self->fp_purpose; cmd_buf = (guint8 *) &co_accept_sample; - realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT_NO_STATUS, 1, fp_accept_sample_cb); + rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_NO_STATUS, 0, fp_accept_sample_cb); break; case FP_RTK_VERIFY_INDENTIFY_FEATURE: - cmd_buf = (guint8 *) &tls_identify_feature; - realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT_NO_STATUS, 0, fp_identify_feature_cb); + cmd_buf = (guint8 *) &nor_identify_feature; + rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_NO_STATUS, 0, fp_identify_feature_cb); break; case FP_RTK_VERIFY_UPDATE_TEMPLATE: cmd_buf = (guint8 *) &co_update_template; - realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_task_ssm_generic_cb); + rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_update_template_cb); + break; + + case FP_RTK_VERIFY_CANCEL_CAPTURE: + co_cancel_capture.param[0] = self->fp_purpose; + cmd_buf = (guint8 *) &co_cancel_capture; + rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb); break; } } @@ -869,7 +1022,6 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device) FpiDeviceRealtek *self = FPI_DEVICE_REALTEK (device); FpPrint *print = NULL; guint8 *cmd_buf = NULL; - guint8 *trans_id = NULL; GVariant *uid = NULL; GVariant *data = NULL; gsize user_id_len; @@ -880,17 +1032,17 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device) case FP_RTK_ENROLL_GET_TEMPLATE: g_assert (self->template_num > 0); - co_get_template.data_len[0] = GET_LEN_L (TEMPLATE_LEN * self->template_num); - co_get_template.data_len[1] = GET_LEN_H (TEMPLATE_LEN * self->template_num); + co_get_template.data_len[0] = GET_LEN_L (self->template_len * self->template_num); + co_get_template.data_len[1] = GET_LEN_H (self->template_len * self->template_num); cmd_buf = (guint8 *) &co_get_template; - realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_get_template_cb); + rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_enroll_get_template_cb); break; case FP_RTK_ENROLL_BEGIN_POS: - tls_enroll_begin.param[0] = self->pos_index; - cmd_buf = (guint8 *) &tls_enroll_begin; - realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_task_ssm_generic_cb); + nor_enroll_begin.param[0] = self->pos_index; + cmd_buf = (guint8 *) &nor_enroll_begin; + rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb); break; case FP_RTK_ENROLL_CAPTURE: @@ -899,32 +1051,37 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device) FP_FINGER_STATUS_NONE); cmd_buf = (guint8 *) &co_start_capture; - realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 1, fp_task_ssm_generic_cb); + rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb); break; case FP_RTK_ENROLL_FINISH_CAPTURE: cmd_buf = (guint8 *) &co_finish_capture; - realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 1, fp_finish_capture_cb); + rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_finish_capture_cb); break; case FP_RTK_ENROLL_ACCEPT_SAMPLE: co_accept_sample.param[0] = self->fp_purpose; cmd_buf = (guint8 *) &co_accept_sample; - realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT_NO_STATUS, 1, fp_accept_sample_cb); + rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_NO_STATUS, 0, fp_accept_sample_cb); break; case FP_RTK_ENROLL_CHECK_DUPLICATE: cmd_buf = (guint8 *) &co_check_duplicate; - realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT_NO_STATUS, 1, fp_check_duplicate_cb); + rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_NO_STATUS, 0, fp_check_duplicate_cb); break; case FP_RTK_ENROLL_COMMIT: + guint8 *trans_id = NULL; + gint payload_len; + + payload_len = UID_PAYLOAD_LEN_DEFAULT; + fpi_device_get_enroll_data (device, &print); user_id = fpi_print_generate_user_id (print); user_id_len = strlen (user_id); user_id_len = MIN (DEFAULT_UID_LEN, user_id_len); - payload = g_malloc0 (UID_PAYLOAD_LEN); + payload = g_malloc0 (payload_len); memcpy (payload, user_id, user_id_len); trans_id = g_steal_pointer (&payload); @@ -945,10 +1102,18 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device) g_debug ("user_id: %s, finger: 0x%x", user_id, finger); - tls_enroll_commit.param[0] = SUB_FINGER_01; - cmd_buf = (guint8 *) &tls_enroll_commit; - realtek_sensor_cmd (self, cmd_buf, trans_id, FP_RTK_MSG_PLAINTEXT, 0, fp_task_ssm_generic_cb); + nor_enroll_commit.param[0] = SUB_FINGER_01; + nor_enroll_commit.data_len[0] = GET_LEN_L (payload_len); + nor_enroll_commit.data_len[1] = GET_LEN_H (payload_len); + + cmd_buf = (guint8 *) &nor_enroll_commit; + rtk_sensor_bulk_cmd (self, cmd_buf, trans_id, FP_RTK_MSG_DEFAULT, 1, fp_enroll_commit_cb); break; + + case FP_RTK_ENROLL_CANCEL_CAPTURE: + co_cancel_capture.param[0] = self->fp_purpose; + cmd_buf = (guint8 *) &co_cancel_capture; + rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb); } } @@ -960,15 +1125,19 @@ fp_init_sm_run_state (FpiSsm *ssm, FpDevice *device) switch (fpi_ssm_get_cur_state (ssm)) { + case FP_RTK_INIT_GET_DEVICE_INFO: + rtk_send_ctrl_cmd (self, &get_device_info, NULL, fp_get_device_info_cb); + break; + case FP_RTK_INIT_SELECT_OS: co_select_system.param[0] = 0x01; cmd_buf = (guint8 *) &co_select_system; - realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_task_ssm_generic_cb); + rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb); break; case FP_RTK_INIT_GET_ENROLL_NUM: cmd_buf = (guint8 *) &co_get_enroll_num; - realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_get_enroll_num_cb); + rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_get_enroll_num_cb); break; } } @@ -984,17 +1153,17 @@ fp_delete_sm_run_state (FpiSsm *ssm, FpDevice *device) case FP_RTK_DELETE_GET_POS: g_assert (self->template_num > 0); - co_get_template.data_len[0] = GET_LEN_L (TEMPLATE_LEN * self->template_num); - co_get_template.data_len[1] = GET_LEN_H (TEMPLATE_LEN * self->template_num); + co_get_template.data_len[0] = GET_LEN_L (self->template_len * self->template_num); + co_get_template.data_len[1] = GET_LEN_H (self->template_len * self->template_num); cmd_buf = (guint8 *) &co_get_template; - realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_get_delete_pos_cb); + rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_get_delete_pos_cb); break; case FP_RTK_DELETE_PRINT: co_delete_record.param[0] = self->pos_index; cmd_buf = (guint8 *) &co_delete_record; - realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_task_ssm_generic_cb); + rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb); break; } } @@ -1012,17 +1181,14 @@ identify_verify (FpDevice *device) g_assert (current_action == FPI_DEVICE_ACTION_VERIFY || current_action == FPI_DEVICE_ACTION_IDENTIFY); - if (current_action == FPI_DEVICE_ACTION_IDENTIFY) - self->fp_purpose = FP_RTK_PURPOSE_IDENTIFY; - else - self->fp_purpose = FP_RTK_PURPOSE_VERIFY; + self->fp_purpose = FP_RTK_PURPOSE_IDENTIFY; g_assert (!self->task_ssm); self->task_ssm = fpi_ssm_new_full (device, fp_verify_sm_run_state, FP_RTK_VERIFY_NUM_STATES, - FP_RTK_VERIFY_NUM_STATES, + FP_RTK_VERIFY_CANCEL_CAPTURE, "Verify & Identify"); fpi_ssm_start (self->task_ssm, fp_verify_ssm_done); @@ -1042,7 +1208,7 @@ enroll (FpDevice *device) self->task_ssm = fpi_ssm_new_full (device, fp_enroll_sm_run_state, FP_RTK_ENROLL_NUM_STATES, - FP_RTK_ENROLL_NUM_STATES, + FP_RTK_ENROLL_CANCEL_CAPTURE, "Enroll"); fpi_ssm_start (self->task_ssm, fp_enroll_ssm_done); @@ -1167,7 +1333,7 @@ clear_storage (FpDevice *device) G_DEBUG_HERE (); co_delete_record.param[0] = 0xff; cmd_buf = (guint8 *) &co_delete_record; - realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_clear_storage_cb); + rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_clear_storage_cb); } static void @@ -1179,11 +1345,11 @@ list_print (FpDevice *device) G_DEBUG_HERE (); g_assert (self->template_num > 0); - co_get_template.data_len[0] = GET_LEN_L (TEMPLATE_LEN * self->template_num); - co_get_template.data_len[1] = GET_LEN_H (TEMPLATE_LEN * self->template_num); + co_get_template.data_len[0] = GET_LEN_L (self->template_len * self->template_num); + co_get_template.data_len[1] = GET_LEN_H (self->template_len * self->template_num); cmd_buf = (guint8 *) &co_get_template; - realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 1, fp_list_cb); + rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 1, fp_list_cb); } static void diff --git a/libfprint/drivers/realtek/realtek.h b/libfprint/drivers/realtek/realtek.h index 803922fe..5658e056 100644 --- a/libfprint/drivers/realtek/realtek.h +++ b/libfprint/drivers/realtek/realtek.h @@ -30,16 +30,17 @@ #define EP_IN_MAX_BUF_SIZE 2048 -#define FP_RTK_CMD_TOTAL_LEN 12 -#define FP_RTK_CMD_LEN 2 -#define FP_RTK_CMD_PARAM_LEN 4 -#define FP_RTK_CMD_ADDR_LEN 4 -#define FP_RTK_CMD_DATA_LEN 2 +#define FP_RTK_CMD_BULK_TOTAL_LEN 12 +#define FP_RTK_CMD_BULK_LEN 2 +#define FP_RTK_CMD_BULK_PARAM_LEN 4 +#define FP_RTK_CMD_BULK_ADDR_LEN 4 +#define FP_RTK_CMD_BULK_DATA_LEN 2 + +#define TEMPLATE_LEN_COMMON 35 -#define TEMPLATE_LEN 35 #define SUBFACTOR_OFFSET 2 #define UID_OFFSET 3 -#define UID_PAYLOAD_LEN 32 +#define UID_PAYLOAD_LEN_DEFAULT 32 /* Command transfer timeout :ms*/ #define CMD_TIMEOUT 1000 @@ -50,7 +51,7 @@ #define DEFAULT_UID_LEN 28 #define SUB_FINGER_01 0xFF -#define GET_CMD_TYPE(val) ((val & 0xC0) >> 6) +#define GET_BULK_CMD_TYPE(val) ((val & 0xC0) >> 6) #define GET_TRANS_DATA_LEN(len_h, len_l) ((len_h << 8) | len_l) #define GET_LEN_L(total_data_len) ((total_data_len) & 0xff) #define GET_LEN_H(total_data_len) ((total_data_len) >> 8) @@ -67,19 +68,19 @@ typedef struct } CommandData; typedef enum { - FP_RTK_CMD_ONLY = 0, - FP_RTK_CMD_READ, - FP_RTK_CMD_WRITE, + FP_RTK_CMD_BULK_ONLY = 0, + FP_RTK_CMD_BULK_READ, + FP_RTK_CMD_BULK_WRITE, } FpRtkCmdType; typedef enum { - FP_RTK_MSG_PLAINTEXT = 0, - FP_RTK_MSG_PLAINTEXT_NO_STATUS, + FP_RTK_MSG_DEFAULT = 0, + FP_RTK_MSG_NO_STATUS, } FpRtkMsgType; typedef enum { - FP_RTK_PURPOSE_IDENTIFY = 0x01, /* identify before enroll */ - FP_RTK_PURPOSE_VERIFY = 0x02, + FP_RTK_PURPOSE_VERIFY = 0x01, + FP_RTK_PURPOSE_IDENTIFY = 0x02, FP_RTK_PURPOSE_ENROLL = 0x04, } FpRtkPurpose; @@ -107,15 +108,18 @@ typedef enum { FP_RTK_ENROLL_ACCEPT_SAMPLE, FP_RTK_ENROLL_CHECK_DUPLICATE, FP_RTK_ENROLL_COMMIT, + FP_RTK_ENROLL_CANCEL_CAPTURE, FP_RTK_ENROLL_NUM_STATES, } FpRtkEnrollState; typedef enum { - FP_RTK_VERIFY_CAPTURE = 0, + FP_RTK_VERIFY_GET_TEMPLATE = 0, + FP_RTK_VERIFY_CAPTURE, FP_RTK_VERIFY_FINISH_CAPTURE, FP_RTK_VERIFY_ACCEPT_SAMPLE, FP_RTK_VERIFY_INDENTIFY_FEATURE, FP_RTK_VERIFY_UPDATE_TEMPLATE, + FP_RTK_VERIFY_CANCEL_CAPTURE, FP_RTK_VERIFY_NUM_STATES, } FpRtkVerifyState; @@ -126,7 +130,8 @@ typedef enum { } FpRtkDeleteState; typedef enum { - FP_RTK_INIT_SELECT_OS = 0, + FP_RTK_INIT_GET_DEVICE_INFO = 0, + FP_RTK_INIT_SELECT_OS, FP_RTK_INIT_GET_ENROLL_NUM, FP_RTK_INIT_NUM_STATES, } FpRtkInitState; @@ -155,66 +160,87 @@ struct _FpiDeviceRealtek FpRtkPurpose fp_purpose; gint pos_index; gint template_num; + gint template_len; }; -struct realtek_fp_cmd +struct rtk_cmd_bulk { - uint8_t cmd[FP_RTK_CMD_LEN]; - uint8_t param[FP_RTK_CMD_PARAM_LEN]; - uint8_t addr[FP_RTK_CMD_ADDR_LEN]; - uint8_t data_len[FP_RTK_CMD_DATA_LEN]; + uint8_t cmd[FP_RTK_CMD_BULK_LEN]; + uint8_t param[FP_RTK_CMD_BULK_PARAM_LEN]; + uint8_t addr[FP_RTK_CMD_BULK_ADDR_LEN]; + uint8_t data_len[FP_RTK_CMD_BULK_DATA_LEN]; }; -static struct realtek_fp_cmd co_start_capture = { +struct rtk_cmd_ctrl +{ + int direction; + uint8_t request; + uint16_t value; + uint16_t index; + uint16_t len; +}; + +static struct rtk_cmd_ctrl get_device_info = { + .direction = G_USB_DEVICE_DIRECTION_DEVICE_TO_HOST, + .request = 0x07, + .value = 0x000D, + .index = 0x0000, + .len = 0x0008, +}; + +static struct rtk_cmd_bulk co_start_capture = { .cmd = {0x05, 0x05}, }; -static struct realtek_fp_cmd co_finish_capture = { +static struct rtk_cmd_bulk co_finish_capture = { .cmd = {0x45, 0x06}, .data_len = {0x05}, }; -static struct realtek_fp_cmd co_accept_sample = { +static struct rtk_cmd_bulk co_accept_sample = { .cmd = {0x45, 0x08}, .data_len = {0x09}, }; -static struct realtek_fp_cmd tls_identify_feature = { +static struct rtk_cmd_bulk nor_identify_feature = { .cmd = {0x45, 0x22}, .data_len = {0x2A}, }; -static struct realtek_fp_cmd co_get_enroll_num = { +static struct rtk_cmd_bulk co_get_enroll_num = { .cmd = {0x45, 0x0d}, .data_len = {0x02}, }; -static struct realtek_fp_cmd co_get_template = { +static struct rtk_cmd_bulk co_get_template = { .cmd = {0x45, 0x0E}, }; -static struct realtek_fp_cmd tls_enroll_begin = { +static struct rtk_cmd_bulk nor_enroll_begin = { .cmd = {0x05, 0x20}, }; -static struct realtek_fp_cmd co_check_duplicate = { +static struct rtk_cmd_bulk co_check_duplicate = { .cmd = {0x45, 0x10}, .data_len = {0x22}, }; -static struct realtek_fp_cmd tls_enroll_commit = { +static struct rtk_cmd_bulk nor_enroll_commit = { .cmd = {0x85, 0x21}, - .data_len = {0x20}, }; -static struct realtek_fp_cmd co_update_template = { +static struct rtk_cmd_bulk co_update_template = { .cmd = {0x05, 0x11}, }; -static struct realtek_fp_cmd co_delete_record = { +static struct rtk_cmd_bulk co_delete_record = { .cmd = {0x05, 0x0F}, }; -static struct realtek_fp_cmd co_select_system = { +static struct rtk_cmd_bulk co_select_system = { .cmd = {0x05, 0x13}, +}; + +static struct rtk_cmd_bulk co_cancel_capture = { + .cmd = {0x05, 0x07}, }; \ No newline at end of file diff --git a/tests/meson.build b/tests/meson.build index 2b9691ee..bfdf9131 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -56,7 +56,8 @@ drivers_tests = [ 'egismoc-0586', 'egismoc-0587', 'fpcmoc', - 'realtek', + 'realtek', + 'realtek-5816', 'focaltech_moc', ] diff --git a/tests/realtek-5816/custom.pcapng b/tests/realtek-5816/custom.pcapng new file mode 100644 index 0000000000000000000000000000000000000000..579bac6b4b39a49ab68cd3f66dc4bc37c02f11d3 GIT binary patch literal 30968 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 literal 0 HcmV?d00001 diff --git a/tests/realtek-5816/custom.py b/tests/realtek-5816/custom.py new file mode 100755 index 00000000..15a71e2c --- /dev/null +++ b/tests/realtek-5816/custom.py @@ -0,0 +1,110 @@ +#!/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() == "realtek" +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() + +# 1. verify clear storage command, 2. make sure later asserts are good +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 + identified = True + try: + identify_match, identify_print = dev.identify_finish(res) + except gi.repository.GLib.GError as e: + print("Please try again") + else: + print('indentification_done: ', identify_match, identify_print) + assert identify_match.equal(identify_print) + +def start_identify_async(prints): + global identified + print('async identifying') + d.identify(prints, callback=identify_done) + del prints + + while not identified: + ctx.iteration(True) + + identified = False + +# List, enroll, list, verify, identify, delete +print("enrolling") +assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE +p = d.enroll_sync(template, None, enroll_progress, None) +assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE +print("enroll done") + +print("listing") +stored = d.list_prints_sync() +print("listing done") +assert len(stored) == 1 +assert stored[0].equal(p) +print("verifying") +try: + assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE + verify_res, verify_print = d.verify_sync(p) + assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE +except gi.repository.GLib.GError as e: + print("Please try again") +else: + print("verify done") + del p + assert verify_res == True + +identified = False +deserialized_prints = [] +for p in stored: + deserialized_prints.append(FPrint.Print.deserialize(p.serialize())) + assert deserialized_prints[-1].equal(p) +del stored + +print('async identifying') +d.identify(deserialized_prints, callback=identify_done) +del deserialized_prints + +while not identified: + ctx.iteration(True) + +print("deleting") +d.delete_print_sync(p) +print("delete done") + +d.close_sync() + +del d +del c diff --git a/tests/realtek-5816/device b/tests/realtek-5816/device new file mode 100644 index 00000000..55f6f985 --- /dev/null +++ b/tests/realtek-5816/device @@ -0,0 +1,250 @@ +P: /devices/pci0000:00/0000:00:14.0/usb1/1-6 +N: bus/usb/001/006=12010102EF020140DA0B165800000301020109022E00010104A0FA0904000004FF02000507050102000200070583034000080705840340000807058202000200 +E: DEVNAME=/dev/bus/usb/001/006 +E: DEVTYPE=usb_device +E: DRIVER=usb +E: PRODUCT=bda/5816/0 +E: TYPE=239/2/1 +E: BUSNUM=001 +E: DEVNUM=006 +E: MAJOR=189 +E: MINOR=5 +E: SUBSYSTEM=usb +E: ID_VENDOR=Generic +E: ID_VENDOR_ENC=Generic +E: ID_VENDOR_ID=0bda +E: ID_MODEL=Realtek_USB2.0_Finger_Print_Bridge +E: ID_MODEL_ENC=Realtek\x20USB2.0\x20Finger\x20Print\x20Bridge +E: ID_MODEL_ID=5816 +E: ID_REVISION=0000 +E: ID_SERIAL=Generic_Realtek_USB2.0_Finger_Print_Bridge_201801010001 +E: ID_SERIAL_SHORT=201801010001 +E: ID_BUS=usb +E: ID_USB_INTERFACES=:ff0200: +E: ID_VENDOR_FROM_DATABASE=Realtek Semiconductor Corp. +E: ID_PATH=pci-0000:00:14.0-usb-0:6 +E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_6 +A: authorized=1\n +A: avoid_reset_quirk=0\n +A: bConfigurationValue=1\n +A: bDeviceClass=ef\n +A: bDeviceProtocol=01\n +A: bDeviceSubClass=02\n +A: bMaxPacketSize0=64\n +A: bMaxPower=500mA\n +A: bNumConfigurations=1\n +A: bNumInterfaces= 1\n +A: bcdDevice=0000\n +A: bmAttributes=a0\n +A: busnum=1\n +A: configuration=Realtek USB2.0 Finger Print Bridge\n +H: descriptors=12010102EF020140DA0B165800000301020109022E00010104A0FA0904000004FF02000507050102000200070583034000080705840340000807058202000200 +A: dev=189:5\n +A: devnum=6\n +A: devpath=6\n +L: driver=../../../../../bus/usb/drivers/usb +L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4b/device:4c/device:52 +A: idProduct=5816\n +A: idVendor=0bda\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=../1-0:1.0/usb1-port6 +A: power/active_duration=37699\n +A: power/async=enabled\n +A: power/autosuspend=2\n +A: power/autosuspend_delay_ms=2000\n +A: power/connected_duration=37699\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=37457\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: product=Realtek USB2.0 Finger Print Bridge\n +A: quirks=0x0\n +A: removable=removable\n +A: rx_lanes=1\n +A: serial=201801010001\n +A: speed=480\n +A: tx_lanes=1\n +A: urbnum=22\n +A: version= 2.01\n + +P: /devices/pci0000:00/0000:00:14.0/usb1 +N: bus/usb/001/001=12010002090001406B1D020008060302010109021900010100E0000904000001090000000705810304000C +E: DEVNAME=/dev/bus/usb/001/001 +E: DEVTYPE=usb_device +E: DRIVER=usb +E: PRODUCT=1d6b/2/608 +E: TYPE=9/0/1 +E: BUSNUM=001 +E: DEVNUM=001 +E: MAJOR=189 +E: MINOR=0 +E: SUBSYSTEM=usb +E: ID_VENDOR=Linux_6.8.0-40-generic_xhci-hcd +E: ID_VENDOR_ENC=Linux\x206.8.0-40-generic\x20xhci-hcd +E: ID_VENDOR_ID=1d6b +E: ID_MODEL=xHCI_Host_Controller +E: ID_MODEL_ENC=xHCI\x20Host\x20Controller +E: ID_MODEL_ID=0002 +E: ID_REVISION=0608 +E: ID_SERIAL=Linux_6.8.0-40-generic_xhci-hcd_xHCI_Host_Controller_0000:00:14.0 +E: ID_SERIAL_SHORT=0000:00:14.0 +E: ID_BUS=usb +E: ID_USB_INTERFACES=:090000: +E: ID_VENDOR_FROM_DATABASE=Linux Foundation +E: ID_AUTOSUSPEND=1 +E: ID_MODEL_FROM_DATABASE=2.0 root hub +E: ID_PATH=pci-0000:00:14.0 +E: ID_PATH_TAG=pci-0000_00_14_0 +E: ID_FOR_SEAT=usb-pci-0000_00_14_0 +E: TAGS=:seat: +E: CURRENT_TAGS=:seat: +A: authorized=1\n +A: authorized_default=1\n +A: avoid_reset_quirk=0\n +A: bConfigurationValue=1\n +A: bDeviceClass=09\n +A: bDeviceProtocol=01\n +A: bDeviceSubClass=00\n +A: bMaxPacketSize0=64\n +A: bMaxPower=0mA\n +A: bNumConfigurations=1\n +A: bNumInterfaces= 1\n +A: bcdDevice=0608\n +A: bmAttributes=e0\n +A: busnum=1\n +A: configuration= +H: descriptors=12010002090001406B1D020008060302010109021900010100E0000904000001090000000705810304000C +A: dev=189:0\n +A: devnum=1\n +A: devpath=0\n +L: driver=../../../../bus/usb/drivers/usb +L: firmware_node=../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4b/device:4c +A: idProduct=0002\n +A: idVendor=1d6b\n +A: interface_authorized_default=1\n +A: ltm_capable=no\n +A: manufacturer=Linux 6.8.0-40-generic xhci-hcd\n +A: maxchild=16\n +A: power/active_duration=1096259\n +A: power/async=enabled\n +A: power/autosuspend=0\n +A: power/autosuspend_delay_ms=0\n +A: power/connected_duration=1096259\n +A: power/control=auto\n +A: power/level=auto\n +A: power/runtime_active_kids=3\n +A: power/runtime_active_time=1096256\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=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=229\n +A: version= 2.00\n + +P: /devices/pci0000:00/0000:00:14.0 +E: DRIVER=xhci_hcd +E: PCI_CLASS=C0330 +E: PCI_ID=8086:A36D +E: PCI_SUBSYS_ID=1028:085C +E: PCI_SLOT_NAME=0000:00:14.0 +E: MODALIAS=pci:v00008086d0000A36Dsv00001028sd0000085Cbc0Csc03i30 +E: SUBSYSTEM=pci +E: ID_PCI_CLASS_FROM_DATABASE=Serial bus controller +E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller +E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI +E: ID_VENDOR_FROM_DATABASE=Intel Corporation +E: ID_MODEL_FROM_DATABASE=Cannon Lake PCH USB 3.1 xHCI Host Controller +A: ari_enabled=0\n +A: broken_parity_status=0\n +A: class=0x0c0330\n +H: config=86806DA3060590021030030C00008000040030D200000000000000000000000000000000000000000000000028105C08000000007000000000000000FF010000FD0134808FC6FF8300000000000000007F6DDC0F000000005B17C10300000000316000000000000000000000000000000180C2C10800000000000000000000000590B7001803E0FE0000000000000000090014F01000400100000000C10A080000080E00001800008F40020000010000030000000C00000000000000C000000000000000000100003000000000000000030000000C0000000000000000000000000000000000000000000000000000000000000000000000B50F120112000000 +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: device=0xa36d\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:4b +A: index=4\n +L: iommu=../../virtual/iommu/dmar1 +L: iommu_group=../../../kernel/iommu_groups/4 +A: irq=125\n +A: label=Onboard - Other\n +A: local_cpulist=0-3\n +A: local_cpus=f\n +A: modalias=pci:v00008086d0000A36Dsv00001028sd0000085Cbc0Csc03i30\n +A: msi_bus=1\n +A: msi_irqs/125=msi\n +A: msi_irqs/126=msi\n +A: msi_irqs/127=msi\n +A: msi_irqs/128=msi\n +A: msi_irqs/129=msi\n +A: numa_node=-1\n +A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 6 7 2112 7\nxHCI ring segments 25 25 4096 25\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 12 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=1096935\n +A: power/runtime_enabled=forbidden\n +A: power/runtime_status=active\n +A: power/runtime_suspended_time=0\n +A: power/runtime_usage=1\n +A: power/wakeup=enabled\n +A: power/wakeup_abort_count=0\n +A: power/wakeup_active=0\n +A: power/wakeup_active_count=0\n +A: power/wakeup_count=0\n +A: power/wakeup_expire_count=0\n +A: power/wakeup_last_time_ms=0\n +A: power/wakeup_max_time_ms=0\n +A: power/wakeup_total_time_ms=0\n +A: power_state=D0\n +A: resource=0x00000000d2300000 0x00000000d230ffff 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=0x10\n +A: subsystem_device=0x085c\n +A: subsystem_vendor=0x1028\n +A: vendor=0x8086\n + diff --git a/tests/realtek/custom.pcapng b/tests/realtek/custom.pcapng index 0fe6dc7b05d6bdd1008665467bffca83d04835b1..84b159934d7d6db6f353109f1a7767014d273d26 100644 GIT binary patch literal 30968 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 diff --git a/tests/realtek/device b/tests/realtek/device index c4f1c85e..500f62d6 100644 --- a/tests/realtek/device +++ b/tests/realtek/device @@ -1,14 +1,14 @@ -P: /devices/pci0000:00/0000:00:14.0/usb1/1-4 -N: bus/usb/001/005=12010102EF020140DA0B135801210301020109022E00010104A0FA0904000004FF02000507050102000200070583031000080705840310000807058202000200 -E: DEVNAME=/dev/bus/usb/001/005 +P: /devices/pci0000:00/0000:00:14.0/usb1/1-8 +N: bus/usb/001/025=12010102EF020140DA0B135801210301020109022E00010104A0FA0904000004FF02000507050102000200070583031000080705840310000807058202000200 +E: DEVNAME=/dev/bus/usb/001/025 E: DEVTYPE=usb_device E: DRIVER=usb E: PRODUCT=bda/5813/2101 E: TYPE=239/2/1 E: BUSNUM=001 -E: DEVNUM=005 +E: DEVNUM=025 E: MAJOR=189 -E: MINOR=4 +E: MINOR=24 E: SUBSYSTEM=usb E: ID_VENDOR=Generic E: ID_VENDOR_ENC=Generic @@ -22,8 +22,8 @@ E: ID_SERIAL_SHORT=201801010001 E: ID_BUS=usb E: ID_USB_INTERFACES=:ff0200: E: ID_VENDOR_FROM_DATABASE=Realtek Semiconductor Corp. -E: ID_PATH=pci-0000:00:14.0-usb-0:4 -E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_4 +E: ID_PATH=pci-0000:00:14.0-usb-0:8 +E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_8 A: authorized=1\n A: avoid_reset_quirk=0\n A: bConfigurationValue=1\n @@ -39,11 +39,11 @@ A: bmAttributes=a0\n A: busnum=1\n A: configuration=Realtek USB2.0 Finger Print Bridge\n H: descriptors=12010102EF020140DA0B135801210301020109022E00010104A0FA0904000004FF02000507050102000200070583031000080705840310000807058202000200 -A: dev=189:4\n -A: devnum=5\n -A: devpath=4\n +A: dev=189:24\n +A: devnum=25\n +A: devpath=8\n L: driver=../../../../../bus/usb/drivers/usb -L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4b/device:4c/device:50 +L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4b/device:4c/device:54 A: idProduct=5813\n A: idVendor=0bda\n A: ltm_capable=no\n @@ -54,21 +54,21 @@ 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=../1-0:1.0/usb1-port4 -A: power/active_duration=91232868\n +L: port=../1-0:1.0/usb1-port8 +A: power/active_duration=271844\n A: power/async=enabled\n A: power/autosuspend=2\n A: power/autosuspend_delay_ms=2000\n -A: power/connected_duration=91232868\n +A: power/connected_duration=271844\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=91232594\n +A: power/runtime_active_time=271564\n A: power/runtime_enabled=forbidden\n A: power/runtime_status=active\n A: power/runtime_suspended_time=0\n -A: power/runtime_usage=7\n +A: power/runtime_usage=1\n A: power/wakeup=disabled\n A: power/wakeup_abort_count=\n A: power/wakeup_active=\n @@ -85,29 +85,29 @@ A: rx_lanes=1\n A: serial=201801010001\n A: speed=480\n A: tx_lanes=1\n -A: urbnum=15076313\n +A: urbnum=297176\n A: version= 2.01\n P: /devices/pci0000:00/0000:00:14.0/usb1 -N: bus/usb/001/001=12010002090001406B1D020002060302010109021900010100E0000904000001090000000705810304000C +N: bus/usb/001/001=12010002090001406B1D020005060302010109021900010100E0000904000001090000000705810304000C E: DEVNAME=/dev/bus/usb/001/001 E: DEVTYPE=usb_device E: DRIVER=usb -E: PRODUCT=1d6b/2/602 +E: PRODUCT=1d6b/2/605 E: TYPE=9/0/1 E: BUSNUM=001 E: DEVNUM=001 E: MAJOR=189 E: MINOR=0 E: SUBSYSTEM=usb -E: ID_VENDOR=Linux_6.2.0-35-generic_xhci-hcd -E: ID_VENDOR_ENC=Linux\x206.2.0-35-generic\x20xhci-hcd +E: ID_VENDOR=Linux_6.5.0-18-generic_xhci-hcd +E: ID_VENDOR_ENC=Linux\x206.5.0-18-generic\x20xhci-hcd E: ID_VENDOR_ID=1d6b E: ID_MODEL=xHCI_Host_Controller E: ID_MODEL_ENC=xHCI\x20Host\x20Controller E: ID_MODEL_ID=0002 -E: ID_REVISION=0602 -E: ID_SERIAL=Linux_6.2.0-35-generic_xhci-hcd_xHCI_Host_Controller_0000:00:14.0 +E: ID_REVISION=0605 +E: ID_SERIAL=Linux_6.5.0-18-generic_xhci-hcd_xHCI_Host_Controller_0000:00:14.0 E: ID_SERIAL_SHORT=0000:00:14.0 E: ID_BUS=usb E: ID_USB_INTERFACES=:090000: @@ -130,11 +130,11 @@ A: bMaxPacketSize0=64\n A: bMaxPower=0mA\n A: bNumConfigurations=1\n A: bNumInterfaces= 1\n -A: bcdDevice=0602\n +A: bcdDevice=0605\n A: bmAttributes=e0\n A: busnum=1\n A: configuration= -H: descriptors=12010002090001406B1D020002060302010109021900010100E0000904000001090000000705810304000C +H: descriptors=12010002090001406B1D020005060302010109021900010100E0000904000001090000000705810304000C A: dev=189:0\n A: devnum=1\n A: devpath=0\n @@ -144,17 +144,17 @@ A: idProduct=0002\n A: idVendor=1d6b\n A: interface_authorized_default=1\n A: ltm_capable=no\n -A: manufacturer=Linux 6.2.0-35-generic xhci-hcd\n +A: manufacturer=Linux 6.5.0-18-generic xhci-hcd\n A: maxchild=16\n -A: power/active_duration=264747968\n +A: power/active_duration=351477916\n A: power/async=enabled\n A: power/autosuspend=0\n A: power/autosuspend_delay_ms=0\n -A: power/connected_duration=264747968\n +A: power/connected_duration=351477916\n A: power/control=auto\n A: power/level=auto\n A: power/runtime_active_kids=3\n -A: power/runtime_active_time=264747968\n +A: power/runtime_active_time=351477912\n A: power/runtime_enabled=enabled\n A: power/runtime_status=active\n A: power/runtime_suspended_time=0\n @@ -175,7 +175,7 @@ A: rx_lanes=1\n A: serial=0000:00:14.0\n A: speed=480\n A: tx_lanes=1\n -A: urbnum=3177\n +A: urbnum=2135\n A: version= 2.00\n P: /devices/pci0000:00/0000:00:14.0 @@ -194,10 +194,14 @@ E: ID_MODEL_FROM_DATABASE=Cannon Lake PCH USB 3.1 xHCI Host Controller A: ari_enabled=0\n A: broken_parity_status=0\n A: class=0x0c0330\n -H: config=86806DA3060590021030030C00008000040030D200000000000000000000000000000000000000000000000028105C08000000007000000000000000FF010000FD0134808FC6FF8300000000000000007F6DDC0F000000005919041B00000000316000000000000000000000000000000180C2C108000000000000000000000005908700D802E0FE0000000000000000090014F01000400100000000C10A080000080E00001800008F40020000010000030000000C00000000000000C000000000000000000100003000000000000000030000000C0000000000000000000000000000000000000000000000000000000000000000000000B50F120112000000 +H: config=86806DA3060590021030030C00008000040030D200000000000000000000000000000000000000000000000028105C08000000007000000000000000FF010000FD0134808FC6FF8300000000000000007F6DDC0F000000004505531F00000000316000000000000000000000000000000180C2C108000000000000000000000005908700D802E0FE0000000000000000090014F01000400100000000C10A080000080E00001800008F40020000010000030000000C00000000000000C000000000000000000100003000000000000000030000000C0000000000000000000000000000000000000000000000000000000000000000000000B50F120112000000 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: device=0xa36d\n A: dma_mask_bits=64\n L: driver=../../../bus/pci/drivers/xhci_hcd @@ -205,19 +209,19 @@ A: driver_override=(null)\n A: enable=1\n L: firmware_node=../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4b A: index=4\n -A: irq=125\n +A: irq=126\n A: label=Onboard - Other\n A: local_cpulist=0-3\n A: local_cpus=f\n A: modalias=pci:v00008086d0000A36Dsv00001028sd0000085Cbc0Csc03i30\n A: msi_bus=1\n -A: msi_irqs/125=msi\n +A: msi_irqs/126=msi\n A: numa_node=-1\n A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 6 7 2112 7\nxHCI ring segments 24 24 4096 24\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 12 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=264748677\n +A: power/runtime_active_time=351478612\n A: power/runtime_enabled=forbidden\n A: power/runtime_status=active\n A: power/runtime_suspended_time=0\n