mirror of
https://git.proxmox.com/git/fwupd
synced 2025-08-13 17:23:20 +00:00
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:
parent
feb8965d2e
commit
043bc15f6d
@ -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:
|
||||||
**/
|
**/
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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);
|
||||||
|
@ -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");
|
||||||
|
@ -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))
|
||||||
|
Loading…
Reference in New Issue
Block a user