All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] SIMCOM SIM900 module support
@ 2011-12-26 13:38 r.r.zaripov
  2011-12-27 23:03 ` Denis Kenzior
  0 siblings, 1 reply; 22+ messages in thread
From: r.r.zaripov @ 2011-12-26 13:38 UTC (permalink / raw)
  To: ofono

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

From: Renat Zaripov <r.r.zaripov@gmail.com>

This patch add support for SIM900 GSM module
http://wm.sim.com/Sim/FrontShow_en/wireless/detail.aspx?cid=6&nid=770
---
 Makefile.am      |    3 +
 plugins/sim900.c |  310 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 plugins/udev.c   |   15 +++
 3 files changed, 328 insertions(+), 0 deletions(-)
 create mode 100644 plugins/sim900.c

diff --git a/Makefile.am b/Makefile.am
index 337aeb7..291d5e5 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -357,6 +357,9 @@ builtin_sources += plugins/speedupcdma.c
 builtin_modules += samsung
 builtin_sources += plugins/samsung.c
 
+builtin_modules += sim900
+builtin_sources += plugins/sim900.c
+
 if BLUETOOTH
 builtin_modules += bluetooth
 builtin_sources += plugins/bluetooth.c plugins/bluetooth.h
diff --git a/plugins/sim900.c b/plugins/sim900.c
new file mode 100644
index 0000000..65b42ee
--- /dev/null
+++ b/plugins/sim900.c
@@ -0,0 +1,310 @@
+/*
+ *
+ *  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/modem.h>
+#include <ofono/devinfo.h>
+#include <ofono/netreg.h>
+#include <ofono/sim.h>
+#include <ofono/sms.h>
+#include <ofono/ussd.h>
+#include <ofono/gprs.h>
+#include <ofono/gprs-context.h>
+#include <ofono/phonebook.h>
+#include <ofono/history.h>
+#include <ofono/log.h>
+
+#include <drivers/atmodem/vendor.h>
+
+static const char *none_prefix[] = { NULL };
+
+struct sim900_data {
+        GAtChat *modem;
+        GAtChat *aux;
+};
+
+static int sim900_probe(struct ofono_modem *modem)
+{
+        struct sim900_data *data;
+
+        DBG("%p", modem);
+
+        data = g_try_new0(struct sim900_data, 1);
+        if (data == NULL)
+                return -ENOMEM;
+
+        ofono_modem_set_data(modem, data);
+
+        return 0;
+}
+
+static void sim900_remove(struct ofono_modem *modem)
+{
+        struct sim900_data *data = ofono_modem_get_data(modem);
+
+        DBG("%p", modem);
+
+        ofono_modem_set_data(modem, NULL);
+
+        /* Cleanup after hot-unplug */
+        g_at_chat_unref(data->aux);
+
+        g_free(data);
+}
+
+static void sim900_debug(const char *str, void *user_data)
+{
+        const char *prefix = user_data;
+
+        ofono_info("%s%s", prefix, str);
+}
+
+static GAtChat *open_device(struct ofono_modem *modem,
+                                const char *key, char *debug)
+{
+        const char *device;
+        GAtSyntax *syntax;
+        GIOChannel *channel;
+        GAtChat *chat;
+        GHashTable *options;
+
+        device = ofono_modem_get_string(modem, key);
+        if (device == NULL)
+                return NULL;
+
+        DBG("%s %s", key, device);
+
+        options = g_hash_table_new(g_str_hash, g_str_equal);
+        if (options == NULL)
+                return NULL;
+
+        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");
+        g_hash_table_insert(options, "XonXoff", "off");
+        g_hash_table_insert(options, "Local", "off");
+        g_hash_table_insert(options, "RtsCts", "off");
+
+        channel = g_at_tty_open(device, options);
+        if (channel == NULL)
+        {
+            DBG("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)
+        {
+            DBG("chat == NULL");
+            return NULL;
+        }
+
+        //if (getenv("OFONO_AT_DEBUG"))
+        g_at_chat_set_debug(chat, sim900_debug, debug);
+
+        return chat;
+}
+
+static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data)
+{
+        struct ofono_modem *modem = user_data;
+        struct sim900_data *data = ofono_modem_get_data(modem);
+
+        DBG("");
+
+        if (!ok) {
+                g_at_chat_unref(data->modem);
+                data->modem = NULL;
+
+                g_at_chat_unref(data->aux);
+                data->aux = NULL;
+        }
+
+        ofono_modem_set_powered(modem, ok);
+}
+
+static int sim900_enable(struct ofono_modem *modem)
+{
+        struct sim900_data *data = ofono_modem_get_data(modem);
+
+        DBG("%p", modem);
+
+        data->modem = open_device(modem, "Device", "Device: ");
+        if (data->modem == NULL)
+        {
+            DBG("return -EINVAL");
+            return -EINVAL;
+        }
+
+//        data->aux = open_device(modem, "Aux", "Aux: ");
+//        if (data->aux == NULL)
+//        {
+//                g_at_chat_unref(data->modem);
+//                data->modem = NULL;
+//                DBG("return -EIO");
+//                return -EIO;
+//        }
+
+        g_at_chat_send(data->modem, "ATE0", NULL,
+                                                NULL, NULL, NULL);
+
+        g_at_chat_send(data->modem, "AT+CMGF=0", NULL,
+                                                NULL, NULL, NULL);
+
+        // for obtain correct sms service number
+        g_at_chat_send(data->modem, "AT+CSCS=\"GSM\"", NULL,
+                                                NULL, NULL, NULL);
+
+        g_at_chat_send(data->modem, "AT+CNMI=2,2,0,0,0", none_prefix,
+                                        cfun_enable, modem, NULL);
+
+        DBG("return -EINPROGRESS");
+        return -EINPROGRESS;
+}
+
+//static void cfun_disable(gboolean ok, GAtResult *result, gpointer user_data)
+//{
+//        struct ofono_modem *modem = user_data;
+//        struct sim900_data *data = ofono_modem_get_data(modem);
+
+//        DBG("");
+
+//        //g_at_chat_unref(data->aux);
+//        data->aux = NULL;
+
+//        if (ok)
+//                ofono_modem_set_powered(modem, FALSE);
+//}
+
+static int sim900_disable(struct ofono_modem *modem)
+{
+        struct sim900_data *data = ofono_modem_get_data(modem);
+
+        DBG("%p", modem);
+
+        g_at_chat_cancel_all(data->modem);
+        g_at_chat_unregister_all(data->modem);
+
+        g_at_chat_unref(data->modem);
+        data->modem = NULL;
+
+        //g_at_chat_cancel_all(data->aux);
+        //g_at_chat_unregister_all(data->aux);
+
+        //g_at_chat_send(data->aux, "AT+CFUN=4", none_prefix,
+        //                                cfun_disable, modem, NULL);
+
+        return -EINPROGRESS;
+}
+
+static void sim900_pre_sim(struct ofono_modem *modem)
+{
+        struct sim900_data *data = ofono_modem_get_data(modem);
+        struct ofono_sim *sim;
+
+        DBG("%p", modem);
+
+        ofono_devinfo_create(modem, 0, "atmodem", data->modem);
+        sim = ofono_sim_create(modem, 0, "atmodem", data->modem);
+
+        if (sim)
+                ofono_sim_inserted_notify(sim, TRUE);
+}
+
+static void sim900_post_sim(struct ofono_modem *modem)
+{
+        //struct sim900_data *data = ofono_modem_get_data(modem);
+        struct sim900_data *data = ofono_modem_get_data(modem);
+        //struct ofono_history_driver *hdrv;
+        //struct ofono_gprs *gprs;
+        //struct ofono_gprs_context *gc;
+
+        DBG("%p", modem);
+
+        ofono_phonebook_create(modem, 0, "atmodem", data->modem);
+
+        ofono_sms_create(modem, 0, "atmodem", data->modem);
+
+        ofono_netreg_create(modem, OFONO_VENDOR_NOKIA, "atmodem", data->modem);
+
+        //ofono_h
+
+        //ofono_history_driver_register(hdrv);
+
+        //gprs = ofono_gprs_create(modem, OFONO_VENDOR_NOKIA,
+        //                                "atmodem", data->aux);
+        //gc = ofono_gprs_context_create(modem, 0, "atmodem", data->modem);
+
+        //if (gprs && gc)
+        //        ofono_gprs_add_context(gprs, gc);
+}
+
+static void sim900_post_online(struct ofono_modem *modem)
+{
+
+
+        DBG("%p", modem);
+
+        //ofono_ussd_create(modem, OFONO_VENDOR_QUALCOMM_MSM,
+        //                                "atmodem", data->aux);
+}
+
+static struct ofono_modem_driver sim900_driver = {
+        .name		= "sim900",
+        .probe		= sim900_probe,
+        .remove		= sim900_remove,
+        .enable		= sim900_enable,
+        .disable	= sim900_disable,
+        .pre_sim	= sim900_pre_sim,
+        .post_sim	= sim900_post_sim,
+        .post_online	= sim900_post_online,
+};
+
+static int sim900_init(void)
+{
+        return ofono_modem_driver_register(&sim900_driver);
+}
+
+static void sim900_exit(void)
+{
+        ofono_modem_driver_unregister(&sim900_driver);
+}
+
+OFONO_PLUGIN_DEFINE(sim900, "SIM900 driver for i-Tetra", VERSION,
+                OFONO_PLUGIN_PRIORITY_DEFAULT, sim900_init, sim900_exit)
diff --git a/plugins/udev.c b/plugins/udev.c
index d0673f7..f05af48 100644
--- a/plugins/udev.c
+++ b/plugins/udev.c
@@ -193,6 +193,19 @@ static void add_nokiacdma(struct ofono_modem *modem,
 	ofono_modem_register(modem);
 }
 
+static void add_sim900(struct ofono_modem *modem,
+                       struct udev_device *udev_device)
+{
+        const char *devnode;
+
+        DBG("modem %p", modem);
+
+        devnode = udev_device_get_devnode(udev_device);
+        ofono_modem_set_string(modem, "Device", devnode);
+
+        ofono_modem_register(modem);
+}
+
 static void add_modem(struct udev_device *udev_device)
 {
 	struct ofono_modem *modem;
@@ -271,6 +284,8 @@ done:
 		add_tc65(modem, udev_device);
 	else if (g_strcmp0(driver, "nokiacdma") == 0)
 		add_nokiacdma(modem, udev_device);
+        else if (g_strcmp0(driver, "sim900") == 0)
+                add_sim900(modem, udev_device);
 }
 
 static gboolean devpath_remove(gpointer key, gpointer value, gpointer user_data)
-- 
1.7.7.3


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

* Re: [PATCH] SIMCOM SIM900 module support
  2011-12-26 13:38 [PATCH] SIMCOM SIM900 module support r.r.zaripov
@ 2011-12-27 23:03 ` Denis Kenzior
  2011-12-29 12:06   ` [PATCH v3 1/3] " r.r.zaripov
  0 siblings, 1 reply; 22+ messages in thread
From: Denis Kenzior @ 2011-12-27 23:03 UTC (permalink / raw)
  To: ofono

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

Hi Renat,

On 12/26/2011 07:38 AM, r.r.zaripov(a)gmail.com wrote:
> From: Renat Zaripov <r.r.zaripov@gmail.com>
> 
> This patch add support for SIM900 GSM module
> http://wm.sim.com/Sim/FrontShow_en/wireless/detail.aspx?cid=6&nid=770
> ---
>  Makefile.am      |    3 +
>  plugins/sim900.c |  310 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  plugins/udev.c   |   15 +++
>  3 files changed, 328 insertions(+), 0 deletions(-)
>  create mode 100644 plugins/sim900.c
> 

Can you please separate it into two patches, one for sim900.c plugin +
Makefile changes and the other for udev detection code.

> diff --git a/Makefile.am b/Makefile.am
> index 337aeb7..291d5e5 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -357,6 +357,9 @@ builtin_sources += plugins/speedupcdma.c
>  builtin_modules += samsung
>  builtin_sources += plugins/samsung.c
>  
> +builtin_modules += sim900
> +builtin_sources += plugins/sim900.c
> +
>  if BLUETOOTH
>  builtin_modules += bluetooth
>  builtin_sources += plugins/bluetooth.c plugins/bluetooth.h
> diff --git a/plugins/sim900.c b/plugins/sim900.c
> new file mode 100644
> index 0000000..65b42ee
> --- /dev/null
> +++ b/plugins/sim900.c
> @@ -0,0 +1,310 @@
> +/*
> + *
> + *  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/modem.h>
> +#include <ofono/devinfo.h>
> +#include <ofono/netreg.h>
> +#include <ofono/sim.h>
> +#include <ofono/sms.h>
> +#include <ofono/ussd.h>
> +#include <ofono/gprs.h>
> +#include <ofono/gprs-context.h>
> +#include <ofono/phonebook.h>
> +#include <ofono/history.h>
> +#include <ofono/log.h>
> +
> +#include <drivers/atmodem/vendor.h>
> +
> +static const char *none_prefix[] = { NULL };
> +
> +struct sim900_data {
> +        GAtChat *modem;
> +        GAtChat *aux;
> +};
> +
> +static int sim900_probe(struct ofono_modem *modem)
> +{
> +        struct sim900_data *data;
> +
> +        DBG("%p", modem);
> +
> +        data = g_try_new0(struct sim900_data, 1);
> +        if (data == NULL)
> +                return -ENOMEM;
> +
> +        ofono_modem_set_data(modem, data);
> +
> +        return 0;
> +}
> +
> +static void sim900_remove(struct ofono_modem *modem)
> +{
> +        struct sim900_data *data = ofono_modem_get_data(modem);
> +
> +        DBG("%p", modem);
> +
> +        ofono_modem_set_data(modem, NULL);
> +
> +        /* Cleanup after hot-unplug */
> +        g_at_chat_unref(data->aux);

And what about data->modem?

> +
> +        g_free(data);
> +}
> +
> +static void sim900_debug(const char *str, void *user_data)
> +{
> +        const char *prefix = user_data;
> +
> +        ofono_info("%s%s", prefix, str);
> +}
> +
> +static GAtChat *open_device(struct ofono_modem *modem,
> +                                const char *key, char *debug)
> +{
> +        const char *device;
> +        GAtSyntax *syntax;
> +        GIOChannel *channel;
> +        GAtChat *chat;
> +        GHashTable *options;
> +
> +        device = ofono_modem_get_string(modem, key);
> +        if (device == NULL)
> +                return NULL;
> +
> +        DBG("%s %s", key, device);
> +
> +        options = g_hash_table_new(g_str_hash, g_str_equal);
> +        if (options == NULL)
> +                return NULL;
> +
> +        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");
> +        g_hash_table_insert(options, "XonXoff", "off");
> +        g_hash_table_insert(options, "Local", "off");
> +        g_hash_table_insert(options, "RtsCts", "off");
> +
> +        channel = g_at_tty_open(device, options);
> +        if (channel == NULL)
> +        {
> +            DBG("channel == NULL");
> +            return NULL;
> +        }
> +

oFono uses Linux kernel coding style, so please re-format your
submissions to be in-line with that style.  e.g. opening curly brace
should be on the same line as the if statement.  See
doc/coding-style.txt for additional rules above the common Linux kernel
coding style guidelines.

> +        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)
> +        {
> +            DBG("chat == NULL");
> +            return NULL;
> +        }
> +
> +        //if (getenv("OFONO_AT_DEBUG"))

Please clean up the commented out areas, for example I'm pretty sure you
want this if statement not to be commented out.

> +        g_at_chat_set_debug(chat, sim900_debug, debug);
> +
> +        return chat;
> +}
> +
> +static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data)
> +{
> +        struct ofono_modem *modem = user_data;
> +        struct sim900_data *data = ofono_modem_get_data(modem);
> +
> +        DBG("");
> +
> +        if (!ok) {
> +                g_at_chat_unref(data->modem);
> +                data->modem = NULL;
> +
> +                g_at_chat_unref(data->aux);
> +                data->aux = NULL;
> +        }
> +
> +        ofono_modem_set_powered(modem, ok);
> +}
> +
> +static int sim900_enable(struct ofono_modem *modem)
> +{
> +        struct sim900_data *data = ofono_modem_get_data(modem);
> +
> +        DBG("%p", modem);
> +
> +        data->modem = open_device(modem, "Device", "Device: ");
> +        if (data->modem == NULL)
> +        {
> +            DBG("return -EINVAL");
> +            return -EINVAL;

We use tabs for indentation, there are no exceptions.

> +        }
> +
> +//        data->aux = open_device(modem, "Aux", "Aux: ");
> +//        if (data->aux == NULL)
> +//        {
> +//                g_at_chat_unref(data->modem);
> +//                data->modem = NULL;
> +//                DBG("return -EIO");
> +//                return -EIO;
> +//        }
> +
> +        g_at_chat_send(data->modem, "ATE0", NULL,
> +                                                NULL, NULL, NULL);
> +
> +        g_at_chat_send(data->modem, "AT+CMGF=0", NULL,
> +                                                NULL, NULL, NULL);
> +
> +        // for obtain correct sms service number
> +        g_at_chat_send(data->modem, "AT+CSCS=\"GSM\"", NULL,
> +                                                NULL, NULL, NULL);
> +
> +        g_at_chat_send(data->modem, "AT+CNMI=2,2,0,0,0", none_prefix,
> +                                        cfun_enable, modem, NULL);
> +
> +        DBG("return -EINPROGRESS");
> +        return -EINPROGRESS;
> +}
> +
> +//static void cfun_disable(gboolean ok, GAtResult *result, gpointer user_data)
> +//{
> +//        struct ofono_modem *modem = user_data;
> +//        struct sim900_data *data = ofono_modem_get_data(modem);
> +
> +//        DBG("");
> +
> +//        //g_at_chat_unref(data->aux);
> +//        data->aux = NULL;
> +
> +//        if (ok)
> +//                ofono_modem_set_powered(modem, FALSE);
> +//}
> +
> +static int sim900_disable(struct ofono_modem *modem)
> +{
> +        struct sim900_data *data = ofono_modem_get_data(modem);
> +
> +        DBG("%p", modem);
> +
> +        g_at_chat_cancel_all(data->modem);
> +        g_at_chat_unregister_all(data->modem);
> +
> +        g_at_chat_unref(data->modem);
> +        data->modem = NULL;
> +
> +        //g_at_chat_cancel_all(data->aux);
> +        //g_at_chat_unregister_all(data->aux);
> +
> +        //g_at_chat_send(data->aux, "AT+CFUN=4", none_prefix,
> +        //                                cfun_disable, modem, NULL);
> +
> +        return -EINPROGRESS;
> +}
> +
> +static void sim900_pre_sim(struct ofono_modem *modem)
> +{
> +        struct sim900_data *data = ofono_modem_get_data(modem);
> +        struct ofono_sim *sim;
> +
> +        DBG("%p", modem);
> +
> +        ofono_devinfo_create(modem, 0, "atmodem", data->modem);
> +        sim = ofono_sim_create(modem, 0, "atmodem", data->modem);
> +
> +        if (sim)
> +                ofono_sim_inserted_notify(sim, TRUE);
> +}
> +
> +static void sim900_post_sim(struct ofono_modem *modem)
> +{
> +        //struct sim900_data *data = ofono_modem_get_data(modem);
> +        struct sim900_data *data = ofono_modem_get_data(modem);
> +        //struct ofono_history_driver *hdrv;
> +        //struct ofono_gprs *gprs;
> +        //struct ofono_gprs_context *gc;
> +
> +        DBG("%p", modem);
> +
> +        ofono_phonebook_create(modem, 0, "atmodem", data->modem);
> +
> +        ofono_sms_create(modem, 0, "atmodem", data->modem);
> +
> +        ofono_netreg_create(modem, OFONO_VENDOR_NOKIA, "atmodem", data->modem);
> +
> +        //ofono_h
> +
> +        //ofono_history_driver_register(hdrv);
> +
> +        //gprs = ofono_gprs_create(modem, OFONO_VENDOR_NOKIA,
> +        //                                "atmodem", data->aux);
> +        //gc = ofono_gprs_context_create(modem, 0, "atmodem", data->modem);
> +
> +        //if (gprs && gc)
> +        //        ofono_gprs_add_context(gprs, gc);
> +}
> +
> +static void sim900_post_online(struct ofono_modem *modem)
> +{
> +
> +

Why this double empty line?

> +        DBG("%p", modem);
> +
> +        //ofono_ussd_create(modem, OFONO_VENDOR_QUALCOMM_MSM,
> +        //                                "atmodem", data->aux);
> +}
> +
> +static struct ofono_modem_driver sim900_driver = {
> +        .name		= "sim900",
> +        .probe		= sim900_probe,
> +        .remove		= sim900_remove,
> +        .enable		= sim900_enable,
> +        .disable	= sim900_disable,
> +        .pre_sim	= sim900_pre_sim,
> +        .post_sim	= sim900_post_sim,
> +        .post_online	= sim900_post_online,
> +};
> +
> +static int sim900_init(void)
> +{
> +        return ofono_modem_driver_register(&sim900_driver);
> +}
> +
> +static void sim900_exit(void)
> +{
> +        ofono_modem_driver_unregister(&sim900_driver);
> +}
> +
> +OFONO_PLUGIN_DEFINE(sim900, "SIM900 driver for i-Tetra", VERSION,
> +                OFONO_PLUGIN_PRIORITY_DEFAULT, sim900_init, sim900_exit)
> diff --git a/plugins/udev.c b/plugins/udev.c
> index d0673f7..f05af48 100644
> --- a/plugins/udev.c
> +++ b/plugins/udev.c
> @@ -193,6 +193,19 @@ static void add_nokiacdma(struct ofono_modem *modem,
>  	ofono_modem_register(modem);
>  }
>  
> +static void add_sim900(struct ofono_modem *modem,
> +                       struct udev_device *udev_device)
> +{
> +        const char *devnode;
> +
> +        DBG("modem %p", modem);
> +
> +        devnode = udev_device_get_devnode(udev_device);
> +        ofono_modem_set_string(modem, "Device", devnode);
> +
> +        ofono_modem_register(modem);
> +}
> +
>  static void add_modem(struct udev_device *udev_device)
>  {
>  	struct ofono_modem *modem;
> @@ -271,6 +284,8 @@ done:
>  		add_tc65(modem, udev_device);
>  	else if (g_strcmp0(driver, "nokiacdma") == 0)
>  		add_nokiacdma(modem, udev_device);
> +        else if (g_strcmp0(driver, "sim900") == 0)
> +                add_sim900(modem, udev_device);
>  }
>  
>  static gboolean devpath_remove(gpointer key, gpointer value, gpointer user_data)

And do you have a patch to plugins/ofono.rules to share as well?

Regards,
-Denis

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

* Re: [PATCH v3 1/3] SIMCOM SIM900 module support
  2011-12-29 12:06   ` [PATCH v3 1/3] " r.r.zaripov
