docs/fhs-mapping.md: full audit (297 unique /storage paths classified
across 7 classes A-G + Z special cases), seven-phase plan, rules of
the road. Phase 0 introduces the vocabulary (vars in
/etc/profile.d/archr-fhs.sh) without moving any data. Each subsequent
phase ends in a commit with grep + boot validation before the next
one starts. User data (saves, ROMs) is phase 6, only after all other
phases survived at least one release on the stable channel.
.gitignore: whitelist docs/fhs-mapping.md so the plan stays tracked
alongside improvements.md and release-policy.md while the rest of
docs/ remains user-local.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
.gitignore had docs/* blocking everything; the rest of the directory
remains user-local notes, so whitelist only the two files that belong
to the project: improvements.md (Arch-ification roadmap, with the
architectural decision that LibreELEC overlay is by design) and
release-policy.md (semver-RC until v2.0, YYYY.MM.PATCH after, three
release channels mapped to updates.branch).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Commit 4273d71442 was meant to bump PKG_VERSION 6.12.79 -> 6.12.94 and
remove the now-upstream u_ether patch in one commit, but the git add
failed silently on a path that had already been git-rm'd, so only the
patch deletion landed and the version bump itself stayed unstaged.
This adds the missing PKG_VERSION and PKG_SHA256 lines so the build
actually picks up 6.12.94.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
scripts/image: rewrite /etc/os-release block to the freedesktop layout
expected by third-party tools. ID_LIKE=arch is the change that makes
ArchR detect-cleanly as Arch family across distros, package managers
and analytics. PRETTY_NAME, ANSI_COLOR, LOGO, DOCUMENTATION_URL,
SUPPORT_URL and BUG_REPORT_URL added on top, with sensible fallbacks
from GIT_ORGANIZATION/GIT_REPO when the user has not overridden them
in distributions/ArchR/options.
Drop the empty /etc/archr-release sentinel file alongside os-release.
Arch ships /etc/arch-release the same way (empty by convention) for
tools that detect distro family by file presence rather than by parsing
os-release.
distributions/ArchR/options: fix typo HOME_URL "arc-r.io" -> "arch-r.io".
projects/ArchR/packages/archr: ship archr(7) under /usr/share/man/man7.
First man page of the distro, covers the public command surface
(archr-update, archr-config, archr-systems, etc.), the file locations
that matter (/etc/os-release, /etc/archr-release, /storage layout) and
the architectural decision recorded today (LibreELEC-style read-only
rootfs + storage overlay is by design, not technical debt; SteamOS
validates the model).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Sliding within the same 6.12 LTS branch (longterm support runs until
December 2026), this picks up 15 stable patch releases of bugfix
and CVE work without touching ABI/API.
Pin the source tarball with PKG_SHA256 so a network MITM cannot
silently swap the kernel under us.
Drop 0020-usb-gadget-u_ether-guard-NULL-gadget-in-eth_get_drvinfo.patch
— that fix landed upstream in 6.12.81 stable. Keeping our copy would
conflict on apply.
The remaining nine patches all touch areas (panfrost, ntsync,
rtl8xxxu) that received no churn in the 79..94 window, so they
should apply unchanged; the next docker-RK3326 build will confirm.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
systemd: re-enable timedated (was -Dtimedated=false). Drop the
post-install safe_remove that nuked /usr/bin/timedatectl so users
can finally run timedatectl set-timezone from the shell. Two
upstream-equivalent patches accompany the build: 0600 redirects
the timedated write target to /var/run/localtime (writable on our
read-only rootfs), 0601 makes the timezone reader follow indirect
symlinks (matches the /etc -> /storage layout).
udevil: pull the cleaned udevil.conf (UFS gate moved from
allowed_devices to forbidden_devices, /dev/sd* whitelisted as
removable). The udev rule now bails on anything that is not
usb-storage. Internal mmc devices were never matched by the prior
KERNEL=="sd*|sr*" filter anyway, but this makes the intent
explicit and stops misclassified eSATA-like devices.
input_sense: grep -line-buffered before the parse loop so only
EV_KEY / EV_SW / error-reading lines reach the case statement.
evtest output is mostly EV_ABS noise we threw away anyway; this
cuts the CPU spent on the dispatch hot path on every controller.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
retroarch: bump to commit bdba046f (v1.22.2 + fixes) and rebase the
two local patches (0010-paths, 0011-cheevos-sounds) so they apply
cleanly against the new tree.
setsettings.sh: configure_hotkeys now detects the InputPlumber-emulated
DualSense pad first, then falls back to js0 / joypad. Without this,
retroarch took the raw event device and the hotkey binding never
matched what InputPlumber actually exposed to userspace.
drastic-sa: pull the new libdrastouch (sharp-shimmerless + quilez
pixel shaders, SDL2 hook) and the matching start_drastic.sh, which
now reads the shader setting and exports DSHOOK_SHADER. Drops the
dead S922X libmali block we never executed on RK3326.
hypseus-singe: rewrite of start_hypseus.sh fixes broken controls
(autoconfig.cfg lookup was matching too loosely) and adds the
set_kill on exit so the quit hotkey actually terminates the
emulator instead of leaving it parented to ES.
ppsspp-sa: add 005-hide-unsupported-ui-items.patch to drop the
"www.ppsspp.org" link and the "Buy PPSSPP Gold" button from the
main screen. Handheld UX cleanup, no behavioral change.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
mali-bifrost (RK3326): replace patch 003 with the clean RK3576-style
version. Drops the dead BSP-style probe-defer dance, balances the
regulator refcount during probe (mirrors the clock prepare/enable),
and removes the regulator_is_enabled guard that was silently skipping
the disable on suspend. Frees the kernel log of the "missed warnings"
sunshineinabox flagged.
iwd (network): ControlPortOverNL80211=true so 802.1X EAPOL frames go
through nl80211 instead of the legacy raw socket. Some clones with
modern wifi firmware fail association otherwise.
linux 6.12-LTS: add 0020-usb-gadget-u_ether-guard-NULL-gadget upstream
fix. Without it, querying ethtool on the surviving NCM interface
during gadget detach dereferences a NULL dev->gadget pointer and
panics. Affects anyone who flips USB gadget mode at runtime.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The Y3506 family (V03/V04/V05 soysauce variants) ships without an
external speaker amplifier on the PCB; the rk817 SPKO line drives
the mono speaker directly. The vendor BSP 4.4 hides this with
hardcoded DAPM widgets and routes in rk817_codec.c, but mainline
ASoC respects the DT strictly, so the speaker stayed muted on every
Y3506 board even though the hardware path exists.
Changes:
config/archr-dts/rk3326-gameconsole-r36s.dts
Adds three pre-defined sound card variants with status=disabled:
rk817-sound-amplified (external amp gated by GPIO)
rk817-sound-simple (external amp on regulator, no GPIO gate)
rk817-sound-spko-direct (no external amp, SPKO straight to speaker)
The default rk817-sound stays active with the historic amp routing,
so any board the overlay generator cannot positively re-classify
keeps working as it did in v2.0-rc3.
config/mipi-generator/archr-dtbo.py
- Picks one of the three variants based on flags + vendor signals:
NAm flag -> spko-direct (Y3506 family)
spk-con-gpio / spk-ctl-gpios detected -> amplified
SRs flag without GPIO -> simple
otherwise -> keep base DTS default (amp routing)
- Accepts simple-audio-card,hp-det-gpio as a fallback to hp-det-gpio
so V05 boards that use the canonical mainline name are no longer
silently skipped by the audio block.
- Tolerates missing /pinctrl/headphone/hp-det in the vendor DTB
(some boards bind via the codec phandle only).
- Short-circuit branch (odroidgo3 + SDORIG) now still toggles the
sound card variant when NAm is set, so the six Soysauce batches
that go through that early return still get spko-direct.
- Fallback branch when the audio block crashes still applies
spko-direct when NAm is set (covers six Y3506 V03/V04 batches
where the vendor DTB omits hp-det-gpio entirely).
config/mipi-generator/generator.sh
- Appends NAm to every overlay generated under soysauce/, in
stable order with the existing SDORIG and variant flags.
Audit of all 44 vendor DTBs after the change:
18 clones -> default (amp routing preserved)
15 original -> default (amp routing preserved)
11 soysauce -> spko-direct (V03/V04/V05 all classes covered)
Reported by gemstoned via Discord: Soysauce V05 speaker would not
play under v2.0-rc3 even with HPi/SRs overlay flags toggled. Root
cause traced to (a) the variant nodes referenced by archr-dtbo.py
only existing in eeclone.dts and not in r36s.dts, and (b) the
vendor BSP rk817_codec.c hardcoded DAPM that mainline ASoC ignores.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The overlay generator now propagates board-specific hardware that the
previous version dropped on the floor:
- Amux selectors and per-button GPIO pin numbers (varies per subdevice:
clone uses 16/15/11, original 11/8/13, soysauce 13/12/17)
- button-adc tunings (deadzone/fuzz/flat) when vendor differs
- rumble-gpio (R36S V20 2025-05-18, GR36 — fixes "rumble stuck on")
- Panel status LEDs red/green/blue1/blue2 (8 soysauce V04+/V05 boards)
Adds an auto-discovery pass that propagates ANY remaining vendor
property not in our whitelist/blacklist, logging each propagation in
applied.txt so future board variants surface their quirks instead of
silently inheriting the original layout.
Blacklist preserves joypad-name/product/revision (ES gamecontrollerdb
match), per-button linux,code (vendor uses F-keys, ArchR uses standard
BTN_*) and PMIC regulator ranges (our base intentionally has expanded
ranges for the 1512MHz CPU OC).