All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC 0/3] Add Gemalto Cinterion P-Family support
@ 2017-01-12 17:06 Vincent Cesson
  2017-01-12 17:06 ` [RFC 1/3] plugins: Add Gemalto plugin for Cinterion P-family Vincent Cesson
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Vincent Cesson @ 2017-01-12 17:06 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 1215 bytes --]

The following patches add support of Gemalto Cinterion P-family modems. It is tested on PHS8.

There is already a plugin based on TC65 and renamed from "tc65" to "cinterion" during support of EHS6. But PHS8 is too different. In particular, it needs several USB interfaces to handle Application, Modem and GPS. The current plugin does not support these interfaces so I think it is safer to create a new plugin. I used "gemalto" as an alternative name but you might have a better proposal.

The new gemalto plugin is based on cinterion, while udevng part is based on telit. Support includes network registration and SMS sending for now. Data is not functional yet because of a bug in atmodem driver but I will propose a patch alongside. Also I plan to add support of gnss.

Waiting for your comments. Regards,
Vincent

vcesson (3):
  plugins: Add Gemalto plugin for Cinterion P-family
  udevng: Add Gemalto P-family detection
  build: Add Gemalto plugin in Makefile

 Makefile.am       |   3 +
 plugins/gemalto.c | 265 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 plugins/udevng.c  |  38 ++++++++
 3 files changed, 306 insertions(+)
 create mode 100644 plugins/gemalto.c

-- 
1.9.1


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [RFC 1/3] plugins: Add Gemalto plugin for Cinterion P-family
  2017-01-12 17:06 [RFC 0/3] Add Gemalto Cinterion P-Family support Vincent Cesson
@ 2017-01-12 17:06 ` Vincent Cesson
  2017-01-13 22:30   ` Denis Kenzior
  2017-01-12 17:06 ` [RFC 2/3] udevng: Add Gemalto P-family detection Vincent Cesson
  2017-01-12 17:06 ` [RFC 3/3] build: Add Gemalto plugin in Makefile Vincent Cesson
  2 siblings, 1 reply; 11+ messages in thread
From: Vincent Cesson @ 2017-01-12 17:06 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 7548 bytes --]

From: vcesson <vincent.cesson@smile.fr>

Actual cinterion plugin is not compliant with newer Gemalto modems.
Gemalto plugin is based on cinterion with a custom struct to handle the
interfaces Application and Modem.
---
 plugins/gemalto.c | 265 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 265 insertions(+)
 create mode 100644 plugins/gemalto.c

diff --git a/plugins/gemalto.c b/plugins/gemalto.c
new file mode 100644
index 0000000..4758f62
--- /dev/null
+++ b/plugins/gemalto.c
@@ -0,0 +1,265 @@
+/*
+ *
+ *  oFono - Open Source Telephony
+ *
+ *  Copyright (C) 2008-2011  Intel Corporation. All rights reserved.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include <glib.h>
+#include <gatchat.h>
+#include <gattty.h>
+
+#define OFONO_API_SUBJECT_TO_CHANGE
+#include <ofono/plugin.h>
+#include <ofono/log.h>
+#include <ofono/modem.h>
+#include <ofono/call-barring.h>
+#include <ofono/call-forwarding.h>
+#include <ofono/call-meter.h>
+#include <ofono/call-settings.h>
+#include <ofono/devinfo.h>
+#include <ofono/message-waiting.h>
+#include <ofono/netreg.h>
+#include <ofono/phonebook.h>
+#include <ofono/sim.h>
+#include <ofono/sms.h>
+#include <ofono/ussd.h>
+#include <ofono/voicecall.h>
+
+#include <drivers/atmodem/atutil.h>
+
+#include <ofono/gprs.h>
+#include <ofono/gprs-context.h>
+
+#include <drivers/atmodem/vendor.h>
+
+struct gemalto_data {
+	GAtChat *app;
+	GAtChat *mdm;
+	struct ofono_private_config *config;
+};
+
+static int gemalto_probe(struct ofono_modem *modem)
+{
+	struct gemalto_data *data;
+
+	data = g_try_new0(struct gemalto_data, 1);
+	if (data == NULL)
+		return -ENOMEM;
+
+	ofono_modem_set_data(modem, data);
+
+	return 0;
+}
+
+static void gemalto_remove(struct ofono_modem *modem)
+{
+	struct gemalto_data *data = ofono_modem_get_data(modem);
+
+	ofono_modem_set_data(modem, NULL);
+	g_free(data);
+}
+
+static void gemalto_debug(const char *str, void *user_data)
+{
+	const char *prefix = user_data;
+
+	ofono_info("%s%s", prefix, str);
+}
+
+static GAtChat *open_device(const char *device)
+{
+	GAtSyntax *syntax;
+	GIOChannel *channel;
+	GAtChat *chat;
+
+	DBG("Opening device %s", device);
+
+	channel = g_at_tty_open(device, NULL);
+	if (channel == NULL)
+		return NULL;
+
+	syntax = g_at_syntax_new_gsm_permissive();
+	chat = g_at_chat_new(channel, syntax);
+	g_at_syntax_unref(syntax);
+	g_io_channel_unref(channel);
+
+	if (chat == NULL)
+		return NULL;
+
+	return chat;
+}
+
+static int gemalto_enable(struct ofono_modem *modem)
+{
+	struct gemalto_data *data = ofono_modem_get_data(modem);
+	const char *app, *mdm;
+
+	DBG("%p", modem);
+
+	app = ofono_modem_get_string(modem, "Application");
+	mdm = ofono_modem_get_string(modem, "Modem");
+
+	if (app == NULL || mdm == NULL)
+		return -EINVAL;
+
+	/* Open devices */
+	data->app = open_device(app);
+	if (data->app == NULL)
+		return -EINVAL;
+
+	data->mdm = open_device(mdm);
+	if (data->mdm == NULL) {
+		g_at_chat_unref(data->app);
+		data->app = NULL;
+		return -EINVAL;
+	}
+
+	if (getenv("OFONO_AT_DEBUG")) {
+		g_at_chat_set_debug(data->app, gemalto_debug, "App");
+		g_at_chat_set_debug(data->mdm, gemalto_debug, "Mdm");
+	}
+
+	return 0;
+}
+
+static int gemalto_disable(struct ofono_modem *modem)
+{
+	struct gemalto_data *data = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	g_at_chat_send(data->app, "AT+CFUN=0", NULL, NULL, NULL, NULL);
+
+	ofono_modem_set_data(modem, NULL);
+
+	return 0;
+}
+
+static void set_online_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+	struct cb_data *cbd = user_data;
+	ofono_modem_online_cb_t cb = cbd->cb;
+	struct ofono_error error;
+
+	decode_at_error(&error, g_at_result_final_response(result));
+
+	cb(&error, cbd->data);
+}
+
+static void gemalto_set_online(struct ofono_modem *modem, ofono_bool_t online,
+		ofono_modem_online_cb_t cb, void *user_data)
+{
+	struct gemalto_data *data = ofono_modem_get_data(modem);
+	struct cb_data *cbd = cb_data_new(cb, user_data);
+	char const *command = online ? "AT+CFUN=1" : "AT+CFUN=0";
+
+	DBG("modem %p %s", modem, online ? "online" : "offline");
+
+	if (g_at_chat_send(data->app, command, NULL, set_online_cb, cbd, g_free))
+		return;
+
+	CALLBACK_WITH_FAILURE(cb, cbd->data);
+
+	g_free(cbd);
+}
+
+static void gemalto_pre_sim(struct ofono_modem *modem)
+{
+	struct gemalto_data *data = ofono_modem_get_data(modem);
+	struct ofono_sim *sim;
+
+	DBG("%p", modem);
+
+	ofono_devinfo_create(modem, 0, "atmodem", data->app);
+	sim = ofono_sim_create(modem, 0, "atmodem", data->app);
+	ofono_voicecall_create(modem, 0, "atmodem", data->app);
+	ofono_location_reporting_create(modem, 0, "gemaltomodem", data->app);
+
+	if (sim)
+		ofono_sim_inserted_notify(sim, TRUE);
+}
+
+static void gemalto_post_sim(struct ofono_modem *modem)
+{
+	struct gemalto_data *data = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	ofono_phonebook_create(modem, 0, "atmodem", data->app);
+
+	ofono_sms_create(modem, 0, "atmodem", data->app);
+}
+
+static void gemalto_post_online(struct ofono_modem *modem)
+{
+	struct gemalto_data *data = ofono_modem_get_data(modem);
+	struct ofono_message_waiting *mw;
+	struct ofono_gprs *gprs;
+	struct ofono_gprs_context *gc;
+
+	DBG("%p", modem);
+
+	ofono_ussd_create(modem, 0, "atmodem", data->app);
+	ofono_call_forwarding_create(modem, 0, "atmodem", data->app);
+	ofono_call_settings_create(modem, 0, "atmodem", data->app);
+	ofono_netreg_create(modem, OFONO_VENDOR_CINTERION, "atmodem", data->app);
+	ofono_call_meter_create(modem, 0, "atmodem", data->app);
+	ofono_call_barring_create(modem, 0, "atmodem", data->app);
+
+	gprs = ofono_gprs_create(modem, 0, "atmodem", data->app);
+	gc = ofono_gprs_context_create(modem, 0, "atmodem", data->mdm);
+
+	if (gprs && gc)
+		ofono_gprs_add_context(gprs, gc);
+
+	mw = ofono_message_waiting_create(modem);
+	if (mw)
+		ofono_message_waiting_register(mw);
+}
+
+static struct ofono_modem_driver gemalto_driver = {
+	.name		= "gemalto",
+	.probe		= gemalto_probe,
+	.remove		= gemalto_remove,
+	.enable		= gemalto_enable,
+	.disable	= gemalto_disable,
+	.set_online	= gemalto_set_online,
+	.pre_sim	= gemalto_pre_sim,
+	.post_sim	= gemalto_post_sim,
+	.post_online	= gemalto_post_online,
+};
+
+static int gemalto_init(void)
+{
+	return ofono_modem_driver_register(&gemalto_driver);
+}
+
+static void gemalto_exit(void)
+{
+	ofono_modem_driver_unregister(&gemalto_driver);
+}
+
+OFONO_PLUGIN_DEFINE(gemalto, "Gemalto modem plugin", VERSION,
+		OFONO_PLUGIN_PRIORITY_DEFAULT, gemalto_init, gemalto_exit)
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [RFC 2/3] udevng: Add Gemalto P-family detection
  2017-01-12 17:06 [RFC 0/3] Add Gemalto Cinterion P-Family support Vincent Cesson
  2017-01-12 17:06 ` [RFC 1/3] plugins: Add Gemalto plugin for Cinterion P-family Vincent Cesson
