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

Pavel Machek pavel at ucw.cz
Fri Mar 30 17:34:06 CEST 2018


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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://mailman.alsa-project.org/pipermail/alsa-devel/attachments/20180330/5ee91b4c/attachment-0001.sig>


More information about the Alsa-devel mailing list