The device tree asks ath11k for the Fairphone_Gen_6 board data entry. Upstream linux-firmware's WCN6750 board-2.bin has no Fairphone entry, so the driver silently falls back to the generic board-id 255 data; the FP6 Plus does not associate on it (user report 2026-10-14), the FP6 happens to. The stock modem partition carries the device's own calibration as image/qca6750/bdwlan.elf. New manifest directive ath11k-bdf: copy that ELF and wrap it into a container under /lib/firmware/updates (searched first by the loader) that is upstream's board-2.bin with every entry kept plus one BOARD entry under the requested name. Verified structurally (ELF magic, size, the container magic), no hash pin: calibration data is OEM data and the WLAN firmware checks what it is given. If the base already carries the name the override is not built and a stale one is removed. --refresh re-derives it. The fragment re-probes ath11k as the fallback for a driver that probed before extraction (WPSS restart, the association comes back via NetworkManager). zstd joins the dependencies to read the compressed base. On the dev phone the built container is byte-identical to the one hand-made from the stock image by the reporter (sha256 186202ee...), built in 1.2 s.
71 lines
3.9 KiB
Text
71 lines
3.9 KiB
Text
# First-boot, on-device extraction of proprietary blobs from the stock
|
|
# Android partitions, so the image never has to ship or distribute them.
|
|
# pmOS installs flash only boot+userdata: the stock vendor/dsp partitions
|
|
# stay on every installed unit, and the device duplicates files it already
|
|
# lawfully contains, for its own operation. Design, legal frame and the
|
|
# on-phone verification: fp6 repo journal/blobs/.
|
|
#
|
|
# Consumers depend on this package and install a manifest fragment into
|
|
# /usr/share/fp6-vendor-blobs/manifest.d/ (syntax in the extract script);
|
|
# their post-install/post-upgrade should also run
|
|
# /usr/lib/fp6-vendor-blobs/extract --if-device so a package upgrade that
|
|
# drops a previously-shipped blob restores the file immediately instead of
|
|
# at the next boot (--refresh in addition for an mbn consumer: it re-derives
|
|
# the trustlet from the active slot even if a file is present). Consumers:
|
|
# soc-fairphone-fp6-audio (aw88261 acf), fingerprintd (focal64 trustlet).
|
|
#
|
|
# 1-r3 (2026-09-11): active slot first, an unpinned ('-') structurally
|
|
# verified mode for mbn, --refresh -- after two field units got no
|
|
# fingerprint sensor from a whole-image hash pin that can only match one
|
|
# Android build (fp6 repo journal/blobs/, journal/fingerprint/).
|
|
maintainer="Jorijn van der Graaf <jorijnvdgraaf@catcrafts.net>"
|
|
pkgname=fp6-vendor-blobs
|
|
pkgver=1
|
|
pkgrel=4
|
|
pkgdesc="On-device extraction of vendor blobs from the stock Android partitions"
|
|
url="https://forgejo.catcrafts.net/Catcrafts/fp6-img"
|
|
arch="noarch"
|
|
license="MIT"
|
|
# fallback mapper for when the initramfs didn't map the dynamic partitions
|
|
depends="make-dynpart-mappings zstd"
|
|
install="$pkgname.post-upgrade"
|
|
options="!check"
|
|
source="
|
|
fp6-vendor-blobs-extract
|
|
fp6-vendor-blobs.service
|
|
fp6-vendor-blobs.preset
|
|
30-ath11k-board-data.manifest
|
|
"
|
|
|
|
package() {
|
|
install -Dm755 "$srcdir"/fp6-vendor-blobs-extract \
|
|
"$pkgdir"/usr/lib/fp6-vendor-blobs/extract
|
|
install -Dm644 "$srcdir"/fp6-vendor-blobs.service \
|
|
"$pkgdir"/usr/lib/systemd/system/fp6-vendor-blobs.service
|
|
# enabled unconditionally: the unit is a fast no-op once every manifest
|
|
# dest exists, and blobs appearing on first boot must not depend on a
|
|
# manual systemctl enable. sysinit = the real (pre-coldplug) run;
|
|
# multi-user = the post-udev retry if the early run failed (see unit)
|
|
mkdir -p "$pkgdir"/etc/systemd/system/sysinit.target.wants \
|
|
"$pkgdir"/etc/systemd/system/multi-user.target.wants
|
|
ln -s /usr/lib/systemd/system/fp6-vendor-blobs.service \
|
|
"$pkgdir"/etc/systemd/system/sysinit.target.wants/fp6-vendor-blobs.service
|
|
ln -s /usr/lib/systemd/system/fp6-vendor-blobs.service \
|
|
"$pkgdir"/etc/systemd/system/multi-user.target.wants/fp6-vendor-blobs.service
|
|
# ...and a preset, because the symlink alone does NOT survive: image
|
|
# build runs `systemctl preset-all`, which removes .wants links for any
|
|
# unit not enabled by a preset. That is what shipped the 2026-08-24
|
|
# image with the service `disabled; preset: disabled` -- no blob
|
|
# extracted, no sound card. See journal/blobs/ 2026-08-28.
|
|
install -Dm644 "$srcdir"/fp6-vendor-blobs.preset \
|
|
"$pkgdir"/usr/lib/systemd/system-preset/50-fp6-vendor-blobs.preset
|
|
install -Dm644 "$srcdir"/30-ath11k-board-data.manifest \
|
|
"$pkgdir"/usr/share/fp6-vendor-blobs/manifest.d/30-ath11k-board-data.manifest
|
|
}
|
|
|
|
sha512sums="
|
|
2aa740a2c4999d7e09c328664fe9c03e8a4ac8ddf1215b2d2b2755b12383dce873b9eafbce4706e87405cf2b0aa2e29ed582f31d9ee085346f911c11269c1f22 fp6-vendor-blobs-extract
|
|
b4c290095d9f39515378dfef08de720ce49324210342aa13c131dfce1103785e796e6f821f0c659671a4c44b46f466ce0e03f11f216fdcdee2a99db5e7970800 fp6-vendor-blobs.service
|
|
9e79dd0aed13f11a71282aa24b2a26331e85c105e25ab0c0fed6189b8c300769a5f4308b18b91d9855868d658ad3a57c03e26c9b11bd27fd5e03f9a5decbbd6a fp6-vendor-blobs.preset
|
|
1265a0f78aa4d9566e4a9f7827c8cead3a1848dc8bbd4288165085e87a824ea0c0940a16e5426f74074fcb29c1fddccf76f6dd3b16efa7ddffc2c437b9531439 30-ath11k-board-data.manifest
|
|
"
|