[PATCH 2/2] Telit: add support to SIM hot swap (4th attempt)
Aleksander Morgado
aleksander at aleksander.es
Wed Aug 10 07:53:57 UTC 2016
On Mon, Aug 8, 2016 at 3:47 PM, Carlo Lobrano <c.lobrano at gmail.com> wrote:
> MMBroadbandModemTelit:
> * added logic to set MMBroadbandModem's SIM_HOT_SWAP property to TRUE
> * added function to enable QSS unsolicited
> * added QSS unsolicited handler
> ---
Pushed to git master, thanks!
> plugins/telit/mm-broadband-modem-telit.c | 141 ++++++++++++++++++++++++++++++-
> 1 file changed, 140 insertions(+), 1 deletion(-)
>
> diff --git a/plugins/telit/mm-broadband-modem-telit.c b/plugins/telit/mm-broadband-modem-telit.c
> index 9d9b6d3..2eca622 100644
> --- a/plugins/telit/mm-broadband-modem-telit.c
> +++ b/plugins/telit/mm-broadband-modem-telit.c
> @@ -79,6 +79,142 @@ modem_after_sim_unlock (MMIfaceModem *self,
> }
>
> /*****************************************************************************/
> +/* Setup SIM hot swap (Modem interface) */
> +
> +static void
> +telit_qss_unsolicited_handler (MMPortSerialAt *port,
> + GMatchInfo *match_info,
> + MMBroadbandModemTelit *self)
> +{
> + guint qss;
> +
> + if (!mm_get_uint_from_match_info (match_info, 1, &qss))
> + return;
> +
> + switch (qss) {
> + case 0:
> + mm_info ("QSS: SIM removed");
> + break;
> + case 1:
> + mm_info ("QSS: SIM inserted");
> + break;
> + case 2:
> + mm_info ("QSS: SIM inserted and PIN unlocked");
> + break;
> + case 3:
> + mm_info ("QSS: SIM inserted and PIN locked");
> + break;
> + default:
> + mm_warn ("QSS: unknown QSS value %d", qss);
> + break;
> + }
> +
> + mm_broadband_modem_update_sim_hot_swap_detected (MM_BROADBAND_MODEM (self));
> +}
> +
> +typedef struct {
> + MMBroadbandModemTelit *self;
> + GSimpleAsyncResult *result;
> +} ToggleQssUnsolicitedContext;
> +
> +static void
> +toggle_qss_unsolicited_context_complete_and_free (ToggleQssUnsolicitedContext *ctx)
> +{
> + g_simple_async_result_complete (ctx->result);
> + g_object_unref (ctx->result);
> + g_object_unref (ctx->self);
> + g_slice_free (ToggleQssUnsolicitedContext, ctx);
> +}
> +
> +static gboolean
> +modem_setup_sim_hot_swap_finish (MMIfaceModem *self,
> + GAsyncResult *res,
> + GError **error)
> +{
> + return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error);
> +}
> +
> +static void
> +telit_qss_toggle_ready (MMBaseModem *self,
> + GAsyncResult *res,
> + ToggleQssUnsolicitedContext *ctx)
> +{
> + GError *error = NULL;
> +
> + mm_base_modem_at_command_finish (self, res, &error);
> + if (error) {
> + mm_warn ("Enable QSS failed: %s", error->message);
> + g_simple_async_result_set_error (ctx->result,
> + MM_CORE_ERROR,
> + MM_CORE_ERROR_FAILED,
> + "Could not enable QSS");
> + } else {
> + MMPortSerialAt *primary;
> + MMPortSerialAt *secondary;
> + GRegex *pattern;
> +
> + pattern = g_regex_new ("#QSS:\\s*([0-3])\\r\\n", G_REGEX_RAW, 0, NULL);
> + g_assert (pattern);
> +
> + primary = mm_base_modem_peek_port_secondary (MM_BASE_MODEM (ctx->self));
> + mm_port_serial_at_add_unsolicited_msg_handler (
> + primary,
> + pattern,
> + (MMPortSerialAtUnsolicitedMsgFn)telit_qss_unsolicited_handler,
> + ctx->self,
> + NULL);
> +
> + secondary = mm_base_modem_peek_port_secondary (MM_BASE_MODEM (ctx->self));
> + if (secondary)
> + mm_port_serial_at_add_unsolicited_msg_handler (
> + secondary,
> + pattern,
> + (MMPortSerialAtUnsolicitedMsgFn)telit_qss_unsolicited_handler,
> + ctx->self,
> + NULL);
> +
> + g_regex_unref (pattern);
> + g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
> +
> + }
> +
> + toggle_qss_unsolicited_context_complete_and_free (ctx);
> +}
> +
> +
> +static void
> +modem_setup_sim_hot_swap (MMIfaceModem *self,
> + GAsyncReadyCallback callback,
> + gpointer user_data)
> +{
> + ToggleQssUnsolicitedContext *ctx;
> + MMPortSerialAt *port;
> +
> + mm_dbg ("Telit SIM hot swap: Enable QSS");
> +
> + ctx = g_slice_new0 (ToggleQssUnsolicitedContext);
> + ctx->self = g_object_ref (MM_BROADBAND_MODEM_TELIT (self));
> + ctx->result = g_simple_async_result_new (G_OBJECT (self),
> + callback,
> + user_data,
> + modem_setup_sim_hot_swap);
> +
> + port = mm_base_modem_peek_port_secondary (MM_BASE_MODEM (self));
> + if (!port)
> + port = mm_base_modem_peek_port_primary (MM_BASE_MODEM (self));
> +
> + mm_base_modem_at_command_full (MM_BASE_MODEM (self),
> + port,
> + "#QSS=1",
> + 3,
> + FALSE,
> + FALSE, /* raw */
> + NULL, /* cancellable */
> + (GAsyncReadyCallback) telit_qss_toggle_ready,
> + ctx);
> +}
> +
> +/*****************************************************************************/
> /* Set current bands (Modem interface) */
>
> static gboolean
> @@ -250,7 +386,7 @@ load_bands_ready (MMBaseModem *self,
> else
> g_simple_async_result_set_op_res_gpointer (ctx->result, bands, (GDestroyNotify)g_array_unref);
>
> - load_bands_context_complete_and_free(ctx);
> + load_bands_context_complete_and_free (ctx);
> }
>
> static void
> @@ -1053,6 +1189,7 @@ mm_broadband_modem_telit_new (const gchar *device,
> MM_BASE_MODEM_PLUGIN, plugin,
> MM_BASE_MODEM_VENDOR_ID, vendor_id,
> MM_BASE_MODEM_PRODUCT_ID, product_id,
> + MM_IFACE_MODEM_SIM_HOT_SWAP_SUPPORTED, TRUE,
> NULL);
> }
>
> @@ -1090,6 +1227,8 @@ iface_modem_init (MMIfaceModem *iface)
> iface->set_current_modes_finish = set_current_modes_finish;
> iface->modem_after_sim_unlock = modem_after_sim_unlock;
> iface->modem_after_sim_unlock_finish = modem_after_sim_unlock_finish;
> + iface->setup_sim_hot_swap = modem_setup_sim_hot_swap;
> + iface->setup_sim_hot_swap_finish = modem_setup_sim_hot_swap_finish;
> }
>
> static void
> --
> 2.7.4
>
> _______________________________________________
> ModemManager-devel mailing list
> ModemManager-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel
--
Aleksander
https://aleksander.es
More information about the ModemManager-devel
mailing list