feat(hid): recognize Lightspeed receiver (046d:c539) as Unifying-compatible - #510
Merged
davidbudnick merged 1 commit intoAug 10, 2026
Merged
Conversation
…atible The Lightspeed gaming receiver answers the same HID++ 1.0 enumeration and pairing-information registers as Unifying receivers, but its PID is not in any known-receiver list, so devices paired through it are never discovered on Linux: the receiver node is skipped after an UnsupportedProtocolVersion ping and the hid-logitech-dj child node is probed directly, timing out on every inventory tick. Add the PID to UNIFYING_PIDS (openlogi-hid) and unifying::VPID_PAIRS (openlogi-hidpp) so the receiver routes as DeviceRoute::Unifying and its pairing slots are walked. Verified on real hardware with a G903 LS.
Greptile SummaryRecognizes Logitech Lightspeed receiver
Confidence Score: 5/5The PR appears safe to merge, with both allowlist changes consistently routing the verified Lightspeed receiver through the existing Unifying-compatible path. The two additions align route selection with receiver detection, and no concrete changed-code-triggered functional or security failure was established.
|
| Filename | Overview |
|---|---|
| crates/openlogi-hid/src/route.rs | Adds the Lightspeed receiver PID to the existing Unifying-compatible routing and child-node filtering list. |
| crates/openlogi-hidpp/src/receiver/unifying.rs | Adds the Logitech Lightspeed VID/PID pair to Unifying receiver detection for pairing-slot enumeration. |
Flowchart
%%{init: {'theme': 'neutral'}}%%
flowchart LR
A[USB receiver 046d:c539] --> B[Inventory identifies known receiver]
B --> C[DeviceRoute::Unifying]
B --> D[Filter direct DJ child-node probing]
C --> E[HID++ receiver detection]
E --> F[Unifying-compatible slot enumeration]
F --> G[Paired Lightspeed device discovered]
Reviews (1): Last reviewed commit: "feat(hid): recognize Lightspeed receiver..." | Re-trigger Greptile
Contributor
|
#459 adds Lightspeed the same way (c53f, c547), so these will conflict in UNIFYING_PIDS / VPID_PAIRS. I've carried c539 over there with a co-author trailer, happy either way round. |
4 tasks
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.
Summary
Devices paired through a Lightspeed gaming receiver (
046d:c539) are currently invisible to OpenLogi on Linux: the receiver PID is not in any known-receiver list, so the inventory watcher probes the receiver node as a direct device (HID++ 1.0 →UnsupportedProtocolVersion→ skipped) and probes thehid-logitech-djper-device child node directly — which, as the comment onis_receiver_child_nodepredicts, times out every tick:The device itself is fine — a manual HID++ 2.0 ping to the child node answers in milliseconds (protocol 4.2). The gap is purely receiver identification.
Lightspeed receivers answer the same HID++ 1.0 registers as Unifying (pairing count, connection state,
0xB5pairing information — this is also how Solaar routes them), so adding the PID to the two Unifying lists is enough for full detection and settings support:Changes
openlogi-hid: add0xc539toUNIFYING_PIDS(route.rs) so the receiver routes asDeviceRoute::Unifyingand its DJ child nodes are filtered out of direct enumeration.openlogi-hidpp: add(0x046d, 0xc539)tounifying::VPID_PAIRS(receiver/unifying.rs) soreceiver::detectwalks the pairing slots.Deliberately minimal scope:
c539is added — the one Lightspeed PID I verified on real hardware. Other Lightspeed PIDs (c53a,c53f,c541,c545,c547, …) likely behave the same (they do in Solaar), but I did not want to add untested IDs. Happy to extend the list if you prefer.Receiver::name(). If you would rather have a distinct Lightspeed label (or a dedicated PID list that shares the Unifying protocol path), I am happy to follow up.Testing
cargo fmt --check,cargo clippy -p openlogi-hid -p openlogi-hidpp --all-targets -- -D warnings, andcargo test -p openlogi-hid -p openlogi-hidpp(245 passed) on this branch (rustc 1.96, Linux x86_64).openlogi listshows the receiver with the G903 LS on slot 1 (online=true wpid=4087,transports=usb+equad), the keyboard still enumerates, and the recurring "node probe keeps failing" warnings are gone. The same two-line change applied to v0.6.22 is running as my daily agent (~15 min soak at time of writing) with no probe-failure warnings.