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,99 @@
From 532de37e84dac82936b056e28fb71ce4c7af60d6 Mon Sep 17 00:00:00 2001
From: Jorijn van der Graaf <jorijnvdgraaf@catcrafts.net>
Date: Sat, 27 Jun 2026 00:19:05 +0200
Subject: [PATCH] loc: add client identification TLVs to Register Events
Newer Snapdragon GNSS engines (e.g. SM7635/milos, gnss8) gate
positioning behind an application-framework ("AFW", i.e. the Android
framework) client check: unless the client registers as an AFW client
via QMI_LOC_REG_EVENTS, event registration fails with INVALID_ARGUMENT
and QMI_LOC_START with GENERAL_FAILURE. The stock Android loc HAL
sends three extra TLVs in Register Events that libqmi did not model:
0x10 Client String ID (string, max 4 chars, e.g. "MHAL")
0x11 Client Type (enum: AFW/NFW/Privileged)
0x12 Enable Positioning Request Notification (boolean)
TLV names follow qmiLocRegEventsReqMsgT_v02 (clientStrId, clientType,
enablePosRequestNotification) in the public location service API:
https://github.com/qualcomm-linux/location-apis-qcom/blob/location.lnx.0.0/loc_api/loc_api_v02/location_service_v02.h
Client Type is modeled as a new QmiLocClientType enum matching
qmiLocClientTypeEnumT_v02 from the same header (AFW=1, NFW=2,
PRIVILEGED=3; the engine defaults to NFW when the TLV is absent).
Add them as optional inputs. libqmi serializes them only when a caller
sets them, so this change does not alter any existing message on the
wire.
Signed-off-by: Jorijn van der Graaf <jorijnvdgraaf@catcrafts.net>
---
data/qmi-service-loc.json | 20 +++++++++++++++++++-
src/libqmi-glib/qmi-enums-loc.h | 20 ++++++++++++++++++++
2 files changed, 39 insertions(+), 1 deletion(-)
diff --git a/data/qmi-service-loc.json b/data/qmi-service-loc.json
index 314b4325..b6f079a5 100644
--- a/data/qmi-service-loc.json
+++ b/data/qmi-service-loc.json
@@ -84,7 +84,25 @@
"type" : "TLV",
"since" : "1.22",
"format" : "guint64",
- "public-format" : "QmiLocEventRegistrationFlag" } ],
+ "public-format" : "QmiLocEventRegistrationFlag" },
+ { "name" : "Client String ID",
+ "id" : "0x10",
+ "type" : "TLV",
+ "since" : "1.40",
+ "format" : "string",
+ "max-size" : "4" },
+ { "name" : "Client Type",
+ "id" : "0x11",
+ "type" : "TLV",
+ "since" : "1.40",
+ "format" : "guint32",
+ "public-format" : "QmiLocClientType" },
+ { "name" : "Enable Positioning Request Notification",
+ "id" : "0x12",
+ "type" : "TLV",
+ "since" : "1.40",
+ "format" : "guint8",
+ "public-format" : "gboolean" } ],
"output" : [ { "common-ref" : "Operation Result" } ] },
// *********************************************************************************
diff --git a/src/libqmi-glib/qmi-enums-loc.h b/src/libqmi-glib/qmi-enums-loc.h
index 2fe76449..52b279bd 100644
--- a/src/libqmi-glib/qmi-enums-loc.h
+++ b/src/libqmi-glib/qmi-enums-loc.h
@@ -37,6 +37,26 @@
* interface.
*/
+/*****************************************************************************/
+/* Helper enums for the 'QMI LOC Register Events' request */
+
+/**
+ * QmiLocClientType:
+ * @QMI_LOC_CLIENT_TYPE_AFW: Application framework client (i.e. the Android framework).
+ * @QMI_LOC_CLIENT_TYPE_NFW: Non-framework client.
+ * @QMI_LOC_CLIENT_TYPE_PRIVILEGED: Privileged client.
+ *
+ * Type of client registering with the location engine. If not specified,
+ * the engine treats the client as a non-framework client.
+ *
+ * Since: 1.40
+ */
+typedef enum { /*< since=1.40 >*/
+ QMI_LOC_CLIENT_TYPE_AFW = 1,
+ QMI_LOC_CLIENT_TYPE_NFW = 2,
+ QMI_LOC_CLIENT_TYPE_PRIVILEGED = 3,
+} QmiLocClientType;
+
/*****************************************************************************/
/* Helper enums for the 'QMI LOC Start' indication */
--
2.55.0

View file

@ -0,0 +1,65 @@
# fp6-img fork of Alpine community/libqmi: + the upstream-merged (!470,
# unreleased) LOC Register Events client-identification TLVs - half of
# working GNSS on the FP6. Drop when Alpine ships libqmi > 1.39.0.
# Contributor: Stuart Cardall <developer@it-offshore.co.uk>
maintainer="Achill Gilgenast <achill@achill.org>"
pkgname=libqmi
pkgver=1.38.0_git20260414
_commit=cff17a676e10d75081516dafa997fe9bc9043c38
pkgrel=100
pkgdesc="QMI modem protocol helper library"
url="https://www.freedesktop.org/wiki/Software/libqmi"
arch="all"
license="GPL-2.0-or-later AND LGPL-2.1-or-later"
makedepends="
bash-completion-dev
glib-dev
gobject-introspection-dev
help2man
libgudev-dev
libmbim-dev
libqrtr-glib-dev
linux-headers
meson
python3
"
subpackages="
$pkgname-dev
$pkgname-doc
$pkgname-bash-completion
qmi-utils
"
#source="https://gitlab.freedesktop.org/mobile-broadband/libqmi/-/archive/$pkgver/libqmi-$pkgver.tar.gz"
source="https://gitlab.freedesktop.org/mobile-broadband/libqmi/-/archive/$_commit/libqmi-$_commit.tar.gz
0001-loc-add-client-identification-TLVs-to-Register-Event.patch
"
builddir="$srcdir/$pkgname-$_commit"
build() {
abuild-meson \
-Db_lto=true \
. output
meson compile -C output
}
check() {
local tests=$(meson test --list -C output)
case "$CARCH" in
s390x) tests=${tests//test-message} ;;
esac
meson test --print-errorlogs -C output $tests
}
package() {
DESTDIR="$pkgdir" meson install --no-rebuild -C output
}
utils() {
pkgdesc="$pkgdesc (CLI utilities)"
amove usr/bin
}
sha512sums="
fc178689675b47faaa46c14b126dc054354044238ea00464b4cc4910c5f2c73faaa12d80a5219fbfad65ab575e38f7af3fd79ae7974ea80ed67bfffe027b85c3 libqmi-cff17a676e10d75081516dafa997fe9bc9043c38.tar.gz
"