mirror of
https://gitlab.com/mobian1/eg25-manager.git
synced 2025-08-30 07:42:23 +02:00
Compare commits
47 Commits
0.4.3
...
mobian/0.4
Author | SHA1 | Date | |
---|---|---|---|
|
9c05776843 | ||
|
08a7039ca0 | ||
|
929b3942c0 | ||
|
f8430eb16f | ||
|
1b69252cbe | ||
|
c17f947249 | ||
|
e96aec8390 | ||
|
e4ae8d6382 | ||
|
da8a008268 | ||
|
30ce2bb3e2 | ||
|
162fcf6fca | ||
|
24dbcf464c | ||
|
b62b155875 | ||
|
67195a8e58 | ||
|
c7e8d9171c | ||
|
5db68722ec | ||
|
432bd454bb | ||
|
986e7f08c4 | ||
|
4089f2ea6b | ||
|
c77c58df49 | ||
|
5cc5ff5c0e | ||
|
6a81955086 | ||
|
af3a2b25bc | ||
|
70db05fc62 | ||
|
705a454882 | ||
|
2469757af4 | ||
|
514b00cc9c | ||
|
e078b8bc09 | ||
|
d976c75fa2 | ||
|
f86d0ef062 | ||
|
276c71f223 | ||
|
1423021f97 | ||
|
fc915f570d | ||
|
c77490a2ac | ||
|
fbd5c0cb86 | ||
|
5bcefbeab0 | ||
|
f85e8f70c7 | ||
|
2da2c9dfe2 | ||
|
dfaac39162 | ||
|
7dc0d1678c | ||
|
397a16a9e3 | ||
|
59219fbd20 | ||
|
c953d41436 | ||
|
82bf80c5f4 | ||
|
339faa46dc | ||
|
cdf92755cb | ||
|
7c04c1998f |
@@ -4,7 +4,7 @@ Before=ModemManager.service
|
|||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
ExecStart=@bindir@/eg25-manager
|
ExecStart=@bindir@/eg25manager
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
ProtectControlGroups=true
|
ProtectControlGroups=true
|
||||||
ProtectHome=true
|
ProtectHome=true
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
[manager]
|
[manager]
|
||||||
monitor_udev = true
|
|
||||||
need_libusb = true
|
need_libusb = true
|
||||||
usb_vid = 0x2c7c
|
usb_vid = 0x2c7c
|
||||||
usb_pid = 0x0125
|
usb_pid = 0x0125
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
[manager]
|
[manager]
|
||||||
monitor_udev = true
|
|
||||||
need_libusb = true
|
need_libusb = true
|
||||||
usb_vid = 0x2c7c
|
usb_vid = 0x2c7c
|
||||||
usb_pid = 0x0125
|
usb_pid = 0x0125
|
||||||
|
@@ -1,7 +1,4 @@
|
|||||||
[manager]
|
[manager]
|
||||||
monitor_udev = true
|
|
||||||
usb_vid = 0x2c7c
|
|
||||||
usb_pid = 0x0125
|
|
||||||
# Delay between setting GPIO and PWRKEY sequence, set in microseconds
|
# Delay between setting GPIO and PWRKEY sequence, set in microseconds
|
||||||
poweron_delay = 100000
|
poweron_delay = 100000
|
||||||
|
|
||||||
@@ -63,9 +60,9 @@ configure = [
|
|||||||
{ cmd = "QSCLK", value = "1" },
|
{ cmd = "QSCLK", value = "1" },
|
||||||
# GNSS configuration:
|
# GNSS configuration:
|
||||||
# * Enable A-GPS data upload support (XTRA)
|
# * Enable A-GPS data upload support (XTRA)
|
||||||
# * Disable On-Demand-Positioning (ODP) mode
|
# * Disable On-Demand-Positioning (ODP) mode
|
||||||
# to avoid running the GNSS system in the background, even when not enabled.
|
# to avoid running the GNSS system in the background, even when not enabled.
|
||||||
# * Enable Dynamic Power Optimizations (DPO) mode to turn off GNSS RF radios
|
# * Enable Dynamic Power Optimizations (DPO) mode to turn off GNSS RF radios
|
||||||
# when they are not in use.
|
# when they are not in use.
|
||||||
# * Only enable GPS and GLONASS, disable other GNSS systems.
|
# * Only enable GPS and GLONASS, disable other GNSS systems.
|
||||||
# A-GPS data upload doesn't work for Galileo anyway.
|
# A-GPS data upload doesn't work for Galileo anyway.
|
||||||
|
@@ -1,7 +1,4 @@
|
|||||||
[manager]
|
[manager]
|
||||||
monitor_udev = false
|
|
||||||
usb_vid = 0x2c7c
|
|
||||||
usb_pid = 0x0125
|
|
||||||
# Delay between setting GPIO and PWRKEY sequence, set in microseconds
|
# Delay between setting GPIO and PWRKEY sequence, set in microseconds
|
||||||
poweron_delay = 100000
|
poweron_delay = 100000
|
||||||
|
|
||||||
@@ -38,7 +35,7 @@ configure = [
|
|||||||
# Print software version
|
# Print software version
|
||||||
{ cmd = "QGMR" },
|
{ cmd = "QGMR" },
|
||||||
# Configure audio
|
# Configure audio
|
||||||
{ cmd = "QDAI", expect = "3,0,0,4,0,1,1,1" },
|
{ cmd = "QDAI", expect = "3,0,0,4,0,0,1,1" },
|
||||||
# RI signaling using physical RI pin
|
# RI signaling using physical RI pin
|
||||||
{ cmd = "QCFG", subcmd = "risignaltype", expect = "\"physical\"" },
|
{ cmd = "QCFG", subcmd = "risignaltype", expect = "\"physical\"" },
|
||||||
# Enable VoLTE support
|
# Enable VoLTE support
|
||||||
@@ -63,9 +60,9 @@ configure = [
|
|||||||
{ cmd = "QSCLK", value = "1" },
|
{ cmd = "QSCLK", value = "1" },
|
||||||
# GNSS configuration:
|
# GNSS configuration:
|
||||||
# * Enable A-GPS data upload support (XTRA)
|
# * Enable A-GPS data upload support (XTRA)
|
||||||
# * Disable On-Demand-Positioning (ODP) mode
|
# * Disable On-Demand-Positioning (ODP) mode
|
||||||
# to avoid running the GNSS system in the background, even when not enabled.
|
# to avoid running the GNSS system in the background, even when not enabled.
|
||||||
# * Enable Dynamic Power Optimizations (DPO) mode to turn off GNSS RF radios
|
# * Enable Dynamic Power Optimizations (DPO) mode to turn off GNSS RF radios
|
||||||
# when they are not in use.
|
# when they are not in use.
|
||||||
# * Only enable GPS and GLONASS, disable other GNSS systems.
|
# * Only enable GPS and GLONASS, disable other GNSS systems.
|
||||||
# A-GPS data upload doesn't work for Galileo anyway.
|
# A-GPS data upload doesn't work for Galileo anyway.
|
||||||
|
112
debian/changelog
vendored
Normal file
112
debian/changelog
vendored
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
eg25-manager (0.4.2-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* d/gbp.conf: update for current Mobian workflow
|
||||||
|
* New upstream version 0.4.2
|
||||||
|
|
||||||
|
-- Arnaud Ferraris <arnaud.ferraris@collabora.com> Wed, 08 Dec 2021 18:24:38 +0100
|
||||||
|
|
||||||
|
eg25-manager (0.4.1-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* New upstream version 0.4.1
|
||||||
|
* debian: drop distro-specific systemd service.
|
||||||
|
* d/copyright: add missing entries
|
||||||
|
|
||||||
|
-- Arnaud Ferraris <arnaud.ferraris@collabora.com> Fri, 08 Oct 2021 11:02:27 +0200
|
||||||
|
|
||||||
|
eg25-manager (0.4.0-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ undef ]
|
||||||
|
* d/service: Use systemd to sandbox eg25-manager.
|
||||||
|
* d/salsa-ci: Add Mobian's CI
|
||||||
|
|
||||||
|
[ Arnaud Ferraris ]
|
||||||
|
* New upstream version 0.4.0
|
||||||
|
* d/eg25-manager.service: be less restrictive.
|
||||||
|
* d/control: add libcurl as build dependency
|
||||||
|
|
||||||
|
-- Arnaud Ferraris <arnaud.ferraris@gmail.com> Wed, 01 Sep 2021 00:44:04 +0200
|
||||||
|
|
||||||
|
eg25-manager (0.3.0-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* New upstream version 0.3.0
|
||||||
|
|
||||||
|
-- Arnaud Ferraris <arnaud.ferraris@collabora.com> Fri, 28 May 2021 13:58:33 +0200
|
||||||
|
|
||||||
|
eg25-manager (0.2.1-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* New upstream version 0.2.1
|
||||||
|
|
||||||
|
-- Arnaud Ferraris <arnaud.ferraris@gmail.com> Sun, 21 Feb 2021 16:41:31 +0100
|
||||||
|
|
||||||
|
eg25-manager (0.2.0-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* New upstream version 0.2.0
|
||||||
|
* d/gbp.conf: enable multimaint-merge
|
||||||
|
* d/eg25-manager.service: remove deprecated -g option
|
||||||
|
|
||||||
|
-- Arnaud Ferraris <arnaud.ferraris@gmail.com> Sat, 20 Feb 2021 22:26:19 +0100
|
||||||
|
|
||||||
|
eg25-manager (0.1.2-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* New upstream release 0.1.2
|
||||||
|
* d/eg25-manager.service: enable GNSS management
|
||||||
|
|
||||||
|
-- Arnaud Ferraris <arnaud.ferraris@gmail.com> Thu, 14 Jan 2021 00:09:23 +0100
|
||||||
|
|
||||||
|
eg25-manager (0.1.1-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* d/control: build-depend on gudev
|
||||||
|
* New upstream release 0.1.1
|
||||||
|
|
||||||
|
-- Arnaud Ferraris <arnaud.ferraris@gmail.com> Fri, 18 Dec 2020 01:42:06 +0100
|
||||||
|
|
||||||
|
eg25-manager (0.1.0-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* New upstream release 0.1.0
|
||||||
|
|
||||||
|
-- Arnaud Ferraris <arnaud.ferraris@gmail.com> Mon, 14 Dec 2020 16:45:20 +0100
|
||||||
|
|
||||||
|
eg25-manager (0.0.6-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* New upstream release 0.0.6
|
||||||
|
* d/patches: drop upstreamed patches
|
||||||
|
|
||||||
|
-- Arnaud Ferraris <arnaud.ferraris@gmail.com> Fri, 11 Dec 2020 15:11:26 +0100
|
||||||
|
|
||||||
|
eg25-manager (0.0.5-2) unstable; urgency=medium
|
||||||
|
|
||||||
|
* d/patches: fix crash on modem recovery
|
||||||
|
|
||||||
|
-- Arnaud Ferraris <arnaud.ferraris@gmail.com> Fri, 11 Dec 2020 14:33:14 +0100
|
||||||
|
|
||||||
|
eg25-manager (0.0.5-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* New upstream release 0.0.5
|
||||||
|
|
||||||
|
-- Arnaud Ferraris <arnaud.ferraris@gmail.com> Fri, 11 Dec 2020 13:38:41 +0100
|
||||||
|
|
||||||
|
eg25-manager (0.0.4-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* d/control: build only on arm64.
|
||||||
|
* d/service: restart daemon on failure
|
||||||
|
* d/control: build-depend on libusb-1.0
|
||||||
|
|
||||||
|
-- Arnaud Ferraris <arnaud.ferraris@gmail.com> Fri, 11 Dec 2020 12:51:41 +0100
|
||||||
|
|
||||||
|
eg25-manager (0.0.3-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* New upstream release 0.0.3
|
||||||
|
|
||||||
|
-- Arnaud Ferraris <arnaud.ferraris@gmail.com> Thu, 10 Dec 2020 21:34:26 +0100
|
||||||
|
|
||||||
|
eg25-manager (0.0.2-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* New upstream release 0.0.2
|
||||||
|
|
||||||
|
-- Arnaud Ferraris <arnaud.ferraris@gmail.com> Thu, 10 Dec 2020 19:50:50 +0100
|
||||||
|
|
||||||
|
eg25-manager (0.0.1-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* Initial Debian packaging
|
||||||
|
|
||||||
|
-- Arnaud Ferraris <arnaud.ferraris@gmail.com> Thu, 10 Dec 2020 15:19:15 +0100
|
28
debian/control
vendored
Normal file
28
debian/control
vendored
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
Source: eg25-manager
|
||||||
|
Section: libs
|
||||||
|
Priority: optional
|
||||||
|
Maintainer: Arnaud Ferraris <arnaud.ferraris@gmail.com>
|
||||||
|
Standards-Version: 4.5.1
|
||||||
|
Rules-Requires-Root: no
|
||||||
|
Build-Depends: debhelper-compat (= 13),
|
||||||
|
libcurl-dev,
|
||||||
|
libglib2.0-dev,
|
||||||
|
libgpiod-dev,
|
||||||
|
libgudev-1.0-dev,
|
||||||
|
libmm-glib-dev,
|
||||||
|
libusb-1.0-0-dev,
|
||||||
|
meson,
|
||||||
|
Homepage: https://gitlab.com/mobian1/devices/eg25-manager
|
||||||
|
Vcs-Git: https://gitlab.com/mobian1/devices/eg25-manager.git
|
||||||
|
Vcs-Browser: https://gitlab.com/mobian1/devices/eg25-manager
|
||||||
|
|
||||||
|
Package: eg25-manager
|
||||||
|
Architecture: arm64
|
||||||
|
Depends: ${misc:Depends},
|
||||||
|
${shlibs:Depends},
|
||||||
|
modemmanager,
|
||||||
|
Conflicts: pinephone-modem-scripts,
|
||||||
|
Replaces: pinephone-modem-scripts,
|
||||||
|
Description: Manager daemon for the Quectel EG25 mobile broadband modem
|
||||||
|
A set of scripts for the PinePhone modem, allowing to power on/off the modem,
|
||||||
|
and configure its audio interface to work properly with the A64 audio codec.
|
67
debian/copyright
vendored
Normal file
67
debian/copyright
vendored
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||||
|
Upstream-Name: eg25-manager
|
||||||
|
Upstream-Contact: Arnaud Ferraris <arnaud.ferraris@gmail.com>
|
||||||
|
Source: https://gitlab.com/mobian1/devices/eg25-manager
|
||||||
|
|
||||||
|
Files: *
|
||||||
|
Copyright: 2020 Arnaud Ferraris <arnaud.ferraris@gmail.com>
|
||||||
|
License: GPL-3.0-or-later
|
||||||
|
|
||||||
|
Files: src/gnss.*
|
||||||
|
Copyright: 2021 Dylan Van Assche <me@dylanvanassche.be>
|
||||||
|
License: GPL-3.0-or-later
|
||||||
|
|
||||||
|
Files: src/mm-iface.c
|
||||||
|
Copyright: 2019 Purism SPC
|
||||||
|
2020 Arnaud Ferraris <arnaud.ferraris@gmail.com>
|
||||||
|
License: GPL-3.0-or-later
|
||||||
|
|
||||||
|
Files: src/ofono-iface.c
|
||||||
|
Copyright: 2020 Oliver Smith <ollieparanoid@postmarketos.org>
|
||||||
|
2021 Bhushan Shah <bshah@kde.org>
|
||||||
|
License: GPL-3.0-or-later
|
||||||
|
|
||||||
|
Files: src/suspend.c
|
||||||
|
Copyright: 2012 Red Hat, Inc
|
||||||
|
2020 Arnaud Ferraris <arnaud.ferraris@gmail.com>
|
||||||
|
License: GPL-3.0-or-later
|
||||||
|
|
||||||
|
Files: src/toml.*
|
||||||
|
Copyright: 2017-2019 CK Tan
|
||||||
|
License: MIT
|
||||||
|
|
||||||
|
License: GPL-3.0-or-later
|
||||||
|
This program 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.
|
||||||
|
.
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
.
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
.
|
||||||
|
On Debian systems, the full text of the GNU General Public License
|
||||||
|
version 3 can be found in the file `/usr/share/common-licenses/GPL-3'.
|
||||||
|
|
||||||
|
License: MIT
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
.
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
.
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
10
debian/gbp.conf
vendored
Normal file
10
debian/gbp.conf
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
[DEFAULT]
|
||||||
|
debian-branch = mobian
|
||||||
|
debian-tag = mobian/%(version)s
|
||||||
|
upstream-branch = upstream/latest
|
||||||
|
upstream-tag = %(version)s
|
||||||
|
pristine-tar = True
|
||||||
|
multimaint-merge = True
|
||||||
|
|
||||||
|
[tag]
|
||||||
|
sign-tags = True
|
6
debian/rules
vendored
Executable file
6
debian/rules
vendored
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
#!/usr/bin/make -f
|
||||||
|
|
||||||
|
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
|
||||||
|
|
||||||
|
%:
|
||||||
|
dh $@
|
2
debian/salsa-ci.yml
vendored
Normal file
2
debian/salsa-ci.yml
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
include:
|
||||||
|
- https://gitlab.com/mobian1/packaging-tools/-/raw/master/mobian-ci.yml
|
1
debian/source/format
vendored
Normal file
1
debian/source/format
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
3.0 (quilt)
|
5
debian/watch
vendored
Normal file
5
debian/watch
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
|
||||||
|
|
||||||
|
version=4
|
||||||
|
opts=filenamemangle=s/.*\/archive\/(\d\S+)\/eg25-manager.*\.tar\.gz/eg25-manager-$1\.tar\.gz/g \
|
||||||
|
https://gitlab.com/mobian1/eg25-manager/tags?sort=updated_desc .*/archive/(\d\S+)/.*\.tar\.gz.*
|
@@ -1,106 +0,0 @@
|
|||||||
eg25-manager(5)
|
|
||||||
|
|
||||||
# NAME
|
|
||||||
eg25-manager configuration file format
|
|
||||||
|
|
||||||
# SYNOPSIS
|
|
||||||
eg25-manager uses toml formatted files for configuration.
|
|
||||||
|
|
||||||
Configurations are loaded from:
|
|
||||||
- *@eg25_confdir@/<compatible>.toml*: User-provided overrides (optional)
|
|
||||||
- *@eg25_datadir@/<compatible>.toml*: Default configuration (required)
|
|
||||||
|
|
||||||
# SECTION: manager
|
|
||||||
General settings for eg25-manager.
|
|
||||||
|
|
||||||
*poweron_delay* int (microseconds)
|
|
||||||
Delay between de-asserting RESET and starting the PWRKEY sequence.
|
|
||||||
|
|
||||||
# SECTION: suspend
|
|
||||||
Settings for how to handle suspend on the system where eg25-manager is running.
|
|
||||||
|
|
||||||
*boot_timeout* int (seconds)
|
|
||||||
Prevent the system from suspending for boot_timeout seconds to allow the
|
|
||||||
modem to fully boot.
|
|
||||||
|
|
||||||
Default: 120 if unset or zero.
|
|
||||||
|
|
||||||
*recovery_timeout* int (seconds)
|
|
||||||
Amount of time to wait for the modem to reappear after suspend. If the
|
|
||||||
timeout is reached the modem's USB connection will be reset.
|
|
||||||
|
|
||||||
Default: 9 if unset or zero.
|
|
||||||
|
|
||||||
# SECTION: at
|
|
||||||
AT commands to send when different events happen, and where to send them to.
|
|
||||||
|
|
||||||
Each command has 4 possible elements:
|
|
||||||
- *cmd*: the AT command itself, which will be translated to "AT+`cmd`"
|
|
||||||
- *subcmd*: the subcommand in case a single AT command can be used to
|
|
||||||
change multiple parameters, such as QCFG
|
|
||||||
- *value*: the command's argument(s), usually used to set the value of a
|
|
||||||
specific parameter
|
|
||||||
- *expect*: the expected return value; the command is first executed
|
|
||||||
without any value in order to query the current state. This state is
|
|
||||||
then compared to the *expect* string; if they don't match, the command
|
|
||||||
is then executed with value *expect* in order to set the parameter to
|
|
||||||
the expected value
|
|
||||||
A command can have *expect* OR *value* configured, but it shouldn't have both
|
|
||||||
|
|
||||||
*NOTE:* If a command sequence is configured in an override file, the default
|
|
||||||
commands won't be loaded from the system configuration. The default commands
|
|
||||||
should be copied into the override file when changing them.
|
|
||||||
|
|
||||||
*uart* string
|
|
||||||
The serial port to use for sending AT commands to the modem.
|
|
||||||
|
|
||||||
*configure* List of commands
|
|
||||||
AT commands to send to the modem when it is first started.
|
|
||||||
|
|
||||||
*suspend* List of commands
|
|
||||||
AT commands to send to the modem before the system suspends.
|
|
||||||
|
|
||||||
*resume* List of commands
|
|
||||||
AT commands to send to the modem after the system resumes from suspend.
|
|
||||||
|
|
||||||
*reset* List of commands
|
|
||||||
AT commands to send to the modem if resetting the usb port fails.
|
|
||||||
|
|
||||||
# SECTION: gnss
|
|
||||||
Settings for uploading AGPS assistance data to the modem.
|
|
||||||
|
|
||||||
*enabled* boolean
|
|
||||||
Enable or disable uploading AGPS data to the modem
|
|
||||||
|
|
||||||
*url* string
|
|
||||||
The directory on the server that contains the assistance files
|
|
||||||
|
|
||||||
Example: https://xtrapath4.izatcloud.net
|
|
||||||
|
|
||||||
*file* string
|
|
||||||
The name of the assistance file on the server.
|
|
||||||
|
|
||||||
Example: xtra2.bin
|
|
||||||
|
|
||||||
# SECTION: gpio
|
|
||||||
The *gpio* section defines the GPIO pins to use for different modem functions.
|
|
||||||
These settings should only be changed when porting eg25-manager to a new device;
|
|
||||||
for this reason they aren't documented here.
|
|
||||||
|
|
||||||
# EXAMPLES
|
|
||||||
Print the firmware version every time the phone wakes from suspend:
|
|
||||||
```
|
|
||||||
[at]
|
|
||||||
resume = [
|
|
||||||
{ cmd = "QGMR" },
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
Disable uploading AGPS data to the modem:
|
|
||||||
```
|
|
||||||
[gnss]
|
|
||||||
enabled = false
|
|
||||||
```
|
|
||||||
|
|
||||||
# SEE AlSO
|
|
||||||
*eg25-manager*(8)
|
|
@@ -1,37 +0,0 @@
|
|||||||
eg25-manager(8)
|
|
||||||
|
|
||||||
# NAME
|
|
||||||
eg25-manager - a daemon for managing the Quectel EG25 modem found on the
|
|
||||||
Pine64 PinePhone.
|
|
||||||
|
|
||||||
# SYNOPSIS
|
|
||||||
*eg25-manager* [-v] [-c config_file]
|
|
||||||
|
|
||||||
# OPTIONS
|
|
||||||
*-v*
|
|
||||||
Show the version number and quit.
|
|
||||||
*-c*
|
|
||||||
User configuration file, defaults to the device configuration file in
|
|
||||||
/etc/eg25-manager.
|
|
||||||
|
|
||||||
# FILES
|
|
||||||
Configurations are loaded from:
|
|
||||||
- *@eg25_confdir@/<compatible>.toml*: User-provided overrides (optional)
|
|
||||||
- *@eg25_datadir@/<compatible>.toml*: Default configuration (required)
|
|
||||||
|
|
||||||
eg25-manager will search these folders for files named after the value of the
|
|
||||||
compatible device-tree property (with the .toml file extension) and use the
|
|
||||||
first matching file in each directory. If no matching default configuration is
|
|
||||||
found, eg25-manager will exit with an error message.
|
|
||||||
|
|
||||||
Values from the user-provided overrides will take priority over values stored in
|
|
||||||
the default configuration. Only changed values must be stored as user overrides,
|
|
||||||
so eg25-manager can fall back to the default configuration as often as possible.
|
|
||||||
|
|
||||||
The file names eg25-manager will check can be listed using:
|
|
||||||
```
|
|
||||||
xargs -0 printf '%s.toml\\n' < /proc/device-tree/compatible
|
|
||||||
```
|
|
||||||
|
|
||||||
# SEE ALSO
|
|
||||||
*eg25-manager*(5) *ModemManager*(8) *ofono*(8)
|
|
@@ -1,33 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (C) 2020 Arnaud Ferraris <arnaud.ferraris@gmail.com>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
#
|
|
||||||
|
|
||||||
scdoc = dependency('scdoc', native: true, required: false)
|
|
||||||
if scdoc.found()
|
|
||||||
scdoc_prog = find_program(scdoc.get_variable('scdoc'), native: true)
|
|
||||||
|
|
||||||
foreach section: [5, 8]
|
|
||||||
name = 'eg25-manager'
|
|
||||||
out = '@0@.@1@'.format(name, section)
|
|
||||||
|
|
||||||
preprocessed = configure_file(
|
|
||||||
input: '@0@.scd'.format(out),
|
|
||||||
output: '@BASENAME@.preprocessed',
|
|
||||||
configuration: {
|
|
||||||
'eg25_confdir': eg25_confdir,
|
|
||||||
'eg25_datadir': eg25_datadir,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
custom_target(
|
|
||||||
out,
|
|
||||||
output: out,
|
|
||||||
input: preprocessed,
|
|
||||||
command: ['sh', '-c', '@0@ < @INPUT@'.format(scdoc_prog.full_path())],
|
|
||||||
capture: true,
|
|
||||||
install: true,
|
|
||||||
install_dir: join_paths(get_option('mandir'), 'man@0@'.format(section)))
|
|
||||||
endforeach
|
|
||||||
endif
|
|
@@ -8,9 +8,9 @@
|
|||||||
project (
|
project (
|
||||||
'eg25-manager',
|
'eg25-manager',
|
||||||
'c',
|
'c',
|
||||||
version : '0.4.3',
|
version : '0.4.2',
|
||||||
license : 'GPLv3+',
|
license : 'GPLv3+',
|
||||||
meson_version : '>= 0.58.0',
|
meson_version : '>= 0.50.0',
|
||||||
default_options :
|
default_options :
|
||||||
[
|
[
|
||||||
'warning_level=1',
|
'warning_level=1',
|
||||||
@@ -66,6 +66,5 @@ mgr_deps = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
subdir('data')
|
subdir('data')
|
||||||
subdir('doc')
|
|
||||||
subdir('src')
|
subdir('src')
|
||||||
subdir('udev')
|
subdir('udev')
|
||||||
|
@@ -144,7 +144,7 @@ int gpio_init(struct EG25Manager *manager, toml_table_t *config[])
|
|||||||
if (!gpio_config[EG25_CONFIG_SYS])
|
if (!gpio_config[EG25_CONFIG_SYS])
|
||||||
g_error("Default config file lacks the 'gpio' section!");
|
g_error("Default config file lacks the 'gpio' section!");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The system config could have the `chips` key, but the user one
|
* The system config could have the `chips` key, but the user one
|
||||||
* could still use the old format! In order to avoid problems, we
|
* could still use the old format! In order to avoid problems, we
|
||||||
* should use the new format only if:
|
* should use the new format only if:
|
||||||
@@ -196,13 +196,8 @@ int gpio_init(struct EG25Manager *manager, toml_table_t *config[])
|
|||||||
for (i = 0; i < GPIO_IN_COUNT; i++) {
|
for (i = 0; i < GPIO_IN_COUNT; i++) {
|
||||||
toml_table_t *table;
|
toml_table_t *table;
|
||||||
toml_datum_t chip, line;
|
toml_datum_t chip, line;
|
||||||
|
if (!config_get_table(gpio_config, gpio_in_names[i], &table))
|
||||||
if (!config_get_table(gpio_config, gpio_in_names[i], &table)) {
|
|
||||||
// BH edition don't have the STATUS line connected, ignore it
|
|
||||||
if (manager->use_libusb && g_strcmp0(gpio_in_names[i], "status") == 0)
|
|
||||||
continue;
|
|
||||||
g_error("Unable to get config for input GPIO '%s'", gpio_in_names[i]);
|
g_error("Unable to get config for input GPIO '%s'", gpio_in_names[i]);
|
||||||
}
|
|
||||||
|
|
||||||
chip = toml_int_in(table, "chip");
|
chip = toml_int_in(table, "chip");
|
||||||
if (!chip.ok || chip.u.i < 0 || chip.u.i > 2)
|
if (!chip.ok || chip.u.i < 0 || chip.u.i > 2)
|
||||||
|
@@ -38,9 +38,6 @@
|
|||||||
#define EG25_VERSION "0.0.0"
|
#define EG25_VERSION "0.0.0"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define EG25_DEFAULT_VENDOR_ID 0x2c7c
|
|
||||||
#define EG25_DEFAULT_PRODUCT_ID 0x0125
|
|
||||||
|
|
||||||
#define POWERON_DELAY_US 100000UL
|
#define POWERON_DELAY_US 100000UL
|
||||||
|
|
||||||
static gboolean quit_app(struct EG25Manager *manager)
|
static gboolean quit_app(struct EG25Manager *manager)
|
||||||
@@ -144,7 +141,7 @@ void modem_configure(struct EG25Manager *manager)
|
|||||||
static gboolean modem_reset_done(struct EG25Manager* manager)
|
static gboolean modem_reset_done(struct EG25Manager* manager)
|
||||||
{
|
{
|
||||||
manager->modem_state = EG25_STATE_RESUMING;
|
manager->modem_state = EG25_STATE_RESUMING;
|
||||||
manager->complete_reset_timer = 0;
|
manager->reset_timer = 0;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -152,18 +149,7 @@ gboolean modem_reset(struct EG25Manager *manager)
|
|||||||
{
|
{
|
||||||
int fd, ret, len;
|
int fd, ret, len;
|
||||||
|
|
||||||
/* reset sequence started, cannot be canceled anymore */
|
if (manager->reset_timer) {
|
||||||
if (manager->schedule_reset_timer) {
|
|
||||||
g_source_remove(manager->schedule_reset_timer);
|
|
||||||
manager->schedule_reset_timer = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (manager->modem_recovery_timer) {
|
|
||||||
g_source_remove(manager->modem_recovery_timer);
|
|
||||||
manager->modem_recovery_timer = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (manager->complete_reset_timer) {
|
|
||||||
g_message("modem_reset: timer already setup, skipping...");
|
g_message("modem_reset: timer already setup, skipping...");
|
||||||
return G_SOURCE_REMOVE;
|
return G_SOURCE_REMOVE;
|
||||||
}
|
}
|
||||||
@@ -178,6 +164,11 @@ gboolean modem_reset(struct EG25Manager *manager)
|
|||||||
return G_SOURCE_REMOVE;
|
return G_SOURCE_REMOVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (manager->modem_recovery_timer) {
|
||||||
|
g_source_remove(manager->modem_recovery_timer);
|
||||||
|
manager->modem_recovery_timer = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (!manager->modem_usb_id) {
|
if (!manager->modem_usb_id) {
|
||||||
g_warning("Empty modem USB ID");
|
g_warning("Empty modem USB ID");
|
||||||
goto error;
|
goto error;
|
||||||
@@ -219,7 +210,7 @@ gboolean modem_reset(struct EG25Manager *manager)
|
|||||||
* 3s is long enough to make sure the modem has been bound back and
|
* 3s is long enough to make sure the modem has been bound back and
|
||||||
* short enough to ensure it hasn't been acquired by ModemManager
|
* short enough to ensure it hasn't been acquired by ModemManager
|
||||||
*/
|
*/
|
||||||
manager->complete_reset_timer = g_timeout_add_seconds(3, G_SOURCE_FUNC(modem_reset_done), manager);
|
manager->reset_timer = g_timeout_add_seconds(3, G_SOURCE_FUNC(modem_reset_done), manager);
|
||||||
|
|
||||||
return G_SOURCE_REMOVE;
|
return G_SOURCE_REMOVE;
|
||||||
|
|
||||||
@@ -237,7 +228,7 @@ error:
|
|||||||
at_sequence_reset(manager);
|
at_sequence_reset(manager);
|
||||||
|
|
||||||
// Setup timer for making sure we don't queue other reset commands
|
// Setup timer for making sure we don't queue other reset commands
|
||||||
manager->complete_reset_timer = g_timeout_add_seconds(30, G_SOURCE_FUNC(modem_reset_done), manager);
|
manager->reset_timer = g_timeout_add_seconds(30, G_SOURCE_FUNC(modem_reset_done), manager);
|
||||||
|
|
||||||
return G_SOURCE_REMOVE;
|
return G_SOURCE_REMOVE;
|
||||||
}
|
}
|
||||||
@@ -323,7 +314,6 @@ int main(int argc, char *argv[])
|
|||||||
struct EG25Manager manager;
|
struct EG25Manager manager;
|
||||||
gchar *config_file = NULL;
|
gchar *config_file = NULL;
|
||||||
gboolean show_version = FALSE;
|
gboolean show_version = FALSE;
|
||||||
gboolean monitor_udev = TRUE;
|
|
||||||
toml_table_t *toml_config[EG25_CONFIG_COUNT];
|
toml_table_t *toml_config[EG25_CONFIG_COUNT];
|
||||||
toml_table_t *manager_config[EG25_CONFIG_COUNT];
|
toml_table_t *manager_config[EG25_CONFIG_COUNT];
|
||||||
const GOptionEntry options[] = {
|
const GOptionEntry options[] = {
|
||||||
@@ -373,13 +363,10 @@ int main(int argc, char *argv[])
|
|||||||
if (!manager_config[EG25_CONFIG_SYS])
|
if (!manager_config[EG25_CONFIG_SYS])
|
||||||
g_error("Default config file lacks the 'manager' section!");
|
g_error("Default config file lacks the 'manager' section!");
|
||||||
|
|
||||||
config_get_bool(manager_config, "monitor_udev", &monitor_udev);
|
|
||||||
config_get_bool(manager_config, "need_libusb", &manager.use_libusb);
|
config_get_bool(manager_config, "need_libusb", &manager.use_libusb);
|
||||||
|
config_get_uint(manager_config, "usb_vid", &manager.usb_vid);
|
||||||
|
config_get_uint(manager_config, "usb_pid", &manager.usb_pid);
|
||||||
config_get_uint(manager_config, "poweron_delay", &manager.poweron_delay);
|
config_get_uint(manager_config, "poweron_delay", &manager.poweron_delay);
|
||||||
if (!config_get_uint(manager_config, "usb_vid", &manager.usb_vid))
|
|
||||||
manager.usb_vid = EG25_DEFAULT_VENDOR_ID;
|
|
||||||
if (!config_get_uint(manager_config, "usb_pid", &manager.usb_pid))
|
|
||||||
manager.usb_pid = EG25_DEFAULT_PRODUCT_ID;
|
|
||||||
|
|
||||||
at_init(&manager, toml_config);
|
at_init(&manager, toml_config);
|
||||||
gpio_init(&manager, toml_config);
|
gpio_init(&manager, toml_config);
|
||||||
@@ -388,8 +375,7 @@ int main(int argc, char *argv[])
|
|||||||
#endif
|
#endif
|
||||||
ofono_iface_init(&manager, toml_config);
|
ofono_iface_init(&manager, toml_config);
|
||||||
suspend_init(&manager, toml_config);
|
suspend_init(&manager, toml_config);
|
||||||
if (monitor_udev)
|
udev_init(&manager, toml_config);
|
||||||
udev_init(&manager, toml_config);
|
|
||||||
gnss_init(&manager, toml_config);
|
gnss_init(&manager, toml_config);
|
||||||
|
|
||||||
for (int i = 0; i < EG25_CONFIG_COUNT; i++) {
|
for (int i = 0; i < EG25_CONFIG_COUNT; i++) {
|
||||||
|
@@ -53,7 +53,6 @@ enum EG25State {
|
|||||||
EG25_STATE_SUSPENDING, // System is going into suspend
|
EG25_STATE_SUSPENDING, // System is going into suspend
|
||||||
EG25_STATE_RESUMING, // System is being resumed, waiting for modem to come back
|
EG25_STATE_RESUMING, // System is being resumed, waiting for modem to come back
|
||||||
EG25_STATE_RESETTING, // Something went wrong, we're restarting the modem
|
EG25_STATE_RESETTING, // Something went wrong, we're restarting the modem
|
||||||
EG25_STATE_UPDATING, // Modem is present but being updated
|
|
||||||
EG25_STATE_FINISHING
|
EG25_STATE_FINISHING
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -71,8 +70,7 @@ enum EG25Config {
|
|||||||
|
|
||||||
struct EG25Manager {
|
struct EG25Manager {
|
||||||
GMainLoop *loop;
|
GMainLoop *loop;
|
||||||
guint complete_reset_timer;
|
guint reset_timer;
|
||||||
guint schedule_reset_timer;
|
|
||||||
gboolean use_libusb;
|
gboolean use_libusb;
|
||||||
guint usb_vid;
|
guint usb_vid;
|
||||||
guint usb_pid;
|
guint usb_pid;
|
||||||
|
@@ -25,7 +25,7 @@ if mmglib_dep.found()
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
executable (
|
executable (
|
||||||
'eg25-manager',
|
'eg25manager',
|
||||||
src,
|
src,
|
||||||
dependencies : mgr_deps,
|
dependencies : mgr_deps,
|
||||||
link_with: gdbofono_lib,
|
link_with: gdbofono_lib,
|
||||||
|
@@ -18,24 +18,10 @@
|
|||||||
#define SD_PATH "/org/freedesktop/login1"
|
#define SD_PATH "/org/freedesktop/login1"
|
||||||
#define SD_INTERFACE "org.freedesktop.login1.Manager"
|
#define SD_INTERFACE "org.freedesktop.login1.Manager"
|
||||||
|
|
||||||
static void resume_ok(struct EG25Manager *manager)
|
|
||||||
{
|
|
||||||
manager->modem_state = EG25_STATE_CONFIGURED;
|
|
||||||
modem_resume_post(manager);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean check_modem_resume(struct EG25Manager *manager)
|
static gboolean check_modem_resume(struct EG25Manager *manager)
|
||||||
{
|
{
|
||||||
manager->modem_recovery_timer = 0;
|
|
||||||
|
|
||||||
#ifdef HAVE_MMGLIB
|
|
||||||
if (manager->mm_modem) {
|
|
||||||
resume_ok(manager);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
g_message("Modem wasn't probed in time, restart it!");
|
g_message("Modem wasn't probed in time, restart it!");
|
||||||
|
manager->modem_recovery_timer = 0;
|
||||||
modem_reset(manager);
|
modem_reset(manager);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -198,7 +184,8 @@ static void signal_cb(GDBusProxy *proxy,
|
|||||||
* If modem is managed by ofono, we also do resume sequence immediately
|
* If modem is managed by ofono, we also do resume sequence immediately
|
||||||
* as ofono handles resuming from sleep itself.
|
* as ofono handles resuming from sleep itself.
|
||||||
*/
|
*/
|
||||||
resume_ok(manager);
|
manager->modem_state = EG25_STATE_CONFIGURED;
|
||||||
|
modem_resume_post(manager);
|
||||||
} else {
|
} else {
|
||||||
manager->modem_state = EG25_STATE_RESUMING;
|
manager->modem_state = EG25_STATE_RESUMING;
|
||||||
manager->modem_recovery_timer = g_timeout_add_seconds(manager->modem_recovery_timeout,
|
manager->modem_recovery_timer = g_timeout_add_seconds(manager->modem_recovery_timeout,
|
||||||
|
43
src/udev.c
43
src/udev.c
@@ -11,47 +11,18 @@
|
|||||||
static void udev_event_cb(GUdevClient *client, gchar *action, GUdevDevice *device, gpointer data)
|
static void udev_event_cb(GUdevClient *client, gchar *action, GUdevDevice *device, gpointer data)
|
||||||
{
|
{
|
||||||
struct EG25Manager *manager = data;
|
struct EG25Manager *manager = data;
|
||||||
const gchar *prop;
|
|
||||||
long vid = 0, pid = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Act only if the device is the one identified as a modem by MM/ofono
|
|
||||||
*/
|
|
||||||
if (!manager->modem_usb_id ||
|
|
||||||
strcmp(g_udev_device_get_name(device), manager->modem_usb_id) != 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
prop = g_udev_device_get_property(device, "ID_VENDOR_ID");
|
|
||||||
if (prop)
|
|
||||||
vid = strtol(prop, NULL, 16);
|
|
||||||
|
|
||||||
prop = g_udev_device_get_property(device, "ID_MODEL_ID");
|
|
||||||
if (prop)
|
|
||||||
pid = strtol(prop, NULL, 16);
|
|
||||||
|
|
||||||
if (strcmp(action, "bind") == 0 && vid != manager->usb_vid && pid != manager->usb_pid) {
|
|
||||||
/*
|
|
||||||
* Modem is probably executing a FW upgrade, make sure we don't interrupt it
|
|
||||||
*/
|
|
||||||
if (manager->schedule_reset_timer != 0) {
|
|
||||||
g_message("Modem re-appeared with different VID/PID, cancel reset.");
|
|
||||||
g_source_remove(manager->schedule_reset_timer);
|
|
||||||
manager->schedule_reset_timer = 0;
|
|
||||||
}
|
|
||||||
manager->modem_state = EG25_STATE_UPDATING;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp(action, "unbind") != 0 ||
|
if (strcmp(action, "unbind") != 0 ||
|
||||||
manager->modem_state == EG25_STATE_UPDATING ||
|
|
||||||
manager->modem_state == EG25_STATE_RESETTING ||
|
manager->modem_state == EG25_STATE_RESETTING ||
|
||||||
manager->complete_reset_timer != 0 ||
|
!manager->modem_usb_id) {
|
||||||
manager->schedule_reset_timer != 0) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_message("Lost modem, resetting...");
|
if (strcmp(g_udev_device_get_name(device), manager->modem_usb_id) == 0 &&
|
||||||
manager->schedule_reset_timer = g_timeout_add_seconds(3, G_SOURCE_FUNC(modem_reset), manager);
|
manager->reset_timer == 0) {
|
||||||
|
g_message("Lost modem, resetting...");
|
||||||
|
g_timeout_add_seconds(2, G_SOURCE_FUNC(modem_reset), manager);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void udev_init (struct EG25Manager *manager, toml_table_t *config[])
|
void udev_init (struct EG25Manager *manager, toml_table_t *config[])
|
||||||
|
Reference in New Issue
Block a user