@ 2017-01-12 17:06 ` Vincent Cesson
  2017-01-13 22:31   ` Denis Kenzior
  2017-01-12 17:06 ` [RFC 3/3] build: Add Gemalto plugin in Makefile Vincent Cesson
  2 siblings, 1 reply; 11+ messages in thread
From: Vincent Cesson @ 2017-01-12 17:06 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 2066 bytes --]

From: vcesson <vincent.cesson@smile.fr>

Add a new function setup, based on telit, to handle Gemalto P-family
discovery. The setup look for USB interfaces:
application=/dev/ttyUSB2
gps=/dev/ttyUSB1
modem=/dev/ttyUSB3
---
 plugins/udevng.c | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

diff --git a/plugins/udevng.c b/plugins/udevng.c
index a2866b6..f86f467 100644
--- a/plugins/udevng.c
+++ b/plugins/udevng.c
@@ -913,6 +913,42 @@ static gboolean setup_ublox(struct modem_info *modem)
 	return TRUE;
 }
 
+static gboolean setup_gemalto(struct modem_info* modem)
+{
+	const char *app = NULL, *gps = NULL, *mdm = NULL;
+
+	GSList *list;
+
+	DBG("%s", modem->syspath);
+
+	for (list = modem->devices; list; list = list->next) {
+		struct device_info *info = list->data;
+
+		DBG("%s %s %s %s %s", info->devnode, info->interface,
+						info->number, info->label, info->subsystem);
+
+		if (g_strcmp0(info->interface, "255/255/255") == 0) {
+			if (g_strcmp0(info->number, "01") == 0)
+				gps = info->devnode;
+			else if (g_strcmp0(info->number, "02") == 0)
+				app = info->devnode;
+			else if (g_strcmp0(info->number, "03") == 0)
+				mdm = info->devnode;
+		}
+	}
+
+	DBG("application=%s gps=%s modem=%s", app, gps, mdm);
+
+	if (app == NULL || mdm == NULL)
+		return FALSE;
+
+	ofono_modem_set_string(modem->modem, "Application", app);
+	ofono_modem_set_string(modem->modem, "GPS", gps);
+	ofono_modem_set_string(modem->modem, "Modem", mdm);
+
+	return TRUE;
+}
+
 static struct {
 	const char *name;
 	gboolean (*setup)(struct modem_info *modem);
@@ -939,6 +975,7 @@ static struct {
 	{ "samsung",	setup_samsung	},
 	{ "quectel",	setup_quectel	},
 	{ "ublox",	setup_ublox	},
+	{ "gemalto",	setup_gemalto	},
 	{ }
 };
 
@@ -1178,6 +1215,7 @@ static struct {
 	{ "ublox",	"cdc_acm",	"1546", "1102"	},
 	{ "ublox",	"rndis_host",	"1546", "1146"	},
 	{ "ublox",	"cdc_acm",	"1546", "1146"	},
+	{ "gemalto",	"option",	"1e2d",	"0053"	},
 	{ }
 };
 
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [RFC 3/3] build: Add Gemalto plugin in Makefile
  2017-01-12 17:06 [RFC 0/3] Add Gemalto Cinterion P-Family support Vincent Cesson
  2017-01-12 17:06 ` [RFC 1/3] plugins: Add Gemalto plugin for Cinterion P-family Vincent Cesson
  2017-01-12 17:06 ` [RFC 2/3] udevng: Add Gemalto P-family detection Vincent Cesson
@ 2017-01-12 17:06 ` Vincent Cesson
  2017-01-13 22:32   ` Denis Kenzior
  2 siblings, 1 reply; 11+ messages in thread
From: Vincent Cesson @ 2017-01-12 17:06 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 497 bytes --]

From: vcesson <vincent.cesson@smile.fr>

---
 Makefile.am | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/Makefile.am b/Makefile.am
index a817565..a87c892 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -452,6 +452,9 @@ builtin_sources += plugins/caif.c
 builtin_modules += cinterion
 builtin_sources += plugins/cinterion.c
 
+builtin_modules += gemalto
+builtin_sources += plugins/gemalto.c
+
 builtin_modules += nokia
 builtin_sources += plugins/nokia.c
 
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [RFC 1/3] plugins: Add Gemalto plugin for Cinterion P-family
  2017-01-12 17:06 ` [RFC 1/3] plugins: Add Gemalto plugin for Cinterion P-family Vincent Cesson