@ 2011-12-28 15:54     ` Denis Kenzior
  2012-01-11 13:59       ` [PATCH v4 " r.r.zaripov
  2011-12-29 12:06     ` [PATCH v3 2/3] Add SIM900 detection support r.r.zaripov
  2011-12-29 12:06     ` [PATCH v3 3/3] SIM900 driver usage documentation r.r.zaripov
  2 siblings, 1 reply; 22+ messages in thread
From: Denis Kenzior @ 2011-12-28 15:54 UTC (permalink / raw)
  To: ofono

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

Hi Renat,

On 12/29/2011 06:06 AM, r.r.zaripov(a)gmail.com wrote:
> From: Renat Zaripov <r.r.zaripov@gmail.com>
> 
> This patch add support for SIM900 GSM module
> http://wm.sim.com/Sim/FrontShow_en/wireless/detail.aspx?cid=6&nid=770
> 
> Signed-off-by: Sergey Lapin <slapin@ossfans.org>
> Signed-off-by: Renat Zaripov <r.r.zaripov@gmail.com>

We actually don't use Signed-off-by, so please leave this out.

> ---
>  Makefile.am      |    3 +
>  plugins/sim900.c |  245 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 248 insertions(+), 0 deletions(-)
>  create mode 100644 plugins/sim900.c
> 
> v3: handled issues pointed out by review
> split into general and plugin parts 
> added documentation
> 
> diff --git a/Makefile.am b/Makefile.am
> index 337aeb7..291d5e5 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -357,6 +357,9 @@ builtin_sources += plugins/speedupcdma.c
>  builtin_modules += samsung
>  builtin_sources += plugins/samsung.c
>  
> +builtin_modules += sim900
> +builtin_sources += plugins/sim900.c
> +
>  if BLUETOOTH
>  builtin_modules += bluetooth
>  builtin_sources += plugins/bluetooth.c plugins/bluetooth.h
> diff --git a/plugins/sim900.c b/plugins/sim900.c
> new file mode 100644
> index 0000000..262a38c
> --- /dev/null
> +++ b/plugins/sim900.c
> @@ -0,0 +1,245 @@
> +/*
> + *
> + *  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/modem.h>
> +#include <ofono/devinfo.h>
> +#include <ofono/netreg.h>
> +#include <ofono/sim.h>
> +#include <ofono/sms.h>
> +#include <ofono/ussd.h>
> +#include <ofono/gprs.h>
> +#include <ofono/gprs-context.h>
> +#include <ofono/phonebook.h>
> +#include <ofono/history.h>
> +#include <ofono/log.h>
> +
> +#include <drivers/atmodem/vendor.h>
> +
> +static const char *none_prefix[] = { NULL };
> +
> +struct sim900_data {
> +	GAtChat *modem;
> +};
> +
> +static int sim900_probe(struct ofono_modem *modem)
> +{
> +	struct sim900_data *data;
> +
> +	DBG("%p", modem);
> +
> +	data = g_try_new0(struct sim900_data, 1);
> +	if (data == NULL)
> +		return -ENOMEM;
> +
> +	ofono_modem_set_data(modem, data);
> +
> +	return 0;
> +}
> +
> +static void sim900_remove(struct ofono_modem *modem)
> +{
> +	struct sim900_data *data = ofono_modem_get_data(modem);
> +
> +	DBG("%p", modem);
> +
> +	ofono_modem_set_data(modem, NULL);
> +
> +	g_at_chat_unref(data->modem);
> +
> +	g_free(data);
> +}
> +
> +static void sim900_debug(const char *str, void *user_data)
> +{
> +	const char *prefix = user_data;
> +
> +	ofono_info("%s%s", prefix, str);
> +}
> +
> +static GAtChat *open_device(struct ofono_modem *modem,
> +			    const char *key, char *debug)
> +{
> +	const char *device;
> +	GAtSyntax *syntax;
> +	GIOChannel *channel;
> +	GAtChat *chat;
> +	GHashTable *options;
> +
> +	device = ofono_modem_get_string(modem, key);
> +	if (device == NULL)
> +		return NULL;
> +
> +	DBG("%s %s", key, device);
> +
> +	options = g_hash_table_new(g_str_hash, g_str_equal);
> +	if (options == NULL)
> +		return NULL;
> +
> +	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");
> +	g_hash_table_insert(options, "XonXoff", "off");
> +	g_hash_table_insert(options, "Local", "off");
> +	g_hash_table_insert(options, "RtsCts", "off");
> +
> +	channel = g_at_tty_open(device, options);
> +	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;
> +
> +	if (getenv("OFONO_AT_DEBUG"))
> +		g_at_chat_set_debug(chat, sim900_debug, debug);
> +
> +	return chat;
> +}
> +
> +static void cfun_enable(gboolean ok, GAtResult * result, gpointer user_data)
> +{
> +	struct ofono_modem *modem = user_data;
> +	struct sim900_data *data = ofono_modem_get_data(modem);
> +
> +	DBG("");
> +
> +	if (!ok) {
> +		g_at_chat_unref(data->modem);
> +		data->modem = NULL;
> +	}
> +
> +	ofono_modem_set_powered(modem, ok);
> +}
> +
> +static int sim900_enable(struct ofono_modem *modem)
> +{
> +	struct sim900_data *data = ofono_modem_get_data(modem);
> +
> +	DBG("%p", modem);
> +
> +	data->modem = open_device(modem, "Device", "Device: ");
> +	if (data->modem == NULL) {
> +		DBG("return -EINVAL");
> +		return -EINVAL;
> +	}
> +
> +	g_at_chat_send(data->modem, "ATE0", NULL, NULL, NULL, NULL);
> +
> +	g_at_chat_send(data->modem, "AT+CMGF=0", NULL, NULL, NULL, NULL);

Why do you do this here? The sms driver makes sure to enter PDU mode,
repeatedly if required.

> +
> +	/* For obtain correct sms service number */
> +	g_at_chat_send(data->modem, "AT+CSCS=\"GSM\"", NULL, NULL, NULL, NULL);
> +
> +	g_at_chat_send(data->modem, "AT+CNMI=2,2,0,0,0", none_prefix,
> +		       cfun_enable, modem, NULL);

Same with this one, the SMS driver has quite complex logic to choose the
right CNMI string.  This line probably has no effect anyway...

> +
> +	return -EINPROGRESS;
> +}
> +
> +static int sim900_disable(struct ofono_modem *modem)
> +{
> +	struct sim900_data *data = ofono_modem_get_data(modem);
> +
> +	DBG("%p", modem);
> +
> +	g_at_chat_cancel_all(data->modem);
> +	g_at_chat_unregister_all(data->modem);
> +
> +	g_at_chat_unref(data->modem);
> +	data->modem = NULL;
> +
> +	return -EINPROGRESS;

If you are returning EINPROGRESS then you should be calling
ofono_modem_set_powered(modem, FALSE) at some point.  Otherwise this
simply times out.

So the question is, do you want to send a CFUN=0 here?

> +}
> +
> +static void sim900_pre_sim(struct ofono_modem *modem)
> +{
> +	struct sim900_data *data = ofono_modem_get_data(modem);
> +	struct ofono_sim *sim;
> +
> +	DBG("%p", modem);
> +
> +	ofono_devinfo_create(modem, 0, "atmodem", data->modem);
> +	sim = ofono_sim_create(modem, 0, "atmodem", data->modem);
> +
> +	if (sim)
> +		ofono_sim_inserted_notify(sim, TRUE);
> +}
> +
> +static void sim900_post_sim(struct ofono_modem *modem)
> +{
> +	struct sim900_data *data = ofono_modem_get_data(modem);
> +
> +	DBG("%p", modem);
> +
> +	ofono_phonebook_create(modem, 0, "atmodem", data->modem);
> +
> +	ofono_sms_create(modem, 0, "atmodem", data->modem);
> +
> +	ofono_netreg_create(modem, OFONO_VENDOR_NOKIA, "atmodem", data->modem);

At the moment netreg is not meant to be used in post_sim, only post_online.

> +}
> +
> +static void sim900_post_online(struct ofono_modem *modem)
> +{
> +	DBG("%p", modem);
> +}
> +
> +static struct ofono_modem_driver sim900_driver = {
> +	.name = "sim900",
> +	.probe = sim900_probe,
> +	.remove = sim900_remove,
> +	.enable = sim900_enable,
> +	.disable = sim900_disable,
> +	.pre_sim = sim900_pre_sim,
> +	.post_sim = sim900_post_sim,
> +	.post_online = sim900_post_online,
> +};
> +
> +static int sim900_init(void)
> +{
> +	return ofono_modem_driver_register(&sim900_driver);
> +}
> +
> +static void sim900_exit(void)
> +{
> +	ofono_modem_driver_unregister(&sim900_driver);
> +}
> +
> +OFONO_PLUGIN_DEFINE(sim900, "SIM900 modem driver", VERSION,
> +		    OFONO_PLUGIN_PRIORITY_DEFAULT, sim900_init, sim900_exit)

