Re: omap4-droid4: voice call support was Re: [PATCHv5,5/5] ARM: dts: omap4-droid4: add soundcard

From: Pavel Machek
Date: Fri Mar 30 2018 - 11:37:37 EST


Hi!

> > >> Great, good to hear that :)
> > >
> > > I also got ofonod to work, with rather crazy hacks. But I now have
> > > incoming/outgoing calls with GUI :-).
> >
> > Would you mind sharing those hacks - I would like to play around with
> > ofonod as well. Maybe I can help with a way forward.
>
> Yeah that would be fun to play with :)

Ok, I thought I should clean them up first, but hey...

sudo emacs /etc/udev/rules.d/55-modem.rules
KERNEL=="ttyUSB4", ENV{OFONO_DRIVER}="g1"

sudo udevadm trigger

And now, the crazy hack follows. Note I'm using AT interface -- which
is probably not good idea.

Anyway, network/signal strength is detected, and calls seem to work.

diff --git a/drivers/atmodem/sms.c b/drivers/atmodem/sms.c
index 68b89862..3a9f4bc0 100644
--- a/drivers/atmodem/sms.c
+++ b/drivers/atmodem/sms.c
@@ -440,6 +440,8 @@ static void at_cmt_notify(GAtResult *result, gpointer user_data)
if (data->vendor != OFONO_VENDOR_SIMCOM)
at_ack_delivery(sms);

+ return;
+
err:
ofono_error("Unable to parse CMT notification");
}
diff --git a/plugins/g1.c b/plugins/g1.c
index d915a565..dd4e735d 100644
--- a/plugins/g1.c
+++ b/plugins/g1.c
@@ -60,7 +60,8 @@ static void g1_debug(const char *str, void *user_data)
/* Detect hardware, and initialize if found */
static int g1_probe(struct ofono_modem *modem)
{
- DBG("");
+ DBG("probing G1");
+ DBG("probing G1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");

return 0;
}
@@ -97,14 +98,21 @@ static int g1_enable(struct ofono_modem *modem)

DBG("");

+ DBG("enabling G1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+
device = ofono_modem_get_string(modem, "Device");
- if (device == NULL)
- return -EINVAL;
+ // if (device == NULL)
+ // return -EINVAL;
+ device = "/dev/ttyUSB4";
+
+ DBG("");

channel = g_at_tty_open(device, NULL);
if (channel == NULL)
return -EIO;

+ DBG("");
+
syntax = g_at_syntax_new_gsm_permissive();
chat = g_at_chat_new(channel, syntax);
g_io_channel_unref(channel);
@@ -116,11 +124,14 @@ static int g1_enable(struct ofono_modem *modem)
if (getenv("OFONO_AT_DEBUG"))
g_at_chat_set_debug(chat, g1_debug, "");

+ DBG("");
ofono_modem_set_data(modem, chat);

+ DBG("");
/* ensure modem is in a known state; verbose on, echo/quiet off */
g_at_chat_send(chat, "ATE0Q0V1", NULL, NULL, NULL, NULL);

+ DBG("");
/* power up modem */
g_at_chat_send(chat, "AT+CFUN=1", NULL, cfun_set_on_cb, modem, NULL);

@@ -191,18 +202,56 @@ static void g1_post_sim(struct ofono_modem *modem)
ofono_message_waiting_register(mw);
}

+static void g1_post_online(struct ofono_modem *modem)
+{
+ DBG();
+}
+
+static void set_online_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+ struct ofono_modem *modem = user_data;
+ GAtChat *chat = ofono_modem_get_data(modem);
+
+ DBG("");
+
+ g_at_chat_unref(chat);
+ ofono_modem_set_data(modem, NULL);
+
+ // if (ok)
+ // ofono_modem_set_online(modem, TRUE);
+}
+
+static void g1_set_online(struct ofono_modem *modem, ofono_bool_t online,
+ ofono_modem_online_cb_t cb, void *user_data)
+{
+ GAtChat *chat = ofono_modem_get_data(modem);
+ char const *command = online ? "AT+CFUN=1" : "AT+CFUN=4";
+
+ DBG("modem %p %s", modem, online ? "online" : "offline");
+
+ if (g_at_chat_send(chat, command, NULL,
+ set_online_cb, modem, NULL) > 0)
+ return;
+
+ //CALLBACK_WITH_FAILURE(cb, cbd->data);
+
+}
+
static struct ofono_modem_driver g1_driver = {
.name = "g1",
.probe = g1_probe,
.remove = g1_remove,
.enable = g1_enable,
.disable = g1_disable,
+ // .set_online = g1_set_online,
.pre_sim = g1_pre_sim,
.post_sim = g1_post_sim,
+ .post_online = g1_post_online,
};

