Skip to content

Build Omarchy A for iPad 5 Wi-Fi (J71t) beside J71b - #4

Closed
brkosebay wants to merge 10 commits into
OrchardLinux:mainfrom
brkosebay:j71t-support
Closed

brkosebay wants to merge 10 commits into
OrchardLinux:mainfrom
brkosebay:j71t-support

Conversation

@brkosebay

@brkosebay brkosebay commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

iPad 5 (J71t) port: three PRs, in release order

  1. Add iPad 5 Wi-Fi (J71t) hardware support orchard#6: kernel series, device data, firmware recipe, recovery and runtime
  2. Add the iPad 5 Wi-Fi (J71t) adapter and multi-adapter discovery cli#2: J71t adapter and multi-adapter discovery
  3. Build Omarchy A for iPad 5 Wi-Fi (J71t) beside J71b #4: J71t image and release

Kernel source: brkosebay/linux a9/orchard-j71t · Project: brkosebay/omarchy-ipad5

Depends on the hardware PR (j71t-components.tar.gz) and a CLI release with
the J71t adapter.

Summary

  • Multi-device release metadata. release/manifests.py takes the device,
    and release/merge.py pins several per-device manifests in one
    index.toml, sorted, and refuses duplicates. J71b's manifest and index text
    are unchanged (a test checks this).
  • Device as a parameter. Root, recovery and audit assembly read
    per-device facts from release/devices.py.
    • J71b keeps its artefact names.
    • J71t files are prefixed (j71t-rootfs.tar.zst, j71t-recovery.bin, …),
      so one release can carry both. The branded pongo.bin is shared.
  • image/j71t/: image policy and permissions. Helper
    j71t-check-platform; no charge lease, because J71t charging policy is in
    the kernel.
  • system/j71t/: package list (the J71b desktop userspace) and an
    overlay:
    • platform-ready gate and getty drop-in;
    • backlight permissions for 20e200000.backlight;
    • USB networking and the tablet network polkit rule;
    • battery poll interval through tmpfiles.d (the J71t gauge driver is
      built in).
    • It reuses J71b's device-independent session files through an explicit
      list (suspend stays disabled, as on J71b).
    • It does not carry the separate omarchy-ipad5 Hyprland tablet layer:
      gestures and the on-screen keyboard are Hyprland-specific, and
      auto-rotate needs the AOP driver, which this port does not ship yet.
  • Screen toggle selects the built-in panel backlight by name.
  • Loader. boot/build-loader --device defaults to j71b. The splash
    patch is device-independent and applies on top of the J71t m1n1 patches.
  • CI. ci/dependencies and build.yml build additional devices listed in
    a new extra_devices input, empty by default. J71b jobs, steps and
    artefacts keep their names.
  • J71t kernel features (from the hardware PR): native display (KMS, panel
    eDP-1) and the H.264 decoder. No image change is needed for them: the
    firmware mixin carries vxd-deva.bin like any other recipe file, the
    shell's brightness control already uses /sys/class/backlight (the display
    driver adds no backlight device), and nothing here assumes simpledrm. The
    decoder's firmware starts only on request, through debugfs.
  • Docs. The README "Supported devices" table gains iPad 5 Wi-Fi.
    docs/devices.md is a per-feature matrix for J71b and J71t; the J71b column
    states only what this repository's code and docs show, with sources. J71t:
    • Works: Wi-Fi, Bluetooth, touch, display (1536×2048), brightness, audio
      out, microphones, battery, USB gadget.
    • Partial: charging (computers charge at up to 2.4 A, verified on the
      device; wall and USB-C chargers do not charge correctly with this kernel,
      the input stays at the 500 mA floor and the battery drains with the screen
      on; a fix will follow as a separate change after device validation),
      video decode, NVMe install, the Lightning camera adapter.
    • Not yet: accelerometer/auto-rotate, suspend, cameras, GPU.