@ 2017-01-13 22:30   ` Denis Kenzior
  2017-01-16  9:07     ` [PATCH 1/2] " Vincent Cesson
  0 siblings, 1 reply; 11+ messages in thread
From: Denis Kenzior @ 2017-01-13 22:30 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 2952 bytes --]

Hi Vincent,

On 01/12/2017 11:06 AM, Vincent Cesson wrote:
> From: vcesson <vincent.cesson@smile.fr>

Please update your Author info.

>
> Actual cinterion plugin is not compliant with newer Gemalto modems.
> Gemalto plugin is based on cinterion with a custom struct to handle the
> interfaces Application and Modem.

The old cinterion plugin is used for Serial based devices.  So sure, 
this makes sense.

> ---
>  plugins/gemalto.c | 265 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 265 insertions(+)
>  create mode 100644 plugins/gemalto.c
>
> diff --git a/plugins/gemalto.c b/plugins/gemalto.c
> new file mode 100644
> index 0000000..4758f62
> --- /dev/null
> +++ b/plugins/gemalto.c
> @@ -0,0 +1,265 @@
> +/*
> + *
> + *  oFono - Open Source Telephony
> + *
> + *  Copyright (C) 2008-2011  Intel Corporation. All rights reserved.

You might want to update the copyright years and add your own to the 
above.  Really up to you though :)

> + *
> + *  This program is free software; you can redistribute it and/or modify
> + *  it under the terms of the GNU General Public License version 2 as
> + *  published by the Free Software Foundation.
> + *
> + *  This program is distributed in the hope that it will be useful,
> + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *  GNU General Public License for more details.
> + *
> + *  You should have received a copy of the GNU General Public License
> + *  along with this program; if not, write to the Free Software
> + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
> + *
> + */
> +
> +#ifdef HAVE_CONFIG_H
> +#include <config.h>
> +#endif
> +
> +#include <errno.h>
> +#include <stdlib.h>
> +
> +#include <glib.h>
> +#include <gatchat.h>
> +#include <gattty.h>
> +
> +#define OFONO_API_SUBJECT_TO_CHANGE
> +#include <ofono/plugin.h>
> +#include <ofono/log.h>
> +#include <ofono/modem.h>
> +#include <ofono/call-barring.h>
> +#include <ofono/call-forwarding.h>
> +#include <ofono/call-meter.h>
> +#include <ofono/call-settings.h>
> +#include <ofono/devinfo.h>
> +#include <ofono/message-waiting.h>
> +#include <ofono/netreg.h>
> +#include <ofono/phonebook.h>
> +#include <ofono/sim.h>
> +#include <ofono/sms.h>
> +#include <ofono/ussd.h>
> +#include <ofono/voicecall.h>
> +
> +#include <drivers/atmodem/atutil.h>
> +
> +#include <ofono/gprs.h>
> +#include <ofono/gprs-context.h>
> +
> +#include <drivers/atmodem/vendor.h>
> +
> +struct gemalto_data {
> +	GAtChat *app;
> +	GAtChat *mdm;
> +	struct ofono_private_config *config;

What's this?  There's no such structure defined, and you should not be 
hijacking the ofono_ prefix for something that is local to a particular 
driver.

> +};
> +

