All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3, Part2, 1/3] nokiacdma: Add plugin and CDMA MO Call Support
@ 2010-12-21 19:23 Dara Spieker-Doyle
  2010-12-23  2:31 ` Denis Kenzior
  0 siblings, 1 reply; 3+ messages in thread
From: Dara Spieker-Doyle @ 2010-12-21 19:23 UTC (permalink / raw)
  To: ofono

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

---
 Makefile.am         |    3 +
 plugins/nokiacdma.c |  275 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 278 insertions(+), 0 deletions(-)
 create mode 100644 plugins/nokiacdma.c

diff --git a/Makefile.am b/Makefile.am
index 32ded3d..74b6759 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -293,6 +293,9 @@ builtin_sources += plugins/ste.c
 
 builtin_modules += caif
 builtin_sources += plugins/caif.c
+
+builtin_modules += nokiacdma
+builtin_sources += plugins/nokiacdma.c
 endif
 
 if MAINTAINER_MODE
diff --git a/plugins/nokiacdma.c b/plugins/nokiacdma.c
new file mode 100644
index 0000000..3cf2de0
--- /dev/null
+++ b/plugins/nokiacdma.c
@@ -0,0 +1,275 @@
+/*
+ * This file is part of oFono - Open Source Telephony
+ *
+ * Copyright (C) 2010 Nokia 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 <stdlib.h>
+#include <errno.h>
+#include <termios.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.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 <drivers/atmodem/atutil.h>
+#include <ofono/cdma-voicecall.h>
+
+#include "common.h"
+
+struct nokiacdma_data {
+	GAtChat *chat;
+	ofono_bool_t online;
+	ofono_bool_t registration_status;
+};
+
+static void nokiacdma_debug(const char *str, void *data)
+{
+	const char *prefix = data;
+
+	ofono_info("%s%s", prefix, str);
+}
+
+static int nokiacdma_probe(struct ofono_modem *modem)
+{
+	struct nokiacdma_data *data;
+
+	DBG("%p", modem);
+
+	data = g_try_new0(struct nokiacdma_data, 1);
+	if (data == NULL)
+		return -ENOMEM;
+
+	ofono_modem_set_data(modem, data);
+
+	return 0;
+}
+
+static void nokiacdma_remove(struct ofono_modem *modem)
+{
+	struct nokiacdma_data *data = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	ofono_modem_set_data(modem, NULL);
+
+	if (data->chat)
+		g_at_chat_unref(data->chat);
+
+	g_free(data);
+}
+
+static GAtChat *create_port(const char *device)
+{
+	GAtSyntax *syntax;
+	GIOChannel *channel;
+	GAtChat *chat;
+
+	channel = g_at_tty_open(device, NULL);
+	if (channel == NULL)
+		return NULL;
+
+	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 == NULL)
+		return NULL;
+
+	return chat;
+}
+
+static GAtChat *open_device(struct ofono_modem *modem,
+				const char *key, char *debug)
+{
+	const char *device;
+	GAtChat *chat;
+
+	device = ofono_modem_get_string(modem, key);
+	if (device == NULL)
+		return NULL;
+
+	DBG("%s %s", key, device);
+
+	chat = create_port(device);
+	if (chat == NULL)
+		return NULL;
+
+	g_at_chat_add_terminator(chat, "COMMAND NOT SUPPORT", -1, FALSE);
+
+	if (getenv("OFONO_AT_DEBUG"))
+		g_at_chat_set_debug(chat, nokiacdma_debug, debug);
+
+	return chat;
+}
+
+static void nokiacdma_disconnect(gpointer user_data)
+{
+	struct ofono_modem *modem = user_data;
+	struct nokiacdma_data *data = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	g_at_chat_unref(data->chat);
+	data->chat = NULL;
+
+	data->chat = open_device(modem, "Device", "CDMA Device: ");
+	if (data->chat == NULL)
+		return;
+
+	g_at_chat_set_disconnect_function(data->chat,
+			nokiacdma_disconnect, modem);
+}
+
+/* power up hardware */
+static int nokiacdma_enable(struct ofono_modem *modem)
+{
+	struct nokiacdma_data *data = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	ofono_modem_set_boolean(modem, "no_sim_required", TRUE);
+
+	data->chat = open_device(modem, "Device", "CDMA Device: ");
+	if (data->chat == NULL)
+		return -EINVAL;
+
+	g_at_chat_set_disconnect_function(data->chat,
+			nokiacdma_disconnect, modem);
+
+	if (getenv("OFONO_AT_DEBUG"))
+		g_at_chat_set_debug(data->chat, nokiacdma_debug,
+				"CDMA Generic: ");
+
+	return 0;
+}
+
+static int nokiacdma_disable(struct ofono_modem *modem)
+{
+	struct nokiacdma_data *data = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	if (data->chat) {
+		g_at_chat_cancel_all(data->chat);
+		g_at_chat_unregister_all(data->chat);
+		g_at_chat_unref(data->chat);
+		data->chat = NULL;
+	}
+
+	return 0;
+}
+
+static void nokiacdma_pre_sim(struct ofono_modem *modem)
+{
+	struct nokiacdma_data *data = ofono_modem_get_data(modem);
+
+	ofono_cdma_voicecall_create(modem, 0, "cdmamodem",
+				data->chat);
+}
+
+static void nokiacdma_post_sim(struct ofono_modem *modem)
+{
+}
+
+static gboolean nokiacdma_set_online_cb(gpointer cb_data)
+{
+	struct cb_data *cbd = cb_data;
+	ofono_modem_online_cb_t cb = cbd->cb;
+
+	CALLBACK_WITH_SUCCESS(cb, cbd->data);
+
+	g_free(cbd);
+
+	/* do not call again */
+	return FALSE;
+}
+
+static void nokiacdma_set_online(struct ofono_modem *modem, ofono_bool_t online,
+				ofono_modem_online_cb_t cb, void *user_data)
+{
+	struct nokiacdma_data *data = ofono_modem_get_data(modem);
+	struct cb_data *cbd = cb_data_new(cb, user_data);
+
+	DBG("modem %p %s", modem, online ? "online" : "offline");
+
+	if (cbd == NULL)
+		goto error;
+
+	data->online = online;
+
+	/* TODO: Fix this when network registration implemented */
+	if (online)
+		data->registration_status =
+		    NETWORK_REGISTRATION_STATUS_REGISTERED;
+
+	nokiacdma_set_online_cb(cbd);
+	return;
+
+error:
+	g_free(cbd);
+
+	CALLBACK_WITH_FAILURE(cb, cbd->data);
+}
+
+static void nokiacdma_post_online(struct ofono_modem *modem)
+{
+	DBG("%p", modem);
+}
+
+static struct ofono_modem_driver nokiacdma_driver = {
+	.name			= "nokiacdma",
+	.probe			= nokiacdma_probe,
+	.remove			= nokiacdma_remove,
+	.enable			= nokiacdma_enable,
+	.disable		= nokiacdma_disable,
+	.pre_sim		= nokiacdma_pre_sim,
+	.post_sim		= nokiacdma_post_sim,
+	.set_online		= nokiacdma_set_online,
+	.post_online		= nokiacdma_post_online,
+};
+
+static int nokiacdma_init(void)
+{
+	return ofono_modem_driver_register(&nokiacdma_driver);
+}
+
+static void nokiacdma_exit(void)
+{
+	ofono_modem_driver_unregister(&nokiacdma_driver);
+}
+
+OFONO_PLUGIN_DEFINE(nokiacdma, "Generic CDMA AT Modem", VERSION,
+			OFONO_PLUGIN_PRIORITY_DEFAULT,
+			nokiacdma_init, nokiacdma_exit)
-- 
1.7.0.4


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

* Re: [PATCH v3, Part2, 1/3] nokiacdma: Add plugin and CDMA MO Call Support
  2010-12-21 19:23 [PATCH v3, Part2, 1/3] nokiacdma: Add plugin and CDMA MO Call Support Dara Spieker-Doyle
@ 2010-12-23  2:31 ` Denis Kenzior
  2010-12-23 23:41   ` Dara Spieker-Doyle
  0 siblings, 1 reply; 3+ messages in thread
From: Denis Kenzior @ 2010-12-23  2:31 UTC (permalink / raw)
  To: ofono

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

Hi Dara,

<snip>

> +struct nokiacdma_data {
> +	GAtChat *chat;
> +	ofono_bool_t online;
> +	ofono_bool_t registration_status;

What is the purpose of the above two variables?

<snip>

> +static void nokiacdma_disconnect(gpointer user_data)
> +{
> +	struct ofono_modem *modem = user_data;
> +	struct nokiacdma_data *data = ofono_modem_get_data(modem);
> +
> +	DBG("%p", modem);
> +
> +	g_at_chat_unref(data->chat);
> +	data->chat = NULL;
> +
> +	data->chat = open_device(modem, "Device", "CDMA Device: ");
> +	if (data->chat == NULL)
> +		return;
> +
> +	g_at_chat_set_disconnect_function(data->chat,
> +			nokiacdma_disconnect, modem);
> +}

What are you trying to accomplish in this one?  on the huawei driver
this is used to re-open the tty because it is HUP-ed when the ppp
session ends (their way of signaling NO CARRIER).  However, I don't see
you doing PPP yet, so I'm not so sure of the purpose here?

> +
> +/* power up hardware */
> +static int nokiacdma_enable(struct ofono_modem *modem)
> +{
> +	struct nokiacdma_data *data = ofono_modem_get_data(modem);
> +
> +	DBG("%p", modem);
> +
> +	ofono_modem_set_boolean(modem, "no_sim_required", TRUE);
> +
> +	data->chat = open_device(modem, "Device", "CDMA Device: ");
> +	if (data->chat == NULL)
> +		return -EINVAL;
> +
> +	g_at_chat_set_disconnect_function(data->chat,
> +			nokiacdma_disconnect, modem);
> +
> +	if (getenv("OFONO_AT_DEBUG"))
> +		g_at_chat_set_debug(data->chat, nokiacdma_debug,
> +				"CDMA Generic: ");
> +
> +	return 0;
> +}
> +
> +static int nokiacdma_disable(struct ofono_modem *modem)
> +{
> +	struct nokiacdma_data *data = ofono_modem_get_data(modem);
> +
> +	DBG("%p", modem);
> +
> +	if (data->chat) {
> +		g_at_chat_cancel_all(data->chat);
> +		g_at_chat_unregister_all(data->chat);
> +		g_at_chat_unref(data->chat);
> +		data->chat = NULL;
> +	}
> +
> +	return 0;

So enable and disable just open up the ports?

> +}
> +
> +static void nokiacdma_pre_sim(struct ofono_modem *modem)
> +{
> +	struct nokiacdma_data *data = ofono_modem_get_data(modem);
> +
> +	ofono_cdma_voicecall_create(modem, 0, "cdmamodem",
> +				data->chat);
> +}
> +
> +static void nokiacdma_post_sim(struct ofono_modem *modem)
> +{
> +}
> +
> +static gboolean nokiacdma_set_online_cb(gpointer cb_data)
> +{
> +	struct cb_data *cbd = cb_data;
> +	ofono_modem_online_cb_t cb = cbd->cb;
> +
> +	CALLBACK_WITH_SUCCESS(cb, cbd->data);
> +
> +	g_free(cbd);
> +
> +	/* do not call again */
> +	return FALSE;
> +}
> +
> +static void nokiacdma_set_online(struct ofono_modem *modem, ofono_bool_t online,
> +				ofono_modem_online_cb_t cb, void *user_data)
> +{
> +	struct nokiacdma_data *data = ofono_modem_get_data(modem);
> +	struct cb_data *cbd = cb_data_new(cb, user_data);
> +
> +	DBG("modem %p %s", modem, online ? "online" : "offline");
> +
> +	if (cbd == NULL)
> +		goto error;
> +
> +	data->online = online;
> +
> +	/* TODO: Fix this when network registration implemented */
> +	if (online)
> +		data->registration_status =
> +		    NETWORK_REGISTRATION_STATUS_REGISTERED;
> +
> +	nokiacdma_set_online_cb(cbd);
> +	return;
> +
> +error:
> +	g_free(cbd);
> +
> +	CALLBACK_WITH_FAILURE(cb, cbd->data);
> +}

I'm lost here.  What are you trying to accomplish?

<snip>

Regards,
-Denis

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

* Re: [PATCH v3, Part2, 1/3] nokiacdma: Add plugin and CDMA MO Call Support
  2010-12-23  2:31 ` Denis Kenzior
