summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2019-01-12 17:53:58 +0100
committerAleksander Morgado <aleksander@aleksander.es>2019-04-11 18:40:15 +0200
commitd49abf0e2e4aedd79a1e01353a8b1fa9cc6af9de (patch)
treef0fd721cbccf8036c672f14fa597de6a5641a547
parent9accd222e4f060e6c0b2d551b259eff4f709b653 (diff)
downloadlibqmi-d49abf0e2e4aedd79a1e01353a8b1fa9cc6af9de.tar.gz
dms: add Dell-specific extension to read firmware version
E.g. supported in the DW5821e. (cherry picked from commit 0f516b41c1090d7744afccb767c90b3df13f8dd0)
-rw-r--r--data/qmi-service-dms.json23
-rw-r--r--docs/reference/libqmi-glib/libqmi-glib-common.sections5
-rw-r--r--docs/reference/libqmi-glib/libqmi-glib-docs.xml1
-rw-r--r--src/libqmi-glib/qmi-enums-dms.h25
-rw-r--r--src/qmicli/qmicli-dms.c87
-rw-r--r--src/qmicli/qmicli-helpers.c21
-rw-r--r--src/qmicli/qmicli-helpers.h2
7 files changed, 164 insertions, 0 deletions
diff --git a/data/qmi-service-dms.json b/data/qmi-service-dms.json
index 130f4532..117645e0 100644
--- a/data/qmi-service-dms.json
+++ b/data/qmi-service-dms.json
@@ -1408,6 +1408,29 @@
} ],
"output" : [ { "common-ref" : "Operation Result" } ] },
+
+ // *********************************************************************************
+ { "name" : "Dell Get Firmware Version",
+ "type" : "Message",
+ "service" : "DMS",
+ "id" : "0x555E",
+ "vendor" : "0x413c",
+ "version" : "1.0",
+ "since" : "1.24",
+ "input" : [ { "name" : "Version Type",
+ "id" : "0x01",
+ "type" : "TLV",
+ "since" : "1.24",
+ "format" : "guint8",
+ "public-format" : "QmiDmsDellFirmwareVersionType" } ],
+ "output" : [ { "common-ref" : "Operation Result" },
+ { "name" : "Version",
+ "id" : "0x01",
+ "type" : "TLV",
+ "since" : "1.0",
+ "format" : "string",
+ "prerequisites": [ { "common-ref" : "Success" } ] } ] },
+
// *********************************************************************************
{ "name" : "Set FCC Authentication",
"type" : "Message",
diff --git a/docs/reference/libqmi-glib/libqmi-glib-common.sections b/docs/reference/libqmi-glib/libqmi-glib-common.sections
index 68757fdc..d9914642 100644
--- a/docs/reference/libqmi-glib/libqmi-glib-common.sections
+++ b/docs/reference/libqmi-glib/libqmi-glib-common.sections
@@ -167,6 +167,7 @@ QmiDmsBootImageDownloadMode
QmiDmsHpDeviceMode
QmiDmsSwiUsbComposition
QmiDmsDellDeviceMode
+QmiDmsDellFirmwareVersionType
<SUBSECTION Methods>
qmi_dms_data_service_capability_get_string
qmi_dms_sim_capability_get_string
@@ -190,6 +191,7 @@ qmi_dms_hp_device_mode_get_string
qmi_dms_swi_usb_composition_get_string
qmi_dms_swi_usb_composition_get_description
qmi_dms_dell_device_mode_get_string
+qmi_dms_dell_firmware_version_type_get_string
<SUBSECTION Private>
qmi_dms_data_service_capability_build_string_from_mask
qmi_dms_sim_capability_build_string_from_mask
@@ -210,6 +212,7 @@ qmi_dms_boot_image_download_mode_build_string_from_mask
qmi_dms_hp_device_mode_build_string_from_mask
qmi_dms_swi_usb_composition_build_string_from_mask
qmi_dms_dell_device_mode_build_string_from_mask
+qmi_dms_dell_firmware_version_type_build_string_from_mask
<SUBSECTION Standard>
QMI_TYPE_DMS_ACTIVATION_STATE
QMI_TYPE_DMS_BOOT_IMAGE_DOWNLOAD_MODE
@@ -230,6 +233,7 @@ QMI_TYPE_DMS_UIM_STATE
QMI_TYPE_DMS_HP_DEVICE_MODE
QMI_TYPE_DMS_SWI_USB_COMPOSITION
QMI_TYPE_DMS_DELL_DEVICE_MODE
+QMI_TYPE_DMS_DELL_FIRMWARE_VERSION_TYPE
qmi_dms_activation_state_get_type
qmi_dms_boot_image_download_mode_get_type
qmi_dms_data_service_capability_get_type
@@ -249,6 +253,7 @@ qmi_dms_uim_state_get_type
qmi_dms_hp_device_mode_get_type
qmi_dms_swi_usb_composition_get_type
qmi_dms_dell_device_mode_get_type
+qmi_dms_dell_firmware_version_type_get_type
</SECTION>
<SECTION>
diff --git a/docs/reference/libqmi-glib/libqmi-glib-docs.xml b/docs/reference/libqmi-glib/libqmi-glib-docs.xml
index ee25f2b1..54209f7a 100644
--- a/docs/reference/libqmi-glib/libqmi-glib-docs.xml
+++ b/docs/reference/libqmi-glib/libqmi-glib-docs.xml
@@ -122,6 +122,7 @@
<xi:include href="xml/qmi-message-dms-swi-get-current-firmware.xml"/>
<xi:include href="xml/qmi-message-dms-swi-get-usb-composition.xml"/>
<xi:include href="xml/qmi-message-dms-swi-set-usb-composition.xml"/>
+ <xi:include href="xml/qmi-message-dms-dell-get-firmware-version.xml"/>
<xi:include href="xml/qmi-message-dms-set-fcc-authentication.xml"/>
<xi:include href="xml/qmi-message-dms-dell-change-device-mode.xml"/>
<xi:include href="xml/qmi-message-dms-get-supported-messages.xml"/>
diff --git a/src/libqmi-glib/qmi-enums-dms.h b/src/libqmi-glib/qmi-enums-dms.h
index 7812925d..1ebf2792 100644
--- a/src/libqmi-glib/qmi-enums-dms.h
+++ b/src/libqmi-glib/qmi-enums-dms.h
@@ -607,4 +607,29 @@ typedef enum {
* Since: 1.24
*/
+/*****************************************************************************/
+/* Helper enums for the 'QMI DMS Dell Get Firmware Version' message */
+
+/**
+ * QmiDmsDellFirmwareVersionType:
+ * @QMI_DMS_DELL_FIRMWARE_VERSION_TYPE_FIRMWARE_MCFG: E.g. T77W968.F0.0.0.2.3.GC.004.
+ * @QMI_DMS_DELL_FIRMWARE_VERSION_TYPE_FIRMWARE_MCFG_APPS: E.g. T77W968.F0.0.0.2.3.GC.004.011.
+ * @QMI_DMS_DELL_FIRMWARE_VERSION_TYPE_APPS: E.g. 011.
+ *
+ * Dell specific firmware version types.
+ *
+ * Since: 1.24
+ */
+typedef enum {
+ QMI_DMS_DELL_FIRMWARE_VERSION_TYPE_FIRMWARE_MCFG = 0x00,
+ QMI_DMS_DELL_FIRMWARE_VERSION_TYPE_FIRMWARE_MCFG_APPS = 0x01,
+ QMI_DMS_DELL_FIRMWARE_VERSION_TYPE_APPS = 0x02,
+} QmiDmsDellFirmwareVersionType;
+
+/**
+ * qmi_dms_dell_firmware_version_type:
+ *
+ * Since: 1.24
+ */
+
#endif /* _LIBQMI_GLIB_QMI_ENUMS_DMS_H_ */
diff --git a/src/qmicli/qmicli-dms.c b/src/qmicli/qmicli-dms.c
index 3f9b1a31..e9876cd1 100644
--- a/src/qmicli/qmicli-dms.c
+++ b/src/qmicli/qmicli-dms.c
@@ -97,6 +97,7 @@ static gboolean swi_get_current_firmware_flag;
static gboolean swi_get_usb_composition_flag;
static gchar *swi_set_usb_composition_str;
static gchar *dell_change_device_mode_str;
+static gchar *dell_get_firmware_version_str;
static gboolean reset_flag;
static gboolean noop_flag;
@@ -309,6 +310,10 @@ static GOptionEntry entries[] = {
"Change device mode (DELL specific)",
"[fastboot-ota|fastboot-online]"
},
+ { "dms-dell-get-firmware-version", 0, 0, G_OPTION_ARG_STRING, &dell_get_firmware_version_str,
+ "Get firmware version (DELL specific)",
+ "[firmware-mcfg-apps|firmware-mcfg|apps]"
+ },
{ "dms-reset", 0, 0, G_OPTION_ARG_NONE, &reset_flag,
"Reset the service state",
NULL
@@ -396,6 +401,7 @@ qmicli_dms_options_enabled (void)
swi_get_usb_composition_flag +
!!swi_set_usb_composition_str +
!!dell_change_device_mode_str +
+ !!dell_get_firmware_version_str +
reset_flag +
noop_flag);
@@ -3713,6 +3719,65 @@ dell_change_device_mode_ready (QmiClientDms *client,
operation_shutdown_skip_cid_release (TRUE);
}
+static QmiMessageDmsDellGetFirmwareVersionInput *
+dell_get_firmware_version_input_create (const gchar *str)
+{
+ QmiMessageDmsDellGetFirmwareVersionInput *input = NULL;
+ QmiDmsDellFirmwareVersionType type;
+ GError *error = NULL;
+
+ if (!qmicli_read_dell_firmware_version_type_from_string (str, &type)) {
+ g_printerr ("error: couldn't parse input dell firmware version type : '%s'\n", str);
+ return NULL;
+ }
+
+ input = qmi_message_dms_dell_get_firmware_version_input_new ();
+ if (!qmi_message_dms_dell_get_firmware_version_input_set_version_type (input, type, &error)) {
+ g_printerr ("error: couldn't create input data bundle: '%s'\n",
+ error->message);
+ g_error_free (error);
+ qmi_message_dms_dell_get_firmware_version_input_unref (input);
+ return NULL;
+ }
+
+ return input;
+}
+
+static void
+dell_get_firmware_version_ready (QmiClientDms *client,
+ GAsyncResult *res)
+{
+ const gchar *str = NULL;
+ QmiMessageDmsDellGetFirmwareVersionOutput *output;
+ GError *error = NULL;
+
+ output = qmi_client_dms_dell_get_firmware_version_finish (client, res, &error);
+ if (!output) {
+ g_printerr ("error: operation failed: %s\n", error->message);
+ g_error_free (error);
+ operation_shutdown (FALSE);
+ return;
+ }
+
+ if (!qmi_message_dms_dell_get_firmware_version_output_get_result (output, &error)) {
+ g_printerr ("error: couldn't get dell firmware version: %s\n", error->message);
+ g_error_free (error);
+ qmi_message_dms_dell_get_firmware_version_output_unref (output);
+ operation_shutdown (FALSE);
+ return;
+ }
+
+ qmi_message_dms_dell_get_firmware_version_output_get_version (output, &str, NULL);
+
+ g_print ("[%s] Firmware version retrieved:\n"
+ "\tVersion: '%s'\n",
+ qmi_device_get_path_display (ctx->device),
+ VALIDATE_UNKNOWN (str));
+
+ qmi_message_dms_dell_get_firmware_version_output_unref (output);
+ operation_shutdown (TRUE);
+}
+
static void
reset_ready (QmiClientDms *client,
GAsyncResult *res)
@@ -4553,6 +4618,28 @@ qmicli_dms_run (QmiDevice *device,
return;
}
+ /* Request to get firmware version? */
+ if (dell_get_firmware_version_str) {
+ QmiMessageDmsDellGetFirmwareVersionInput *input;
+
+ g_debug ("Asynchronously getting firmware version (Dell specific)...");
+
+ input = dell_get_firmware_version_input_create (dell_get_firmware_version_str);
+ if (!input) {
+ operation_shutdown (FALSE);
+ return;
+ }
+
+ qmi_client_dms_dell_get_firmware_version (ctx->client,
+ input,
+ 10,
+ ctx->cancellable,
+ (GAsyncReadyCallback)dell_get_firmware_version_ready,
+ NULL);
+ qmi_message_dms_dell_get_firmware_version_input_unref (input);
+ return;
+ }
+
/* Request to reset DMS service? */
if (reset_flag) {
g_debug ("Asynchronously resetting DMS service...");
diff --git a/src/qmicli/qmicli-helpers.c b/src/qmicli/qmicli-helpers.c
index e380db53..20441c5f 100644
--- a/src/qmicli/qmicli-helpers.c
+++ b/src/qmicli/qmicli-helpers.c
@@ -778,6 +778,27 @@ qmicli_read_dell_device_mode_from_string (const gchar *str,
}
gboolean
+qmicli_read_dell_firmware_version_type_from_string (const gchar *str,
+ QmiDmsDellFirmwareVersionType *out)
+{
+ GType type;
+ GEnumClass *enum_class;
+ GEnumValue *enum_value;
+
+ type = qmi_dms_dell_firmware_version_type_get_type ();
+ enum_class = G_ENUM_CLASS (g_type_class_ref (type));
+ enum_value = g_enum_get_value_by_nick (enum_class, str);
+
+ if (enum_value)
+ *out = (QmiDmsDellFirmwareVersionType)enum_value->value;
+ else
+ g_printerr ("error: invalid Dell firmware version type value given: '%s'\n", str);
+
+ g_type_class_unref (enum_class);
+ return !!enum_value;
+}
+
+gboolean
qmicli_read_uint_from_string (const gchar *str,
guint *out)
{
diff --git a/src/qmicli/qmicli-helpers.h b/src/qmicli/qmicli-helpers.h
index 2307b6d7..439e1e4b 100644
--- a/src/qmicli/qmicli-helpers.h
+++ b/src/qmicli/qmicli-helpers.h
@@ -80,6 +80,8 @@ gboolean qmicli_read_swi_usb_composition_from_string (const gchar *str,
QmiDmsSwiUsbComposition *out);
gboolean qmicli_read_dell_device_mode_from_string (const gchar *str,
QmiDmsDellDeviceMode *out);
+gboolean qmicli_read_dell_firmware_version_type_from_string (const gchar *str,
+ QmiDmsDellFirmwareVersionType *out);
gboolean qmicli_read_non_empty_string (const gchar *str,
const gchar *description,