Allow metainfo files to match only specific revisions of devices

For example, matching on the 'USB\VID_0000&PID_0000&REV_0000' GUID rather than
the 'USB\VID_0000&PID_0000' GUID.

This is now possible as we can specify multiple GUIDs for a device.
This commit is contained in:
Richard Hughes 2016-05-17 18:46:10 +01:00
parent feb8965d2e
commit 043bc15f6d
6 changed files with 51 additions and 29 deletions

View File

@ -88,6 +88,24 @@ fu_device_set_alternate (FuDevice *device, FuDevice *alternate)
g_set_object (&priv->alternate, alternate); g_set_object (&priv->alternate, alternate);
} }
/**
* fu_device_add_guid:
**/
void
fu_device_add_guid (FuDevice *device, const gchar *guid)
{
/* make valid */
if (!as_utils_guid_is_valid (guid)) {
g_autofree gchar *tmp = as_utils_guid_from_string (guid);
g_debug ("using %s for %s", tmp, guid);
fwupd_result_add_guid (FWUPD_RESULT (device), tmp);
return;
}
/* already valid */
fwupd_result_add_guid (FWUPD_RESULT (device), guid);
}
/** /**
* fu_device_get_metadata: * fu_device_get_metadata:
**/ **/

View File

@ -48,7 +48,6 @@ FuDevice *fu_device_new (void);
#define fu_device_set_created(d,v) fwupd_result_set_device_created(FWUPD_RESULT(d),v) #define fu_device_set_created(d,v) fwupd_result_set_device_created(FWUPD_RESULT(d),v)
#define fu_device_set_description(d,v) fwupd_result_set_device_description(FWUPD_RESULT(d),v) #define fu_device_set_description(d,v) fwupd_result_set_device_description(FWUPD_RESULT(d),v)
#define fu_device_set_flags(d,v) fwupd_result_set_device_flags(FWUPD_RESULT(d),v) #define fu_device_set_flags(d,v) fwupd_result_set_device_flags(FWUPD_RESULT(d),v)
#define fu_device_add_guid(d,v) fwupd_result_add_guid(FWUPD_RESULT(d),v)
#define fu_device_has_guid(d,v) fwupd_result_has_guid(FWUPD_RESULT(d),v) #define fu_device_has_guid(d,v) fwupd_result_has_guid(FWUPD_RESULT(d),v)
#define fu_device_set_id(d,v) fwupd_result_set_device_id(FWUPD_RESULT(d),v) #define fu_device_set_id(d,v) fwupd_result_set_device_id(FWUPD_RESULT(d),v)
#define fu_device_set_modified(d,v) fwupd_result_set_device_modified(FWUPD_RESULT(d),v) #define fu_device_set_modified(d,v) fwupd_result_set_device_modified(FWUPD_RESULT(d),v)
@ -92,6 +91,8 @@ FuDevice *fu_device_new (void);
const gchar *fu_device_get_equivalent_id (FuDevice *device); const gchar *fu_device_get_equivalent_id (FuDevice *device);
void fu_device_set_equivalent_id (FuDevice *device, void fu_device_set_equivalent_id (FuDevice *device,
const gchar *equivalent_id); const gchar *equivalent_id);
void fu_device_add_guid (FuDevice *device,
const gchar *guid);
FuDevice *fu_device_get_alternate (FuDevice *device); FuDevice *fu_device_get_alternate (FuDevice *device);
void fu_device_set_alternate (FuDevice *device, void fu_device_set_alternate (FuDevice *device,
FuDevice *alternate); FuDevice *alternate);

View File

@ -63,7 +63,8 @@ fu_provider_dfu_device_update (FuProviderDfu *provider_dfu,
guint16 release; guint16 release;
g_autofree gchar *guid = NULL; g_autofree gchar *guid = NULL;
g_autofree gchar *version = NULL; g_autofree gchar *version = NULL;
g_autofree gchar *vid_pid = NULL; g_autofree gchar *devid1 = NULL;
g_autofree gchar *devid2 = NULL;
/* check mode */ /* check mode */
platform_id = dfu_device_get_platform_id (device); platform_id = dfu_device_get_platform_id (device);
@ -86,12 +87,18 @@ fu_provider_dfu_device_update (FuProviderDfu *provider_dfu,
fu_device_set_version (dev, version); fu_device_set_version (dev, version);
} }
vid_pid = g_strdup_printf ("USB\\VID_%04X&PID_%04X", /* add USB\VID_0000&PID_0000 */
devid1 = g_strdup_printf ("USB\\VID_%04X&PID_%04X",
dfu_device_get_runtime_vid (device), dfu_device_get_runtime_vid (device),
dfu_device_get_runtime_pid (device)); dfu_device_get_runtime_pid (device));
guid = as_utils_guid_from_string (vid_pid); fu_device_add_guid (dev, devid1);
g_debug ("using %s for %s", guid, vid_pid);
fu_device_add_guid (dev, guid); /* add more specific USB\VID_0000&PID_0000&REV_0000 */
devid2 = g_strdup_printf ("USB\\VID_%04X&PID_%04X&REV_%04X",
dfu_device_get_runtime_vid (device),
dfu_device_get_runtime_pid (device),
dfu_device_get_runtime_release (device));
fu_device_add_guid (dev, devid2);
} }
/** /**

View File

@ -282,7 +282,6 @@ fu_provider_rpi_coldplug (FuProvider *provider, GError **error)
FuProviderRpiPrivate *priv = GET_PRIVATE (provider_rpi); FuProviderRpiPrivate *priv = GET_PRIVATE (provider_rpi);
g_autofree gchar *fwfn = NULL; g_autofree gchar *fwfn = NULL;
g_autofree gchar *fwver = NULL; g_autofree gchar *fwver = NULL;
g_autofree gchar *guid = NULL;
g_autoptr(FuDevice) device = NULL; g_autoptr(FuDevice) device = NULL;
/* anything interesting */ /* anything interesting */
@ -295,8 +294,7 @@ fu_provider_rpi_coldplug (FuProvider *provider, GError **error)
/* create fake device */ /* create fake device */
device = fu_device_new (); device = fu_device_new ();
fu_device_set_id (device, "raspberry-pi"); fu_device_set_id (device, "raspberry-pi");
guid = as_utils_guid_from_string ("raspberrypi"); fu_device_add_guid (device, "raspberrypi");
fu_device_add_guid (device, guid);
fu_device_set_name (device, "Raspberry Pi"); fu_device_set_name (device, "Raspberry Pi");
fu_device_add_flag (device, FU_DEVICE_FLAG_INTERNAL); fu_device_add_flag (device, FU_DEVICE_FLAG_INTERNAL);
fu_device_add_flag (device, FU_DEVICE_FLAG_ALLOW_OFFLINE); fu_device_add_flag (device, FU_DEVICE_FLAG_ALLOW_OFFLINE);

