From 145f7287faa25fb67cc18bdbfb3e57adcbc122b3 Mon Sep 17 00:00:00 2001 From: Benjamin Berg Date: Fri, 25 Jun 2021 12:28:13 +0200 Subject: [PATCH] fprint-list: Add SPI devices to supported list This will make them show up on the website. --- libfprint/fprint-list-supported-devices.c | 99 +++++++++++++++++------ 1 file changed, 76 insertions(+), 23 deletions(-) diff --git a/libfprint/fprint-list-supported-devices.c b/libfprint/fprint-list-supported-devices.c index be6dc28..132a72f 100644 --- a/libfprint/fprint-list-supported-devices.c +++ b/libfprint/fprint-list-supported-devices.c @@ -28,8 +28,8 @@ GHashTable *printed = NULL; -static GList * -insert_drivers (GList *list) +static void +insert_drivers (GList **usb_list, GList **spi_list) { g_autoptr(GArray) drivers = fpi_get_driver_types (); gint i; @@ -41,34 +41,70 @@ insert_drivers (GList *list) g_autoptr(FpDeviceClass) cls = g_type_class_ref (driver); const FpIdEntry *entry; - if (cls->type != FP_DEVICE_TYPE_USB) - continue; - - for (entry = cls->id_table; entry->vid; entry++) + switch (cls->type) { - char *key; + case FP_DEVICE_TYPE_USB: - key = g_strdup_printf ("%04x:%04x", entry->vid, entry->pid); - - if (g_hash_table_lookup (printed, key) != NULL) + for (entry = cls->id_table; entry->vid; entry++) { - g_free (key); - continue; + char *key; + + key = g_strdup_printf ("%04x:%04x", entry->vid, entry->pid); + + if (g_hash_table_lookup (printed, key) != NULL) + { + g_free (key); + continue; + } + + g_hash_table_insert (printed, key, GINT_TO_POINTER (1)); + + *usb_list = g_list_prepend (*usb_list, + g_strdup_printf ("%s | %s\n", key, cls->full_name)); } + break; - g_hash_table_insert (printed, key, GINT_TO_POINTER (1)); + case FP_DEVICE_TYPE_UDEV: + for (entry = cls->id_table; entry->udev_types; entry++) + { + char *key; - list = g_list_prepend (list, g_strdup_printf ("%s | %s\n", key, cls->full_name)); + /* Need SPI device */ + if ((entry->udev_types & FPI_DEVICE_UDEV_SUBTYPE_SPIDEV) == 0) + continue; + + key = g_strdup_printf ("SPI:%s:%04x:%04x", entry->spi_acpi_id, entry->hid_id.vid, entry->hid_id.pid); + + if (g_hash_table_lookup (printed, key) != NULL) + { + g_free (key); + continue; + } + + g_hash_table_insert (printed, key, GINT_TO_POINTER (1)); + + if (entry->udev_types & FPI_DEVICE_UDEV_SUBTYPE_HIDRAW) + *spi_list = g_list_prepend (*spi_list, + g_strdup_printf ("%s | %04x:%04x | %s\n", entry->spi_acpi_id, entry->hid_id.vid, entry->hid_id.pid, cls->full_name)); + else + *spi_list = g_list_prepend (*spi_list, + g_strdup_printf ("%s | - | %s\n", entry->spi_acpi_id, cls->full_name)); + } + break; + + case FP_DEVICE_TYPE_VIRTUAL: + default: + break; } } - - return list; } int main (int argc, char **argv) { - GList *list, *l; + GList *usb_list = NULL; + GList *spi_list = NULL; + GList *l; setlocale (LC_ALL, ""); @@ -83,19 +119,36 @@ main (int argc, char **argv) g_print ("\n"); g_print ("This is a list of supported devices in libfprint's development version. Those drivers might not all be available in the stable, released version. If in doubt, contact your distribution or systems integrator for details.\n"); g_print ("\n"); + + insert_drivers (&usb_list, &spi_list); + g_print ("## USB devices\n"); g_print ("\n"); g_print ("USB ID | Driver\n"); g_print ("------------ | ------------\n"); - list = NULL; - list = insert_drivers (list); - - list = g_list_sort (list, (GCompareFunc) g_strcmp0); - for (l = list; l != NULL; l = l->next) + usb_list = g_list_sort (usb_list, (GCompareFunc) g_strcmp0); + for (l = usb_list; l != NULL; l = l->next) g_print ("%s", (char *) l->data); + g_print ("\n"); + + g_list_free_full (usb_list, g_free); + + g_print ("## SPI devices\n"); + g_print ("\n"); + g_print ("The ACPI ID represents the SPI interface. Some sensors are also connected to a HID device (Human Input Device) for side-channel requests such as resets.\n"); + g_print ("\n"); + g_print ("ACPI ID | HID ID | Driver\n"); + g_print ("------------ | ------------ | ------------\n"); + + spi_list = g_list_sort (spi_list, (GCompareFunc) g_strcmp0); + for (l = spi_list; l != NULL; l = l->next) + g_print ("%s", (char *) l->data); + g_print ("\n"); + + g_list_free_full (usb_list, g_free); + - g_list_free_full (list, g_free); g_hash_table_destroy (printed); return 0;