summaryrefslogtreecommitdiffstats
path: root/plugins/icera.c
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2012-05-25 12:29:59 +0200
committerMarcel Holtmann <marcel@holtmann.org>2012-05-25 12:29:59 +0200
commita5ae2e37df3925659b11cd0ecebb28fd2f0ce0ff (patch)
tree82b8fb0eb297796df322e2ca090053bc583f826c /plugins/icera.c
parent6d83fbdf00e7c29529baeaf65768eee8327ee88d (diff)
downloadofono-a5ae2e37df3925659b11cd0ecebb28fd2f0ce0ff.tar.bz2
icera: Request USSD mode and firmware details
Diffstat (limited to 'plugins/icera.c')
-rw-r--r--plugins/icera.c55
1 files changed, 54 insertions, 1 deletions
diff --git a/plugins/icera.c b/plugins/icera.c
index 53fdf449..c283fccb 100644
--- a/plugins/icera.c
+++ b/plugins/icera.c
@@ -48,11 +48,13 @@
static const char *none_prefix[] = { NULL };
static const char *siminit_prefix[] = { "%ISIMINIT:", NULL };
+static const char *ussdmode_prefix[] = { "%IUSSDMODE:", NULL };
struct icera_data {
GAtChat *chat;
struct ofono_sim *sim;
gboolean have_sim;
+ int ussdmode;
};
static int icera_probe(struct ofono_modem *modem)
@@ -132,6 +134,51 @@ static GAtChat *open_device(struct ofono_modem *modem,
return chat;
}
+static void ussdmode_query(gboolean ok, GAtResult *result,
+ gpointer user_data)
+{
+ struct ofono_modem *modem = user_data;
+ struct icera_data *data = ofono_modem_get_data(modem);
+ GAtResultIter iter;
+ int mode;
+
+ if (!ok)
+ return;
+
+ g_at_result_iter_init(&iter, result);
+
+ if (!g_at_result_iter_next(&iter, "%IUSSDMODE:"))
+ return;
+
+ if (!g_at_result_iter_next_number(&iter, &mode))
+ return;
+
+ DBG("mode %d", mode);
+
+ data->ussdmode = mode;
+}
+
+static void ussdmode_support(gboolean ok, GAtResult *result,
+ gpointer user_data)
+{
+ struct ofono_modem *modem = user_data;
+ struct icera_data *data = ofono_modem_get_data(modem);
+ GAtResultIter iter;
+
+ if (!ok)
+ return;
+
+ g_at_result_iter_init(&iter, result);
+
+ DBG("a");
+ if (!g_at_result_iter_next(&iter, "%IUSSDMODE:"))
+ return;
+
+ DBG("b");
+ g_at_chat_send(data->chat, "AT%IUSSDMODE?", ussdmode_prefix,
+ ussdmode_query, modem, NULL);
+}
+
static void icera_set_sim_state(struct icera_data *data, int state)
{
DBG("state %d", state);
@@ -233,7 +280,7 @@ static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data)
g_at_chat_send(data->chat, "AT%ISIMINIT", siminit_prefix,
siminit_query, modem, NULL);
- g_at_chat_send(data->chat, "AT*TSIMINS=1", none_prefix,
+ g_at_chat_send(data->chat, "AT%IAIRCRAFT?", none_prefix,
NULL, NULL, NULL);
}
@@ -249,6 +296,12 @@ static int icera_enable(struct ofono_modem *modem)
g_at_chat_send(data->chat, "ATE0 +CMEE=1", NULL, NULL, NULL, NULL);
+ g_at_chat_send(data->chat, "AT%IFWR", none_prefix, NULL, NULL, NULL);
+ g_at_chat_send(data->chat, "AT%ISWIN", none_prefix, NULL, NULL, NULL);
+
+ g_at_chat_send(data->chat, "AT%IUSSDMODE=?", ussdmode_prefix,
+ ussdmode_support, modem, NULL);
+
g_at_chat_send(data->chat, "AT+CFUN=4", none_prefix,
cfun_enable, modem, NULL);