The rest looks just fine to me.

Regards,
-Denis


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [RFC 2/3] udevng: Add Gemalto P-family detection
  2017-01-12 17:06 ` [RFC 2/3] udevng: Add Gemalto P-family detection Vincent Cesson
@ 2017-01-13 22:31   ` Denis Kenzior
  0 siblings, 0 replies; 11+ messages in thread
From: Denis Kenzior @ 2017-01-13 22:31 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 476 bytes --]

On 01/12/2017 11:06 AM, Vincent Cesson wrote:
> From: vcesson <vincent.cesson@smile.fr>

Please update your Author info.

>
> Add a new function setup, based on telit, to handle Gemalto P-family
> discovery. The setup look for USB interfaces:
> application=/dev/ttyUSB2
> gps=/dev/ttyUSB1
> modem=/dev/ttyUSB3
> ---
>  plugins/udevng.c | 38 ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 38 insertions(+)
>

Looks fine to me.

Regards,
-Denis


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [RFC 3/3] build: Add Gemalto plugin in Makefile
  2017-01-12 17:06 ` [RFC 3/3] build: Add Gemalto plugin in Makefile Vincent Cesson
@ 2017-01-13 22:32   ` Denis Kenzior
  0 siblings, 0 replies; 11+ messages in thread
From: Denis Kenzior @ 2017-01-13 22:32 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 337 bytes --]

