Skip to content

Add MCHOSE X9 Wireless (battery status) - #563

Open
Venjer wants to merge 1 commit into
Sapd:masterfrom
Venjer:add-mchose-x9
Open

Add MCHOSE X9 Wireless (battery status)#563
Venjer wants to merge 1 commit into
Sapd:masterfrom
Venjer:add-mchose-x9

Conversation

@Venjer

@Venjer Venjer commented Aug 18, 2026

Copy link
Copy Markdown

Changes made

Adds battery status support for the MCHOSE X9 Wireless Gaming Headset (2.4GHz dongle, VID 0x3837 / PID 0x6045, C-Media chipset).

Protocol reverse-engineered from a USB capture (Wireshark + USBPcap) of the official "M HUB" Windows app, and verified against the percentage that app displayed across multiple sessions and battery levels (20%, 50%, 60%).

Battery is queried on the vendor-defined HID collection (usage page 0xff90), which answers a 55 65 01 00 ... request with 55 65 <value> <field> .... The dongle also pushes other unsolicited reports in the same shape during normal operation (a heartbeat, and other field ids carrying telemetry that hasn't been identified) — only field id 0x02 is read as the battery percentage, everything else is ignored to avoid misreading it as a spurious 0%.

getSupportedPlatforms() excludes macOS: the dongle exposes six top-level HID collections on one physical USB interface, and on non-Windows platforms get_hid_path() doesn't match by usage page, so it falls back to the first enumerated one, which may not carry report 0x55. Same shape of issue as PlantronicsBT600 in this codebase, same fix. Windows and Linux were reachable for testing (Windows verified on hardware; Linux only by code inspection of get_hid_path(), where it opens the whole HID interface as a single node rather than splitting by top-level collection, so the report id alone should disambiguate — no Linux machine available to confirm).

Charging status isn't reported: plugging the headset in for a charge drops it out of 2.4GHz entirely (M HUB's own UI says as much — it stops working while the cable is in), so there's nothing to read over this dongle while charging.

Checklist

  • I adjusted the README
  • Not a new capability/feature — uses the existing CAP_BATTERY_STATUS

Battery status support for the MCHOSE X9 Wireless Gaming Headset
(2.4GHz dongle, VID 0x3837 / PID 0x6045, C-Media chipset).

Protocol reverse-engineered from a USB capture (Wireshark + USBPcap)
of the official M HUB Windows app, verified against the percentage
it displayed across multiple sessions and battery levels.
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