Testing done

  • Unit tests. python -m unittest discover -s tests on Python 3.12 and
    3.9 with the hardware and CLI wheels from the companion PRs installed: 72
    tests.
    • The only failures are the 3 in tests/test_host_bootstrap.py that also
      fail on main (upstream HEAD mismatch).
    • 2 skipped: the existing skip, and the ci/dependencies bundle test, which
      needs GNU sha256sum --strict and passes in a Linux container.
    • New tests/test_j71t_layer.py covers the J71t layer.
  • Splash patch. It applies on m1n1 d5a10ac52a together with the J71t m1n1
    patches and the hardware quiet patch.

Not tested

  • Orchard flow on a J71t. The Orchard recovery, install and handoff path
    has not yet run on a J71t. The same kernel drivers passed 13 of 13 device
    checks through the omarchy-ipad5
    port's own boot path; the J71t column's footnote says so.
  • Builds. No J71t Arch rootfs, desktop smoke test or full release build
    has run. No J71t components are published yet, and the CI extra-device path
    has never executed.
  • Launcher. orchard launch is not available for J71t until a J71t shared
    launcher exists (see the hardware PR).

How to test

  1. Install published hardware and CLI wheels, then run
    python -m unittest discover -s tests.
  2. With extra_devices=j71t and a hardware release containing
    j71t-components.tar.gz, run the workflow, or follow BUILD.md with
    release.j71t.build.
  3. Device: orchard install omarchy-a with a local index for a J71t whose
    Linux-data partition is unformatted or has room for /omarchy.

Credits

  • Hardware. The J71t hardware support comes from the
    omarchy-ipad5 iPad 5 port
    (kernel source:
    brkosebay/linux a9/orchard-j71t),
    which builds on Paul Praschl's (Pauli1Go) HoolockLinux A10 work and
    HoolockLinux.
  • Desktop and release design. The J71b image and release design is reused
    as the reference.

🤖 Generated with Claude Code

brkosebay and others added 9 commits October 27, 2026 16:34
The installation manifest writer takes the device profile; J71b keeps its
manifest, asset and index bytes. Later devices prefix their device-specific
files (root, recovery) so separately built device releases can be merged
into one directory and published together; the branded Pongo is shared.
release.merge combines device releases, refusing any differing file name
before copying, and rewrites one index that pins each device once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The power-key toggle opened the J71b DWI backlight by a fixed path. It now
accepts exactly one of the known iPad DWI panel backlights (J71b
20e200080, J71t 20e200000) and refuses none or several, so the shared
helper serves both devices. J71b selection is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Root, recovery, audit and desktop-smoke code take the device profile
instead of hard-coding J71b; J71b remains the default and produces the
same files, names and receipts. Per-device facts (platform helpers,
enabled units, panel backlight, asset prefix) live in release.devices.

The shared code stays in release/j71b rather than moving: J71b is the
reference port and its module paths are imported by tests and desktop
tooling. Devices other than J71b reuse the J71b layer's
device-independent session files through an explicit list and supply
their own system overlay. The hardware runtime and recovery producer
receive a profile only for non-J71b devices, so J71b still builds
against hardware releases that predate multi-device support.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
iPad 5 Wi-Fi (J71t) installs the same Omarchy A desktop as J71b. Its image
policy requires j71t-check-platform and no charging lease: the J71t
charger policy runs in the kernel. The permission verifier is J71b's,
byte for byte (checked by a test).

The system layer adds only J71t facts: platform gate service and getty
dependency, panel backlight 20e200000 permissions, unmanaged USB
diagnostics interface, battery uevent rate and the tablet network rule.
Session files come from the J71b layer through release.devices. Suspend
stays disabled, as on J71b. The userspace recipe is J71b's with a J71t
package list (currently the same packages).

