All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Added Wavecom modem plugin.
@ 2010-04-19 19:34 Matthias
  2010-04-19 21:29 ` Denis Kenzior
  0 siblings, 1 reply; 4+ messages in thread
From: Matthias @ 2010-04-19 19:34 UTC (permalink / raw)
  To: ofono

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

The Wavecom WMP100 assumes CPIN to be the final response, therefore some special handling is
neccessary (see 6d28f82dc1ccb3de3a028a88eafb96fb001c7e61). Now the vendor id OFONO_VENDOR_WAVECOM
is passed with all "*create" functions.
---
 Makefile.am         |    3 +
 plugins/modemconf.c |    1 +
 plugins/wavecom.c   |  212 +++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 216 insertions(+), 0 deletions(-)
 create mode 100644 plugins/wavecom.c

diff --git a/Makefile.am b/Makefile.am
index 0eaadda..9b4b31c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -187,6 +187,9 @@ builtin_sources += plugins/atgen.c
 builtin_modules += g1
 builtin_sources += plugins/g1.c
 
+builtin_modules += wavecom
+builtin_sources += plugins/wavecom.c
+
 builtin_modules += calypso
 builtin_sources += plugins/calypso.c
 
diff --git a/plugins/modemconf.c b/plugins/modemconf.c
index cf0ee8b..f38ca98 100644
--- a/plugins/modemconf.c
+++ b/plugins/modemconf.c
@@ -121,6 +121,7 @@ static struct {
 	{ "phonesim",	set_address	},
 	{ "atgen",	set_device	},
 	{ "g1",		set_device	},
+	{ "wavecom",	set_device	},
 	{ "ste",	set_device	},
 	{ "calypso",	set_device	},
 	{ "palmpre",	set_device	},
diff --git a/plugins/wavecom.c b/plugins/wavecom.c
new file mode 100644
index 0000000..7beeb5b
--- /dev/null
+++ b/plugins/wavecom.c
@@ -0,0 +1,212 @@
+/*
+ *
+ *  oFono - Open Source Telephony
+ *
+ *  Copyright (C) 2008-2010  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/ssn.h>
+#include <ofono/ussd.h>
+#include <ofono/voicecall.h>
+
+#include <drivers/atmodem/vendor.h>
+
+static const char *tty_opts[] = {
+	"Baud",
+	"Read",
+	"Local",
+	"StopBits",
+	"DataBits",
+	"Parity",
+	"XonXoff",
+	"RtsCts",
+	NULL,
+};
+
+static int wavecom_probe(struct ofono_modem *modem)
+{
+	return 0;
+}
+
+static void wavecom_remove(struct ofono_modem *modem)
+{
+}
+
+static void wavecom_debug(const char *str, void *user_data)
+{
+	ofono_info("%s", str);
+}
+
+static int wavecom_enable(struct ofono_modem *modem)
+{
+	GAtChat *chat;
+	GIOChannel *channel;
+	GAtSyntax *syntax;
+	const char *device;
+	const char *value;
+	GHashTable *options;
+	int i;
+
+	DBG("%p", modem);
+
+	device = ofono_modem_get_string(modem, "Device");
+	if (!device)
+		return -EINVAL;
+
+	options = g_hash_table_new_full(g_str_hash, g_str_equal,
+					g_free, g_free);
+	if (!options)
+		return -ENOMEM;
+
+	for (i = 0; tty_opts[i]; i++) {
+		value = ofono_modem_get_string(modem, tty_opts[i]);
+
+		if (value == NULL)
+			continue;
+
+		g_hash_table_insert(options, g_strdup(tty_opts[i]),
+					g_strdup(value));
+	}
+
+	channel = g_at_tty_open(device, options);
+
+	g_hash_table_destroy(options);
+
+	if (!channel) {
+		return -EIO;
+	}
+
+	value = ofono_modem_get_string(modem, "GsmSyntax");
+	if (value) {
+		if (g_str_equal(value, "V1"))
+			syntax = g_at_syntax_new_gsmv1();
+		else if (g_str_equal(value, "Permissive"))
+			syntax = g_at_syntax_new_gsm_permissive();
+		else
+			return -EINVAL;
+	} else {
+		syntax = g_at_syntax_new_gsmv1();
+	}
+
+	chat = g_at_chat_new(channel, syntax);
+	g_at_syntax_unref(syntax);
+	g_io_channel_unref(channel);
+
+	if (!chat)
+		return -ENOMEM;
+
+	if (getenv("OFONO_AT_DEBUG"))
+		g_at_chat_set_debug(chat, wavecom_debug, NULL);
+
+	ofono_modem_set_data(modem, chat);
+
+	return 0;
+}
+
+static int wavecom_disable(struct ofono_modem *modem)
+{
+	GAtChat *chat = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	ofono_modem_set_data(modem, NULL);
+
+	g_at_chat_unref(chat);
+
+	return 0;
+}
+
+static void wavecom_pre_sim(struct ofono_modem *modem)
+{
+	GAtChat *chat = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	ofono_devinfo_create(modem, OFONO_VENDOR_WAVECOM, "atmodem", chat);
+	ofono_sim_create(modem, OFONO_VENDOR_WAVECOM, "atmodem", chat);
+	ofono_voicecall_create(modem, OFONO_VENDOR_WAVECOM, "atmodem", chat);
+}
+
+static void wavecom_post_sim(struct ofono_modem *modem)
+{
+	GAtChat *chat = ofono_modem_get_data(modem);
+	struct ofono_message_waiting *mw;
+
+	DBG("%p", modem);
+
+	ofono_ussd_create(modem, OFONO_VENDOR_WAVECOM, "atmodem", chat);
+	ofono_call_forwarding_create(modem, OFONO_VENDOR_WAVECOM, "atmodem", chat);
+	ofono_call_settings_create(modem, OFONO_VENDOR_WAVECOM, "atmodem", chat);
+	ofono_netreg_create(modem, OFONO_VENDOR_WAVECOM, "atmodem", chat);
+	ofono_call_meter_create(modem, OFONO_VENDOR_WAVECOM, "atmodem", chat);
+	ofono_call_barring_create(modem, OFONO_VENDOR_WAVECOM, "atmodem", chat);
+	ofono_ssn_create(modem, OFONO_VENDOR_WAVECOM, "atmodem", chat);
+	ofono_sms_create(modem, OFONO_VENDOR_WAVECOM, "atmodem", chat);
+	ofono_phonebook_create(modem, OFONO_VENDOR_WAVECOM, "atmodem", chat);
+
+	mw = ofono_message_waiting_create(modem);
+	if (mw)
+		ofono_message_waiting_register(mw);
+}
+
+static struct ofono_modem_driver wavecom_driver = {
+	.name		= "wavecom",
+	.probe		= wavecom_probe,
+	.remove		= wavecom_remove,
+	.enable		= wavecom_enable,
+	.disable	= wavecom_disable,
+	.pre_sim	= wavecom_pre_sim,
+	.post_sim	= wavecom_post_sim,
+};
+
+static int wavecom_init(void)
+{
+	return ofono_modem_driver_register(&wavecom_driver);
+}
+
+static void wavecom_exit(void)
+{
+	ofono_modem_driver_unregister(&wavecom_driver);
+}
+
+OFONO_PLUGIN_DEFINE(wavecom, "Wavecom driver", VERSION,
+		OFONO_PLUGIN_PRIORITY_DEFAULT, wavecom_init, wavecom_exit)
-- 
1.6.3.3


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

* Re: [PATCH] Added Wavecom modem plugin.
  2010-04-19 19:34 [PATCH] Added Wavecom modem plugin Matthias
@ 2010-04-19 21:29 ` Denis Kenzior
  2010-04-20  0:09   ` Matthias =?unknown-8bit?q?G=C3=BCnther?=
  0 siblings, 1 reply; 4+ messages in thread
From: Denis Kenzior @ 2010-04-19 21:29 UTC (permalink / raw)
  To: ofono

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

Hi Matthias,

> The Wavecom WMP100 assumes CPIN to be the final response, therefore some
>  special handling is neccessary (see
>  6d28f82dc1ccb3de3a028a88eafb96fb001c7e61). Now the vendor id
>  OFONO_VENDOR_WAVECOM is passed with all "*create" functions.

You should also set your authorship information correctly.  E.g. first + last 
name.

> +	options = g_hash_table_new_full(g_str_hash, g_str_equal,
> +					g_free, g_free);
> +	if (!options)
> +		return -ENOMEM;
> +
> +	for (i = 0; tty_opts[i]; i++) {
> +		value = ofono_modem_get_string(modem, tty_opts[i]);
> +
> +		if (value == NULL)
> +			continue;
> +
> +		g_hash_table_insert(options, g_strdup(tty_opts[i]),
> +					g_strdup(value));
> +	}
> +
> +	channel = g_at_tty_open(device, options);

I suggest hardcoding these options (see calypso.c) unless you really want to 
change them from modem.conf for some reason.

> +	value = ofono_modem_get_string(modem, "GsmSyntax");
> +	if (value) {
> +		if (g_str_equal(value, "V1"))
> +			syntax = g_at_syntax_new_gsmv1();
> +		else if (g_str_equal(value, "Permissive"))
> +			syntax = g_at_syntax_new_gsm_permissive();
> +		else
> +			return -EINVAL;
> +	} else {
> +		syntax = g_at_syntax_new_gsmv1();
> +	}

Same here, you should know whether the wavecom is 27.007 compliant or not.

> +	ofono_devinfo_create(modem, OFONO_VENDOR_WAVECOM, "atmodem", chat);
> +	ofono_sim_create(modem, OFONO_VENDOR_WAVECOM, "atmodem", chat);
> +	ofono_voicecall_create(modem, OFONO_VENDOR_WAVECOM, "atmodem", chat);

You really don't want to do that, only pass it to the place where it is 
relevant (e.g. the SIM atom.) That way we know what quirks the modem actually 
has instead of looking at all drivers just to find it has completely stock 
behavior.

Regards,
-Denis

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

* [PATCH] Added Wavecom modem plugin.
  2010-04-19 21:29 ` Denis Kenzior