Regards,
-Denis

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

* [PATCH v3 1/3] SIMCOM SIM900 module support
  2011-12-27 23:03 ` Denis Kenzior
@ 2011-12-29 12:06   ` r.r.zaripov
  2011-12-28 15:54     ` Denis Kenzior
                       ` (2 more replies)
  0 siblings, 3 replies; 22+ messages in thread
From: r.r.zaripov @ 2011-12-29 12:06 UTC (permalink / raw)
  To: ofono

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

From: Renat Zaripov <r.r.zaripov@gmail.com>

This patch add support for SIM900 GSM module
http://wm.sim.com/Sim/FrontShow_en/wireless/detail.aspx?cid=6&nid=770

Signed-off-by: Sergey Lapin <slapin@ossfans.org>
Signed-off-by: Renat Zaripov <r.r.zaripov@gmail.com>
---
 Makefile.am      |    3 +
 plugins/sim900.c |  245 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 248 insertions(+), 0 deletions(-)
 create mode 100644 plugins/sim900.c

v3: handled issues pointed out by review
split into general and plugin parts 
added documentation

diff --git a/Makefile.am b/Makefile.am
index 337aeb7..291d5e5 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -357,6 +357,9 @@ builtin_sources += plugins/speedupcdma.c
 builtin_modules += samsung
 builtin_sources += plugins/samsung.c
 
+builtin_modules += sim900
+builtin_sources += plugins/sim900.c
+
 if BLUETOOTH
 builtin_modules += bluetooth
 builtin_sources += plugins/bluetooth.c plugins/bluetooth.h