Hi Vincent,

On 01/12/2017 11:06 AM, Vincent Cesson wrote:
> From: vcesson <vincent.cesson@smile.fr>
>
> ---
>  Makefile.am | 3 +++
>  1 file changed, 3 insertions(+)

Please squash this patch into patch 1/3.  Since that patch adds the a 
new .c file to plugins/ it should also add it to the build system.

Regards,
-Denis

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/2] plugins: Add Gemalto plugin for Cinterion P-family
  2017-01-13 22:30   ` Denis Kenzior
@ 2017-01-16  9:07     ` Vincent Cesson
  2017-01-16  9:07       ` [PATCH 2/2] udevng: Add Gemalto P-family detection Vincent Cesson
  2017-01-17  3:50       ` [PATCH 1/2] plugins: Add Gemalto plugin for Cinterion P-family Denis Kenzior
  0 siblings, 2 replies; 11+ messages in thread
From: Vincent Cesson @ 2017-01-16  9:07 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 7860 bytes --]

Actual cinterion plugin is not compliant with newer Gemalto modems.
Gemalto plugin is based on cinterion with a custom struct to handle the
interfaces Application and Modem.
---
 Makefile.am       |   3 +
 plugins/gemalto.c | 264 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 267 insertions(+)
 create mode 100644 plugins/gemalto.c

diff --git a/Makefile.am b/Makefile.am
index a817565..a87c892 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -452,6 +452,9 @@ builtin_sources += plugins/caif.c
 builtin_modules += cinterion
 builtin_sources += plugins/cinterion.c
 
+builtin_modules += gemalto
+builtin_sources += plugins/gemalto.c
+
 builtin_modules += nokia
 builtin_sources += plugins/nokia.c
 