@ 2010-04-20  0:09   ` Matthias =?unknown-8bit?q?G=C3=BCnther?=
  2010-04-20 17:03     ` Denis Kenzior
  0 siblings, 1 reply; 4+ messages in thread
From: Matthias =?unknown-8bit?q?G=C3=BCnther?= @ 2010-04-20  0:09 UTC (permalink / raw)
  To: ofono

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

The Wavecom WMP100 assumes CPIN to be the final response, therefore some special handling is
neccessary (see 6d28f82dc1ccb3de3a028a88eafb96fb001c7e61). Now the vendor id OFONO_VENDOR_WAVECOM
is passed with all "*create" functions.
---
 Makefile.am         |    3 +
 plugins/modemconf.c |    1 +
 plugins/wavecom.c   |  186 +++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 190 insertions(+), 0 deletions(-)
 create mode 100644 plugins/wavecom.c

diff --git a/Makefile.am b/Makefile.am
index 4acc69b..3d078d8 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -193,6 +193,9 @@ builtin_sources += plugins/atgen.c
 builtin_modules += g1
 builtin_sources += plugins/g1.c
 
+builtin_modules += wavecom
+builtin_sources += plugins/wavecom.c
+
 builtin_modules += calypso
 builtin_sources += plugins/calypso.c
 