diff --git a/plugins/sim900.c b/plugins/sim900.c
new file mode 100644
index 0000000..262a38c
--- /dev/null
+++ b/plugins/sim900.c
@@ -0,0 +1,245 @@
+/*
+ *
+ *  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/modem.h>
+#include <ofono/devinfo.h>
+#include <ofono/netreg.h>
+#include <ofono/sim.h>
+#include <ofono/sms.h>
+#include <ofono/ussd.h>
+#include <ofono/gprs.h>
+#include <ofono/gprs-context.h>
+#include <ofono/phonebook.h>
+#include <ofono/history.h>
+#include <ofono/log.h>
+
+#include <drivers/atmodem/vendor.h>
+
+static const char *none_prefix[] = { NULL };
+
+struct sim900_data {
+	GAtChat *modem;
+};
+
+static int sim900_probe(struct ofono_modem *modem)
+{
+	struct sim900_data *data;
+
+	DBG("%p", modem);
+
+	data = g_try_new0(struct sim900_data, 1);
+	if (data == NULL)
+		return -ENOMEM;
+
+	ofono_modem_set_data(modem, data);
+
+	return 0;
+}
+
+static void sim900_remove(struct ofono_modem *modem)
+{
+	struct sim900_data *data = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	ofono_modem_set_data(modem, NULL);
+
+	g_at_chat_unref(data->modem);
+
+	g_free(data);
+}
+
+static void sim900_debug(const char *str, void *user_data)
+{
+	const char *prefix = user_data;
+
+	ofono_info("%s%s", prefix, str);
+}
+
+static GAtChat *open_device(struct ofono_modem *modem,
+			    const char *key, char *debug)
+{
+	const char *device;
+	GAtSyntax *syntax;
+	GIOChannel *channel;
+	GAtChat *chat;
+	GHashTable *options;
+
+	device = ofono_modem_get_string(modem, key);
+	if (device == NULL)
+		return NULL;
+
+	DBG("%s %s", key, device);
+
+	options = g_hash_table_new(g_str_hash, g_str_equal);
+	if (options == NULL)
+		return NULL;
+
+	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");
+	g_hash_table_insert(options, "XonXoff", "off");
+	g_hash_table_insert(options, "Local", "off");
+	g_hash_table_insert(options, "RtsCts", "off");
+
+	channel = g_at_tty_open(device, options);
+	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;
+
+	if (getenv("OFONO_AT_DEBUG"))
+		g_at_chat_set_debug(chat, sim900_debug, debug);
+
+	return chat;
+}
+
+static void cfun_enable(gboolean ok, GAtResult * result, gpointer user_data)
+{
+	struct ofono_modem *modem = user_data;
+	struct sim900_data *data = ofono_modem_get_data(modem);
+
+	DBG("");
+
+	if (!ok) {
+		g_at_chat_unref(data->modem);
+		data->modem = NULL;
+	}
+
+	ofono_modem_set_powered(modem, ok);
+}
+
+static int sim900_enable(struct ofono_modem *modem)
+{
+	struct sim900_data *data = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	data->modem = open_device(modem, "Device", "Device: ");
+	if (data->modem == NULL) {
+		DBG("return -EINVAL");
+		return -EINVAL;
+	}
+
+	g_at_chat_send(data->modem, "ATE0", NULL, NULL, NULL, NULL);
+
+	g_at_chat_send(data->modem, "AT+CMGF=0", NULL, NULL, NULL, NULL);
+
+	/* For obtain correct sms service number */
+	g_at_chat_send(data->modem, "AT+CSCS=\"GSM\"", NULL, NULL, NULL, NULL);
+
+	g_at_chat_send(data->modem, "AT+CNMI=2,2,0,0,0", none_prefix,
+		       cfun_enable, modem, NULL);
+
+	return -EINPROGRESS;
+}
+
+static int sim900_disable(struct ofono_modem *modem)
+{
+	struct sim900_data *data = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	g_at_chat_cancel_all(data->modem);
+	g_at_chat_unregister_all(data->modem);
+
+	g_at_chat_unref(data->modem);
+	data->modem = NULL;
+
+	return -EINPROGRESS;
+}
+
+static void sim900_pre_sim(struct ofono_modem *modem)
+{
+	struct sim900_data *data = ofono_modem_get_data(modem);
+	struct ofono_sim *sim;
+
+	DBG("%p", modem);
+
+	ofono_devinfo_create(modem, 0, "atmodem", data->modem);
+	sim = ofono_sim_create(modem, 0, "atmodem", data->modem);
+
+	if (sim)
+		ofono_sim_inserted_notify(sim, TRUE);
+}
+
+static void sim900_post_sim(struct ofono_modem *modem)
+{
+	struct sim900_data *data = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	ofono_phonebook_create(modem, 0, "atmodem", data->modem);
+
+	ofono_sms_create(modem, 0, "atmodem", data->modem);
+
+	ofono_netreg_create(modem, OFONO_VENDOR_NOKIA, "atmodem", data->modem);
+}
+
+static void sim900_post_online(struct ofono_modem *modem)
+{
+	DBG("%p", modem);
+}
+
+static struct ofono_modem_driver sim900_driver = {
+	.name = "sim900",
+	.probe = sim900_probe,
+	.remove = sim900_remove,
+	.enable = sim900_enable,
+	.disable = sim900_disable,
+	.pre_sim = sim900_pre_sim,
+	.post_sim = sim900_post_sim,
+	.post_online = sim900_post_online,
+};
+
+static int sim900_init(void)
+{
+	return ofono_modem_driver_register(&sim900_driver);
+}
+
+static void sim900_exit(void)
+{
+	ofono_modem_driver_unregister(&sim900_driver);
+}
+
+OFONO_PLUGIN_DEFINE(sim900, "SIM900 modem driver", VERSION,
+		    OFONO_PLUGIN_PRIORITY_DEFAULT, sim900_init, sim900_exit)
-- 
1.7.7.3


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

* [PATCH v3 2/3] Add SIM900 detection support.
  2011-12-29 12:06   ` [PATCH v3 1/3] " r.r.zaripov
  2011-12-28 15:54     ` Denis Kenzior
@ 2011-12-29 12:06     ` r.r.zaripov
  2011-12-29 12:06     ` [PATCH v3 3/3] SIM900 driver usage documentation r.r.zaripov
  2 siblings, 0 replies; 22+ messages in thread
From: r.r.zaripov @ 2011-12-29 12:06 UTC (permalink / raw)
  To: ofono

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

From: Renat Zaripov <r.r.zaripov@gmail.com>

This allows for detection of SIM900 modem module in case of
appropriate driver specified in udev rules.

Example rule:
KERNEL=="gsmtty3", ENV{OFONO_DRIVER}="sim900"

Signed-off-by: Renat Zaripov <r.r.zaripov@gmail.com>
---
 plugins/udev.c |   15 +++++++++++++++
 1 files changed, 15 insertions(+), 0 deletions(-)

diff --git a/plugins/udev.c b/plugins/udev.c
index d0673f7..f05af48 100644
--- a/plugins/udev.c
+++ b/plugins/udev.c
@@ -193,6 +193,19 @@ static void add_nokiacdma(struct ofono_modem *modem,
 	ofono_modem_register(modem);
 }
 
+static void add_sim900(struct ofono_modem *modem,
+                       struct udev_device *udev_device)
+{
+        const char *devnode;
+
+        DBG("modem %p", modem);
+
+        devnode = udev_device_get_devnode(udev_device);
+        ofono_modem_set_string(modem, "Device", devnode);
+
+        ofono_modem_register(modem);
+}
+
 static void add_modem(struct udev_device *udev_device)
 {
 	struct ofono_modem *modem;
@@ -271,6 +284,8 @@ done:
 		add_tc65(modem, udev_device);
 	else if (g_strcmp0(driver, "nokiacdma") == 0)
 		add_nokiacdma(modem, udev_device);
+        else if (g_strcmp0(driver, "sim900") == 0)
+                add_sim900(modem, udev_device);
 }
 
 static gboolean devpath_remove(gpointer key, gpointer value, gpointer user_data)
-- 
1.7.7.3


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

* [PATCH v3 3/3] SIM900 driver usage documentation
  2011-12-29 12:06   ` [PATCH v3 1/3] " r.r.zaripov
  2011-12-28 15:54     ` Denis Kenzior
  2011-12-29 12:06     ` [PATCH v3 2/3] Add SIM900 detection support r.r.zaripov
@ 2011-12-29 12:06     ` r.r.zaripov
  2 siblings, 0 replies; 22+ messages in thread
From: r.r.zaripov @ 2011-12-29 12:06 UTC (permalink / raw)
  To: ofono

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

From: Renat Zaripov <r.r.zaripov@gmail.com>

Adding a short description for usage of SIM900 plugin.

Signed-off-by: Renat Zaripov <r.r.zaripov@gmail.com>
---
 doc/sim900-modem.txt |   13 +++++++++++++
 1 files changed, 13 insertions(+), 0 deletions(-)
 create mode 100644 doc/sim900-modem.txt

diff --git a/doc/sim900-modem.txt b/doc/sim900-modem.txt
new file mode 100644
index 0000000..2369338
--- /dev/null
+++ b/doc/sim900-modem.txt
@@ -0,0 +1,13 @@
+SIM900 modem usage
+===================
+
+To enable SIM900 module support you need to put the following
+udev rule into appropriate file in /{etc,lib}/udev/rules.d:
+
+KERNEL=="gsmtty3", ENV{OFONO_DRIVER}="sim900"
+
+On the i-Tetra tracking device, the SIM900 is accessed
+via N_GSM mux device. We use ofono as SMS message
+service and incoming voice calls service, so we
+use /dev/gsmtty3 provided by N_GSM mux.
+
-- 
1.7.7.3


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

* Re: [PATCH v4 1/3] SIMCOM SIM900 module support
  2012-01-11 14:52         ` [PATCH v4 1/3] SIMCOM SIM900 module support Marcel Holtmann
@ 2012-01-11 11:21           ` Denis Kenzior
  2012-01-11 15:24             ` Marcel Holtmann
  2012-01-12 12:32           ` [PATCH v5 1/4] This patch add support for SIM900 GSM module r.r.zaripov
  1 sibling, 1 reply; 22+ messages in thread
From: Denis Kenzior @ 2012-01-11 11:21 UTC (permalink / raw)
  To: ofono

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

Hi Marcel,

>> +	/* For obtain correct sms service number */
>> +	g_at_chat_send(data->modem, "AT+CSCS=\"GSM\"", NULL, 
>> +			NULL, NULL, NULL);
> 
> you might better introduce a OFONO_VENDOR_SIM900 quirk and use that in
> the SMS atom driver. The phonebook support will also end up overwriting
> this one later on. So I am not even sure this works reliable this way.
> Might be just pure luck with the order of the atom.
> 

Actually this is fine assuming the modem does not support UTF-8
character set.  The builtin assumption for most atoms is that CSCS is
set to something sane before they're initialized.  The phonebook driver
will temporarily switch to UCS2 for the duration of the phonebook read
and restore the previous setting.

Regards,
-Denis

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

* Re: [PATCH v4 1/3] SIMCOM SIM900 module support
  2012-01-11 15:24             ` Marcel Holtmann
@ 2012-01-11 11:41               ` Denis Kenzior
  2012-01-12 10:55                 ` Renat Zaripov
  0 siblings, 1 reply; 22+ messages in thread
From: Denis Kenzior @ 2012-01-11 11:41 UTC (permalink / raw)
  To: ofono

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

Hi Marcel,

On 01/11/2012 09:24 AM, Marcel Holtmann wrote:
> Hi Denis,
> 
>>>> +	/* For obtain correct sms service number */
>>>> +	g_at_chat_send(data->modem, "AT+CSCS=\"GSM\"", NULL, 
>>>> +			NULL, NULL, NULL);
>>>
>>> you might better introduce a OFONO_VENDOR_SIM900 quirk and use that in
>>> the SMS atom driver. The phonebook support will also end up overwriting
>>> this one later on. So I am not even sure this works reliable this way.
>>> Might be just pure luck with the order of the atom.
>>>
>>
>> Actually this is fine assuming the modem does not support UTF-8
>> character set.  The builtin assumption for most atoms is that CSCS is
>> set to something sane before they're initialized.  The phonebook driver
>> will temporarily switch to UCS2 for the duration of the phonebook read
>> and restore the previous setting.
> 
> we did a vendor quirk for this for USSD of Qualcomm based modems. Maybe
> we should then also move that into the modem plugins.
> 

Yes, I think that would be cleaner.  I'll take care of it.

Regards,
-Denis

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

* [PATCH v4 1/3] SIMCOM SIM900 module support
  2011-12-28 15:54     ` Denis Kenzior