@ 2010-12-23 23:41   ` Dara Spieker-Doyle
  0 siblings, 0 replies; 3+ messages in thread
From: Dara Spieker-Doyle @ 2010-12-23 23:41 UTC (permalink / raw)
  To: ofono

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

Hi Denis

On 12/22/2010 06:31 PM, ext Denis Kenzior wrote:
> Hi Dara,
>
> <snip>
>
>> +struct nokiacdma_data {
>> +	GAtChat *chat;
>> +	ofono_bool_t online;
>> +	ofono_bool_t registration_status;
>
> What is the purpose of the above two variables?
>
> <snip>
>
>> +static void nokiacdma_disconnect(gpointer user_data)
>> +{
>> +	struct ofono_modem *modem = user_data;
>> +	struct nokiacdma_data *data = ofono_modem_get_data(modem);
>> +
>> +	DBG("%p", modem);
>> +
>> +	g_at_chat_unref(data->chat);
>> +	data->chat = NULL;
>> +
>> +	data->chat = open_device(modem, "Device", "CDMA Device: ");
>> +	if (data->chat == NULL)
>> +		return;
>> +
>> +	g_at_chat_set_disconnect_function(data->chat,
>> +			nokiacdma_disconnect, modem);
>> +}
>
> What are you trying to accomplish in this one?  on the huawei driver
> this is used to re-open the tty because it is HUP-ed when the ppp
> session ends (their way of signaling NO CARRIER).  However, I don't see
> you doing PPP yet, so I'm not so sure of the purpose here?
>
>> +
>> +/* power up hardware */
>> +static int nokiacdma_enable(struct ofono_modem *modem)
>> +{
>> +	struct nokiacdma_data *data = ofono_modem_get_data(modem);
>> +
>> +	DBG("%p", modem);
>> +
>> +	ofono_modem_set_boolean(modem, "no_sim_required", TRUE);
>> +
>> +	data->chat = open_device(modem, "Device", "CDMA Device: ");
>> +	if (data->chat == NULL)
>> +		return -EINVAL;
>> +
>> +	g_at_chat_set_disconnect_function(data->chat,
>> +			nokiacdma_disconnect, modem);
>> +
>> +	if (getenv("OFONO_AT_DEBUG"))
>> +		g_at_chat_set_debug(data->chat, nokiacdma_debug,
>> +				"CDMA Generic: ");
>> +
>> +	return 0;
>> +}
>> +
>> +static int nokiacdma_disable(struct ofono_modem *modem)
>> +{
>> +	struct nokiacdma_data *data = ofono_modem_get_data(modem);
>> +
>> +	DBG("%p", modem);
>> +
>> +	if (data->chat) {
>> +		g_at_chat_cancel_all(data->chat);
>> +		g_at_chat_unregister_all(data->chat);
>> +		g_at_chat_unref(data->chat);
>> +		data->chat = NULL;
>> +	}
>> +
>> +	return 0;
>
> So enable and disable just open up the ports?
>
>> +}
>> +
>> +static void nokiacdma_pre_sim(struct ofono_modem *modem)
>> +{
>> +	struct nokiacdma_data *data = ofono_modem_get_data(modem);
>> +
>> +	ofono_cdma_voicecall_create(modem, 0, "cdmamodem",
>> +				data->chat);
>> +}
>> +
>> +static void nokiacdma_post_sim(struct ofono_modem *modem)
>> +{
>> +}
>> +
>> +static gboolean nokiacdma_set_online_cb(gpointer cb_data)
>> +{
>> +	struct cb_data *cbd = cb_data;
>> +	ofono_modem_online_cb_t cb = cbd->cb;
>> +
>> +	CALLBACK_WITH_SUCCESS(cb, cbd->data);
>> +
>> +	g_free(cbd);
>> +
>> +	/* do not call again */
>> +	return FALSE;
>> +}
>> +
>> +static void nokiacdma_set_online(struct ofono_modem *modem, ofono_bool_t online,
>> +				ofono_modem_online_cb_t cb, void *user_data)
>> +{
>> +	struct nokiacdma_data *data = ofono_modem_get_data(modem);
>> +	struct cb_data *cbd = cb_data_new(cb, user_data);
>> +
>> +	DBG("modem %p %s", modem, online ? "online" : "offline");
>> +
>> +	if (cbd == NULL)
>> +		goto error;
>> +
>> +	data->online = online;
>> +
>> +	/* TODO: Fix this when network registration implemented */
>> +	if (online)
>> +		data->registration_status =
>> +		    NETWORK_REGISTRATION_STATUS_REGISTERED;
>> +
>> +	nokiacdma_set_online_cb(cbd);
>> +	return;
>> +
>> +error:
>> +	g_free(cbd);
>> +
>> +	CALLBACK_WITH_FAILURE(cb, cbd->data);
>> +}
>
> I'm lost here.  What are you trying to accomplish?
>
> <snip>
>
> Regards,
> -Denis

Apologies for the confusion, all these are relics of integration with 
other experimental work and are not relevant to the MO Call feature 
submission. I'll clean this up and send new versions.

Thank you
Dara

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

end of thread, other threads:[~2010-12-23 23:41 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-12-21 19:23 [PATCH v3, Part2, 1/3] nokiacdma: Add plugin and CDMA MO Call Support Dara Spieker-Doyle
2010-12-23  2:31 ` Denis Kenzior
2010-12-23 23:41   ` Dara Spieker-Doyle

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.