Add Plantronics/Poly Voyager 8200 UC (BT600) support#536
Open
ggiesen wants to merge 1 commit into
Open
Conversation
15430af to
e1d0c9d
Compare
Adds a device implementation for the Plantronics/Poly Voyager 8200 UC
headset via the BT600 USB dongle (047F:02EE), supporting sidetone,
battery status, lights (the online indicator LED), voice prompts (the
notification tones setting) and volume limiter (the noise exposure
limit).
The dongle speaks Poly's native get/set protocol tunneled over HID report
ID 0x07 in the vendor collection usage-page 0xFFA2 / usage 0x03 on
interface 3. Commands are sent as OUTPUT reports and answered as INPUT
reports on interrupt EP 0x81. The address byte selects the target
(0x00 = dongle, 0x20 = headset; replies carry 0x00 / 0x02):
HELLO (open session): 07 01 01 10 07 <addr> 00 00 01 01 02
HELLO ack: 07 01 01 10 06 <addr> 00 00 08 01 02
GET setting: 07 01 01 10 06 20 00 00 02 <grp> <item>
SET setting: 07 01 01 10 07 20 00 00 05 <grp> <item> <value>
GET reply: 07 01 01 10 <len> 02 00 00 03 <grp> <item> <value>
SET ack: 07 01 01 10 <len> 02 00 00 0a <grp> <item> <value>
The dongle ignores all GETs/SETs until sessions are opened with a 06 01
output report, a HELLO to the dongle (arms the relay to the headset) and
a HELLO to the headset - the same init the Windows stack performs at
device attach. Sessions persist until the dongle loses power or the
headset reboots; the sequence is idempotent and sent before every
operation.
- Sidetone: group 0x04 / item 0x10, 3 levels (0=Low, 1=Med, 2=High)
- Lights: group 0x04 / item 0x09 ("online indicator", 0/1)
- Voice prompts: group 0x04 / item 0x11 ("notification tones", 0/1)
- Volume limiter: group 0x0F / item 0x0E ("noise exposure": 0=none,
1=85 dB, 2=80 dB; mapped to 85 dB on/off, 80 dB left unexposed)
- Battery: group 0x0A / item 0x1A -> value
<level> <level_count> <charging> <minutes:u16be> 01. Percentage is
level / (level_count - 1) * 100 (Poly's own formula, verified live at
70% and 60%); the remaining talk time is reported as time-to-empty.
SETs are verified against the device's "changed" ack. The headset only
answers while it has an active Bluetooth link to the dongle, so read
timeouts are reported as device-offline. macOS support is left disabled:
the dongle exposes five top-level HID collections and macOS opens only
the first enumerated one, which is untested with this device.
Includes unit tests for battery reply parsing and reply matching (using
frames captured from the hardware) plus a registry lookup test, and the
regenerated README supported-devices row.
Derived from USBPcap/usbmon captures of Plantronics Hub and Poly Studio
and validated live against the hardware (headset firmware v2120).
e1d0c9d to
6f6d4b5
Compare
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.
Changes made
Adds support for the Plantronics/Poly Voyager 8200 UC headset via the BT600 USB dongle (
047F:02EE), implementing sidetone, battery status, lights, voice prompts and volume limiter (CAP_SIDETONE | CAP_BATTERY_STATUS | CAP_LIGHTS | CAP_VOICE_PROMPTS | CAP_VOLUME_LIMITER).Protocol. The dongle speaks Poly's native get/set protocol tunneled over HID report ID
0x07in the vendor collection usage-page0xFFA2/ usage0x03on interface 3. Commands are sent as OUTPUT reports (the interface has no interrupt-OUT endpoint, so they go out as SET_REPORT over EP0) and answered as INPUT reports on interrupt EP0x81. 64-byte frames, zero padded:06 01output report, a HELLO addressed to the dongle (this arms the relay to the headset), then a HELLO addressed to the headset. Sessions persist until the dongle loses power or the headset reboots; the sequence is idempotent and is sent before each operation.0x04/ item0x10, 3 discrete levels (0=Low, 1=Medium, 2=High), mapped from the 0-128 input with the existingmapSidetoneToDiscrete<3>().0x04/ item0x09(the headset's "online indicator" LED, 0/1).0x04/ item0x11(the "notification tones" setting, 0/1).0x0F/ item0x0E(the "noise exposure" limit: 0=none, 1=85 dB, 2=80 dB). Mapped to 85 dB on / no limiting off, the same convention as the Lenovo Wireless VoIP implementation; the 80 dB middle value is documented but not exposed since the capability is boolean.0x0A/ item0x1A, value<level> <level_count> <charging> <minutes:u16be> 01. Percentage islevel / (level_count - 1) * 100-- Poly's own formula (its software computeslevel/numLevels*100), verified live against Poly Studio at 70% (level 7) and 60% (level 6). The remaining talk time (minutes) is a separate field reported astime_to_empty_min; it drifts within a level band, so it is not used for the percentage.Platforms. Linux and Windows. The Windows
usagepage/usageidvalues were confirmed against the dongle's HID report descriptor (report0x07lives in the0xFFA2/0x03collection). macOS is left disabled: the dongle exposes five top-level HID collections and macOS opens only the first enumerated one, which I cannot test with this device; it can be enabled later if someone with a Mac confirms it works.How it was derived. Reverse-engineered from USBPcap captures of Plantronics Hub and usbmon captures of Poly Studio, then validated live against the hardware on Linux (headset firmware v2120):
Tests. Unit tests cover the battery reply parser (discharge/charging/clamping/malformed) and reply matching (SET acks, unsolicited events, post-HELLO catalogue fragments) using frames captured from the hardware, plus a registry lookup test.
ctestpasses; built with GCC 13 on Linux.Notes.
Checklist