@ 2012-01-11 13:59       ` r.r.zaripov
  2012-01-11 13:59         ` [PATCH v4 2/3] Add SIM900 detection support r.r.zaripov
                           ` (2 more replies)
  0 siblings, 3 replies; 22+ messages in thread
From: r.r.zaripov @ 2012-01-11 13:59 UTC (permalink / raw)
  To: ofono

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

From: Renat Zaripov <r.r.zaripov@gmail.com>

This patch add support for SIM900 GSM module
http://wm.sim.com/Sim/FrontShow_en/wireless/detail.aspx?cid=6&nid=770
---
 Makefile.am      |    3 +
 plugins/sim900.c |  261 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 264 insertions(+), 0 deletions(-)
 create mode 100644 plugins/sim900.c

v4: Removed CNMI and CMGF commands in sim900_enable.
Calling ofono_netreg_create moved in post_online.
ofono_modem_set_powered(modem, FALSE) handled in sim900_disable by calling cfun_disable.

diff --git a/Makefile.am b/Makefile.am
index 6ef8549..64a7070 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -346,6 +346,9 @@ builtin_sources += plugins/speedupcdma.c
 builtin_modules += samsung
 builtin_sources += plugins/samsung.c
 
+builtin_modules += sim900
+builtin_sources += plugins/sim900.c
+
 if BLUETOOTH
 builtin_modules += bluetooth
 builtin_sources += plugins/bluetooth.c plugins/bluetooth.h
diff --git a/plugins/sim900.c b/plugins/sim900.c
new file mode 100644
index 0000000..68bb0da
--- /dev/null
+++ b/plugins/sim900.c
@@ -0,0 +1,261 @@
+/*
+ *
+ *  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/modem.h>
+#include <ofono/devinfo.h>
+#include <ofono/netreg.h>
+#include <ofono/sim.h>
+#include <ofono/sms.h>
+#include <ofono/ussd.h>
+#include <ofono/gprs.h>
+#include <ofono/gprs-context.h>
+#include <ofono/phonebook.h>
+#include <ofono/history.h>
+#include <ofono/log.h>
+
+#include <drivers/atmodem/vendor.h>
+
+static const char *none_prefix[] = { NULL };
+
+struct sim900_data {
+	GAtChat *modem;
+};
+
+static int sim900_probe(struct ofono_modem *modem)
+{
+	struct sim900_data *data;
+
+	DBG("%p", modem);
+
+	data = g_try_new0(struct sim900_data, 1);
+	if (data == NULL)
+		return -ENOMEM;
+
+	ofono_modem_set_data(modem, data);
+
+	return 0;
+}
+
+static void sim900_remove(struct ofono_modem *modem)
+{
+	struct sim900_data *data = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	ofono_modem_set_data(modem, NULL);
+
+	g_at_chat_unref(data->modem);
+
+	g_free(data);
+}
+
+static void sim900_debug(const char *str, void *user_data)
+{
+	const char *prefix = user_data;
+
+	ofono_info("%s%s", prefix, str);
+}
+
+static GAtChat *open_device(struct ofono_modem *modem,
+			    const char *key, char *debug)
+{
+	const char *device;
+	GAtSyntax *syntax;
+	GIOChannel *channel;
+	GAtChat *chat;
+	GHashTable *options;
+
+	device = ofono_modem_get_string(modem, key);
+	if (device == NULL)
+		return NULL;
+
+	DBG("%s %s", key, device);
+
+	options = g_hash_table_new(g_str_hash, g_str_equal);
+	if (options == NULL)
+		return NULL;
+
+	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");
+	g_hash_table_insert(options, "XonXoff", "off");
+	g_hash_table_insert(options, "Local", "off");
+	g_hash_table_insert(options, "RtsCts", "off");
+
+	channel = g_at_tty_open(device, options);
+	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;
+
+	if (getenv("OFONO_AT_DEBUG"))
+		g_at_chat_set_debug(chat, sim900_debug, debug);
+
+	return chat;
+}
+
+static void cfun_enable(gboolean ok, GAtResult * result, gpointer user_data)
+{
+	struct ofono_modem *modem = user_data;
+	struct sim900_data *data = ofono_modem_get_data(modem);
+
+	DBG("");
+
+	if (!ok) {
+		g_at_chat_unref(data->modem);
+		data->modem = NULL;
+	}
+
+	ofono_modem_set_powered(modem, ok);
+}
+
+static int sim900_enable(struct ofono_modem *modem)
+{
+	struct sim900_data *data = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	data->modem = open_device(modem, "Device", "Device: ");
+	if (data->modem == NULL) {
+		DBG("return -EINVAL");
+		return -EINVAL;
+	}
+
+	g_at_chat_send(data->modem, "ATE0", NULL, NULL, NULL, NULL);
+
+	/* For obtain correct sms service number */
+	g_at_chat_send(data->modem, "AT+CSCS=\"GSM\"", NULL, 
+			NULL, NULL, NULL);
+
+	g_at_chat_send(data->modem, "AT+CFUN=1", none_prefix,
+			cfun_enable, modem, NULL); 
+
+	return -EINPROGRESS;
+}
+
+
+static void cfun_disable(gboolean ok, GAtResult *result, gpointer user_data)
+{
+        struct ofono_modem *modem = user_data;
+        struct sim900_data *data = ofono_modem_get_data(modem);
+
+        DBG("");
+
+        g_at_chat_unref(data->modem);
+        data->modem = NULL;
+
+        if (ok)
+                ofono_modem_set_powered(modem, FALSE);
+}
+
+static int sim900_disable(struct ofono_modem *modem)
+{
+	struct sim900_data *data = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	g_at_chat_cancel_all(data->modem);
+	g_at_chat_unregister_all(data->modem);
+
+	g_at_chat_send(data->modem, "AT+CFUN=4", none_prefix,
+		cfun_disable, modem, NULL);
+
+	return -EINPROGRESS;
+}
+
+static void sim900_pre_sim(struct ofono_modem *modem)
+{
+	struct sim900_data *data = ofono_modem_get_data(modem);
+	struct ofono_sim *sim;
+
+	DBG("%p", modem);
+
+	ofono_devinfo_create(modem, 0, "atmodem", data->modem);
+	sim = ofono_sim_create(modem, 0, "atmodem", data->modem);
+
+	if (sim)
+		ofono_sim_inserted_notify(sim, TRUE);
+}
+
+static void sim900_post_sim(struct ofono_modem *modem)
+{
+	struct sim900_data *data = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	ofono_phonebook_create(modem, 0, "atmodem", data->modem);
+
+	ofono_sms_create(modem, 0, "atmodem", data->modem);
+}
+
+static void sim900_post_online(struct ofono_modem *modem)
+{
+	struct sim900_data *data = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+	
+	ofono_netreg_create(modem, OFONO_VENDOR_NOKIA, "atmodem", data->modem);
+}
+
+static struct ofono_modem_driver sim900_driver = {
+	.name = "sim900",
+	.probe = sim900_probe,
+	.remove = sim900_remove,
+	.enable = sim900_enable,
+	.disable = sim900_disable,
+	.pre_sim = sim900_pre_sim,
+	.post_sim = sim900_post_sim,
+	.post_online = sim900_post_online,
+};
+
+static int sim900_init(void)
+{
+	return ofono_modem_driver_register(&sim900_driver);
+}
+
+static void sim900_exit(void)
+{
+	ofono_modem_driver_unregister(&sim900_driver);
+}
+
+OFONO_PLUGIN_DEFINE(sim900, "SIM900 modem driver", VERSION,
+		    OFONO_PLUGIN_PRIORITY_DEFAULT, sim900_init, sim900_exit)
-- 
1.7.7.3


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

* [PATCH v4 2/3] Add SIM900 detection support.
  2012-01-11 13:59       ` [PATCH v4 " r.r.zaripov
@ 2012-01-11 13:59         ` r.r.zaripov
  2012-01-11 14:54           ` Marcel Holtmann
  2012-01-11 13:59         ` [PATCH v4 3/3] Adding a short description for usage of SIM900 plugin r.r.zaripov
  2012-01-11 14:52         ` [PATCH v4 1/3] SIMCOM SIM900 module support Marcel Holtmann
  2 siblings, 1 reply; 22+ messages in thread
From: r.r.zaripov @ 2012-01-11 13:59 UTC (permalink / raw)
  To: ofono

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

From: Renat Zaripov <r.r.zaripov@gmail.com>

This allows for detection of SIM900 modem module in case of
appropriate driver specified in udev rules.

Example rule:
KERNEL=="gsmtty3", ENV{OFONO_DRIVER}="sim900"

---
 plugins/udev.c |   15 +++++++++++++++
 1 files changed, 15 insertions(+), 0 deletions(-)

diff --git a/plugins/udev.c b/plugins/udev.c
index d0673f7..f05af48 100644
--- a/plugins/udev.c
+++ b/plugins/udev.c
@@ -193,6 +193,19 @@ static void add_nokiacdma(struct ofono_modem *modem,
 	ofono_modem_register(modem);
 }
 
+static void add_sim900(struct ofono_modem *modem,
+                       struct udev_device *udev_device)
+{
+        const char *devnode;
+
+        DBG("modem %p", modem);
+
+        devnode = udev_device_get_devnode(udev_device);
+        ofono_modem_set_string(modem, "Device", devnode);
+
+        ofono_modem_register(modem);
+}
+
 static void add_modem(struct udev_device *udev_device)
 {
 	struct ofono_modem *modem;
@@ -271,6 +284,8 @@ done:
 		add_tc65(modem, udev_device);
 	else if (g_strcmp0(driver, "nokiacdma") == 0)
 		add_nokiacdma(modem, udev_device);
+        else if (g_strcmp0(driver, "sim900") == 0)
+                add_sim900(modem, udev_device);
 }
 
 static gboolean devpath_remove(gpointer key, gpointer value, gpointer user_data)
-- 
1.7.7.3


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

* [PATCH v4 3/3] Adding a short description for usage of SIM900 plugin.
  2012-01-11 13:59       ` [PATCH v4 " r.r.zaripov
  2012-01-11 13:59         ` [PATCH v4 2/3] Add SIM900 detection support r.r.zaripov
@ 2012-01-11 13:59         ` r.r.zaripov
  2012-01-11 14:52         ` [PATCH v4 1/3] SIMCOM SIM900 module support Marcel Holtmann
  2 siblings, 0 replies; 22+ messages in thread
From: r.r.zaripov @ 2012-01-11 13:59 UTC (permalink / raw)
  To: ofono

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

From: Renat Zaripov <r.r.zaripov@gmail.com>

Adding a short description for usage of SIM900 plugin.

---
 doc/sim900-modem.txt |   12 ++++++++++++
 1 files changed, 12 insertions(+), 0 deletions(-)
 create mode 100644 doc/sim900-modem.txt

diff --git a/doc/sim900-modem.txt b/doc/sim900-modem.txt
new file mode 100644
index 0000000..b0c1871
--- /dev/null
+++ b/doc/sim900-modem.txt
@@ -0,0 +1,12 @@
+SIM900 modem usage
+===================
+
+To enable SIM900 module support you need to put the following
+udev rule into appropriate file in /{etc,lib}/udev/rules.d:
+
+KERNEL=="gsmtty3", ENV{OFONO_DRIVER}="sim900"
+
+On the i-Tetra tracking device, the SIM900 is accessed
+via N_GSM mux device. We use ofono as SMS message
+service and incoming voice calls service, so we
+use /dev/gsmtty3 provided by N_GSM mux.
-- 
1.7.7.3


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

* Re: [PATCH v4 1/3] SIMCOM SIM900 module support
  2012-01-11 13:59       ` [PATCH v4 " r.r.zaripov
  2012-01-11 13:59         ` [PATCH v4 2/3] Add SIM900 detection support r.r.zaripov
  2012-01-11 13:59         ` [PATCH v4 3/3] Adding a short description for usage of SIM900 plugin r.r.zaripov
@ 2012-01-11 14:52         ` Marcel Holtmann
  2012-01-11 11:21           ` Denis Kenzior
  2012-01-12 12:32           ` [PATCH v5 1/4] This patch add support for SIM900 GSM module r.r.zaripov
  2 siblings, 2 replies; 22+ messages in thread
From: Marcel Holtmann @ 2012-01-11 14:52 UTC (permalink / raw)
  To: ofono

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

Hi Renat,

> This patch add support for SIM900 GSM module
> http://wm.sim.com/Sim/FrontShow_en/wireless/detail.aspx?cid=6&nid=770
> ---
>  Makefile.am      |    3 +
>  plugins/sim900.c |  261 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 264 insertions(+), 0 deletions(-)
>  create mode 100644 plugins/sim900.c
> 
> v4: Removed CNMI and CMGF commands in sim900_enable.
> Calling ofono_netreg_create moved in post_online.
> ofono_modem_set_powered(modem, FALSE) handled in sim900_disable by calling cfun_disable.
> 
> diff --git a/Makefile.am b/Makefile.am
> index 6ef8549..64a7070 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -346,6 +346,9 @@ builtin_sources += plugins/speedupcdma.c
>  builtin_modules += samsung
>  builtin_sources += plugins/samsung.c
>  
> +builtin_modules += sim900
> +builtin_sources += plugins/sim900.c
> +
>  if BLUETOOTH
>  builtin_modules += bluetooth
>  builtin_sources += plugins/bluetooth.c plugins/bluetooth.h
> diff --git a/plugins/sim900.c b/plugins/sim900.c
> new file mode 100644
> index 0000000..68bb0da
> --- /dev/null
> +++ b/plugins/sim900.c
> @@ -0,0 +1,261 @@
> +/*
> + *
> + *  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/modem.h>
> +#include <ofono/devinfo.h>
> +#include <ofono/netreg.h>
> +#include <ofono/sim.h>
> +#include <ofono/sms.h>
> +#include <ofono/ussd.h>
> +#include <ofono/gprs.h>
> +#include <ofono/gprs-context.h>
> +#include <ofono/phonebook.h>
> +#include <ofono/history.h>
> +#include <ofono/log.h>
> +
> +#include <drivers/atmodem/vendor.h>
> +
> +static const char *none_prefix[] = { NULL };
> +
> +struct sim900_data {
> +	GAtChat *modem;
> +};
> +
> +static int sim900_probe(struct ofono_modem *modem)
> +{
> +	struct sim900_data *data;
> +
> +	DBG("%p", modem);
> +
> +	data = g_try_new0(struct sim900_data, 1);
> +	if (data == NULL)
> +		return -ENOMEM;
> +
> +	ofono_modem_set_data(modem, data);
> +
> +	return 0;
> +}
> +
> +static void sim900_remove(struct ofono_modem *modem)
> +{
> +	struct sim900_data *data = ofono_modem_get_data(modem);
> +
> +	DBG("%p", modem);
> +
> +	ofono_modem_set_data(modem, NULL);
> +
> +	g_at_chat_unref(data->modem);
> +
> +	g_free(data);
> +}
> +
> +static void sim900_debug(const char *str, void *user_data)
> +{
> +	const char *prefix = user_data;
> +
> +	ofono_info("%s%s", prefix, str);
> +}
> +
> +static GAtChat *open_device(struct ofono_modem *modem,
> +			    const char *key, char *debug)
> +{
> +	const char *device;
> +	GAtSyntax *syntax;
> +	GIOChannel *channel;
> +	GAtChat *chat;
> +	GHashTable *options;
> +
> +	device = ofono_modem_get_string(modem, key);
> +	if (device == NULL)
> +		return NULL;
> +
> +	DBG("%s %s", key, device);
> +
> +	options = g_hash_table_new(g_str_hash, g_str_equal);
> +	if (options == NULL)
> +		return NULL;
> +
> +	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");
> +	g_hash_table_insert(options, "XonXoff", "off");
> +	g_hash_table_insert(options, "Local", "off");
> +	g_hash_table_insert(options, "RtsCts", "off");
> +
> +	channel = g_at_tty_open(device, options);
> +	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;
> +
> +	if (getenv("OFONO_AT_DEBUG"))
> +		g_at_chat_set_debug(chat, sim900_debug, debug);
> +
> +	return chat;
> +}
> +
> +static void cfun_enable(gboolean ok, GAtResult * result, gpointer user_data)
> +{
> +	struct ofono_modem *modem = user_data;
> +	struct sim900_data *data = ofono_modem_get_data(modem);
> +
> +	DBG("");
> +
> +	if (!ok) {
> +		g_at_chat_unref(data->modem);
> +		data->modem = NULL;
> +	}
> +
> +	ofono_modem_set_powered(modem, ok);
> +}
> +
> +static int sim900_enable(struct ofono_modem *modem)
> +{
> +	struct sim900_data *data = ofono_modem_get_data(modem);
> +
> +	DBG("%p", modem);
> +
> +	data->modem = open_device(modem, "Device", "Device: ");
> +	if (data->modem == NULL) {
> +		DBG("return -EINVAL");
> +		return -EINVAL;
> +	}
> +
> +	g_at_chat_send(data->modem, "ATE0", NULL, NULL, NULL, NULL);
> +
> +	/* For obtain correct sms service number */
> +	g_at_chat_send(data->modem, "AT+CSCS=\"GSM\"", NULL, 
> +			NULL, NULL, NULL);

you might better introduce a OFONO_VENDOR_SIM900 quirk and use that in
the SMS atom driver. The phonebook support will also end up overwriting
this one later on. So I am not even sure this works reliable this way.
Might be just pure luck with the order of the atom.

> +
> +	g_at_chat_send(data->modem, "AT+CFUN=1", none_prefix,
> +			cfun_enable, modem, NULL); 
> +
> +	return -EINPROGRESS;
> +}
> +
> +
> +static void cfun_disable(gboolean ok, GAtResult *result, gpointer user_data)
> +{
> +        struct ofono_modem *modem = user_data;
> +        struct sim900_data *data = ofono_modem_get_data(modem);
> +
> +        DBG("");
> +
> +        g_at_chat_unref(data->modem);
> +        data->modem = NULL;
> +
> +        if (ok)
> +                ofono_modem_set_powered(modem, FALSE);
> +}
> +
> +static int sim900_disable(struct ofono_modem *modem)
> +{
> +	struct sim900_data *data = ofono_modem_get_data(modem);
> +
> +	DBG("%p", modem);
> +
> +	g_at_chat_cancel_all(data->modem);
> +	g_at_chat_unregister_all(data->modem);
> +
> +	g_at_chat_send(data->modem, "AT+CFUN=4", none_prefix,
> +		cfun_disable, modem, NULL);
> +
> +	return -EINPROGRESS;
> +}
> +
> +static void sim900_pre_sim(struct ofono_modem *modem)
> +{
> +	struct sim900_data *data = ofono_modem_get_data(modem);
> +	struct ofono_sim *sim;
> +
> +	DBG("%p", modem);
> +
> +	ofono_devinfo_create(modem, 0, "atmodem", data->modem);
> +	sim = ofono_sim_create(modem, 0, "atmodem", data->modem);
> +
> +	if (sim)
> +		ofono_sim_inserted_notify(sim, TRUE);
> +}
> +
> +static void sim900_post_sim(struct ofono_modem *modem)
> +{
> +	struct sim900_data *data = ofono_modem_get_data(modem);
> +
> +	DBG("%p", modem);
> +
> +	ofono_phonebook_create(modem, 0, "atmodem", data->modem);
> +
> +	ofono_sms_create(modem, 0, "atmodem", data->modem);
> +}
> +
> +static void sim900_post_online(struct ofono_modem *modem)
> +{
> +	struct sim900_data *data = ofono_modem_get_data(modem);
> +
> +	DBG("%p", modem);
> +	
> +	ofono_netreg_create(modem, OFONO_VENDOR_NOKIA, "atmodem", data->modem);

why do you need the Nokia vendor quirk here. I think you better create
your own one.

> +}
> +
> +static struct ofono_modem_driver sim900_driver = {
> +	.name = "sim900",
> +	.probe = sim900_probe,
> +	.remove = sim900_remove,
> +	.enable = sim900_enable,
> +	.disable = sim900_disable,
> +	.pre_sim = sim900_pre_sim,
> +	.post_sim = sim900_post_sim,
> +	.post_online = sim900_post_online,
> +};

