XMOS EQ HID Communication Protocol Specification¶
Protocol Overview ¶
Functional Positioning and Scope
This document provides a detailed description of the communication protocol between XMOS EQ HID devices and PC-side GUI software. The protocol offers a complete feature set for EQ mode control, parameter configuration, and device information retrieval.
I. Protocol Basic Specifications ¶
1.1 Underlying Communication Protocol¶
Based on USB HID (Human Interface Device) Protocol
| Parameter | Value |
|---|---|
| Transmission Method | USB HID |
| Packet Size | 64 bytes (including 1-byte Report ID 0x01) |
| Effective Data | 63 bytes |
| Byte Order | Little Endian |
| Sync Header | 0x77 (fixed first byte) |
1.2 HID Device Identification¶
| Parameter | Value | Description |
|---|---|---|
| Usage Page | 0xff82 or 0xff83 | HID device type identifier |
| Report ID | 0x01 | First byte when sending |
| Transmission Mode | Non-blocking mode | Prevent GUI freezing |
1.3 Communication Mechanism¶
Data Transmission Instructions
- All data is transmitted in Little Endian format
- Sync header 0x77 must be the first byte of each data packet
- Recommend command intervals of 5ms or more to avoid device processing delays
II. Protocol Command Set ¶
2.1 Command Classification Overview¶
Command Usage Instructions
- All commands must include sync header 0x77 as the first byte
- Total packet length is fixed at 63 bytes (excluding Report ID)
- Unused bytes must be padded with 0
2.1.1 Command Header Definition¶
| Command Header | Command Name | Function Description | Direction |
|---|---|---|---|
| 0x8B | READ_EQ_MODE | Read EQ mode status | PC → Device |
| 0x8C | SET_EQ_MODE | Set EQ mode | PC → Device |
| 0x8D | SET_EQ_PARAMS | Set EQ parameters | PC → Device |
| 0x8E | READ_EQ_PARAMS | Read EQ parameters | PC ↔ Device |
| 0x8F | SAVE_USER_MODE | Save user mode | PC → Device |
| 0x90 | READ_ALL_MODES | Read all mode information | PC ↔ Device |
| 0x91 | RESET_USER_MODE | Reset user mode | PC → Device |
| 0x92 | GET_DEVICE_INFO | Get device information | PC ↔ Device |
2.2 Detailed Command Format¶
2.2.1 Read EQ Mode (0x8B)¶
Function Description: Read current device EQ mode value
Request Format (63 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | sync_header | Sync header: 0x77 |
| 1 | 1 | cmd_header | Command header: 0x8B |
| 2 | 4 | sample_rate | Sample rate (Hz, 32-bit little endian) |
| 6 | 1 | mode | Query mode value |
| 7-62 | 56 | reserved | Reserved field (padded with 0) |
2.2.2 Set EQ Mode (0x8C)¶
Function Description: Formal mode setting command
Packet Format (63 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | sync_header | Sync header: 0x77 |
| 1 | 1 | cmd_header | Command header: 0x8C |
| 2 | 4 | sample_rate | Sample rate (Hz, 32-bit little endian) |
| 6 | 1 | mode | Mode value (0-5: Preset modes, 6-7: User modes, 8: Disable EQ) |
| 7-62 | 56 | reserved | Reserved field (padded with 0) |
2.2.3 Set EQ Parameters (0x8D)¶
Function Description: Send complete parameters and coefficients for a single filter
Packet Format (63 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | sync_header | Sync header: 0x77 |
| 1 | 1 | cmd_header | Command header: 0x8D |
| 2 | 4 | sample_rate | Sample rate (Hz, 32-bit little endian) |
| 6 | 1 | total_gain_db | Total gain compensation (dB, 8-bit signed integer) |
| 7 | 1 | filter_index | Filter index (0-7) |
| 8 | 1 | filter_type | Filter type code |
| 9 | 4 | fc | Center frequency (Hz, 32-bit unsigned integer) |
| 13 | 4 | q_value | Q value (Q15.15 format, 32-bit signed integer) |
| 17 | 4 | bandwidth | Bandwidth (Hz, 32-bit unsigned integer) |
| 21 | 4 | gain | Gain (Q15.15 format, 32-bit signed integer) |
| 25 | 38 | reserved | Reserved field (padded with 0) |
Filter Type Code Definition:
| Type Code | Filter Type | English Name |
|---|---|---|
| 0x00 | Bypass Filter | Bypass Filter |
| 0x01 | All-pass Filter | All-pass Filter |
| 0x02 | Peaking Filter | Peaking Filter |
| 0x03 | Low-pass Filter | Low-pass Filter |
| 0x04 | High-pass Filter | High-pass Filter |
| 0x05 | Band-pass Filter | Band-pass Filter |
| 0x06 | Band-stop Filter | Band-stop Filter |
| 0x07 | Notch Filter | Notch Filter |
| 0x08 | Constant-Q Filter | Constant-Q Filter |
| 0x09 | Low-shelf Filter | Low-shelf Filter |
| 0x0A | High-shelf Filter | High-shelf Filter |
Numerical Format Definition:
Q15.15 Format Description
- Q15.15 Format: 16-bit integer part + 16-bit fractional part
- Example: Q value 1.414 → 0x00016A09
2.2.4 Read EQ Parameters (0x8E)¶
Function Description: Read parameters of specified filter
Request Format (63 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | sync_header | Sync header: 0x77 |
| 1 | 1 | cmd_header | Command header: 0x8E |
| 2 | 4 | sample_rate | Sample rate (Hz, 32-bit little endian) |
| 6 | 1 | eq_index | EQ index to read (0-7) |
| 7-62 | 56 | reserved | Reserved field (padded with 0) |
Response Format (63 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | sync_header | Sync header: 0x77 |
| 1 | 1 | cmd_header | Command header: 0x8E (echo) |
| 2 | 4 | sample_rate | Sample rate (Hz, 32-bit little endian) |
| 6 | 1 | total_gain_db | Total gain compensation (dB, 8-bit signed integer) |
| 7 | 1 | eq_index | EQ index (0-7) |
| 8 | 1 | filter_type | Filter type code |
| 9 | 4 | fc | Center frequency (Hz, 32-bit unsigned integer) |
| 13 | 4 | q_value | Q value (Q15.15 format, 32-bit signed integer) |
| 17 | 4 | bandwidth | Bandwidth (Hz, 32-bit unsigned integer) |
| 21 | 4 | gain | Gain (Q15.15 format, 32-bit signed integer) |
| 25 | 38 | reserved | Reserved field (padded with 0) |
2.2.5 Save User Mode (0x8F)¶
Function Description: Save current EQ parameters to specified user mode
Request Format (63 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | sync_header | Sync header: 0x77 |
| 1 | 1 | cmd_header | Command header: 0x8F |
| 2 | 4 | sample_rate | Sample rate (Hz, 32-bit little endian) |
| 6 | 1 | user_mode | User mode index (6-7) |
| 7 | 1 | source_mode | Source mode index (current active mode, for copying parameters) |
| 8-62 | 55 | reserved | Reserved field (padded with 0) |
2.2.6 Read All Mode Information (0x90)¶
Function Description: Get basic information and status of all modes
Request Format (63 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | sync_header | Sync header: 0x77 |
| 1 | 1 | cmd_header | Command header: 0x90 |
| 2 | 4 | sample_rate | Sample rate (Hz, 32-bit little endian) |
| 6-62 | 57 | reserved | Reserved field (padded with 0) |
Response Format (63 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | sync_header | Sync header: 0x77 |
| 1 | 1 | cmd_header | Command header: 0x90 (echo) |
| 2 | 4 | sample_rate | Sample rate (Hz, 32-bit little endian) |
| 6 | 1 | current_mode | Current active mode |
| 7 | 1 | eq_enabled | EQ master switch status (0: Off, 1: On) |
| 8 | 8 | mode_status | Mode status array (each byte corresponds to one mode: 0=Default, 1=Modified, 2=Saved) |
| 16 | 8 | mode_names | Mode name index (name identifier for preset modes) |
| 24 | 39 | reserved | Reserved field (padded with 0) |
2.2.7 Reset User Mode (0x91)¶
Function Description: Reset user mode to default state
Request Format (63 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | sync_header | Sync header: 0x77 |
| 1 | 1 | cmd_header | Command header: 0x91 |
| 2 | 4 | sample_rate | Sample rate (Hz, 32-bit little endian) |
| 6 | 1 | user_mode | User mode index to reset (6-7, 0xFF means reset all user modes) |
| 7-62 | 56 | reserved | Reserved field (padded with 0) |
2.2.8 Get Device Information (0x92)¶
Function Description: Get basic device identification information
Request Format (63 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | sync_header | Sync header: 0x77 |
| 1 | 1 | cmd_header | Command header: 0x92 |
| 2 | 4 | sample_rate | Sample rate (Hz, 32-bit little endian) |
| 6-62 | 57 | reserved | Reserved field (padded with 0) |
Response Format (63 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | sync_header | Sync header: 0x77 |
| 1 | 1 | cmd_header | Command header: 0x92 (echo) |
| 2 | 4 | sample_rate | Sample rate (Hz, 32-bit little endian) |
| 6 | 2 | vendor_id | Vendor ID (VID, 16-bit little endian) |
| 8 | 2 | product_id | Product ID (PID, 16-bit little endian) |
| 10 | 2 | device_version | Device version number (BCD format) |
| 12 | 32 | device_name | Device name (UTF-8 encoded, null-terminated) |
| 44 | 4 | serial_number | Serial number (32-bit unsigned integer) |
| 48 | 2 | protocol_ver | Protocol version (major.minor, 1 byte each) |
| 50 | 1 | eq_band_count | Number of supported EQ bands |
| 51 | 1 | mode_count | Number of supported modes |
| 52 | 11 | reserved | Reserved field (padded with 0) |
III. Data Flow and Timing ¶
3.1 Typical Operation Flow¶
3.1.1 Mode Switching Flow¶
- GUI sends SET_EQ_MODE command (0x8C)
- Device updates internal mode state
- GUI sends READ_EQ_MODE command (0x8B) for confirmation
- Device responds with current mode state
3.1.2 Parameter Setting Flow¶
- GUI sends SET_EQ_MODE command to switch to corresponding mode (0x8C)
- Send commands for 8 filters sequentially (0x8D)
- Device receives and updates internal parameter cache
- Optional: Send READ_EQ_PARAMS command to verify parameters
3.1.3 Parameter Reading Flow¶
- GUI sends SET_EQ_MODE command to switch to corresponding mode (0x8C)
- GUI sends READ_EQ_PARAMS request (0x8E)
- Device prepares response data
- GUI reads response
3.2 Timing Requirements and Constraints¶
Timing Requirements
- Command Interval: Recommend 5ms or more
- Read Delay: Wait 100ms after sending read request
- Mode Switching: Wait for device internal state to stabilize after completion
Protocol Limitations and Constraints
Hardware Limitations
- Filter Count: Fixed 8 filters (MAX_EQ_BANDS = 8)
- Mode Count: Support 8 EQ modes (0-5 for preset modes, 6-7 for user modes) + 1 disable mode (8)
- Sample Rate Support: 44.1kHz, 48kHz, 88.2kHz, 96kHz, 176.4kHz, 192kHz
Parameter Ranges
| Parameter | Range | Format |
|---|---|---|
| Center Frequency (fc) | 20Hz - 20kHz | 32-bit unsigned integer |
| Q Value | 0.1 - 30.0 | Q15.15 format |
| Gain | -24dB - +24dB | Q15.15 format |
| Total Gain | -24dB - 0dB | 8-bit signed integer |
IV. Preset Mode Definition ¶
4.1 Mode Classification¶
| Mode Index | Mode Name | Usage Description | Type |
|---|---|---|---|
| 0 | Flat/Linear | Flat response, no EQ processing | Preset Mode |
| 1 | Pop/Rock | Pop rock music optimization | Preset Mode |
| 2 | Classical | Classical music optimization | Preset Mode |
| 3 | Jazz | Jazz music optimization | Preset Mode |
| 4 | Vocal | Vocal enhancement | Preset Mode |
| 5 | Bass Boost | Bass enhancement | Preset Mode |
| 6 | User 1 | User-defined mode 1 | User Mode |
| 7 | User 2 | User-defined mode 2 | User Mode |
| 8 | Disabled | EQ function disabled | Special Mode |
Mode Characteristics Description
- Preset Modes: Factory presets, non-modifiable, optimized for specific music types
- User Modes: Support user-defined parameters, can be saved and reset
- Disabled Mode: Completely turn off EQ processing, audio signal pass-through

