quectel: combine firmware functions in mm-shared-quectel
This commit is contained in:

committed by
Aleksander Morgado

parent
c9ffa2c9e5
commit
22e38199a9
@@ -380,7 +380,7 @@ dnl-----------------------------------------------------------------------------
|
|||||||
dnl MBIM support (enabled by default)
|
dnl MBIM support (enabled by default)
|
||||||
dnl
|
dnl
|
||||||
|
|
||||||
LIBMBIM_VERSION=1.27.3
|
LIBMBIM_VERSION=1.27.5
|
||||||
|
|
||||||
AC_ARG_WITH(mbim, AS_HELP_STRING([--without-mbim], [Build without MBIM support]), [], [with_mbim=yes])
|
AC_ARG_WITH(mbim, AS_HELP_STRING([--without-mbim], [Build without MBIM support]), [], [with_mbim=yes])
|
||||||
AM_CONDITIONAL(WITH_MBIM, test "x$with_mbim" = "xyes")
|
AM_CONDITIONAL(WITH_MBIM, test "x$with_mbim" = "xyes")
|
||||||
|
@@ -34,51 +34,6 @@ G_DEFINE_TYPE_EXTENDED (MMBroadbandModemMbimQuectel, mm_broadband_modem_mbim_que
|
|||||||
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_TIME, iface_modem_time_init)
|
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_TIME, iface_modem_time_init)
|
||||||
G_IMPLEMENT_INTERFACE (MM_TYPE_SHARED_QUECTEL, shared_quectel_init))
|
G_IMPLEMENT_INTERFACE (MM_TYPE_SHARED_QUECTEL, shared_quectel_init))
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/* Firmware update settings */
|
|
||||||
|
|
||||||
static MMFirmwareUpdateSettings *
|
|
||||||
firmware_load_update_settings_finish (MMIfaceModemFirmware *self,
|
|
||||||
GAsyncResult *res,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
return g_task_propagate_pointer (G_TASK (res), error);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
quectel_get_firmware_version_ready (MMBaseModem *modem,
|
|
||||||
GAsyncResult *res,
|
|
||||||
GTask *task)
|
|
||||||
{
|
|
||||||
MMFirmwareUpdateSettings *update_settings;
|
|
||||||
const gchar *version;
|
|
||||||
|
|
||||||
update_settings = mm_firmware_update_settings_new (MM_MODEM_FIRMWARE_UPDATE_METHOD_FIREHOSE);
|
|
||||||
|
|
||||||
version = mm_base_modem_at_command_finish (modem, res, NULL);
|
|
||||||
if (version)
|
|
||||||
mm_firmware_update_settings_set_version (update_settings, version);
|
|
||||||
g_task_return_pointer (task, update_settings, g_object_unref);
|
|
||||||
g_object_unref (task);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
firmware_load_update_settings (MMIfaceModemFirmware *self,
|
|
||||||
GAsyncReadyCallback callback,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
GTask *task;
|
|
||||||
|
|
||||||
task = g_task_new (self, NULL, callback, user_data);
|
|
||||||
|
|
||||||
mm_base_modem_at_command (MM_BASE_MODEM (self),
|
|
||||||
"+QGMR?",
|
|
||||||
3,
|
|
||||||
FALSE,
|
|
||||||
(GAsyncReadyCallback) quectel_get_firmware_version_ready,
|
|
||||||
task);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
MMBroadbandModemMbimQuectel *
|
MMBroadbandModemMbimQuectel *
|
||||||
@@ -110,8 +65,8 @@ mm_broadband_modem_mbim_quectel_init (MMBroadbandModemMbimQuectel *self)
|
|||||||
static void
|
static void
|
||||||
iface_modem_firmware_init (MMIfaceModemFirmware *iface)
|
iface_modem_firmware_init (MMIfaceModemFirmware *iface)
|
||||||
{
|
{
|
||||||
iface->load_update_settings = firmware_load_update_settings;
|
iface->load_update_settings = mm_shared_quectel_firmware_load_update_settings;
|
||||||
iface->load_update_settings_finish = firmware_load_update_settings_finish;
|
iface->load_update_settings_finish = mm_shared_quectel_firmware_load_update_settings_finish;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@@ -61,21 +61,12 @@ create_modem (MMPlugin *self,
|
|||||||
|
|
||||||
#if defined WITH_MBIM
|
#if defined WITH_MBIM
|
||||||
if (mm_port_probe_list_has_mbim_port (probes)) {
|
if (mm_port_probe_list_has_mbim_port (probes)) {
|
||||||
if (vendor == 0x1eac) {
|
mm_obj_dbg (self, "MBIM-powered Quectel modem found...");
|
||||||
mm_obj_dbg (self, "MBIM-powered PCI Quectel modem found...");
|
return MM_BASE_MODEM (mm_broadband_modem_mbim_quectel_new (uid,
|
||||||
return MM_BASE_MODEM (mm_broadband_modem_mbim_quectel_new (uid,
|
drivers,
|
||||||
drivers,
|
mm_plugin_get_name (self),
|
||||||
mm_plugin_get_name (self),
|
vendor,
|
||||||
vendor,
|
product));
|
||||||
product));
|
|
||||||
} else {
|
|
||||||
mm_obj_dbg (self, "MBIM-powered Quectel modem found...");
|
|
||||||
return MM_BASE_MODEM (mm_broadband_modem_mbim_new (uid,
|
|
||||||
drivers,
|
|
||||||
mm_plugin_get_name (self),
|
|
||||||
vendor,
|
|
||||||
product));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -30,6 +30,10 @@
|
|||||||
#include "mm-shared-quectel.h"
|
#include "mm-shared-quectel.h"
|
||||||
#include "mm-modem-helpers-quectel.h"
|
#include "mm-modem-helpers-quectel.h"
|
||||||
|
|
||||||
|
#if defined WITH_MBIM
|
||||||
|
#include "mm-broadband-modem-mbim.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Private context */
|
/* Private context */
|
||||||
|
|
||||||
@@ -143,17 +147,32 @@ mm_shared_quectel_firmware_load_update_settings_finish (MMIfaceModemFirmware *s
|
|||||||
return g_task_propagate_pointer (G_TASK (res), error);
|
return g_task_propagate_pointer (G_TASK (res), error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
quectel_is_firehose_supported (MMBaseModem *modem)
|
||||||
|
{
|
||||||
|
guint16 vid = mm_base_modem_get_vendor_id (modem);
|
||||||
|
guint16 pid = mm_base_modem_get_product_id (modem);
|
||||||
|
|
||||||
|
/* EM120 and EM160 */
|
||||||
|
if (vid == 0x1eac && (pid == 0x1001 || pid == 0x1002))
|
||||||
|
return TRUE;
|
||||||
|
/* EM05-G and EM05-CE */
|
||||||
|
if (vid == 0x2c7c && (pid == 0x030a || pid == 0x0127))
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
quectel_get_firmware_version_ready (MMBaseModem *modem,
|
quectel_at_port_get_firmware_version_ready (MMBaseModem *modem,
|
||||||
GAsyncResult *res,
|
GAsyncResult *res,
|
||||||
GTask *task)
|
GTask *task)
|
||||||
{
|
{
|
||||||
MMFirmwareUpdateSettings *update_settings;
|
MMFirmwareUpdateSettings *update_settings;
|
||||||
const gchar *version;
|
const gchar *version;
|
||||||
|
|
||||||
update_settings = g_task_get_task_data (task);
|
update_settings = g_task_get_task_data (task);
|
||||||
|
|
||||||
/* Set full firmware version */
|
|
||||||
version = mm_base_modem_at_command_finish (modem, res, NULL);
|
version = mm_base_modem_at_command_finish (modem, res, NULL);
|
||||||
if (version)
|
if (version)
|
||||||
mm_firmware_update_settings_set_version (update_settings, version);
|
mm_firmware_update_settings_set_version (update_settings, version);
|
||||||
@@ -162,6 +181,30 @@ quectel_get_firmware_version_ready (MMBaseModem *modem,
|
|||||||
g_object_unref (task);
|
g_object_unref (task);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined WITH_MBIM
|
||||||
|
static void
|
||||||
|
quectel_mbim_port_get_firmware_version_ready (MbimDevice *device,
|
||||||
|
GAsyncResult *res,
|
||||||
|
GTask *task)
|
||||||
|
{
|
||||||
|
g_autoptr(MbimMessage) response = NULL;
|
||||||
|
guint32 version_id;
|
||||||
|
g_autofree gchar *version_str = NULL;
|
||||||
|
MMFirmwareUpdateSettings *update_settings;
|
||||||
|
|
||||||
|
update_settings = g_task_get_task_data (task);
|
||||||
|
|
||||||
|
response = mbim_device_command_finish (device, res, NULL);
|
||||||
|
if (response && mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, NULL) &&
|
||||||
|
mbim_message_qdu_quectel_read_version_response_parse (response, &version_id, &version_str, NULL)) {
|
||||||
|
mm_firmware_update_settings_set_version (update_settings, version_str);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_task_return_pointer (task, g_object_ref (update_settings), g_object_unref);
|
||||||
|
g_object_unref (task);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
qfastboot_test_ready (MMBaseModem *self,
|
qfastboot_test_ready (MMBaseModem *self,
|
||||||
GAsyncResult *res,
|
GAsyncResult *res,
|
||||||
@@ -170,20 +213,19 @@ qfastboot_test_ready (MMBaseModem *self,
|
|||||||
MMFirmwareUpdateSettings *update_settings;
|
MMFirmwareUpdateSettings *update_settings;
|
||||||
|
|
||||||
/* Set update method */
|
/* Set update method */
|
||||||
if (!mm_base_modem_at_command_finish (self, res, NULL))
|
if (mm_base_modem_at_command_finish (self, res, NULL)) {
|
||||||
update_settings = mm_firmware_update_settings_new (MM_MODEM_FIRMWARE_UPDATE_METHOD_NONE);
|
|
||||||
else {
|
|
||||||
update_settings = mm_firmware_update_settings_new (MM_MODEM_FIRMWARE_UPDATE_METHOD_FASTBOOT);
|
update_settings = mm_firmware_update_settings_new (MM_MODEM_FIRMWARE_UPDATE_METHOD_FASTBOOT);
|
||||||
mm_firmware_update_settings_set_fastboot_at (update_settings, "AT+QFASTBOOT");
|
mm_firmware_update_settings_set_fastboot_at (update_settings, "AT+QFASTBOOT");
|
||||||
}
|
} else
|
||||||
|
update_settings = mm_firmware_update_settings_new (MM_MODEM_FIRMWARE_UPDATE_METHOD_NONE);
|
||||||
|
|
||||||
/* Get full firmware version */
|
|
||||||
g_task_set_task_data (task, update_settings, g_object_unref);
|
g_task_set_task_data (task, update_settings, g_object_unref);
|
||||||
|
/* Fetch full firmware info */
|
||||||
mm_base_modem_at_command (MM_BASE_MODEM (self),
|
mm_base_modem_at_command (MM_BASE_MODEM (self),
|
||||||
"+QGMR?",
|
"+QGMR?",
|
||||||
3,
|
3,
|
||||||
FALSE,
|
FALSE,
|
||||||
(GAsyncReadyCallback) quectel_get_firmware_version_ready,
|
(GAsyncReadyCallback) quectel_at_port_get_firmware_version_ready,
|
||||||
task);
|
task);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,14 +235,68 @@ mm_shared_quectel_firmware_load_update_settings (MMIfaceModemFirmware *self,
|
|||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
GTask *task;
|
GTask *task;
|
||||||
|
MMFirmwareUpdateSettings *update_settings;
|
||||||
|
MMPortSerialAt *at_port;
|
||||||
|
#if defined WITH_MBIM
|
||||||
|
MMPortMbim *mbim;
|
||||||
|
#endif
|
||||||
|
|
||||||
task = g_task_new (self, NULL, callback, user_data);
|
task = g_task_new (self, NULL, callback, user_data);
|
||||||
mm_base_modem_at_command (MM_BASE_MODEM (self),
|
|
||||||
"AT+QFASTBOOT=?",
|
at_port = mm_base_modem_peek_best_at_port (MM_BASE_MODEM (self), NULL);
|
||||||
3,
|
if (at_port) {
|
||||||
TRUE,
|
if (quectel_is_firehose_supported (MM_BASE_MODEM (self))) {
|
||||||
(GAsyncReadyCallback)qfastboot_test_ready,
|
/* Firehose modems */
|
||||||
task);
|
update_settings = mm_firmware_update_settings_new (MM_MODEM_FIRMWARE_UPDATE_METHOD_FIREHOSE);
|
||||||
|
g_task_set_task_data (task, update_settings, g_object_unref);
|
||||||
|
/* Fetch full firmware info */
|
||||||
|
mm_base_modem_at_command (MM_BASE_MODEM (self),
|
||||||
|
"+QGMR?",
|
||||||
|
3,
|
||||||
|
FALSE,
|
||||||
|
(GAsyncReadyCallback) quectel_at_port_get_firmware_version_ready,
|
||||||
|
task);
|
||||||
|
} else {
|
||||||
|
/* Check fastboot support */
|
||||||
|
mm_base_modem_at_command (MM_BASE_MODEM (self),
|
||||||
|
"AT+QFASTBOOT=?",
|
||||||
|
3,
|
||||||
|
TRUE,
|
||||||
|
(GAsyncReadyCallback)qfastboot_test_ready,
|
||||||
|
task);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined WITH_MBIM
|
||||||
|
mbim = mm_broadband_modem_mbim_peek_port_mbim (MM_BROADBAND_MODEM_MBIM (self));
|
||||||
|
if (mbim) {
|
||||||
|
g_autoptr(MbimMessage) message = NULL;
|
||||||
|
|
||||||
|
/* Set update method */
|
||||||
|
if (quectel_is_firehose_supported (MM_BASE_MODEM (self)))
|
||||||
|
update_settings = mm_firmware_update_settings_new (MM_MODEM_FIRMWARE_UPDATE_METHOD_FIREHOSE);
|
||||||
|
else
|
||||||
|
update_settings = mm_firmware_update_settings_new (MM_MODEM_FIRMWARE_UPDATE_METHOD_NONE);
|
||||||
|
|
||||||
|
/* Fetch firmware info */
|
||||||
|
g_task_set_task_data (task, update_settings, g_object_unref);
|
||||||
|
message = mbim_message_qdu_quectel_read_version_set_new (MBIM_QDU_QUECTEL_VERSION_TYPE_FW_BUILD_ID, NULL);
|
||||||
|
mbim_device_command (mm_port_mbim_peek_device (mbim),
|
||||||
|
message,
|
||||||
|
5,
|
||||||
|
NULL,
|
||||||
|
(GAsyncReadyCallback) quectel_mbim_port_get_firmware_version_ready,
|
||||||
|
task);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
g_task_return_new_error (task,
|
||||||
|
MM_CORE_ERROR,
|
||||||
|
MM_CORE_ERROR_FAILED,
|
||||||
|
"Couldn't find a port to fetch firmware info");
|
||||||
|
g_object_unref (task);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
Reference in New Issue
Block a user