mirror of
https://git.proxmox.com/git/fwupd
synced 2025-05-24 13:12:58 +00:00

CSR is short for Cambridge Silicon Radio, which is a the OEM that makes most of the bluetooth audio chips in vendor hardware. The hardware vendor can enable or disable features on the CSR microcontroller depending on licensing options. The hardware vendor can also use a custom USB descriptor, or just set a custom PID. In the latter case we need to set the vendor and model to reality using quirks. This commit allows the user to update the firmware in the AIAIAI H05 wireless headphones.
81 lines
2.5 KiB
C
81 lines
2.5 KiB
C
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
|
|
*
|
|
* Copyright (C) 2017 Richard Hughes <richard@hughsie.com>
|
|
*
|
|
* Licensed under the GNU General Public License Version 2
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*/
|
|
|
|
#include "config.h"
|
|
|
|
#include "fu-plugin.h"
|
|
#include "fu-plugin-vfuncs.h"
|
|
|
|
#include "fu-csr-device.h"
|
|
|
|
gboolean
|
|
fu_plugin_usb_device_added (FuPlugin *plugin, GUsbDevice *usb_device, GError **error)
|
|
{
|
|
g_autoptr(FuCsrDevice) device = NULL;
|
|
g_autoptr(FuDeviceLocker) locker = NULL;
|
|
device = fu_csr_device_new (usb_device);
|
|
fu_device_set_quirks (FU_DEVICE (device), fu_plugin_get_quirks (plugin));
|
|
locker = fu_device_locker_new (device, error);
|
|
if (locker == NULL)
|
|
return FALSE;
|
|
fu_plugin_device_add (plugin, FU_DEVICE (device));
|
|
return TRUE;
|
|
}
|
|
|
|
gboolean
|
|
fu_plugin_verify (FuPlugin *plugin, FuDevice *device,
|
|
FuPluginVerifyFlags flags, GError **error)
|
|
{
|
|
g_autoptr(GBytes) blob_fw = NULL;
|
|
g_autoptr(FuDeviceLocker) locker = NULL;
|
|
GChecksumType checksum_types[] = {
|
|
G_CHECKSUM_SHA1,
|
|
G_CHECKSUM_SHA256,
|
|
0 };
|
|
|
|
/* get data */
|
|
locker = fu_device_locker_new (device, error);
|
|
if (locker == NULL)
|
|
return FALSE;
|
|
blob_fw = fu_csr_device_upload (FU_CSR_DEVICE (device), error);
|
|
if (blob_fw == NULL)
|
|
return FALSE;
|
|
for (guint i = 0; checksum_types[i] != 0; i++) {
|
|
g_autofree gchar *hash = NULL;
|
|
hash = g_compute_checksum_for_bytes (checksum_types[i], blob_fw);
|
|
fu_device_add_checksum (device, hash);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
gboolean
|
|
fu_plugin_update (FuPlugin *plugin, FuDevice *device, GBytes *blob_fw,
|
|
FwupdInstallFlags flags, GError **error)
|
|
{
|
|
g_autoptr(FuDeviceLocker) locker = NULL;
|
|
locker = fu_device_locker_new (device, error);
|
|
if (locker == NULL)
|
|
return FALSE;
|
|
if (!fu_csr_device_download (FU_CSR_DEVICE (device), blob_fw, error))
|
|
return FALSE;
|
|
return fu_csr_device_attach (FU_CSR_DEVICE (device), error);
|
|
}
|