diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2019-01-12 17:53:58 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2019-02-19 23:23:37 +0100 |
commit | 0f516b41c1090d7744afccb767c90b3df13f8dd0 (patch) | |
tree | 74e85b636c66d46004edaa9dc8eb250d2de2cf74 | |
parent | c5b507e51b10c102305678769ef9d41ce8cdfe6b (diff) | |
download | libqmi-0f516b41c1090d7744afccb767c90b3df13f8dd0.tar.gz |
dms: add Dell-specific extension to read firmware version
E.g. supported in the DW5821e.
-rw-r--r-- | data/qmi-service-dms.json | 23 | ||||
-rw-r--r-- | docs/reference/libqmi-glib/libqmi-glib-common.sections | 5 | ||||
-rw-r--r-- | docs/reference/libqmi-glib/libqmi-glib-docs.xml | 1 | ||||
-rw-r--r-- | src/libqmi-glib/qmi-enums-dms.h | 25 | ||||
-rw-r--r-- | src/qmicli/qmicli-dms.c | 87 | ||||
-rw-r--r-- | src/qmicli/qmicli-helpers.c | 21 | ||||
-rw-r--r-- | src/qmicli/qmicli-helpers.h | 2 |
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 7cdd2506..99d20dfc 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 992b013f..801ef1a5 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, |