Adding packages for Gentoo Guru Maint
This commit is contained in:
		
							
								
								
									
										1
									
								
								net-misc/eg25-manager/Manifest
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								net-misc/eg25-manager/Manifest
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
DIST eg25-manager-0.3.0.tar.gz 43914 BLAKE2B 10509e124e4801407d2082448a9bdeb34a08075b16409e2dad1918abd7a7f02e355c8da97c3a9f3b307347ad530ce0f2ce6a1d229c602fa01f85f578469f9e8e SHA512 2b0d706c893744529e035e8dc70b381362e39ddd2be705e346f0fd88e4907093e59b30800ad5ecb90638338b25bb51308349fb26de2c786197aeed8c1fa9c68a
 | 
			
		||||
@@ -3,36 +3,25 @@
 | 
			
		||||
 | 
			
		||||
EAPI=7
 | 
			
		||||
 | 
			
		||||
inherit meson git-r3 systemd
 | 
			
		||||
inherit meson systemd
 | 
			
		||||
 | 
			
		||||
COMMIT="73e16f76994b1d3c587796a35766cc668e30c0cd"
 | 
			
		||||
 | 
			
		||||
DESCRIPTION="Daemon for managing the Quectel EG25 modem"
 | 
			
		||||
HOMEPAGE="https://gitlab.com/mobian1/devices/eg25-manager"
 | 
			
		||||
 | 
			
		||||
SRC_URI="https://gitlab.com/mobian1/devices/eg25-manager/-/archive/${COMMIT}.tar.gz -> ${P}.tar.gz"
 | 
			
		||||
 | 
			
		||||
KEYWORDS="~arm64"
 | 
			
		||||
 | 
			
		||||
EGIT_REPO_URI="${HOMEPAGE}.git"
 | 
			
		||||
 | 
			
		||||
if [[ ${PV} != 9999 ]]; then
 | 
			
		||||
	EGIT_COMMIT="73e16f76994b1d3c587796a35766cc668e30c0cd"
 | 
			
		||||
else
 | 
			
		||||
	KEYWORDS=""
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
LICENSE="GPL-3"
 | 
			
		||||
SLOT="0"
 | 
			
		||||
 | 
			
		||||
DEPEND="
 | 
			
		||||
		dev-libs/libgpiod
 | 
			
		||||
		virtual/libusb:1
 | 
			
		||||
		net-misc/modemmanager
 | 
			
		||||
		"
 | 
			
		||||
RDEPEND="${DEPEND}"
 | 
			
		||||
RDEPEND="
 | 
			
		||||
	dev-libs/libgpiod
 | 
			
		||||
	virtual/libusb:1
 | 
			
		||||
	net-misc/modemmanager
 | 
			
		||||
"
 | 
			
		||||
 | 
			
		||||
PATCHES=(
 | 
			
		||||
	#	${FILESDIR}/11.patch
 | 
			
		||||
	#	${FILESDIR}/12.patch
 | 
			
		||||
)
 | 
			
		||||
S="${WORKDIR}/${PN}-${COMMIT}"
 | 
			
		||||
 | 
			
		||||
