Repository navigation
Conversation
Discovery tried every registered adapter but treated another model's refusal as an error, so a second adapter could only report "Unsupported device" for the first. Adapters now raise UnsupportedDevice (a ValueError) for targets they do not support; choose() ignores those refusals, reports shared USB errors once and names the supported devices when nothing matches. `orchard devices` lists every adapter's observations, and `orchard mixin` selects its profile from the ADT model or --profile instead of a hidden default. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Move the legacy prelinked-kernelcache SmartIO extractor out of the J71b package into the shared Apple tooling and select the kext by bundle identifier. J71b keeps the AppleT8010SmartIO default unchanged; A9 devices use AppleS8000SmartIO. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Register a J71t (iPad6,11, S8003) host adapter beside J71b. It discovers DFU chip 0x8003 / board 0x10 and "J71t Recovery", and requires the J71tAP board in the captured ADT because iPad6,11 also ships as J71s (S8000). Firmware inputs follow the hardware recipe: Wi-Fi and Bluetooth files from the iPadOS 16.7.10 IPSW, S8000 SmartIO firmware from its kernelcache, and the unmodified N1 touch boot packet from J71t.mtprops. The "j71t-adt" generator copies the unit's touch, ambient-light, charger and Bluetooth address records from the fresh recovery ADT, rejecting unresolved or blank records, and stages them with receipts for the data-only mixin. Tests use synthetic ADT, packet and kernelcache fixtures only. An optional check reproduces the pinned derived hashes from a developer's own 20H350 files when ORCHARD_TEST_LOCAL_J71T is set. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
List the supported devices and their profiles in the README, note that both registered adapters are statically checked against the contract, and credit the J71t touch and calibration preparation sources. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The J71t kernel now carries the VXD stateless H.264 decoder. Its DEVA firmware ships inside the AppleD5500 kext of the pinned iPadOS kernelcache, found by its pointer record in __DATA.__data. apple/d5500.py copies the image unchanged; the hardware recipe pins it as vxd-deva.bin. The kext lookup SmartIO already used moves to apple/prelink.py and is shared; SmartIO behavior and messages are unchanged. The kernelcache is extracted once for both inputs. NOTICE names the public omarchy-ipad5 port as the source of the J71t touch, calibration and record layout code. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Update: J71t charging is validated; no change needed in this PR The charging fix is kernel-only. It is a new patch in OrchardLinux/orchard#6 (commit The CLI is unaffected:
With the updated hardware wheel installed, the tests still pass: 153 OK and 1 skipped (local inputs only), with mypy clean. Computers and USB-C chargers now charge at up to 2.4 A on the iPad 5 (validated 2026-10-27 through the omarchy-ipad5 port's boot path). |
|
Thank you, Berkay. The shared parts of this PR are merged on |
Depends on the hardware PR (it needs a hardware wheel with
devices/j71t).Summary
UnsupportedDevice(aValueErrorsubclass incontracts.py) when the connected target is a different model.choose()skips those refusals, reports shared USB errors once and refusesif two adapters claim a target.
now raises the refusal for other chips/boards and for a foreign recovery
product string; its own errors are unchanged.
docs/adapter-contract.mddocuments the rule.orchard devicesmerges every adapter's observations.orchard mixinpicks the profile from the ADTmodel(matched against thehardware descriptors), or takes
--profile.resolve --profilestill defaults toj71bbut accepts only registeredprofiles.
apple/smartio.py. It takes the kext bundleas a parameter, and J71b's default is unchanged.
apple/d5500.pycopies the VXD (DEVA) image outof the AppleD5500 kext in the pinned kernelcache. The kext has no
__firmwaresection, so the image is found through its pointer record in__DATA.__data(name, build, sizes, image pointer), not by offsets. Theprelinked-kext lookup that SmartIO used moved to
apple/prelink.pyand isshared; SmartIO's behaviour and messages are unchanged. The kernelcache is
extracted once for both.
orchard_cli.j71t(adapter, config, inputs, prepare, mixin):touch.py: validates the N1 boot packet fromJ71t.mtprops(C1F15,1,header/length/checksums) and returns it unmodified. J71t needs no Z2FW
wrapper.
calibration.py: thej71t-adtgenerator. It copiesmulti-touch-calibration(1024 B),
alsCalibration,usb-input-limit-calibrationand the Bluetoothlocal-mac-addressfrom the fresh recovery ADT, and rejects unresolvedsyscfg/placeholders, blank, wrong-size and non-unicast values.inputs.pyderives four inputs: the Bluetooth patchram, SmartIO, the N1packet and
vxd-deva.bin.capture_adtrequiresiPad6,11andJ71tAP. iPad6,11 also ships as J71s(S8000), which discovery refuses (chip
0x8000). The J71t unit we testreports CPID
0x8003and BDID0x10in DFU.pyproject, mypy andtypecheck_adapter.py(J71T: Adapter)updated; README and NOTICE too.
Testing done
python -m unittest discover -s testswith the hardware andCLI wheels installed: 153 tests OK on Python 3.12 and 3.9 (136 before). One
skipped test runs only with
ORCHARD_TEST_LOCAL_J71T. A synthetickernelcache test covers the VXD record lookup, including no record, two
records and a missing kext.
uv tool run --from 'mypy==1.18.2' mypy --config-file pyproject.tomlreports no issues.
ORCHARD_TEST_LOCAL_J71Tpointing at files fromthe same 20H350 build (its kernelcache,
BlueTool,J71t.mtprops), thelocal test reproduces the recipe pins for
s8000-smartio.bin,vxd-deva.bin,BCM4355C0-FearA-USI.hcdandj71t-n1.bin.byte for byte, the calibration files the same drivers use on that unit in
the omarchy-ipad5 port. The
outputs were discarded; no device data is in the repository.
Not tested
inputs.ensure()against a real IPSW download (mocked in tests).mixin on a J71t. The kernel drivers themselves passed 13 of 13 device checks
through the omarchy-ipad5 port's own boot path.
How to test
python -m unittest discover -s testsand the mypy command above.orchard devices, then boot recovery and runorchard capture-adt,orchard mixin --adt … --firmware-dir … --output …and
orchard prepare --recovery ….Credits
AppleD5500 firmware record layout come from the
omarchy-ipad5 iPad 5 port,
which builds on Paul Praschl's (Pauli1Go) HoolockLinux A10 work and
HoolockLinux.
🤖 Generated with Claude Code