diff --git a/plugins/modemconf.c b/plugins/modemconf.c
index 281a762..3e6203a 100644
--- a/plugins/modemconf.c
+++ b/plugins/modemconf.c
@@ -121,6 +121,7 @@ static struct {
 	{ "phonesim",	set_address	},
 	{ "atgen",	set_device	},
 	{ "g1",		set_device	},
+	{ "wavecom",	set_device	},
 	{ "ste",	set_device	},
 	{ "calypso",	set_device	},
 	{ "palmpre",	set_device	},
diff --git a/plugins/wavecom.c b/plugins/wavecom.c
new file mode 100644
index 0000000..eab3abd
--- /dev/null
+++ b/plugins/wavecom.c
@@ -0,0 +1,186 @@
+/*
+ *
+ *  oFono - Open Source Telephony
+ *
+ *  Copyright (C) 2008-2010  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/ssn.h>
+#include <ofono/ussd.h>
+#include <ofono/voicecall.h>
+
+#include <drivers/atmodem/vendor.h>
+
+
+static int wavecom_probe(struct ofono_modem *modem)
+{
+	return 0;
+}
+
+static void wavecom_remove(struct ofono_modem *modem)
+{
+}
+
+static void wavecom_debug(const char *str, void *user_data)
+{
+	ofono_info("%s", str);
+}
+
+static int wavecom_enable(struct ofono_modem *modem)
+{
+	GAtChat *chat;
+	GIOChannel *channel;
+	GAtSyntax *syntax;
+	const char *device;
+	GHashTable *options;
+
+	DBG("%p", modem);
+
+	device = ofono_modem_get_string(modem, "Device");
+	if (!device)
+		return -EINVAL;
+
+	options = g_hash_table_new(g_str_hash, g_str_equal);
+
+	if (!options)
+		return -ENOMEM;
+
+	g_hash_table_insert(options, "Baud", "115200");
+	g_hash_table_insert(options, "Parity", "none");
+	g_hash_table_insert(options, "StopBits", "1");
+	g_hash_table_insert(options, "DataBits", "8");
+
+	channel = g_at_tty_open(device, options);
+
+	g_hash_table_destroy(options);
+
+	if (!channel) {
+		return -EIO;
+	}
+
+	/* Could not figure out whether it is fully compliant or not */
+	syntax = g_at_syntax_new_gsm_permissive();
+	//syntax = g_at_syntax_new_gsmv1();
+
+	chat = g_at_chat_new(channel, syntax);
+	g_at_syntax_unref(syntax);
+	g_io_channel_unref(channel);
+
+	if (!chat)
+		return -ENOMEM;
+
+	if (getenv("OFONO_AT_DEBUG"))
+		g_at_chat_set_debug(chat, wavecom_debug, NULL);
+
+	ofono_modem_set_data(modem, chat);
+
+	return 0;
+}
+
+static int wavecom_disable(struct ofono_modem *modem)
+{
+	GAtChat *chat = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	ofono_modem_set_data(modem, NULL);
+
+	g_at_chat_unref(chat);
+
+	return 0;
+}
+
+static void wavecom_pre_sim(struct ofono_modem *modem)
+{
+	GAtChat *chat = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	ofono_devinfo_create(modem, 0, "atmodem", chat);
+	ofono_sim_create(modem, OFONO_VENDOR_WAVECOM, "atmodem", chat);
+	ofono_voicecall_create(modem, 0, "atmodem", chat);
+}
+
+static void wavecom_post_sim(struct ofono_modem *modem)
+{
+	GAtChat *chat = ofono_modem_get_data(modem);
+	struct ofono_message_waiting *mw;
+
+	DBG("%p", modem);
+
+	ofono_ussd_create(modem, 0, "atmodem", chat);
+	ofono_call_forwarding_create(modem, 0, "atmodem", chat);
+	ofono_call_settings_create(modem, 0, "atmodem", chat);
+	ofono_netreg_create(modem, 0, "atmodem", chat);
+	ofono_call_meter_create(modem, 0, "atmodem", chat);
+	ofono_call_barring_create(modem, 0, "atmodem", chat);
+	ofono_ssn_create(modem, 0, "atmodem", chat);
+	ofono_sms_create(modem, 0, "atmodem", chat);
+	ofono_phonebook_create(modem, 0, "atmodem", chat);
+
+	mw = ofono_message_waiting_create(modem);
+	if (mw)
+		ofono_message_waiting_register(mw);
+}
+
+static struct ofono_modem_driver wavecom_driver = {
+	.name		= "wavecom",
+	.probe		= wavecom_probe,
+	.remove		= wavecom_remove,
+	.enable		= wavecom_enable,
+	.disable	= wavecom_disable,
+	.pre_sim	= wavecom_pre_sim,
+	.post_sim	= wavecom_post_sim,
+};
+
+static int wavecom_init(void)
+{
+	return ofono_modem_driver_register(&wavecom_driver);
+}
+
+static void wavecom_exit(void)
+{
+	ofono_modem_driver_unregister(&wavecom_driver);
+}
+
+OFONO_PLUGIN_DEFINE(wavecom, "Wavecom driver", VERSION,
+		OFONO_PLUGIN_PRIORITY_DEFAULT, wavecom_init, wavecom_exit)
-- 
1.6.3.3


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

