From 5e67108ab8a9986ba6c61cb155e3de814e24e088 Mon Sep 17 00:00:00 2001 From: Simon Ho Date: Wed, 15 Sep 2021 03:42:07 +0800 Subject: [PATCH] plugins: add new plugin for Synaptics CAPE devices (#3746) CAPE family is Audio DSP for a board range of applications in IOT, PC and mobile can be interfaced via I2C, UART or USB interface. This patch is only for CX31993 and CX31988 chips, there is not immediate plans is to add support to other CAPE devices. CX31993 have two separate firmware .hid file for for each partition. It need to convert two .hid files into a .fw file for fwupd tool to consume. Currently, this patch is only support for EPOS headsets with basic firmware update feature. Either new code singing or manifest.xml are unsupported yet. The code has been tested with CX31993 EVK board. A test firmware file is put at 'src/fuzzing/firmware/synaptics-cape.fw' synaptics-cape: Port to new FuProgress API and style fixups synaptics-cape: Fix compile errors and add missing test fw file Signed-off-by: Simon Ho synaptics-cape: Fix fuzzer test Signed-off-by: Simon Ho synaptics-cape: Fix progress bar number Signed-off-by: Simon Ho synaptics-cape: Mark the fuzzing target trivial: Use a stable GLib branch for fuzzing synaptics-cape: Fix progress bar number Signed-off-by: Simon Ho synaptics-cape: Fix readme synaptics-cape: Style fixups synaptics-cape: Fix progress bar percentage synaptics-cape: Style fixups --- contrib/ci/oss-fuzz.py | 5 +- contrib/fwupd.spec.in | 1 + plugins/meson.build | 1 + plugins/synaptics-cape/README.md | 41 ++ .../synaptics-cape/fu-plugin-synaptics-cape.c | 20 + .../synaptics-cape/fu-synaptics-cape-device.c | 673 ++++++++++++++++++ .../synaptics-cape/fu-synaptics-cape-device.h | 20 + .../fu-synaptics-cape-firmware.c | 216 ++++++ .../fu-synaptics-cape-firmware.h | 38 + plugins/synaptics-cape/meson.build | 31 + plugins/synaptics-cape/synaptics-cape.quirk | 78 ++ src/fuzzing/firmware/synaptics-cape.fw | Bin 0 -> 229440 bytes src/fuzzing/generate.py | 1 + src/fuzzing/synaptics-cape.builder.xml | 11 + 14 files changed, 1135 insertions(+), 1 deletion(-) create mode 100644 plugins/synaptics-cape/README.md create mode 100644 plugins/synaptics-cape/fu-plugin-synaptics-cape.c create mode 100644 plugins/synaptics-cape/fu-synaptics-cape-device.c create mode 100644 plugins/synaptics-cape/fu-synaptics-cape-device.h create mode 100644 plugins/synaptics-cape/fu-synaptics-cape-firmware.c create mode 100644 plugins/synaptics-cape/fu-synaptics-cape-firmware.h create mode 100644 plugins/synaptics-cape/meson.build create mode 100644 plugins/synaptics-cape/synaptics-cape.quirk create mode 100755 src/fuzzing/firmware/synaptics-cape.fw create mode 100644 src/fuzzing/synaptics-cape.builder.xml diff --git a/contrib/ci/oss-fuzz.py b/contrib/ci/oss-fuzz.py index 981c33d95..11914c291 100755 --- a/contrib/ci/oss-fuzz.py +++ b/contrib/ci/oss-fuzz.py @@ -214,7 +214,9 @@ class Fuzzer: def _build(bld: Builder) -> None: # GLib - src = bld.checkout_source("glib", url="https://gitlab.gnome.org/GNOME/glib.git") + src = bld.checkout_source( + "glib", url="https://gitlab.gnome.org/GNOME/glib.git", commit="glib-2-68" + ) bld.build_meson_project( src, [ @@ -321,6 +323,7 @@ def _build(bld: Builder) -> None: Fuzzer("redfish-smbios", srcdir="redfish", pattern="redfish-smbios"), Fuzzer("solokey"), Fuzzer("synaprom", srcdir="synaptics-prometheus"), + Fuzzer("synaptics-cape"), Fuzzer("synaptics-mst"), Fuzzer("synaptics-rmi"), Fuzzer("wacom-usb", pattern="wac-firmware", globstr="wacom*"), diff --git a/contrib/fwupd.spec.in b/contrib/fwupd.spec.in index 026149cb7..a5f7441a3 100644 --- a/contrib/fwupd.spec.in +++ b/contrib/fwupd.spec.in @@ -461,6 +461,7 @@ done %if 0%{?have_dell} %{_libdir}/fwupd-plugins-%{fwupdplugin_version}/libfu_plugin_synaptics_mst.so %endif +%{_libdir}/fwupd-plugins-%{fwupdplugin_version}/libfu_plugin_synaptics_cape.so %{_libdir}/fwupd-plugins-%{fwupdplugin_version}/libfu_plugin_synaptics_cxaudio.so %{_libdir}/fwupd-plugins-%{fwupdplugin_version}/libfu_plugin_synaptics_prometheus.so %{_libdir}/fwupd-plugins-%{fwupdplugin_version}/libfu_plugin_synaptics_rmi.so diff --git a/plugins/meson.build b/plugins/meson.build index 4df17e769..f857f9760 100644 --- a/plugins/meson.build +++ b/plugins/meson.build @@ -54,6 +54,7 @@ subdir('rts54hub') subdir('solokey') subdir('steelseries') subdir('superio') +subdir('synaptics-cape') subdir('synaptics-cxaudio') subdir('synaptics-mst') subdir('synaptics-prometheus') diff --git a/plugins/synaptics-cape/README.md b/plugins/synaptics-cape/README.md new file mode 100644 index 000000000..d8d9b91a2 --- /dev/null +++ b/plugins/synaptics-cape/README.md @@ -0,0 +1,41 @@ +# Synaptics CAPE devices + +## Introduction + +This plugin is used to update Synaptics CAPE based audio devices. + +## Firmware Format + +The daemon will decompress the cabinet archive and extract a firmware blob. + +This plugin supports the following protocol ID: + +* com.synaptics.cape + +## GUID Generation + +These devices use the standard USB DeviceInstanceId values, e.g. + +* `USB\VID_1395&PID_0293` + +These devices also use custom GUID values, e.g. + +* `SYNAPTICS_CAPE\CX31993` +* `SYNAPTICS_CAPE\CX31988` + +## Update Behavior + +The firmware is deployed when the device is in normal runtime mode, and the +device will reset when the new firmware has been written. + +## Vendor ID Security + +The vendor ID is set from the USB vendor, in this instance set to `USB:0x1395` + +## Quirk Use + +This plugin uses no plugin-specific quirks. + +## External Interface Access + +This plugin requires read/write access to `/dev/bus/usb`. diff --git a/plugins/synaptics-cape/fu-plugin-synaptics-cape.c b/plugins/synaptics-cape/fu-plugin-synaptics-cape.c new file mode 100644 index 000000000..c6af42938 --- /dev/null +++ b/plugins/synaptics-cape/fu-plugin-synaptics-cape.c @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2021 Synaptics Incorporated + * + * SPDX-License-Identifier: LGPL-2.1+ + */ + +#include "config.h" + +#include + +#include "fu-synaptics-cape-device.h" +#include "fu-synaptics-cape-firmware.h" + +void +fu_plugin_init(FuPlugin *plugin) +{ + fu_plugin_set_build_hash(plugin, FU_BUILD_HASH); + fu_plugin_add_device_gtype(plugin, FU_TYPE_SYNAPTICS_CAPE_DEVICE); + fu_plugin_add_firmware_gtype(plugin, NULL, FU_TYPE_SYNAPTICS_CAPE_FIRMWARE); +} diff --git a/plugins/synaptics-cape/fu-synaptics-cape-device.c b/plugins/synaptics-cape/fu-synaptics-cape-device.c new file mode 100644 index 000000000..12557c4ba --- /dev/null +++ b/plugins/synaptics-cape/fu-synaptics-cape-device.c @@ -0,0 +1,673 @@ +/* + * Copyright (C) 2021 Synaptics Incorporated + * + * SPDX-License-Identifier: LGPL-2.1+ + */ + +#include "config.h" + +#include + +#include + +#include "fu-synaptics-cape-device.h" +#include "fu-synaptics-cape-firmware.h" + +/* defines timings */ +#define FU_SYNAPTICS_CAPE_DEVICE_USB_CMD_WRITE_TIMEOUT 20000 /* us */ +#define FU_SYNAPTICS_CAPE_DEVICE_USB_CMD_READ_TIMEOUT 30000 /* us */ +#define FU_SYNAPTICS_CAPE_DEVICE_USB_CMD_RETRY_INTERVAL 10 /* ms */ +#define FU_SYNAPTICS_CAPE_DEVICE_USB_CMD_RETRY_TIMEOUT 300 /* ms */ +#define FU_SYNAPTICS_CAPE_DEVICE_USB_RESET_DELAY_MS 3000 /* ms */ + +/* define CAPE command constant values and macro */ +#define FU_SYNAPTICS_CAPE_DEVICE_GOLEM_REPORT_ID 1 /* HID report id */ + +#define FU_SYNAPTICS_CAPE_CMD_MAX_DATA_LEN 13 /* number of guint32 */ +#define FU_SYNAPTICS_CAPE_CMD_WRITE_DATAL_LEN 8 /* number of guint32 */ +#define FU_SYNAPTICS_CAPE_WORD_IN_BYTES 4 /* bytes */ + +#define FU_SYNAPTICS_CAPE_CMD_APP_ID(a, b, c, d) \ + ((((a)-0x20) << 8) | (((b)-0x20) << 14) | (((c)-0x20) << 20) | (((d)-0x20) << 26)) + +/* CAPE command return codes */ +#define FU_SYNAPTICS_CAPE_MODULE_RC_GENERIC_FAILURE (-1025) +#define FU_SYNAPTICS_CAPE_MODULE_RC_ALREADY_EXISTS (-1026) +#define FU_SYNAPTICS_CAPE_MODULE_RC_NULL_APP_POINTER (-1027) +#define FU_SYNAPTICS_CAPE_MODULE_RC_NULL_MODULE_POINTER (-1028) +#define FU_SYNAPTICS_CAPE_MODULE_RC_NULL_STREAM_POINTER (-1029) +#define FU_SYNAPTICS_CAPE_MODULE_RC_NULL_POINTER (-1030) + +#define FU_SYNAPTICS_CAPE_MODULE_RC_BAD_APP_ID (-1031) +#define FU_SYNAPTICS_CAPE_MODULE_RC_MODULE_TYPE_HAS_NO_API (-1034) +#define FU_SYNAPTICS_CAPE_MODULE_RC_BAD_MAGIC_NUMBER (-1052) +#define FU_SYNAPTICS_CAPE_MODULE_RC_CMD_MODE_UNSUPPORTED (-1056) + +#define FU_SYNAPTICS_CMD_GET_FLAG 0x100 /* GET flag */ + +/* CAPE message structure, Little endian */ +typedef struct __attribute__((packed)) { + gint16 data_len : 16; /* data length in dwords */ + guint16 cmd_id : 15; /* Command id */ + guint16 reply : 1; /* Host want a reply from device, 1 = true */ + guint32 module_id; /* Module id */ + guint32 data[FU_SYNAPTICS_CAPE_CMD_MAX_DATA_LEN]; /* Command data */ +} FuCapCmd; + +/* CAPE HID report structure */ +typedef struct __attribute__((packed)) { + guint16 report_id; /* two bytes of report id, this should be 1 */ + FuCapCmd cmd; +} FuCapCmdHidReport; + +/* CAPE Commands */ +typedef enum { + FU_SYNAPTICS_CMD_FW_UPDATE_START = 0xC8, /* notifies firmware update started */ + FU_SYNAPTICS_CMD_FW_UPDATE_WRITE = 0xC9, /* updates firmware data */ + FU_SYNAPTICS_CMD_FW_UPDATE_END = 0xCA, /* notifies firmware update finished */ + FU_SYNAPTICS_CMD_MCU_SOFT_RESET = 0xAF, /* reset device*/ + FU_SYNAPTICS_CMD_FW_GET_ACTIVE_PARTITION = 0x1CF, /* gets cur active partition number */ + FU_SYNAPTICS_CMD_GET_VERSION = 0x103, /* gets cur firmware version */ +} FuCommand; + +/* CAPE Fuupd device structure */ +struct _FuSynapticsCapeDevice { + FuHidDevice parent_instance; + guint32 ActivePartition; /* active partition, either 1 or 2 */ +}; + +G_DEFINE_TYPE(FuSynapticsCapeDevice, fu_synaptics_cape_device, FU_TYPE_HID_DEVICE) + +/* Sends SET_REPORT to device */ +static gboolean +fu_synaptics_cape_device_set_report(FuSynapticsCapeDevice *self, + const FuCapCmdHidReport *data, + GError **error) +{ + g_return_val_if_fail(FU_IS_SYNAPTICS_CAPE_DEVICE(self), FALSE); + g_return_val_if_fail(data != NULL, FALSE); + g_return_val_if_fail(error == NULL || *error == NULL, FALSE); + + if (g_getenv("FWUPD_SYNAPTICS_CAPE_HID_REPORT_VERBOSE") != NULL) + fu_common_dump_raw(G_LOG_DOMAIN, "SetReport", (guint8 *)data, sizeof(*data)); + + return fu_hid_device_set_report(FU_HID_DEVICE(self), + FU_SYNAPTICS_CAPE_DEVICE_GOLEM_REPORT_ID, + (guint8 *)data, + sizeof(*data), + FU_SYNAPTICS_CAPE_DEVICE_USB_CMD_WRITE_TIMEOUT, + FU_HID_DEVICE_FLAG_NONE, + error); +} + +/* Gets data from device via GET_REPORT */ +static gboolean +fu_synaptics_cape_device_get_report(FuSynapticsCapeDevice *self, + FuCapCmdHidReport *data, + GError **error) +{ + g_return_val_if_fail(FU_IS_SYNAPTICS_CAPE_DEVICE(self), FALSE); + g_return_val_if_fail(data != NULL, FALSE); + g_return_val_if_fail(error == NULL || *error == NULL, FALSE); + + if (!fu_hid_device_get_report(FU_HID_DEVICE(self), + FU_SYNAPTICS_CAPE_DEVICE_GOLEM_REPORT_ID, + (guint8 *)data, + sizeof(*data), + FU_SYNAPTICS_CAPE_DEVICE_USB_CMD_READ_TIMEOUT, + FU_HID_DEVICE_FLAG_NONE, + error)) + return FALSE; + + if (g_getenv("FWUPD_SYNAPTICS_CAPE_HID_REPORT_VERBOSE") != NULL) + fu_common_dump_raw(G_LOG_DOMAIN, "GetReport", (guint8 *)data, sizeof(*data)); + + /* success */ + return TRUE; +} + +/* dump CAPE command error if any */ +static gboolean +fu_synaptics_cape_device_rc_set_error(const FuCapCmd *rsp, GError **error) +{ + g_return_val_if_fail(rsp != NULL, FALSE); + g_return_val_if_fail(error == NULL || *error == NULL, FALSE); + + if (rsp->data_len >= 0) + return TRUE; + + switch (rsp->data_len) { + case FU_SYNAPTICS_CAPE_MODULE_RC_GENERIC_FAILURE: + g_set_error(error, G_IO_ERROR, G_IO_ERROR_BUSY, "CMD ERROR: generic failure"); + break; + case FU_SYNAPTICS_CAPE_MODULE_RC_ALREADY_EXISTS: + g_set_error(error, G_IO_ERROR, G_IO_ERROR_BUSY, "CMD ERROR: already exists"); + break; + case FU_SYNAPTICS_CAPE_MODULE_RC_NULL_APP_POINTER: + g_set_error(error, G_IO_ERROR, G_IO_ERROR_BUSY, "CMD ERROR: null app pointer"); + break; + case FU_SYNAPTICS_CAPE_MODULE_RC_NULL_MODULE_POINTER: + g_set_error(error, G_IO_ERROR, G_IO_ERROR_BUSY, "CMD ERROR: null module pointer"); + break; + case FU_SYNAPTICS_CAPE_MODULE_RC_NULL_POINTER: + g_set_error(error, G_IO_ERROR, G_IO_ERROR_BUSY, "CMD ERROR: null pointer"); + break; + case FU_SYNAPTICS_CAPE_MODULE_RC_BAD_APP_ID: + g_set_error(error, G_IO_ERROR, G_IO_ERROR_BUSY, "CMD ERROR: bad app id"); + break; + case FU_SYNAPTICS_CAPE_MODULE_RC_MODULE_TYPE_HAS_NO_API: + g_set_error(error, G_IO_ERROR, G_IO_ERROR_BUSY, "CMD ERROR: has no api"); + break; + case FU_SYNAPTICS_CAPE_MODULE_RC_BAD_MAGIC_NUMBER: + g_set_error(error, G_IO_ERROR, G_IO_ERROR_BUSY, "CMD ERROR: bad magic number"); + break; + case FU_SYNAPTICS_CAPE_MODULE_RC_CMD_MODE_UNSUPPORTED: + g_set_error(error, G_IO_ERROR, G_IO_ERROR_BUSY, "CMD ERROR: mode unsupported"); + break; + default: + g_set_error(error, + G_IO_ERROR, + G_IO_ERROR_BUSY, + "CMD ERROR: unknown error: %d", + rsp->data_len); + } + + /* success */ + return FALSE; +} + +/* sends a FuCapCmd structure command to device to get the response in the same structure */ +static gboolean +fu_synaptics_cape_device_sendcmd_ex(FuSynapticsCapeDevice *self, + FuCapCmd *req, + gulong delay_us, + GError **error) +{ + FuCapCmdHidReport report; + guint elapsed_ms = 0; + gboolean is_get = FALSE; + + g_return_val_if_fail(FU_IS_SYNAPTICS_CAPE_DEVICE(self), FALSE); + g_return_val_if_fail(req != NULL, FALSE); + g_return_val_if_fail(error == NULL || *error == NULL, FALSE); + + /* first two bytes are report id */ + report.report_id = GINT16_TO_LE(FU_SYNAPTICS_CAPE_DEVICE_GOLEM_REPORT_ID); + + if (!fu_memcpy_safe((guint8 *)&report.cmd, + sizeof(report.cmd), + 0, /* dst */ + (const guint8 *)req, + sizeof(*req), + 0, /* src */ + sizeof(*req), + error)) + return FALSE; + + /* sets data length to MAX for any GET commands */ + if (FU_SYNAPTICS_CMD_GET_FLAG & report.cmd.cmd_id) { + is_get = TRUE; + report.cmd.data_len = GINT16_TO_LE(FU_SYNAPTICS_CAPE_CMD_MAX_DATA_LEN); + } else { + report.cmd.data_len = GINT16_TO_LE(report.cmd.data_len); + } + + report.cmd.cmd_id = GUINT32_TO_LE(report.cmd.cmd_id); + report.cmd.module_id = GUINT32_TO_LE(report.cmd.module_id); + + if (!fu_synaptics_cape_device_set_report(self, &report, error)) { + g_prefix_error(error, "failed to send: "); + return FALSE; + } + if (delay_us > 0) + g_usleep(delay_us); + + /* wait for the command to complete */ + for (; elapsed_ms < FU_SYNAPTICS_CAPE_DEVICE_USB_CMD_RETRY_TIMEOUT; + elapsed_ms += FU_SYNAPTICS_CAPE_DEVICE_USB_CMD_RETRY_INTERVAL) { + if (!fu_synaptics_cape_device_get_report(self, &report, error)) + return FALSE; + if (report.cmd.reply) + break; + g_usleep(FU_SYNAPTICS_CAPE_DEVICE_USB_CMD_RETRY_INTERVAL * 1000); + } + + if (!report.cmd.reply) { + g_set_error(error, FWUPD_ERROR, FWUPD_ERROR_NOT_SUPPORTED, "send command time out"); + return FALSE; + } + + /* copy returned data if it is GET command */ + if (is_get) { + req->data_len = + (gint16)fu_common_read_uint16((guint8 *)&report.cmd, G_LITTLE_ENDIAN); + + for (int i = 0; i < FU_SYNAPTICS_CAPE_CMD_MAX_DATA_LEN; i++) + req->data[i] = GUINT32_FROM_LE(report.cmd.data[i]); + } + + return fu_synaptics_cape_device_rc_set_error(&report.cmd, error); +} + +/* a simple version of sendcmd_ex without returned data */ +static gboolean +fu_synaptics_cape_device_sendcmd(FuSynapticsCapeDevice *self, + const guint32 module_id, + const guint32 cmd_id, + const guint32 *data, + const guint32 data_len, + const gulong delay_us, + GError **error) +{ + FuCapCmd cmd = {0}; + const guint32 dataszbyte = data_len * FU_SYNAPTICS_CAPE_WORD_IN_BYTES; + + g_return_val_if_fail(error == NULL || *error == NULL, FALSE); + + cmd.cmd_id = cmd_id; + cmd.module_id = module_id; + + if (data_len != 0 && data != NULL) { + cmd.data_len = data_len; + if (!fu_memcpy_safe((guint8 *)cmd.data, + sizeof(cmd.data), + 0, /* dst */ + (const guint8 *)data, + dataszbyte, + 0, /* src */ + dataszbyte, + error)) + return FALSE; + } + return fu_synaptics_cape_device_sendcmd_ex(self, &cmd, delay_us, error); +} + +static void +fu_synaptics_cape_device_to_string(FuDevice *device, guint idt, GString *str) +{ + FuSynapticsCapeDevice *self = FU_SYNAPTICS_CAPE_DEVICE(device); + + g_return_if_fail(FU_IS_SYNAPTICS_CAPE_DEVICE(self)); + + fu_common_string_append_ku(str, idt, "active_partition", self->ActivePartition); +} + +/* reset device */ +static gboolean +fu_synaptics_cape_device_reset(FuSynapticsCapeDevice *self, GError **error) +{ + g_autoptr(GTimer) timer = g_timer_new(); + + g_return_val_if_fail(FU_IS_SYNAPTICS_CAPE_DEVICE(self), FALSE); + g_return_val_if_fail(error == NULL || *error == NULL, FALSE); + + if (!fu_synaptics_cape_device_sendcmd(self, + FU_SYNAPTICS_CAPE_CMD_APP_ID('C', 'T', 'R', 'L'), + FU_SYNAPTICS_CMD_MCU_SOFT_RESET, + NULL, + 0, + 0, + error)) { + g_set_error(error, + FWUPD_ERROR, + FWUPD_ERROR_NOT_SUPPORTED, + "reset command is not supported"); + + return FALSE; + } + + g_usleep(1000 * FU_SYNAPTICS_CAPE_DEVICE_USB_RESET_DELAY_MS); + + g_debug("reset took %.2lfms", g_timer_elapsed(timer, NULL) * 1000); + + /* success */ + return TRUE; +} + +/** + * fu_synaptics_cape_device_get_active_partition: + * @self: a #FuSynapticsCapeDevice + * @error: return location for an error + * + * Updates active partition information to FuSynapticsCapeDevice::ActivePartition + * + * Returns: returns TRUE if operation is successful, otherwise, return FALSE if + * unsuccessful. + * + **/ +static gboolean +fu_synaptics_cape_device_setup_active_partition(FuSynapticsCapeDevice *self, GError **error) +{ + FuCapCmd cmd = {0}; + + g_return_val_if_fail(FU_IS_SYNAPTICS_CAPE_DEVICE(self), FALSE); + g_return_val_if_fail(error == NULL || *error == NULL, FALSE); + + cmd.cmd_id = FU_SYNAPTICS_CMD_FW_GET_ACTIVE_PARTITION; + cmd.module_id = FU_SYNAPTICS_CAPE_CMD_APP_ID('C', 'T', 'R', 'L'); + + if (!fu_synaptics_cape_device_sendcmd_ex(self, &cmd, 0, error)) + return FALSE; + + self->ActivePartition = GUINT32_FROM_LE(cmd.data[0]); + + if (self->ActivePartition != 1 && self->ActivePartition != 2) { + g_set_error(error, + FWUPD_ERROR, + FWUPD_ERROR_NOT_SUPPORTED, + "partition number out of range, returned partition number is %u", + self->ActivePartition); + return FALSE; + } + + /* success */ + return TRUE; +} + +/* gets version number from device and saves to FU_DEVICE */ +static gboolean +fu_synaptics_cape_device_setup_version(FuSynapticsCapeDevice *self, GError **error) +{ + guint32 version_raw; + FuCapCmd cmd = {0}; + g_autofree gchar *version_str = NULL; + + cmd.cmd_id = GUINT32_TO_LE(FU_SYNAPTICS_CMD_GET_VERSION); + cmd.module_id = FU_SYNAPTICS_CAPE_CMD_APP_ID('C', 'T', 'R', 'L'); + cmd.data_len = 4; + + g_return_val_if_fail(FU_IS_SYNAPTICS_CAPE_DEVICE(self), FALSE); + g_return_val_if_fail(error == NULL || *error == NULL, FALSE); + + /* gets version number from device */ + fu_synaptics_cape_device_sendcmd_ex(self, &cmd, 0, error); + + /* The version number are stored in lowest byte of a sequence of returned data */ + version_raw = + (GUINT32_FROM_LE(cmd.data[0]) << 24) | ((GUINT32_FROM_LE(cmd.data[1]) & 0xFF) << 16) | + ((GUINT32_FROM_LE(cmd.data[2]) & 0xFF) << 8) | (GUINT32_FROM_LE(cmd.data[3]) & 0xFF); + + version_str = fu_common_version_from_uint32(version_raw, FWUPD_VERSION_FORMAT_QUAD); + fu_device_set_version(FU_DEVICE(self), version_str); + fu_device_set_version_raw(FU_DEVICE(self), version_raw); + fu_device_add_flag(FU_DEVICE(self), FWUPD_DEVICE_FLAG_UPDATABLE); + + /* success */ + return TRUE; +} + +static gboolean +fu_synaptics_cape_device_setup(FuDevice *device, GError **error) +{ + FuSynapticsCapeDevice *self = FU_SYNAPTICS_CAPE_DEVICE(device); + + g_return_val_if_fail(FU_IS_SYNAPTICS_CAPE_DEVICE(self), FALSE); + g_return_val_if_fail(error == NULL || *error == NULL, FALSE); + + /* FuUsbDevice->setup */ + if (!FU_DEVICE_CLASS(fu_synaptics_cape_device_parent_class)->setup(device, error)) + return FALSE; + + if (!fu_synaptics_cape_device_setup_version(self, error)) { + g_prefix_error(error, "failed to get firmware version info: "); + return FALSE; + } + + if (!fu_synaptics_cape_device_setup_active_partition(self, error)) { + g_prefix_error(error, "failed to get active partition info: "); + return FALSE; + } + + /* success */ + return TRUE; +} + +static FuFirmware * +fu_synaptics_cape_device_prepare_firmware(FuDevice *device, + GBytes *fw, + FwupdInstallFlags flags, + GError **error) +{ + FuSynapticsCapeDevice *self = FU_SYNAPTICS_CAPE_DEVICE(device); + GUsbDevice *usb_device = fu_usb_device_get_dev(FU_USB_DEVICE(self)); + g_autoptr(FuFirmware) firmware = fu_synaptics_cape_firmware_new(); + gsize offset = 0; + g_autoptr(GBytes) new_fw = NULL; + + /* the "fw" includes two firmware data for each partition, we need to divide 'fw' into + * two equal parts. + */ + gsize bufsz = g_bytes_get_size(fw); + + g_return_val_if_fail(FU_IS_SYNAPTICS_CAPE_DEVICE(self), NULL); + g_return_val_if_fail(usb_device != NULL, NULL); + g_return_val_if_fail(fw != NULL, NULL); + g_return_val_if_fail(firmware != NULL, NULL); + g_return_val_if_fail(error == NULL || *error == NULL, NULL); + + if ((guint32)bufsz % 4 != 0) { + g_set_error_literal(error, + FWUPD_ERROR, + FWUPD_ERROR_INVALID_FILE, + "data not aligned to 32 bits"); + return NULL; + } + + /* check file size */ + if (bufsz < FW_CAPE_HID_HEADER_SIZE * 2) { + g_set_error_literal(error, + FWUPD_ERROR, + FWUPD_ERROR_INVALID_FILE, + "file size is too small"); + return NULL; + } + + /* use second partition if active partition is 1 */ + if (self->ActivePartition == 1) + offset = bufsz / 2; + + new_fw = g_bytes_new_from_bytes(fw, offset, bufsz / 2); + + if (!fu_firmware_parse(firmware, new_fw, flags, error)) + return NULL; + + /* verify if correct device */ + if ((flags & FWUPD_INSTALL_FLAG_IGNORE_VID_PID) == 0) { + const guint16 vid = + fu_synaptics_cape_firmware_get_vid(FU_SYNAPTICS_CAPE_FIRMWARE(firmware)); + const guint16 pid = + fu_synaptics_cape_firmware_get_pid(FU_SYNAPTICS_CAPE_FIRMWARE(firmware)); + if (vid != 0x0 && pid != 0x0 && + (g_usb_device_get_vid(usb_device) != vid || + g_usb_device_get_pid(usb_device) != pid)) { + g_set_error(error, + FWUPD_ERROR, + FWUPD_ERROR_NOT_SUPPORTED, + "USB vendor or product incorrect, " + "got: %04X:%04X expected %04X:%04X", + vid, + pid, + g_usb_device_get_vid(usb_device), + g_usb_device_get_pid(usb_device)); + return NULL; + } + } + + /* success */ + return g_steal_pointer(&firmware); +} + +/* sends firmware header to device */ +static gboolean +fu_synaptics_cape_device_write_firmware_header(FuSynapticsCapeDevice *self, + GBytes *fw, + GError **error) +{ + const guint8 *buf = NULL; + gsize bufsz = 0; + + g_return_val_if_fail(FU_IS_SYNAPTICS_CAPE_DEVICE(self), FALSE); + g_return_val_if_fail(fw != NULL, FALSE); + g_return_val_if_fail(error == NULL || *error == NULL, FALSE); + + buf = g_bytes_get_data(fw, &bufsz); + + /* check size */ + if (bufsz != 20) { + g_set_error_literal(error, + FWUPD_ERROR, + FWUPD_ERROR_INVALID_FILE, + "firmware header is not 20 bytes"); + return FALSE; + } + + return fu_synaptics_cape_device_sendcmd(self, + FU_SYNAPTICS_CAPE_CMD_APP_ID('C', 'T', 'R', 'L'), + FU_SYNAPTICS_CMD_FW_UPDATE_START, + (const guint32 *)buf, + bufsz / FU_SYNAPTICS_CAPE_WORD_IN_BYTES, + 0, + error); +} + +/* sends firmware image to device */ +static gboolean +fu_synaptics_cape_device_write_firmware_image(FuSynapticsCapeDevice *self, + GBytes *fw, + FuProgress *progress, + GError **error) +{ + g_autoptr(GPtrArray) chunks = NULL; + + g_return_val_if_fail(FU_IS_SYNAPTICS_CAPE_DEVICE(self), FALSE); + g_return_val_if_fail(fw != NULL, FALSE); + g_return_val_if_fail(error == NULL || *error == NULL, FALSE); + + chunks = fu_chunk_array_new_from_bytes(fw, + 0x00, + 0x00, + FU_SYNAPTICS_CAPE_WORD_IN_BYTES * + FU_SYNAPTICS_CAPE_CMD_WRITE_DATAL_LEN); + + fu_progress_set_id(progress, G_STRLOC); + fu_progress_set_steps(progress, chunks->len); + for (guint i = 0; i < chunks->len; i++) { + FuChunk *chk = g_ptr_array_index(chunks, i); + if (!fu_synaptics_cape_device_sendcmd( + self, + FU_SYNAPTICS_CAPE_CMD_APP_ID('C', 'T', 'R', 'L'), + FU_SYNAPTICS_CMD_FW_UPDATE_WRITE, + (const guint32 *)fu_chunk_get_data(chk), + fu_chunk_get_data_sz(chk) / FU_SYNAPTICS_CAPE_WORD_IN_BYTES, + 0, + error)) { + g_prefix_error(error, "failed send on chk %u: ", i); + return FALSE; + } + fu_progress_step_done(progress); + } + + /* success */ + return TRUE; +} + +/* performs firmware update */ +static gboolean +fu_synaptics_cape_device_write_firmware(FuDevice *device, + FuFirmware *firmware, + FuProgress *progress, + FwupdInstallFlags flags, + GError **error) +{ + FuSynapticsCapeDevice *self = FU_SYNAPTICS_CAPE_DEVICE(device); + g_autoptr(GBytes) fw = NULL; + g_autoptr(GBytes) fw_header = NULL; + + g_return_val_if_fail(FU_IS_SYNAPTICS_CAPE_DEVICE(self), FALSE); + g_return_val_if_fail(firmware != NULL, FALSE); + g_return_val_if_fail(error == NULL || *error == NULL, FALSE); + + /* progress */ + fu_progress_set_id(progress, G_STRLOC); + fu_progress_add_step(progress, FWUPD_STATUS_DEVICE_WRITE, 2); /* header */ + fu_progress_add_step(progress, FWUPD_STATUS_DEVICE_WRITE, 69); + fu_progress_add_step(progress, FWUPD_STATUS_DEVICE_VERIFY, 0); + fu_progress_add_step(progress, FWUPD_STATUS_DEVICE_RESTART, 29); + + fw_header = fu_firmware_get_image_by_id_bytes(firmware, FU_FIRMWARE_ID_HEADER, error); + if (fw_header == NULL) + return FALSE; + if (!fu_synaptics_cape_device_write_firmware_header(self, fw_header, error)) { + g_prefix_error(error, "update header failed: "); + return FALSE; + } + fu_progress_step_done(progress); + + /* perform the actual write */ + fw = fu_firmware_get_bytes(firmware, error); + if (fw == NULL) + return FALSE; + if (!fu_synaptics_cape_device_write_firmware_image(self, + fw, + fu_progress_get_child(progress), + error)) { + g_prefix_error(error, "update image failed: "); + return FALSE; + } + fu_progress_step_done(progress); + + /* verify the firmware image */ + if (!fu_synaptics_cape_device_sendcmd(self, + FU_SYNAPTICS_CAPE_CMD_APP_ID('C', 'T', 'R', 'L'), + FU_SYNAPTICS_CMD_FW_UPDATE_END, + NULL, + 0, + 0, + error)) { + g_prefix_error(error, "failed to verify firmware: "); + return FALSE; + } + fu_progress_step_done(progress); + + /* send software reset to run available flash code */ + if (!fu_synaptics_cape_device_reset(self, error)) + return FALSE; + fu_progress_step_done(progress); + + /* success */ + fu_device_add_flag(device, FWUPD_DEVICE_FLAG_WAIT_FOR_REPLUG); + return TRUE; +} + +static void +fu_synaptics_cape_device_set_progress(FuDevice *self, FuProgress *progress) +{ + fu_progress_set_id(progress, G_STRLOC); + fu_progress_add_step(progress, FWUPD_STATUS_DEVICE_RESTART, 2); /* detach */ + fu_progress_add_step(progress, FWUPD_STATUS_DEVICE_WRITE, 94); /* write */ + fu_progress_add_step(progress, FWUPD_STATUS_DEVICE_RESTART, 2); /* attach */ + fu_progress_add_step(progress, FWUPD_STATUS_DEVICE_BUSY, 2); /* reload */ +} + +static void +fu_synaptics_cape_device_init(FuSynapticsCapeDevice *self) +{ + fu_device_add_icon(FU_DEVICE(self), "audio-card"); + fu_device_add_flag(FU_DEVICE(self), FWUPD_DEVICE_FLAG_UPDATABLE); + fu_device_set_version_format(FU_DEVICE(self), FWUPD_VERSION_FORMAT_QUAD); + fu_device_set_install_duration(FU_DEVICE(self), 3); /* seconds */ + fu_device_add_protocol(FU_DEVICE(self), "com.synaptics.cape"); + fu_device_retry_set_delay(FU_DEVICE(self), 100); /* ms */ + fu_device_set_remove_delay(FU_DEVICE(self), FU_DEVICE_REMOVE_DELAY_RE_ENUMERATE); +} + +static void +fu_synaptics_cape_device_class_init(FuSynapticsCapeDeviceClass *klass) +{ + FuDeviceClass *klass_device = FU_DEVICE_CLASS(klass); + klass_device->to_string = fu_synaptics_cape_device_to_string; + klass_device->setup = fu_synaptics_cape_device_setup; + klass_device->write_firmware = fu_synaptics_cape_device_write_firmware; + klass_device->prepare_firmware = fu_synaptics_cape_device_prepare_firmware; + klass_device->set_progress = fu_synaptics_cape_device_set_progress; +} diff --git a/plugins/synaptics-cape/fu-synaptics-cape-device.h b/plugins/synaptics-cape/fu-synaptics-cape-device.h new file mode 100644 index 000000000..ca7d9becc --- /dev/null +++ b/plugins/synaptics-cape/fu-synaptics-cape-device.h @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2021 Synaptics Incorporated + * + * SPDX-License-Identifier: LGPL-2.1+ + */ + +#pragma once + +#include + +#define FU_TYPE_SYNAPTICS_CAPE_DEVICE (fu_synaptics_cape_device_get_type()) +G_DECLARE_FINAL_TYPE(FuSynapticsCapeDevice, + fu_synaptics_cape_device, + FU, + SYNAPTICS_CAPE_DEVICE, + FuHidDevice) + +struct _FuSynapticsCapeDeviceClass { + FuHidDeviceClass parent_class; +}; diff --git a/plugins/synaptics-cape/fu-synaptics-cape-firmware.c b/plugins/synaptics-cape/fu-synaptics-cape-firmware.c new file mode 100644 index 000000000..702929d88 --- /dev/null +++ b/plugins/synaptics-cape/fu-synaptics-cape-firmware.c @@ -0,0 +1,216 @@ +/* + * Copyright (C) 2021 Synaptics Incorporated + * + * SPDX-License-Identifier: LGPL-2.1+ + */ + +#include "config.h" + +#include + +#include + +#include "fu-synaptics-cape-firmware.h" + +typedef struct __attribute__((packed)) { + guint32 data[8]; +} FuCapeHidFwCmdUpdateWritePar; + +struct _FuSynapticsCapeFirmware { + FuFirmware parent_instance; + guint16 vid; + guint16 pid; +}; + +/* Firmware update command structure, little endian */ +typedef struct __attribute__((packed)) { + guint32 vid; /* USB vendor id */ + guint32 pid; /* USB product id */ + guint32 fw_update_type; /* firmware update type */ + guint32 fw_signature; /* firmware identifier */ + guint32 crc_value; /* used to detect accidental changes to fw data */ +} FuCapeHidFwCmdUpdateStartPar; + +typedef struct __attribute__((packed)) { + FuCapeHidFwCmdUpdateStartPar par; + guint16 version_w; /* firmware version is four parts number "z.y.x.w", this is last part */ + guint16 version_x; /* firmware version, third part */ + guint16 version_y; /* firmware version, second part */ + guint16 version_z; /* firmware version, first part */ + guint32 reserved3; +} FuCapeHidFileHeader; + +G_DEFINE_TYPE(FuSynapticsCapeFirmware, fu_synaptics_cape_firmware, FU_TYPE_FIRMWARE) + +guint16 +fu_synaptics_cape_firmware_get_vid(FuSynapticsCapeFirmware *self) +{ + g_return_val_if_fail(FU_IS_SYNAPTICS_CAPE_FIRMWARE(self), 0); + return self->vid; +} + +guint16 +fu_synaptics_cape_firmware_get_pid(FuSynapticsCapeFirmware *self) +{ + g_return_val_if_fail(FU_IS_SYNAPTICS_CAPE_FIRMWARE(self), 0); + return self->pid; +} + +static void +fu_synaptics_cape_firmware_export(FuFirmware *firmware, + FuFirmwareExportFlags flags, + XbBuilderNode *bn) +{ + FuSynapticsCapeFirmware *self = FU_SYNAPTICS_CAPE_FIRMWARE(firmware); + fu_xmlb_builder_insert_kx(bn, "vid", self->vid); + fu_xmlb_builder_insert_kx(bn, "pid", self->pid); +} + +static gboolean +fu_synaptics_cape_firmware_parse_header(FuSynapticsCapeFirmware *self, + FuFirmware *firmware, + GBytes *fw, + GError **error) +{ + gsize bufsz = 0x0; + guint16 version_w = 0; + guint16 version_x = 0; + guint16 version_y = 0; + guint16 version_z = 0; + const guint8 *buf = g_bytes_get_data(fw, &bufsz); + g_autofree gchar *version_str = NULL; + g_autoptr(FuFirmware) img_hdr = fu_firmware_new(); + g_autoptr(GBytes) fw_hdr = NULL; + + g_return_val_if_fail(FU_IS_SYNAPTICS_CAPE_FIRMWARE(self), FALSE); + g_return_val_if_fail(fw != NULL, FALSE); + g_return_val_if_fail(firmware != NULL, FALSE); + g_return_val_if_fail(error == NULL || *error == NULL, FALSE); + + /* the input fw image size should be the same as header size */ + if (bufsz < sizeof(FuCapeHidFileHeader)) { + g_set_error_literal(error, + FWUPD_ERROR, + FWUPD_ERROR_INVALID_FILE, + "not enough data to parse header"); + return FALSE; + } + + if (!fu_common_read_uint16_safe(buf, + bufsz, + FW_CAPE_HID_HEADER_OFFSET_VID, + &self->vid, + G_LITTLE_ENDIAN, + error)) + return FALSE; + if (!fu_common_read_uint16_safe(buf, + bufsz, + FW_CAPE_HID_HEADER_OFFSET_PID, + &self->pid, + G_LITTLE_ENDIAN, + error)) + return FALSE; + if (!fu_common_read_uint16_safe(buf, + bufsz, + FW_CAPE_HID_HEADER_OFFSET_VER_W, + &version_w, + G_LITTLE_ENDIAN, + error)) + return FALSE; + if (!fu_common_read_uint16_safe(buf, + bufsz, + FW_CAPE_HID_HEADER_OFFSET_VER_X, + &version_x, + G_LITTLE_ENDIAN, + error)) + return FALSE; + if (!fu_common_read_uint16_safe(buf, + bufsz, + FW_CAPE_HID_HEADER_OFFSET_VER_Y, + &version_y, + G_LITTLE_ENDIAN, + error)) + return FALSE; + if (!fu_common_read_uint16_safe(buf, + bufsz, + FW_CAPE_HID_HEADER_OFFSET_VER_Z, + &version_z, + G_LITTLE_ENDIAN, + error)) + return FALSE; + + version_str = g_strdup_printf("%u.%u.%u.%u", version_z, version_y, version_x, version_w); + fu_firmware_set_version(FU_FIRMWARE(self), version_str); + + fw_hdr = fu_common_bytes_new_offset(fw, 0, sizeof(FuCapeHidFwCmdUpdateStartPar), error); + if (fw_hdr == NULL) + return FALSE; + + fu_firmware_set_id(img_hdr, FU_FIRMWARE_ID_HEADER); + fu_firmware_set_bytes(img_hdr, fw_hdr); + fu_firmware_add_image(firmware, img_hdr); + + /* success */ + return TRUE; +} + +static gboolean +fu_synaptics_cape_firmware_parse(FuFirmware *firmware, + GBytes *fw, + guint64 addr_start, + guint64 addr_end, + FwupdInstallFlags flags, + GError **error) +{ + FuSynapticsCapeFirmware *self = FU_SYNAPTICS_CAPE_FIRMWARE(firmware); + const gsize bufsz = g_bytes_get_size(fw); + const gsize headsz = sizeof(FuCapeHidFileHeader); + g_autoptr(GBytes) fw_header = NULL; + g_autoptr(GBytes) fw_body = NULL; + + /* check minimum size */ + if (bufsz < sizeof(FuCapeHidFileHeader)) { + g_set_error_literal(error, + FWUPD_ERROR, + FWUPD_ERROR_INVALID_FILE, + "not enough data to parse header, size "); + return FALSE; + } + + if ((guint32)bufsz % 4 != 0) { + g_set_error_literal(error, + FWUPD_ERROR, + FWUPD_ERROR_INVALID_FILE, + "data not aligned to 32 bits"); + return FALSE; + } + + fw_header = g_bytes_new_from_bytes(fw, 0x0, headsz); + if (!fu_synaptics_cape_firmware_parse_header(self, firmware, fw_header, error)) + return FALSE; + + fw_body = g_bytes_new_from_bytes(fw, headsz, bufsz - headsz); + fu_firmware_set_id(firmware, FU_FIRMWARE_ID_PAYLOAD); + fu_firmware_set_bytes(firmware, fw_body); + return TRUE; +} + +static void +fu_synaptics_cape_firmware_init(FuSynapticsCapeFirmware *self) +{ + fu_firmware_add_flag(FU_FIRMWARE(self), FU_FIRMWARE_FLAG_HAS_VID_PID); +} + +static void +fu_synaptics_cape_firmware_class_init(FuSynapticsCapeFirmwareClass *klass) +{ + FuFirmwareClass *klass_firmware = FU_FIRMWARE_CLASS(klass); + klass_firmware->parse = fu_synaptics_cape_firmware_parse; + klass_firmware->export = fu_synaptics_cape_firmware_export; +} + +FuFirmware * +fu_synaptics_cape_firmware_new(void) +{ + return FU_FIRMWARE(g_object_new(FU_TYPE_SYNAPTICS_CAPE_FIRMWARE, NULL)); +} diff --git a/plugins/synaptics-cape/fu-synaptics-cape-firmware.h b/plugins/synaptics-cape/fu-synaptics-cape-firmware.h new file mode 100644 index 000000000..4b17f71f5 --- /dev/null +++ b/plugins/synaptics-cape/fu-synaptics-cape-firmware.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2021 Synaptics Incorporated + * + * SPDX-License-Identifier: LGPL-2.1+ + */ + +#pragma once + +#include + +#define FU_TYPE_SYNAPTICS_CAPE_FIRMWARE (fu_synaptics_cape_firmware_get_type()) + +G_DECLARE_FINAL_TYPE(FuSynapticsCapeFirmware, + fu_synaptics_cape_firmware, + FU, + SYNAPTICS_CAPE_FIRMWARE, + FuSrecFirmware) + +FuFirmware * +fu_synaptics_cape_firmware_new(void); + +guint16 +fu_synaptics_cape_firmware_get_vid(FuSynapticsCapeFirmware *self); + +guint16 +fu_synaptics_cape_firmware_get_pid(FuSynapticsCapeFirmware *self); + +#define FW_CAPE_HID_HEADER_OFFSET_VID 0x0 +#define FW_CAPE_HID_HEADER_OFFSET_PID 0x4 +#define FW_CAPE_HID_HEADER_OFFSET_UPDATE_TYPE 0x8 +#define FW_CAPE_HID_HEADER_OFFSET_SIGNATURE 0xc +#define FW_CAPE_HID_HEADER_OFFSET_CRC 0x10 +#define FW_CAPE_HID_HEADER_OFFSET_VER_W 0x14 +#define FW_CAPE_HID_HEADER_OFFSET_VER_X 0x16 +#define FW_CAPE_HID_HEADER_OFFSET_VER_Y 0x18 +#define FW_CAPE_HID_HEADER_OFFSET_VER_Z 0x1A + +#define FW_CAPE_HID_HEADER_SIZE 32 /* =sizeof(FuCapeHidFileHeader) */ diff --git a/plugins/synaptics-cape/meson.build b/plugins/synaptics-cape/meson.build new file mode 100644 index 000000000..c3c9f0ab3 --- /dev/null +++ b/plugins/synaptics-cape/meson.build @@ -0,0 +1,31 @@ +if get_option('gusb') +cargs = ['-DG_LOG_DOMAIN="FuPluginSynapticsCape"'] + +install_data(['synaptics-cape.quirk'], + install_dir: join_paths(datadir, 'fwupd', 'quirks.d') +) + +shared_module('fu_plugin_synaptics_cape', + fu_hash, + sources : [ + 'fu-plugin-synaptics-cape.c', + 'fu-synaptics-cape-device.c', + 'fu-synaptics-cape-firmware.c', # fuzzing + ], + include_directories : [ + root_incdir, + fwupd_incdir, + fwupdplugin_incdir, + ], + install : true, + install_dir: plugin_dir, + link_with : [ + fwupd, + fwupdplugin, + ], + c_args : cargs, + dependencies : [ + plugin_deps, + ], +) +endif diff --git a/plugins/synaptics-cape/synaptics-cape.quirk b/plugins/synaptics-cape/synaptics-cape.quirk new file mode 100644 index 000000000..ce595c419 --- /dev/null +++ b/plugins/synaptics-cape/synaptics-cape.quirk @@ -0,0 +1,78 @@ +# EPOS Raw Plus +[USB\VID_1395&PID_0280] +Guid = SYNAPTICS_CAPE\CX31993 + +[USB\VID_1395&PID_0281] +Guid = SYNAPTICS_CAPE\CX31993 + +# RAW Teams +[USB\VID_1395&PID_0294] +Guid = SYNAPTICS_CAPE\CX31993 + +[USB\VID_1395&PID_0295] +Guid = SYNAPTICS_CAPE\CX31993 + +[USB\VID_1395&PID_0296] +Guid = SYNAPTICS_CAPE\CX31993 + +[USB\VID_1395&PID_0297] +Guid = SYNAPTICS_CAPE\CX31993 + +[USB\VID_1395&PID_0298] +Guid = SYNAPTICS_CAPE\CX31993 + +[USB\VID_1395&PID_0299] +Guid = SYNAPTICS_CAPE\CX31993 + +[USB\VID_1395&PID_0400] +Guid = SYNAPTICS_CAPE\CX31993 + + +# EPOS Morgan-T +[USB\VID_1395&PID_0200] +Guid = SYNAPTICS_CAPE\CX31993 + +[USB\VID_1395&PID_0288] +Guid = SYNAPTICS_CAPE\CX31993 + +[USB\VID_1395&PID_0289] +Guid = SYNAPTICS_CAPE\CX31993 + +[USB\VID_1395&PID_028A] +Guid = SYNAPTICS_CAPE\CX31993 + +[USB\VID_1395&PID_028B] +Guid = SYNAPTICS_CAPE\CX31993 + +[USB\VID_1395&PID_028C] +Guid = SYNAPTICS_CAPE\CX31993 + +[USB\VID_1395&PID_028D] +Guid = SYNAPTICS_CAPE\CX31993 + +[USB\VID_1395&PID_028E] +Guid = SYNAPTICS_CAPE\CX31993 + +[USB\VID_1395&PID_028F] +Guid = SYNAPTICS_CAPE\CX31993 + +# EPOS Morgan-V +[USB\VID_1395&PID_0290] +Guid = SYNAPTICS_CAPE\CX31993 + +[USB\VID_1395&PID_0291] +Guid = SYNAPTICS_CAPE\CX31993 + +[USB\VID_1395&PID_0292] +Guid = SYNAPTICS_CAPE\CX31993 + +[USB\VID_1395&PID_0293] +Guid = SYNAPTICS_CAPE\CX31993 + +# USB audio codec Dongle +[SYNAPTICS_CAPE\CX31993] +Plugin = synaptics_cape + +# USB audio codec Hifi +[SYNAPTICS_CAPE\CX31988] +Plugin = synaptics_cape diff --git a/src/fuzzing/firmware/synaptics-cape.fw b/src/fuzzing/firmware/synaptics-cape.fw new file mode 100755 index 0000000000000000000000000000000000000000..c9a33df5e3393fc4bfc791e0bc967ce4f1d49f82 GIT binary patch literal 229440 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≈<3TIxBJa<9I`$h;i#Sx% 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ℑTVAm*@K!$@x1O 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%0D! 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 E8`#9V`2YX_ literal 0 HcmV?d00001 diff --git a/src/fuzzing/generate.py b/src/fuzzing/generate.py index 5754e53cf..d6e598862 100755 --- a/src/fuzzing/generate.py +++ b/src/fuzzing/generate.py @@ -38,6 +38,7 @@ if __name__ == "__main__": ("srec-addr32.builder.xml", "srec-addr32.srec"), ("srec.builder.xml", "srec.srec"), ("synaprom.builder.xml", "synaprom.bin"), + ("synaptics-cape.builder.xml", "synaptics-cape.fw"), ("synaptics-mst.builder.xml", "synaptics-mst.dat"), ("wacom.builder.xml", "wacom.wac"), ]: diff --git a/src/fuzzing/synaptics-cape.builder.xml b/src/fuzzing/synaptics-cape.builder.xml new file mode 100644 index 000000000..fe8cea0df --- /dev/null +++ b/src/fuzzing/synaptics-cape.builder.xml @@ -0,0 +1,11 @@ + + has-vid-pid + payload + 8.41.24.0 + EFSCh... + + header + + + +