The unsolicited +CPIN: NOT INSERTED is lost on the M95 and MC60 modems
during CMUX setup, and the CPIN? query responds with an unhandled
CME ERROR: 10.
Use at_util_sim_state_query_new() to detect SIM presence/pin-state
during power-on. (M95 / MC60 don't support hotplug of sim card).
---
Philip: This patch removes the CFUN? query that is apparently needed for
UC15 modems, but I don't have such a modem to test on. Are you still
working with this and can you test this?
plugins/quectel.c | 90 ++++++-----------------------------------------
1 file changed, 11 insertions(+), 79 deletions(-)
diff --git a/plugins/quectel.c b/plugins/quectel.c
index bddf6a17..741aced6 100644
--- a/plugins/quectel.c
+++ b/plugins/quectel.c
@@ -59,7 +59,6 @@
#include <drivers/atmodem/vendor.h>
static const char *cfun_prefix[] = { "+CFUN:", NULL };
-static const char *cpin_prefix[] = { "+CPIN:", NULL };
static const char *cbc_prefix[] = { "+CBC:", NULL };
static const char *qinistat_prefix[] = { "+QINISTAT:", NULL };
static const char *cgmm_prefix[] = { "UC15", "Quectel_M95", "Quectel_MC60",
@@ -87,12 +86,12 @@ enum quectel_model {
struct quectel_data {
GAtChat *modem;
GAtChat *aux;
- guint cpin_ready;
guint call_ready;
bool have_sim;
enum ofono_vendor vendor;
enum quectel_model model;
struct l_timeout *sms_ready_timer;
+ struct at_util_sim_state_query *sim_state_query;
/* used by quectel uart driver */
GAtChat *uart;
@@ -182,9 +181,6 @@ static void quectel_remove(struct ofono_modem *modem)
DBG("%p", modem);
- if (data->cpin_ready != 0)
- g_at_chat_unregister(data->aux, data->cpin_ready);
-
ofono_modem_set_data(modem, NULL);
l_gpio_writer_free(data->gpio);
g_at_chat_unref(data->aux);
@@ -523,68 +519,25 @@ static void dbus_hw_enable(struct ofono_modem *modem)
ofono_modem_add_interface(modem, dbus_hw_interface);
}
-static void cpin_notify(GAtResult *result, gpointer user_data)
+static void sim_state_cb(gboolean present, gpointer user_data)
{
struct ofono_modem *modem = user_data;
struct quectel_data *data = ofono_modem_get_data(modem);
- const char *sim_inserted;
- GAtResultIter iter;
DBG("%p", modem);
- g_at_result_iter_init(&iter, result);
-
- if (!g_at_result_iter_next(&iter, "+CPIN:"))
- return;
-
- g_at_result_iter_next_unquoted_string(&iter, &sim_inserted);
-
- if (g_strcmp0(sim_inserted, "NOT INSERTED") != 0)
- data->have_sim = true;
-
- ofono_modem_set_powered(modem, TRUE);
-
- /* Turn off the radio. */
- g_at_chat_send(data->aux, "AT+CFUN=4", none_prefix, NULL, NULL, NULL);
-
- g_at_chat_unregister(data->aux, data->cpin_ready);
- data->cpin_ready = 0;
+ if (!present)
+ ofono_warn("%s sim not present", ofono_modem_get_path(modem));
+ data->have_sim = present;
dbus_hw_enable(modem);
+ ofono_modem_set_powered(modem, TRUE);
}
-static void cpin_query(gboolean ok, GAtResult *result, gpointer user_data)
-{
- DBG("%p ok %d", user_data, ok);
-
- if (ok)
- cpin_notify(result, user_data);
-}
-
-static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data)
-{
- struct ofono_modem *modem = user_data;
- struct quectel_data *data = ofono_modem_get_data(modem);
-
- DBG("%p ok %d", modem, ok);
-
- if (!ok) {
- close_serial(modem);
- return;
- }
-
- data->cpin_ready = g_at_chat_register(data->aux, "+CPIN", cpin_notify,
- FALSE, modem, NULL);
- g_at_chat_send(data->aux, "AT+CPIN?", cpin_prefix, cpin_query, modem,
- NULL);
-}
-
-static void cfun_query(gboolean ok, GAtResult *result, gpointer user_data)
+static void cfun_cb(gboolean ok, GAtResult *result, gpointer user_data)
{
struct ofono_modem *modem = user_data;
struct quectel_data *data = ofono_modem_get_data(modem);
- GAtResultIter iter;
- int cfun;
DBG("%p ok %d", modem, ok);
@@ -593,30 +546,9 @@ static void cfun_query(gboolean ok, GAtResult *result,
gpointer user_data)
return;
}
- g_at_result_iter_init(&iter, result);
-
- if (g_at_result_iter_next(&iter, "+CFUN:") == FALSE) {
- close_serial(modem);
- return;
- }
-
- g_at_result_iter_next_number(&iter, &cfun);
-
- /*
- * The modem firmware powers up in CFUN=1 but will respond to AT+CFUN=4
- * with ERROR until some amount of time (which varies with temperature)
- * passes. Empirical evidence suggests that the firmware will report an
- * unsolicited +CPIN: notification when it is ready to be useful.
- *
- * Work around this feature by only transitioning to CFUN=4 if the
- * modem is not in CFUN=1 or until after we've received an unsolicited
- * +CPIN: notification.
- */
- if (cfun != 1)
- g_at_chat_send(data->aux, "AT+CFUN=4", none_prefix, cfun_enable,
- modem, NULL);
- else
- cfun_enable(TRUE, NULL, modem);
+ data->sim_state_query = at_util_sim_state_query_new(data->aux, 2, 20,
+ sim_state_cb,
+ modem, NULL);
}
static void cgmm_cb(int ok, GAtResult *result, void *user_data)
@@ -651,7 +583,7 @@ static void cgmm_cb(int ok, GAtResult *result, void
*user_data)
data->model = QUECTEL_UNKNOWN;
}
- g_at_chat_send(data->aux, "AT+CFUN?", cfun_prefix, cfun_query, modem,
+ g_at_chat_send(data->aux, "AT+CFUN=4", none_prefix, cfun_cb, modem,
NULL);
}
--
2.22.0
_______________________________________________
ofono mailing list
[email protected]
https://lists.ofono.org/mailman/listinfo/ofono