* Re: [PATCH] Added Wavecom modem plugin.
  2010-04-20  0:09   ` Matthias =?unknown-8bit?q?G=C3=BCnther?=
@ 2010-04-20 17:03     ` Denis Kenzior
  0 siblings, 0 replies; 4+ messages in thread
From: Denis Kenzior @ 2010-04-20 17:03 UTC (permalink / raw)
  To: ofono

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

Hi Matthias,

> The Wavecom WMP100 assumes CPIN to be the final response, therefore some
>  special handling is neccessary (see
>  6d28f82dc1ccb3de3a028a88eafb96fb001c7e61). Now the vendor id
>  OFONO_VENDOR_WAVECOM is passed with all "*create" functions.

I massaged the commit message and pushed the patch.  I did make two small 
changes afterward:

> +	if (!channel) {
> +		return -EIO;
> +	}

Coding style requires this to be without braces (all single statement blocks 
if/while/for should not have braces)

> +
> +	/* Could not figure out whether it is fully compliant or not */
> +	syntax = g_at_syntax_new_gsm_permissive();
> +	//syntax = g_at_syntax_new_gsmv1();

Commented out code is not a good idea, if you're not sure about something 
reflect it in the comment.

Regards,
-Denis

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

end of thread, other threads:[~2010-04-20 17:03 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-04-19 19:34 [PATCH] Added Wavecom modem plugin Matthias
2010-04-19 21:29 ` Denis Kenzior
2010-04-20  0:09   ` Matthias =?unknown-8bit?q?G=C3=BCnther?=
2010-04-20 17:03     ` 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.