diff --git a/plugins/gemalto.c b/plugins/gemalto.c
new file mode 100644
index 0000000..286d52c
--- /dev/null
+++ b/plugins/gemalto.c
@@ -0,0 +1,264 @@
+/*
+ *
+ *  oFono - Open Source Telephony
+ *
+ *  Copyright (C) 2017 Vincent Cesson. All rights reserved.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include <glib.h>
+#include <gatchat.h>
+#include <gattty.h>
+
+#define OFONO_API_SUBJECT_TO_CHANGE
+#include <ofono/plugin.h>
+#include <ofono/log.h>
+#include <ofono/modem.h>
+#include <ofono/call-barring.h>
+#include <ofono/call-forwarding.h>
+#include <ofono/call-meter.h>
+#include <ofono/call-settings.h>
+#include <ofono/devinfo.h>
+#include <ofono/message-waiting.h>
+#include <ofono/netreg.h>
+#include <ofono/phonebook.h>
+#include <ofono/sim.h>
+#include <ofono/sms.h>
+#include <ofono/ussd.h>
+#include <ofono/voicecall.h>
+
+#include <drivers/atmodem/atutil.h>
+
+#include <ofono/gprs.h>
+#include <ofono/gprs-context.h>
+
+#include <drivers/atmodem/vendor.h>
+
+struct gemalto_data {
+	GAtChat *app;
+	GAtChat *mdm;
+};
+
+static int gemalto_probe(struct ofono_modem *modem)
+{
+	struct gemalto_data *data;
+
+	data = g_try_new0(struct gemalto_data, 1);
+	if (data == NULL)
+		return -ENOMEM;
+
+	ofono_modem_set_data(modem, data);
+
+	return 0;
+}
+
+static void gemalto_remove(struct ofono_modem *modem)
+{
+	struct gemalto_data *data = ofono_modem_get_data(modem);
+
+	ofono_modem_set_data(modem, NULL);
+	g_free(data);
+}
+
+static void gemalto_debug(const char *str, void *user_data)
+{
+	const char *prefix = user_data;
+
+	ofono_info("%s%s", prefix, str);
+}
+
+static GAtChat *open_device(const char *device)
+{
+	GAtSyntax *syntax;
+	GIOChannel *channel;
+	GAtChat *chat;
+
+	DBG("Opening device %s", device);
+
+	channel = g_at_tty_open(device, NULL);
+	if (channel == NULL)
+		return NULL;
+
+	syntax = g_at_syntax_new_gsm_permissive();
+	chat = g_at_chat_new(channel, syntax);
+	g_at_syntax_unref(syntax);
+	g_io_channel_unref(channel);
+
+	if (chat == NULL)
+		return NULL;
+
+	return chat;
+}
+
+static int gemalto_enable(struct ofono_modem *modem)
+{
+	struct gemalto_data *data = ofono_modem_get_data(modem);
+	const char *app, *mdm;
+
+	DBG("%p", modem);
+
+	app = ofono_modem_get_string(modem, "Application");
+	mdm = ofono_modem_get_string(modem, "Modem");
+
+	if (app == NULL || mdm == NULL)
+		return -EINVAL;
+
+	/* Open devices */
+	data->app = open_device(app);
+	if (data->app == NULL)
+		return -EINVAL;
+
+	data->mdm = open_device(mdm);
+	if (data->mdm == NULL) {
+		g_at_chat_unref(data->app);
+		data->app = NULL;
+		return -EINVAL;
+	}
+
+	if (getenv("OFONO_AT_DEBUG")) {
+		g_at_chat_set_debug(data->app, gemalto_debug, "App");
+		g_at_chat_set_debug(data->mdm, gemalto_debug, "Mdm");
+	}
+
+	return 0;
+}
+
+static int gemalto_disable(struct ofono_modem *modem)
+{
+	struct gemalto_data *data = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	g_at_chat_send(data->app, "AT^SMSO", NULL, NULL, NULL, NULL);
+
+	ofono_modem_set_data(modem, NULL);
+
+	return 0;
+}
+
+static void set_online_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+	struct cb_data *cbd = user_data;
+	ofono_modem_online_cb_t cb = cbd->cb;
+	struct ofono_error error;
+
+	decode_at_error(&error, g_at_result_final_response(result));
+
+	cb(&error, cbd->data);
+}
+
+static void gemalto_set_online(struct ofono_modem *modem, ofono_bool_t online,
+		ofono_modem_online_cb_t cb, void *user_data)
+{
+	struct gemalto_data *data = ofono_modem_get_data(modem);
+	struct cb_data *cbd = cb_data_new(cb, user_data);
+	char const *command = online ? "AT+CFUN=1" : "AT+CFUN=0";
+
+	DBG("modem %p %s", modem, online ? "online" : "offline");
+
+	if (g_at_chat_send(data->app, command, NULL, set_online_cb, cbd, g_free))
+		return;
+
+	CALLBACK_WITH_FAILURE(cb, cbd->data);
+
+	g_free(cbd);
+}
+
+static void gemalto_pre_sim(struct ofono_modem *modem)
+{
+	struct gemalto_data *data = ofono_modem_get_data(modem);
+	struct ofono_sim *sim;
+
+	DBG("%p", modem);
+
+	ofono_devinfo_create(modem, 0, "atmodem", data->app);
+	sim = ofono_sim_create(modem, 0, "atmodem", data->app);
+	ofono_voicecall_create(modem, 0, "atmodem", data->app);
+	ofono_location_reporting_create(modem, 0, "gemaltomodem", data->app);
+
+	if (sim)
+		ofono_sim_inserted_notify(sim, TRUE);
+}
+
+static void gemalto_post_sim(struct ofono_modem *modem)
+{
+	struct gemalto_data *data = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	ofono_phonebook_create(modem, 0, "atmodem", data->app);
+
+	ofono_sms_create(modem, 0, "atmodem", data->app);
+}
+
+static void gemalto_post_online(struct ofono_modem *modem)
+{
+	struct gemalto_data *data = ofono_modem_get_data(modem);
+	struct ofono_message_waiting *mw;
+	struct ofono_gprs *gprs;
+	struct ofono_gprs_context *gc;
+
+	DBG("%p", modem);
+
+	ofono_ussd_create(modem, 0, "atmodem", data->app);
+	ofono_call_forwarding_create(modem, 0, "atmodem", data->app);
+	ofono_call_settings_create(modem, 0, "atmodem", data->app);
+	ofono_netreg_create(modem, OFONO_VENDOR_CINTERION, "atmodem", data->app);
+	ofono_call_meter_create(modem, 0, "atmodem", data->app);
+	ofono_call_barring_create(modem, 0, "atmodem", data->app);
+
+	gprs = ofono_gprs_create(modem, 0, "atmodem", data->app);
+	gc = ofono_gprs_context_create(modem, 0, "atmodem", data->mdm);
+
+	if (gprs && gc)
+		ofono_gprs_add_context(gprs, gc);
+
+	mw = ofono_message_waiting_create(modem);
+	if (mw)
+		ofono_message_waiting_register(mw);
+}
+
+static struct ofono_modem_driver gemalto_driver = {
+	.name		= "gemalto",
+	.probe		= gemalto_probe,
+	.remove		= gemalto_remove,
+	.enable		= gemalto_enable,
+	.disable	= gemalto_disable,
+	.set_online	= gemalto_set_online,
+	.pre_sim	= gemalto_pre_sim,
+	.post_sim	= gemalto_post_sim,
+	.post_online	= gemalto_post_online,
+};
+
+static int gemalto_init(void)
+{
+	return ofono_modem_driver_register(&gemalto_driver);
+}
+
+static void gemalto_exit(void)
+{
+	ofono_modem_driver_unregister(&gemalto_driver);
+}
+
+OFONO_PLUGIN_DEFINE(gemalto, "Gemalto modem plugin", VERSION,
+		OFONO_PLUGIN_PRIORITY_DEFAULT, gemalto_init, gemalto_exit)
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 2/2] udevng: Add Gemalto P-family detection
  2017-01-16  9:07     ` [PATCH 1/2] " Vincent Cesson
@ 2017-01-16  9:07       ` Vincent Cesson
  2017-01-17  3:52         ` Denis Kenzior
  2017-01-17  3:50       ` [PATCH 1/2] plugins: Add Gemalto plugin for Cinterion P-family Denis Kenzior
  1 sibling, 1 reply; 11+ messages in thread