Please indent these like the other plugins do. Look at ifx.c for
example.

> +
> +static int sim900_init(void)
> +{
> +	return ofono_modem_driver_register(&sim900_driver);
> +}
> +
> +static void sim900_exit(void)
> +{
> +	ofono_modem_driver_unregister(&sim900_driver);
> +}
> +
> +OFONO_PLUGIN_DEFINE(sim900, "SIM900 modem driver", VERSION,
> +		    OFONO_PLUGIN_PRIORITY_DEFAULT, sim900_init, sim900_exit)

Rest looks good to me.

Regards

Marcel



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

* Re: [PATCH v4 2/3] Add SIM900 detection support.
  2012-01-11 13:59         ` [PATCH v4 2/3] Add SIM900 detection support r.r.zaripov
@ 2012-01-11 14:54           ` Marcel Holtmann
  2012-01-12 10:11             ` Renat Zaripov
  0 siblings, 1 reply; 22+ messages in thread
From: Marcel Holtmann @ 2012-01-11 14:54 UTC (permalink / raw)
  To: ofono

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

Hi Renat,

> This allows for detection of SIM900 modem module in case of
> appropriate driver specified in udev rules.
> 
> Example rule:
> KERNEL=="gsmtty3", ENV{OFONO_DRIVER}="sim900"

you could also use the 27.010 support that is included in oFono itself
and set it up from within the plugin. I assume you have a reason for
using N_GSM.

> 
> ---
>  plugins/udev.c |   15 +++++++++++++++
>  1 files changed, 15 insertions(+), 0 deletions(-)
> 
> diff --git a/plugins/udev.c b/plugins/udev.c
> index d0673f7..f05af48 100644
> --- a/plugins/udev.c
> +++ b/plugins/udev.c
> @@ -193,6 +193,19 @@ static void add_nokiacdma(struct ofono_modem *modem,
>  	ofono_modem_register(modem);
>  }
>  
> +static void add_sim900(struct ofono_modem *modem,
> +                       struct udev_device *udev_device)
> +{
> +        const char *devnode;
> +
> +        DBG("modem %p", modem);
> +
> +        devnode = udev_device_get_devnode(udev_device);
> +        ofono_modem_set_string(modem, "Device", devnode);
> +
> +        ofono_modem_register(modem);
> +}
> +
>  static void add_modem(struct udev_device *udev_device)
>  {
>  	struct ofono_modem *modem;
> @@ -271,6 +284,8 @@ done:
>  		add_tc65(modem, udev_device);
>  	else if (g_strcmp0(driver, "nokiacdma") == 0)
>  		add_nokiacdma(modem, udev_device);
> +        else if (g_strcmp0(driver, "sim900") == 0)
> +                add_sim900(modem, udev_device);
>  }

Something went wrong here. Spaces?

Regards

Marcel



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

* Re: [PATCH v4 1/3] SIMCOM SIM900 module support
  2012-01-11 11:21           ` Denis Kenzior
@ 2012-01-11 15:24             ` Marcel Holtmann
  2012-01-11 11:41               ` Denis Kenzior
  0 siblings, 1 reply; 22+ messages in thread
From: Marcel Holtmann @ 2012-01-11 15:24 UTC (permalink / raw)
  To: ofono

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

Hi Denis,

> >> +	/* For obtain correct sms service number */
> >> +	g_at_chat_send(data->modem, "AT+CSCS=\"GSM\"", NULL, 
> >> +			NULL, NULL, NULL);
> > 
> > you might better introduce a OFONO_VENDOR_SIM900 quirk and use that in
> > the SMS atom driver. The phonebook support will also end up overwriting
> > this one later on. So I am not even sure this works reliable this way.
> > Might be just pure luck with the order of the atom.
> > 
> 
> Actually this is fine assuming the modem does not support UTF-8
> character set.  The builtin assumption for most atoms is that CSCS is
> set to something sane before they're initialized.  The phonebook driver
> will temporarily switch to UCS2 for the duration of the phonebook read
> and restore the previous setting.

we did a vendor quirk for this for USSD of Qualcomm based modems. Maybe
we should then also move that into the modem plugins.

Regards

Marcel



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

