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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.