static int g1_init(void)
{
+ DBG("g1_init!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
return ofono_modem_driver_register(&g1_driver);
}

diff --git a/plugins/udevng.c b/plugins/udevng.c
index ff5d41af..3e0cdf81 100644
--- a/plugins/udevng.c
+++ b/plugins/udevng.c
@@ -1250,6 +1250,7 @@ static struct {
{ "cinterion", setup_serial_modem },
{ "nokiacdma", setup_serial_modem },
{ "sim900", setup_serial_modem },
+ { "g1", setup_serial_modem },
{ "wavecom", setup_wavecom },
{ "tc65", setup_tc65 },
{ "ehs6", setup_ehs6 },
@@ -1407,7 +1408,7 @@ static void add_serial_device(struct udev_device *dev)

mdev = get_serial_modem_device(dev);
if (!mdev) {
- DBG("Device is missing required OFONO_DRIVER property");
+ //DBG("Device %s %s is missing required OFONO_DRIVER property", udev_device_get_devpath(mdev), udev_device_get_syspath(mdev));
return;
}

@@ -1419,6 +1420,9 @@ static void add_serial_device(struct udev_device *dev)

devnode = udev_device_get_devnode(dev);

+ DBG("Got OFONO_DRIVER!!!! driver %s path %s\n", driver, devpath);
+
+
if (!syspath || !devpath)
return;

@@ -1578,8 +1582,6 @@ static struct {
{ "mbm", "cdc_ether", "0930" },
{ "mbm", "cdc_ncm", "0930" },
{ "hso", "hso" },
- { "gobi", "qmi_wwan" },
- { "gobi", "qcserial" },
{ "sierra", "qmi_wwan", "1199" },
{ "sierra", "qcserial", "1199" },
{ "sierra", "sierra" },
@@ -1602,6 +1604,8 @@ static struct {
{ "telit", "cdc_acm", "1bc7", "0021" },
{ "telitqmi", "qmi_wwan", "1bc7", "1201" },
{ "telitqmi", "option", "1bc7", "1201" },
+ { "telitqmi", "qmi_wwan", "22b8", "2a70" },
+ { "telitqmi", "option", "22b8", "2a70" },
{ "nokia", "option", "0421", "060e" },
{ "nokia", "option", "0421", "0623" },
{ "samsung", "option", "04e8", "6889" },
@@ -1717,10 +1721,12 @@ static void check_device(struct udev_device *device)
return;
}

+#if 0
if ((g_str_equal(bus, "usb") == TRUE) ||
(g_str_equal(bus, "usbmisc") == TRUE))
check_usb_device(device);
else
+#endif
add_serial_device(device);

}
@@ -1746,17 +1752,20 @@ static gboolean create_modem(gpointer key, gpointer value, gpointer user_data)
return TRUE;

for (i = 0; driver_list[i].name; i++) {
+ DBG("comparing %s %s", driver_list[i].name, modem->driver);
if (g_str_equal(driver_list[i].name, modem->driver) == FALSE)
continue;

- if (driver_list[i].setup(modem) == TRUE) {
+ /* if (driver_list[i].setup(modem) == TRUE) */ {
ofono_modem_set_string(modem->modem, "SystemPath",
syspath);
ofono_modem_register(modem->modem);
+ DBG("create modem is okay?");
return FALSE;
}
}

+ DBG("create modem is maybe not okay?");
return TRUE;
}

@@ -1796,6 +1805,7 @@ static void enumerate_devices(struct udev *context)
udev_enumerate_unref(enumerate);

g_hash_table_foreach_remove(modem_list, create_modem, NULL);
+ DBG("Enumerate devices ok?");
}

static struct udev *udev_ctx;
@@ -1811,6 +1821,8 @@ static gboolean check_modem_list(gpointer user_data)

g_hash_table_foreach_remove(modem_list, create_modem, NULL);

+ DBG("Check modem list ok?");
+
return FALSE;
}

