icera: Request USSD mode and firmware details

This commit is contained in:
Marcel Holtmann 2012-05-25 12:29:59 +02:00
parent 6d83fbdf00
commit a5ae2e37df
1 changed files with 54 additions and 1 deletions

View File

@ -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);