mirror of
https://git.proxmox.com/git/fwupd
synced 2025-05-21 17:32:04 +00:00
140 lines
5.1 KiB
C
140 lines
5.1 KiB
C
/*
|
|
* Copyright (C) 2019 Richard Hughes <richard@hughsie.com>
|
|
*
|
|
* SPDX-License-Identifier: LGPL-2.1+
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "fu-synaptics-rmi-common.h"
|
|
#include "fu-udev-device.h"
|
|
|
|
#define FU_TYPE_SYNAPTICS_RMI_DEVICE (fu_synaptics_rmi_device_get_type ())
|
|
G_DECLARE_DERIVABLE_TYPE (FuSynapticsRmiDevice, fu_synaptics_rmi_device, FU, SYNAPTICS_RMI_DEVICE, FuUdevDevice)
|
|
|
|
typedef enum {
|
|
FU_SYNAPTICS_RMI_DEVICE_FLAG_NONE = 0,
|
|
FU_SYNAPTICS_RMI_DEVICE_FLAG_ALLOW_FAILURE = 1 << 0,
|
|
FU_SYNAPTICS_RMI_DEVICE_FLAG_FORCE = 1 << 1,
|
|
} FuSynapticsRmiDeviceFlags;
|
|
|
|
struct _FuSynapticsRmiDeviceClass
|
|
{
|
|
FuUdevDeviceClass parent_class;
|
|
gboolean (*setup) (FuSynapticsRmiDevice *self,
|
|
GError **error);
|
|
gboolean (*query_status) (FuSynapticsRmiDevice *self,
|
|
GError **error);
|
|
gboolean (*write) (FuSynapticsRmiDevice *self,
|
|
guint16 addr,
|
|
GByteArray *req,
|
|
FuSynapticsRmiDeviceFlags flags,
|
|
GError **error);
|
|
GByteArray *(*read) (FuSynapticsRmiDevice *self,
|
|
guint16 addr,
|
|
gsize req_sz,
|
|
GError **error);
|
|
GByteArray *(*read_packet_register) (FuSynapticsRmiDevice *self,
|
|
guint16 addr,
|
|
gsize req_sz,
|
|
GError **error);
|
|
gboolean (*wait_for_attr) (FuSynapticsRmiDevice *self,
|
|
guint8 source_mask,
|
|
guint timeout_ms,
|
|
GError **error);
|
|
gboolean (*set_page) (FuSynapticsRmiDevice *self,
|
|
guint8 page,
|
|
GError **error);
|
|
gboolean (*disable_sleep) (FuSynapticsRmiDevice *self,
|
|
GError **error);
|
|
gboolean (*write_bus_select) (FuSynapticsRmiDevice *self,
|
|
guint8 bus,
|
|
GError **error);
|
|
gboolean (*query_build_id) (FuSynapticsRmiDevice *self,
|
|
guint32 *build_id,
|
|
GError **error);
|
|
gboolean (*query_product_sub_id) (FuSynapticsRmiDevice *self,
|
|
guint8 *product_sub_id,
|
|
GError **error);
|
|
gboolean (*enter_iep_mode) (FuSynapticsRmiDevice *self,
|
|
GError **error);
|
|
};
|
|
|
|
typedef struct {
|
|
guint16 block_count_cfg;
|
|
guint16 block_count_fw;
|
|
guint16 block_size;
|
|
guint16 config_length;
|
|
guint16 payload_length;
|
|
guint32 build_id;
|
|
guint8 bootloader_id[2];
|
|
guint8 status_addr;
|
|
} FuSynapticsRmiFlash;
|
|
|
|
#define RMI_F34_HAS_NEW_REG_MAP (1 << 0)
|
|
#define RMI_F34_HAS_CONFIG_ID (1 << 2)
|
|
|
|
#define RMI_F34_BLOCK_DATA_OFFSET 2
|
|
#define RMI_F34_BLOCK_DATA_V1_OFFSET 1
|
|
|
|
#define RMI_F34_ENABLE_WAIT_MS 300 /* ms */
|
|
#define RMI_F34_IDLE_WAIT_MS 20 /* ms */
|
|
|
|
#define RMI_DEVICE_PAGE_SELECT_REGISTER 0xff
|
|
#define RMI_DEVICE_BUS_SELECT_REGISTER 0xfe
|
|
|
|
typedef enum {
|
|
RMI_DEVICE_WAIT_FOR_IDLE_FLAG_NONE = 0,
|
|
RMI_DEVICE_WAIT_FOR_IDLE_FLAG_REFRESH_F34 = (1 << 0),
|
|
} RmiDeviceWaitForIdleFlags;
|
|
|
|
void fu_synaptics_rmi_device_set_iepmode (FuSynapticsRmiDevice *self,
|
|
gboolean iepmode);
|
|
gboolean fu_synaptics_rmi_device_get_iepmode (FuSynapticsRmiDevice *self);
|
|
gboolean fu_synaptics_rmi_device_set_page (FuSynapticsRmiDevice *self,
|
|
guint8 page,
|
|
GError **error);
|
|
gboolean fu_synaptics_rmi_device_write_bootloader_id (FuSynapticsRmiDevice *self,
|
|
GError **error);
|
|
gboolean fu_synaptics_rmi_device_disable_irqs (FuSynapticsRmiDevice *self,
|
|
GError **error);
|
|
GByteArray *fu_synaptics_rmi_device_read (FuSynapticsRmiDevice *self,
|
|
guint16 addr,
|
|
gsize req_sz,
|
|
GError **error);
|
|
GByteArray *fu_synaptics_rmi_device_read_packet_register (FuSynapticsRmiDevice *self,
|
|
guint16 addr,
|
|
gsize req_sz,
|
|
GError **error);
|
|
gboolean fu_synaptics_rmi_device_write (FuSynapticsRmiDevice *self,
|
|
guint16 addr,
|
|
GByteArray *req,
|
|
FuSynapticsRmiDeviceFlags flags,
|
|
GError **error);
|
|
gboolean fu_synaptics_rmi_device_reset (FuSynapticsRmiDevice *self,
|
|
GError **error);
|
|
gboolean fu_synaptics_rmi_device_wait_for_idle (FuSynapticsRmiDevice *self,
|
|
guint timeout_ms,
|
|
RmiDeviceWaitForIdleFlags flags,
|
|
GError **error);
|
|
gboolean fu_synaptics_rmi_device_disable_sleep (FuSynapticsRmiDevice *self,
|
|
GError **error);
|
|
FuSynapticsRmiFlash *fu_synaptics_rmi_device_get_flash (FuSynapticsRmiDevice *self);
|
|
FuSynapticsRmiFunction *fu_synaptics_rmi_device_get_function (FuSynapticsRmiDevice *self,
|
|
guint8 function_number,
|
|
GError **error);
|
|
gboolean fu_synaptics_rmi_device_poll_wait (FuSynapticsRmiDevice *self,
|
|
GError **error);
|
|
void fu_synaptics_rmi_device_set_sig_size (FuSynapticsRmiDevice *self,
|
|
guint16 sig_size);
|
|
guint16 fu_synaptics_rmi_device_get_sig_size (FuSynapticsRmiDevice *self);
|
|
void fu_synaptics_rmi_device_set_max_page (FuSynapticsRmiDevice *self,
|
|
guint8 max_page);
|
|
guint8 fu_synaptics_rmi_device_get_max_page (FuSynapticsRmiDevice *self);
|
|
gboolean fu_synaptics_rmi_device_enter_iep_mode (FuSynapticsRmiDevice *self,
|
|
FuSynapticsRmiDeviceFlags flags,
|
|
GError **error);
|
|
gboolean fu_synaptics_rmi_device_write_bus_select (FuSynapticsRmiDevice *self,
|
|
guint8 bus,
|
|
GError **error);
|