* [PATCH 1/6] test: add scripts for setting frequency band
@ 2010-12-09 16:43 Lucas De Marchi
2010-12-09 16:43 ` [PATCH 2/6] huaweimodem: Add support for radio settings Lucas De Marchi
` (5 more replies)
0 siblings, 6 replies; 9+ messages in thread
From: Lucas De Marchi @ 2010-12-09 16:43 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 2210 bytes --]
---
Makefile.am | 4 +++-
test/set-gsm-band | 25 +++++++++++++++++++++++++
test/set-umts-band | 25 +++++++++++++++++++++++++
3 files changed, 53 insertions(+), 1 deletions(-)
create mode 100755 test/set-gsm-band
create mode 100755 test/set-umts-band
diff --git a/Makefile.am b/Makefile.am
index cdb3166..881204a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -423,7 +423,9 @@ test_scripts = test/backtrace \
test/test-push-notification \
test/test-smart-messaging \
test/send-vcard \
- test/set-tty
+ test/set-tty \
+ test/set-gsm-band \
+ test/set-umts-band
if TEST
testdir = $(pkglibdir)/test
diff --git a/test/set-gsm-band b/test/set-gsm-band
new file mode 100755
index 0000000..9586d81
--- /dev/null
+++ b/test/set-gsm-band
@@ -0,0 +1,25 @@
+#!/usr/bin/python
+
+import dbus
+import sys
+
+bus = dbus.SystemBus()
+
+if len(sys.argv) == 3:
+ path = sys.argv[1]
+ band = sys.argv[2]
+elif len(sys.argv) == 2:
+ manager = dbus.Interface(bus.get_object('org.ofono', '/'),
+ 'org.ofono.Manager')
+ modems = manager.GetModems()
+ path = modems[0][0]
+ band = sys.argv[1]
+else:
+ print "%s [PATH] band" % (sys.argv[0])
+ exit(1)
+
+print "Setting gsm band for modem %s..." % path
+radiosettings = dbus.Interface(bus.get_object('org.ofono', path),
+ 'org.ofono.RadioSettings')
+
+radiosettings.SetProperty("GsmBand", band);
diff --git a/test/set-umts-band b/test/set-umts-band
new file mode 100755
index 0000000..510a40b
--- /dev/null
+++ b/test/set-umts-band
@@ -0,0 +1,25 @@
+#!/usr/bin/python
+
+import dbus
+import sys
+
+bus = dbus.SystemBus()
+
+if len(sys.argv) == 3:
+ path = sys.argv[1]
+ band = sys.argv[2]
+elif len(sys.argv) == 2:
+ manager = dbus.Interface(bus.get_object('org.ofono', '/'),
+ 'org.ofono.Manager')
+ modems = manager.GetModems()
+ path = modems[0][0]
+ band = sys.argv[1]
+else:
+ print "%s [PATH] band" % (sys.argv[0])
+ exit(1)
+
+print "Setting umts band for modem %s..." % path
+radiosettings = dbus.Interface(bus.get_object('org.ofono', path),
+ 'org.ofono.RadioSettings')
+
+radiosettings.SetProperty("UmtsBand", band);
--
1.7.3.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/6] huaweimodem: Add support for radio settings
2010-12-09 16:43 [PATCH 1/6] test: add scripts for setting frequency band Lucas De Marchi
@ 2010-12-09 16:43 ` Lucas De Marchi
2010-12-21 22:37 ` Denis Kenzior
2010-12-09 16:43 ` [PATCH 3/6] huawei: " Lucas De Marchi
` (4 subsequent siblings)
5 siblings, 1 reply; 9+ messages in thread
From: Lucas De Marchi @ 2010-12-09 16:43 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 7744 bytes --]
---
Makefile.am | 3 +-
drivers/huaweimodem/huaweimodem.c | 2 +
drivers/huaweimodem/huaweimodem.h | 3 +
drivers/huaweimodem/radio-settings.c | 218 ++++++++++++++++++++++++++++++++++
4 files changed, 225 insertions(+), 1 deletions(-)
create mode 100644 drivers/huaweimodem/radio-settings.c
diff --git a/Makefile.am b/Makefile.am
index 881204a..1768c57 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -180,7 +180,8 @@ builtin_sources += drivers/atmodem/atutil.h \
drivers/huaweimodem/huaweimodem.c \
drivers/huaweimodem/voicecall.c \
drivers/huaweimodem/audio-settings.c \
- drivers/huaweimodem/gprs-context.c
+ drivers/huaweimodem/gprs-context.c \
+ drivers/huaweimodem/radio-settings.c
builtin_modules += calypsomodem
builtin_sources += drivers/atmodem/atutil.h \
diff --git a/drivers/huaweimodem/huaweimodem.c b/drivers/huaweimodem/huaweimodem.c
index c8b6522..8097a9c 100644
--- a/drivers/huaweimodem/huaweimodem.c
+++ b/drivers/huaweimodem/huaweimodem.c
@@ -36,6 +36,7 @@ static int huaweimodem_init(void)
{
huawei_voicecall_init();
huawei_audio_settings_init();
+ huawei_radio_settings_init();
huawei_gprs_context_init();
return 0;
@@ -44,6 +45,7 @@ static int huaweimodem_init(void)
static void huaweimodem_exit(void)
{
huawei_gprs_context_exit();
+ huawei_radio_settings_exit();
huawei_audio_settings_exit();
huawei_voicecall_exit();
}
diff --git a/drivers/huaweimodem/huaweimodem.h b/drivers/huaweimodem/huaweimodem.h
index 03d52ef..596aa08 100644
--- a/drivers/huaweimodem/huaweimodem.h
+++ b/drivers/huaweimodem/huaweimodem.h
@@ -27,5 +27,8 @@ extern void huawei_voicecall_exit();
extern void huawei_audio_settings_init();
extern void huawei_audio_settings_exit();
+extern void huawei_radio_settings_init();
+extern void huawei_radio_settings_exit();
+
extern void huawei_gprs_context_init();
extern void huawei_gprs_context_exit();
diff --git a/drivers/huaweimodem/radio-settings.c b/drivers/huaweimodem/radio-settings.c
new file mode 100644
index 0000000..30961da
--- /dev/null
+++ b/drivers/huaweimodem/radio-settings.c
@@ -0,0 +1,218 @@
+/*
+ *
+ * oFono - Open Source Telephony
+ *
+ * Copyright (C) 2010 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#define _GNU_SOURCE
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+
+#include <glib.h>
+
+#include <ofono/log.h>
+#include <ofono/modem.h>
+#include <ofono/radio-settings.h>
+
+#include "gatchat.h"
+#include "gatresult.h"
+
+#include "huaweimodem.h"
+
+static const char *none_prefix[] = { NULL };
+static const char *syscfg_prefix[] = { "^SYSCFG:", NULL };
+
+struct radio_settings_data {
+ GAtChat *chat;
+};
+
+static void syscfg_query_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+ struct cb_data *cbd = user_data;
+ ofono_radio_settings_rat_mode_query_cb_t cb = cbd->cb;
+ enum ofono_radio_access_mode mode;
+ struct ofono_error error;
+ GAtResultIter iter;
+ int value;
+
+ decode_at_error(&error, g_at_result_final_response(result));
+
+ if (!ok) {
+ cb(&error, -1, cbd->data);
+ return;
+ }
+
+ g_at_result_iter_init(&iter, result);
+
+ if (g_at_result_iter_next(&iter, "^SYSCFG:") == FALSE)
+ goto error;
+
+ if (g_at_result_iter_next_number(&iter, &value) == FALSE)
+ goto error;
+
+ switch (value) {
+ case 2:
+ mode = OFONO_RADIO_ACCESS_MODE_ANY;
+ break;
+ case 13:
+ mode = OFONO_RADIO_ACCESS_MODE_GSM;
+ break;
+ case 14:
+ mode = OFONO_RADIO_ACCESS_MODE_UMTS;
+ break;
+ default:
+ CALLBACK_WITH_FAILURE(cb, -1, cbd->data);
+ return;
+ }
+
+ cb(&error, mode, cbd->data);
+
+ return;
+
+error:
+ CALLBACK_WITH_FAILURE(cb, -1, cbd->data);
+}
+
+static void huawei_query_rat_mode(struct ofono_radio_settings *rs,
+ ofono_radio_settings_rat_mode_query_cb_t cb, void *data)
+{
+ struct radio_settings_data *rsd = ofono_radio_settings_get_data(rs);
+ struct cb_data *cbd = cb_data_new(cb, data);
+
+ if (g_at_chat_send(rsd->chat, "AT^SYSCFG?", syscfg_prefix,
+ syscfg_query_cb, cbd, g_free) == 0) {
+ CALLBACK_WITH_FAILURE(cb, -1, data);
+ g_free(cbd);
+ }
+}
+
+static void syscfg_modify_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+ struct cb_data *cbd = user_data;
+ ofono_radio_settings_rat_mode_set_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 huawei_set_rat_mode(struct ofono_radio_settings *rs,
+ enum ofono_radio_access_mode mode,
+ ofono_radio_settings_rat_mode_set_cb_t cb,
+ void *data)
+{
+ struct radio_settings_data *rsd = ofono_radio_settings_get_data(rs);
+ struct cb_data *cbd = cb_data_new(cb, data);
+ char buf[40];
+ unsigned int value = 2, acq_order = 0;
+
+ switch (mode) {
+ case OFONO_RADIO_ACCESS_MODE_ANY:
+ value = 2;
+ acq_order = 0;
+ break;
+ case OFONO_RADIO_ACCESS_MODE_GSM:
+ value = 13;
+ acq_order = 1;
+ break;
+ case OFONO_RADIO_ACCESS_MODE_UMTS:
+ value = 14;
+ acq_order = 2;
+ break;
+ case OFONO_RADIO_ACCESS_MODE_LTE:
+ goto error;
+ }
+
+ snprintf(buf, sizeof(buf), "AT^SYSCFG=%u,%u,3FFFFFFF,2,4",
+ value, acq_order);
+
+ if (g_at_chat_send(rsd->chat, buf, none_prefix,
+ syscfg_modify_cb, cbd, g_free) > 0)
+ return;
+
+error:
+ CALLBACK_WITH_FAILURE(cb, data);
+ g_free(cbd);
+}
+
+static void syscfg_support_cb(gboolean ok, GAtResult *result,
+ gpointer user_data)
+{
+ struct ofono_radio_settings *rs = user_data;
+
+ if (!ok) {
+ ofono_radio_settings_remove(rs);
+ return;
+ }
+
+ ofono_radio_settings_register(rs);
+}
+
+static int huawei_radio_settings_probe(struct ofono_radio_settings *rs,
+ unsigned int vendor, void *data)
+{
+ GAtChat *chat = data;
+ struct radio_settings_data *rsd;
+
+ rsd = g_try_new0(struct radio_settings_data, 1);
+ if (rsd == NULL)
+ return -ENOMEM;
+
+ rsd->chat = g_at_chat_clone(chat);
+
+ ofono_radio_settings_set_data(rs, rsd);
+
+ g_at_chat_send(rsd->chat, "AT^SYSCFG=?", syscfg_prefix,
+ syscfg_support_cb, rs, NULL);
+
+ return 0;
+}
+
+static void huawei_radio_settings_remove(struct ofono_radio_settings *rs)
+{
+ struct radio_settings_data *rsd = ofono_radio_settings_get_data(rs);
+
+ ofono_radio_settings_set_data(rs, NULL);
+
+ g_at_chat_unref(rsd->chat);
+ g_free(rsd);
+}
+
+static struct ofono_radio_settings_driver driver = {
+ .name = "huaweimodem",
+ .probe = huawei_radio_settings_probe,
+ .remove = huawei_radio_settings_remove,
+ .query_rat_mode = huawei_query_rat_mode,
+ .set_rat_mode = huawei_set_rat_mode,
+};
+
+void huawei_radio_settings_init()
+{
+ ofono_radio_settings_driver_register(&driver);
+}
+
+void huawei_radio_settings_exit()
+{
+ ofono_radio_settings_driver_unregister(&driver);
+}
--
1.7.3.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/6] huawei: Add support for radio settings
2010-12-09 16:43 [PATCH 1/6] test: add scripts for setting frequency band Lucas De Marchi
2010-12-09 16:43 ` [PATCH 2/6] huaweimodem: Add support for radio settings Lucas De Marchi
@ 2010-12-09 16:43 ` Lucas De Marchi
2010-12-21 22:38 ` Denis Kenzior
2010-12-09 16:43 ` [PATCH 4/6] huaweimodem: cache mode in " Lucas De Marchi
` (3 subsequent siblings)
5 siblings, 1 reply; 9+ messages in thread
From: Lucas De Marchi @ 2010-12-09 16:43 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 933 bytes --]
---
plugins/huawei.c | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/plugins/huawei.c b/plugins/huawei.c
index 25dfaca..3c58c7f 100644
--- a/plugins/huawei.c
+++ b/plugins/huawei.c
@@ -43,6 +43,7 @@
#include <ofono/gprs.h>
#include <ofono/gprs-context.h>
#include <ofono/audio-settings.h>
+#include <ofono/radio-settings.h>
#include <ofono/voicecall.h>
#include <ofono/call-forwarding.h>
#include <ofono/call-settings.h>
@@ -629,6 +630,9 @@ static void huawei_post_online(struct ofono_modem *modem)
ofono_ussd_create(modem, OFONO_VENDOR_QUALCOMM_MSM,
"atmodem", data->pcui);
+ ofono_radio_settings_create(modem, OFONO_VENDOR_HUAWEI, "huaweimodem",
+ data->pcui);
+
if (data->sim_state == HUAWEI_SIM_STATE_VALID ||
data->sim_state == HUAWEI_SIM_STATE_INVALID_CS) {
data->gprs = ofono_gprs_create(modem, 0, "atmodem", data->pcui);
--
1.7.3.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 4/6] huaweimodem: cache mode in radio settings
2010-12-09 16:43 [PATCH 1/6] test: add scripts for setting frequency band Lucas De Marchi
2010-12-09 16:43 ` [PATCH 2/6] huaweimodem: Add support for radio settings Lucas De Marchi
2010-12-09 16:43 ` [PATCH 3/6] huawei: " Lucas De Marchi
@ 2010-12-09 16:43 ` Lucas De Marchi
2010-12-09 16:43 ` [PATCH 5/6] huaweimodem: always cache ^SYSCFG values when supported Lucas De Marchi
` (2 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Lucas De Marchi @ 2010-12-09 16:43 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 4055 bytes --]
Save the current and pending modes in radio_settings_data, so we can
access them later. This patch also splits the parsing of ^SYSCFG
response from the callback call. Then, it's possible to have more
properties that use the same command as is the case of frequency band
selection.
---
drivers/huaweimodem/radio-settings.c | 68 ++++++++++++++++++++++------------
1 files changed, 44 insertions(+), 24 deletions(-)
diff --git a/drivers/huaweimodem/radio-settings.c b/drivers/huaweimodem/radio-settings.c
index 30961da..38c0f3d 100644
--- a/drivers/huaweimodem/radio-settings.c
+++ b/drivers/huaweimodem/radio-settings.c
@@ -45,53 +45,64 @@ static const char *syscfg_prefix[] = { "^SYSCFG:", NULL };
struct radio_settings_data {
GAtChat *chat;
+ enum ofono_radio_access_mode mode;
+ struct {
+ enum ofono_radio_access_mode mode;
+ } pending;
};
-static void syscfg_query_cb(gboolean ok, GAtResult *result, gpointer user_data)
+static ofono_bool_t syscfg_query_parse(struct radio_settings_data *rsd,
+ GAtResult *result)
{
- struct cb_data *cbd = user_data;
- ofono_radio_settings_rat_mode_query_cb_t cb = cbd->cb;
- enum ofono_radio_access_mode mode;
- struct ofono_error error;
GAtResultIter iter;
int value;
- decode_at_error(&error, g_at_result_final_response(result));
-
- if (!ok) {
- cb(&error, -1, cbd->data);
- return;
- }
-
g_at_result_iter_init(&iter, result);
if (g_at_result_iter_next(&iter, "^SYSCFG:") == FALSE)
- goto error;
+ return FALSE;
if (g_at_result_iter_next_number(&iter, &value) == FALSE)
- goto error;
+ return FALSE;
switch (value) {
case 2:
- mode = OFONO_RADIO_ACCESS_MODE_ANY;
+ rsd->mode = OFONO_RADIO_ACCESS_MODE_ANY;
break;
case 13:
- mode = OFONO_RADIO_ACCESS_MODE_GSM;
+ rsd->mode = OFONO_RADIO_ACCESS_MODE_GSM;
break;
case 14:
- mode = OFONO_RADIO_ACCESS_MODE_UMTS;
+ rsd->mode = OFONO_RADIO_ACCESS_MODE_UMTS;
break;
default:
- CALLBACK_WITH_FAILURE(cb, -1, cbd->data);
- return;
+ return FALSE;
}
- cb(&error, mode, cbd->data);
+ return TRUE;
+}
+
+static void huawei_query_rat_mode_cb(gboolean ok, GAtResult *result,
+ gpointer user_data)
+{
+ struct cb_data *cbd = user_data;
+ ofono_radio_settings_rat_mode_query_cb_t cb = cbd->cb;
+ struct radio_settings_data *rsd = cbd->user;
+ struct ofono_error error;
- return;
+ decode_at_error(&error, g_at_result_final_response(result));
-error:
- CALLBACK_WITH_FAILURE(cb, -1, cbd->data);
+ if (!ok) {
+ cb(&error, -1, cbd->data);
+ return;
+ }
+
+ if (!syscfg_query_parse(rsd, result)) {
+ CALLBACK_WITH_FAILURE(cb, -1, cbd->data);
+ return;
+ }
+
+ cb(&error, rsd->mode, cbd->data);
}
static void huawei_query_rat_mode(struct ofono_radio_settings *rs,
@@ -100,8 +111,10 @@ static void huawei_query_rat_mode(struct ofono_radio_settings *rs,
struct radio_settings_data *rsd = ofono_radio_settings_get_data(rs);
struct cb_data *cbd = cb_data_new(cb, data);
+ cbd->user = rsd;
+
if (g_at_chat_send(rsd->chat, "AT^SYSCFG?", syscfg_prefix,
- syscfg_query_cb, cbd, g_free) == 0) {
+ huawei_query_rat_mode_cb, cbd, g_free) == 0) {
CALLBACK_WITH_FAILURE(cb, -1, data);
g_free(cbd);
}
@@ -111,8 +124,12 @@ static void syscfg_modify_cb(gboolean ok, GAtResult *result, gpointer user_data)
{
struct cb_data *cbd = user_data;
ofono_radio_settings_rat_mode_set_cb_t cb = cbd->cb;
+ struct radio_settings_data *rsd = cbd->user;
struct ofono_error error;
+ if (ok)
+ rsd->mode = rsd->pending.mode;
+
decode_at_error(&error, g_at_result_final_response(result));
cb(&error, cbd->data);
}
@@ -147,6 +164,9 @@ static void huawei_set_rat_mode(struct ofono_radio_settings *rs,
snprintf(buf, sizeof(buf), "AT^SYSCFG=%u,%u,3FFFFFFF,2,4",
value, acq_order);
+ rsd->pending.mode = mode;
+ cbd->user = rsd;
+
if (g_at_chat_send(rsd->chat, buf, none_prefix,
syscfg_modify_cb, cbd, g_free) > 0)
return;
--
1.7.3.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 5/6] huaweimodem: always cache ^SYSCFG values when supported
2010-12-09 16:43 [PATCH 1/6] test: add scripts for setting frequency band Lucas De Marchi
` (2 preceding siblings ...)
2010-12-09 16:43 ` [PATCH 4/6] huaweimodem: cache mode in " Lucas De Marchi
@ 2010-12-09 16:43 ` Lucas De Marchi
2010-12-09 16:43 ` [PATCH 6/6] huaweimodem: add frequency band selection support Lucas De Marchi
2010-12-21 22:37 ` [PATCH 1/6] test: add scripts for setting frequency band Denis Kenzior
5 siblings, 0 replies; 9+ messages in thread
From: Lucas De Marchi @ 2010-12-09 16:43 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 1623 bytes --]
When modem is supported, we need to cache the current values returned by
^SYSCFG command early on initialization. This will be used in future
for frequency band selection that depends on the value of 'mode' property.
---
drivers/huaweimodem/radio-settings.c | 21 ++++++++++++++++-----
1 files changed, 16 insertions(+), 5 deletions(-)
diff --git a/drivers/huaweimodem/radio-settings.c b/drivers/huaweimodem/radio-settings.c
index 38c0f3d..1281d8b 100644
--- a/drivers/huaweimodem/radio-settings.c
+++ b/drivers/huaweimodem/radio-settings.c
@@ -180,13 +180,24 @@ static void syscfg_support_cb(gboolean ok, GAtResult *result,
gpointer user_data)
{
struct ofono_radio_settings *rs = user_data;
+ struct radio_settings_data *rsd = ofono_radio_settings_get_data(rs);
- if (!ok) {
- ofono_radio_settings_remove(rs);
- return;
- }
+ if (!ok)
+ goto error_not_supported;
+
+ if (!syscfg_query_parse(rsd, result))
+ goto error_parsing;
ofono_radio_settings_register(rs);
+
+ return;
+
+error_parsing:
+ ofono_warn("Radio settings is supported, but it was not " \
+ "possible to parse modem response");
+
+error_not_supported:
+ ofono_radio_settings_remove(rs);
}
static int huawei_radio_settings_probe(struct ofono_radio_settings *rs,
@@ -203,7 +214,7 @@ static int huawei_radio_settings_probe(struct ofono_radio_settings *rs,
ofono_radio_settings_set_data(rs, rsd);
- g_at_chat_send(rsd->chat, "AT^SYSCFG=?", syscfg_prefix,
+ g_at_chat_send(rsd->chat, "AT^SYSCFG?", syscfg_prefix,
syscfg_support_cb, rs, NULL);
return 0;
--
1.7.3.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 6/6] huaweimodem: add frequency band selection support
2010-12-09 16:43 [PATCH 1/6] test: add scripts for setting frequency band Lucas De Marchi
` (3 preceding siblings ...)
2010-12-09 16:43 ` [PATCH 5/6] huaweimodem: always cache ^SYSCFG values when supported Lucas De Marchi
@ 2010-12-09 16:43 ` Lucas De Marchi
2010-12-21 22:37 ` [PATCH 1/6] test: add scripts for setting frequency band Denis Kenzior
5 siblings, 0 replies; 9+ messages in thread
From: Lucas De Marchi @ 2010-12-09 16:43 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 6972 bytes --]
---
drivers/huaweimodem/radio-settings.c | 172 ++++++++++++++++++++++++++++++++-
1 files changed, 166 insertions(+), 6 deletions(-)
diff --git a/drivers/huaweimodem/radio-settings.c b/drivers/huaweimodem/radio-settings.c
index 1281d8b..d72a82c 100644
--- a/drivers/huaweimodem/radio-settings.c
+++ b/drivers/huaweimodem/radio-settings.c
@@ -43,16 +43,122 @@
static const char *none_prefix[] = { NULL };
static const char *syscfg_prefix[] = { "^SYSCFG:", NULL };
+static const unsigned int HUAWEI_BAND_ANY = 0x3FFFFFFF;
+
struct radio_settings_data {
GAtChat *chat;
enum ofono_radio_access_mode mode;
+ enum ofono_radio_band_gsm band_gsm;
+ enum ofono_radio_band_umts band_umts;
struct {
enum ofono_radio_access_mode mode;
} pending;
};
-static ofono_bool_t syscfg_query_parse(struct radio_settings_data *rsd,
- GAtResult *result)
+static unsigned int band_gsm_to_huawei(enum ofono_radio_band_gsm band)
+{
+ switch (band) {
+ case OFONO_RADIO_BAND_GSM_ANY:
+ return HUAWEI_BAND_ANY;
+ case OFONO_RADIO_BAND_GSM_850:
+ return 0x80000;
+ case OFONO_RADIO_BAND_GSM_900P:
+ return 0x200;
+ case OFONO_RADIO_BAND_GSM_900E:
+ return 0x100;
+ case OFONO_RADIO_BAND_GSM_1800:
+ return 0x80;
+ case OFONO_RADIO_BAND_GSM_1900:
+ return 0x200000;
+ default:
+ return 0;
+ }
+}
+
+static enum ofono_radio_band_gsm band_gsm_from_huawei(unsigned int band)
+{
+ switch(band) {
+ case 0x80000:
+ return OFONO_RADIO_BAND_GSM_850;
+ case 0x200:
+ return OFONO_RADIO_BAND_GSM_900P;
+ case 0x100:
+ return OFONO_RADIO_BAND_GSM_900E;
+ case 0x80:
+ return OFONO_RADIO_BAND_GSM_1800;
+ case 0x200000:
+ return OFONO_RADIO_BAND_GSM_1900;
+ default:
+ return OFONO_RADIO_BAND_GSM_ANY;
+ }
+}
+
+static unsigned int band_umts_to_huawei(enum ofono_radio_band_umts band)
+{
+ switch (band) {
+ case OFONO_RADIO_BAND_UMTS_ANY:
+ return HUAWEI_BAND_ANY;
+ case OFONO_RADIO_BAND_UMTS_850:
+ return 0x4000000;
+ case OFONO_RADIO_BAND_UMTS_900:
+ return 0x20000;
+ case OFONO_RADIO_BAND_UMTS_1900:
+ return 0x800000;
+ case OFONO_RADIO_BAND_UMTS_2100:
+ return 0x400000;
+ default:
+ return 0;
+ }
+}
+
+static enum ofono_radio_band_umts band_umts_from_huawei(unsigned int band)
+{
+ switch(band) {
+ case 0x4000000:
+ return OFONO_RADIO_BAND_UMTS_850;
+ case 0x20000:
+ return OFONO_RADIO_BAND_UMTS_900;
+ case 0x800000:
+ return OFONO_RADIO_BAND_UMTS_1900;
+ case 0x400000:
+ return OFONO_RADIO_BAND_UMTS_2100;
+ default:
+ return OFONO_RADIO_BAND_UMTS_ANY;
+ }
+}
+
+static ofono_bool_t syscfg_query_parse_band(struct radio_settings_data *rsd,
+ GAtResult *result)
+{
+ GAtResultIter iter;
+ int mode, acq_order, len;
+ unsigned int band;
+ const guint8 *band_str;
+
+ g_at_result_iter_init(&iter, result);
+
+ if (g_at_result_iter_next(&iter, "^SYSCFG:") == FALSE)
+ return FALSE;
+
+ if (g_at_result_iter_next_number(&iter, &mode) == FALSE)
+ return FALSE;
+
+ if (g_at_result_iter_next_number(&iter, &acq_order) == FALSE)
+ return FALSE;
+
+ if (g_at_result_iter_next_hexstring(&iter, &band_str, &len) == FALSE)
+ return FALSE;
+
+ sscanf((const char *) band_str, "%x", &band);
+
+ rsd->band_gsm = band_gsm_from_huawei(band);
+ rsd->band_umts = band_umts_from_huawei(band);
+
+ return TRUE;
+}
+
+static ofono_bool_t syscfg_query_parse_mode(struct radio_settings_data *rsd,
+ GAtResult *result)
{
GAtResultIter iter;
int value;
@@ -82,6 +188,14 @@ static ofono_bool_t syscfg_query_parse(struct radio_settings_data *rsd,
return TRUE;
}
+static void huawei_query_band(struct ofono_radio_settings *rs,
+ ofono_radio_settings_band_query_cb_t cb, void *data)
+{
+ struct radio_settings_data *rsd = ofono_radio_settings_get_data(rs);
+
+ CALLBACK_WITH_SUCCESS(cb, rsd->band_gsm, rsd->band_umts, data);
+}
+
static void huawei_query_rat_mode_cb(gboolean ok, GAtResult *result,
gpointer user_data)
{
@@ -97,7 +211,7 @@ static void huawei_query_rat_mode_cb(gboolean ok, GAtResult *result,
return;
}
- if (!syscfg_query_parse(rsd, result)) {
+ if (!syscfg_query_parse_mode(rsd, result)) {
CALLBACK_WITH_FAILURE(cb, -1, cbd->data);
return;
}
@@ -143,6 +257,7 @@ static void huawei_set_rat_mode(struct ofono_radio_settings *rs,
struct cb_data *cbd = cb_data_new(cb, data);
char buf[40];
unsigned int value = 2, acq_order = 0;
+ unsigned int band = HUAWEI_BAND_ANY;
switch (mode) {
case OFONO_RADIO_ACCESS_MODE_ANY:
@@ -152,17 +267,19 @@ static void huawei_set_rat_mode(struct ofono_radio_settings *rs,
case OFONO_RADIO_ACCESS_MODE_GSM:
value = 13;
acq_order = 1;
+ band = band_gsm_to_huawei(rsd->band_gsm);
break;
case OFONO_RADIO_ACCESS_MODE_UMTS:
value = 14;
acq_order = 2;
+ band = band_umts_to_huawei(rsd->band_umts);
break;
case OFONO_RADIO_ACCESS_MODE_LTE:
goto error;
}
- snprintf(buf, sizeof(buf), "AT^SYSCFG=%u,%u,3FFFFFFF,2,4",
- value, acq_order);
+ snprintf(buf, sizeof(buf), "AT^SYSCFG=%u,%u,%x,2,4",
+ value, acq_order, band);
rsd->pending.mode = mode;
cbd->user = rsd;
@@ -176,6 +293,44 @@ error:
g_free(cbd);
}
+static void huawei_set_band(struct ofono_radio_settings *rs,
+ enum ofono_radio_band_gsm band_gsm,
+ enum ofono_radio_band_umts band_umts,
+ ofono_radio_settings_band_set_cb_t cb, void *data)
+{
+ struct radio_settings_data *rsd = ofono_radio_settings_get_data(rs);
+ ofono_bool_t change_mode = FALSE;
+
+ if (!band_gsm_to_huawei(band_gsm))
+ goto error;
+
+ if (!band_umts_to_huawei(band_umts))
+ goto error;
+
+ if (rsd->mode == OFONO_RADIO_ACCESS_MODE_ANY ||
+ (rsd->mode == OFONO_RADIO_ACCESS_MODE_GSM &&
+ rsd->band_gsm != band_gsm) ||
+ (rsd->mode == OFONO_RADIO_ACCESS_MODE_UMTS &&
+ rsd->band_umts != band_umts))
+ change_mode = TRUE;
+
+ rsd->band_gsm = band_gsm;
+ rsd->band_umts = band_umts;
+
+ if (!change_mode) {
+ CALLBACK_WITH_SUCCESS(cb, data);
+
+ return;
+ }
+
+ huawei_set_rat_mode(rs, rsd->mode, cb, data);
+
+ return;
+
+error:
+ CALLBACK_WITH_FAILURE(cb, data);
+}
+
static void syscfg_support_cb(gboolean ok, GAtResult *result,
gpointer user_data)
{
@@ -185,7 +340,10 @@ static void syscfg_support_cb(gboolean ok, GAtResult *result,
if (!ok)
goto error_not_supported;
- if (!syscfg_query_parse(rsd, result))
+ if (!syscfg_query_parse_mode(rsd, result))
+ goto error_parsing;
+
+ if (!syscfg_query_parse_band(rsd, result))
goto error_parsing;
ofono_radio_settings_register(rs);
@@ -236,6 +394,8 @@ static struct ofono_radio_settings_driver driver = {
.remove = huawei_radio_settings_remove,
.query_rat_mode = huawei_query_rat_mode,
.set_rat_mode = huawei_set_rat_mode,
+ .query_band = huawei_query_band,
+ .set_band = huawei_set_band,
};
void huawei_radio_settings_init()
--
1.7.3.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/6] test: add scripts for setting frequency band
2010-12-09 16:43 [PATCH 1/6] test: add scripts for setting frequency band Lucas De Marchi
` (4 preceding siblings ...)
2010-12-09 16:43 ` [PATCH 6/6] huaweimodem: add frequency band selection support Lucas De Marchi
@ 2010-12-21 22:37 ` Denis Kenzior
5 siblings, 0 replies; 9+ messages in thread
From: Denis Kenzior @ 2010-12-21 22:37 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 411 bytes --]
Hi Lucas,
On 12/09/2010 10:43 AM, Lucas De Marchi wrote:
> ---
> Makefile.am | 4 +++-
> test/set-gsm-band | 25 +++++++++++++++++++++++++
> test/set-umts-band | 25 +++++++++++++++++++++++++
> 3 files changed, 53 insertions(+), 1 deletions(-)
> create mode 100755 test/set-gsm-band
> create mode 100755 test/set-umts-band
>
Patch has been applied, thanks.
Regards,
-Denis
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/6] huaweimodem: Add support for radio settings
2010-12-09 16:43 ` [PATCH 2/6] huaweimodem: Add support for radio settings Lucas De Marchi
@ 2010-12-21 22:37 ` Denis Kenzior
0 siblings, 0 replies; 9+ messages in thread
From: Denis Kenzior @ 2010-12-21 22:37 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 476 bytes --]
Hi Lucas,
On 12/09/2010 10:43 AM, Lucas De Marchi wrote:
> ---
> Makefile.am | 3 +-
> drivers/huaweimodem/huaweimodem.c | 2 +
> drivers/huaweimodem/huaweimodem.h | 3 +
> drivers/huaweimodem/radio-settings.c | 218 ++++++++++++++++++++++++++++++++++
> 4 files changed, 225 insertions(+), 1 deletions(-)
> create mode 100644 drivers/huaweimodem/radio-settings.c
>
Patch has been applied, thanks.
Regards,
-Denis
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 3/6] huawei: Add support for radio settings
2010-12-09 16:43 ` [PATCH 3/6] huawei: " Lucas De Marchi
@ 2010-12-21 22:38 ` Denis Kenzior
0 siblings, 0 replies; 9+ messages in thread
From: Denis Kenzior @ 2010-12-21 22:38 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 213 bytes --]
Hi Lucas,
On 12/09/2010 10:43 AM, Lucas De Marchi wrote:
> ---
> plugins/huawei.c | 4 ++++
> 1 files changed, 4 insertions(+), 0 deletions(-)
>
Patch has been applied, thanks.
Regards,
-Denis
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2010-12-21 22:38 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-12-09 16:43 [PATCH 1/6] test: add scripts for setting frequency band Lucas De Marchi
2010-12-09 16:43 ` [PATCH 2/6] huaweimodem: Add support for radio settings Lucas De Marchi
2010-12-21 22:37 ` Denis Kenzior
2010-12-09 16:43 ` [PATCH 3/6] huawei: " Lucas De Marchi
2010-12-21 22:38 ` Denis Kenzior
2010-12-09 16:43 ` [PATCH 4/6] huaweimodem: cache mode in " Lucas De Marchi
2010-12-09 16:43 ` [PATCH 5/6] huaweimodem: always cache ^SYSCFG values when supported Lucas De Marchi
2010-12-09 16:43 ` [PATCH 6/6] huaweimodem: add frequency band selection support Lucas De Marchi
2010-12-21 22:37 ` [PATCH 1/6] test: add scripts for setting frequency band Denis Kenzior
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.