blob: c41ef9116bb546e49cc80a8277d4426a12bfc675 [file] [log] [blame]
Richard Hughes7afd7cb2019-08-07 11:42:42 +01001/*
2 * Copyright (C) 2019 Richard Hughes <richard@hughsie.com>
3 *
4 * SPDX-License-Identifier: LGPL-2.1+
5 */
6
7#pragma once
8
9#include <glib-object.h>
10#include <fwupd.h>
Richard Hughes1981c632021-03-09 09:44:12 +000011#include <xmlb.h>
Richard Hughes7afd7cb2019-08-07 11:42:42 +010012
Richard Hughes1981c632021-03-09 09:44:12 +000013#include "fu-chunk.h"
14#include "fu-firmware.h"
Richard Hughes7afd7cb2019-08-07 11:42:42 +010015
Richard Hughes7afd7cb2019-08-07 11:42:42 +010016#define FU_TYPE_FIRMWARE (fu_firmware_get_type ())
17G_DECLARE_DERIVABLE_TYPE (FuFirmware, fu_firmware, FU, FIRMWARE, GObject)
18
Richard Hughes52441f22021-03-12 21:21:10 +000019/**
20 * FuFirmwareExportFlags:
21 * @FU_FIRMWARE_EXPORT_FLAG_NONE: No flags set
22 * @FU_FIRMWARE_EXPORT_FLAG_INCLUDE_DEBUG: Include debug information when exporting
23 * @FU_FIRMWARE_EXPORT_FLAG_ASCII_DATA: Write the data as UTF-8 strings
24 *
25 * The firmware export flags.
26 **/
27#define FU_FIRMWARE_EXPORT_FLAG_NONE (0u) /* Since: 1.6.0 */
28#define FU_FIRMWARE_EXPORT_FLAG_INCLUDE_DEBUG (1u << 0) /* Since: 1.6.0 */
29#define FU_FIRMWARE_EXPORT_FLAG_ASCII_DATA (1u << 1) /* Since: 1.6.0 */
30typedef guint64 FuFirmwareExportFlags;
31
Richard Hughes7afd7cb2019-08-07 11:42:42 +010032struct _FuFirmwareClass
33{
34 GObjectClass parent_class;
35 gboolean (*parse) (FuFirmware *self,
36 GBytes *fw,
37 guint64 addr_start,
38 guint64 addr_end,
39 FwupdInstallFlags flags,
Richard Hughesa2abc422020-12-22 09:38:59 +000040 GError **error)
41 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughes7afd7cb2019-08-07 11:42:42 +010042 GBytes *(*write) (FuFirmware *self,
Richard Hughesa2abc422020-12-22 09:38:59 +000043 GError **error)
44 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughes52441f22021-03-12 21:21:10 +000045 void (*export) (FuFirmware *self,
46 FuFirmwareExportFlags flags,
47 XbBuilderNode *bn);
Richard Hughes6819f9e2019-09-19 17:37:30 +010048 gboolean (*tokenize) (FuFirmware *self,
49 GBytes *fw,
50 FwupdInstallFlags flags,
Richard Hughesa2abc422020-12-22 09:38:59 +000051 GError **error)
52 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughes41400a82020-09-21 13:43:15 +010053 gboolean (*build) (FuFirmware *self,
54 XbNode *n,
Richard Hughesa2abc422020-12-22 09:38:59 +000055 GError **error)
56 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughes1981c632021-03-09 09:44:12 +000057 gchar *(*get_checksum) (FuFirmware *self,
58 GChecksumType csum_kind,
59 GError **error)
60 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughes7afd7cb2019-08-07 11:42:42 +010061 /*< private >*/
Richard Hughes1981c632021-03-09 09:44:12 +000062 gpointer padding[26];
Richard Hughes7afd7cb2019-08-07 11:42:42 +010063};
64
Richard Hughes6da96cd2020-09-17 10:28:42 +010065/**
66 * FuFirmwareFlags:
67 * @FU_FIRMWARE_FLAG_NONE: No flags set
68 * @FU_FIRMWARE_FLAG_DEDUPE_ID: Dedupe imges by ID
69 * @FU_FIRMWARE_FLAG_DEDUPE_IDX: Dedupe imges by IDX
Richard Hughes54bc5122021-02-11 09:29:03 +000070 * @FU_FIRMWARE_FLAG_HAS_CHECKSUM: Has a CRC or checksum to test internal consistency
71 * @FU_FIRMWARE_FLAG_HAS_VID_PID: Has a vendor or product ID in the firmware
Richard Hughes6da96cd2020-09-17 10:28:42 +010072 *
73 * The firmware flags.
74 **/
75#define FU_FIRMWARE_FLAG_NONE (0u) /* Since: 1.5.0 */
76#define FU_FIRMWARE_FLAG_DEDUPE_ID (1u << 0) /* Since: 1.5.0 */
77#define FU_FIRMWARE_FLAG_DEDUPE_IDX (1u << 1) /* Since: 1.5.0 */
Richard Hughes54bc5122021-02-11 09:29:03 +000078#define FU_FIRMWARE_FLAG_HAS_CHECKSUM (1u << 2) /* Since: 1.5.6 */
79#define FU_FIRMWARE_FLAG_HAS_VID_PID (1u << 3) /* Since: 1.5.6 */
Richard Hughes6da96cd2020-09-17 10:28:42 +010080typedef guint64 FuFirmwareFlags;
81
Richard Hughes52441f22021-03-12 21:21:10 +000082#define FU_FIRMWARE_ID_PAYLOAD "payload"
Richard Hughes1981c632021-03-09 09:44:12 +000083#define FU_FIRMWARE_ID_SIGNATURE "signature"
Richard Hughes52441f22021-03-12 21:21:10 +000084#define FU_FIRMWARE_ID_HEADER "header"
Richard Hughes1981c632021-03-09 09:44:12 +000085
Richard Hughes119d2602021-03-17 10:07:38 +000086#define FU_FIRMWARE_ALIGNMENT_1 0x00
87#define FU_FIRMWARE_ALIGNMENT_2 0x01
88#define FU_FIRMWARE_ALIGNMENT_4 0x02
89#define FU_FIRMWARE_ALIGNMENT_8 0x03
90#define FU_FIRMWARE_ALIGNMENT_16 0x04
91#define FU_FIRMWARE_ALIGNMENT_32 0x05
92#define FU_FIRMWARE_ALIGNMENT_64 0x06
93#define FU_FIRMWARE_ALIGNMENT_128 0x07
94#define FU_FIRMWARE_ALIGNMENT_256 0x08
95#define FU_FIRMWARE_ALIGNMENT_512 0x09
96#define FU_FIRMWARE_ALIGNMENT_1K 0x0A
97#define FU_FIRMWARE_ALIGNMENT_2K 0x0B
98#define FU_FIRMWARE_ALIGNMENT_4K 0x0C
99#define FU_FIRMWARE_ALIGNMENT_8K 0x0D
100#define FU_FIRMWARE_ALIGNMENT_16K 0x0E
101#define FU_FIRMWARE_ALIGNMENT_32K 0x0F
102#define FU_FIRMWARE_ALIGNMENT_64K 0x10
103#define FU_FIRMWARE_ALIGNMENT_128K 0x11
104#define FU_FIRMWARE_ALIGNMENT_256K 0x12
105#define FU_FIRMWARE_ALIGNMENT_512K 0x13
106#define FU_FIRMWARE_ALIGNMENT_1M 0x14
107#define FU_FIRMWARE_ALIGNMENT_2M 0x15
108#define FU_FIRMWARE_ALIGNMENT_4M 0x16
109#define FU_FIRMWARE_ALIGNMENT_8M 0x17
110#define FU_FIRMWARE_ALIGNMENT_16M 0x18
111#define FU_FIRMWARE_ALIGNMENT_32M 0x19
112#define FU_FIRMWARE_ALIGNMENT_64M 0x1A
113#define FU_FIRMWARE_ALIGNMENT_128M 0x1B
114#define FU_FIRMWARE_ALIGNMENT_256M 0x1C
115#define FU_FIRMWARE_ALIGNMENT_512M 0x1D
116#define FU_FIRMWARE_ALIGNMENT_1G 0x1E
117#define FU_FIRMWARE_ALIGNMENT_2G 0x1F
118#define FU_FIRMWARE_ALIGNMENT_4G 0x20
119
Richard Hughes6da96cd2020-09-17 10:28:42 +0100120const gchar *fu_firmware_flag_to_string (FuFirmwareFlags flag);
121FuFirmwareFlags fu_firmware_flag_from_string (const gchar *flag);
122
Richard Hughes7afd7cb2019-08-07 11:42:42 +0100123FuFirmware *fu_firmware_new (void);
124FuFirmware *fu_firmware_new_from_bytes (GBytes *fw);
Richard Hughes1d163522021-01-29 15:54:30 +0000125FuFirmware *fu_firmware_new_from_gtypes (GBytes *fw,
126 FwupdInstallFlags flags,
127 GError **error,
128 ...);
Richard Hughes7afd7cb2019-08-07 11:42:42 +0100129gchar *fu_firmware_to_string (FuFirmware *self);
Richard Hughes52441f22021-03-12 21:21:10 +0000130void fu_firmware_export (FuFirmware *self,
131 FuFirmwareExportFlags flags,
132 XbBuilderNode *bn);
133gchar *fu_firmware_export_to_xml (FuFirmware *self,
134 FuFirmwareExportFlags flags,
135 GError **error);
Richard Hughesfd3c8ae2019-10-21 16:01:38 +0100136const gchar *fu_firmware_get_version (FuFirmware *self);
137void fu_firmware_set_version (FuFirmware *self,
138 const gchar *version);
Richard Hughes86c6c2d2021-02-15 10:54:37 +0000139guint64 fu_firmware_get_version_raw (FuFirmware *self);
140void fu_firmware_set_version_raw (FuFirmware *self,
141 guint64 version_raw);
Richard Hughes6da96cd2020-09-17 10:28:42 +0100142void fu_firmware_add_flag (FuFirmware *firmware,
143 FuFirmwareFlags flag);
144gboolean fu_firmware_has_flag (FuFirmware *firmware,
145 FuFirmwareFlags flag);
Richard Hughes1981c632021-03-09 09:44:12 +0000146const gchar *fu_firmware_get_filename (FuFirmware *self);
147void fu_firmware_set_filename (FuFirmware *self,
148 const gchar *filename);
149const gchar *fu_firmware_get_id (FuFirmware *self);
150void fu_firmware_set_id (FuFirmware *self,
151 const gchar *id);
152guint64 fu_firmware_get_addr (FuFirmware *self);
153void fu_firmware_set_addr (FuFirmware *self,
154 guint64 addr);
155guint64 fu_firmware_get_offset (FuFirmware *self);
156void fu_firmware_set_offset (FuFirmware *self,
157 guint64 offset);
Richard Hughes8f631802021-03-10 13:50:38 +0000158gsize fu_firmware_get_size (FuFirmware *self);
159void fu_firmware_set_size (FuFirmware *self,
Richard Hughes752c8de2021-03-13 16:23:26 +0000160 gsize size);
Richard Hughes1981c632021-03-09 09:44:12 +0000161guint64 fu_firmware_get_idx (FuFirmware *self);
162void fu_firmware_set_idx (FuFirmware *self,
163 guint64 idx);
164GBytes *fu_firmware_get_bytes (FuFirmware *self,
165 GError **error);
166void fu_firmware_set_bytes (FuFirmware *self,
167 GBytes *bytes);
Richard Hughes55853e32021-03-10 13:48:08 +0000168guint8 fu_firmware_get_alignment (FuFirmware *self);
169void fu_firmware_set_alignment (FuFirmware *self,
170 guint8 alignment);
Richard Hughes1981c632021-03-09 09:44:12 +0000171void fu_firmware_add_chunk (FuFirmware *self,
172 FuChunk *chk);
173GPtrArray *fu_firmware_get_chunks (FuFirmware *self,
174 GError **error);
Richard Hughes7afd7cb2019-08-07 11:42:42 +0100175
Richard Hughes6819f9e2019-09-19 17:37:30 +0100176gboolean fu_firmware_tokenize (FuFirmware *self,
177 GBytes *fw,
178 FwupdInstallFlags flags,
Richard Hughesa2abc422020-12-22 09:38:59 +0000179 GError **error)
180 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughes41400a82020-09-21 13:43:15 +0100181gboolean fu_firmware_build (FuFirmware *self,
182 XbNode *n,
Richard Hughesa2abc422020-12-22 09:38:59 +0000183 GError **error)
184 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughes52441f22021-03-12 21:21:10 +0000185gboolean fu_firmware_build_from_xml (FuFirmware *self,
186 const gchar *xml,
187 GError **error)
188 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughes7afd7cb2019-08-07 11:42:42 +0100189gboolean fu_firmware_parse (FuFirmware *self,
190 GBytes *fw,
191 FwupdInstallFlags flags,
Richard Hughesa2abc422020-12-22 09:38:59 +0000192 GError **error)
193 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughesf591a352019-10-10 15:30:44 +0100194gboolean fu_firmware_parse_file (FuFirmware *self,
195 GFile *file,
196 FwupdInstallFlags flags,
Richard Hughesa2abc422020-12-22 09:38:59 +0000197 GError **error)
198 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughes7afd7cb2019-08-07 11:42:42 +0100199gboolean fu_firmware_parse_full (FuFirmware *self,
200 GBytes *fw,
201 guint64 addr_start,
202 guint64 addr_end,
203 FwupdInstallFlags flags,
Richard Hughesa2abc422020-12-22 09:38:59 +0000204 GError **error)
205 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughes7afd7cb2019-08-07 11:42:42 +0100206GBytes *fu_firmware_write (FuFirmware *self,
Richard Hughesa2abc422020-12-22 09:38:59 +0000207 GError **error)
208 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughes1981c632021-03-09 09:44:12 +0000209GBytes *fu_firmware_write_chunk (FuFirmware *self,
210 guint64 address,
211 guint64 chunk_sz_max,
212 GError **error)
213 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughesf591a352019-10-10 15:30:44 +0100214gboolean fu_firmware_write_file (FuFirmware *self,
215 GFile *file,
Richard Hughesa2abc422020-12-22 09:38:59 +0000216 GError **error)
217 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughes1981c632021-03-09 09:44:12 +0000218gchar *fu_firmware_get_checksum (FuFirmware *self,
219 GChecksumType csum_kind,
220 GError **error);
Richard Hughes7afd7cb2019-08-07 11:42:42 +0100221
222void fu_firmware_add_image (FuFirmware *self,
Richard Hughes1981c632021-03-09 09:44:12 +0000223 FuFirmware *img);
Richard Hughes3e9fafc2020-09-24 13:08:21 +0100224gboolean fu_firmware_remove_image (FuFirmware *self,
Richard Hughes1981c632021-03-09 09:44:12 +0000225 FuFirmware *img,
Richard Hughes3e9fafc2020-09-24 13:08:21 +0100226 GError **error);
227gboolean fu_firmware_remove_image_by_idx (FuFirmware *self,
228 guint64 idx,
229 GError **error);
230gboolean fu_firmware_remove_image_by_id (FuFirmware *self,
231 const gchar *id,
232 GError **error);
Richard Hughes7afd7cb2019-08-07 11:42:42 +0100233GPtrArray *fu_firmware_get_images (FuFirmware *self);
Richard Hughes1981c632021-03-09 09:44:12 +0000234FuFirmware *fu_firmware_get_image_by_id (FuFirmware *self,
Richard Hughes7afd7cb2019-08-07 11:42:42 +0100235 const gchar *id,
236 GError **error);
237GBytes *fu_firmware_get_image_by_id_bytes (FuFirmware *self,
238 const gchar *id,
239 GError **error);
Richard Hughes1981c632021-03-09 09:44:12 +0000240FuFirmware *fu_firmware_get_image_by_idx (FuFirmware *self,
Richard Hughes7afd7cb2019-08-07 11:42:42 +0100241 guint64 idx,
242 GError **error);
243GBytes *fu_firmware_get_image_by_idx_bytes (FuFirmware *self,
244 guint64 idx,
245 GError **error);
Richard Hughes1981c632021-03-09 09:44:12 +0000246FuFirmware *fu_firmware_get_image_by_checksum (FuFirmware *self,
Richard Hughesac927582021-01-05 11:06:33 +0000247 const gchar *checksum,
248 GError **error);