@@ -1820,6 +1832,8 @@ static gboolean udev_event(GIOChannel *channel, GIOCondition cond,
struct udev_device *device;
const char *action;

+ DBG("udev event");
+
if (cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL)) {
ofono_warn("Error with udev monitor channel");
udev_watch = 0;
@@ -1838,11 +1852,14 @@ static gboolean udev_event(GIOChannel *channel, GIOCondition cond,
if (udev_delay > 0)
g_source_remove(udev_delay);

+ DBG("udev event add -> check");
check_device(device);

udev_delay = g_timeout_add_seconds(1, check_modem_list, NULL);
- } else if (g_str_equal(action, "remove") == TRUE)
+ } else if (g_str_equal(action, "remove") == TRUE) {
+ DBG("udev event remove -> remove");
remove_device(device);
+ }

udev_device_unref(device);

@@ -1892,8 +1909,10 @@ static int detect_init(void)
return -EIO;
}

+ ofono_warn("detect_init...");
modem_list = g_hash_table_new_full(g_str_hash, g_str_equal,
NULL, destroy_modem);
+ ofono_warn("detect_init 2...");

udev_monitor_filter_add_match_subsystem_devtype(udev_mon, "tty", NULL);
udev_monitor_filter_add_match_subsystem_devtype(udev_mon, "usb", NULL);
diff --git a/src/modem.c b/src/modem.c
index 0cee861f..d8dde772 100644
--- a/src/modem.c
+++ b/src/modem.c
@@ -603,12 +603,14 @@ static gboolean modem_has_sim(struct ofono_modem *modem)

static gboolean modem_is_always_online(struct ofono_modem *modem)
{
+ DBG();
if (modem->driver->set_online == NULL)
return TRUE;

if (ofono_modem_get_boolean(modem, "AlwaysOnline") == TRUE)
return TRUE;

+ DBG("not always");
return FALSE;
}

@@ -720,8 +722,10 @@ static void sim_state_watch(enum ofono_sim_state new_state, void *user)
modem_change_state(modem, MODEM_STATE_OFFLINE);

/* Modem is always online, proceed to online state. */
- if (modem_is_always_online(modem) == TRUE)
+ if (modem_is_always_online(modem) == TRUE) {
set_online(modem, TRUE);
+ modem->online = TRUE;
+ }

if (modem->online == TRUE)
modem_change_state(modem, MODEM_STATE_ONLINE);
@@ -1882,13 +1886,17 @@ struct ofono_modem *ofono_modem_create(const char *name, const char *type)
else
snprintf(path, sizeof(path), "/%s", name);

- if (!dbus_validate_path(path, NULL))
+ if (!dbus_validate_path(path, NULL)) {
+ DBG("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!bad dbus path");
return NULL;
+ }

modem = g_try_new0(struct ofono_modem, 1);

- if (modem == NULL)
+ if (modem == NULL) {
+ DBG("!!!out of memory?!");
return modem;
+ }

modem->path = g_strdup(path);
modem->driver_type = g_strdup(type);
@@ -1900,6 +1908,7 @@ struct ofono_modem *ofono_modem_create(const char *name, const char *type)
if (name == NULL)
next_modem_id += 1;

+ DBG("Created new modem, path %s", path);
return modem;
}

diff --git a/src/network.c b/src/network.c
index ae3175d4..700183c0 100644
--- a/src/network.c
+++ b/src/network.c
@@ -980,6 +980,7 @@ static DBusMessage *network_scan(DBusConnection *conn,
{
struct ofono_netreg *netreg = data;

+ DBG();
if (netreg->mode == NETWORK_REGISTRATION_MODE_AUTO_ONLY)
return __ofono_error_access_denied(msg);

@@ -991,6 +992,7 @@ static DBusMessage *network_scan(DBusConnection *conn,

netreg->pending = dbus_message_ref(msg);

+ DBG();
netreg->driver->list_operators(netreg, operator_list_callback, netreg);

return NULL;
diff --git a/src/voicecall.c b/src/voicecall.c
index e4f6a4c0..2c637e58 100644
--- a/src/voicecall.c
+++ b/src/voicecall.c
@@ -1492,6 +1492,7 @@ static int voicecall_dial(struct ofono_voicecall *vc, const char *number,
struct ofono_modem *modem = __ofono_atom_get_modem(vc->atom);
struct ofono_phone_number ph;

+ DBG("");
if (g_slist_length(vc->call_list) >= MAX_VOICE_CALLS)
return -EPERM;






--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

Attachment: signature.asc
Description: Digital signature