From: Vincent Cesson @ 2017-01-16  9:07 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 2024 bytes --]

Add a new function setup, based on telit, to handle Gemalto P-family
discovery. The setup looks for USB interfaces:
application=/dev/ttyUSB2
gps=/dev/ttyUSB1
modem=/dev/ttyUSB3
---
 plugins/udevng.c | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

diff --git a/plugins/udevng.c b/plugins/udevng.c
index a2866b6..f86f467 100644
--- a/plugins/udevng.c
+++ b/plugins/udevng.c
@@ -913,6 +913,42 @@ static gboolean setup_ublox(struct modem_info *modem)
 	return TRUE;
 }
 
+static gboolean setup_gemalto(struct modem_info* modem)
+{
+	const char *app = NULL, *gps = NULL, *mdm = NULL;
+
+	GSList *list;
+
+	DBG("%s", modem->syspath);
+
+	for (list = modem->devices; list; list = list->next) {
+		struct device_info *info = list->data;
+
+		DBG("%s %s %s %s %s", info->devnode, info->interface,
+						info->number, info->label, info->subsystem);
+
+		if (g_strcmp0(info->interface, "255/255/255") == 0) {
+			if (g_strcmp0(info->number, "01") == 0)
+				gps = info->devnode;
+			else if (g_strcmp0(info->number, "02") == 0)
+				app = info->devnode;
+			else if (g_strcmp0(info->number, "03") == 0)
+				mdm = info->devnode;
+		}
+	}
+
+	DBG("application=%s gps=%s modem=%s", app, gps, mdm);
+
+	if (app == NULL || mdm == NULL)
+		return FALSE;
+
+	ofono_modem_set_string(modem->modem, "Application", app);
+	ofono_modem_set_string(modem->modem, "GPS", gps);
+	ofono_modem_set_string(modem->modem, "Modem", mdm);
+
+	return TRUE;
+}
+
 static struct {
 	const char *name;
 	gboolean (*setup)(struct modem_info *modem);
@@ -939,6 +975,7 @@ static struct {
 	{ "samsung",	setup_samsung	},
 	{ "quectel",	setup_quectel	},
 	{ "ublox",	setup_ublox	},
+	{ "gemalto",	setup_gemalto	},
 	{ }
 };
 
@@ -1178,6 +1215,7 @@ static struct {
 	{ "ublox",	"cdc_acm",	"1546", "1102"	},
 	{ "ublox",	"rndis_host",	"1546", "1146"	},
 	{ "ublox",	"cdc_acm",	"1546", "1146"	},
+	{ "gemalto",	"option",	"1e2d",	"0053"	},
 	{ }
 };
 
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/2] plugins: Add Gemalto plugin for Cinterion P-family
  2017-01-16  9:07     ` [PATCH 1/2] " Vincent Cesson
  2017-01-16  9:07       ` [PATCH 2/2] udevng: Add Gemalto P-family detection Vincent Cesson