View File

@ -152,7 +152,6 @@ fu_provider_udev_client_add (FuProviderUdev *provider_udev, GUdevDevice *device)
const gchar *guid; const gchar *guid;
const gchar *product; const gchar *product;
const gchar *vendor; const gchar *vendor;
g_autofree gchar *guid_new = NULL;
g_autofree gchar *id = NULL; g_autofree gchar *id = NULL;
g_autofree gchar *rom_fn = NULL; g_autofree gchar *rom_fn = NULL;
g_autofree gchar *version = NULL; g_autofree gchar *version = NULL;
@ -188,19 +187,11 @@ fu_provider_udev_client_add (FuProviderUdev *provider_udev, GUdevDevice *device)
version = g_strdup (split[2]); version = g_strdup (split[2]);
} }
/* no GUID from the ROM, so fix up the VID:PID */
if (!as_utils_guid_is_valid (guid)) {
guid_new = as_utils_guid_from_string (guid);
g_debug ("fixing GUID %s->%s", guid, guid_new);
} else {
guid_new = g_strdup (guid);
}
/* did we get enough data */ /* did we get enough data */
dev = fu_device_new (); dev = fu_device_new ();
fu_device_add_flag (dev, FU_DEVICE_FLAG_INTERNAL); fu_device_add_flag (dev, FU_DEVICE_FLAG_INTERNAL);
fu_device_set_id (dev, id); fu_device_set_id (dev, id);
fu_device_add_guid (dev, guid_new); fu_device_add_guid (dev, guid);
display_name = g_udev_device_get_property (device, "FWUPD_MODEL"); display_name = g_udev_device_get_property (device, "FWUPD_MODEL");
if (display_name == NULL) if (display_name == NULL)
display_name = g_udev_device_get_property (device, "ID_MODEL_FROM_DATABASE"); display_name = g_udev_device_get_property (device, "ID_MODEL_FROM_DATABASE");

View File

@ -61,7 +61,8 @@ fu_provider_usb_device_added (FuProviderUsb *provider_usb, GUsbDevice *device)
FuProviderUsbPrivate *priv = GET_PRIVATE (provider_usb); FuProviderUsbPrivate *priv = GET_PRIVATE (provider_usb);
const gchar *platform_id = NULL; const gchar *platform_id = NULL;
guint8 idx = 0x00; guint8 idx = 0x00;
g_autofree gchar *guid = NULL; g_autofree gchar *devid1 = NULL;
g_autofree gchar *devid2 = NULL;
g_autofree gchar *product = NULL; g_autofree gchar *product = NULL;
g_autofree gchar *version = NULL; g_autofree gchar *version = NULL;
g_autoptr(AsProfile) profile = as_profile_new (); g_autoptr(AsProfile) profile = as_profile_new ();
@ -121,20 +122,26 @@ fu_provider_usb_device_added (FuProviderUsb *provider_usb, GUsbDevice *device)
} }
fu_device_set_version (dev, version); fu_device_set_version (dev, version);
/* get GUID, falling back to the USB VID:PID hash */ /* get GUID from the descriptor if set */
idx = g_usb_device_get_custom_index (device, idx = g_usb_device_get_custom_index (device,
G_USB_DEVICE_CLASS_VENDOR_SPECIFIC, G_USB_DEVICE_CLASS_VENDOR_SPECIFIC,
'G', 'U', NULL); 'G', 'U', NULL);
if (idx != 0x00) if (idx != 0x00) {
g_autofree gchar *guid = NULL;
guid = g_usb_device_get_string_descriptor (device, idx, NULL); guid = g_usb_device_get_string_descriptor (device, idx, NULL);
if (guid == NULL) { fu_device_add_guid (dev, guid);
g_autofree gchar *vid_pid = NULL;
vid_pid = g_strdup_printf ("USB\\VID_%04X&PID_%04X",
g_usb_device_get_vid (device),
g_usb_device_get_pid (device));
guid = as_utils_guid_from_string (vid_pid);
} }
fu_device_add_guid (dev, guid);
/* also fall back to the USB VID:PID hash */
devid1 = g_strdup_printf ("USB\\VID_%04X&PID_%04X",
g_usb_device_get_vid (device),
g_usb_device_get_pid (device));
fu_device_add_guid (dev, devid1);
devid2 = g_strdup_printf ("USB\\VID_%04X&PID_%04X&REV_%04X",
g_usb_device_get_vid (device),
g_usb_device_get_pid (device),
g_usb_device_get_release (device));
fu_device_add_guid (dev, devid2);
/* we're done here */ /* we're done here */
if (!g_usb_device_close (device, &error)) if (!g_usb_device_close (device, &error))