Skip to content

feat(keychron): add M6 wired and receiver support - #33

Open
ydw1904 wants to merge 1 commit into
OpenMouse-Project:mainfrom
ydw1904:codex/keychron-m6
Open

feat(keychron): add M6 wired and receiver support#33
ydw1904 wants to merge 1 commit into
OpenMouse-Project:mainfrom
ydw1904:codex/keychron-m6

Conversation

@ydw1904

@ydw1904 ydw1904 commented Aug 23, 2026

Copy link
Copy Markdown

Summary

  • Adds a dedicated Keychron M6 WebHID driver for wired USB (3434:d060) and the paired 2.4 GHz Keychron Link-KM receiver (3434:d029).
  • Limits receiver support to its verified ffc1:01 control collection, so the existing Nape Pro raw-HID receiver path remains separate.
  • Supports status reads plus DPI and polling-rate writes with read-back verification.

Scope

Hardware validation

  • Verified a physical Keychron M6 in wired USB mode and through the Link-KM 2.4 GHz receiver.
  • Both paths use status b3/b4 and settings b5/b6 reports on ffc1:01.
  • On each path, DPI stage 0 changed 400 -> 1200 -> 400 and read back after each step.
  • On each path, polling changed 500 Hz -> 1000 Hz -> 500 Hz and read back after each step.
  • The mouse finished each test at its original 400 DPI and 500 Hz settings.

Tests

  • TypeScript build passes.
  • Full suite: 525 passing tests.
  • Package contents were inspected after the build. The repository's npm check wrapper could not run because this environment does not provide npm; its build and test steps were run directly.

Assisted by Codex.

@ydw1904
ydw1904 force-pushed the codex/keychron-m6 branch 2 times, most recently from b08a43c to 201cd48 Compare August 23, 2026 08:49
@ydw1904 ydw1904 changed the title feat(keychron): add M6 wired support feat(keychron): add M6 wired and receiver support Aug 23, 2026
@ydw1904
ydw1904 marked this pull request as ready for review August 23, 2026 08:54
@ydw1904

ydw1904 commented Aug 25, 2026

Copy link
Copy Markdown
Author

Companion PR in the web app: OpenMouse-Project/openmouse#128 (draft, blocked on this one).

Worth flagging because this PR alone does not make the M6 usable. KeychronM6HidClient is detected fine — the registry auto-detects it from the report descriptor — but the app's pulsarClient() in src/device/controller.ts is a negative check: any active client not listed in DEDICATED is assumed to be Pulsar and routed into showPulsarExplorer(), which calls the Pulsar-only describeCollections(). The device lists in the sidebar as "Keychron · Available" and activation fails with client.describeCollections is not a function.

#128 adds one entry to NEEDS_OPEN to fix it. It is a draft only because it imports @openmouse/protocol/drivers/keychron/m6-hid, so its type check cannot pass until this merges and the protocol pin moves.

Verified on wired hardware with both PRs applied: connects, reports 800 DPI / 500 Hz / battery, and a DPI change flashes and reads back.

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.

1 participant