@ 2017-01-17  3:50       ` Denis Kenzior
  1 sibling, 0 replies; 11+ messages in thread
From: Denis Kenzior @ 2017-01-17  3:50 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 1007 bytes --]

Hi Vincent,

On 01/16/2017 03:07 AM, Vincent Cesson wrote:
> Actual cinterion plugin is not compliant with newer Gemalto modems.
> Gemalto plugin is based on cinterion with a custom struct to handle the
> interfaces Application and Modem.
> ---
>  Makefile.am       |   3 +
>  plugins/gemalto.c | 264 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 267 insertions(+)
>  create mode 100644 plugins/gemalto.c
>


When applied, I got the following compile error:

plugins/gemalto.c: In function ‘gemalto_pre_sim’:
plugins/gemalto.c:197:2: error: implicit declaration of function 
‘ofono_location_reporting_create’ [-Werror=implicit-function-declaration]
   ofono_location_reporting_create(modem, 0, "gemaltomodem", data->app);
   ^

I'm guessing you have some location reporting patches forthcoming. 
Anyway, I took out the offending line (please add it in your patch 
series dealing with location reporting) and pushed upstream.

Regards,
-Denis

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/2] udevng: Add Gemalto P-family detection
  2017-01-16  9:07       ` [PATCH 2/2] udevng: Add Gemalto P-family detection Vincent Cesson
@ 2017-01-17  3:52         ` Denis Kenzior
  0 siblings, 0 replies; 11+ messages in thread
From: Denis Kenzior @ 2017-01-17  3:52 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 408 bytes --]

Hi Vincent,

On 01/16/2017 03:07 AM, Vincent Cesson wrote:
> Add a new function setup, based on telit, to handle Gemalto P-family
> discovery. The setup looks for USB interfaces:
> application=/dev/ttyUSB2
> gps=/dev/ttyUSB1
> modem=/dev/ttyUSB3
> ---
>  plugins/udevng.c | 38 ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 38 insertions(+)
>

Applied, thanks.

Regards,
-Denis


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2017-01-17  3:52 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-01-12 17:06 [RFC 0/3] Add Gemalto Cinterion P-Family support Vincent Cesson
2017-01-12 17:06 ` [RFC 1/3] plugins: Add Gemalto plugin for Cinterion P-family Vincent Cesson
2017-01-13 22:30   ` Denis Kenzior
2017-01-16  9:07     ` [PATCH 1/2] " Vincent Cesson
2017-01-16  9:07       ` [PATCH 2/2] udevng: Add Gemalto P-family detection Vincent Cesson
2017-01-17  3:52         ` Denis Kenzior
2017-01-17  3:50       ` [PATCH 1/2] plugins: Add Gemalto plugin for Cinterion P-family Denis Kenzior
2017-01-12 17:06 ` [RFC 2/3] udevng: Add Gemalto P-family detection Vincent Cesson
2017-01-13 22:31   ` Denis Kenzior
2017-01-12 17:06 ` [RFC 3/3] build: Add Gemalto plugin in Makefile Vincent Cesson
2017-01-13 22:32   ` Denis Kenzior

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.