* Re: [PATCH v5 1/4] This patch add support for SIM900 GSM module
  2012-01-12 12:32           ` [PATCH v5 1/4] This patch add support for SIM900 GSM module r.r.zaripov
@ 2012-01-12  5:52             ` Denis Kenzior
  2012-01-12 12:32             ` [PATCH v5 2/4] Add SIM900 detection support r.r.zaripov
                               ` (2 subsequent siblings)
  3 siblings, 0 replies; 22+ messages in thread
From: Denis Kenzior @ 2012-01-12  5:52 UTC (permalink / raw)
  To: ofono

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

Hi Renat,

On 01/12/2012 06:32 AM, r.r.zaripov(a)gmail.com wrote:
> From: Renat Zaripov <r.r.zaripov@gmail.com>
> 
> This patch add support for SIM900 GSM module
> http://wm.sim.com/Sim/FrontShow_en/wireless/detail.aspx?cid=6&nid=770
> 
> ---
>  Makefile.am      |    3 +
>  plugins/sim900.c |  261 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 264 insertions(+), 0 deletions(-)
>  create mode 100644 plugins/sim900.c
> 
> v4: Adding vendor quirk OFONO_VENDOR_SIM900
> cleanup whitespaces
> 

I went ahead and applied all four patches with some minor whitespace /
style cleanups.  I have also renamed OFONO_VENDOR_SIM900 to
OFONO_VENDOR_SIMCOM to be more in line with our historical naming.

The plugin might need to be called simcom.c, but I leave this as is for now.

Thanks!

Regards,
-Denis

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

* Re: [PATCH v4 2/3] Add SIM900 detection support.
  2012-01-11 14:54           ` Marcel Holtmann
@ 2012-01-12 10:11             ` Renat Zaripov
  0 siblings, 0 replies; 22+ messages in thread
From: Renat Zaripov @ 2012-01-12 10:11 UTC (permalink / raw)
  To: ofono

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

2012/1/11 Marcel Holtmann <marcel@holtmann.org>:
> Hi Renat,
>
>> This allows for detection of SIM900 modem module in case of
>> appropriate driver specified in udev rules.
>>
>> Example rule:
>> KERNEL=="gsmtty3", ENV{OFONO_DRIVER}="sim900"
>
> you could also use the 27.010 support that is included in oFono itself
> and set it up from within the plugin. I assume you have a reason for
> using N_GSM.
>
>>
>> ---
>>  plugins/udev.c |   15 +++++++++++++++
>>  1 files changed, 15 insertions(+), 0 deletions(-)
>>
>> diff --git a/plugins/udev.c b/plugins/udev.c
>> index d0673f7..f05af48 100644
>> --- a/plugins/udev.c
>> +++ b/plugins/udev.c
>> @@ -193,6 +193,19 @@ static void add_nokiacdma(struct ofono_modem *modem,
>>       ofono_modem_register(modem);
>>  }
>>
>> +static void add_sim900(struct ofono_modem *modem,
>> +                       struct udev_device *udev_device)
>> +{
>> +        const char *devnode;
>> +
>> +        DBG("modem %p", modem);
>> +
>> +        devnode = udev_device_get_devnode(udev_device);
>> +        ofono_modem_set_string(modem, "Device", devnode);
>> +
>> +        ofono_modem_register(modem);
>> +}
>> +
>>  static void add_modem(struct udev_device *udev_device)
>>  {
>>       struct ofono_modem *modem;
>> @@ -271,6 +284,8 @@ done:
>>               add_tc65(modem, udev_device);
>>       else if (g_strcmp0(driver, "nokiacdma") == 0)
>>               add_nokiacdma(modem, udev_device);
>> +        else if (g_strcmp0(driver, "sim900") == 0)
>> +                add_sim900(modem, udev_device);
>>  }
>
> Something went wrong here. Spaces?
>
> Regards
>
> Marcel
>
>
> _______________________________________________
> ofono mailing list
> ofono(a)ofono.org
> http://lists.ofono.org/listinfo/ofono

Hi Marcel,

We know about GAtMux, but for our device we have some reasons to use
N_GSM. SIM900 modem module may be used without multiplexer, we use it
only for our specific purposes.

Best regards,

Renat

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

* Re: [PATCH v4 1/3] SIMCOM SIM900 module support
  2012-01-11 11:41               ` Denis Kenzior
@ 2012-01-12 10:55                 ` Renat Zaripov
  2012-01-12 11:52                   ` Marcel Holtmann
  0 siblings, 1 reply; 22+ messages in thread
From: Renat Zaripov @ 2012-01-12 10:55 UTC (permalink / raw)
  To: ofono

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

2012/1/11 Denis Kenzior <denkenz@gmail.com>:
> Hi Marcel,
>
> On 01/11/2012 09:24 AM, Marcel Holtmann wrote:
>> Hi Denis,
>>
>>>>> +  /* For obtain correct sms service number */
>>>>> +  g_at_chat_send(data->modem, "AT+CSCS=\"GSM\"", NULL,
>>>>> +                  NULL, NULL, NULL);
>>>>
>>>> you might better introduce a OFONO_VENDOR_SIM900 quirk and use that in
>>>> the SMS atom driver. The phonebook support will also end up overwriting
>>>> this one later on. So I am not even sure this works reliable this way.
>>>> Might be just pure luck with the order of the atom.
>>>>
>>>
>>> Actually this is fine assuming the modem does not support UTF-8
>>> character set.  The builtin assumption for most atoms is that CSCS is
>>> set to something sane before they're initialized.  The phonebook driver
>>> will temporarily switch to UCS2 for the duration of the phonebook read
>>> and restore the previous setting.
>>
>> we did a vendor quirk for this for USSD of Qualcomm based modems. Maybe
>> we should then also move that into the modem plugins.
>>
>
> Yes, I think that would be cleaner.  I'll take care of it.
>
> Regards,
> -Denis
> _______________________________________________
> ofono mailing list
> ofono(a)ofono.org
> http://lists.ofono.org/listinfo/ofono

Hi Marcel,

How I understand, it is correct that I call CSCS command from
sim900_enable? Or I must move it in another stage?
Can I add OFONO_VENDOR_SIM900 in drivers/atmodem/vendor.h for use it
instead OFONO_VENDOR_NOKIA in ofono_netreg_create?

Best regards,
Renat Zaripov

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

* Re: [PATCH v4 1/3] SIMCOM SIM900 module support
  2012-01-12 10:55                 ` Renat Zaripov
@ 2012-01-12 11:52                   ` Marcel Holtmann
  0 siblings, 0 replies; 22+ messages in thread
From: Marcel Holtmann @ 2012-01-12 11:52 UTC (permalink / raw)
  To: ofono

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

Hi Renat,

> >>>>> +  /* For obtain correct sms service number */
> >>>>> +  g_at_chat_send(data->modem, "AT+CSCS=\"GSM\"", NULL,
> >>>>> +                  NULL, NULL, NULL);
> >>>>
> >>>> you might better introduce a OFONO_VENDOR_SIM900 quirk and use that in
> >>>> the SMS atom driver. The phonebook support will also end up overwriting
> >>>> this one later on. So I am not even sure this works reliable this way.
> >>>> Might be just pure luck with the order of the atom.
> >>>>
> >>>
> >>> Actually this is fine assuming the modem does not support UTF-8
> >>> character set.  The builtin assumption for most atoms is that CSCS is
> >>> set to something sane before they're initialized.  The phonebook driver
> >>> will temporarily switch to UCS2 for the duration of the phonebook read
> >>> and restore the previous setting.
> >>
> >> we did a vendor quirk for this for USSD of Qualcomm based modems. Maybe
> >> we should then also move that into the modem plugins.
> >>
> >
> > Yes, I think that would be cleaner.  I'll take care of it.
> >

> How I understand, it is correct that I call CSCS command from
> sim900_enable? Or I must move it in another stage?

Denis and I pushed some patches to call AT+CSCS in the plugins. I think
the only thing you need to consider is doing after you are sure a SIM
card is present.

> Can I add OFONO_VENDOR_SIM900 in drivers/atmodem/vendor.h for use it
> instead OFONO_VENDOR_NOKIA in ofono_netreg_create?

Yes. Just send a separate patch adding the vendor quirk.

Regards

Marcel



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

* [PATCH v5 1/4] This patch add support for SIM900 GSM module
  2012-01-11 14:52         ` [PATCH v4 1/3] SIMCOM SIM900 module support Marcel Holtmann
  2012-01-11 11:21           ` Denis Kenzior
@ 2012-01-12 12:32           ` r.r.zaripov
  2012-01-12  5:52             ` Denis Kenzior
                               ` (3 more replies)
  1 sibling, 4 replies; 22+ messages in thread
From: r.r.zaripov @ 2012-01-12 12:32 UTC (permalink / raw)
  To: ofono

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

From: Renat Zaripov <r.r.zaripov@gmail.com>

This patch add support for SIM900 GSM module
http://wm.sim.com/Sim/FrontShow_en/wireless/detail.aspx?cid=6&nid=770

---
 Makefile.am      |    3 +
 plugins/sim900.c |  261 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 264 insertions(+), 0 deletions(-)
 create mode 100644 plugins/sim900.c

v4: Adding vendor quirk OFONO_VENDOR_SIM900
cleanup whitespaces

diff --git a/Makefile.am b/Makefile.am
index b4adb6f..0472dfa 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -347,6 +347,9 @@ builtin_sources += plugins/speedupcdma.c
 builtin_modules += samsung
 builtin_sources += plugins/samsung.c
 
+builtin_modules += sim900
+builtin_sources += plugins/sim900.c
+
 if BLUETOOTH
 builtin_modules += bluetooth
 builtin_sources += plugins/bluetooth.c plugins/bluetooth.h
