Skip to content

feat(fater): read-only driver for the MCR-9000B (Holtek 04d9:a09f) - #157

Merged
snekxs merged 1 commit into
OpenMouse-Project:mainfrom
ydw1904:feat/fater-mcr-9000b
Oct 3, 2026
Merged

snekxs merged 1 commit into
OpenMouse-Project:mainfrom
ydw1904:feat/fater-mcr-9000b

Conversation

@ydw1904

@ydw1904 ydw1904 commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

For OpenMouse-Project/openmouse#394. App wiring: OpenMouse-Project/openmouse#498 (draft). Catalog: OpenMouse-Project/openmouse-landing-page#26.

What the mouse is

A Holtek "E-Signal" OEM design. Its vendor interface (usage page 0xFF00, usage 0xFF00) declares one 8-byte unnumbered feature report and one 32-byte output report, no input report. That is the shape of the Holtek OEM frame that hv-ms735-config drives on the HAVIT MS735 (04d9:a100; the issue's claim that it shares the PID is wrong) and that the HP G360 vendor tool uses: command byte, bit 7 = GET, byte 7 = 0xFF minus the sum of bytes 0..6, reply echoes the command with the value at offset 2.

What this adds

  • src/fater/index.ts: constants, faterEncodeCommand/faterEncodeGet, faterDecodeReply/faterDecodeValue, divider to Hz conversion, with tests against the byte frames hv-ms735-config puts on the wire.
  • src/drivers/fater/hid.ts: read-only FaterHidClient. Reads the polling divider (0x83) and active profile (0x84); falls back to identity with valuesVerified: false when the mouse does not echo. settingsReady: false, getDpiOptions() returns [].
  • Registry entry, SUPPORTED_HID_FILTERS entry per PID, "Fater" in the brand union, ./fater subpath export, docs/fater-mcr-9000b.md with the sources and open questions.

What is deliberately missing

  • Writes. Same frame without the GET bit, but nothing here has been seen on this mouse yet, so the first hardware test only has to prove the two reads echo.
  • DPI. On the MS735 it sits in a 128-byte config page read over interrupt IN; the MCR-9000B declares no input report, so WebHID on Windows never delivers it, and the manual's 12400 ceiling does not fit the MS735's (byte + 1) * 100 encoding anyway. Needs a USBPcap capture of the vendor app (461 MB zip, not inspected).

Verification

npm run build clean, npm test: 1977 pass, 0 fail (registry probe matrix included). Not tested on hardware; the reporter offered to test.

Requested in OpenMouse-Project/openmouse#394. The mouse is a Holtek
"E-Signal" OEM design whose vendor interface declares the 8-byte feature
report plus 32-byte output report that hv-ms735-config drives on the HAVIT
MS735 (04d9:a100) and that the HP G360 tool uses: command byte, GET bit 7,
0xFF-minus-sum checksum.

No capture of this mouse exists, so the driver only reads the polling
divider and active profile, falls back to identity when the mouse does not
echo, and leaves DPI (a 128-byte config page WebHID cannot read on Windows)
for a capture. Writes are the same frame without the GET bit and follow
once the read round-trips on hardware.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@snekxs
snekxs merged commit dc62e05 into OpenMouse-Project:main Oct 3, 2026
5 checks passed
@github-actions

github-actions Bot commented Oct 3, 2026

Copy link
Copy Markdown

🎉 This PR is included in version 0.23.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants