From: Eric BOUXIROT <eric.bouxirot@azimut-monitoring.com>
To: ofono@ofono.org
Subject: Re: problem sim status
Date: Sat, 29 Mar 2014 14:35:52 +0100 [thread overview]
Message-ID: <lh6i7p$lls$1@ger.gmane.org> (raw)
In-Reply-To: <5335E17F.6040006@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 8536 bytes --]
> Simply query the model/whichever numbers as part of your initialization
> procedure. e.g. run AT+FOO for the information that you need. See how
> the huawei plugin uses AT+ATI for example.
ok !
here the patch i used to support Sierra Wireless SL808x series modem.
*add retries for +CPIN waiting SIM is ready
*add +CPINC to get PIN retry count
*add OFONO_VENDOR_SIERRA_SL808X vendor for theses specifics Sierra models.
*change to new vendor automaticaly at modem_enable using +CGMM to get modem model
I mean it can be added in next release of ofono ?
diff -uprN a/drivers/atmodem/sim.c b/drivers/atmodem/sim.c
--- a/drivers/atmodem/sim.c 2013-11-08 08:37:52.000000000 +0100
+++ b/drivers/atmodem/sim.c 2014-03-29 13:36:42.000000000 +0100
@@ -63,6 +63,7 @@ static const char *zpinpuk_prefix[] = {
static const char *pinnum_prefix[] = { "%PINNUM:", NULL };
static const char *oercn_prefix[] = { "_OERCN:", NULL };
static const char *cpinr_prefixes[] = { "+CPINR:", "+CPINRE:", NULL };
+static const char *cpinc_prefix[] = { "+CPINC:", NULL };
static const char *epin_prefix[] = { "*EPIN:", NULL };
static const char *spic_prefix[] = { "+SPIC:", NULL };
static const char *pct_prefix[] = { "#PCT:", NULL };
@@ -165,6 +166,7 @@ static void at_sim_read_info(struct ofon
case OFONO_VENDOR_ZTE:
case OFONO_VENDOR_HUAWEI:
case OFONO_VENDOR_SIERRA:
+ case OFONO_VENDOR_SIERRA_SL808X:
case OFONO_VENDOR_SPEEDUP:
case OFONO_VENDOR_QUALCOMM_MSM:
case OFONO_VENDOR_SIMCOM:
@@ -616,6 +618,45 @@ error:
CALLBACK_WITH_FAILURE(cb, NULL, cbd->data);
}
+static void at_cpinc_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+ struct cb_data *cbd = user_data;
+ ofono_sim_pin_retries_cb_t cb = cbd->cb;
+ const char *final = g_at_result_final_response(result);
+ GAtResultIter iter;
+ struct ofono_error error;
+ int retries[OFONO_SIM_PASSWORD_INVALID];
+ size_t i;
+ static enum ofono_sim_password_type password_types[] = {
+ OFONO_SIM_PASSWORD_SIM_PIN,
+ OFONO_SIM_PASSWORD_SIM_PIN2,
+ OFONO_SIM_PASSWORD_SIM_PUK,
+ OFONO_SIM_PASSWORD_SIM_PUK2,
+ };
+
+ decode_at_error(&error, final);
+
+ if (!ok) {
+ cb(&error, NULL, cbd->data);
+ return;
+ }
+
+ g_at_result_iter_init(&iter, result);
+
+ if (!g_at_result_iter_next(&iter, "+CPINC:"))
+ goto error;
+
+ BUILD_PIN_RETRIES_ARRAY(password_types, ARRAY_SIZE(password_types),
+ retries);
+
+ cb(&error, retries, cbd->data);
+
+ return;
+
+error:
+ CALLBACK_WITH_FAILURE(cb, NULL, cbd->data);
+}
+
static void xpincnt_cb(gboolean ok, GAtResult *result, gpointer user_data)
{
struct cb_data *cbd = user_data;
@@ -1023,6 +1064,11 @@ static void at_pin_retries_query(struct
at_pct_cb, cbd, g_free) > 0)
return;
break;
+ case OFONO_VENDOR_SIERRA_SL808X:
+ if (g_at_chat_send(sd->chat, "AT+CPINC", cpinc_prefix,
+ at_cpinc_cb, cbd, g_free) > 0)
+ return;
+ break;
case OFONO_VENDOR_ALCATEL:
if (g_at_chat_send(sd->chat, "AT+PNNM?", pnnm_prefix,
at_pnnm_cb, cbd, g_free) > 0)
@@ -1254,6 +1300,7 @@ static void at_pin_send_cb(gboolean ok,
case OFONO_VENDOR_ALCATEL:
case OFONO_VENDOR_HUAWEI:
case OFONO_VENDOR_SIMCOM:
+ case OFONO_VENDOR_SIERRA_SL808X:
/*
* On ZTE modems, after pin is entered, SIM state is checked
* by polling CPIN as their modem doesn't provide unsolicited
diff -uprN a/drivers/atmodem/vendor.h b/drivers/atmodem/vendor.h
--- a/drivers/atmodem/vendor.h 2013-11-08 08:37:52.000000000 +0100
+++ b/drivers/atmodem/vendor.h 2014-03-28 17:32:33.850389573 +0100
@@ -31,6 +31,7 @@ enum ofono_vendor {
OFONO_VENDOR_ZTE,
OFONO_VENDOR_HUAWEI,
OFONO_VENDOR_SIERRA,
+ OFONO_VENDOR_SIERRA_SL808X,
OFONO_VENDOR_NOVATEL,
OFONO_VENDOR_WAVECOM,
OFONO_VENDOR_NOKIA,
diff -uprN a/drivers/swmodem/gprs-context.c b/drivers/swmodem/gprs-context.c
--- a/drivers/swmodem/gprs-context.c 2012-07-02 09:55:34.000000000 +0200
+++ b/drivers/swmodem/gprs-context.c 2014-03-28 17:47:26.338306480 +0100
@@ -41,6 +41,7 @@
#include "gattty.h"
#include "swmodem.h"
+#include <drivers/atmodem/vendor.h>
static const char *none_prefix[] = { NULL };
@@ -49,6 +50,7 @@ struct gprs_context_data {
unsigned int active_context;
ofono_gprs_context_cb_t cb;
void *cb_data;
+ unsigned int vendor;
};
static void at_scact_down_cb(gboolean ok, GAtResult *result,
@@ -100,8 +102,10 @@ static void at_scact_up_cb(gboolean ok,
snprintf(buf, sizeof(buf), "AT!SCPADDR=%u", gcd->active_context);
g_at_chat_send(gcd->chat, buf, none_prefix, NULL, NULL, NULL);
- snprintf(buf, sizeof(buf), "AT+CGCONTRDP=%u", gcd->active_context);
- g_at_chat_send(gcd->chat, buf, none_prefix, NULL, NULL, NULL);
+ if (gcd->vendor == OFONO_VENDOR_SIERRA) {
+ snprintf(buf, sizeof(buf), "AT+CGCONTRDP=%u", gcd->active_context);
+ g_at_chat_send(gcd->chat, buf, none_prefix, NULL, NULL, NULL);
+ }
modem = ofono_gprs_context_get_modem(gc);
interface = ofono_modem_get_string(modem, "NetworkInterface");
@@ -227,6 +231,7 @@ static int sw_gprs_context_probe(struct
return -ENOMEM;
gcd->chat = g_at_chat_clone(chat);
+ gcd->vendor = vendor;
ofono_gprs_context_set_data(gc, gcd);
diff -uprN a/plugins/sierra.c b/plugins/sierra.c
--- a/plugins/sierra.c 2013-11-08 08:37:52.000000000 +0100
+++ b/plugins/sierra.c 2014-03-29 13:51:24.419037337 +0100
@@ -48,6 +48,8 @@ static const char *none_prefix[] = { NUL
struct sierra_data {
GAtChat *modem;
+ enum ofono_vendor vendor;
+ struct at_util_sim_state_query *sim_state_query;
};
static void sierra_debug(const char *str, void *user_data)
@@ -119,6 +121,17 @@ static GAtChat *open_device(struct ofono
return chat;
}
+static void sim_state_cb(gboolean present, gpointer user_data)
+{
+ struct ofono_modem *modem = user_data;
+ struct sierra_data *data = ofono_modem_get_data(modem);
+
+ at_util_sim_state_query_free(data->sim_state_query);
+ data->sim_state_query = NULL;
+
+ ofono_modem_set_powered(modem, TRUE);
+}
+
static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data)
{
struct ofono_modem *modem = user_data;
@@ -129,9 +142,44 @@ static void cfun_enable(gboolean ok, GAt
if (!ok) {
g_at_chat_unref(data->modem);
data->modem = NULL;
+
+ if (data->vendor == OFONO_VENDOR_SIERRA_SL808X)
+ ofono_modem_set_powered(modem, FALSE);
}
- ofono_modem_set_powered(modem, ok);
+ if (data->vendor == OFONO_VENDOR_SIERRA_SL808X)
+ data->sim_state_query = at_util_sim_state_query_new(data->modem,
+ 2, 20, sim_state_cb, modem,
+ NULL);
+ else
+ ofono_modem_set_powered(modem, ok);
+}
+
+static void get_model(gboolean ok, GAtResult *result, gpointer user_data)
+{
+ struct ofono_modem *modem = user_data;
+ struct sierra_data *data = ofono_modem_get_data(modem);
+ struct ofono_error error;
+ const char *attr;
+ enum ofono_vendor vendor = 0;
+
+ DBG("");
+
+ data->vendor=OFONO_VENDOR_SIERRA;
+ decode_at_error(&error, g_at_result_final_response(result));
+
+ if (!ok)
+ goto done;
+
+ if (at_util_parse_attr(result, "", &attr) == TRUE)
+ if (!strncmp(attr,"SL808",5)) {
+ data->vendor=OFONO_VENDOR_SIERRA_SL808X;
+ DBG("Modem is SL808X series");
+ }
+
+done:
+ g_at_chat_send(data->modem, "AT+CFUN=4", none_prefix,
+ cfun_enable, modem, NULL);
}
static int sierra_enable(struct ofono_modem *modem)
@@ -148,8 +196,7 @@ static int sierra_enable(struct ofono_mo
/* This is separate because it is not supported by all modems. */
g_at_chat_send(data->modem, "AT+CMEE=1", NULL, NULL, NULL, NULL);
- g_at_chat_send(data->modem, "AT+CFUN=4", none_prefix,
- cfun_enable, modem, NULL);
+ g_at_chat_send(data->modem, "AT+CGMM", NULL, get_model, modem, NULL);
return -EINPROGRESS;
}
@@ -219,7 +266,7 @@ static void sierra_pre_sim(struct ofono_
DBG("%p", modem);
ofono_devinfo_create(modem, 0, "atmodem", data->modem);
- sim = ofono_sim_create(modem, OFONO_VENDOR_SIERRA,
+ sim = ofono_sim_create(modem, data->vendor,
"atmodem", data->modem);
if (sim)
@@ -237,7 +284,7 @@ static void sierra_post_sim(struct ofono
ofono_phonebook_create(modem, 0, "atmodem", data->modem);
gprs = ofono_gprs_create(modem, 0, "atmodem", data->modem);
- gc = ofono_gprs_context_create(modem, 0, "swmodem", data->modem);
+ gc = ofono_gprs_context_create(modem, data->vendor, "swmodem", data->modem);
if (gprs && gc)
ofono_gprs_add_context(gprs, gc);
next prev parent reply other threads:[~2014-03-29 13:35 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-27 18:55 problem sim status Eric BOUXIROT
2014-03-27 20:05 ` Denis Kenzior
2014-03-27 20:21 ` Eric BOUXIROT
2014-03-27 20:30 ` Denis Kenzior
2014-03-27 21:34 ` Eric BOUXIROT
2014-03-27 22:14 ` Eric BOUXIROT
2014-03-28 17:27 ` Eric BOUXIROT
2014-03-28 17:31 ` Eric BOUXIROT
2014-03-28 20:54 ` Denis Kenzior
2014-03-29 13:35 ` Eric BOUXIROT [this message]
2014-03-31 15:30 ` Denis Kenzior
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='lh6i7p$lls$1@ger.gmane.org' \
--to=eric.bouxirot@azimut-monitoring.com \
--cc=ofono@ofono.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox