mirror of
https://gitlab.com/mobian1/eg25-manager.git
synced 2025-08-29 23:32:14 +02:00
Compare commits
53 Commits
0.4.1
...
mobian/0.4
Author | SHA1 | Date | |
---|---|---|---|
|
9c05776843 | ||
|
08a7039ca0 | ||
|
929b3942c0 | ||
|
a91bc71e23 | ||
|
b21c4b0fa4 | ||
|
abf60b793a | ||
|
f8b3e28434 | ||
|
d9725981bb | ||
|
a06360f4c8 | ||
|
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 |
@@ -8,6 +8,7 @@ conf_files = [
|
||||
'pine64,pinephone-1.0.toml',
|
||||
'pine64,pinephone-1.1.toml',
|
||||
'pine64,pinephone-1.2.toml',
|
||||
'pine64,pinephone-pro.toml',
|
||||
]
|
||||
|
||||
install_data(conf_files)
|
||||
|
@@ -13,11 +13,12 @@ poweron_delay = 100000
|
||||
#recovery_timeout = 9
|
||||
|
||||
[gpio]
|
||||
dtr = 358
|
||||
pwrkey = 35
|
||||
reset = 68
|
||||
apready = 231
|
||||
disable = 232
|
||||
chips = [ "1c20800.pinctrl", "1f02c00.pinctrl" ]
|
||||
dtr = { chip = 1, line = 6 }
|
||||
pwrkey = { chip = 0, line = 35 }
|
||||
reset = { chip = 0, line = 68 }
|
||||
apready = { chip = 0, line = 231 }
|
||||
disable = { chip = 0, line = 232 }
|
||||
|
||||
[at]
|
||||
uart = "/dev/ttyS2"
|
||||
|
@@ -13,11 +13,12 @@ poweron_delay = 100000
|
||||
#recovery_timeout = 9
|
||||
|
||||
[gpio]
|
||||
dtr = 358
|
||||
pwrkey = 35
|
||||
reset = 68
|
||||
apready = 231
|
||||
disable = 232
|
||||
chips = [ "1c20800.pinctrl", "1f02c00.pinctrl" ]
|
||||
dtr = { chip = 1, line = 6 }
|
||||
pwrkey = { chip = 0, line = 35 }
|
||||
reset = { chip = 0, line = 68 }
|
||||
apready = { chip = 0, line = 231 }
|
||||
disable = { chip = 0, line = 232 }
|
||||
|
||||
[at]
|
||||
uart = "/dev/ttyS2"
|
||||
|
@@ -9,12 +9,13 @@ poweron_delay = 100000
|
||||
#recovery_timeout = 9
|
||||
|
||||
[gpio]
|
||||
dtr = 34
|
||||
pwrkey = 35
|
||||
reset = 68
|
||||
apready = 231
|
||||
disable = 232
|
||||
status = 233
|
||||
chips = [ "1c20800.pinctrl" ]
|
||||
dtr = { chip = 0, line = 34 }
|
||||
pwrkey = { chip = 0, line = 35 }
|
||||
reset = { chip = 0, line = 68 }
|
||||
apready = { chip = 0, line = 231 }
|
||||
disable = { chip = 0, line = 232 }
|
||||
status = { chip = 0, line = 233 }
|
||||
|
||||
[at]
|
||||
uart = "/dev/ttyS2"
|
||||
|
97
data/pine64,pinephone-pro.toml
Normal file
97
data/pine64,pinephone-pro.toml
Normal file
@@ -0,0 +1,97 @@
|
||||
[manager]
|
||||
# Delay between setting GPIO and PWRKEY sequence, set in microseconds
|
||||
poweron_delay = 100000
|
||||
|
||||
# Uncomment the following if you need to change the modem detection timeout on
|
||||
# resume and/or the time during which suspend is blocked after modem boot
|
||||
#[suspend]
|
||||
#boot_timeout = 120
|
||||
#recovery_timeout = 9
|
||||
|
||||
[gpio]
|
||||
chips = [ "gpio0", "gpio3" ]
|
||||
dtr = { chip = 0, line = 3 }
|
||||
pwrkey = { chip = 0, line = 13 }
|
||||
reset = { chip = 1, line = 8 }
|
||||
apready = { chip = 0, line = 12 }
|
||||
disable = { chip = 0, line = 8 }
|
||||
status = { chip = 1, line = 6 }
|
||||
|
||||
[at]
|
||||
uart = "/dev/ttyS3"
|
||||
configure = [
|
||||
# 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 (optional)
|
||||
# * `value` : the commands, argument, usually used to set the value of
|
||||
# a specific parameter (optional)
|
||||
# * `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 configured value (optional)
|
||||
# A command can have `expect` OR `value` configured, but it shouldn't have both
|
||||
# Print software version
|
||||
{ cmd = "QGMR" },
|
||||
# Configure audio
|
||||
{ cmd = "QDAI", expect = "3,0,0,4,0,0,1,1" },
|
||||
# RI signaling using physical RI pin
|
||||
{ cmd = "QCFG", subcmd = "risignaltype", expect = "\"physical\"" },
|
||||
# Enable VoLTE support
|
||||
{ cmd = "QCFG", subcmd = "ims", expect = "1" },
|
||||
# Enable APREADY for PP 1.2
|
||||
{ cmd = "QCFG", subcmd = "apready", expect = "1,0,500" },
|
||||
# URC configuration for PP 1.2 (APREADY pin connected):
|
||||
# * RING URC: normal pulse length
|
||||
# * Incoming SMS URC: default pulse length
|
||||
# * Other URC: default length
|
||||
# * Report URCs on all ports (serial and USB) for FOSS firmware
|
||||
# * Reporting of URCs without any delay
|
||||
# * Configure URC pin to UART Ring Indicator
|
||||
{ cmd = "QCFG", subcmd = "urc/ri/ring", expect = "\"pulse\",120,1000,5000,\"off\",1" },
|
||||
{ cmd = "QCFG", subcmd = "urc/ri/smsincoming", expect = "\"pulse\",120,1" },
|
||||
{ cmd = "QCFG", subcmd = "urc/ri/other", expect = "\"off\",1,1" },
|
||||
{ cmd = "QCFG", subcmd = "urc/delay", expect = "0" },
|
||||
{ cmd = "QCFG", subcmd = "urc/cache", expect = "0" },
|
||||
{ cmd = "QCFG", subcmd = "urc/ri/pin", expect = "uart_ri" },
|
||||
{ cmd = "QURCCFG", subcmd = "urcport", expect = "\"all\"" },
|
||||
# Allow sleeping for power saving
|
||||
{ cmd = "QSCLK", value = "1" },
|
||||
# GNSS configuration:
|
||||
# * Enable A-GPS data upload support (XTRA)
|
||||
# * Disable On-Demand-Positioning (ODP) mode
|
||||
# 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
|
||||
# when they are not in use.
|
||||
# * Only enable GPS and GLONASS, disable other GNSS systems.
|
||||
# A-GPS data upload doesn't work for Galileo anyway.
|
||||
# * Avoid turning on GNSS support automatically when the modem boots.
|
||||
{ cmd = "QGPSXTRA", expect = "1" },
|
||||
{ cmd = "QGPSCFG", subcmd = "gnssconfig", expect = "4" },
|
||||
{ cmd = "QGPSCFG", subcmd = "odpcontrol", expect = "0" },
|
||||
{ cmd = "QGPSCFG", subcmd = "dpoenable", expect = "1" },
|
||||
{ cmd = "QGPSCFG", subcmd = "gpsnmeatype", expect = "31" },
|
||||
{ cmd = "QGPSCFG", subcmd = "glonassnmeatype", expect = "7" },
|
||||
{ cmd = "QGPSCFG", subcmd = "galileonmeatype", expect = "0" },
|
||||
{ cmd = "QGPSCFG", subcmd = "beidounmeatype", expect = "0" },
|
||||
{ cmd = "QGPSCFG", subcmd = "autogps", expect = "0" },
|
||||
# Disable fast poweroff for stability
|
||||
{ cmd = "QCFG", subcmd = "fast/poweroff", expect = "0" },
|
||||
# Configure sleep and wake up pin levels to active low
|
||||
{ cmd = "QCFG", subcmd = "sleepind/level", expect = "0" },
|
||||
{ cmd = "QCFG", subcmd = "wakeupin/level", expect = "0,0" },
|
||||
# Do not enter RAMDUMP mode, auto-reset instead
|
||||
{ cmd = "QCFG", subcmd = "ApRstLevel", expect = "1" },
|
||||
{ cmd = "QCFG", subcmd = "ModemRstLevel", expect = "1" },
|
||||
]
|
||||
suspend = [
|
||||
]
|
||||
resume = [
|
||||
]
|
||||
reset = [ { cmd = "CFUN", value = "1,1" } ]
|
||||
|
||||
[gnss]
|
||||
enabled = true
|
||||
url = "https://xtrapath4.izatcloud.net"
|
||||
file = "xtra2.bin"
|
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.*
|
@@ -8,7 +8,7 @@
|
||||
project (
|
||||
'eg25-manager',
|
||||
'c',
|
||||
version : '0.4.1',
|
||||
version : '0.4.2',
|
||||
license : 'GPLv3+',
|
||||
meson_version : '>= 0.50.0',
|
||||
default_options :
|
||||
|
7
src/at.c
7
src/at.c
@@ -245,7 +245,14 @@ static gboolean modem_response(gint fd,
|
||||
*/
|
||||
do {
|
||||
ret = read(fd, tmp, sizeof(tmp));
|
||||
|
||||
if (ret > 0) {
|
||||
/* If we're going to overflow truncate the data we read to fit */
|
||||
if (pos + ret >= sizeof(response)) {
|
||||
g_critical("AT response buffer full, truncating");
|
||||
ret = sizeof(response) - (pos + 1);
|
||||
}
|
||||
|
||||
memcpy(&response[pos], tmp, ret);
|
||||
pos += ret;
|
||||
usleep(10000);
|
||||
|
14
src/config.c
14
src/config.c
@@ -81,3 +81,17 @@ gboolean config_get_array(toml_table_t **config, const gchar *key, toml_array_t
|
||||
|
||||
return !!array;
|
||||
}
|
||||
|
||||
gboolean config_get_table(toml_table_t **config, const gchar *key, toml_table_t **result)
|
||||
{
|
||||
toml_table_t *table = NULL;
|
||||
|
||||
if (config[EG25_CONFIG_USER])
|
||||
table = toml_table_in(config[EG25_CONFIG_USER], key);
|
||||
if (!table)
|
||||
table = toml_table_in(config[EG25_CONFIG_SYS], key);
|
||||
if (table && result)
|
||||
*result = table;
|
||||
|
||||
return !!table;
|
||||
}
|
||||
|
@@ -24,3 +24,4 @@ gboolean config_get_int(toml_table_t **config, const gchar *key, gint *result);
|
||||
gboolean config_get_uint(toml_table_t **config, const gchar *key, guint *result);
|
||||
gboolean config_get_string(toml_table_t **config, const gchar *key, gchar **result);
|
||||
gboolean config_get_array(toml_table_t **config, const gchar *key, toml_array_t **result);
|
||||
gboolean config_get_table(toml_table_t **config, const gchar *key, toml_table_t **result);
|
||||
|
183
src/gpio.c
183
src/gpio.c
@@ -9,9 +9,9 @@
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
/* Those defines are used for legacy config files only */
|
||||
#define GPIO_CHIP1_LABEL "1c20800.pinctrl"
|
||||
#define GPIO_CHIP2_LABEL "1f02c00.pinctrl"
|
||||
|
||||
#define MAX_GPIOCHIP_LINES 352
|
||||
|
||||
enum {
|
||||
@@ -101,10 +101,41 @@ int gpio_sequence_sleep(struct EG25Manager *manager)
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct gpiod_line *gpio_get_output_line(struct EG25Manager *manager, int chip, int line)
|
||||
{
|
||||
struct gpiod_line *gpio_line;
|
||||
|
||||
gpio_line = gpiod_chip_get_line(manager->gpiochip[chip], line);
|
||||
if (!gpio_line)
|
||||
return NULL;
|
||||
|
||||
if (gpiod_line_request_output(gpio_line, "eg25manager", 0) < 0) {
|
||||
gpiod_line_release(gpio_line);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return gpio_line;
|
||||
}
|
||||
|
||||
struct gpiod_line *gpio_get_input_line(struct EG25Manager *manager, int chip, int line)
|
||||
{
|
||||
struct gpiod_line *gpio_line;
|
||||
|
||||
gpio_line = gpiod_chip_get_line(manager->gpiochip[chip], line);
|
||||
if (!gpio_line)
|
||||
return NULL;
|
||||
|
||||
if (gpiod_line_request_input(gpio_line, "eg25manager") < 0) {
|
||||
gpiod_line_release(gpio_line);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return gpio_line;
|
||||
}
|
||||
|
||||
int gpio_init(struct EG25Manager *manager, toml_table_t *config[])
|
||||
{
|
||||
int i, ret;
|
||||
guint offset, chipidx, gpio_idx;
|
||||
int i;
|
||||
toml_table_t *gpio_config[EG25_CONFIG_COUNT];
|
||||
|
||||
for (i = 0; i < EG25_CONFIG_COUNT; i++)
|
||||
@@ -113,65 +144,117 @@ int gpio_init(struct EG25Manager *manager, toml_table_t *config[])
|
||||
if (!gpio_config[EG25_CONFIG_SYS])
|
||||
g_error("Default config file lacks the 'gpio' section!");
|
||||
|
||||
manager->gpiochip[0] = gpiod_chip_open_by_label(GPIO_CHIP1_LABEL);
|
||||
if (!manager->gpiochip[0]) {
|
||||
g_critical("Unable to open GPIO chip " GPIO_CHIP1_LABEL);
|
||||
return 1;
|
||||
}
|
||||
/*
|
||||
* The system config could have the `chips` key, but the user one
|
||||
* could still use the old format! In order to avoid problems, we
|
||||
* should use the new format only if:
|
||||
* - there's no user config file
|
||||
or
|
||||
* - the user config file contains the `chips` key
|
||||
* Otherwise we might start parsing the system config with the new
|
||||
* format, but error out if user config overrides gpios using the
|
||||
* old format
|
||||
*/
|
||||
if (!gpio_config[EG25_CONFIG_USER] || toml_array_in(gpio_config[EG25_CONFIG_USER], "chips"))
|
||||
{
|
||||
int numchips;
|
||||
toml_array_t *chipslist = NULL;
|
||||
|
||||
manager->gpiochip[1] = gpiod_chip_open_by_label(GPIO_CHIP2_LABEL);
|
||||
if (!manager->gpiochip[1]) {
|
||||
g_critical("Unable to open GPIO chip " GPIO_CHIP2_LABEL);
|
||||
return 1;
|
||||
}
|
||||
config_get_array(gpio_config, "chips", &chipslist);
|
||||
numchips = toml_array_nelem(chipslist);
|
||||
if (numchips > 2)
|
||||
g_error("Requesting too many GPIO chips!");
|
||||
|
||||
for (i = 0; i < GPIO_OUT_COUNT; i++) {
|
||||
if (!config_get_uint(gpio_config, gpio_out_names[i], &gpio_idx))
|
||||
g_error("Unable to get config for output GPIO '%s'", gpio_out_names[i]);
|
||||
|
||||
if (gpio_idx < MAX_GPIOCHIP_LINES) {
|
||||
offset = gpio_idx;
|
||||
chipidx = 0;
|
||||
} else {
|
||||
offset = gpio_idx - MAX_GPIOCHIP_LINES;
|
||||
chipidx = 1;
|
||||
for (i = 0; i < numchips; i++) {
|
||||
toml_datum_t data = toml_string_at(chipslist, i);
|
||||
if (!data.ok)
|
||||
continue;
|
||||
manager->gpiochip[i] = gpiod_chip_open_by_label(data.u.s);
|
||||
if (!manager->gpiochip[i])
|
||||
g_error("Unable to find GPIO chip '%s'", data.u.s);
|
||||
}
|
||||
|
||||
manager->gpio_out[i] = gpiod_chip_get_line(manager->gpiochip[chipidx], offset);
|
||||
if (!manager->gpio_out[i]) {
|
||||
g_error("Unable to get output GPIO %d", i);
|
||||
return 1;
|
||||
for (i = 0; i < GPIO_OUT_COUNT; i++) {
|
||||
toml_table_t *table;
|
||||
toml_datum_t chip, line;
|
||||
if (!config_get_table(gpio_config, gpio_out_names[i], &table))
|
||||
g_error("Unable to get config for output GPIO '%s'", gpio_out_names[i]);
|
||||
|
||||
chip = toml_int_in(table, "chip");
|
||||
if (!chip.ok || chip.u.i < 0 || chip.u.i > 2)
|
||||
g_error("Wrong chip ID for output GPIO '%s'", gpio_out_names[i]);
|
||||
|
||||
line = toml_int_in(table, "line");
|
||||
if (!line.ok || line.u.i < 0 || line.u.i > gpiod_chip_num_lines(manager->gpiochip[chip.u.i]))
|
||||
g_error("Wrong line ID for output GPIO '%s'", gpio_out_names[i]);
|
||||
|
||||
manager->gpio_out[i] = gpio_get_output_line(manager, chip.u.i, line.u.i);
|
||||
if (!manager->gpio_out[i])
|
||||
g_error("Unable to get output GPIO %d", i);
|
||||
}
|
||||
|
||||
ret = gpiod_line_request_output(manager->gpio_out[i], "eg25manager", 0);
|
||||
if (ret < 0) {
|
||||
g_error("Unable to request output GPIO %d", i);
|
||||
return 1;
|
||||
for (i = 0; i < GPIO_IN_COUNT; i++) {
|
||||
toml_table_t *table;
|
||||
toml_datum_t chip, line;
|
||||
if (!config_get_table(gpio_config, gpio_in_names[i], &table))
|
||||
g_error("Unable to get config for input GPIO '%s'", gpio_in_names[i]);
|
||||
|
||||
chip = toml_int_in(table, "chip");
|
||||
if (!chip.ok || chip.u.i < 0 || chip.u.i > 2)
|
||||
g_error("Wrong chip ID for input GPIO '%s'", gpio_in_names[i]);
|
||||
|
||||
line = toml_int_in(table, "line");
|
||||
if (!line.ok || line.u.i < 0 || line.u.i > gpiod_chip_num_lines(manager->gpiochip[chip.u.i]))
|
||||
g_error("Wrong line ID for input GPIO '%s'", gpio_in_names[i]);
|
||||
|
||||
manager->gpio_in[i] = gpio_get_input_line(manager, chip.u.i, line.u.i);
|
||||
if (!manager->gpio_in[i])
|
||||
g_error("Unable to get input GPIO %d", i);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
guint offset, chipidx, gpio_idx;
|
||||
|
||||
for (i = 0; i < GPIO_IN_COUNT; i++) {
|
||||
if (!config_get_uint(gpio_config, gpio_in_names[i], &gpio_idx))
|
||||
continue;
|
||||
/* Legacy config file, only used on the OG PinePhone */
|
||||
manager->gpiochip[0] = gpiod_chip_open_by_label(GPIO_CHIP1_LABEL);
|
||||
if (!manager->gpiochip[0])
|
||||
g_error("Unable to open GPIO chip " GPIO_CHIP1_LABEL);
|
||||
|
||||
if (gpio_idx < MAX_GPIOCHIP_LINES) {
|
||||
offset = gpio_idx;
|
||||
chipidx = 0;
|
||||
} else {
|
||||
offset = gpio_idx - MAX_GPIOCHIP_LINES;
|
||||
chipidx = 1;
|
||||
manager->gpiochip[1] = gpiod_chip_open_by_label(GPIO_CHIP2_LABEL);
|
||||
if (!manager->gpiochip[1])
|
||||
g_error("Unable to open GPIO chip " GPIO_CHIP2_LABEL);
|
||||
|
||||
for (i = 0; i < GPIO_OUT_COUNT; i++) {
|
||||
if (!config_get_uint(gpio_config, gpio_out_names[i], &gpio_idx))
|
||||
g_error("Unable to get config for output GPIO '%s'", gpio_out_names[i]);
|
||||
|
||||
if (gpio_idx < MAX_GPIOCHIP_LINES) {
|
||||
offset = gpio_idx;
|
||||
chipidx = 0;
|
||||
} else {
|
||||
offset = gpio_idx - MAX_GPIOCHIP_LINES;
|
||||
chipidx = 1;
|
||||
}
|
||||
|
||||
manager->gpio_out[i] = gpio_get_input_line(manager, chipidx, offset);
|
||||
if (!manager->gpio_out[i])
|
||||
g_error("Unable to get output GPIO %d", i);
|
||||
}
|
||||
|
||||
manager->gpio_in[i] = gpiod_chip_get_line(manager->gpiochip[chipidx], offset);
|
||||
if (!manager->gpio_in[i]) {
|
||||
g_warning("Unable to get input GPIO %d", i);
|
||||
continue;
|
||||
}
|
||||
for (i = 0; i < GPIO_IN_COUNT; i++) {
|
||||
if (!config_get_uint(gpio_config, gpio_in_names[i], &gpio_idx))
|
||||
continue;
|
||||
|
||||
ret = gpiod_line_request_input(manager->gpio_in[i], "eg25manager");
|
||||
if (ret < 0) {
|
||||
g_warning("Unable to request input GPIO %d", i);
|
||||
manager->gpio_in[i] = NULL;
|
||||
if (gpio_idx < MAX_GPIOCHIP_LINES) {
|
||||
offset = gpio_idx;
|
||||
chipidx = 0;
|
||||
} else {
|
||||
offset = gpio_idx - MAX_GPIOCHIP_LINES;
|
||||
chipidx = 1;
|
||||
}
|
||||
|
||||
manager->gpio_in[i] = gpio_get_input_line(manager, chipidx, offset);
|
||||
if (!manager->gpio_in[i])
|
||||
g_error("Unable to get input GPIO %d", i);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user