* [PATCH 1/4] udevng: add detection logic for u-blox modems
2014-07-03 10:32 [PATCH v3 0/4] Add a driver for u-blox modems Philip Paeps
@ 2014-07-03 10:32 ` Philip Paeps
2014-07-03 10:32 ` [PATCH 2/4] plugins: new driver for u-blox SARA-U270 modems Philip Paeps
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Philip Paeps @ 2014-07-03 10:32 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 1861 bytes --]
---
plugins/udevng.c | 42 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/plugins/udevng.c b/plugins/udevng.c
index 2ee5a24..6dc9228 100644
--- a/plugins/udevng.c
+++ b/plugins/udevng.c
@@ -831,6 +831,46 @@ static gboolean setup_quectel(struct modem_info *modem)
return TRUE;
}
+static gboolean setup_ublox(struct modem_info *modem)
+{
+ const char *aux = NULL, *mdm = NULL;
+ GSList *list;
+
+ DBG("%s", modem->syspath);
+
+ for (list = modem->devices; list; list = list->next) {
+ struct device_info *info = list->data;
+
+ DBG("%s %s %s %s", info->devnode, info->interface,
+ info->number, info->label);
+
+ if (g_strcmp0(info->label, "aux") == 0) {
+ aux = info->devnode;
+ if (mdm != NULL)
+ break;
+ } else if (g_strcmp0(info->label, "modem") == 0) {
+ mdm = info->devnode;
+ if (aux != NULL)
+ break;
+ } else if (g_strcmp0(info->interface, "2/2/1") == 0) {
+ if (g_strcmp0(info->number, "02") == 0)
+ aux = info->devnode;
+ else if (g_strcmp0(info->number, "00") == 0)
+ mdm = info->devnode;
+ }
+ }
+
+ if (aux == NULL || mdm == NULL)
+ return FALSE;
+
+ DBG("aux=%s modem=%s", aux, mdm);
+
+ ofono_modem_set_string(modem->modem, "Aux", aux);
+ ofono_modem_set_string(modem->modem, "Modem", mdm);
+
+ return TRUE;
+}
+
static struct {
const char *name;
gboolean (*setup)(struct modem_info *modem);
@@ -856,6 +896,7 @@ static struct {
{ "icera", setup_icera },
{ "samsung", setup_samsung },
{ "quectel", setup_quectel },
+ { "ublox", setup_ublox },
{ }
};
@@ -1068,6 +1109,7 @@ static struct {
{ "samsung", "option", "04e8", "6889" },
{ "samsung", "kalmia" },
{ "quectel", "option", "05c6", "9090" },
+ { "ublox", "cdc_acm", "1546", "1102" },
{ }
};
--
1.7.10.4
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH 2/4] plugins: new driver for u-blox SARA-U270 modems
2014-07-03 10:32 [PATCH v3 0/4] Add a driver for u-blox modems Philip Paeps
2014-07-03 10:32 ` [PATCH 1/4] udevng: add detection logic " Philip Paeps
@ 2014-07-03 10:32 ` Philip Paeps
2014-07-03 10:32 ` [PATCH 3/4] sim: query u-blox PIN retries with AT+UPINCNT Philip Paeps
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Philip Paeps @ 2014-07-03 10:32 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 8153 bytes --]
This driver may also work (perhaps with more or less trivial changes)
with other u-blox modems (SARA, LISA, LEON) but this hasn't been tested.
---
Makefile.am | 3 +
plugins/ublox.c | 293 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 296 insertions(+)
diff --git a/Makefile.am b/Makefile.am
index cd83ef4..5f98f8e 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -420,6 +420,9 @@ builtin_sources += plugins/connman.c
builtin_modules += he910
builtin_sources += plugins/he910.c
+builtin_modules += ublox
+builtin_sources += plugins/ublox.c
+
if BLUETOOTH
if BLUEZ4
builtin_modules += bluez4
diff --git a/plugins/ublox.c b/plugins/ublox.c
new file mode 100644
index 0000000..8aa797e
--- /dev/null
+++ b/plugins/ublox.c
@@ -0,0 +1,293 @@
+/*
+ *
+ * oFono - Open Source Telephony
+ *
+ * Copyright (C) 2014 Philip Paeps. 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/gprs.h>
+#include <ofono/gprs-context.h>
+
+#include <drivers/atmodem/atutil.h>
+#include <drivers/atmodem/vendor.h>
+
+static const char *none_prefix[] = { NULL };
+
+struct ublox_data {
+ GAtChat *modem;
+ GAtChat *aux;
+};
+
+static void ublox_debug(const char *str, void *user_data)
+{
+ const char *prefix = user_data;
+
+ ofono_info("%s%s", prefix, str);
+}
+
+static int ublox_probe(struct ofono_modem *modem)
+{
+ struct ublox_data *data;
+
+ DBG("%p", modem);
+
+ data = g_try_new0(struct ublox_data, 1);
+ if (data == NULL)
+ return -ENOMEM;
+
+ ofono_modem_set_data(modem, data);
+
+ return 0;
+}
+
+static void ublox_remove(struct ofono_modem *modem)
+{
+ struct ublox_data *data = ofono_modem_get_data(modem);
+
+ DBG("%p", modem);
+
+ ofono_modem_set_data(modem, NULL);
+ g_at_chat_unref(data->aux);
+ g_at_chat_unref(data->modem);
+ g_free(data);
+}
+
+static GAtChat *open_device(struct ofono_modem *modem,
+ const char *key, char *debug)
+{
+ const char *device;
+ GAtSyntax *syntax;
+ GIOChannel *channel;
+ GAtChat *chat;
+
+ device = ofono_modem_get_string(modem, key);
+ if (device == NULL)
+ return NULL;
+
+ DBG("%s %s", key, device);
+
+ channel = g_at_tty_open(device, NULL);
+ if (channel == NULL)
+ return NULL;
+
+ syntax = g_at_syntax_new_gsm_permissive();
+ chat = g_at_chat_new(channel, syntax);
+ g_at_syntax_unref(syntax);
+
+ g_io_channel_unref(channel);
+
+ if (chat == NULL)
+ return NULL;
+
+ if (getenv("OFONO_AT_DEBUG"))
+ g_at_chat_set_debug(chat, ublox_debug, debug);
+
+ return chat;
+}
+
+static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data)
+{
+ struct ofono_modem *modem = user_data;
+ struct ublox_data * data = ofono_modem_get_data(modem);
+
+ DBG("ok %d", ok);
+
+ if (!ok) {
+ g_at_chat_unref(data->aux);
+ data->aux = NULL;
+ g_at_chat_unref(data->modem);
+ data->modem = NULL;
+ ofono_modem_set_powered(modem, FALSE);
+ return;
+ }
+
+ ofono_modem_set_powered(modem, TRUE);
+}
+
+static int ublox_enable(struct ofono_modem *modem)
+{
+ struct ublox_data *data = ofono_modem_get_data(modem);
+
+ DBG("%p", modem);
+
+ data->modem = open_device(modem, "Modem", "Modem: ");
+ if (data->modem == NULL)
+ return -EINVAL;
+
+ data->aux = open_device(modem, "Aux", "Aux: ");
+ if (data->aux == NULL) {
+ g_at_chat_unref(data->modem);
+ data->modem = NULL;
+ return -EIO;
+ }
+ g_at_chat_set_slave(data->modem, data->aux);
+
+ g_at_chat_send(data->modem, "ATE0 +CMEE=1", none_prefix,
+ NULL, NULL, NULL);
+ g_at_chat_send(data->aux, "ATE0 +CMEE=1", none_prefix,
+ NULL, NULL, NULL);
+
+ g_at_chat_send(data->aux, "AT+CFUN=4", 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 ublox_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 ublox_disable(struct ofono_modem *modem)
+{
+ struct ublox_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=0", none_prefix,
+ cfun_disable, modem, NULL);
+
+ return -EINPROGRESS;
+}
+
+static void set_online_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+ struct cb_data *cbd = user_data;
+ ofono_modem_online_cb_t cb = cbd->cb;
+ struct ofono_error error;
+
+ decode_at_error(&error, g_at_result_final_response(result));
+ cb(&error, cbd->data);
+}
+
+static void ublox_set_online(struct ofono_modem *modem, ofono_bool_t online,
+ ofono_modem_online_cb_t cb, void *user_data)
+{
+ struct ublox_data *data = ofono_modem_get_data(modem);
+ struct cb_data *cbd = cb_data_new(cb, user_data);
+ char const *command = online ? "AT+CFUN=1" : "AT+CFUN=4";
+
+ DBG("modem %p %s", modem, online ? "online" : "offline");
+
+ if (g_at_chat_send(data->aux, command, none_prefix, set_online_cb,
+ cbd, g_free) > 0)
+ return;
+
+ CALLBACK_WITH_FAILURE(cb, cbd->data);
+
+ g_free(cbd);
+}
+
+static void ublox_pre_sim(struct ofono_modem *modem)
+{
+ struct ublox_data *data = ofono_modem_get_data(modem);
+ struct ofono_sim *sim;
+
+ DBG("%p", modem);
+
+ ofono_devinfo_create(modem, OFONO_VENDOR_UBLOX, "atmodem",
+ data->aux);
+ sim = ofono_sim_create(modem, OFONO_VENDOR_UBLOX, "atmodem",
+ data->aux);
+
+ if (sim)
+ ofono_sim_inserted_notify(sim, TRUE);
+}
+
+static void ublox_post_sim(struct ofono_modem *modem)
+{
+ struct ublox_data *data = ofono_modem_get_data(modem);
+ struct ofono_gprs *gprs;
+ struct ofono_gprs_context *gc;
+
+ DBG("%p", modem);
+
+ gprs = ofono_gprs_create(modem, OFONO_VENDOR_UBLOX, "atmodem",
+ data->aux);
+ gc = ofono_gprs_context_create(modem, OFONO_VENDOR_UBLOX, "atmodem",
+ data->modem);
+
+ if (gprs && gc)
+ ofono_gprs_add_context(gprs, gc);
+}
+
+static void ublox_post_online(struct ofono_modem *modem)
+{
+ struct ublox_data *data = ofono_modem_get_data(modem);
+
+ ofono_netreg_create(modem, OFONO_VENDOR_UBLOX, "atmodem",
+ data->aux);
+}
+
+static struct ofono_modem_driver ublox_driver = {
+ .name = "ublox",
+ .probe = ublox_probe,
+ .remove = ublox_remove,
+ .enable = ublox_enable,
+ .disable = ublox_disable,
+ .set_online = ublox_set_online,
+ .pre_sim = ublox_pre_sim,
+ .post_sim = ublox_post_sim,
+ .post_online = ublox_post_online,
+};
+
+static int ublox_init(void)
+{
+ return ofono_modem_driver_register(&ublox_driver);
+}
+
+static void ublox_exit(void)
+{
+ ofono_modem_driver_unregister(&ublox_driver);
+}
+
+OFONO_PLUGIN_DEFINE(ublox, "u-blox modem driver", VERSION,
+ OFONO_PLUGIN_PRIORITY_DEFAULT, ublox_init, ublox_exit)
--
1.7.10.4
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH 3/4] sim: query u-blox PIN retries with AT+UPINCNT
2014-07-03 10:32 [PATCH v3 0/4] Add a driver for u-blox modems Philip Paeps
2014-07-03 10:32 ` [PATCH 1/4] udevng: add detection logic " Philip Paeps
2014-07-03 10:32 ` [PATCH 2/4] plugins: new driver for u-blox SARA-U270 modems Philip Paeps
@ 2014-07-03 10:32 ` Philip Paeps
2014-07-03 10:32 ` [PATCH 4/4] atmodem: set the auth method for u-blox modems Philip Paeps
2014-07-08 13:59 ` [PATCH v3 0/4] Add a driver " Denis Kenzior
4 siblings, 0 replies; 6+ messages in thread
From: Philip Paeps @ 2014-07-03 10:32 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 2339 bytes --]
---
drivers/atmodem/sim.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 45 insertions(+)
diff --git a/drivers/atmodem/sim.c b/drivers/atmodem/sim.c
index 1fcdabb..c128e33 100644
--- a/drivers/atmodem/sim.c
+++ b/drivers/atmodem/sim.c
@@ -68,6 +68,7 @@ static const char *spic_prefix[] = { "+SPIC:", NULL };
static const char *pct_prefix[] = { "#PCT:", NULL };
static const char *pnnm_prefix[] = { "+PNNM:", NULL };
static const char *qpinc_prefix[] = { "+QPINC:", NULL };
+static const char *upincnt_prefix[] = { "+UPINCNT:", NULL };
static const char *none_prefix[] = { NULL };
static void at_crsm_info_cb(gboolean ok, GAtResult *result, gpointer user_data)
@@ -1013,6 +1014,45 @@ static void at_qpinc_cb(gboolean ok, GAtResult *result, gpointer user_data)
cb(&error, retries, cbd->data);
}
+static void upincnt_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+ struct cb_data *cbd = user_data;
+ ofono_sim_pin_retries_cb_t cb = cbd->cb;
+ const char *final = g_at_result_final_response(result);
+ GAtResultIter iter;
+ struct ofono_error error;
+ int retries[OFONO_SIM_PASSWORD_INVALID];
+ size_t i;
+ static enum ofono_sim_password_type password_types[] = {
+ OFONO_SIM_PASSWORD_SIM_PIN,
+ OFONO_SIM_PASSWORD_SIM_PIN2,
+ OFONO_SIM_PASSWORD_SIM_PUK,
+ OFONO_SIM_PASSWORD_SIM_PUK2,
+ };
+
+ decode_at_error(&error, final);
+
+ if (!ok) {
+ cb(&error, NULL, cbd->data);
+ return;
+ }
+
+ g_at_result_iter_init(&iter, result);
+
+ if (!g_at_result_iter_next(&iter, "+UPINCNT:"))
+ goto error;
+
+ BUILD_PIN_RETRIES_ARRAY(password_types, ARRAY_SIZE(password_types),
+ retries);
+
+ cb(&error, retries, cbd->data);
+
+ return;
+
+error:
+ CALLBACK_WITH_FAILURE(cb, NULL, cbd->data);
+}
+
static void at_pin_retries_query(struct ofono_sim *sim,
ofono_sim_pin_retries_cb_t cb,
void *data)
@@ -1079,6 +1119,11 @@ static void at_pin_retries_query(struct ofono_sim *sim,
at_qpinc_cb, cbd, g_free) > 0)
return;
break;
+ case OFONO_VENDOR_UBLOX:
+ if (g_at_chat_send(sd->chat, "AT+UPINCNT", upincnt_prefix,
+ upincnt_cb, cbd, g_free) > 0)
+ return;
+ break;
default:
if (g_at_chat_send(sd->chat, "AT+CPINR", cpinr_prefixes,
at_cpinr_cb, cbd, g_free) > 0)
--
1.7.10.4
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH 4/4] atmodem: set the auth method for u-blox modems
2014-07-03 10:32 [PATCH v3 0/4] Add a driver for u-blox modems Philip Paeps
` (2 preceding siblings ...)
2014-07-03 10:32 ` [PATCH 3/4] sim: query u-blox PIN retries with AT+UPINCNT Philip Paeps
@ 2014-07-03 10:32 ` Philip Paeps
2014-07-08 13:59 ` [PATCH v3 0/4] Add a driver " Denis Kenzior
4 siblings, 0 replies; 6+ messages in thread
From: Philip Paeps @ 2014-07-03 10:32 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 1494 bytes --]
---
drivers/atmodem/gprs-context.c | 31 ++++++++++++++++++++++++++++---
1 file changed, 28 insertions(+), 3 deletions(-)
diff --git a/drivers/atmodem/gprs-context.c b/drivers/atmodem/gprs-context.c
index be44443..f6e6c2e 100644
--- a/drivers/atmodem/gprs-context.c
+++ b/drivers/atmodem/gprs-context.c
@@ -282,9 +282,34 @@ static void at_gprs_activate_primary(struct ofono_gprs_context *gc,
len = snprintf(buf, sizeof(buf), "AT+CGDCONT=%u,\"IP\"", ctx->cid);
- if (ctx->apn)
- snprintf(buf + len, sizeof(buf) - len - 3, ",\"%s\"",
- ctx->apn);
+ if (ctx->apn) {
+ switch (gcd->vendor) {
+ case OFONO_VENDOR_UBLOX:
+ /*
+ * U-blox modems require a magic prefix to the APN to
+ * specify the authentication method to use in the
+ * network. See UBX-13002752 - R21.
+ *
+ * As the response of the read command omits this magic
+ * prefix, this is the least invasive place to set it.
+ */
+ switch (ctx->auth_method) {
+ case OFONO_GPRS_AUTH_METHOD_CHAP:
+ snprintf(buf + len, sizeof(buf) - len - 3,
+ ",\"CHAP:%s\"", ctx->apn);
+ break;
+ case OFONO_GPRS_AUTH_METHOD_PAP:
+ snprintf(buf + len, sizeof(buf) - len - 3,
+ ",\"PAP:%s\"", ctx->apn);
+ break;
+ }
+ break;
+ default:
+ snprintf(buf + len, sizeof(buf) - len - 3, ",\"%s\"",
+ ctx->apn);
+ break;
+ }
+ }
if (g_at_chat_send(gcd->chat, buf, none_prefix,
at_cgdcont_cb, gc, NULL) > 0)
--
1.7.10.4
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH v3 0/4] Add a driver for u-blox modems
2014-07-03 10:32 [PATCH v3 0/4] Add a driver for u-blox modems Philip Paeps
` (3 preceding siblings ...)
2014-07-03 10:32 ` [PATCH 4/4] atmodem: set the auth method for u-blox modems Philip Paeps
@ 2014-07-08 13:59 ` Denis Kenzior
4 siblings, 0 replies; 6+ messages in thread
From: Denis Kenzior @ 2014-07-08 13:59 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 866 bytes --]
Hi Philip,
On 07/03/2014 05:32 AM, Philip Paeps wrote:
> Changes since v2:
>
> o Rebased on master 6df64cd
> o Used none_prefix consistently
>
>
> Philip Paeps (4):
> udevng: add detection logic for u-blox modems
> plugins: new driver for u-blox SARA-U270 modems
> sim: query u-blox PIN retries with AT+UPINCNT
> atmodem: set the auth method for u-blox modems
>
> Makefile.am | 3 +
> drivers/atmodem/gprs-context.c | 31 ++++-
> drivers/atmodem/sim.c | 45 ++++++
> plugins/ublox.c | 293 ++++++++++++++++++++++++++++++++++++++++
> plugins/udevng.c | 42 ++++++
> 5 files changed, 411 insertions(+), 3 deletions(-)
> create mode 100644 plugins/ublox.c
>
I went ahead an applied all patches in this series with a small fix
afterward.
Regards,
-Denis
^ permalink raw reply [flat|nested] 6+ messages in thread