diff --git a/plugins/sim900.c b/plugins/sim900.c
new file mode 100644
index 0000000..df43188
--- /dev/null
+++ b/plugins/sim900.c
@@ -0,0 +1,261 @@
+/*
+ *
+ *  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/modem.h>
+#include <ofono/devinfo.h>
+#include <ofono/netreg.h>
+#include <ofono/sim.h>
+#include <ofono/sms.h>
+#include <ofono/ussd.h>
+#include <ofono/gprs.h>
+#include <ofono/gprs-context.h>
+#include <ofono/phonebook.h>
+#include <ofono/history.h>
+#include <ofono/log.h>
+
+#include <drivers/atmodem/vendor.h>
+
+static const char *none_prefix[] = { NULL };
+
+struct sim900_data {
+	GAtChat *modem;
+};
+
+static int sim900_probe(struct ofono_modem *modem)
+{
+	struct sim900_data *data;
+
+	DBG("%p", modem);
+
+	data = g_try_new0(struct sim900_data, 1);
+	if (data == NULL)
+		return -ENOMEM;
+
+	ofono_modem_set_data(modem, data);
+
+	return 0;
+}
+
+static void sim900_remove(struct ofono_modem *modem)
+{
+	struct sim900_data *data = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	ofono_modem_set_data(modem, NULL);
+
+	g_at_chat_unref(data->modem);
+
+	g_free(data);
+}
+
+static void sim900_debug(const char *str, void *user_data)
+{
+	const char *prefix = user_data;
+
+	ofono_info("%s%s", prefix, str);
+}
+
+static GAtChat *open_device(struct ofono_modem *modem,
+			    const char *key, char *debug)
+{
+	const char *device;
+	GAtSyntax *syntax;
+	GIOChannel *channel;
+	GAtChat *chat;
+	GHashTable *options;
+
+	device = ofono_modem_get_string(modem, key);
+	if (device == NULL)
+		return NULL;
+
+	DBG("%s %s", key, device);
+
+	options = g_hash_table_new(g_str_hash, g_str_equal);
+	if (options == NULL)
+		return NULL;
+
+	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");
+	g_hash_table_insert(options, "XonXoff", "off");
+	g_hash_table_insert(options, "Local", "off");
+	g_hash_table_insert(options, "RtsCts", "off");
+
+	channel = g_at_tty_open(device, options);
+	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;
+
+	if (getenv("OFONO_AT_DEBUG"))
+		g_at_chat_set_debug(chat, sim900_debug, debug);
+
+	return chat;
+}
+
+static void cfun_enable(gboolean ok, GAtResult * result, gpointer user_data)
+{
+	struct ofono_modem *modem = user_data;
+	struct sim900_data *data = ofono_modem_get_data(modem);
+
+	DBG("");
+
+	if (!ok) {
+		g_at_chat_unref(data->modem);
+		data->modem = NULL;
+	}
+
+	ofono_modem_set_powered(modem, ok);
+}
+
+static int sim900_enable(struct ofono_modem *modem)
+{
+	struct sim900_data *data = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	data->modem = open_device(modem, "Device", "Device: ");
+	if (data->modem == NULL) {
+		DBG("return -EINVAL");
+		return -EINVAL;
+	}
+
+	g_at_chat_send(data->modem, "ATE0", NULL, NULL, NULL, NULL);
+
+	/* For obtain correct sms service number */
+	g_at_chat_send(data->modem, "AT+CSCS=\"GSM\"", NULL, 
+					NULL, NULL, NULL);
+
+	g_at_chat_send(data->modem, "AT+CFUN=1", none_prefix,
+					cfun_enable, modem, NULL); 
+
+	return -EINPROGRESS;
+}
+
+
+static void cfun_disable(gboolean ok, GAtResult *result, gpointer user_data)
+{
+	struct ofono_modem *modem = user_data;
+	struct sim900_data *data = ofono_modem_get_data(modem);
+
+	DBG("");
+
+	g_at_chat_unref(data->modem);
+	data->modem = NULL;
+
+	if (ok)
+		ofono_modem_set_powered(modem, FALSE);
+}
+
+static int sim900_disable(struct ofono_modem *modem)
+{
+	struct sim900_data *data = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	g_at_chat_cancel_all(data->modem);
+	g_at_chat_unregister_all(data->modem);
+
+	g_at_chat_send(data->modem, "AT+CFUN=4", none_prefix,
+					cfun_disable, modem, NULL);
+
+	return -EINPROGRESS;
+}
+
+static void sim900_pre_sim(struct ofono_modem *modem)
+{
+	struct sim900_data *data = ofono_modem_get_data(modem);
+	struct ofono_sim *sim;
+
+	DBG("%p", modem);
+
+	ofono_devinfo_create(modem, 0, "atmodem", data->modem);
+	sim = ofono_sim_create(modem, 0, "atmodem", data->modem);
+
+	if (sim)
+		ofono_sim_inserted_notify(sim, TRUE);
+}
+
+static void sim900_post_sim(struct ofono_modem *modem)
+{
+	struct sim900_data *data = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	ofono_phonebook_create(modem, 0, "atmodem", data->modem);
+
+	ofono_sms_create(modem, 0, "atmodem", data->modem);
+}
+
+static void sim900_post_online(struct ofono_modem *modem)
+{
+	struct sim900_data *data = ofono_modem_get_data(modem);
+
+	DBG("%p", modem);
+
+	ofono_netreg_create(modem, OFONO_VENDOR_SIM900, "atmodem", data->modem);
+}
+
+static struct ofono_modem_driver sim900_driver = {
+	.name		= "sim900",
+	.probe		= sim900_probe,
+	.remove		= sim900_remove,
+	.enable		= sim900_enable,
+	.disable	= sim900_disable,
+	.pre_sim	= sim900_pre_sim,
+	.post_sim	= sim900_post_sim,
+	.post_online	= sim900_post_online,
+};
+
+static int sim900_init(void)
+{
+	return ofono_modem_driver_register(&sim900_driver);
+}
+
+static void sim900_exit(void)
+{
+	ofono_modem_driver_unregister(&sim900_driver);
+}
+
+OFONO_PLUGIN_DEFINE(sim900, "SIM900 modem driver", VERSION,
+		OFONO_PLUGIN_PRIORITY_DEFAULT, sim900_init, sim900_exit)
-- 
1.7.7.3


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

* [PATCH v5 2/4] Add SIM900 detection support.
  2012-01-12 12:32           ` [PATCH v5 1/4] This patch add support for SIM900 GSM module r.r.zaripov
  2012-01-12  5:52             ` Denis Kenzior
@ 2012-01-12 12:32             ` r.r.zaripov
  2012-01-12 12:32             ` [PATCH v5 3/4] SIM900 driver usage documentation r.r.zaripov
  2012-01-12 12:32             ` [PATCH v5 4/4] SIM900 vendor quirk r.r.zaripov
  3 siblings, 0 replies; 22+ messages in thread
From: r.r.zaripov @ 2012-01-12 12:32 UTC (permalink / raw)
  To: ofono

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

From: Renat Zaripov <r.r.zaripov@gmail.com>

This allows for detection of SIM900 modem module in case
of appropriate driver specified in udev rules.

Example rule:
KERNEL=="gsmtty3", ENV{OFONO_DRIVER}="sim900"
---
 plugins/udev.c |   15 +++++++++++++++
 1 files changed, 15 insertions(+), 0 deletions(-)

diff --git a/plugins/udev.c b/plugins/udev.c
index 79027d7..8cb87a5 100644
--- a/plugins/udev.c
+++ b/plugins/udev.c
@@ -193,6 +193,19 @@ static void add_nokiacdma(struct ofono_modem *modem,
 	ofono_modem_register(modem);
 }
 
+static void add_sim900(struct ofono_modem *modem,
+					struct udev_device *udev_device)
+{
+	const char *devnode;
+
+	DBG("modem %p", modem);
+
+	devnode = udev_device_get_devnode(udev_device);
+	ofono_modem_set_string(modem, "Device", devnode);
+
+	ofono_modem_register(modem);
+}
+
 static void add_modem(struct udev_device *udev_device)
 {
 	struct ofono_modem *modem;
@@ -271,6 +284,8 @@ done:
 		add_tc65(modem, udev_device);
 	else if (g_strcmp0(driver, "nokiacdma") == 0)
 		add_nokiacdma(modem, udev_device);
+	else if (g_strcmp0(driver, "sim900") == 0)
+		add_sim900(modem, udev_device);
 }
 
 static gboolean devpath_remove(gpointer key, gpointer value, gpointer user_data)
-- 
1.7.7.3


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

* [PATCH v5 3/4] SIM900 driver usage documentation
  2012-01-12 12:32           ` [PATCH v5 1/4] This patch add support for SIM900 GSM module r.r.zaripov
  2012-01-12  5:52             ` Denis Kenzior
  2012-01-12 12:32             ` [PATCH v5 2/4] Add SIM900 detection support r.r.zaripov
@ 2012-01-12 12:32             ` r.r.zaripov
  2012-01-12 12:32             ` [PATCH v5 4/4] SIM900 vendor quirk r.r.zaripov
  3 siblings, 0 replies; 22+ messages in thread
From: r.r.zaripov @ 2012-01-12 12:32 UTC (permalink / raw)
  To: ofono

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

From: Renat Zaripov <r.r.zaripov@gmail.com>

Adding a short description for usage of SIM900 plugin.
---
 doc/sim900-modem.txt |   12 ++++++++++++
 1 files changed, 12 insertions(+), 0 deletions(-)
 create mode 100644 doc/sim900-modem.txt

diff --git a/doc/sim900-modem.txt b/doc/sim900-modem.txt
new file mode 100644
index 0000000..e9f051c
--- /dev/null
+++ b/doc/sim900-modem.txt
@@ -0,0 +1,12 @@
+SIM900 modem usage
+===================
+
+To enable SIM900 module support you need to put the following
+udev rule into appropriate file in /{etc,lib}/udev/rules.d:
+
+KERNEL=="gsmtty3", ENV{OFONO_DRIVER}="sim900"
+
+On the i-Tetra tracking device, the SIM900 is accessed
+via N_GSM mux device. We use ofono as SMS message
+service and incoming voice calls service, so we
+use /dev/gsmtty1 provided by N_GSM mux.
-- 
1.7.7.3


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

* [PATCH v5 4/4] SIM900 vendor quirk
  2012-01-12 12:32           ` [PATCH v5 1/4] This patch add support for SIM900 GSM module r.r.zaripov
                               ` (2 preceding siblings ...)
  2012-01-12 12:32             ` [PATCH v5 3/4] SIM900 driver usage documentation r.r.zaripov
@ 2012-01-12 12:32             ` r.r.zaripov
  3 siblings, 0 replies; 22+ messages in thread
From: r.r.zaripov @ 2012-01-12 12:32 UTC (permalink / raw)
  To: ofono

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

From: Renat Zaripov <r.r.zaripov@gmail.com>

Adding vendor quirk for SIMCOM SIM900 modem module.
---
 drivers/atmodem/network-registration.c |    1 +
 drivers/atmodem/vendor.h               |    1 +
 2 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/drivers/atmodem/network-registration.c b/drivers/atmodem/network-registration.c
index b943241..78e73e2 100644
--- a/drivers/atmodem/network-registration.c
+++ b/drivers/atmodem/network-registration.c
@@ -1496,6 +1496,7 @@ static void at_creg_set_cb(gboolean ok, GAtResult *result, gpointer user_data)
 		break;
 	case OFONO_VENDOR_NOKIA:
 	case OFONO_VENDOR_SAMSUNG:
+	case OFONO_VENDOR_SIM900:
 		/* Signal strength reporting via CIND is not supported */
 		break;
 	default:
diff --git a/drivers/atmodem/vendor.h b/drivers/atmodem/vendor.h
index c4ef742..4aab7bf 100644
--- a/drivers/atmodem/vendor.h
+++ b/drivers/atmodem/vendor.h
@@ -38,4 +38,5 @@ enum ofono_vendor {
 	OFONO_VENDOR_TELIT,
 	OFONO_VENDOR_SPEEDUP,
 	OFONO_VENDOR_SAMSUNG,
+	OFONO_VENDOR_SIM900,
 };
-- 
1.7.7.3


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

end of thread, other threads:[~2012-01-12 12:32 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-12-26 13:38 [PATCH] SIMCOM SIM900 module support r.r.zaripov
2011-12-27 23:03 ` Denis Kenzior
2011-12-29 12:06   ` [PATCH v3 1/3] " r.r.zaripov
2011-12-28 15:54     ` Denis Kenzior
2012-01-11 13:59       ` [PATCH v4 " r.r.zaripov
2012-01-11 13:59         ` [PATCH v4 2/3] Add SIM900 detection support r.r.zaripov
2012-01-11 14:54           ` Marcel Holtmann
2012-01-12 10:11             ` Renat Zaripov
2012-01-11 13:59         ` [PATCH v4 3/3] Adding a short description for usage of SIM900 plugin r.r.zaripov
2012-01-11 14:52         ` [PATCH v4 1/3] SIMCOM SIM900 module support Marcel Holtmann
2012-01-11 11:21           ` Denis Kenzior
2012-01-11 15:24             ` Marcel Holtmann
2012-01-11 11:41               ` Denis Kenzior
2012-01-12 10:55                 ` Renat Zaripov
2012-01-12 11:52                   ` Marcel Holtmann
2012-01-12 12:32           ` [PATCH v5 1/4] This patch add support for SIM900 GSM module r.r.zaripov
2012-01-12  5:52             ` Denis Kenzior
2012-01-12 12:32             ` [PATCH v5 2/4] Add SIM900 detection support r.r.zaripov
2012-01-12 12:32             ` [PATCH v5 3/4] SIM900 driver usage documentation r.r.zaripov
2012-01-12 12:32             ` [PATCH v5 4/4] SIM900 vendor quirk r.r.zaripov
2011-12-29 12:06     ` [PATCH v3 2/3] Add SIM900 detection support r.r.zaripov
2011-12-29 12:06     ` [PATCH v3 3/3] SIM900 driver usage documentation r.r.zaripov

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.