release.j71t.{build,audit,smoke_desktop} run the shared assembly with
the j71t profile.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
build-loader takes --device (default j71b) and passes it to the hardware
m1n1 producer. The Omarchy splash only draws into m1n1's boot framebuffer,
so J71t applies the J71b splash patch unchanged instead of a copy: it
applies cleanly on m1n1 d5a10ac52a with the J71t loader patches.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ci/dependencies takes DEVICE (default j71b) and a --components-only mode;
other devices' component bundles extract to out/DEVICE. The workflow's
extra_devices input (empty by default) builds each listed device's
loader and base root beside J71b's, assembles and audits its release,
merges it into the J71b release and checks every device with orchard
resolve before the single publish/attest step. J71b steps, jobs and
artifact names are unchanged.

j71t stays out of the default until a hardware release ships
j71t-components.tar.gz; add it together with the hardware_tag default.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add J71t to the supported-devices table and a per-feature matrix in
docs/devices.md. J71t statuses come from device tests of the same
drivers in the omarchy-ipad5 port on one iPad6,11; features excluded from the J71t
kernel (AOP accelerometer, GPU, video decoder, Secure Enclave) say so,
and the Orchard install path is marked untested on J71t. J71b entries
cite only Orchard's own code and documentation; the rest are left for
the maintainer to confirm. BUILD.md shows per-device assembly and the
release merge.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The J71t kernel builds the bq27xxx gauge driver in, so a modprobe.d
option never applies. Write the same 10-second poll interval to the
module parameter through tmpfiles.d instead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The J71t kernel now drives the display natively (ADBE KMS, panel eDP-1)
and ships the VXD H.264 decoder with its firmware from the IPSW. Display
and brightness move to Works and video decode to Partial. The charging
row states what was verified: computers charge at up to 2.4 A; wall and
USB-C chargers do not charge correctly with this kernel, and a fix will
follow as a separate change after device validation. The battery row
notes that the gauge can report Full while discharging at 100 %. The AOP
accelerometer stays out; the row now says why.

The footnote and the J71t system README name the public omarchy-ipad5
port and the a9/orchard-j71t kernel branch as the source of the J71t
statuses.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With kernel patch 0013 (OrchardLinux/hardware), computers and USB-C
chargers charge the iPad 5 at up to 2.4 A, the board maximum, as verified
on the device on 2026-10-27. Charging is 5 V only; the iPad 5 has no USB
Power Delivery. The battery row drops the note about Full while
discharging, which the same update fixes, and the footnote records the
charging verification date.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@brkosebay

Copy link
Copy Markdown
Contributor Author

Update: J71t charging now Works (one new commit, nothing rewritten)

The new commit changes only docs/devices.md:

  • Charging: Works. Computers (USB-A, and a Mac USB-C port through Apple's USB-C to Lightning cable), USB-C wall chargers and a Mac USB-C power adapter charge at up to 2.4 A, the board maximum. This was verified on the device on 2026-10-27. Charging is 5 V only: the iPad 5 has no USB Power Delivery.
  • Battery: the status reads Discharging whenever current flows out, also at 100 %.
  • Footnote: dated for the charging verification.

The kernel change is patch 0013 in OrchardLinux/orchard#6 (commit 0dd7ae0 on a9/orchard-j71t). No image change is needed: the J71t layer does not read charger internals.

Unit tests: 72 run; the only failures are the same 3 test_host_bootstrap tests that fail on main. The Orchard install path on a J71t has still not run; statuses come from the omarchy-ipad5 port's device tests of the same drivers.

@henrikklee

Copy link
Copy Markdown
Contributor

Thank you, Berkay. The release is device-generic now, so the per-device build isn't needed. Your screen-toggle fix and the 10 s battery poll apply to every device and are merged on main with your authorship (81e6941, 1f02264); the polkit rule was already there. main also pins the cli with the iPad 5 recipe steps, so a fresh clone of it is the test workspace (setup in docs/integration/j71t.md on the hardware branch feature/j71t-integration). Closing this one as merged that way.

@henrikklee henrikklee closed this Oct 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants