Add Lamzu Inca 8K under Lamzu's own vendor id 0x37b0 - #45
Draft
bpavlina wants to merge 1 commit into
Draft
Conversation
The Inca enumerates under vendor id 0x37b0, not the shared CompX ODM id 0x373e that every earlier Lamzu, CRDRAKO, and Attack Shark product uses, so it was invisible to the driver. It answers the existing CompX framing unchanged, so this is a catalog and discovery change rather than a new protocol: only the product lookup needed splitting per vendor id. Confirmed on hardware (Windows 11, hidapi) in both connection modes: - 0x0009, the mouse on its cable - 0x0010, the 8K receiver Both answer on MI_02 (usage page 0xffff, usage 0x0000), report id 0, a 65-byte feature buffer, and both address the mouse as target 0x02, so neither needs a mouseTarget override. Every existing CompX decoder produces a correct value with no new cases: firmware 0.18, battery 100%, five DPI stages read unscaled as big-endian, lift-off 0x01 -> Medium, sleep 60 s. The two connections run different polling-rate families, which the capture shows directly: LAMZU_POLLING_RATES encodes 1000 Hz twice, 0x01 in the 125-1000 family and 0x10 in the 1000-8000 family, and the cable answered 0x01 where the 8K receiver answered 0x40. Wired is therefore RATES_1K and the 8K receiver RATES_8K. 0x000f, the 1K receiver this model can also ship with, is taken from Lamzu's own configurator device table and has not been exercised on hardware. That table also names 0x000a and 0x0002 as the mouse and dongle DFU bootloader identities; they never speak this protocol and are excluded on purpose, with a test to keep them out. The WebHID filter is narrowed to usage page 0xffff, which keeps the mouse, consumer, system and keyboard collections out of the picker on a platform that exposes a device's interfaces separately. A WebHID enumeration of both connections settles the one collection that narrowing cannot exclude: MI_01's 0xffff/0x0001 declares no feature reports at all, while only 0xffff/0x0000 declares report 0, so the driver's feature-report-0 check rejects it rather than offering a dead entry. On Chrome/Windows the point is moot anyway — all seven collections arrive on a single HIDDevice, so each connection is one picker entry however the filter is written. Writes are entirely uncaptured. The inherited setters are unproven on an Inca, so this should be treated as read-only support. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018C96pMdnhGcXhLQhHYkLWc
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Model: Lamzu Inca 8K
Vendor id:
0x37b0— Lamzu's own, not the shared CompX ODM id0x373ethat every existing Lamzu / CRDRAKO / Attack Shark product in this repo enumerates under. Because the same product id means different hardware depending on which vendor id it arrived under, the product lookup has to split per vendor id. Lamzu's configurator confirms both ids are live (DeviceInitFilterVID=373E;37B0).Product ids:
0x00090x00100x000f0x000a0x0002Verified on real hardware (Windows 11, hidapi), both connection modes:
0xffff, usage0x0000, report id 0, 65-byte feature buffer (report id + 64-byte packet). It accepts no other buffer size.0x02, so nomouseTargetoverride is needed.0xa1OK status as the Maya X and KO-ONE. This is a catalog and discovery change, not a new protocol.0x01→ Medium, sleep 60 s, debounce 0 ms.LAMZU_POLLING_RATESencodes 1000 Hz twice:0x01in the 125–1000 family and0x10in the 1000–8000 family. The cable answered0x01and the 8K receiver answered0x40, so the two connections genuinely run different families —RATES_1Kwired,RATES_8Kon the 8K receiver.Explicitly NOT verified:
0x000f, the 1K receiver this model can also ship with, comes from the vendor's configurator device table only — nobody has held that dongle. The protocol is the receiver protocol either way, so the risk is a wrong rate list rather than a dead device.Discovery note: the WebHID filter is narrowed to usage page
0xffff, which keeps the mouse, consumer, system and keyboard collections out of the picker on a platform that exposes a device's interfaces separately. A WebHID enumeration of both connections settles the one collection that narrowing cannot exclude: MI_01's0xffff/0x0001declares no feature reports at all, while only0xffff/0x0000declares report 0 — so the driver's feature-report-0 check rejects it rather than offering a dead entry. On Chrome/Windows all seven collections arrive on a singleHIDDeviceanyway, so each connection is a single picker entry however the filter is written.Evidence: capture notes are in
docs/lamzu-inca-testing.md— reads only, no setting was changed while capturing, serials redacted. No vendor binary or vendor source is included; the vendor configurator's device table is cited only as the stated provenance for the two ids that could not be checked on hardware.Status of the branch:
npm run checkpasses, 833/833 tests. The OpenMouse cross-build passes too —tsc --noEmit && vite buildclean and 112/112 tests against the local package, on thecontrol-panelbranch.Matching OpenMouse change:
src/supported-mice.tscurrently carries the Inca asstatus: "quickwin"with the note "Inca PID not yet in driver", which this makes stale. That change is open as OpenMouse-Project/openmouse#157. It marks the row"pr"rather than"supported"on purpose: thePID_UNIVERSEcheck insupported-mice.test.tsimports from@openmouse/protocol, so pinning the Inca PIDs assupportedcannot compile until this lands. The row flips tosupportedin a one-line follow-up afterwards.Pre-review checklist (CONTRIBUTING):
npm run checkpasses in this repository — 833/833.npm install --no-save --package-lock=false ../mouse-protocoloncontrol-panel):tsc --noEmit && vite buildclean, 112/112.LAMZU_INCA_VENDOR_ID,LAMZU_INCA_PRODUCTS,LAMZU_VENDOR_IDSandlamzuProduct()all reach@openmouse/protocol/lamzu, which is already inpackage.jsonexportsandtsconfig.jsonpaths.dist/is untracked; the capture doc has its serials redacted.VENDOR_ID.lamzuIncais picked up byregistry.test.tsautomatically, and0xffffwas already in itsUSAGE_PAGES.Left as a draft deliberately: this is read-only support and every setter the driver inherits is unproven on an Inca. Happy to narrow it further — dropping
0x000funtil someone has the 1K dongle is a one-line change if you would rather not carry a vendor-sourced rate list.