Open Source Telephony
 help / color / mirror / Atom feed
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);


  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