aports: GNSS via forked Alpine libqmi + modemmanager

libqmi: the upstream-merged (!470, in no release yet) LOC Register Events
client-identification TLVs, taken verbatim from upstream main (532de37e).
modemmanager: the AFW engine unlock + Position Report derivation (!1463,
still draft upstream, review-hardened and verified on device). Both as
patches on Alpine's git-snapshot aports, pkgrel=100.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Jorijn van der Graaf 2026-08-08 21:27:48 +02:00
commit da3d908b93
8 changed files with 357 additions and 4 deletions

View file

@ -0,0 +1,42 @@
From 4b936ada44a0f6ccb02745e9452c2b4b2412341c Mon Sep 17 00:00:00 2001
From: Aelin <aelin@postmarketos.org>
Date: Thu, 11 Jun 2026 22:01:36 +0200
Subject: [PATCH] intel: XMM7360: fix big-endian handling of ASN integer output
xmm7360_byte_array_read_asn_int() previously always returned
*out_val from the union member `value.l`, regardless of the actual
integer size. On big-endian systems, this caused 1-byte or 2-byte
values to be shifted incorrectly (e.g., 1-byte value 0x01 became
0x01000000).
Fix this by selecting the union member that matches the ASN int type.
---
src/plugins/intel/mm-xmmrpc-xmm7360-protocol.c | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.c b/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.c
index dcf16280..82db189c 100644
--- a/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.c
+++ b/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.c
@@ -115,14 +115,10 @@ xmm7360_byte_array_read_asn_int (GByteArray *buf,
*out_arg = arg;
if (out_val) {
- /* If the ASN int is negative, we must convert a int8/int16
- * value to the appropriate u32 value to avoid returning a
- * positive 32-bit gint.
- */
- if ((arg.type == XMM7360_RPC_MSG_ARG_TYPE_BYTE) && (arg.value.b < 0))
- *out_val = (arg.value.b << 24) >> 24;
- else if ((arg.type == XMM7360_RPC_MSG_ARG_TYPE_SHORT) && (arg.value.s < 0))
- *out_val = (arg.value.s << 16) >> 16;
+ if (arg.type == XMM7360_RPC_MSG_ARG_TYPE_BYTE)
+ *out_val = arg.value.b;
+ else if (arg.type == XMM7360_RPC_MSG_ARG_TYPE_SHORT)
+ *out_val = arg.value.s;
else
*out_val = arg.value.l;
}
--
2.54.0

View file

@ -0,0 +1,108 @@
# fp6-img fork of Alpine community/modemmanager: + the AFW-gated GNSS
# engine unlock + Position Report location derivation (upstream MR !1463,
# still draft) - the other half of working GNSS on the FP6.
# Contributor: Stuart Cardall <developer@it-offshore.co.uk>
maintainer="Achill Gilgenast <achill@achill.org>"
pkgname=modemmanager
pkgver=1.25.95_git20260709
pkgrel=100
_commit=d776ea38d29ca472a12323c1d45002ee19a66f57
pkgdesc="ModemManager library"
url="https://www.freedesktop.org/wiki/Software/ModemManager"
arch="all"
license="GPL-2.0-or-later AND LGPL-2.1-or-later"
depends="
dbus
libmm-glib=$pkgver-r$pkgrel
mobile-broadband-provider-info
polkit
"
depends_dev="libmm-glib=$pkgver-r$pkgrel"
makedepends="
$depends_dev
bash-completion-dev
dbus-dev
elogind-dev
gobject-introspection-dev
gtk-doc
libgudev-dev
libmbim-dev
libqmi-dev
linux-headers
meson
polkit-dev
vala
"
checkdepends="glib-dev py3-gobject3 py3-dbus"
subpackages="
$pkgname-lang
$pkgname-doc
libmm-glib:libmm
$pkgname-dbg
$pkgname-dev
$pkgname-openrc
$pkgname-bash-completion
$pkgname-systemd
$pkgname-udev
"
#source="https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/archive/$pkgver/ModemManager-$pkgver.tar.gz
source="https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/archive/$_commit/ModemManager-$_commit.tar.gz
$pkgname.rules
$pkgname.initd
0001-intel-XMM7360-fix-big-endian-handling-of-ASN-integer.patch
0002-shared-qmi-unlock-AFW-gated-GNSS-engines-at-LOC-star.patch
0003-shared-qmi-derive-location-from-Position-Report-indi.patch
"
#builddir="$srcdir"/ModemManager-$pkgver
builddir="$srcdir"/ModemManager-$_commit
build() {
# Temporarily disable gtkdoc generation due to error in helper script
# https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/902
abuild-meson \
-Db_lto=true \
-Dsystemdsystemunitdir=/usr/lib/systemd/system \
-Ddbus_policy_dir=/usr/share/dbus-1/system.d \
-Dgtk_doc=false \
-Dpolkit=permissive \
-Dsystemd_journal=false \
-Dsystemd_suspend_resume=true \
-Dvapi=true \
. output
meson compile -C output
}
check() {
meson test -C output
}
package() {
DESTDIR="$pkgdir" meson install --no-rebuild -C output
install -m644 -D "$srcdir/$pkgname.rules" \
"$pkgdir/usr/share/polkit-1/rules.d/01-org.freedesktop.ModemManager.rules"
install -m755 -D "$srcdir/$pkgname.initd" \
"$pkgdir/etc/init.d/$pkgname"
# post-install message
mkdir -p "$pkgdir/usr/share/doc/$pkgname"
cat > "$pkgdir"/usr/share/doc/$pkgname/README.alpine <<- EOF
If your USB modem shows up as a Flash drive when you plug it in:
install 'usb-modeswitch' to automatically switch to USB modem mode whenever you plug it in.
To control your modem without the root password: add your user account to the 'plugdev' group.
EOF
}
libmm() {
depends=""
amove usr/lib/girepository-1.0
amove usr/lib/libmm-glib.so*
}
sha512sums="
fd659330b2ec4e8368807053ec01498241dec153f6f2491bb17c42e2b81c8d9a98ff5f8c153874a6d092e17c545c5ae19734bc23c85c459eb1c7b9b709e5ff58 ModemManager-d776ea38d29ca472a12323c1d45002ee19a66f57.tar.gz
6fab86c27502b29be0c6610d835a3249a4a81993eb986cff2c3ea9393fadd3f693ba4bb0532ae0e50a83d359559511859dd05f7ea2f0cb52839f535a7e49f8a0 modemmanager.rules
6e234cebcdec6d1afbca164ee5c13c96f7132ef31231d5c043cc5750ebe99e362a384d0463874b3c1c30799b433e0d3286add03af13c97fa406b4b5d2b78880c modemmanager.initd
f06e9b89acab5b61c5965658d62551b0f168066384674f7c4dd56feb6f811c82c640470e634e32d8c4ef62290588cf974aa5f213e5c67e797a06d33e61fa24ec 0001-intel-XMM7360-fix-big-endian-handling-of-ASN-integer.patch
"

View file

@ -0,0 +1,12 @@
#!/sbin/openrc-run
supervisor=supervise-daemon
command=/usr/sbin/ModemManager
command_args="${modemmanager_opts}"
description="ModemManager Daemon"
depend() {
need dbus
need polkit
}

View file

@ -0,0 +1,19 @@
// Let users in plugdev group modify ModemManager
polkit.addRule(function(action, subject) {
if ((action.id == "org.freedesktop.ModemManager1.Device.Control" ||
action.id == "org.freedesktop.ModemManager1.Contacts" ||
action.id == "org.freedesktop.ModemManager1.Messaging" ||
action.id == "org.freedesktop.ModemManager1.Location") &&
subject.isInGroup("plugdev") && subject.active) {
return "yes";
}
});
// Let geoclue modify ModemManager for location gathering
polkit.addRule(function(action, subject) {
if ((action.id == "org.freedesktop.ModemManager1.Device.Control" ||
action.id == "org.freedesktop.ModemManager1.Location") &&
subject.isInGroup("geoclue")) {
return "yes";
}
});