src_install() {
 | 
			
		||||
	meson_src_install
 | 
			
		||||
 
 | 
			
		||||
@@ -1,297 +0,0 @@
 | 
			
		||||
From b8d269cf2f5aed4ca0e0bcb9702b65897fda18bc Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Dylan Van Assche <me@dylanvanassche.be>
 | 
			
		||||
Date: Sat, 6 Feb 2021 07:52:32 +0100
 | 
			
		||||
Subject: [PATCH] suspend: add boot timer
 | 
			
		||||
 | 
			
		||||
The EG25 modem needs at least 2 minutes after indicating 'RDY'
 | 
			
		||||
to be fully operational. If the modem is suspended before that,
 | 
			
		||||
calls or texts may not be seen by the userspace.
 | 
			
		||||
This mostly occurs when a full reboot or poweroff/poweron
 | 
			
		||||
sequence of the phone is performed.
 | 
			
		||||
 | 
			
		||||
:
 | 
			
		||||
---
 | 
			
		||||
 src/at.c      |   4 +-
 | 
			
		||||
 src/manager.c |   5 +-
 | 
			
		||||
 src/manager.h |   4 +-
 | 
			
		||||
 src/suspend.c | 126 +++++++++++++++++++++++++++++++++++++++-----------
 | 
			
		||||
 src/suspend.h |   2 +-
 | 
			
		||||
 5 files changed, 108 insertions(+), 33 deletions(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/src/at.c b/src/at.c
 | 
			
		||||
index 39a857a..661098a 100644
 | 
			
		||||
--- a/src/at.c
 | 
			
		||||
+++ b/src/at.c
 | 
			
		||||
@@ -202,8 +202,10 @@ static gboolean modem_response(gint fd,
 | 
			
		||||
 
 | 
			
		||||
         g_message("Response: [%s]", response);
 | 
			
		||||
 
 | 
			
		||||
-        if (strcmp(response, "RDY") == 0)
 | 
			
		||||
+        if (strcmp(response, "RDY") == 0) {
 | 
			
		||||
+            suspend_inhibit(manager, TRUE, TRUE);
 | 
			
		||||
             manager->modem_state = EG25_STATE_STARTED;
 | 
			
		||||
+        }
 | 
			
		||||
         else if (strstr(response, "ERROR"))
 | 
			
		||||
             retry_at_command(manager);
 | 
			
		||||
         else if (strstr(response, "OK"))
 | 
			
		||||
diff --git a/src/manager.c b/src/manager.c
 | 
			
		||||
index 6445e0f..912a095 100644
 | 
			
		||||
--- a/src/manager.c
 | 
			
		||||
+++ b/src/manager.c
 | 
			
		||||
@@ -178,7 +178,7 @@ void modem_suspend_post(struct EG25Manager *manager)
 | 
			
		||||
 {
 | 
			
		||||
     gpio_sequence_suspend(manager);
 | 
			
		||||
     g_message("suspend sequence is over, drop inhibitor");
 | 
			
		||||
-    suspend_inhibit(manager, FALSE);
 | 
			
		||||
+    suspend_inhibit(manager, FALSE, FALSE);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void modem_resume_pre(struct EG25Manager *manager)
 | 
			
		||||
@@ -205,7 +205,8 @@ int main(int argc, char *argv[])
 | 
			
		||||
 
 | 
			
		||||
     memset(&manager, 0, sizeof(manager));
 | 
			
		||||
     manager.at_fd = -1;
 | 
			
		||||
-    manager.suspend_inhibit_fd = -1;
 | 
			
		||||
+    manager.delay_inhibit_fd = -1;
 | 
			
		||||
+    manager.block_inhibit_fd = -1;
 | 
			
		||||
 
 | 
			
		||||
     opt_context = g_option_context_new ("- Power management for the Quectel EG25 modem");
 | 
			
		||||
     g_option_context_add_main_entries (opt_context, options, NULL);
 | 
			
		||||
diff --git a/src/manager.h b/src/manager.h
 | 
			
		||||
index f6351be..21b3b67 100644
 | 
			
		||||
--- a/src/manager.h
 | 
			
		||||
+++ b/src/manager.h
 | 
			
		||||
@@ -43,8 +43,10 @@ struct EG25Manager {
 | 
			
		||||
     MMModem *mm_modem;
 | 
			
		||||
 
 | 
			
		||||
     GDBusProxy *suspend_proxy;
 | 
			
		||||
-    int suspend_inhibit_fd;
 | 
			
		||||
+    int delay_inhibit_fd;
 | 
			
		||||
+    int block_inhibit_fd;
 | 
			
		||||
     guint suspend_timer;
 | 
			
		||||
+    guint boot_timer;
 | 
			
		||||
 
 | 
			
		||||
     GUdevClient *udev;
 | 
			
		||||
 
 | 
			
		||||
diff --git a/src/suspend.c b/src/suspend.c
 | 
			
		||||
index 4b1a026..622cf00 100644
 | 
			
		||||
--- a/src/suspend.c
 | 
			
		||||
+++ b/src/suspend.c
 | 
			
		||||
@@ -13,9 +13,10 @@
 | 
			
		||||
 
 | 
			
		||||
 #include <gio/gunixfdlist.h>
 | 
			
		||||
 
 | 
			
		||||
-#define SD_NAME      "org.freedesktop.login1"
 | 
			
		||||
-#define SD_PATH      "/org/freedesktop/login1"
 | 
			
		||||
-#define SD_INTERFACE "org.freedesktop.login1.Manager"
 | 
			
		||||
+#define SD_NAME         "org.freedesktop.login1"
 | 
			
		||||
+#define SD_PATH         "/org/freedesktop/login1"
 | 
			
		||||
+#define SD_INTERFACE    "org.freedesktop.login1.Manager"
 | 
			
		||||
+#define FULL_BOOT_DELAY 120
 | 
			
		||||
 
 | 
			
		||||
 static gboolean check_modem_resume(struct EG25Manager *manager)
 | 
			
		||||
 {
 | 
			
		||||
@@ -26,18 +27,28 @@ static gboolean check_modem_resume(struct EG25Manager *manager)
 | 
			
		||||
     return FALSE;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static gboolean drop_inhibitor(struct EG25Manager *manager)
 | 
			
		||||
+static gboolean drop_inhibitor(struct EG25Manager *manager, gboolean block)
 | 
			
		||||
 {
 | 
			
		||||
-    if (manager->suspend_inhibit_fd >= 0) {
 | 
			
		||||
-        g_message("dropping systemd sleep inhibitor");
 | 
			
		||||
-        close(manager->suspend_inhibit_fd);
 | 
			
		||||
-        manager->suspend_inhibit_fd = -1;
 | 
			
		||||
-        return TRUE;
 | 
			
		||||
+    if (block) {
 | 
			
		||||
+        if (manager->block_inhibit_fd >= 0) {
 | 
			
		||||
+            g_message("dropping systemd sleep block inhibitor");
 | 
			
		||||
+            close(manager->block_inhibit_fd);
 | 
			
		||||
+            manager->block_inhibit_fd = -1;
 | 
			
		||||
+            return TRUE;
 | 
			
		||||
+        }
 | 
			
		||||
+    }
 | 
			
		||||
+    else {
 | 
			
		||||
+        if (manager->delay_inhibit_fd >= 0) {
 | 
			
		||||
+            g_message("dropping systemd sleep delay inhibitor");
 | 
			
		||||
+            close(manager->delay_inhibit_fd);
 | 
			
		||||
+            manager->delay_inhibit_fd = -1;
 | 
			
		||||
+            return TRUE;
 | 
			
		||||
+        }
 | 
			
		||||
     }
 | 
			
		||||
     return FALSE;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static void inhibit_done(GObject *source,
 | 
			
		||||
+static void inhibit_done_delay(GObject *source,
 | 
			
		||||
                          GAsyncResult *result,
 | 
			
		||||
                          gpointer user_data)
 | 
			
		||||
 {
 | 
			
		||||
@@ -54,27 +65,81 @@ static void inhibit_done(GObject *source,
 | 
			
		||||
         if (!fd_list || g_unix_fd_list_get_length(fd_list) != 1)
 | 
			
		||||
             g_warning("didn't get a single fd back");
 | 
			
		||||
 
 | 
			
		||||
-        manager->suspend_inhibit_fd = g_unix_fd_list_get(fd_list, 0, NULL);
 | 
			
		||||
+        manager->delay_inhibit_fd = g_unix_fd_list_get(fd_list, 0, NULL);
 | 
			
		||||
 
 | 
			
		||||
-        g_message("inhibitor fd is %d", manager->suspend_inhibit_fd);
 | 
			
		||||
+        g_message("inhibitor sleep fd is %d", manager->delay_inhibit_fd);
 | 
			
		||||
         g_object_unref(fd_list);
 | 
			
		||||
         g_variant_unref(res);
 | 
			
		||||
     }
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static void take_inhibitor(struct EG25Manager *manager)
 | 
			
		||||
+static void inhibit_done_block(GObject *source,
 | 
			
		||||
+                         GAsyncResult *result,
 | 
			
		||||
+                         gpointer user_data)
 | 
			
		||||
+{
 | 
			
		||||
+    GDBusProxy *suspend_proxy = G_DBUS_PROXY(source);
 | 
			
		||||
+    struct EG25Manager *manager = user_data;
 | 
			
		||||
+    g_autoptr (GError) error = NULL;
 | 
			
		||||
+    GVariant *res;
 | 
			
		||||
+    GUnixFDList *fd_list;
 | 
			
		||||
+
 | 
			
		||||
+    res = g_dbus_proxy_call_with_unix_fd_list_finish(suspend_proxy, &fd_list, result, &error);
 | 
			
		||||
+    if (!res) {
 | 
			
		||||
+        g_warning("inhibit failed: %s", error->message);
 | 
			
		||||
+    } else {
 | 
			
		||||
+        if (!fd_list || g_unix_fd_list_get_length(fd_list) != 1)
 | 
			
		||||
+            g_warning("didn't get a single fd back");
 | 
			
		||||
+
 | 
			
		||||
+        manager->block_inhibit_fd = g_unix_fd_list_get(fd_list, 0, NULL);
 | 
			
		||||
+
 | 
			
		||||
+        g_message("inhibitor block fd is %d", manager->block_inhibit_fd);
 | 
			
		||||
+        g_object_unref(fd_list);
 | 
			
		||||
+        g_variant_unref(res);
 | 
			
		||||
+    }
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+/*
 | 
			
		||||
+ * After the EG25 modem sends 'RDY', it takes up to 2 minutes before all
 | 
			
		||||
+ * capabilities are operational. If the modem is suspended before that,
 | 
			
		||||
+ * calls and texts may be not recognized properly.
 | 
			
		||||
+ */
 | 
			
		||||
+static gboolean modem_fully_booted(struct EG25Manager *manager)
 | 
			
		||||
+{
 | 
			
		||||
+    g_message("Modem is up for %d seconds and fully ready", FULL_BOOT_DELAY);
 | 
			
		||||
+    manager->boot_timer = 0;
 | 
			
		||||
+    drop_inhibitor(manager, TRUE);
 | 
			
		||||
+
 | 
			
		||||
+    return FALSE;
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+static void take_inhibitor(struct EG25Manager *manager, gboolean block)
 | 
			
		||||
 {
 | 
			
		||||
     GVariant *variant_arg;
 | 
			
		||||
 
 | 
			
		||||
-    if(manager->suspend_inhibit_fd != -1)
 | 
			
		||||
-        drop_inhibitor(manager);
 | 
			
		||||
+    if (block) {
 | 
			
		||||
+        if(manager->block_inhibit_fd != -1)
 | 
			
		||||
+            drop_inhibitor(manager, TRUE);
 | 
			
		||||
 
 | 
			
		||||
-    variant_arg = g_variant_new ("(ssss)", "sleep", "eg25manager",
 | 
			
		||||
-                                 "eg25manager needs to prepare modem for sleep", "delay");
 | 
			
		||||
+        variant_arg = g_variant_new ("(ssss)", "sleep", "eg25manager",
 | 
			
		||||
+                                     "eg25manager needs to wait for modem to be fully booted", "block");
 | 
			
		||||
 
 | 
			
		||||
-    g_message("taking systemd sleep inhibitor");
 | 
			
		||||
-    g_dbus_proxy_call_with_unix_fd_list(manager->suspend_proxy, "Inhibit", variant_arg,
 | 
			
		||||
-                                        0, G_MAXINT, NULL, NULL, inhibit_done, manager);
 | 
			
		||||
+        g_message("taking systemd sleep block inhibitor");
 | 
			
		||||
+        g_dbus_proxy_call_with_unix_fd_list(manager->suspend_proxy, "Inhibit", variant_arg,
 | 
			
		||||
+                                            0, G_MAXINT, NULL, NULL, inhibit_done_block, manager);
 | 
			
		||||
+        g_message("scheduling block inhibitor release");
 | 
			
		||||
+        manager->boot_timer = g_timeout_add_seconds(FULL_BOOT_DELAY, G_SOURCE_FUNC(modem_fully_booted), manager);
 | 
			
		||||
+    }
 | 
			
		||||
+    else {
 | 
			
		||||
+        if(manager->delay_inhibit_fd != -1)
 | 
			
		||||
+            drop_inhibitor(manager, FALSE);
 | 
			
		||||
+
 | 
			
		||||
+        variant_arg = g_variant_new ("(ssss)", "sleep", "eg25manager",
 | 
			
		||||
+                                     "eg25manager needs to prepare modem for sleep", "delay");
 | 
			
		||||
+
 | 
			
		||||
+        g_message("taking systemd sleep delay inhibitor");
 | 
			
		||||
+        g_dbus_proxy_call_with_unix_fd_list(manager->suspend_proxy, "Inhibit", variant_arg,
 | 
			
		||||
+                                            0, G_MAXINT, NULL, NULL, inhibit_done_delay, manager);
 | 
			
		||||
+    }
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static void signal_cb(GDBusProxy *proxy,
 | 
			
		||||
@@ -97,7 +162,7 @@ static void signal_cb(GDBusProxy *proxy,
 | 
			
		||||
         modem_suspend_pre(manager);
 | 
			
		||||
     } else {
 | 
			
		||||
         g_message("system is resuming");
 | 
			
		||||
-        take_inhibitor(manager);
 | 
			
		||||
+        take_inhibitor(manager, FALSE);
 | 
			
		||||
         modem_resume_pre(manager);
 | 
			
		||||
         if (manager->mm_modem) {
 | 
			
		||||
             /*
 | 
			
		||||
@@ -126,10 +191,10 @@ static void name_owner_cb(GObject *object,
 | 
			
		||||
 
 | 
			
		||||
     owner = g_dbus_proxy_get_name_owner(proxy);
 | 
			
		||||
     if (owner) {
 | 
			
		||||
-        take_inhibitor(manager);
 | 
			
		||||
+        take_inhibitor(manager, FALSE);
 | 
			
		||||
         g_free(owner);
 | 
			
		||||
     } else {
 | 
			
		||||
-        drop_inhibitor(manager);
 | 
			
		||||
+        drop_inhibitor(manager, FALSE);
 | 
			
		||||
     }
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -151,7 +216,7 @@ static void on_proxy_acquired(GObject *object,
 | 
			
		||||
 
 | 
			
		||||
     owner = g_dbus_proxy_get_name_owner(manager->suspend_proxy);
 | 
			
		||||
     if (owner) {
 | 
			
		||||
-        take_inhibitor(manager);
 | 
			
		||||
+        take_inhibitor(manager, FALSE);
 | 
			
		||||
         g_free(owner);
 | 
			
		||||
     }
 | 
			
		||||
 }
 | 
			
		||||
@@ -167,21 +232,26 @@ void suspend_init(struct EG25Manager *manager)
 | 
			
		||||
 
 | 
			
		||||
 void suspend_destroy(struct EG25Manager *manager)
 | 
			
		||||
 {
 | 
			
		||||
-    drop_inhibitor(manager);
 | 
			
		||||
+    drop_inhibitor(manager, FALSE);
 | 
			
		||||
+    drop_inhibitor(manager, TRUE);
 | 
			
		||||
     if (manager->suspend_timer) {
 | 
			
		||||
         g_source_remove(manager->suspend_timer);
 | 
			
		||||
         manager->suspend_timer = 0;
 | 
			
		||||
     }
 | 
			
		||||
+    if (manager->boot_timer) {
 | 
			
		||||
+        g_source_remove(manager->boot_timer);
 | 
			
		||||
+        manager->boot_timer = 0;
 | 
			
		||||
+    }
 | 
			
		||||
     if (manager->suspend_proxy) {
 | 
			
		||||
         g_object_unref(manager->suspend_proxy);
 | 
			
		||||
         manager->suspend_proxy = NULL;
 | 
			
		||||
     }
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-void suspend_inhibit(struct EG25Manager *manager, gboolean inhibit)
 | 
			
		||||
+void suspend_inhibit(struct EG25Manager *manager, gboolean inhibit, gboolean block)
 | 
			
		||||
 {
 | 
			
		||||
     if (inhibit)
 | 
			
		||||
-        take_inhibitor(manager);
 | 
			
		||||
+        take_inhibitor(manager, block);
 | 
			
		||||
     else
 | 
			
		||||
-        drop_inhibitor(manager);
 | 
			
		||||
+        drop_inhibitor(manager, block);
 | 
			
		||||
 }
 | 
			
		||||
diff --git a/src/suspend.h b/src/suspend.h
 | 
			
		||||
index 39832aa..e82eeff 100644
 | 
			
		||||
--- a/src/suspend.h
 | 
			
		||||
+++ b/src/suspend.h
 | 
			
		||||
@@ -11,4 +11,4 @@
 | 
			
		||||
 void suspend_init (struct EG25Manager *data);
 | 
			
		||||
 void suspend_destroy (struct EG25Manager *data);
 | 
			
		||||
 
 | 
			
		||||
-void suspend_inhibit (struct EG25Manager *data, gboolean inhibit);
 | 
			
		||||
+void suspend_inhibit (struct EG25Manager *data, gboolean inhibit, gboolean block);
 | 
			
		||||
-- 
 | 
			
		||||
GitLab
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -1,57 +0,0 @@
 | 
			
		||||
From 04eed2496d2a02bb23b4eae91be0264417fb28c6 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Biktor <sleepyh@gmail.com>
 | 
			
		||||
Date: Wed, 24 Feb 2021 12:32:46 +0100
 | 
			
		||||
Subject: [PATCH] Set URC config to 'all' instead of 'usbat' dquote> When using
 | 
			
		||||
 a custom kernel, if this setting is set to 'usbat' only, no RING urc is
 | 
			
		||||
 reported on any interface. Changing QURCCFG to 'all' makes the modem report
 | 
			
		||||
 RINGs on all supported interfaces, making receiving calls possible when using
 | 
			
		||||
 a custom firmware
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 data/pine64,pinephone-1.0.toml | 2 +-
 | 
			
		||||
 data/pine64,pinephone-1.1.toml | 2 +-
 | 
			
		||||
 data/pine64,pinephone-1.2.toml | 2 +-
 | 
			
		||||
 3 files changed, 3 insertions(+), 3 deletions(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/data/pine64,pinephone-1.0.toml b/data/pine64,pinephone-1.0.toml
 | 
			
		||||
index c0e9192..7287298 100644
 | 
			
		||||
--- a/data/pine64,pinephone-1.0.toml
 | 
			
		||||
+++ b/data/pine64,pinephone-1.0.toml
 | 
			
		||||
@@ -39,7 +39,7 @@ configure = [
 | 
			
		||||
     { cmd = "QCFG", subcmd = "urc/ri/smsincoming", expect = "\"pulse\",2000" },
 | 
			
		||||
     { cmd = "QCFG", subcmd = "urc/ri/other", expect = "\"off\",1" },
 | 
			
		||||
     { cmd = "QCFG", subcmd = "urc/delay", expect = "1" },
 | 
			
		||||
-    { cmd = "QURCCFG", subcmd = "urcport", expect = "\"usbat\"" },
 | 
			
		||||
+    { cmd = "QURCCFG", subcmd = "urcport", expect = "\"all\"" },
 | 
			
		||||
     { cmd = "QGPS", value = "1" },
 | 
			
		||||
     { cmd = "QSCLK", value = "1" },
 | 
			
		||||
     { cmd = "QCFG", subcmd = "urc/cache", value = "0" }
 | 
			
		||||
diff --git a/data/pine64,pinephone-1.1.toml b/data/pine64,pinephone-1.1.toml
 | 
			
		||||
index c0e9192..7287298 100644
 | 
			
		||||
--- a/data/pine64,pinephone-1.1.toml
 | 
			
		||||
+++ b/data/pine64,pinephone-1.1.toml
 | 
			
		||||
@@ -39,7 +39,7 @@ configure = [
 | 
			
		||||
     { cmd = "QCFG", subcmd = "urc/ri/smsincoming", expect = "\"pulse\",2000" },
 | 
			
		||||
     { cmd = "QCFG", subcmd = "urc/ri/other", expect = "\"off\",1" },
 | 
			
		||||
     { cmd = "QCFG", subcmd = "urc/delay", expect = "1" },
 | 
			
		||||
-    { cmd = "QURCCFG", subcmd = "urcport", expect = "\"usbat\"" },
 | 
			
		||||
+    { cmd = "QURCCFG", subcmd = "urcport", expect = "\"all\"" },
 | 
			
		||||
     { cmd = "QGPS", value = "1" },
 | 
			
		||||
     { cmd = "QSCLK", value = "1" },
 | 
			
		||||
     { cmd = "QCFG", subcmd = "urc/cache", value = "0" }
 | 
			
		||||
diff --git a/data/pine64,pinephone-1.2.toml b/data/pine64,pinephone-1.2.toml
 | 
			
		||||
index 566ac80..2effb30 100644
 | 
			
		||||
--- a/data/pine64,pinephone-1.2.toml
 | 
			
		||||
+++ b/data/pine64,pinephone-1.2.toml
 | 
			
		||||
@@ -32,7 +32,7 @@ configure = [
 | 
			
		||||
     { cmd = "QCFG", subcmd = "risignaltype", expect = "\"physical\"" },
 | 
			
		||||
     { cmd = "QCFG", subcmd = "ims", expect = "1" },
 | 
			
		||||
     { cmd = "QCFG", subcmd = "apready", expect = "1,0,500" },
 | 
			
		||||
-    { cmd = "QURCCFG", subcmd = "urcport", expect = "\"usbat\"" },
 | 
			
		||||
+    { cmd = "QURCCFG", subcmd = "urcport", expect = "\"all\"" },
 | 
			
		||||
     { cmd = "QGPS", value = "1" },
 | 
			
		||||
     { cmd = "QSCLK", value = "1" },
 | 
			
		||||
     { cmd = "QCFG", subcmd = "urc/cache", value = "0" }
 | 
			
		||||
-- 
 | 
			
		||||
GitLab
 | 
			
		||||
 | 
			
		||||
@@ -1,49 +0,0 @@
 | 
			
		||||
From d40bb283101fd9cf702e4944865aebef52c34185 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Djhg2000 <github@djhg2000.net>
 | 
			
		||||
Date: Thu, 4 Mar 2021 20:08:12 +0100
 | 
			
		||||
Subject: [PATCH] Add a 60ms delay before PWRKEY sequence
 | 
			
		||||
 | 
			
		||||
This brings the power on sequence in line with the EG25-G Hardware Design
 | 
			
		||||
datasheet, which states we need to wait at least 30 ms after VBAT becomes stable
 | 
			
		||||
before pulling PWRKEY low (first action of the power on sequene).
 | 
			
		||||
 | 
			
		||||
After this change the sequence becomes as follows:
 | 
			
		||||
- Set RESET_N high
 | 
			
		||||
- Wait 60 ms (double 30 ms)
 | 
			
		||||
- Execute PWRKEY sequence
 | 
			
		||||
 | 
			
		||||
60 ms was choosen because we don't know when VBAT becomes stable, but it should
 | 
			
		||||
be much less than an additional 30 ms. Empirical evidence suggests PinePhone
 | 
			
		||||
units with a healthy battery do not see serious side effects from not doing
 | 
			
		||||
this, while the modem will fail to boot and/or throw random errors on boot with
 | 
			
		||||
a worn out battery.
 | 
			
		||||
---
 | 
			
		||||
 src/manager.c | 5 +++++
 | 
			
		||||
 1 file changed, 5 insertions(+)
 | 
			
		||||
 | 
			
		||||
diff --git a/src/manager.c b/src/manager.c
 | 
			
		||||
index aaa3905..a992572 100644
 | 
			
		||||
--- a/src/manager.c
 | 
			
		||||
+++ b/src/manager.c
 | 
			
		||||
@@ -27,6 +27,9 @@
 | 
			
		||||
 #define EG25_DATADIR "/usr/share/eg25-manager"
 | 
			
		||||
 #endif
 | 
			
		||||
 
 | 
			
		||||
+// Delay between setting GPIO and PWRKEY sequence (60ms)
 | 
			
		||||
+#define MODEM_POWERON_DELAY 60000
 | 
			
		||||
+
 | 
			
		||||
 static gboolean quit_app(struct EG25Manager *manager)
 | 
			
		||||
 {
 | 
			
		||||
     int i;
 | 
			
		||||
@@ -86,6 +89,8 @@ static gboolean modem_start(struct EG25Manager *manager)
 | 
			
		||||
 
 | 
			
		||||
     if (should_boot) {
 | 
			
		||||
         g_message("Starting modem...");
 | 
			
		||||
+	// Modem might crash on boot (especially with worn battery) if we don't delay here
 | 
			
		||||
+	usleep(MODEM_POWERON_DELAY);
 | 
			
		||||
         gpio_sequence_poweron(manager);
 | 
			
		||||
         manager->modem_state = EG25_STATE_POWERED;
 | 
			
		||||
     } else {
 | 
			
		||||
-- 
 | 
			
		||||
GitLab
 | 
			
		||||
 | 
			
		||||
@@ -1,65 +0,0 @@
 | 
			
		||||
From 84a0ae603df95311a5d5cae9ca04b69fd6784827 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Bhushan Shah <bhush94@gmail.com>
 | 
			
		||||
Date: Fri, 26 Mar 2021 13:56:37 +0530
 | 
			
		||||
Subject: [PATCH] udev: use the udev rules directly to set attr
 | 
			
		||||
 | 
			
		||||
We don't need complicated script for this, we can just set required
 | 
			
		||||
attributes using udev rules.
 | 
			
		||||
---
 | 
			
		||||
 udev/80-modem-eg25.rules |  6 +++++-
 | 
			
		||||
 udev/eg25-configure-usb  | 21 ---------------------
 | 
			
		||||
 udev/meson.build         |  1 -
 | 
			
		||||
 3 files changed, 5 insertions(+), 23 deletions(-)
 | 
			
		||||
 delete mode 100755 udev/eg25-configure-usb
 | 
			
		||||
 | 
			
		||||
diff --git a/udev/80-modem-eg25.rules b/udev/80-modem-eg25.rules
 | 
			
		||||
index 0ea9e6f..fc3b78f 100644
 | 
			
		||||
--- a/udev/80-modem-eg25.rules
 | 
			
		||||
+++ b/udev/80-modem-eg25.rules
 | 
			
		||||
@@ -1 +1,5 @@
 | 
			
		||||
-ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ENV{MINOR}=="0", RUN+="/usr/bin/eg25-configure-usb %p"
 | 
			
		||||
+ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ATTR{power/control}="auto"
 | 
			
		||||
+ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ATTR{power/autosuspend_delay_ms}="3000"
 | 
			
		||||
+ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ATTR{power/wakeup}="enabled"
 | 
			
		||||
+ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ATTR{avoid_reset_quirk}="1"
 | 
			
		||||
+ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ATTR{power/persist}="0"
 | 
			
		||||
diff --git a/udev/eg25-configure-usb b/udev/eg25-configure-usb
 | 
			
		||||
deleted file mode 100755
 | 
			
		||||
index 9972af7..0000000
 | 
			
		||||
--- a/udev/eg25-configure-usb
 | 
			
		||||
+++ /dev/null
 | 
			
		||||
@@ -1,21 +0,0 @@
 | 
			
		||||
-#!/bin/sh
 | 
			
		||||
-
 | 
			
		||||
-DEVPATH=/sys/$1
 | 
			
		||||
-USB_ID=
 | 
			
		||||
-
 | 
			
		||||
-[ -d ${DEVPATH} ] || exit 1
 | 
			
		||||
-
 | 
			
		||||
-while [ ! "${USB_ID}" ]; do
 | 
			
		||||
-    if [ -f ${DEVPATH}/avoid_reset_quirk ]; then
 | 
			
		||||
-        USB_ID=$(basename ${DEVPATH})
 | 
			
		||||
-        break
 | 
			
		||||
-    fi
 | 
			
		||||
-    DEVPATH=$(dirname ${DEVPATH})
 | 
			
		||||
-done
 | 
			
		||||
-
 | 
			
		||||
-# Avoid USB resets
 | 
			
		||||
-echo "auto" > /sys/bus/usb/devices/${USB_ID}/power/control
 | 
			
		||||
-echo "3000" > /sys/bus/usb/devices/${USB_ID}/power/autosuspend_delay_ms
 | 
			
		||||
-echo "enabled" > /sys/bus/usb/devices/${USB_ID}/power/wakeup
 | 
			
		||||
-echo "1" > /sys/bus/usb/devices/${USB_ID}/avoid_reset_quirk
 | 
			
		||||
-echo "0" > /sys/bus/usb/devices/${USB_ID}/power/persist
 | 
			
		||||
diff --git a/udev/meson.build b/udev/meson.build
 | 
			
		||||
index fe558fc..1488660 100644
 | 
			
		||||
--- a/udev/meson.build
 | 
			
		||||
+++ b/udev/meson.build
 | 
			
		||||
@@ -4,5 +4,4 @@
 | 
			
		||||
 # SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
 #
 | 
			
		||||
 
 | 
			
		||||
-install_data ('eg25-configure-usb', install_dir: bindir)
 | 
			
		||||
 install_data ('80-modem-eg25.rules', install_dir: udevrulesdir)
 | 
			
		||||
-- 
 | 
			
		||||
GitLab
 | 
			
		||||
 | 
			
		||||
@@ -1,895 +0,0 @@
 | 
			
		||||
From 09c0ddfbb81f15bf732b9a5af15eee9eb1be848b Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Oliver Smith <ollieparanoid@postmarketos.org>
 | 
			
		||||
Date: Mon, 8 Feb 2021 10:29:56 +0530
 | 
			
		||||
Subject: [PATCH 1/5] src: add ofono-iface
 | 
			
		||||
 | 
			
		||||
Start work on new ofono interface. So far, this detects ofono on dbus
 | 
			
		||||
and complains if both mm and ofono are running.
 | 
			
		||||
---
 | 
			
		||||
 src/manager.c     | 10 ++++++++
 | 
			
		||||
 src/manager.h     |  8 ++++++
 | 
			
		||||
 src/meson.build   |  1 +
 | 
			
		||||
 src/mm-iface.c    |  7 ++++++
 | 
			
		||||
 src/ofono-iface.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++
 | 
			
		||||
 src/ofono-iface.h | 12 +++++++++
 | 
			
		||||
 6 files changed, 100 insertions(+)
 | 
			
		||||
 create mode 100644 src/ofono-iface.c
 | 
			
		||||
 create mode 100644 src/ofono-iface.h
 | 
			
		||||
 | 
			
		||||
diff --git a/src/manager.c b/src/manager.c
 | 
			
		||||
index aaa3905..7e43e62 100644
 | 
			
		||||
--- a/src/manager.c
 | 
			
		||||
+++ b/src/manager.c
 | 
			
		||||
@@ -8,6 +8,7 @@
 | 
			
		||||
 #include "gpio.h"
 | 
			
		||||
 #include "manager.h"
 | 
			
		||||
 #include "mm-iface.h"
 | 
			
		||||
+#include "ofono-iface.h"
 | 
			
		||||
 #include "suspend.h"
 | 
			
		||||
 #include "udev.h"
 | 
			
		||||
 
 | 
			
		||||
@@ -35,6 +36,7 @@ static gboolean quit_app(struct EG25Manager *manager)
 | 
			
		||||
 
 | 
			
		||||
     at_destroy(manager);
 | 
			
		||||
     mm_iface_destroy(manager);
 | 
			
		||||
+    ofono_iface_destroy(manager);
 | 
			
		||||
     suspend_destroy(manager);
 | 
			
		||||
     udev_destroy(manager);
 | 
			
		||||
 
 | 
			
		||||
@@ -131,6 +133,13 @@ void modem_reset(struct EG25Manager *manager)
 | 
			
		||||
     if (manager->reset_timer)
 | 
			
		||||
         return;
 | 
			
		||||
 
 | 
			
		||||
+    /* If we are managing the modem through lets say ofono, we should not
 | 
			
		||||
+     * reset the modem based on the availability of USB ID
 | 
			
		||||
+     * TODO: Improve ofono plugin and add support for fetching USB ID
 | 
			
		||||
+     */
 | 
			
		||||
+    if (manager->modem_iface != MODEM_IFACE_MODEMMANAGER)
 | 
			
		||||
+        return;        
 | 
			
		||||
+
 | 
			
		||||
     if (manager->modem_recovery_timer) {
 | 
			
		||||
         g_source_remove(manager->modem_recovery_timer);
 | 
			
		||||
         manager->modem_recovery_timer = 0;
 | 
			
		||||
@@ -305,6 +314,7 @@ int main(int argc, char *argv[])
 | 
			
		||||
     at_init(&manager, toml_table_in(toml_config, "at"));
 | 
			
		||||
     gpio_init(&manager, toml_table_in(toml_config, "gpio"));
 | 
			
		||||
     mm_iface_init(&manager, toml_table_in(toml_config, "mm-iface"));
 | 
			
		||||
+    ofono_iface_init(&manager);
 | 
			
		||||
     suspend_init(&manager, toml_table_in(toml_config, "suspend"));
 | 
			
		||||
     udev_init(&manager, toml_table_in(toml_config, "udev"));
 | 
			
		||||
 
 | 
			
		||||
diff --git a/src/manager.h b/src/manager.h
 | 
			
		||||
index 48ff237..5ed9e75 100644
 | 
			
		||||
--- a/src/manager.h
 | 
			
		||||
+++ b/src/manager.h
 | 
			
		||||
@@ -27,6 +27,12 @@ enum EG25State {
 | 
			
		||||
     EG25_STATE_FINISHING
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
+enum ModemIface {
 | 
			
		||||
+    MODEM_IFACE_NONE = 0,
 | 
			
		||||
+    MODEM_IFACE_MODEMMANAGER,
 | 
			
		||||
+    MODEM_IFACE_OFONO
 | 
			
		||||
+};
 | 
			
		||||
+
 | 
			
		||||
 struct EG25Manager {
 | 
			
		||||
     GMainLoop *loop;
 | 
			
		||||
     guint reset_timer;
 | 
			
		||||
@@ -41,9 +47,11 @@ struct EG25Manager {
 | 
			
		||||
     enum EG25State modem_state;
 | 
			
		||||
     gchar *modem_usb_id;
 | 
			
		||||
 
 | 
			
		||||
+    enum ModemIface modem_iface;
 | 
			
		||||
     guint mm_watch;
 | 
			
		||||
     MMManager *mm_manager;
 | 
			
		||||
     MMModem *mm_modem;
 | 
			
		||||
+    guint ofono_watch;
 | 
			
		||||
 
 | 
			
		||||
     GDBusProxy *suspend_proxy;
 | 
			
		||||
     int suspend_delay_fd;
 | 
			
		||||
diff --git a/src/meson.build b/src/meson.build
 | 
			
		||||
index 0d10362..7429950 100644
 | 
			
		||||
--- a/src/meson.build
 | 
			
		||||
+++ b/src/meson.build
 | 
			
		||||
@@ -11,6 +11,7 @@ executable (
 | 
			
		||||
         'gpio.c', 'gpio.h',
 | 
			
		||||
         'manager.c', 'manager.h',
 | 
			
		||||
         'mm-iface.c', 'mm-iface.h',
 | 
			
		||||
+        'ofono-iface.c', 'ofono-iface.h',
 | 
			
		||||
         'suspend.c', 'suspend.h',
 | 
			
		||||
         'toml.c', 'toml.h',
 | 
			
		||||
         'udev.c', 'udev.h',
 | 
			
		||||
diff --git a/src/mm-iface.c b/src/mm-iface.c
 | 
			
		||||
index 8afe2ea..e1e3726 100644
 | 
			
		||||
--- a/src/mm-iface.c
 | 
			
		||||
+++ b/src/mm-iface.c
 | 
			
		||||
@@ -163,6 +163,13 @@ static void mm_appeared_cb(GDBusConnection    *connection,
 | 
			
		||||
 {
 | 
			
		||||
     g_message("ModemManager appeared on D-Bus");
 | 
			
		||||
 
 | 
			
		||||
+    if (manager->modem_iface != MODEM_IFACE_NONE) {
 | 
			
		||||
+        g_critical("Modem interface already found!");
 | 
			
		||||
+        g_critical("Make sure to only run either of ModemManager or oFono.");
 | 
			
		||||
+        return;
 | 
			
		||||
+    }
 | 
			
		||||
+    manager->modem_iface = MODEM_IFACE_MODEMMANAGER;
 | 
			
		||||
+
 | 
			
		||||
     mm_manager_new(connection, G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
 | 
			
		||||
                    NULL, (GAsyncReadyCallback)mm_manager_new_cb, manager);
 | 
			
		||||
 }
 | 
			
		||||
diff --git a/src/ofono-iface.c b/src/ofono-iface.c
 | 
			
		||||
new file mode 100644
 | 
			
		||||
index 0000000..d9051a3
 | 
			
		||||
--- /dev/null
 | 
			
		||||
+++ b/src/ofono-iface.c
 | 
			
		||||
@@ -0,0 +1,62 @@
 | 
			
		||||
+/*
 | 
			
		||||
+ * Copyright (C) 2020 Oliver Smith <ollieparanoid@postmarketos.org>
 | 
			
		||||
+ *
 | 
			
		||||
+ * SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
+ */
 | 
			
		||||
+
 | 
			
		||||
+#include "ofono-iface.h"
 | 
			
		||||
+
 | 
			
		||||
+#include <string.h>
 | 
			
		||||
+
 | 
			
		||||
+// #include <ofono/dbus.h>
 | 
			
		||||
+#define OFONO_SERVICE "org.ofono"
 | 
			
		||||
+
 | 
			
		||||
+static void ofono_appeared_cb(GDBusConnection    *connection,
 | 
			
		||||
+                              const gchar        *name,
 | 
			
		||||
+                              const gchar        *name_owner,
 | 
			
		||||
+                              struct EG25Manager *manager)
 | 
			
		||||
+{
 | 
			
		||||
+    g_message("oFono appeared on D-Bus");
 | 
			
		||||
+
 | 
			
		||||
+    if (manager->modem_iface != MODEM_IFACE_NONE) {
 | 
			
		||||
+        g_critical("Modem interface already found!");
 | 
			
		||||
+        g_critical("Make sure to only run either of ModemManager or oFono.");
 | 
			
		||||
+        return;
 | 
			
		||||
+    }
 | 
			
		||||
+    manager->modem_iface = MODEM_IFACE_OFONO;
 | 
			
		||||
+
 | 
			
		||||
+    /* now connect to oFono! */
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+static void ofono_vanished_cb(GDBusConnection    *connection,
 | 
			
		||||
+                              const gchar        *name,
 | 
			
		||||
+                              struct EG25Manager *manager)
 | 
			
		||||
+{
 | 
			
		||||
+    g_message("oFono vanished from D-Bus");
 | 
			
		||||
+
 | 
			
		||||
+    if (manager->modem_iface == MODEM_IFACE_OFONO) {
 | 
			
		||||
+        manager->modem_iface = MODEM_IFACE_NONE;
 | 
			
		||||
+        ofono_iface_destroy(manager);
 | 
			
		||||
+    }
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+void ofono_iface_init(struct EG25Manager *manager)
 | 
			
		||||
+{
 | 
			
		||||
+    manager->ofono_watch = g_bus_watch_name(G_BUS_TYPE_SYSTEM, OFONO_SERVICE,
 | 
			
		||||
+                                            G_BUS_NAME_WATCHER_FLAGS_AUTO_START,
 | 
			
		||||
+                                            (GBusNameAppearedCallback)ofono_appeared_cb,
 | 
			
		||||
+                                            (GBusNameVanishedCallback)ofono_vanished_cb,
 | 
			
		||||
+                                            manager, NULL);
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+void ofono_iface_destroy(struct EG25Manager *manager)
 | 
			
		||||
+{
 | 
			
		||||
+    if (manager->modem_usb_id) {
 | 
			
		||||
+        g_free(manager->modem_usb_id);
 | 
			
		||||
+        manager->modem_usb_id = NULL;
 | 
			
		||||
+    }
 | 
			
		||||
+    if (manager->ofono_watch != 0) {
 | 
			
		||||
+        g_bus_unwatch_name(manager->ofono_watch);
 | 
			
		||||
+        manager->ofono_watch = 0;
 | 
			
		||||
+    }
 | 
			
		||||
+}
 | 
			
		||||
diff --git a/src/ofono-iface.h b/src/ofono-iface.h
 | 
			
		||||
new file mode 100644
 | 
			
		||||
index 0000000..fd3766e
 | 
			
		||||
--- /dev/null
 | 
			
		||||
+++ b/src/ofono-iface.h
 | 
			
		||||
@@ -0,0 +1,12 @@
 | 
			
		||||
+/*
 | 
			
		||||
+ * Copyright (C) 2020 Oliver Smith <ollieparanoid@postmarketos.org>
 | 
			
		||||
+ *
 | 
			
		||||
+ * SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
+ */
 | 
			
		||||
+
 | 
			
		||||
+#pragma once
 | 
			
		||||
+
 | 
			
		||||
+#include "manager.h"
 | 
			
		||||
+
 | 
			
		||||
+void ofono_iface_init(struct EG25Manager *data);
 | 
			
		||||
+void ofono_iface_destroy(struct EG25Manager *data);
 | 
			
		||||
-- 
 | 
			
		||||
GitLab
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
From a3952107f5950535dd10d8c48ae807f3f4ec207e Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Bhushan Shah <bhush94@gmail.com>
 | 
			
		||||
Date: Thu, 11 Mar 2021 11:58:46 +0530
 | 
			
		||||
Subject: [PATCH 2/5] src: watch ofono service for new modem
 | 
			
		||||
 | 
			
		||||
If system is using ofono, use ofono dbus service to figure out the
 | 
			
		||||
modem's USB id.
 | 
			
		||||
---
 | 
			
		||||
 src/libgdbofono/dbus-introspect.sh |  11 ++
 | 
			
		||||
 src/libgdbofono/manager.xml        |  13 ++
 | 
			
		||||
 src/libgdbofono/meson.build        |  50 ++++++
 | 
			
		||||
 src/libgdbofono/modem-full.xml     | 249 +++++++++++++++++++++++++++++
 | 
			
		||||
 src/libgdbofono/modem.xml          |  37 +++++
 | 
			
		||||
 src/manager.h                      |   4 +
 | 
			
		||||
 src/meson.build                    |   4 +
 | 
			
		||||
 src/ofono-iface.c                  | 100 +++++++++++-
 | 
			
		||||
 8 files changed, 467 insertions(+), 1 deletion(-)
 | 
			
		||||
 create mode 100755 src/libgdbofono/dbus-introspect.sh
 | 
			
		||||
 create mode 100644 src/libgdbofono/manager.xml
 | 
			
		||||
 create mode 100644 src/libgdbofono/meson.build
 | 
			
		||||
 create mode 100644 src/libgdbofono/modem-full.xml
 | 
			
		||||
 create mode 100644 src/libgdbofono/modem.xml
 | 
			
		||||
 | 
			
		||||
diff --git a/src/libgdbofono/dbus-introspect.sh b/src/libgdbofono/dbus-introspect.sh
 | 
			
		||||
new file mode 100755
 | 
			
		||||
index 0000000..5a851ad
 | 
			
		||||
--- /dev/null
 | 
			
		||||
+++ b/src/libgdbofono/dbus-introspect.sh
 | 
			
		||||
@@ -0,0 +1,11 @@
 | 
			
		||||
+#!/bin/bash
 | 
			
		||||
+
 | 
			
		||||
+DEST="$1"
 | 
			
		||||
+OBJ_PATH="$2"
 | 
			
		||||
+METHOD="$3"
 | 
			
		||||
+shift 3
 | 
			
		||||
+
 | 
			
		||||
+dbus-send "$@" --print-reply --dest="$DEST" "$OBJ_PATH" "$METHOD" | \
 | 
			
		||||
+    grep -v '^method return' | \
 | 
			
		||||
+    sed -e 's/^[[:space:]]\+string "</</' \
 | 
			
		||||
+        -e 's_</node>"_</node>_'
 | 
			
		||||
diff --git a/src/libgdbofono/manager.xml b/src/libgdbofono/manager.xml
 | 
			
		||||
new file mode 100644
 | 
			
		||||
index 0000000..13e9d56
 | 
			
		||||
--- /dev/null
 | 
			
		||||
+++ b/src/libgdbofono/manager.xml
 | 
			
		||||
@@ -0,0 +1,13 @@
 | 
			
		||||
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
 | 
			
		||||
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
 | 
			
		||||
+<node>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.Manager"><method name="GetModems"><arg name="modems" type="a(oa{sv})" direction="out"/>
 | 
			
		||||
+</method><signal name="ModemAdded"><arg name="path" type="o"/>
 | 
			
		||||
+<arg name="properties" type="a{sv}"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+<signal name="ModemRemoved"><arg name="path" type="o"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+  </interface>
 | 
			
		||||
+
 | 
			
		||||
+</node>
 | 
			
		||||
diff --git a/src/libgdbofono/meson.build b/src/libgdbofono/meson.build
 | 
			
		||||
new file mode 100644
 | 
			
		||||
index 0000000..98eb9a3
 | 
			
		||||
--- /dev/null
 | 
			
		||||
+++ b/src/libgdbofono/meson.build
 | 
			
		||||
@@ -0,0 +1,50 @@
 | 
			
		||||
+#
 | 
			
		||||
+# Copyright (C) 2018 Purism SPC
 | 
			
		||||
+#
 | 
			
		||||
+# This file is part of Calls.
 | 
			
		||||
+#
 | 
			
		||||
+# Calls is free software: you can redistribute it and/or modify it
 | 
			
		||||
+# under the terms of the GNU General Public License as published by
 | 
			
		||||
+# the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
+# (at your option) any later version.
 | 
			
		||||
+#
 | 
			
		||||
+# Calls 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 Calls.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
+#
 | 
			
		||||
+# Author: Bob Ham <bob.ham@puri.sm>
 | 
			
		||||
+#
 | 
			
		||||
+# SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
+#
 | 
			
		||||
+
 | 
			
		||||
+
 | 
			
		||||
+gnome = import('gnome')
 | 
			
		||||
+dbus_interfaces = ['manager', 'modem']
 | 
			
		||||
+
 | 
			
		||||
+gdbofono_src = []
 | 
			
		||||
+gdbofono_headers = []
 | 
			
		||||
+foreach iface: dbus_interfaces
 | 
			
		||||
+  src = gnome.gdbus_codegen(
 | 
			
		||||
+    'gdbo-' + iface,
 | 
			
		||||
+    iface + '.xml',
 | 
			
		||||
+    interface_prefix: 'org.ofono.',
 | 
			
		||||
+    namespace: 'GDBO'
 | 
			
		||||
+  )
 | 
			
		||||
+  gdbofono_src += src
 | 
			
		||||
+  gdbofono_headers += src[1]
 | 
			
		||||
+endforeach
 | 
			
		||||
+
 | 
			
		||||
+gdbofono_deps = [
 | 
			
		||||
+  dependency('gio-2.0'),
 | 
			
		||||
+  dependency('gio-unix-2.0'),
 | 
			
		||||
+]
 | 
			
		||||
+
 | 
			
		||||
+gdbofono_lib = static_library(
 | 
			
		||||
+  'gdbofono',
 | 
			
		||||
+  gdbofono_src,
 | 
			
		||||
+  dependencies: gdbofono_deps
 | 
			
		||||
+)
 | 
			
		||||
diff --git a/src/libgdbofono/modem-full.xml b/src/libgdbofono/modem-full.xml
 | 
			
		||||
new file mode 100644
 | 
			
		||||
index 0000000..5319672
 | 
			
		||||
--- /dev/null
 | 
			
		||||
+++ b/src/libgdbofono/modem-full.xml
 | 
			
		||||
@@ -0,0 +1,249 @@
 | 
			
		||||
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
 | 
			
		||||
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
 | 
			
		||||
+<node>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.Modem"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
 | 
			
		||||
+</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
 | 
			
		||||
+<arg name="value" type="v" direction="in"/>
 | 
			
		||||
+</method><signal name="PropertyChanged"><arg name="name" type="s"/>
 | 
			
		||||
+<arg name="value" type="v"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+  </interface>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.SimManager"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
 | 
			
		||||
+</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
 | 
			
		||||
+<arg name="value" type="v" direction="in"/>
 | 
			
		||||
+</method><method name="ChangePin"><arg name="type" type="s" direction="in"/>
 | 
			
		||||
+<arg name="oldpin" type="s" direction="in"/>
 | 
			
		||||
+<arg name="newpin" type="s" direction="in"/>
 | 
			
		||||
+</method><method name="EnterPin"><arg name="type" type="s" direction="in"/>
 | 
			
		||||
+<arg name="pin" type="s" direction="in"/>
 | 
			
		||||
+</method><method name="ResetPin"><arg name="type" type="s" direction="in"/>
 | 
			
		||||
+<arg name="puk" type="s" direction="in"/>
 | 
			
		||||
+<arg name="newpin" type="s" direction="in"/>
 | 
			
		||||
+</method><method name="LockPin"><arg name="type" type="s" direction="in"/>
 | 
			
		||||
+<arg name="pin" type="s" direction="in"/>
 | 
			
		||||
+</method><method name="UnlockPin"><arg name="type" type="s" direction="in"/>
 | 
			
		||||
+<arg name="pin" type="s" direction="in"/>
 | 
			
		||||
+</method><method name="GetIcon"><arg name="id" type="y" direction="in"/>
 | 
			
		||||
+<arg name="icon" type="ay" direction="out"/>
 | 
			
		||||
+</method><signal name="PropertyChanged"><arg name="name" type="s"/>
 | 
			
		||||
+<arg name="value" type="v"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+  </interface>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.VoiceCallManager"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
 | 
			
		||||
+</method><method name="Dial"><arg name="number" type="s" direction="in"/>
 | 
			
		||||
+<arg name="hide_callerid" type="s" direction="in"/>
 | 
			
		||||
+<arg name="path" type="o" direction="out"/>
 | 
			
		||||
+</method><method name="DialLast"></method><method name="DialMemory"><arg name="memory_location" type="u" direction="in"/>
 | 
			
		||||
+</method><method name="Transfer"></method><method name="SwapCalls"></method><method name="ReleaseAndAnswer"></method><method name="ReleaseAndSwap"></method><method name="HoldAndAnswer"></method><method name="HangupAll"></method><method name="PrivateChat"><arg name="call" type="o" direction="in"/>
 | 
			
		||||
+<arg name="calls" type="ao" direction="out"/>
 | 
			
		||||
+</method><method name="CreateMultiparty"><arg name="calls" type="ao" direction="out"/>
 | 
			
		||||
+</method><method name="HangupMultiparty"></method><method name="SendTones"><arg name="SendTones" type="s" direction="in"/>
 | 
			
		||||
+</method><method name="GetCalls"><arg name="calls_with_properties" type="a(oa{sv})" direction="out"/>
 | 
			
		||||
+</method><signal name="Forwarded"><arg name="type" type="s"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+<signal name="BarringActive"><arg name="type" type="s"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+<signal name="PropertyChanged"><arg name="name" type="s"/>
 | 
			
		||||
+<arg name="value" type="v"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+<signal name="CallAdded"><arg name="path" type="o"/>
 | 
			
		||||
+<arg name="properties" type="a{sv}"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+<signal name="CallRemoved"><arg name="path" type="o"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+  </interface>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.AllowedAccessPoints"><method name="GetAllowedAccessPoints"><arg name="apnlist" type="as" direction="out"/>
 | 
			
		||||
+  </method></interface>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.SimAuthentication"><method name="GetApplications"><arg name="applications" type="a{oa{sv}}" direction="out"/>
 | 
			
		||||
+</method><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
 | 
			
		||||
+  </method></interface>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.SimToolkit"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
 | 
			
		||||
+</method><method name="SelectItem"><arg name="item" type="y" direction="in"/>
 | 
			
		||||
+<arg name="agent" type="o" direction="in"/>
 | 
			
		||||
+</method><method name="RegisterAgent"><arg name="path" type="o" direction="in"/>
 | 
			
		||||
+</method><method name="UnregisterAgent"><arg name="path" type="o" direction="in"/>
 | 
			
		||||
+</method><signal name="PropertyChanged"><arg name="name" type="s"/>
 | 
			
		||||
+<arg name="value" type="v"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+  </interface>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.CallForwarding"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
 | 
			
		||||
+</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
 | 
			
		||||
+<arg name="value" type="v" direction="in"/>
 | 
			
		||||
+</method><method name="DisableAll"><arg name="type" type="s" direction="in"/>
 | 
			
		||||
+</method><signal name="PropertyChanged"><arg name="name" type="s"/>
 | 
			
		||||
+<arg name="value" type="v"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+  </interface>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.RadioSettings"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
 | 
			
		||||
+</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
 | 
			
		||||
+<arg name="value" type="v" direction="in"/>
 | 
			
		||||
+</method><signal name="PropertyChanged"><arg name="name" type="s"/>
 | 
			
		||||
+<arg name="value" type="v"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+  </interface>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.TextTelephony"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
 | 
			
		||||
+</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
 | 
			
		||||
+<arg name="value" type="v" direction="in"/>
 | 
			
		||||
+</method><signal name="PropertyChanged"><arg name="name" type="s"/>
 | 
			
		||||
+<arg name="value" type="v"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+  </interface>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.Phonebook"><method name="Import"><arg name="entries" type="s" direction="out"/>
 | 
			
		||||
+  </method></interface>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.MessageManager"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
 | 
			
		||||
+</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
 | 
			
		||||
+<arg name="value" type="v" direction="in"/>
 | 
			
		||||
+</method><method name="SendMessage"><arg name="to" type="s" direction="in"/>
 | 
			
		||||
+<arg name="text" type="s" direction="in"/>
 | 
			
		||||
+<arg name="path" type="o" direction="out"/>
 | 
			
		||||
+</method><method name="GetMessages"><arg name="messages" type="a(oa{sv})" direction="out"/>
 | 
			
		||||
+</method><signal name="PropertyChanged"><arg name="name" type="s"/>
 | 
			
		||||
+<arg name="value" type="v"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+<signal name="IncomingMessage"><arg name="message" type="s"/>
 | 
			
		||||
+<arg name="info" type="a{sv}"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+<signal name="ImmediateMessage"><arg name="message" type="s"/>
 | 
			
		||||
+<arg name="info" type="a{sv}"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+<signal name="MessageAdded"><arg name="path" type="o"/>
 | 
			
		||||
+<arg name="properties" type="a{sv}"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+<signal name="MessageRemoved"><arg name="path" type="o"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+  </interface>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.PushNotification"><method name="RegisterAgent"><arg name="path" type="o" direction="in"/>
 | 
			
		||||
+</method><method name="UnregisterAgent"><arg name="path" type="o" direction="in"/>
 | 
			
		||||
+  </method></interface>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.SmartMessaging"><method name="RegisterAgent"><arg name="path" type="o" direction="in"/>
 | 
			
		||||
+</method><method name="UnregisterAgent"><arg name="path" type="o" direction="in"/>
 | 
			
		||||
+</method><method name="SendBusinessCard"><arg name="to" type="s" direction="in"/>
 | 
			
		||||
+<arg name="card" type="ay" direction="in"/>
 | 
			
		||||
+<arg name="path" type="o" direction="out"/>
 | 
			
		||||
+</method><method name="SendAppointment"><arg name="to" type="s" direction="in"/>
 | 
			
		||||
+<arg name="appointment" type="ay" direction="in"/>
 | 
			
		||||
+<arg name="path" type="o" direction="out"/>
 | 
			
		||||
+  </method></interface>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.MessageWaiting"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
 | 
			
		||||
+</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
 | 
			
		||||
+<arg name="value" type="v" direction="in"/>
 | 
			
		||||
+</method><signal name="PropertyChanged"><arg name="name" type="s"/>
 | 
			
		||||
+<arg name="value" type="v"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+  </interface>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.CallSettings"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
 | 
			
		||||
+</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
 | 
			
		||||
+<arg name="value" type="v" direction="in"/>
 | 
			
		||||
+</method><signal name="PropertyChanged"><arg name="property" type="s"/>
 | 
			
		||||
+<arg name="value" type="v"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+  </interface>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.CallBarring"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
 | 
			
		||||
+</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
 | 
			
		||||
+<arg name="value" type="v" direction="in"/>
 | 
			
		||||
+<arg name="pin2" type="s" direction="in"/>
 | 
			
		||||
+</method><method name="DisableAll"><arg name="password" type="s" direction="in"/>
 | 
			
		||||
+</method><method name="DisableAllIncoming"><arg name="password" type="s" direction="in"/>
 | 
			
		||||
+</method><method name="DisableAllOutgoing"><arg name="password" type="s" direction="in"/>
 | 
			
		||||
+</method><method name="ChangePassword"><arg name="old" type="s" direction="in"/>
 | 
			
		||||
+<arg name="new" type="s" direction="in"/>
 | 
			
		||||
+</method><signal name="PropertyChanged"><arg name="name" type="s"/>
 | 
			
		||||
+<arg name="value" type="v"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+  </interface>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.SupplementaryServices"><method name="Initiate"><arg name="command" type="s" direction="in"/>
 | 
			
		||||
+<arg name="result_name" type="s" direction="out"/>
 | 
			
		||||
+<arg name="value" type="v" direction="out"/>
 | 
			
		||||
+</method><method name="Respond"><arg name="reply" type="s" direction="in"/>
 | 
			
		||||
+<arg name="result" type="s" direction="out"/>
 | 
			
		||||
+</method><method name="Cancel"></method><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
 | 
			
		||||
+</method><signal name="NotificationReceived"><arg name="message" type="s"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+<signal name="RequestReceived"><arg name="message" type="s"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+<signal name="PropertyChanged"><arg name="name" type="s"/>
 | 
			
		||||
+<arg name="value" type="v"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+  </interface>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.CallMeter"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
 | 
			
		||||
+</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
 | 
			
		||||
+<arg name="value" type="v" direction="in"/>
 | 
			
		||||
+<arg name="password" type="s" direction="in"/>
 | 
			
		||||
+</method><method name="Reset"><arg name="passoword" type="s" direction="in"/>
 | 
			
		||||
+</method><signal name="PropertyChanged"><arg name="property" type="s"/>
 | 
			
		||||
+<arg name="value" type="v"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+<signal name="NearMaximumWarning"></signal>
 | 
			
		||||
+  </interface>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.CallVolume"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
 | 
			
		||||
+</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
 | 
			
		||||
+<arg name="value" type="v" direction="in"/>
 | 
			
		||||
+</method><signal name="PropertyChanged"><arg name="property" type="s"/>
 | 
			
		||||
+<arg name="value" type="v"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+  </interface>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.NetworkRegistration"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
 | 
			
		||||
+</method><method name="Register"></method><method name="GetOperators"><arg name="operators_with_properties" type="a(oa{sv})" direction="out"/>
 | 
			
		||||
+</method><method name="Scan"><arg name="operators_with_properties" type="a(oa{sv})" direction="out"/>
 | 
			
		||||
+</method><signal name="PropertyChanged"><arg name="name" type="s"/>
 | 
			
		||||
+<arg name="value" type="v"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+  </interface>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.CellBroadcast"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
 | 
			
		||||
+</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
 | 
			
		||||
+<arg name="value" type="v" direction="in"/>
 | 
			
		||||
+</method><signal name="PropertyChanged"><arg name="property" type="s"/>
 | 
			
		||||
+<arg name="value" type="v"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+<signal name="IncomingBroadcast"><arg name="message" type="s"/>
 | 
			
		||||
+<arg name="channel" type="q"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+<signal name="EmergencyBroadcast"><arg name="message" type="s"/>
 | 
			
		||||
+<arg name="dict" type="a{sv}"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+  </interface>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.AssistedSatelliteNavigation"><method name="SendPositioningElement"><arg name="xml_elements" type="(null)" direction="in"/>
 | 
			
		||||
+</method><method name="RegisterPositioningRequestAgent"><arg name="agent" type="o" direction="in"/>
 | 
			
		||||
+</method><method name="UnregisterPositioningRequestAgent"><arg name="agent" type="o" direction="in"/>
 | 
			
		||||
+  </method></interface>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.ConnectionManager"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
 | 
			
		||||
+</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
 | 
			
		||||
+<arg name="value" type="v" direction="in"/>
 | 
			
		||||
+</method><method name="AddContext"><arg name="type" type="s" direction="in"/>
 | 
			
		||||
+<arg name="path" type="o" direction="out"/>
 | 
			
		||||
+</method><method name="RemoveContext"><arg name="path" type="o" direction="in"/>
 | 
			
		||||
+</method><method name="DeactivateAll"></method><method name="GetContexts"><arg name="contexts_with_properties" type="a(oa{sv})" direction="out"/>
 | 
			
		||||
+</method><method name="ResetContexts"></method><signal name="PropertyChanged"><arg name="name" type="s"/>
 | 
			
		||||
+<arg name="value" type="v"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+<signal name="ContextAdded"><arg name="path" type="o"/>
 | 
			
		||||
+<arg name="properties" type="a{sv}"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+<signal name="ContextRemoved"><arg name="path" type="o"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+  </interface>
 | 
			
		||||
+
 | 
			
		||||
+</node>
 | 
			
		||||
diff --git a/src/libgdbofono/modem.xml b/src/libgdbofono/modem.xml
 | 
			
		||||
new file mode 100644
 | 
			
		||||
index 0000000..c02d250
 | 
			
		||||
--- /dev/null
 | 
			
		||||
+++ b/src/libgdbofono/modem.xml
 | 
			
		||||
@@ -0,0 +1,37 @@
 | 
			
		||||
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
 | 
			
		||||
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
 | 
			
		||||
+<node>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.Modem"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
 | 
			
		||||
+</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
 | 
			
		||||
+<arg name="value" type="v" direction="in"/>
 | 
			
		||||
+</method><signal name="PropertyChanged"><arg name="name" type="s"/>
 | 
			
		||||
+<arg name="value" type="v"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+  </interface>
 | 
			
		||||
+
 | 
			
		||||
+  <interface name="org.ofono.VoiceCallManager"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
 | 
			
		||||
+</method><method name="Dial"><arg name="number" type="s" direction="in"/>
 | 
			
		||||
+<arg name="hide_callerid" type="s" direction="in"/>
 | 
			
		||||
+<arg name="path" type="o" direction="out"/>
 | 
			
		||||
+</method><method name="DialLast"></method><method name="DialMemory"><arg name="memory_location" type="u" direction="in"/>
 | 
			
		||||
+</method><method name="Transfer"></method><method name="SwapCalls"></method><method name="ReleaseAndAnswer"></method><method name="ReleaseAndSwap"></method><method name="HoldAndAnswer"></method><method name="HangupAll"></method><method name="PrivateChat"><arg name="call" type="o" direction="in"/>
 | 
			
		||||
+<arg name="calls" type="ao" direction="out"/>
 | 
			
		||||
+</method><method name="CreateMultiparty"><arg name="calls" type="ao" direction="out"/>
 | 
			
		||||
+</method><method name="HangupMultiparty"></method><method name="SendTones"><arg name="SendTones" type="s" direction="in"/>
 | 
			
		||||
+</method><method name="GetCalls"><arg name="calls_with_properties" type="a(oa{sv})" direction="out"/>
 | 
			
		||||
+</method><signal name="Forwarded"><arg name="type" type="s"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+<signal name="BarringActive"><arg name="type" type="s"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+<signal name="PropertyChanged"><arg name="name" type="s"/>
 | 
			
		||||
+<arg name="value" type="v"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+<signal name="CallAdded"><arg name="path" type="o"/>
 | 
			
		||||
+<arg name="properties" type="a{sv}"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+<signal name="CallRemoved"><arg name="path" type="o"/>
 | 
			
		||||
+</signal>
 | 
			
		||||
+  </interface>
 | 
			
		||||
+
 | 
			
		||||
+</node>
 | 
			
		||||
diff --git a/src/manager.h b/src/manager.h
 | 
			
		||||
index 5ed9e75..ec5550b 100644
 | 
			
		||||
--- a/src/manager.h
 | 
			
		||||
+++ b/src/manager.h
 | 
			
		||||
@@ -10,6 +10,7 @@
 | 
			
		||||
 #include <gpiod.h>
 | 
			
		||||
 #include <gudev/gudev.h>
 | 
			
		||||
 #include <libmm-glib.h>
 | 
			
		||||
+#include <libgdbofono/gdbo-manager.h>
 | 
			
		||||
 
 | 
			
		||||
 #include "toml.h"
 | 
			
		||||
 
 | 
			
		||||
@@ -51,7 +52,10 @@ struct EG25Manager {
 | 
			
		||||
     guint mm_watch;
 | 
			
		||||
     MMManager *mm_manager;
 | 
			
		||||
     MMModem *mm_modem;
 | 
			
		||||
+
 | 
			
		||||
     guint ofono_watch;
 | 
			
		||||
+    GDBOManager *ofono_manager;
 | 
			
		||||
+    GDBusConnection *ofono_connection;
 | 
			
		||||
 
 | 
			
		||||
     GDBusProxy *suspend_proxy;
 | 
			
		||||
     int suspend_delay_fd;
 | 
			
		||||
diff --git a/src/meson.build b/src/meson.build
 | 
			
		||||
index 7429950..6a9f52d 100644
 | 
			
		||||
--- a/src/meson.build
 | 
			
		||||
+++ b/src/meson.build
 | 
			
		||||
@@ -4,6 +4,9 @@
 | 
			
		||||
 # SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
 #
 | 
			
		||||
 
 | 
			
		||||
+
 | 
			
		||||
+subdir('libgdbofono')
 | 
			
		||||
+
 | 
			
		||||
 executable (
 | 
			
		||||
     'eg25manager',
 | 
			
		||||
     [
 | 
			
		||||
@@ -17,5 +20,6 @@ executable (
 | 
			
		||||
         'udev.c', 'udev.h',
 | 
			
		||||
     ],
 | 
			
		||||
     dependencies : mgr_deps,
 | 
			
		||||
+    link_with: gdbofono_lib,
 | 
			
		||||
     install : true
 | 
			
		||||
 )
 | 
			
		||||
diff --git a/src/ofono-iface.c b/src/ofono-iface.c
 | 
			
		||||
index d9051a3..00bf665 100644
 | 
			
		||||
--- a/src/ofono-iface.c
 | 
			
		||||
+++ b/src/ofono-iface.c
 | 
			
		||||
@@ -8,14 +8,91 @@
 | 
			
		||||
 
 | 
			
		||||
 #include <string.h>
 | 
			
		||||
 
 | 
			
		||||
+#include <libgdbofono/gdbo-manager.h>
 | 
			
		||||
+#include <libgdbofono/gdbo-modem.h>
 | 
			
		||||
+
 | 
			
		||||
 // #include <ofono/dbus.h>
 | 
			
		||||
 #define OFONO_SERVICE "org.ofono"
 | 
			
		||||
 
 | 
			
		||||
+static void modem_added_cb(GDBOManager *manager_proxy,
 | 
			
		||||
+                           const gchar *path,
 | 
			
		||||
+                           GVariant *properties,
 | 
			
		||||
+                           struct EG25Manager *manager)
 | 
			
		||||
+{
 | 
			
		||||
+    GVariant *modem_path;
 | 
			
		||||
+    /*
 | 
			
		||||
+    gdbo_modem_proxy_new(manager->ofono_connection,
 | 
			
		||||
+                         G_DBUS_PROXY_FLAGS_NONE,
 | 
			
		||||
+                         g_dbus_proxy_get_name(G_DBUS_PROXY(manager_proxy)),
 | 
			
		||||
+                         path,
 | 
			
		||||
+                         NULL,
 | 
			
		||||
+                         (GAsyncReadyCallback) modem_proxy_new_cb,
 | 
			
		||||
+                         manager);
 | 
			
		||||
+    */
 | 
			
		||||
+    g_debug("Adding ofono modem '%s'", path);
 | 
			
		||||
+
 | 
			
		||||
+    if (manager->modem_state == EG25_STATE_RESUMING) {
 | 
			
		||||
+        if (manager->modem_recovery_timer) {
 | 
			
		||||
+            g_source_remove(manager->modem_recovery_timer);
 | 
			
		||||
+            manager->modem_recovery_timer = 0;
 | 
			
		||||
+        }
 | 
			
		||||
+        modem_resume_post(manager);
 | 
			
		||||
+        manager->modem_state = EG25_STATE_CONFIGURED;
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
+    if (manager->modem_state < EG25_STATE_ACQUIRED)
 | 
			
		||||
+        manager->modem_state = EG25_STATE_ACQUIRED;
 | 
			
		||||
+
 | 
			
		||||
+    if (manager->modem_state < EG25_STATE_CONFIGURED)
 | 
			
		||||
+        modem_configure(manager);
 | 
			
		||||
+
 | 
			
		||||
+    modem_path = g_variant_lookup_value(properties, "SystemPath", G_VARIANT_TYPE_STRING);
 | 
			
		||||
+    if (manager->modem_usb_id)
 | 
			
		||||
+        g_free(manager->modem_usb_id);
 | 
			
		||||
+    manager->modem_usb_id = g_strdup(strrchr(g_variant_dup_string(modem_path, NULL), '/') + 1);
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+static void modem_removed_cb(GDBOManager *manager_proxy,
 | 
			
		||||
+                             const gchar *path,
 | 
			
		||||
+                             struct EG25Manager *manager)
 | 
			
		||||
+{
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+static void get_modems_cb(GDBOManager *manager_proxy,
 | 
			
		||||
+                          GAsyncResult *res,
 | 
			
		||||
+                          struct EG25Manager *manager)
 | 
			
		||||
+{
 | 
			
		||||
+    gboolean ok;
 | 
			
		||||
+    GVariant *modems;
 | 
			
		||||
+    GVariantIter *modems_iter = NULL;
 | 
			
		||||
+    g_autoptr(GError) error = NULL;
 | 
			
		||||
+
 | 
			
		||||
+    const gchar *path;
 | 
			
		||||
+    GVariant *properties;
 | 
			
		||||
+
 | 
			
		||||
+    ok = gdbo_manager_call_get_modems_finish(manager_proxy, &modems,
 | 
			
		||||
+                                             res, &error);
 | 
			
		||||
+    if (!ok) {
 | 
			
		||||
+        g_warning("Error getting modems from ofono manager: %s", error->message);
 | 
			
		||||
+        return;
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
+    g_variant_get(modems, "a(oa{sv})", &modems_iter);
 | 
			
		||||
+    while(g_variant_iter_loop(modems_iter, "(&o@a{sv})", &path, &properties)) {
 | 
			
		||||
+        g_debug("Got modem object path '%s'", path);
 | 
			
		||||
+        modem_added_cb(manager_proxy, path, properties, manager);
 | 
			
		||||
+    }
 | 
			
		||||
+    g_variant_iter_free(modems_iter);
 | 
			
		||||
+    g_variant_unref(modems);
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 static void ofono_appeared_cb(GDBusConnection    *connection,
 | 
			
		||||
                               const gchar        *name,
 | 
			
		||||
                               const gchar        *name_owner,
 | 
			
		||||
                               struct EG25Manager *manager)
 | 
			
		||||
 {
 | 
			
		||||
+    GError *error = NULL;
 | 
			
		||||
+
 | 
			
		||||
     g_message("oFono appeared on D-Bus");
 | 
			
		||||
 
 | 
			
		||||
     if (manager->modem_iface != MODEM_IFACE_NONE) {
 | 
			
		||||
@@ -23,9 +100,30 @@ static void ofono_appeared_cb(GDBusConnection    *connection,
 | 
			
		||||
         g_critical("Make sure to only run either of ModemManager or oFono.");
 | 
			
		||||
         return;
 | 
			
		||||
     }
 | 
			
		||||
+    /* now connect to oFono! */
 | 
			
		||||
+    manager->ofono_connection = connection;
 | 
			
		||||
+    manager->ofono_manager = gdbo_manager_proxy_new_sync(connection,
 | 
			
		||||
+                                                         G_DBUS_PROXY_FLAGS_NONE,
 | 
			
		||||
+                                                         OFONO_SERVICE,
 | 
			
		||||
+                                                         "/",
 | 
			
		||||
+                                                         NULL,
 | 
			
		||||
+                                                         &error);
 | 
			
		||||
+    if (!manager->ofono_manager) {
 | 
			
		||||
+        g_critical("Error creating ofono object manager proxy: %s", error->message);
 | 
			
		||||
+        return;
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
     manager->modem_iface = MODEM_IFACE_OFONO;
 | 
			
		||||
 
 | 
			
		||||
-    /* now connect to oFono! */
 | 
			
		||||
+    g_signal_connect(manager->ofono_manager, "modem-added",
 | 
			
		||||
+                     G_CALLBACK(modem_added_cb), manager);
 | 
			
		||||
+    g_signal_connect(manager->ofono_manager, "modem-removed",
 | 
			
		||||
+                     G_CALLBACK(modem_removed_cb), manager);
 | 
			
		||||
+
 | 
			
		||||
+    gdbo_manager_call_get_modems(manager->ofono_manager,
 | 
			
		||||
+                                 NULL,
 | 
			
		||||
+                                 (GAsyncReadyCallback) get_modems_cb,
 | 
			
		||||
+                                 manager);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static void ofono_vanished_cb(GDBusConnection    *connection,
 | 
			
		||||
-- 
 | 
			
		||||
GitLab
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
From 9c4f5669fc6b76eac280f165aab972552f2df824 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Bhushan Shah <bhush94@gmail.com>
 | 
			
		||||
Date: Thu, 11 Mar 2021 12:13:04 +0530
 | 
			
		||||
Subject: [PATCH 3/5] at: if we are using ofono, don't query modem manager for
 | 
			
		||||
 state
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 src/at.c | 14 +++++++++-----
 | 
			
		||||
 1 file changed, 9 insertions(+), 5 deletions(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/src/at.c b/src/at.c
 | 
			
		||||
index 4b5cd62..32138d0 100644
 | 
			
		||||
--- a/src/at.c
 | 
			
		||||
+++ b/src/at.c
 | 
			
		||||
@@ -76,12 +76,16 @@ static gboolean send_at_command(struct EG25Manager *manager)
 | 
			
		||||
 
 | 
			
		||||
         g_message("Sending command: %s", g_strstrip(command));
 | 
			
		||||
     } else if (manager->modem_state < EG25_STATE_CONFIGURED) {
 | 
			
		||||
-        MMModemState modem_state = mm_modem_get_state(manager->mm_modem);
 | 
			
		||||
-
 | 
			
		||||
-        if (manager->mm_modem && modem_state >= MM_MODEM_STATE_REGISTERED)
 | 
			
		||||
-            modem_update_state(manager, modem_state);
 | 
			
		||||
-        else
 | 
			
		||||
+        if (manager->modem_iface == MODEM_IFACE_MODEMMANAGER) {
 | 
			
		||||
+            MMModemState modem_state = mm_modem_get_state(manager->mm_modem);
 | 
			
		||||
+
 | 
			
		||||
+            if (manager->mm_modem && modem_state >= MM_MODEM_STATE_REGISTERED)
 | 
			
		||||
+                modem_update_state(manager, modem_state);
 | 
			
		||||
+            else
 | 
			
		||||
+                manager->modem_state = EG25_STATE_CONFIGURED;
 | 
			
		||||
+        } else {
 | 
			
		||||
             manager->modem_state = EG25_STATE_CONFIGURED;
 | 
			
		||||
+        }
 | 
			
		||||
     } else if (manager->modem_state == EG25_STATE_SUSPENDING) {
 | 
			
		||||
         modem_suspend_post(manager);
 | 
			
		||||
     } else if (manager->modem_state == EG25_STATE_RESETTING) {
 | 
			
		||||
-- 
 | 
			
		||||
GitLab
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
From 742172a9129a3c11c2825d323f8f98730f7533db Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Bhushan Shah <bhush94@gmail.com>
 | 
			
		||||
Date: Thu, 11 Mar 2021 13:08:21 +0530
 | 
			
		||||
Subject: [PATCH 4/5] suspend: if we are using ofono, mark modem as resumed
 | 
			
		||||
 immediately
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 src/suspend.c | 5 ++++-
 | 
			
		||||
 1 file changed, 4 insertions(+), 1 deletion(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/src/suspend.c b/src/suspend.c
 | 
			
		||||
index 256636e..b82ca7e 100644
 | 
			
		||||
--- a/src/suspend.c
 | 
			
		||||
+++ b/src/suspend.c
 | 
			
		||||
@@ -170,11 +170,14 @@ static void signal_cb(GDBusProxy *proxy,
 | 
			
		||||
         g_message("system is resuming");
 | 
			
		||||
         take_inhibitor(manager, FALSE);
 | 
			
		||||
         modem_resume_pre(manager);
 | 
			
		||||
-        if (manager->mm_modem) {
 | 
			
		||||
+        if (manager->mm_modem || manager->modem_iface == MODEM_IFACE_OFONO) {
 | 
			
		||||
             /*
 | 
			
		||||
              * On some systems ModemManager doesn't handle suspend/resume, so
 | 
			
		||||
              * we still have a valid/managed modem when resuming. In this case,
 | 
			
		||||
              * do the whole resume sequence immediately.
 | 
			
		||||
+             *
 | 
			
		||||
+             * If modem is managed by ofono, we also do resume sequence immediately
 | 
			
		||||
+             * as ofono handles resuming from sleep itself.
 | 
			
		||||
              */
 | 
			
		||||
             manager->modem_state = EG25_STATE_CONFIGURED;
 | 
			
		||||
             modem_resume_post(manager);
 | 
			
		||||
-- 
 | 
			
		||||
GitLab
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
From 87ff1e0a5a6f379528e1e581372e9d60d35e044f Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Bhushan Shah <bhush94@gmail.com>
 | 
			
		||||
Date: Thu, 11 Mar 2021 14:22:50 +0530
 | 
			
		||||
Subject: [PATCH 5/5] ofono-iface: add spdx copyright info
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 src/ofono-iface.c | 1 +
 | 
			
		||||
 1 file changed, 1 insertion(+)
 | 
			
		||||
 | 
			
		||||
diff --git a/src/ofono-iface.c b/src/ofono-iface.c
 | 
			
		||||
index 00bf665..caf32dd 100644
 | 
			
		||||
--- a/src/ofono-iface.c
 | 
			
		||||
+++ b/src/ofono-iface.c
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
 /*
 | 
			
		||||
  * Copyright (C) 2020 Oliver Smith <ollieparanoid@postmarketos.org>
 | 
			
		||||
+ * Copyright (C) 2021 Bhushan Shah <bshah@kde.org>
 | 
			
		||||
  *
 | 
			
		||||
  * SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
  */
 | 
			
		||||
-- 
 | 
			
		||||
GitLab
 | 
			
		||||
 | 
			
		||||
@@ -6,6 +6,24 @@ Before=ModemManager.service
 | 
			
		||||
Type=simple
 | 
			
		||||
ExecStart=/usr/bin/eg25manager
 | 
			
		||||
Restart=on-failure
 | 
			
		||||
ProtectControlGroups=true
 | 
			
		||||
ProtectHome=true
 | 
			
		||||
ProtectKernelTunables=true
 | 
			
		||||
ProtectSystem=strict
 | 
			
		||||
RestrictSUIDSGID=true
 | 
			
		||||
PrivateTmp=true
 | 
			
		||||
ProtectedKernelModules=true
 | 
			
		||||
MemoryDenyWriteExecute=true
 | 
			
		||||
PrivateMounts=true
 | 
			
		||||
NoNewPrivileges=true
 | 
			
		||||
CapabilityBoundingSet=
 | 
			
		||||
ProtectProc=true
 | 
			
		||||
ProtectDevices=true
 | 
			
		||||
DeviceAllow=/dev/ttyS2
 | 
			
		||||
LockPersonality=true
 | 
			
		||||
PrivateNetwork=true
 | 
			
		||||
ProtectClock=true
 | 
			
		||||
ProtectKernelLog=true
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										15
									
								
								net-misc/eg25-manager/metadata.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								net-misc/eg25-manager/metadata.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
 | 
			
		||||
<pkgmetadata>
 | 
			
		||||
	<maintainer type="person">
 | 
			
		||||
		<email>gjdijkman@gjdwebserver.nl</email>
 | 
			
		||||
		<name>Gerben Jan Dijkman</name>
 | 
			
		||||
	</maintainer>
 | 
			
		||||
	<longdescription lang="en">
 | 
			
		||||
	Manager daemon for the Quectel EG25 mobile broadband modem.
 | 
			
		||||
	</longdescription>
 | 
			
		||||
	<upstream>
 | 
			
		||||
		<doc>https://gitlab.com/mobian1/devices/eg25-manager</doc>
 | 
			
		||||
		<bugs-to>https://gitlab.com/mobian1/devices/eg25-manager/-/issues</bugs-to>
 | 
			
		||||
	</upstream>
 | 
			
		||||
</pkgmetadata>
 | 
			
		||||
		Reference in New Issue
	
	Block a user