Commit graph

34 commits

Author SHA1 Message Date
42d28305ca README: the modemst wipe is 'fastboot flash boot', precisely
Isolated by experiment (2026-08-09, journal/modem): flash boot alone
zeroes modem NV; erase dtbo and idle fastboot visits are safe; on-device
boot-deploy (incl. apk kernel upgrades) never trips it. Likely ABL
anti-tamper on boot-image overwrite under an unlocked bootloader.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 01:10:16 +02:00
6315f2ca7c README: warn about modemst zeroing before flashing
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 00:37:11 +02:00
30f2778fc4 audio: select the pipewire backend explicitly and ban the pulse one
Full-system audit findings: without an explicit provider selection the
image installed real PulseAudio (Plasma Mobile hard-path), which claims
the card and ships a wireplumber fragment disabling hardware.audio -
zero sinks forever. Mirror the dev phone's world: pipewire backend meta
+ pipewire-pulse + echo-cancel in extra_packages, pulse meta banned via
apk conflict in fp6-device-tweaks. The two hand-made /etc audio
fragments (wireplumber no-ACP rule, AEC pair for VoLTE speakerphone)
move into soc-fairphone-fp6-audio.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 00:32:11 +02:00
ff69f4d913 fp6-no-suspend -> fp6-device-tweaks: + the three IMU-critical /etc files
Full-system audit on the flashed phone found the IMU dead: the journal's
documented reinstall-loss trio (inv-icm42600-spi modules-load - fallback-only
SPI node never coldplugs; the accel poll udev rule for auto-rotate; the
iio-sensor-proxy libssc-crash restart drop-in). All device-critical, none
personal - now packaged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 00:03:09 +02:00
05cd1084b7 image completeness: fp6-no-suspend + imsd boot enablement
Two device-critical pieces previously applied only by the dev restore
script: masked sleep targets (idle-suspend resets the WCN combo firmware
and kills wifi ~40min - a device defect, not personalization) and imsd
enabled at boot, gated on /etc/imsd.env existing so unconfigured systems
don't boot a failing unit. A stranger now needs exactly: flash, wifi via
UI, write imsd.env, restart imsd.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 23:46:01 +02:00
283996b507 modemmanager: skip the test suite under qemu
3 of 38 glib tests SIGABRT under qemu-user emulation; they pass on
native builders and do not touch the patched GNSS paths.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 23:07:20 +02:00
4de0ffc316 libqmi: opt out of crossdirect like modemmanager
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 22:53:17 +02:00
8e5b8354d5 build.sh: build libqmi then modemmanager explicitly before install
pmbootstrap's install-time build plan is not topologically sorted; the
versioned makedep made that a hard error instead of a stale-dep build.
Explicit bottom-up build restores order; no-op when current.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 22:47:55 +02:00
2019e158aa modemmanager: versioned libqmi-dev makedep; kernel pkgver date stamping
pmbootstrap's build plan is not dependency-ordered: MM built first and
grabbed the cached 1.39.0 libqmi from the volume's package repo. The
versioned makedepend states the real requirement and forces our bumped
libqmi to build first. Kernel pkgver gains the source commit date so
registry-subscribed phones receive kernel updates.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 22:39:14 +02:00
851526f3fc package updates: Forgejo apk registry publishing + repo-config aport
CI publishes every locally built apk to the instance's Alpine registry
(catbot credentials via the PACKAGE_TOKEN secret; step skips until it
exists). catcrafts-fp6-repo ships the registry signing key and appends
the repo URL - NOT yet in extra_packages: the registry must have its
first content before image builds may reference it (an empty repo's
missing APKINDEX would break apk in the build chroots).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 22:33:45 +02:00
f8402f97a5 build.sh: retry flaky git clones; empty dist/ in place
The forgejo VM occasionally 500s under crawler load - a clone blip
should cost 10 seconds, not the run. dist/ keeps its inode so a shell
cd'd into it no longer breaks the next podman start.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 22:26:36 +02:00
1a73502479 libqmi: bump snapshot past the !470 merge instead of patching
Our MM patches require qmi-glib >= 1.39.1 (the version bumped right after
!470 merged); Alpine's April snapshot reports 1.39.0. Upstream 30f3e998
carries both the TLV work and the version bump, so the local patch goes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 22:19:31 +02:00
8387858f37 modemmanager: opt out of crossdirect (cc1 spawn failure); build under qemu
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 22:05:21 +02:00
11dc33d843 modemmanager: drop the pinned own-subpackage from makedepends
apk cannot satisfy libmm-glib=<ver>-r100 before modemmanager r100 itself
is built; Alpine's reuse of depends_dev inside makedepends only works
when the binary repo already has the same pkgrel.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 21:59:14 +02:00
3bc6e88249 ci: provision bash for the forgejo-release action
Run 11 built and uploaded everything; only the release step died on
alpine's missing bash.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 21:52:46 +02:00
45caa3ac65 aports: the two modemmanager GNSS patches were never committed
git -C <repo> format-patch -o . writes relative to the -C directory, not
the caller's cwd - the files landed in work/ModemManager and the aport
shipped an APKBUILD referencing patches that did not exist.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 21:47:57 +02:00
7578b2149c kernel config: enable NLS_ASCII - the vfat ESP mounts with iocharset=ascii
First flash boot reached systemd and died into emergency mode on
'FAT-fs (loop0p1): IO charset ascii not found': the tested phone config
never needed FAT NLS tables because the old install used an ext2 /boot;
the current device package uses a vfat ESP. Single flip, olddefconfig
roundtripped.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 21:41:14 +02:00
da3d908b93 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>
2026-08-08 21:27:48 +02:00
4e43e6d57b image parity: imsd 0.3.0 (pinned public commit) + callaudioshim + modem-daemon override
imsd turns out to be fully public already (0.2.7 snapshot + emergency
stage 1 + the make build path) - no tag needed, same git-archive dance as
the kernel. callaudioshim was a load-bearing unpackaged home-dir script on
the phone (callaudiod replacement, working in-call mic mute); now an aport
autostarted at phase 1. kde-telephony's modem daemon autostart is hidden
via /etc/skel from the imsd package, mirroring the phone's user override.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 20:54:29 +02:00
719a10a997 aports: add soc-fairphone-fp6-audio (topology, amp config, UCM)
Files copied byte-identical from the tested dev phone; installed to the
exact deployed paths (the spaced tplg/UCM filenames come from the machine
driver's card name). Wired into the image via extra_packages.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 20:48:28 +02:00
939e2b84ba build.sh: require host /dev bind-mount instead of mknod snapshots
Some checks failed
image / image (push) Failing after 1h11m3s
Partition nodes (loopNpM) only appear via the host devtmpfs; a privileged
container's own /dev never gains them. Drop the static mknod dance, warn
when /dev is not the host's.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 20:28:46 +02:00
3dad95c4a1 build.sh: document host loop requirement; dump pmbootstrap log on failure
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 20:11:03 +02:00
6fb3ff27ef build.sh: create static loop + dm device nodes in the container
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 19:57:43 +02:00
95ec50d0b0 build.sh: mkdir /usr/local/sbin before writing the modprobe stub
Some checks are pending
image / image (push) Has started running
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 19:39:45 +02:00
c2c2e90d3a build.sh: stub modprobe in the container; loop autoloads host-side
Some checks failed
image / image (push) Failing after 16s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 19:36:55 +02:00
24f0b786dc ci: retrigger - loop module now loaded persistently on the runner host
Some checks failed
image / image (push) Has been cancelled
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 19:13:03 +02:00
a1060024ac build.sh: add kpartx + util-linux losetup to the job container
Some checks failed
image / image (push) Failing after 59m28s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 16:43:26 +02:00
ca9e36c95c build.sh: pin pmbootstrap 3.11.1 from git
Some checks failed
image / image (push) Failing after 2m5s
Alpine's packaged pmbootstrap predates pmaports' master->main rename and
fails reading channels.cfg. Pinning also matches the version the rest of
this script was written against.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 16:40:11 +02:00
127b21e124 build.sh: create the pmbootstrap work dir + version stamp ourselves
Some checks failed
image / image (push) Failing after 1m45s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 16:35:01 +02:00
9e30e6b4ee build.sh: write pmbootstrap config directly; propagate errors; keep checkout root-owned
Some checks failed
image / image (push) Failing after 1m40s
'pmbootstrap config' demands an existing config file, so write
pmbootstrap_v3.cfg ourselves (INI, aports/device/ui/systemd). Explicit
set -eu because 'sh script' ignores shebang flags - run 3 shipped a
3.5KB 'image' because failures didn't propagate. dist/ is now the only
build-user-owned path, so the tag step's git works again.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 16:30:19 +02:00
2d38be3cf4 build.sh: set the executable bit
Some checks failed
image / image (push) Failing after 1m40s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 16:23:49 +02:00
a702800dea ci: provision nodejs+git before Node actions run
Some checks failed
image / image (push) Failing after 4s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 16:21:47 +02:00
074d1b1c90 build.sh: first runnable revision
Some checks failed
image / image (push) Failing after 11s
Learned from the pmbootstrap 3.11 source: aports overlays must replace
upstream dirs in one tree (duplicate pkgnames are a hard error), pmbootstrap
refuses root (drop to a sudo-capable build user), and export symlinks are
boot.img + fairphone-fp6.img. Stage 1 builds without imsd until the v0.3.0
tag exists. Temporary push trigger for bring-up.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 16:20:02 +02:00
de2e819a16 scaffold: aports overlay, build script, CI workflow, README
Kernel aport forked from pmaports 7.1.2-r0, repointed at milos-linux
combined-stable with the tested FP6 config (+EFI_ZBOOT for packaging);
imsd + nftables aports from the pending pmaports submission. build.sh
carries TODO(validate) markers - not yet run end-to-end.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 15:42:45 +02:00