feat(redragon): add the M690 PRO driver (SinoWealth 258a:002e/002f) - #163
Merged
Merged
Conversation
hypn
marked this pull request as ready for review
October 5, 2026 15:18
The only conflict was the SupportedClient union: main added SteelSeriesAerox3WirelessHidClient in the same hunk. Resolution keeps main's list and inserts RedragonM690ProHidClient after RedragonHidClient. tsc clean; 63 focused redragon + registry tests pass.
|
🎉 This PR is included in version 0.25.0 🎉 The release is available on: Your semantic-release bot 📦🚀 |
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
Adds a driver for the Redragon M690 PRO (
258a:002ecable,258a:002f2.4 GHz receiver): DPI stages, polling rate, lighting and button remapping, over both paths. It is a SinoWealth design, unrelated to the Holtek protocol of the existing Redragon M612/M724 driver, so it gets its own client beside it and shares the@openmouse/protocol/redragonentry point. Verified on three units; one browser limitation (battery and link status need OpenMouse Bridge) is explained below.Device
0x258a:0x002e(USB cable),0x258a:0x002f(2.4 GHz receiver)usagePage 0xFF00, usage 0x0001on interfaceMI_0105 <cmd> 00 ..); short answers such as identity, battery and link come back on report 5, the settings and button blocks on report 8 (519 bytes)What this adds
src/redragon/m690-pro.ts(re-exported fromsrc/redragon/index.ts): the pure codec.[3] = length - 8, the vendor'sa5trailer on the button block).src/redragon/keys.ts: the keyboard key, modifier and shortcut tables the M612 already used, moved unchanged out ofsrc/redragon/index.tsso both Redragon drivers share them, plus the numpad keys the M690 PRO's app offers. Internal, not a new export; the M612 tests pass unchanged.src/drivers/redragon/m690-pro-hid.ts:RedragonM690ProHidClient.258a:002e/002fwith the0xFF00collection carrying reports 5 and 8, then refuses any device whose settings block is not the M690 PRO's (258a:002fis a generic SinoWealth receiver id).settingsReady: falseand a status note) instead of throwing; the next refresh retries, and setters refuse meanwhile.0x80) where it can and refuses writes while the mouse is off, as the vendor app does. Where it cannot (plain Chrome, below), the status line warns that changes made while the mouse is off are undone when it reconnects.src/drivers/registry.ts,src/drivers/vendors.ts: registration (VENDOR_ID.redragonM690Pro,REDRAGON_M690_PRO_HID_FILTERS).0x258ais shared with the Glorious classic line, which claims other product ids.src/drivers/redragon/m690-pro.test.ts: codec tests that re-encode the vendor app's captured writes byte for byte, plus fake-device tests (both paths, receiver bank, mouse off, a browser-like transport whose report-5 reads fail, a non-M690 settings block, lighting mode changes, the last-left-click guard, read retries).captures/redragon-m690-pro/: text exports of the vendor-channel traffic (23 files, about 40 KB, including Chrome's refused reads and OpenMouse sessions) with a README.docs/redragon-m690-pro-testing.md: framing, settings and button maps, evidence for each field, and the hardware checklist.Battery and connection status need OpenMouse Bridge
In plain Chrome the driver can read and change every setting, but it cannot read the battery level, the charging state or whether the mouse is awake: the mouse rejects the way Chrome asks for those short answers. Through OpenMouse Bridge all of them work.
The details: the vendor app reads short answers (identify
0x01, receiver link0x80, battery0x90) withGET_REPORT(Feature 5, wLength 8). Chrome sends every feature read with the device's largest feature length (520), and this firmware STALLs any report-5 read that is not exactly 8 bytes (USBPcap of Chrome on Windows:captures/redragon-m690-pro/chrome-report5-stall.hex). Chrome on macOS behaves the same, and also needs Input Monitoring permission to open the device, because it shares its interface with a keyboard collection.Pages cannot choose the read length, so the driver:
0x13and thea5end marker, in every captured block);Through OpenMouse Bridge, which reads each feature report at its own length, battery and the link check work with the driver unchanged (verified through the receiver).
Features supported
Keys Ctrl+Shift+R); macro slots show asMacro nand are never written.Evidence & protocol discovery
captures/redragon-m690-pro/.Cfg.ini(VID/PIDs, sensor, theDPISETlist, button-slot table, factory DPI colours) andText/en/text.xml(effect and action names).driver-sinowealth.c(MIT) for the framing this matches (report 8 here instead of its 4/6). Where they differ the captures win: libratbag's "profile 2" commands0x21/0x22are this mouse's receiver bank, and its0x31is the app's macro read.Verified on hardware
Three units (mouse firmware 2.95 and 2.97, receiver 6.05), with the OpenMouse dev build against the local package in Chrome 154 on Windows and USBPcap recording the wire; read-only on Chrome for macOS.
002eover the cable on both firmware revisions;002fthrough the receiverOpenMouse's built-in hardware test passed on all four paths (
captures/redragon-m690-pro/openmouse-hardware-test-{wired,wireless,bridge-wired,bridge-wireless}.json): identity, DPI, polling, DPI stages and the wireless link read back; 800 DPI / 1000 Hz written, read back and restored; battery (99 %, receiver) and charging status (cable) through Bridge.Not settled
Safety
0x75as a DFU entry on this family; it is never used).Not supported
Macro n).The testing notes document each of these.
Companion PR
Pending, but see hypn/openmouse/feat/redragon-m690-pro