HF87621_VC1/HF87621Q_VC1¶
Multi-channel PCM 768KHz/DSD512 USB HiFi Decoder with USB/I2S/3CH SPDIF Input and I2S Output
1. Introduction¶
1.1 Product Description¶
HF87621_VC1/HF87621Q_VC1 is a USB multi-channel and multi-interface HiFi audio decoder supporting up to PCM 768KHz/DSD512, specifically designed for HiFi decoder audio applications.
HF87621_VC1/HF87621Q_VC1 supports various standard audio formats, including USB Audio Class 1.0/2.0, S/PDIF and I²S interfaces. The flexible audio interfaces allow HF87621_VC1/HF87621Q_VC1 to connect to various audio data converters, digital audio receivers and transmitters, and digital signal processors.
Compatible with AES3, S/PDIF, IEC 60958, and EIAJ CP-1201 digital audio interfaces.
HF87621_VC1/HF87621Q_VC1 provides multiple input and output modes, including USB input/I²S output, S/PDIF input/I²S output, I²S(slave) input/I²S(MASTER) output, meeting the requirements of different application scenarios.
Important Notice
HF87621Q_VC1 model supports MQA audio decoding, while HF87621_VC1 model does not support this feature.
1.2 Product Features¶
Audio Performance Features
- Supports input and output sampling rates up to 768kHz
- Supports DSD64/128/256/512 formats
- HF87621Q_VC1 supports MQA decoding
- Built-in SSRC and ASRC modules, support conversion between different interfaces and different sampling rates
- Supports 16-32bit audio data formats
- Supports 3-channel S/PDIF input
Interface Support Features
- Multiple Digital Interface Support
- Supports USB audio input
- Supports I²S slave mode audio input
- Supports I²S master mode audio output
- Supports S/PDIF audio input
- Supports UART configuration interface
USB Functional Features
- USB Interface Features
- Supports UAC 1.0
- Supports UAC 2.0
- Supports firmware upgrade via USB
- Supports HID, can upgrade MCU firmware via HID
System Compatibility - UAC 2.0 protocol, supports ASIO - Supports multiple operating systems such as Windows, Linux, Android, macOS and iOS
1.3 Application Scenarios¶
- USB HiFi Decoder
- USB HiFi Audio Interface
- USB HiFi Digital Player
1.4 Product Block Diagram¶
1.5 Ordering Information¶
| PRODUCT | ORDERING NUMBER | PACKAGE BODY | SIZE (NOM) | Hardware Model | Comments |
|---|---|---|---|---|---|
| HF87621_VC1 | HF87621-VC1 | SMT LGA-52 | 13x13mm | A316-Mini-V1 | |
| HF87621Q_VC1 | HF87621Q-VC1 | SMT LGA-52 | 13x13mm | A316-Mini-V1 | Supports MQA Decoding |
2. Modes and Specifications¶
2.1 Supported Input and Output Modes¶
| Mode Number | Input/Output Mode | Description | Mode Switch Command Value (Refer to Product Configuration Protocol 0x03 and 0x23 Commands) |
|---|---|---|---|
| 1 | USB(UAC2.0) in-I²S(Master) out | USB input, I²S output, UAC2.0 | 0x00, 0x80, 0xa9, 0x00, 0x01 |
| 2 | USB(UAC1.0) in-I²S(Master) out | USB input, I²S output, UAC1.0 | 0x00, 0x80, 0x01, 0x00, 0x02 |
| 3 | S/PDIF1 IN-I²S(Master) OUT | S/PDIF channel 1 input, I²S output | 0x10, 0x80, 0x65, 0x10, 0x03 |
| 4 | S/PDIF2 IN-I²S(Master) OUT | S/PDIF channel 2 input, I²S output | 0x00, 0x80, 0x65, 0x10, 0x04 |
| 5 | S/PDIF3 IN-I²S(Master) OUT | S/PDIF channel 3 input, I²S output | 0x20, 0x80, 0x65, 0x10, 0x07 |
| 6 | I²S(slave) in-I²S(Master) OUT | I²S slave mode input, I²S output | 0x00, 0x82, 0xd5, 0x81, 0x06 |
2.2 Detailed Parameters for Each Operating Mode¶
2.2.1 USB(UAC2.0) in → I²S out Mode¶
Supported Audio Formats and Sampling Rates:
| Audio Format | Supported Sampling Rates |
|---|---|
| PCM | 44.1kHz, 48kHz, 88.2kHz, 96kHz, 176.4kHz, 192kHz, 352.8kHz, 384kHz, 705.6kHz, 768KHz |
| DSD Native | DSD64, DSD128, DSD256, DSD512 |
| DOP | DOP64, DOP128, DOP256 |
| MQA | HF87621Q_VC1 only |
2.2.2 USB(UAC1.0) in → I²S out Mode¶
Supported Audio Formats and Sampling Rates:
| Audio Format | Supported Sampling Rates |
|---|---|
| PCM | 48kHz |
2.2.3 S/PDIF in → I²S out Mode¶
Supported Audio Formats and Sampling Rates:
| Audio Format | Supported Sampling Rates |
|---|---|
| PCM | 44.1kHz, 48kHz, 88.2kHz, 96kHz, 176.4kHz, 192kHz |
2.2.4 I²S(slave) in → I²S(MASTER) out Mode¶
Input/Output Sampling Rate Support:
| Interface | Audio Format | Supported Sampling Rates |
|---|---|---|
| I²S Input (Slave Mode) | PCM | 44.1kHz, 48kHz, 88.2kHz, 96kHz, 176.4kHz, 192kHz |
| I²S Output (Master Mode) | PCM | 44.1kHz, 48kHz, 88.2kHz, 96kHz, 176.4kHz, 192kHz |
ASRC (Asynchronous Sample Rate Conversion) Function:
- Internal ASRC conversion supported, input device may not provide master clock (MClock)
ASRC Performance Specifications:
- THD+N (@1kHz, 0dBFs): ≤-130dB
- SNR: ≥135dB
3. Pin Configuration and Functions¶
3.1 HF87621_VC1/HF87621Q_VC1 Pin Layout¶
3.2 HF87621_VC1/HF87621Q_VC1 Pin Description¶
| Pin Number | Name | Type | Function |
|---|---|---|---|
| 1 | 3.3V | P | Module 3.3V Power Supply |
| 2 | X1D13 | I/O | S/PDIF channel 2 input |
| 3 | X1D16 | I/O | NC |
| 4 | GND | P | Module Ground |
| 5 | X1D17 | I/O | NC |
| 6 | X1D18 | I/O | NC |
| 7 | X1D19 | I/O | NC |
| 8 | X1D22 | I/O | S/PDIF channel 1 input |
| 9 | X0D29 | I/O | NC |
| 10 | X0D35 | I/O | I²S_OUT_BCLK(MASTER) |
| 11 | X0D36 | I/O | I²S_OUT_LRCLK(MASTER) |
| 12 | X0D37 | I/O | NC |
| 13 | X0D38 | I/O | I²S_OUT_DATA0(MASTER) |
| 14 | X0D40 | I/O | NC |
| 15 | X0D39 | I/O | I²S_OUT_MCLK(MASTER) |
| 16 | X0D42 | I/O | NC |
| 17 | X0D41 | I/O | NC |
| 18 | X0D43 | I/O | NC |
| 19 | X1D34 | I/O | S/PDIF channel 3 input |
| 20 | GND | P | Module Ground |
| 21 | X0D30 | I/O | CTL_MUTE; control output, active low |
| 22 | X0D31 | I/O | NC |
| 23 | X0D32 | I/O | 49.152 MHz clock control |
| 24 | X0D33 | I/O | 45.1584 MHz clock control |
| 25 | GND | P | Module Ground |
| 26 | GND | P | Module Ground |
| 27 | GND | P | Module Ground |
| 28 | X0D00 | I/O | UART_TX, connect to MCU_RX |
| 29 | X0D11 | I/O | UART_RX, connect to MCU_TX |
| 30 | X1D00 | I/O | I²S_IN_LRCLK(SLAVE) |
| 31 | X1D01 | I/O | I²S_IN_DATA0(SLAVE) |
| 32 | GND | P | Module Ground |
| 33 | X1D09 | I/O | NC |
| 34 | X1D10 | I/O | I²S_IN_BCLK(SLAVE) |
| 35 | X1D11 | I/O | Connect to Pin 15 X0D39 |
| 36 | GND | P | Module Ground |
| 37 | GND | P | Module Ground |
| 38 | TDI | I/O | XTAG Debug PIN |
| 39 | TDO | I/O | XTAG Debug PIN |
| 40 | TMS | I/O | XTAG Debug PIN |
| 41 | TCK | I/O | XTAG Debug PIN |
| 42 | RST_N | I/O | System reset, active low |
| 43 | 1.8V | P | Module 1.8V Power Supply |
| 44 | GND | P | Module Ground |
| 45 | USB_DM | I/O | USB_DM |
| 46 | USB_DP | I/O | USB_DP |
| 47 | GND | P | Module Ground |
| 48 | 0.9V | P | Module 0.9V Power Supply |
| 49 | GND | P | Module Ground |
| 50 | GND | P | Module Ground |
| 51 | GND | P | Module Ground |
| 52 | GND | P | Module Ground |
Pin Type Description
I/O type definitions in the table: I=Input, O=Output, P=Power, I/O=Input/Output
4. Product Control Commands¶
4.1 Communication Interfaces and Protocol Overview¶
HF87621_VC1/HF87621Q_VC1 provides the following control channels (UART_TX/UART_RX pins, see section 3.2), each with its own base protocol:
| Control Channel | Physical Interface | Base Protocol |
|---|---|---|
| Product configuration over serial (XU316↔MCU) | UART 115200bps, 8-N-1, big-endian frames | XU316 UART Base Protocol |
| EQ/tone tool (PC serial) | UART 115200bps, 8-N-1, little-endian frames | EQ UART Base Protocol |
| USB tool (PC) | USB HID 64-byte packets (sync header 0x77) | USB HID Base Protocol |
This chapter embeds all business commands supported by this product, same-source maintained with the protocol center command references (Communication Protocols Index).
4.2 Product Configuration Commands (UART)¶
| Command | Command Description | Direction | Applicability Notes |
|---|---|---|---|
| 0x20 | Report application status | XU316→MCU | Sent on status change or 15s timer |
| 0x21 | Media control | MCU→XU316 | Converted by XU316 to HID command sent to computer |
| 0x22 | Report playback audio stream format and type | XU316→MCU | For displaying PCM/DSD/MQA/DOP status |
| 0x23 | Set input/output mode | MCU→XU316 | Mode values in datasheet section 2.1 table |
| 0x24 | Send playback volume | XU316→MCU | Left/right channel, 1 byte each |
| 0x25 | Send recording volume | XU316→MCU | Reserved command, currently not used |
| 0x26 | Switch MCLK | MCU→XU316 | Internal/external master clock switching |
| 0x27 | Set unmute | MCU→XU316 | DAC unmute delay during mode switching |
| 0x28 | Send audio format time delay | MCU→XU316 | Audio format switching delay configuration |
| 0x29 | Report USB connection status | XU316→MCU | Proactively reported on USB connect/disconnect |
| 0x30 | Set Mute pin inversion | MCU→XU316 | Adapts hardware with inverted Mute polarity |
| 0x31 | Get current audio format | MCU→XU316 | Queries current audio stream format and type |
| 0xF0 | DAC configuration selection | MCU→XU316 | Product-specific, not supported by all products |
| 0xF1 | Get firmware version | MCU→XU316 | Queries XU316 firmware version (3-byte BCD major version) |
| 0xF3 | Query complete version number | MCU→XU316 | Returns complete ASCII version string (model_vMajor.Minor.Rev_bBuild) |
| 0xEE | HID data passthrough | XU316→MCU | HID passes data to MCU via XU316 (e.g. MCU OTA) |
Usage Prerequisites
The above commands can only be used after device startup is complete (after XU316 sends the 0x05 startup complete command and receives the response). All commands must follow the base protocol frame format (frame header 0x55AA, big-endian transmission, checksum = sum of all bytes from frame header modulo 256); each command requires acknowledgment from the recipient, with a default timeout of 300ms and up to 4 retries.
Report Application Status (0x20)¶
XU316 Sends
Frame Header: 2 bytes - 0x55aa
Version: 1 byte - 0x00
Command: 1 byte - 0x20
Data Length: 1 byte - N
Data: N bytes - Application runtime parameters, see section 4.1-Application Runtime Parameters
Checksum: 1 byte - Sum of all bytes from frame header, modulo 256
MCU Returns
- This command is used by XU316 to report current application status to MCU
- Typically sent when status changes, such as volume change, mode switch, etc.
- MCU can update UI display or adjust related functions based on this info
Command Example
Field Breakdown
| Byte Segment | Length | Example | Description |
|---|---|---|---|
| Frame Header | 2 bytes | 55 AA | Fixed frame header indicating start of a protocol frame |
| Version | 1 byte | 03 | Indicates this frame is an acknowledgment returned by MCU to XU316 |
| Command | 1 byte | 20 | Acknowledges “Report Application Status” |
| Data Length | 1 byte | 00 | Pure acknowledgment frame with no data |
| Checksum | 1 byte | 22 | Sum of all bytes from 55 to 00, modulo 256 |
Media Control (0x21)¶
MCU Sends
Frame Header: 2 bytes - 0x55aa
Version: 1 byte - 0x03
Command: 1 byte - 0x21
Data Length: 1 byte - 0x01 (1 byte)
Data: 1 byte - Media control command
0x00 Volume Up / Vol Up
0x01 Volume Down / Vol Down
0x02 Play/Pause / PLAY/PAUSE
0x03 Next Track / NEXT
0x04 Previous Track / PREV
0x05 Fast Forward / FORWARD
0x06 Rewind / REWIND
0x07 Mute / MUTE
Checksum: 1 byte - Sum of all bytes from frame header, modulo 256
XU316 Returns
- This command is used by MCU to send media control commands to XU316
- After receiving command, XU316 will convert to corresponding HID command and send to computer
- Suitable for implementing remote control or physical button control of media playback
| Control Code | Function | USB HID Usage |
|---|---|---|
| 0x00 | Volume Up | Increase system volume |
| 0x01 | Volume Down | Decrease system volume |
| 0x02 | Play/Pause | Control media playback state |
| 0x03 | Next Track | Switch to next song |
| 0x04 | Previous Track | Switch to previous song |
| 0x05 | Fast Forward | Fast forward in current track |
| 0x06 | Rewind | Rewind in current track |
| 0x07 | Mute | Toggle system mute state |
Command Example
Field Breakdown
| Byte Segment | Length | Example | Description |
|---|---|---|---|
| Frame Header | 2 bytes | 55 AA | Fixed frame header indicating start of a protocol frame |
| Version | 1 byte | 03 | Indicates this frame is a command sent by MCU to XU316 |
| Command | 1 byte | 21 | Current command is “Media Control” |
| Data Length | 1 byte | 01 | One data byte follows |
| Control code | 1 byte | 02 | Indicates “Play/Pause” |
| Checksum | 1 byte | 26 | Sum of all bytes from 55 to control code, modulo 256 |
Report Playback Audio Stream Format and Type (0x22)¶
XU316 Sends
Frame Header: 2 bytes - 0x55aa
Version: 1 byte - 0x00
Command: 1 byte - 0x22
Data Length: 1 byte - 0x02 (2 bytes)
Data: 2 bytes - Audio stream format and type, see audio stream format and type field
Checksum: 1 byte - Sum of all bytes from frame header, modulo 256
MCU Returns
- This command is used by XU316 to report current audio stream format and type to MCU
- Typically sent when playback starts or format changes
- MCU can update display based on this info, such as showing PCM/DSD/MQA/DOP status
Command Example
Field Breakdown
| Byte Segment | Length | Example | Description |
|---|---|---|---|
| Frame Header | 2 bytes | 55 AA | Fixed frame header indicating start of a protocol frame |
| Version | 1 byte | 03 | Indicates this frame is an acknowledgment returned by MCU to XU316 |
| Command | 1 byte | 22 | Acknowledges “Report Playback Audio Stream Format and Type” |
| Data Length | 1 byte | 00 | Pure acknowledgment frame with no data |
| Checksum | 1 byte | 24 | Sum of all bytes from 55 to 00, modulo 256 |
Set Input/Output Mode (0x23)¶
MCU Sends
Frame Header: 2 bytes - 0x55aa
Version: 1 byte - 0x03
Command: 1 byte - 0x23
Data Length: 1 byte - 0x05 (5 bytes)
Data: 5 bytes - Input/output mode, see input/output mode field
Checksum: 1 byte - Sum of all bytes from frame header, modulo 256
XU316 Returns
- This command is used by MCU to request XU316 switch to specific input/output mode
- Typically triggered by user operation, such as pressing mode selection button
- XU316 may need to restart to load new mode firmware
Command Example
Field Breakdown
| Byte Segment | Length | Example | Description |
|---|---|---|---|
| Frame Header | 2 bytes | 55 AA | Fixed frame header indicating start of a protocol frame |
| Version | 1 byte | 03 | Indicates this frame is a command sent by MCU to XU316 |
| Command | 1 byte | 23 | Current command is “Set Input/Output Mode” |
| Data Length | 1 byte | 05 | 5 mode bytes follow |
| Input/output mode | 5 bytes | 02 00 00 00 00 | Example target mode data; definitions depend on product specification |
| Checksum | 1 byte | 2C | Sum of all bytes from 55 to the last mode byte, modulo 256 |
Send Playback Volume (0x24)¶
XU316 Sends
Frame Header: 2 bytes - 0x55aa
Version: 1 byte - 0x00
Command: 1 byte - 0x24
Data Length: 1 byte - 0x02 (2 bytes)
Data: 2 bytes
Byte 1: Left channel (0xFF Mute, 0-0dB, -127: -127dB)
Byte 2: Right channel (0xFF Mute, 0-0dB, -127: -127dB)
Checksum: 1 byte - Sum of all bytes from frame header, modulo 256
MCU Returns
- This command is used by XU316 to report current playback volume to MCU
Command Example
Field Breakdown
| Byte Segment | Length | Example | Description |
|---|---|---|---|
| Frame Header | 2 bytes | 55 AA | Fixed frame header indicating start of a protocol frame |
| Version | 1 byte | 03 | Indicates this frame is an acknowledgment returned by MCU to XU316 |
| Command | 1 byte | 24 | Acknowledges “Send Playback Volume” |
| Data Length | 1 byte | 00 | Pure acknowledgment frame with no data |
| Checksum | 1 byte | 26 | Sum of all bytes from 55 to 00, modulo 256 |
Send Recording Volume (0x25)¶
XU316 Sends
Frame Header: 2 bytes - 0x55aa
Version: 1 byte - 0x00
Command: 1 byte - 0x25
Data Length: 1 byte - 0x01 (1 byte)
Data: 1 byte - 0xFF Mute, 0-0dB -127: -127dB
Checksum: 1 byte - Sum of all bytes from frame header, modulo 256
MCU Returns
- This command is used by XU316 to report current microphone recording volume to MCU
- Reserved command, currently not used
Command Example
Field Breakdown
| Byte Segment | Length | Example | Description |
|---|---|---|---|
| Frame Header | 2 bytes | 55 AA | Fixed frame header indicating start of a protocol frame |
| Version | 1 byte | 03 | Indicates this frame is an acknowledgment returned by MCU to XU316 |
| Command | 1 byte | 25 | Acknowledges “Send Recording Volume” |
| Data Length | 1 byte | 00 | Pure acknowledgment frame with no data |
| Checksum | 1 byte | 27 | Sum of all bytes from 55 to 00, modulo 256 |
Switch MCLK (0x26)¶
MCU Sends
Frame Header: 2 bytes - 0x55aa
Version: 1 byte - 0x03
Command: 1 byte - 0x26
Data Length: 1 byte - 1
Data: 1 byte - 0: Internal MCLK, 1: External MCLK
Checksum: 1 byte - Sum of all bytes from frame header, modulo 256
XU316 Returns
- This command is used by XU316 to control switching master clock source
- Can switch between using internal clock or external clock
- Important for certain audio application scenarios requiring precise synchronization
Command Example
Field Breakdown
| Byte Segment | Length | Example | Description |
|---|---|---|---|
| Frame Header | 2 bytes | 55 AA | Fixed frame header indicating start of a protocol frame |
| Version | 1 byte | 03 | Indicates this frame is a command sent by MCU to XU316 |
| Command | 1 byte | 26 | Current command is “Switch MCLK” |
| Data Length | 1 byte | 01 | One data byte follows |
| Data | 1 byte | 01 | Switch to external MCLK; if 00, switch to internal MCLK |
| Checksum | 1 byte | 2A | Sum of all bytes from 55 to last data byte, modulo 256 |
Set Unmute (0x27)¶
Send Audio Format Time Delay (0x28)¶
Report USB Connection Status (0x29)¶
XU316 Sends
Frame Header: 2 bytes - 0x55aa
Version: 1 byte - 0x00
Command: 1 byte - 0x29
Data Length: 1 byte - 0x01 (1 byte)
Data: 1 byte - USB connection status
0x00 USB disconnected / not connected
0x01 USB connected
Checksum: 1 byte - Sum of all bytes from frame header, modulo 256
MCU Returns
- This command is used by XU316 to report the current USB connection status to the MCU
- When the USB connection status changes (connect or disconnect), XU316 proactively sends this command
- The MCU can use this information to update the UI or adjust related functions
Command Example
Field Breakdown
| Byte Segment | Length | Example | Description |
|---|---|---|---|
| Frame Header | 2 bytes | 55 AA | Fixed frame header indicating start of a protocol frame |
| Version | 1 byte | 03 | Indicates this frame is an acknowledgment returned by MCU to XU316 |
| Command | 1 byte | 29 | Acknowledges “Report USB Connection Status” |
| Data Length | 1 byte | 00 | Pure acknowledgment frame with no data |
| Checksum | 1 byte | 2B | Sum of all bytes from 55 to 00, modulo 256 |
Set Mute Pin Inversion (0x30)¶
MCU Sends
Frame Header: 2 bytes - 0x55aa
Version: 1 byte - 0x03
Command: 1 byte - 0x30
Data Length: 1 byte - 0x01
Data: 1 byte
B0: Inversion flag
0x00 = Normal logic (High level unmute, Low level mute)
0x01 = Inverted logic (Low level unmute, High level mute)
Checksum: 1 byte - Sum of all bytes from frame header, modulo 256
XU316 Returns
- This command is used to set inversion logic for the Mute pin output
- Use this command when certain hardware designs have opposite Mute polarity from default
- The configuration is automatically saved to Flash and persists after power-off
- Takes effect immediately and returns current status
- Mute pin polarity is opposite to default in hardware design
- Need to adapt different hardware revisions of devices
Command Example
Field Breakdown
| Byte Segment | Length | Example | Description |
|---|---|---|---|
| Frame Header | 2 bytes | 55 AA | Fixed frame header |
| Version | 1 byte | 03 | Sent by MCU to XU316 |
| Command | 1 byte | 30 | Set Mute pin inversion |
| Data Length | 1 byte | 01 | 1 data byte follows |
| Inversion flag | 1 byte | 01 | 0x01 = inverted logic |
| Checksum | 1 byte | 34 | Sum of all bytes from 55 to inversion flag, modulo 256 |
Get Current Audio Format (0x31)¶
MCU Sends
Frame Header: 2 bytes - 0x55aa
Version: 1 byte - 0x03
Command: 1 byte - 0x31
Data Length: 1 byte - 0x00
Data: 0 bytes
Checksum: 1 byte - Sum of all bytes from frame header, modulo 256
XU316 Returns
Frame Header: 2 bytes - 0x55aa
Version: 1 byte - 0x00
Command: 1 byte - 0x31
Data Length: 1 byte - 0x02 (2 bytes)
Data: 2 bytes
Byte 0: Audio stream format, see section 4.3 Audio Stream Format
Byte 1: Audio type, see section 4.3 Audio Type
Checksum: 1 byte - Sum of all bytes from frame header, modulo 256
- This command is used by MCU to query current playback audio stream format and type from XU316
- The return format is consistent with the 0x22 proactive report command
- If the audio type is DSD and the format is AUDIO_44100, XU316 will correct it to PCM in the response
- If no valid audio stream is present, returns
0xFF 0x00
Command Example
Field Breakdown
| Byte Segment | Length | Example | Description |
|---|---|---|---|
| Frame Header | 2 bytes | 55 AA | Fixed frame header indicating start of a protocol frame |
| Version | 1 byte | 03 | Indicates this frame is a command sent by MCU to XU316 |
| Command | 1 byte | 31 | Current command is “Get Current Audio Format” |
| Data Length | 1 byte | 00 | No additional data |
| Checksum | 1 byte | 33 | Sum of all bytes from 55 to 00, modulo 256 |
Command Example
Field Breakdown
| Byte Segment | Length | Example | Description |
|---|---|---|---|
| Frame Header | 2 bytes | 55 AA | Fixed frame header indicating start of a protocol frame |
| Version | 1 byte | 00 | Indicates this frame is returned by XU316 to MCU |
| Command | 1 byte | 31 | Response for “Get Current Audio Format” |
| Data Length | 1 byte | 02 | Two data bytes follow |
| Audio stream format | 1 byte | 03 | Current format is AUDIO_96000 (96kHz) |
| Audio type | 1 byte | 00 | Current type is PCM |
| Checksum | 1 byte | 35 | Sum of all bytes from 55 to last data byte, modulo 256 |
DAC Configuration Selection (0xF0)¶
MCU Sends
Frame Header: 2 bytes - 0x55aa
Version: 1 byte - 0x03
Command: 1 byte - 0xF0
Data Length: 1 byte - 4
Data: 4 bytes
Byte 0: 0: Enable I2C DAC configuration 1: Disable I2C DAC configuration
Byte 1 - 3: reserved
Checksum: 1 byte - Sum of all bytes from frame header, modulo 256
XU316 Returns
- Test command for MCU to set DAC configuration selection in XU316. Let XU316 configure DAC via DAC I2C or MCU configure DAC itself
- This command is product-specific and not supported by all products. Please refer to product specification for support details.
Command Example
Field Breakdown
| Byte Segment | Length | Example | Description |
|---|---|---|---|
| Frame Header | 2 bytes | 55 AA | Fixed frame header indicating start of a protocol frame |
| Version | 1 byte | 03 | Indicates this frame is a command sent by MCU to XU316 |
| Command | 1 byte | F0 | Current command is “DAC Configuration Selection Command” |
| Data Length | 1 byte | 04 | 4 data bytes follow |
| Byte 0 | 1 byte | 00 | Enable XU316 to configure DAC via I2C |
| Byte 1-3 | 3 bytes | 00 00 00 | Reserved bytes, all set to 00 in this example |
| Checksum | 1 byte | F6 | Sum of all bytes from 55 to the last data byte, modulo 256 |
Get Firmware Version Command (0xF1)¶
MCU Sends
Frame Header: 2 bytes - 0x55aa
Version: 1 byte - 0x03
Command: 1 byte - 0xF1
Data Length: 1 byte - 2
Data: 2 bytes -
Checksum: 1 byte - Sum of all bytes from frame header, modulo 256
XU316 Returns
- Get firmware version
Command Example
Field Breakdown
| Byte Segment | Length | Example | Description |
|---|---|---|---|
| Frame Header | 2 bytes | 55 AA | Fixed frame header indicating start of a protocol frame |
| Version | 1 byte | 03 | Indicates this frame is a command sent by MCU to XU316 |
| Command | 1 byte | F1 | Current command is “Get Firmware Version Command” |
| Data Length | 1 byte | 02 | Two data bytes follow |
| Data | 2 bytes | 00 00 | Reserved bytes, set to 00 as placeholder in this example |
| Checksum | 1 byte | F5 | Sum of all bytes from 55 to the last data byte, modulo 256 |
Query Complete Version Number (0xF3)¶
MCU Sends
Frame Header: 2 bytes - 0x55aa
Version: 1 byte - 0x03
Command: 1 byte - 0xF3
Data Length: 1 byte - 0x00
Data: 0 bytes - none
Checksum: 1 byte - Sum of all bytes from frame header, modulo 256
XU316 Returns
- This command is used by MCU to query the complete firmware version number from XU316
- Unlike the 0xF1 command (which only returns a 3-byte BCD major version J.M.N), 0xF3 returns the complete ASCII version string
- Version string format is
<model>_v<major>.<minor>.<revision>_b<build> - For example, user firmware returns
hf87611_v8.1.0_b01, factory firmware returnshf87611_v5.5.8_b01
Command Example
Field Breakdown
| Byte Segment | Length | Example | Description |
|---|---|---|---|
| Frame Header | 2 bytes | 55 AA | Fixed frame header indicating start of a protocol frame |
| Version | 1 byte | 03 | Indicates this frame is a command sent by MCU to XU316 |
| Command | 1 byte | F3 | Current command is “Query Complete Version Number” |
| Data Length | 1 byte | 00 | No additional data |
| Checksum | 1 byte | F5 | Sum of all bytes from 55 to 00, modulo 256 |
Command Example
Field Breakdown
| Byte Segment | Length | Example | Description |
|---|---|---|---|
| Frame Header | 2 bytes | 55 AA | Fixed frame header indicating start of a protocol frame |
| Version | 1 byte | 00 | Indicates this frame is returned by XU316 to MCU |
| Command | 1 byte | F3 | Response for “Query Complete Version Number” |
| Data Length | 1 byte | 12 | 18 data bytes follow |
| Version string | 18 bytes | 68 66 38 37 36 31 31 5F 76 38 2E 31 2E 30 5F 62 30 31 | ASCII string hf87611_v8.1.0_b01 |
| Checksum | 1 byte | C5 | Sum of all bytes from 55 to the last data byte, modulo 256 |
HID Passthrough Data to MCU via XU316 (0xEE)¶
XU316 Sends
Frame Header: 2 bytes - 0x55aa
Version: 1 byte - 0x00
Command: 1 byte - 0xEE
Data Length: 1 byte - 0x39 (57 bytes), due to HID protocol limitation, data length must be 57 bytes
Data: 57 bytes - Due to HID protocol limitation, passthrough data must be 57 bytes
Checksum: 1 byte - Sum of all bytes from frame header, modulo 256
MCU Returns (can return multiple frames)
Frame Header: 2 bytes - 0x55aa
Version: 1 byte - 0x03
Command: 1 byte - 0xEE
Data Length: 1 byte - 0x39 (57 bytes), due to HID protocol limitation, data length must be 57 bytes
Data: 57 bytes - Due to HID protocol limitation, passthrough data must be 57 bytes
Checksum: 1 byte - Sum of all bytes from frame header, modulo 256
- This command is used for HID to initiate passthrough data to MCU via XU316
- Generally the passthrough data is MCU OTA data or MCU data replied to HID
Example Notes
The byte sequences in this section are derived from the base protocol frame format (checksum = sum of all bytes from frame header, modulo 256), for development reference; mode values in the examples are from the product datasheet section 2.1 table — each product follows its own datasheet.
Flow 1: Device Startup Handshake¶
After power-on, XU316 and MCU complete the startup handshake in the following order; business commands can only be used after the handshake completes:
sequenceDiagram
participant X as XU316
participant M as MCU
X->>M: 0x00 Start-up (with basic info / power-on config CRC)
M-->>X: Startup options (set 0x01/0x02 bits as needed)
opt Update basic info
X->>M: 0x01 Read product info
M-->>X: 60-byte product basic info
end
opt Update power-on config
X->>M: 0x02 Read power-on config
M-->>X: 14-byte power-on config
end
X->>M: 0x03 Get current input/output mode
M-->>X: 5-byte mode value (see datasheet section 2.1 table)
X->>M: 0x04 Get current user config
M-->>X: 14-byte user config
X->>M: 0x05 Startup complete
M-->>X: Acknowledgment Complete byte formats and timing details of each command: see the "Device Startup and Initialization" chapter of "XU316 UART Base Protocol".
Flow 2: Switch Input/Output Mode (0x23)¶
Example: switch to S/PDIF1 input mode (mode value 0x10, 0x80, 0x65, 0x10, 0x03, from the product datasheet section 2.1 table).
MCU Sends:
| Byte Segment | Example | Description |
|---|---|---|
| Frame Header | 55 AA | Fixed frame header |
| Version | 03 | MCU→XU316 command |
| Command | 23 | Set input/output mode |
| Data Length | 05 | 5 mode bytes follow |
| Mode data | 10 80 65 10 03 | Target mode value (see product datasheet section 2.1 table) |
| Checksum | 32 | Sum of all bytes from frame header, modulo 256 |
XU316 Returns: 55 AA 00 23 00 22 (pure acknowledgment frame)
Restart After Mode Switch
XU316 may need to restart to load the new mode firmware. After restart, the device repeats the startup handshake flow (the restart reason field in the 0x00 command is 0x01 mode switch restart); the MCU should respond again as in Flow 1.
Flow 3: Receive Playback Volume Report (0x24)¶
After the user adjusts volume on the computer, XU316 proactively reports the current playback volume to MCU (example: both channels at -24dB, i.e. 0xE8):
XU316 Sends:
| Byte Segment | Example | Description |
|---|---|---|
| Frame Header | 55 AA | Fixed frame header |
| Version | 00 | XU316→MCU data |
| Command | 24 | Send playback volume |
| Data Length | 02 | 2 volume bytes follow |
| Left channel | E8 | -24dB (0xFF is Mute, 0 is 0dB) |
| Right channel | E8 | -24dB |
| Checksum | F5 | Sum of all bytes from frame header, modulo 256 |
MCU Returns: 55 AA 03 24 00 26 (pure acknowledgment frame)
Flow 4: Media Control — Play/Pause (0x21)¶
MCU-side button triggers play/pause (control code 0x02); XU316 converts it to an HID command sent to the computer:
MCU Sends: 55 AA 03 21 01 02 26
XU316 Returns: 55 AA 00 21 00 20 (pure acknowledgment frame)
Other control codes (volume up/down, previous/next track, fast forward, rewind, mute) are listed in the mapping table of the 0x21 command details; the frame format is identical, only the data byte and checksum differ.
Flow 5: Query Current Audio Format (0x31)¶
MCU Sends: 55 AA 03 31 00 33
XU316 Returns (example: 96kHz PCM):
| Byte Segment | Example | Description |
|---|---|---|
| Audio stream format | 03 | AUDIO_96000 (96kHz); full table in base protocol section 4.3 |
| Audio type | 00 | PCM |
Flow 6: Get Firmware Version (0xF1)¶
MCU Sends: 55 AA 03 F1 02 00 00 F5
XU316 Returns (example: V1.2.5):
| Byte Segment | Example | Description |
|---|---|---|
| Data Length | 03 | 3-byte version number |
| Version data | 01 02 05 | Major.Minor.Revision (V1.2.5) |
4.3 EQ and Tone Control Commands (UART/HID dual codes)¶
Each function has one command code per transport (HID code = UART code + 0x4A); both formats are shown for every command below.
| UART Command | HID Command | Name | Function |
|---|---|---|---|
| 0x40 | 0x8A | SET_EQ_MODE | Switch EQ Mode |
| 0x41 | 0x8B | GET_EQ_MODE | Get EQ Mode Information |
| 0x42 | 0x8C | SET_MODE_GAIN_AND_NAME | Set Mode Overall Gain and Name |
| 0x43 | 0x8D | SET_EQ_PARAMS | Send EQ Parameters |
| 0x44 | 0x8E | GET_EQ_PARAMS | Read EQ Parameters |
| 0x45 | 0x8F | GET_DEVICE_INFO | Get Device Information |
| 0x46 | 0x90 | RESET_EQ_PARAMS | Reset EQ Parameters |
| 0x47 | 0x91 | GET_EQ_MODE_COUNT | Get Total EQ Mode Count |
| 0x48 | 0x92 | SET_AND_SAVE_EQ_MODE | Set and Save EQ Mode |
| 0x49 | 0x93 | SET_VOLUME | Set Volume Level (Disabled) |
| 0x4A | 0x94 | GET_VOLUME | Get Volume Level (Disabled) |
| 0x4B | 0x95 | GET_LED_INFO | Get LED Information (Disabled) |
| 0x4C | 0x96 | SET_LED_SWITCH | Set LED Switch (Disabled) |
| 0x4D | 0x97 | GET_LED_SWITCH | Get LED Switch (Disabled) |
| 0x4E | 0x98 | GET_LED_STATUS | Get LED Status (Disabled) |
| 0x4F | 0x99 | GET_LED_COUNT | Get LED Count (Disabled) |
| 0x50 | 0x9A | GET_UAC_MODE_INFO | Get UAC Mode Information (Disabled) |
| 0x51 | 0x9B | SET_UAC_MODE | Set UAC Mode (Disabled) |
| 0x52 | 0x9C | GET_CURRENT_UAC_MODE | Get Current UAC Mode (Disabled) |
| 0x53 | 0x9D | SET_EQ_ENABLE | Set EQ Enable Switch |
| 0x54 | 0x9E | GET_EQ_ENABLE | Get EQ Enable Switch |
| 0x55 | 0x9F | GET_SAMPLE_FORMAT | Get Sample Rate and Format |
| 0x56 | 0xA0 | SET_GAIN_MODE | Set Gain Mode (Disabled) |
| 0x57 | 0xA1 | GET_GAIN_MODE | Get Gain Mode (Disabled) |
| 0x58 | 0xA2 | SET_FILTER_MODE | Set Filter Mode (Disabled) |
| 0x59 | 0xA3 | GET_FILTER_MODE | Get Filter Mode (Disabled) |
| 0x5A | 0xA4 | SET_GAME_MODE | Set Game Mode (Disabled) |
| 0x5B | 0xA5 | GET_GAME_MODE | Get Game Mode (Disabled) |
| 0x5C | 0xA6 | GET_FIRMWARE_VERSION | Get Firmware Version |
| 0x5D | 0xB3 | SET_EQ_BAND_COUNT | Set EQ Band Count |
| 0x5E | 0xB4 | GET_EQ_BAND_COUNT | Get EQ Band Count |
Switch EQ Mode(SET_EQ_MODE,UART 0x40 / HID 0x8A)¶
UART serial format (command 0x40):
Function: Switch current EQ mode
Direction: Host→Device
Data Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x40 | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | Mode Value (0-6: Presets, 7-9: User)
6 | 1 | Checksum| Checksum
Device Processing:
- Directly sets
g_current_eq_mode = data[5] - Does not involve parameter transmission or calculation
USB HID format (command header 0x8A):
Function: Switch current EQ mode
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x8A |
| 3 | 1 | mode | Mode value (0-6: preset modes, 7-9: user modes) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Get EQ Mode Information(GET_EQ_MODE,UART 0x41 / HID 0x8B)¶
UART serial format (command 0x41):
Function: Read EQ mode information
Direction: Host→Device
Request Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x41 | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | Mode Value (0-9: Valid mode, 0xFF: Get current info)
6 | 1 | Checksum| Checksum
Device Processing:
- If mode is 0xFF, returns current mode value, overall gain, and mode name.
- If mode is a valid value (0-9), returns specified mode value, overall gain, and mode name.
Response Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x41 | Command Code
4 | 1 | 0x15 | Data Length (21 bytes)
5 | 1 | uint8 | Mode Value (Current or specified)
6-9 | 4 | int32 | Gain Value (Range 0 to -50dB, signed integer)
10-25 | 16 | char | Mode Name (UTF-8 encoded, 16 bytes)
26 | 1 | Checksum| Checksum
Usage Notes:
- When sending mode=0xFF, returns information for the currently active EQ mode.
- When sending mode=0-9, returns gain and name information for the specified mode (does not switch current mode).
USB HID format (command header 0x8B):
Function: Get current mode value, overall gain, and mode name
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x8B |
| 3 | 1 | mode | Mode value (0-9: specified mode; 0xFF: get current mode info) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x8B (echo) |
| 3 | 1 | mode | Current mode value |
| 4-7 | 4 | gain | Overall gain (int32, little endian, range -50dB ~ 0dB) |
| 8-23 | 16 | name | Mode name (UTF-8 string) |
| 24-63 | 40 | reserved | Reserved fields (fill with 0) |
Usage Notes:
- Send
mode = 0xFFto return the currently active EQ mode information - Send
mode = 0-9to return the specified mode gain and name (does not switch the current mode)
Set Mode Overall Gain and Name(SET_MODE_GAIN_AND_NAME,UART 0x42 / HID 0x8C)¶
UART serial format (command 0x42):
Function: Set EQ mode overall gain and name
Direction: Host→Device
Data Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x42 | Command Code
4 | 1 | 0x15 | Data Length (21 bytes)
5 | 1 | uint8 | Mode Value (0-9)
6-9 | 4 | int32 | Gain Value (Range 0 to -50dB, signed integer)
10-25 | 16 | char | Mode Name (UTF-8 encoded, 16 bytes)
26 | 1 | Checksum| Checksum
Device Processing:
- Parses mode value, gain value, and mode name.
- Sets the specified mode's EQ overall gain and name for all sample rates' left and right channels.
- Supports all sample rates: 44100, 48000, 88200, 96000, 176400, 192000 Hz.
USB HID format (command header 0x8C):
Function: Set overall gain and name for target mode
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x8C |
| 3 | 1 | mode | Target mode value (0-9) |
| 4-7 | 4 | gain | Overall gain (int32, little endian, range -50dB ~ 0dB) |
| 8-23 | 16 | name | Mode name (UTF-8 string) |
| 24-63 | 40 | reserved | Reserved fields (fill with 0) |
Send EQ Parameters(SET_EQ_PARAMS,UART 0x43 / HID 0x8D)¶
UART serial format (command 0x43):
Function: Send parameters for a single filter
Direction: Host→Device
Data Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x43 | Command Code
4 | 1 | 0x13 | Data Length (19 bytes: 1 mode + 1 index + 1 type + 4 floats totaling 16 bytes)
5 | 1 | uint8 | Mode Value (0-9)
6 | 1 | uint8 | Filter Band Index (0-7)
7 | 1 | uint8 | Filter Type
8-11 | 4 | float | Center Frequency (Hz)
12-15 | 4 | float | Q Value
16-19 | 4 | float | Bandwidth (Hz)
20-23 | 4 | float | Gain (dB)
24 | 1 | Checksum| Checksum
Filter Type Codes:
| Code | Filter Type |
|---|---|
| 0x00 | Bypass Filter |
| 0x01 | All Pass Filter |
| 0x02 | Peak Filter |
| 0x03 | Low Pass Filter |
| 0x04 | High Pass Filter |
| 0x05 | Band Pass Filter |
| 0x06 | Band Reject Filter |
| 0x07 | Notch Filter |
| 0x08 | Constant Q Filter |
| 0x09 | Low Shelf Filter |
| 0x0A | High Shelf Filter |
Device Processing:
- Parses parameters and stores them into the corresponding mode for all sample rates.
- Calls
eq_calculate_coefficients_from_params()to calculate coefficients. - Stores calculated coefficients into the corresponding mode for all sample rates.
- Automatically applies to all sample rates: 44100, 48000, 88200, 96000, 176400, 192000 Hz.
USB HID format (command header 0x8D):
Function: Send single filter parameters
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x8D |
| 3 | 1 | mode | Mode value (0-9) |
| 4 | 1 | band | Filter index (0-7) |
| 5 | 1 | type | Filter type code |
| 6-9 | 4 | freq | Center frequency Hz (float, little endian) |
| 10-13 | 4 | q | Q value (float, little endian) |
| 14-17 | 4 | bw | Bandwidth Hz (float, little endian) |
| 18-21 | 4 | gain | Gain dB (float, little endian) |
| 22-63 | 42 | reserved | Reserved fields (fill with 0) |
Filter Type Codes:
| Code | Type | Code | Type |
|---|---|---|---|
| 0x00 | Bypass | 0x06 | Band Reject |
| 0x01 | All Pass | 0x07 | Notch |
| 0x02 | Peak | 0x08 | Constant Q |
| 0x03 | Low Pass | 0x09 | Low Shelf |
| 0x04 | High Pass | 0x0A | High Shelf |
| 0x05 | Band Pass |
Data Format Notes:
Floating Point and Byte Order
- All floating-point numbers follow IEEE 754 float standard with little endian byte order
- All multi-byte integers use Little Endian byte order
Read EQ Parameters(GET_EQ_PARAMS,UART 0x44 / HID 0x8E)¶
UART serial format (command 0x44):
Function: Read parameters of a single filter
Direction: Host→Device
Request Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x44 | Command Code
4 | 1 | 0x02 | Data Length
5 | 1 | uint8 | Mode Value (0-9)
6 | 1 | uint8 | EQ Index (0-7)
7 | 1 | Checksum| Checksum
Response Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x44 | Command Code
4 | 1 | 0x13 | Data Length (19 bytes: 1 mode + 1 index + 1 type + 4 floats totaling 16 bytes)
5 | 1 | uint8 | Mode Value (0-9)
6 | 1 | uint8 | Filter Band Index (0-7)
7 | 1 | uint8 | Filter Type
8-11 | 4 | float | Center Frequency (Hz)
12-15 | 4 | float | Q Value
16-19 | 4 | float | Bandwidth (Hz)
20-23 | 4 | float | Gain (dB)
24 | 1 | Checksum| Checksum
USB HID format (command header 0x8E):
Function: Read parameters of specified filter
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x8E |
| 3 | 1 | mode | Mode value (0-9) |
| 4 | 1 | band | Filter index (0-7) |
| 5-63 | 59 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x8E (echo) |
| 3 | 1 | mode | Mode value |
| 4 | 1 | band | Filter index |
| 5 | 1 | type | Filter type code |
| 6-9 | 4 | freq | Center frequency Hz (float, little endian) |
| 10-13 | 4 | q | Q value (float, little endian) |
| 14-17 | 4 | bw | Bandwidth Hz (float, little endian) |
| 18-21 | 4 | gain | Gain dB (float, little endian) |
| 22-63 | 41 | reserved | Reserved fields (fill with 0) |
Get Device Information(GET_DEVICE_INFO,UART 0x45 / HID 0x8F)¶
UART serial format (command 0x45):
Function: Get device basic information
Direction: Host→Device
Request Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x45 | Command Code
4 | 1 | 0x00 | Data Length
5 | 1 | Checksum| Checksum
Response Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x45 | Command Code
4 | 1 | 0x34 | Data Length (52 bytes: 2 PID + 2 VID + 16 Product + 16 Vendor + 16 SN)
5-6 | 2 | uint16 | Product ID (PID, Little Endian)
7-8 | 2 | uint16 | Vendor ID (VID, Little Endian)
9-24 | 16 | char | Product String (UTF-8, 16 bytes)
25-40 | 16 | char | Vendor String (UTF-8, 16 bytes)
41-56 | 16 | char | Serial Number String (UTF-8, 16 bytes)
57 | 1 | Checksum| Checksum
USB HID format (command header 0x8F):
Function: Get basic device identification information
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x8F |
| 3-63 | 61 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x8F (echo) |
| 3-4 | 2 | pid | Product ID (uint16, little endian) |
| 5-6 | 2 | vid | Vendor ID (uint16, little endian) |
| 7-22 | 16 | product | Product string (UTF-8) |
| 23-38 | 16 | vendor | Vendor string (UTF-8) |
| 39-54 | 16 | sn | Serial number string (UTF-8) |
| 55-63 | 9 | reserved | Reserved fields (fill with 0) |
Reset EQ Parameters(RESET_EQ_PARAMS,UART 0x46 / HID 0x90)¶
UART serial format (command 0x46):
Function: Delete customer-customized EQ parameters and restore preset parameters
Direction: Host→Device
Request Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x46 | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | Mode Number (0-9, 0xFF means restore all including EQ params, overall gain, mode name)
6 | 1 | Checksum| Checksum
Response Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x46 | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | Status Code (0x00=Success, 0x01=Failure)
6 | 1 | Checksum| Checksum
Device Processing:
- Deletes the EQ parameter file stored in Flash for the specified mode.
- Deletes the gain and mode name Flash storage file.
- Restores the header file preset parameters for that mode.
- If mode number is 0xFF, resets all modes.
- Returns operation status.
USB HID format (command header 0x90):
Function: Reset EQ parameters for specified mode or all modes
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x90 |
| 3 | 1 | mode | Mode number (0-9, 0xFF = reset all modes) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x90 (echo) |
| 3 | 1 | status | Status code (0x00=success, 0x01=failure) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Get Total EQ Mode Count(GET_EQ_MODE_COUNT,UART 0x47 / HID 0x91)¶
UART serial format (command 0x47):
Function: Get the total number of predefined plus user modes (excluding disabled modes)
Direction: Host→Device
Request Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x47 | Command Code
4 | 1 | 0x00 | Data Length
5 | 1 | Checksum| Checksum
Response Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x57 | Command Code (Note: Matches Chinese doc which says 0x57 here, likely typo in doc but preserving)
4 | 1 | 0x02 | Data Length (2 bytes)
5 | 1 | uint8 | Total Modes (Currently 10, containing 0-9 total 10 modes)
6 | 1 | uint8 | Predefined Mode Count (Currently 7, containing 0-6 total 7 preset modes)
7 | 1 | Checksum| Checksum
USB HID format (command header 0x91):
Function: Get total EQ modes and preset mode count (excluding disabled modes)
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x91 |
| 3-63 | 61 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x91 (echo) |
| 3 | 1 | total | Total modes (e.g., 0-9 means 10 modes) |
| 4 | 1 | preset_total | Preset mode count (e.g., 0-6 means 7 presets) |
| 5-63 | 59 | reserved | Reserved fields (fill with 0) |
Set and Save EQ Mode(SET_AND_SAVE_EQ_MODE,UART 0x48 / HID 0x92)¶
UART serial format (command 0x48):
Function: Set current EQ mode and save to Flash, automatically restore on power-on
Direction: Host→Device
Data Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x48 | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | Mode Value (0-9: 0-6 presets, 7-9 user modes)
6 | 1 | Checksum| Checksum
Device Processing:
- Saves mode value to Flash.
- Automatically reads and restores this mode from Flash on power-on.
Response Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x48 | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | Status Code (0x00=Success, 0x01=Failure)
6 | 1 | Checksum| Checksum
USB HID format (command header 0x92):
Function: Set current EQ mode and save to Flash, automatically restored on power up
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x92 |
| 3 | 1 | mode | Mode value (0-6: preset modes, 7-9: user modes) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x92 (echo) |
| 3 | 1 | status | Status code (0x00=success, 0x01=failure) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Set Volume Level(SET_VOLUME,UART 0x49 / HID 0x93)【Disabled·Code Point Reserved】¶
UART serial format (command 0x49):
Function: Set device volume level
Direction: Host→Device
Data Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x49 | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | Volume Level (0-60: 0=Min, 60=Max)
6 | 1 | Checksum| Checksum
Parameter Description:
- Volume Level Range: 0-60 (Total 61 levels)
- Description: Controls device output volume level
- 0: Minimum Volume (approx -127.5dB)
- 60: Maximum Volume (0dB)
- Approximately 2dB attenuation change per level
Device Processing:
- Parameter will be automatically saved to Flash via existing periodic save mechanism.
- If parameter exceeds range (>60), firmware will reject setting and return false.
USB HID format (command header 0x93):
Function: Set device output volume level
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x93 |
| 3 | 1 | volume | Volume level (0-60) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Parameter Description:
- Volume level range: 0-60 (total 61 levels)
- 0: Minimum volume (approx -127.5dB)
- 60: Maximum volume (0dB)
- Approximately 2dB attenuation change per level
Device Processing: - Parameters are automatically saved to Flash via existing timed save mechanism - If parameter is out of range (>60), firmware will reject the setting and return false
Return Value: No direct return value. To confirm volume setting, use GET_VOLUME (0x94) command.
Get Volume Level(GET_VOLUME,UART 0x4A / HID 0x94)【Disabled·Code Point Reserved】¶
UART serial format (command 0x4A):
Function: Read device current volume level
Direction: Host→Device
Request Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x4A | Command Code
4 | 1 | 0x00 | Data Length
5 | 1 | Checksum| Checksum
Response Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x4A | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | Current Volume Level (0-60)
6 | 1 | Checksum| Checksum
USB HID format (command header 0x94):
Function: Read current device volume level
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x94 |
| 3-63 | 61 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x94 (echo) |
| 3 | 1 | volume | Current volume level (0-60) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Get LED Information(GET_LED_INFO,UART 0x4B / HID 0x95)【Disabled·Code Point Reserved】¶
UART serial format (command 0x4B):
Function: Read LED index and LED name
Direction: Host→Device
Request Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x4B | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | LED Index (0-7, current device only has 1 LED, index 0)
6 | 1 | Checksum| Checksum
Response Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x4B | Command Code
4 | 1 | 0x11 | Data Length (17 bytes)
5 | 1 | uint8 | LED Index (0-7)
6-21 | 16 | char | LED Name (UTF-8 encoded, 16 bytes)
22 | 1 | Checksum| Checksum
USB HID format (command header 0x95):
Function: Read LED index and LED name
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x95 |
| 3 | 1 | led_index | LED index (0-7) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x95 (echo) |
| 3 | 1 | led_index | LED index (0-7) |
| 4-19 | 16 | led_name | LED name (UTF-8 string) |
| 20-63 | 44 | reserved | Reserved fields (fill with 0) |
Set LED Switch(SET_LED_SWITCH,UART 0x4C / HID 0x96)【Disabled·Code Point Reserved】¶
UART serial format (command 0x4C):
Function: Set LED switch state
Direction: Host→Device
Data Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x4C | Command Code
4 | 1 | 0x02 | Data Length
5 | 1 | uint8 | LED Index (0-7, current device only has 1 LED, index 0)
6 | 1 | uint8 | LED Switch (0=OFF, 1=ON)
7 | 1 | Checksum| Checksum
Device Processing:
- When LED switch is OFF, all LED outputs are disabled, no LED is displayed.
- When LED switch is ON, LED displays normally.
Response Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x4C | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | Status Code (0x00=Success, 0x01=Failure)
6 | 1 | Checksum| Checksum
USB HID format (command header 0x96):
Function: Set LED switch status
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x96 |
| 3 | 1 | led_index | LED index (0-7) |
| 4 | 1 | onoff | LED switch (0=OFF, 1=ON) |
| 5-63 | 59 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x96 (echo) |
| 3 | 1 | status | Status code (0x00=success, 0x01=failure) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Get LED Switch(GET_LED_SWITCH,UART 0x4D / HID 0x97)【Disabled·Code Point Reserved】¶
UART serial format (command 0x4D):
Function: Read LED switch state
Direction: Host→Device
Request Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x4D | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | LED Index (0-7, current device only has 1 LED, index 0)
6 | 1 | Checksum| Checksum
Response Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x4D | Command Code
4 | 1 | 0x02 | Data Length
5 | 1 | uint8 | LED Index (0-7)
6 | 1 | uint8 | LED Switch (0=OFF, 1=ON)
7 | 1 | Checksum| Checksum
USB HID format (command header 0x97):
Function: Read LED switch status
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x97 |
| 3 | 1 | led_index | LED index (0-7) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x97 (echo) |
| 3 | 1 | led_index | LED index (0-7) |
| 4 | 1 | onoff | LED switch (0=OFF, 1=ON) |
| 5-63 | 59 | reserved | Reserved fields (fill with 0) |
Get LED Status(GET_LED_STATUS,UART 0x4E / HID 0x98)【Disabled·Code Point Reserved】¶
UART serial format (command 0x4E):
Function: Read LED RGB color and status
Direction: Host→Device
Request Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x4E | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | LED Index (0-7, current device only has 1 LED, index 0)
6 | 1 | Checksum| Checksum
Response Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x4E | Command Code
4 | 1 | 0x05 | Data Length
5 | 1 | uint8 | LED Index (0-7)
6 | 1 | uint8 | R Color Value (0-255)
7 | 1 | uint8 | G Color Value (0-255)
8 | 1 | uint8 | B Color Value (0-255)
9 | 1 | uint8 | LED Status (0=Off, 1=Solid, 2=Slow Blink, 3=Fast Blink, 4=Breathe)
10 | 1 | Checksum| Checksum
LED Status Enum:
- 0: LED_STATUS_OFF (Off)
- 1: LED_STATUS_SOLID (Solid On)
- 2: LED_STATUS_SLOW_BLINK (Slow Blink)
- 3: LED_STATUS_FAST_BLINK (Fast Blink)
- 4: LED_STATUS_BREATHE (Breathe)
Note:
- RGB color values are converted based on current LED color definition (active low).
- LED status is determined based on current LED display mode (solid/blink).
USB HID format (command header 0x98):
Function: Read LED RGB color and display status
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x98 |
| 3 | 1 | led_index | LED index (0-7) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x98 (echo) |
| 3 | 1 | led_index | LED index (0-7) |
| 4 | 1 | r | R color value (0-255) |
| 5 | 1 | g | G color value (0-255) |
| 6 | 1 | b | B color value (0-255) |
| 7 | 1 | led_status | LED status (0=Off, 1=Solid, 2=Slow Flash, 3=Fast Flash, 4=Breathing) |
| 8-63 | 56 | reserved | Reserved fields (fill with 0) |
LED Status Enumeration: - 0: LED_STATUS_OFF (Off) - 1: LED_STATUS_SOLID (Solid) - 2: LED_STATUS_SLOW_BLINK (Slow Flash) - 3: LED_STATUS_FAST_BLINK (Fast Flash) - 4: LED_STATUS_BREATHE (Breathing)
Note
- RGB color values are based on current LED color definition conversion (active low)
- LED status is based on current LED display mode (solid/blinking) judgment
Get LED Count(GET_LED_COUNT,UART 0x4F / HID 0x99)【Disabled·Code Point Reserved】¶
UART serial format (command 0x4F):
Function: Read total number of LEDs supported by device
Direction: Host→Device
Request Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x4F | Command Code
4 | 1 | 0x00 | Data Length
5 | 1 | Checksum| Checksum
Response Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x4F | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | Total LEDs (Current device is 1)
6 | 1 | Checksum| Checksum
Device Processing:
- Returns total number of LEDs supported by device.
- Current device only has 1 LED, so returns 1.
- LED index range is 0 to (Total LEDs - 1).
USB HID format (command header 0x99):
Function: Read total number of LEDs supported by device
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x99 |
| 3-63 | 61 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x99 (echo) |
| 3 | 1 | led_total | Total LEDs |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Get UAC Mode Information(GET_UAC_MODE_INFO,UART 0x50 / HID 0x9A)【Disabled·Code Point Reserved】¶
UART serial format (command 0x50):
Function: Read UAC mode count and mode name list
Direction: Host→Device
Request Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x50 | Command Code
4 | 1 | 0x00 | Data Length
5 | 1 | Checksum| Checksum
Response Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x50 | Command Code
4 | 1 | 0x11 | Data Length (17 bytes)
5 | 1 | uint8 | Total UAC Modes (Currently 2, containing UAC1.0 and UAC2.0)
6-13 | 8 | char | Mode 0 Name (UTF-8, 8 bytes, e.g., "UAC2.0")
14-21 | 8 | char | Mode 1 Name (UTF-8, 8 bytes, e.g., "UAC1.0")
22 | 1 | Checksum| Checksum
Device Processing:
- Returns total UAC modes (currently 2).
- Returns name for each mode (max 8 chars).
- Mode 0 corresponds to UAC2.0, Mode 1 corresponds to UAC1.0.
USB HID format (command header 0x9A):
Function: Read UAC mode count and name list
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x9A |
| 3-63 | 61 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x9A (echo) |
| 3 | 1 | count | Total UAC modes (e.g., 2) |
| 4-11 | 8 | name0 | Mode 0 name (UTF-8, max 8 bytes) |
| 12-19 | 8 | name1 | Mode 1 name (UTF-8, max 8 bytes) |
| 20-63 | 44 | reserved | Reserved fields (fill with 0) |
Set UAC Mode(SET_UAC_MODE,UART 0x51 / HID 0x9B)【Disabled·Code Point Reserved】¶
UART serial format (command 0x51):
Function: Set UAC mode (UAC1.0 or UAC2.0)
Direction: Host→Device
Data Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x51 | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | UAC Mode Value (0=UAC2.0, 1=UAC1.0)
6 | 1 | Checksum| Checksum
Device Processing:
- Sets UAC mode and reboots device.
- Note: Device will not return a response after reboot.
USB HID format (command header 0x9B):
Function: Set UAC mode (UAC1.0/UAC2.0)
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x9B |
| 3 | 1 | uac_mode | UAC mode value (0=UAC2.0, 1=UAC1.0) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Device Processing:
- Note: Device will not send response after reboot
Get Current UAC Mode(GET_CURRENT_UAC_MODE,UART 0x52 / HID 0x9C)【Disabled·Code Point Reserved】¶
UART serial format (command 0x52):
Function: Read current UAC mode
Direction: Host→Device
Request Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x52 | Command Code
4 | 1 | 0x00 | Data Length
5 | 1 | Checksum| Checksum
Response Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x52 | Command Code
4 | 1 | 0x09 | Data Length (9 bytes)
5 | 1 | uint8 | Current UAC Mode Value (0=UAC2.0, 1=UAC1.0)
6-13 | 8 | char | Current UAC Mode Name (UTF-8, 8 bytes, e.g., "UAC2.0" or "UAC1.0")
14 | 1 | Checksum| Checksum
Device Processing:
- Returns current UAC mode name (max 8 chars).
USB HID format (command header 0x9C):
Function: Read current UAC mode and name
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x9C |
| 3-63 | 61 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x9C (echo) |
| 3 | 1 | uac_mode | Current UAC mode (0=UAC2.0, 1=UAC1.0) |
| 4-11 | 8 | name | Current mode name (UTF-8, max 8 bytes) |
| 12-63 | 52 | reserved | Reserved fields (fill with 0) |
Set EQ Enable Switch(SET_EQ_ENABLE,UART 0x53 / HID 0x9D)¶
UART serial format (command 0x53):
Function: Set EQ enable switch (Enable/Disable)
Direction: Host→Device
Data Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x53 | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | EQ Enable Switch (0=OFF Disable, 1=ON Enable)
6 | 1 | Checksum| Checksum
Device Processing:
- Only saves EQ enable status to Flash (independent file storage), does not affect saved modes.
Response Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x53 | Command Code
4 | 1 | 0x02 | Data Length
5 | 1 | uint8 | Status Code (0x00=Success, 0x01=Failure)
6 | 1 | uint8 | Current EQ Enable Status (0=OFF, 1=ON)
7 | 1 | Checksum| Checksum
USB HID format (command header 0x9D):
Function: Set EQ enable switch (enable/disable)
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x9D |
| 3 | 1 | enable | EQ enable switch (0=OFF, 1=ON) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x9D (echo) |
| 3 | 1 | status | Status code (0x00=success, 0x01=failure) |
| 4 | 1 | enable | Current EQ enable status (0=OFF, 1=ON) |
| 5-63 | 59 | reserved | Reserved fields (fill with 0) |
Get EQ Enable Switch(GET_EQ_ENABLE,UART 0x54 / HID 0x9E)¶
UART serial format (command 0x54):
Function: Read EQ enable switch status
Direction: Host→Device
Request Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x54 | Command Code
4 | 1 | 0x00 | Data Length
5 | 1 | Checksum| Checksum
Response Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x54 | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | EQ Enable Switch Status (0=OFF Disable, 1=ON Enable)
6 | 1 | Checksum| Checksum
Device Processing:
- Returns current EQ enable switch status (0=OFF, 1=ON).
USB HID format (command header 0x9E):
Function: Read current EQ enable status
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x9E |
| 3-63 | 61 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x9E (echo) |
| 3 | 1 | enable | Current EQ enable status (0=OFF, 1=ON) |
| 4 | 1 | saved_mode | Saved mode value (0-9, 0xFF = not saved) |
| 5-63 | 59 | reserved | Reserved fields (fill with 0) |
Get Sample Rate and Format(GET_SAMPLE_FORMAT,UART 0x55 / HID 0x9F)¶
UART serial format (command 0x55):
Function: Read current sample rate and DSD mode
Direction: Host→Device
Request Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x55 | Command Code
4 | 1 | 0x00 | Data Length
5 | 1 | Checksum| Checksum
Response Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x55 | Command Code
4 | 1 | 0x05 | Data Length (5 bytes)
5-8 | 4 | uint32 | Sample Rate (samFreq, Little Endian, Unit: Hz)
9 | 1 | uint8 | DSD Mode (dsdMode: 0=PCM, 1=DOP, 2=Native DSD)
10 | 1 | Checksum| Checksum
Device Processing:
- Returns current sample rate (32-bit unsigned integer, Little Endian, Unit: Hz).
- Returns DSD mode (0 means PCM format, >0 means DSD format).
- Device will automatically report this information when sample rate or DSD mode changes (proactively sent via UART).
Auto-Report Mechanism:
- Device monitors sample rate and DSD mode changes.
- When these values change, device automatically constructs 0x55 response packet and sends via UART.
USB HID format (command header 0x9F):
Function: Read current sampling rate, DSD mode, and DAC sampling resolution
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x9F |
| 3-63 | 61 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x9F (echo) |
| 3-6 | 4 | sample_rate | Sampling rate (uint32, little endian, unit: Hz) |
| 7 | 1 | dsd_mode | DSD mode (0=PCM, 1=DOP, 2=Native DSD) |
| 8-62 | 55 | reserved | Reserved fields (fill with 0) |
Auto-Report Mechanism: - Device monitors changes in sampling rate and DSD mode - When these values change, device automatically constructs 0x9F response packet and reports via HID status report - Host can receive these auto-reported status changes via HID GET_REPORT
Set Gain Mode(SET_GAIN_MODE,UART 0x56 / HID 0xA0)【Disabled·Code Point Reserved】¶
UART serial format (command 0x56):
Function: Set gain mode
Direction: Host→Device
Data Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x56 | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | Gain Mode Value (0=Low Impedance, 1=High Impedance)
6 | 1 | Checksum| Checksum
Parameter Description:
- Gain Mode Range: 0-1
- Description: Controls device gain level
- 0: Low Impedance Mode (Suitable for high sensitivity headphones)
- 1: High Impedance Mode (Suitable for high impedance headphones)
Device Processing:
- Parameter will be automatically saved to Flash via existing periodic save mechanism.
USB HID format (command header 0xA0):
Function: Set gain mode (low impedance/high impedance)
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xA0 |
| 3 | 1 | gain_mode | Gain mode (0=Low Impedance, 1=High Impedance) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Parameter Description: - 0: Low impedance mode (suitable for high sensitivity headphones) - 1: High impedance mode (suitable for high impedance headphones)
Return Value: No direct return value. To confirm gain mode setting, use GET_GAIN_MODE (0xA1) command.
Get Gain Mode(GET_GAIN_MODE,UART 0x57 / HID 0xA1)【Disabled·Code Point Reserved】¶
UART serial format (command 0x57):
Function: Read device current gain mode
Direction: Host→Device
Request Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x57 | Command Code
4 | 1 | 0x00 | Data Length
5 | 1 | Checksum| Checksum
Response Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x57 | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | Current Gain Mode (0=Low Impedance, 1=High Impedance)
6 | 1 | Checksum| Checksum
USB HID format (command header 0xA1):
Function: Read current device gain mode
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xA1 |
| 3-63 | 61 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xA1 (echo) |
| 3 | 1 | gain_mode | Current gain mode (0=Low Impedance, 1=High Impedance) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Set Filter Mode(SET_FILTER_MODE,UART 0x58 / HID 0xA2)【Disabled·Code Point Reserved】¶
UART serial format (command 0x58):
Function: Set filter mode
Direction: Host→Device
Data Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x58 | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | Filter Mode Value (0-7: 8 filter modes)
6 | 1 | Checksum| Checksum
Parameter Description:
- Filter Mode Range: 0-7 (Total 8 modes)
- Description: Select DAC digital filter type
- 0: Minimum Phase filter (default)
- 1: Linear Phase Apodizing Fast Roll-off filter
- 2: Linear phase fast roll-off filter
- 3: Linear Phase Fast Roll-off low-ripple filter
- 4: Linear phase slow roll-off filter
- 5: Minimum phase fast roll-off filter
- 6: Minimum phase slow roll-off filter
- 7: Minimum Phase Fast Roll-Off Low Dispersion
Device Processing:
- Parameter will be automatically saved to Flash via existing periodic save mechanism.
- If parameter exceeds range (>7), firmware will reject setting and return false.
USB HID format (command header 0xA2):
Function: Set DAC digital filter mode
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xA2 |
| 3 | 1 | filter_mode | Filter mode value (0-7) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Filter Mode Definitions: - 0: Minimum Phase filter (default) - 1: Linear Phase Apodizing Fast Roll-off filter - 2: Linear phase fast roll-off filter - 3: Linear Phase Fast Roll-off low-ripple filter - 4: Linear phase slow roll-off filter - 5: Minimum phase fast roll-off filter - 6: Minimum phase slow roll-off filter - 7: Minimum Phase Fast Roll-Off Low Dispersion
Return Value: No direct return value. To confirm filter mode setting, use GET_FILTER_MODE (0xA3) command.
Get Filter Mode(GET_FILTER_MODE,UART 0x59 / HID 0xA3)【Disabled·Code Point Reserved】¶
UART serial format (command 0x59):
Function: Read device current filter mode
Direction: Host→Device
Request Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x59 | Command Code
4 | 1 | 0x00 | Data Length
5 | 1 | Checksum| Checksum
Response Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x59 | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | Current Filter Mode (0-7)
6 | 1 | Checksum| Checksum
USB HID format (command header 0xA3):
Function: Read current device filter mode
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xA3 |
| 3-63 | 61 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xA3 (echo) |
| 3 | 1 | filter_mode | Current filter mode (0-7) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Set Game Mode(SET_GAME_MODE,UART 0x5A / HID 0xA4)【Disabled·Code Point Reserved】¶
UART serial format (command 0x5A):
Function: Set game mode
Direction: Host→Device
Data Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x5A | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | Game Mode Value (0=No effect, 1=FPS, 2=Virtual 7.1)
6 | 1 | Checksum| Checksum
Parameter Description:
- Game Mode Range: 0-2
- Description: Select game audio effect mode
- 0: No effect (Standard Stereo)
- 1: FPS Mode (Enhanced Positioning)
- 2: Virtual 7.1 (Surround Sound Effect)
Device Processing:
- Parameter will be automatically saved to Flash via existing periodic save mechanism.
- If parameter exceeds range (>2), firmware will reject setting and return false.
USB HID format (command header 0xA4):
Function: Set game audio mode
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xA4 |
| 3 | 1 | game_mode | Game mode (0=No effect, 1=FPS, 2=Virtual 7.1) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Game Mode Definitions: - 0: No effect (standard stereo) - 1: FPS mode (enhanced positioning) - 2: Virtual 7.1 (surround sound effect)
Return Value: No direct return value. To confirm game mode setting, use GET_GAME_MODE (0xA5) command.
Get Game Mode(GET_GAME_MODE,UART 0x5B / HID 0xA5)【Disabled·Code Point Reserved】¶
UART serial format (command 0x5B):
Function: Read device current game mode
Direction: Host→Device
Request Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x5B | Command Code
4 | 1 | 0x00 | Data Length
5 | 1 | Checksum| Checksum
Response Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x5B | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | Current Game Mode (0=No effect, 1=FPS, 2=Virtual 7.1)
6 | 1 | Checksum| Checksum
USB HID format (command header 0xA5):
Function: Read current device game mode
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xA5 |
| 3-63 | 61 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xA5 (echo) |
| 3 | 1 | game_mode | Current game mode (0=No effect, 1=FPS, 2=Virtual 7.1) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Get Firmware Version(GET_FIRMWARE_VERSION,UART 0x5C / HID 0xA6)¶
UART serial format (command 0x5C):
Function: Read device firmware version number
Direction: Host→Device
Request Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x5C | Command Code
4 | 1 | 0x00 | Data Length
5 | 1 | Checksum| Checksum
Response Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x5C | Command Code
4 | 1 | 0x03 | Data Length (3 bytes)
5 | 1 | uint8 | Major Version (BCD, e.g., 0x01 means 1)
6 | 1 | uint8 | Minor Version (BCD, e.g., 0x00 means 0)
7 | 1 | uint8 | Revision Version (BCD, e.g., 0x0C means 12)
8 | 1 | Checksum| Checksum
Version Number Format:
- Version number uses BCD (Binary Coded Decimal) format.
- 3 bytes represent: Major Version, Minor Version, Revision Version.
- Example: 0x01 0x00 0x0C means version 1.0.12.
USB HID format (command header 0xA6):
Function: Read device firmware version (BCD format)
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xA6 |
| 3-63 | 61 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xA6 (echo) |
| 3 | 1 | major | Major version (BCD format) |
| 4 | 1 | minor | Minor version (BCD format) |
| 5 | 1 | patch | Patch version (BCD format) |
| 6-63 | 58 | reserved | Reserved fields (fill with 0) |
Version Format Description: - Version uses BCD (Binary Coded Decimal) format - 3 bytes represent: major version, minor version, patch version - Example: 0x01 0x00 0x0C represents version 1.0.12
Set EQ Band Count(SET_EQ_BAND_COUNT,UART 0x5D / HID 0xB3)¶
UART serial format (command 0x5D):
Function: Set EQ band count and save to Flash, controlling the number of DSP cores participating in EQ processing
Direction: MCU→XU316
Request Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x5D | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | EQ Band Count (8/16/24/32)
6 | 1 | Checksum| Checksum
Response Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x5D | Command Code
4 | 1 | 0x02 | Data Length
5 | 1 | uint8 | Status Code (0x00=Success, 0x01=Failure)
6 | 1 | uint8 | Current EQ Band Count (read back actual effective value)
7 | 1 | Checksum| Checksum
Parameter Description:
- Band Count Values: Only 8, 16, 24, and 32 are supported; other values are rejected by XU316.
- Processing Resource Mapping:
- 8 bands: 1 DSP core participates in processing
- 16 bands: 2 DSP cores participate in processing
- 24 bands: 3 DSP cores participate in processing
- 32 bands: All 4 DSP cores participate in processing (default)
XU316 Processing:
- Validates band count value (only 8/16/24/32 accepted; invalid values return failure status).
- Switches the number of DSP cores participating in EQ processing.
- Band count setting is saved to Flash and automatically restored on power-on.
- The "Current EQ Band Count" in the response is the read-back actual effective value for MCU confirmation.
Relation to Parameter Storage:
- Switching band count does not delete stored filter parameters.
- When switching from a high to a low band count, Band parameters beyond the current count are retained but do not participate in processing; they automatically take effect again when switching back to a higher count.
Response Example:
MCU Send Example:
Field Breakdown (Send)
| Field | Length | Example Value | Description |
|---|---|---|---|
| Frame Header | 2 bytes | 55 AA | Fixed frame header, marks the start of a protocol frame |
| Version | 1 byte | 00 | Protocol version number, fixed to 0x00 in this protocol |
| Command | 1 byte | 5D | "Set EQ Band Count" command |
| Data Length | 1 byte | 01 | 1 byte of data follows |
| EQ Band Count | 1 byte | 10 | Hex 0x10, i.e. decimal 16; set to 16 bands (2 DSP cores participate in processing) |
| Checksum | 1 byte | 6D | Sum of all bytes from 55 through the band count, modulo 256 |
Field Breakdown (Response)
| Byte Segment | Length | Example | Description |
|---|---|---|---|
| Frame Header | 2 bytes | 55 AA | Fixed frame header indicating start of a protocol frame |
| Version | 1 byte | 00 | Protocol version, fixed to 0x00 in this protocol |
| Command | 1 byte | 5D | Response for the "Set EQ Band Count" command |
| Data Length | 1 byte | 02 | 2 data bytes follow |
| Status Code | 1 byte | 00 | 0x00 indicates success (only 8/16/24/32 accepted; invalid values return failure) |
| Current EQ Band Count | 1 byte | 10 | Read-back actual effective value: 16 bands |
| Checksum | 1 byte | 6E | Sum of all bytes from 55 to the band count byte, modulo 256 |
USB HID format (command header 0xB3):
Function: Set EQ band count, supports dynamic switching among 8/16/24/32 bands, controls number of DSP cores participating in processing
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB3 |
| 3 | 1 | band_count | EQ band count (8/16/24/32) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
EQ Band Count Definitions: - 8: Only Core0 participates in processing - 16: Core0 + Core1 participate in processing - 24: Core0 + Core1 + Core2 participate in processing - 32: All 4 cores participate in processing
Device Processing: - Only accepts 8, 16, 24, 32; other values are rejected - Saved to Flash (independent file eq_band_cnt), restored on power-up - After setting, triggers parameter sync to tile1, cores on tile1 not participating in processing bypass audio
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB3 (echo) |
| 3 | 1 | status | Status code (0x00=success, 0x01=failure) |
| 4 | 1 | band_count | Current EQ band count (8/16/24/32) |
| 5-63 | 59 | reserved | Reserved fields (fill with 0) |
Note: HID headers from 0xA7 onward are used for firmware upgrade; band count commands use 0xB3/0xB4 and do not follow the +0x4A mapping.
Get EQ Band Count(GET_EQ_BAND_COUNT,UART 0x5E / HID 0xB4)¶
UART serial format (command 0x5E):
Function: Read XU316 current EQ band count
Direction: MCU→XU316
Request Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x5E | Command Code
4 | 1 | 0x00 | Data Length
5 | 1 | Checksum| Checksum
Response Packet Format:
Byte Pos | Length | Content | Description
---------|--------|---------|------
0 | 1 | 0x55 | Header 1
1 | 1 | 0xAA | Header 2
2 | 1 | 0x00 | Version
3 | 1 | 0x5E | Command Code
4 | 1 | 0x01 | Data Length
5 | 1 | uint8 | Current EQ Band Count (8/16/24/32, default 32)
6 | 1 | Checksum| Checksum
Function Description:
- Returns the currently effective EQ band count (8/16/24/32, default 32)
MCU Send Example:
| Byte Segment | Length | Example | Description |
|---|---|---|---|
| Frame Header | 2 bytes | 55 AA | Fixed frame header indicating start of a protocol frame |
| Version | 1 byte | 00 | Protocol version, fixed to 0x00 in this protocol |
| Command | 1 byte | 5E | Current command is "Get EQ Band Count" |
| Data Length | 1 byte | 00 | This command carries no data |
| Checksum | 1 byte | 5D | Sum of all bytes from 55 to the data length byte, modulo 256 |
XU316 Response Example:
| Byte Segment | Length | Example | Description |
|---|---|---|---|
| Frame Header | 2 bytes | 55 AA | Fixed frame header indicating start of a protocol frame |
| Version | 1 byte | 00 | Protocol version, fixed to 0x00 in this protocol |
| Command | 1 byte | 5E | Response for the "Get EQ Band Count" command |
| Data Length | 1 byte | 01 | 1 data byte follows |
| Current EQ Band Count | 1 byte | 20 | Hex 0x20 = decimal 32, indicating 32 bands (default) |
| Checksum | 1 byte | 7E | Sum of all bytes from 55 to the band count byte, modulo 256 |
USB HID format (command header 0xB4):
Function: Read current EQ band count
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB4 |
| 3-63 | 61 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB4 (echo) |
| 3 | 1 | band_count | Current EQ band count (8/16/24/32) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Preset Mode Definitions¶
| Mode Index | Mode Name | Purpose | Type |
|---|---|---|---|
| 0 | JAZZ | Optimized for jazz | Preset |
| 1 | POP | Optimized for pop | Preset |
| 2 | ROCK | Optimized for rock | Preset |
| 3 | CLASSIC | Optimized for classical | Preset |
| 4 | R&B | Optimized for rhythm music | Preset |
| 5 | 3A Game | Optimized for 3A games | Preset |
| 6 | FPS | Optimized for FPS games | Preset |
| 7 | User 1 | User-defined mode 1 | User |
| 8 | User 2 | User-defined mode 2 | User |
| 9 | User 3 | User-defined mode 3 | User |
Mode Characteristics
- Preset modes: factory presets, cannot be modified, optimized for specific music types
- User modes: support custom parameters, can be saved and reset
Parameter Constraints¶
Protocol Limitations and Constraints
Hardware limitations
- Filter band count: supports 8/16/24/32 (set via 0x5D, query via 0x5E; saved to Flash and restored on power-on, default 32 = all 4 DSP cores participating; only these four values are accepted, invalid values are rejected)
- Mode count: 10 modes, 0-9 (modes 0-6 preset, 7-9 user; filter states are automatically cleared on mode switching)
- Sample rate support: 44.1kHz, 48kHz, 88.2kHz, 96kHz, 176.4kHz, 192kHz (device capability, independent of protocol fields)
Parameter ranges
| Parameter | Range | Format |
|---|---|---|
| Center frequency (freq) | 20Hz - 20kHz | float (little-endian) |
| Q value (q) | 0.1 - 30.0 | float (little-endian) |
| Bandwidth (bw) | 1Hz - 20kHz | float (little-endian) |
| Gain (gain) | -24dB - +24dB | float (little-endian) |
| Overall gain (mode gain) | -50dB - 0dB | int32 (little-endian) |
Mode Switching Flow¶
- Send SET_EQ_MODE to switch mode (UART 0x40 / HID 0x8A)
- Device updates internal mode state
- Send GET_EQ_MODE to confirm (UART 0x41 / HID 0x8B)
- Device responds with current mode state
Parameter Setting Flow¶
- Send SET_EQ_MODE to switch to the target mode (UART 0x40 / HID 0x8A)
- Send the 8 filter parameter commands one by one (UART 0x43 / HID 0x8D)
- Device receives and updates internal parameter cache
- Optional: send GET_EQ_PARAMS to verify (UART 0x44 / HID 0x8E)
Parameter Reading Flow¶
- Send SET_EQ_MODE to switch to the target mode (UART 0x40 / HID 0x8A)
- Send the GET_EQ_PARAMS request (UART 0x44 / HID 0x8E)
- Device prepares response data
- Read the response
Notes
- Timing: wait for the device to finish processing before sending the next command (5ms+ interval recommended)
- Data integrity: parameters of all filters within the currently effective band count must be sent, even if some filters are unused (band count is managed and queried via 0x5D/0x5E, default 32)
- Mode sync: after setting a mode, read it back to ensure synchronization
- Parameter validation: overall gain (0x42) accepts -50 to 0 dB, out-of-range values are clamped to the boundary then stored; filter parameters (0x43) are validity-checked only — any NaN/Inf parameter or zero center frequency causes the whole frame to be rejected (status code 0x01); EQ band count (0x5D) accepts only 8/16/24/32
- Device-side coefficient calculation: the host only sends parameters (freq/q/bw/gain); XU316 calculates filter coefficients in real time (with dynamic bshift calculation to ensure coefficient precision)
- Checksum: every command must carry a correct checksum — the low 8 bits of the sum of all bytes from frame header to end of data
4.4 HID Device Control Commands¶
| Command Header | Name | Function | Applicability Notes |
|---|---|---|---|
| 0xA7 | FIRMWARE_UPGRADE_START | Start firmware upgrade | |
| 0xA8 | FIRMWARE_UPGRADE_DATA | Transmit firmware data block | 57 bytes per block |
| 0xA9 | FIRMWARE_UPGRADE_END | End firmware upgrade | Device verifies image integrity |
| 0xAA | FIRMWARE_UPGRADE_STATUS | Get upgrade status | |
| 0xAB | FIRMWARE_UPGRADE_ABORT | Abort firmware upgrade | |
| 0xAC | FIRMWARE_UPGRADE_ERASE | Erase upgrade image | |
| 0xAE | DEVICE_REBOOT | Device reboot | No response |
| 0xB3 | SET_EQ_BAND_COUNT | Set EQ band count | 8/16/24/32 bands, saved to Flash |
| 0xB4 | GET_EQ_BAND_COUNT | Get EQ band count | |
| 0x80 | SET_UPSAMPLE | Set sample rate upsampling | 0=disable 1=enable |
| 0x81 | GET_UPSAMPLE | Get upsampling status | |
| 0xB0 | SET_EX3D_CMD | Send EX3D set command | VID 0x20B1/PID 0x80D3 only |
| 0xB1 | GET_EX3D_CMD | Read EX3D command | VID 0x20B1/PID 0x80D3 only |
Set Sample Rate Upsampling SET_UPSAMPLE (0x80)¶
Function: Set device sampling rate upsampling switch
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x80 |
| 3 | 1 | upsample | Upsample status (0=Disable, 1=Enable) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Parameter Description: - Upsample status: 0=Disable upsampling, 1=Enable upsampling
Return Value: No direct return value. To confirm upsampling status, use GET_UPSAMPLE (0x81).
Get Upsampling Status GET_UPSAMPLE (0x81)¶
Function: Read device current sampling rate upsampling status
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x81 |
| 3-63 | 61 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0x81 (echo) |
| 3 | 1 | upsample | Current upsample status (0=Disabled, 1=Enabled) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Start Firmware Upgrade FIRMWARE_UPGRADE_START (0xA7)¶
Function: Start firmware upgrade process, send firmware size and get upgrade parameters
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xA7 |
| 3-6 | 4 | fw_size | Firmware size (bytes, uint32, little endian) |
| 7-63 | 57 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes) (Auto-report):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | sync_header | Sync header: 0x77 |
| 1 | 1 | cmd_header | Command header: 0xA7 |
| 2 | 1 | status | Status code (0x00=success, 0x01=failure, 0x03=invalid size) |
| 3-6 | 4 | aligned_size | Page-aligned actual size (uint32, little endian) |
| 7-8 | 2 | total_blocks | Total blocks (uint16, little endian) |
| 9-63 | 55 | reserved | Reserved fields (fill with 0) |
Transmit Firmware Data Block FIRMWARE_UPGRADE_DATA (0xA8)¶
Function: Transfer firmware data block, 57 bytes per block
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | sync_header | Sync header: 0x77 |
| 1 | 1 | cmd_header | Command header: 0xA8 |
| 2-3 | 2 | block_num | Block number (starting from 0, uint16, little endian) |
| 4 | 1 | data_len | Data length (fixed 57) |
| 5-61 | 57 | data | Firmware data (57 bytes) |
| 62 | 1 | checksum | Checksum (sum of bytes 0-61 mod 256) |
Response Format (64 bytes) (Auto-report):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | sync_header | Sync header: 0x77 |
| 1 | 1 | cmd_header | Command header: 0xA8 |
| 2 | 1 | status | Status code (0x00=success, 0x04=block number error, 0x05=checksum error) |
| 3-4 | 2 | ack_block | Acknowledged block number (uint16, little endian) |
| 5-63 | 59 | reserved | Reserved fields (fill with 0) |
End Firmware Upgrade FIRMWARE_UPGRADE_END (0xA9)¶
Function: Complete firmware transfer, verify image integrity
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | sync_header | Sync header: 0x77 |
| 1 | 1 | cmd_header | Command header: 0xA9 |
| 2-5 | 4 | fw_size | Total firmware size (for verification, uint32, little endian) |
| 6-63 | 58 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes) (Auto-report):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | sync_header | Sync header: 0x77 |
| 1 | 1 | cmd_header | Command header: 0xA9 |
| 2 | 1 | status | Status code (0x00=success, 0x01=failure) |
| 3-63 | 61 | reserved | Reserved fields (fill with 0) |
Get Upgrade Status FIRMWARE_UPGRADE_STATUS (0xAA)¶
Function: Query upgrade status, progress, received blocks, total blocks, etc.
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | sync_header | Sync header: 0x77 |
| 1 | 1 | cmd_header | Command header: 0xAA |
| 2-63 | 62 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes) (Auto-report):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | sync_header | Sync header: 0x77 |
| 1 | 1 | cmd_header | Command header: 0xAA |
| 2 | 1 | status | Upgrade status (0=Idle, 1=Preparing, 2=Transferring, 3=Finalizing, 4=Completed, 5=Error, 6=Aborted) |
| 3-4 | 2 | received_blocks | Received blocks (uint16, little endian) |
| 5-6 | 2 | total_blocks | Total blocks (uint16, little endian) |
| 7-8 | 2 | written_pages | Written pages (uint16, little endian) |
| 9-10 | 2 | total_pages | Total pages (uint16, little endian) |
| 11-14 | 4 | received_bytes | Transferred bytes (uint32, little endian) |
| 15-18 | 4 | total_bytes | Total bytes (uint32, little endian) |
| 19 | 1 | error_code | Error code |
| 20-63 | 44 | reserved | Reserved fields (fill with 0) |
Upgrade Status Enumeration: - 0: IDLE (Idle) - 1: PREPARING (Preparing) - 2: TRANSFERRING (Transferring) - 3: FINALIZING (Finalizing) - 4: COMPLETED (Completed) - 5: ERROR (Error) - 6: ABORTED (Aborted)
Abort Firmware Upgrade FIRMWARE_UPGRADE_ABORT (0xAB)¶
Function: Abort current upgrade process, optionally erase transferred data
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | sync_header | Sync header: 0x77 |
| 1 | 1 | cmd_header | Command header: 0xAB |
| 2 | 1 | erase_flag | Erase flag (0x00=keep data, 0x01=erase data) |
| 3-63 | 61 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes) (Auto-report):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | sync_header | Sync header: 0x77 |
| 1 | 1 | cmd_header | Command header: 0xAB |
| 2 | 1 | status | Status code (0x00=success) |
| 3-63 | 61 | reserved | Reserved fields (fill with 0) |
Erase Upgrade Image FIRMWARE_UPGRADE_ERASE (0xAC)¶
Function: Erase existing upgrade image in Flash
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | sync_header | Sync header: 0x77 |
| 1 | 1 | cmd_header | Command header: 0xAC |
| 2-63 | 62 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes) (Auto-report):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | sync_header | Sync header: 0x77 |
| 1 | 1 | cmd_header | Command header: 0xAC |
| 2 | 1 | status | Status code (0x00=success) |
| 3-63 | 61 | reserved | Reserved fields (fill with 0) |
Device Reboot DEVICE_REBOOT (0xAE)¶
Function: Reboot device immediately
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | sync_header | Sync header: 0x77 |
| 1 | 1 | cmd_header | Command header: 0xAE |
| 2-63 | 62 | reserved | Reserved fields (fill with 0) |
Response: No response, device reboots immediately.
Set EQ Band Count SET_EQ_BAND_COUNT (0xB3)¶
Function: Set EQ band count, supports dynamic switching among 8/16/24/32 bands, controls number of DSP cores participating in processing
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB3 |
| 3 | 1 | band_count | EQ band count (8/16/24/32) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
EQ Band Count Definitions: - 8: Only Core0 participates in processing - 16: Core0 + Core1 participate in processing - 24: Core0 + Core1 + Core2 participate in processing - 32: All 4 cores participate in processing
Device Processing: - Only accepts 8, 16, 24, 32; other values are rejected - Saved to Flash (independent file eq_band_cnt), restored on power-up - After setting, triggers parameter sync to tile1, cores on tile1 not participating in processing bypass audio
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB3 (echo) |
| 3 | 1 | status | Status code (0x00=success, 0x01=failure) |
| 4 | 1 | band_count | Current EQ band count (8/16/24/32) |
| 5-63 | 59 | reserved | Reserved fields (fill with 0) |
Get EQ Band Count GET_EQ_BAND_COUNT (0xB4)¶
Function: Read current EQ band count
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB4 |
| 3-63 | 61 | reserved | Reserved fields (fill with 0) |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB4 (echo) |
| 3 | 1 | band_count | Current EQ band count (8/16/24/32) |
| 4-63 | 60 | reserved | Reserved fields (fill with 0) |
Send EX3D Set Command SET_EX3D_CMD (0xB0)¶
Function: Send EX3D setting command, encapsulates all EX3D SET commands for spatial audio parameter configuration
Applicable Devices: VID 0x20B1, PID 0x80D3 (V7.1 spatial audio dedicated devices)
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB0 |
| 3-6 | 4 | ex3d_cmd | EX3D command code (SET format) |
| 7-10 | 4 | param1 | int32 Parameter 1 (varies by command) |
| 11-14 | 4 | param2 | int32 Parameter 2 (varies by command) |
| 15-18 | 4 | param3 | int32 Parameter 3 (varies by command) |
| 19-63 | 45 | reserved | Reserved fields (fill with 0) |
Supported EX3D SET Commands:
| EX3D Command Code | Command Name | Function Description |
|---|---|---|
| 0x84 | CMD_SOUND_FIELD | Set sound field mode |
| 0x87 | CMD_LMT_THRESHOLD | Set gunshot threshold |
| 0x93 | CMD_EXPAND_GAIN | Set footstep gain |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB0 (echo) |
| 3 | 1 | status | Status code (0x00=success, 0x01=failure) |
| 4-7 | 4 | ex3d_cmd | EX3D command code (echo) |
| 8-11 | 4 | retval | Return value (0xFFFFFFFF indicates parameter error) |
| 12-63 | 52 | reserved | Reserved fields (fill with 0) |
Read EX3D Command GET_EX3D_CMD (0xB1)¶
Function: Read EX3D parameters, encapsulates all EX3D GET commands for spatial audio parameter reading
Applicable Devices: VID 0x20B1, PID 0x80D3 (V7.1 spatial audio dedicated devices)
Request Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB1 |
| 3-6 | 4 | ex3d_cmd | EX3D command code (GET format) |
| 7-10 | 4 | param1 | uint32 Parameter 1 (channel number, index, etc.) |
| 11-63 | 53 | reserved | Reserved fields (fill with 0) |
Supported EX3D GET Commands:
| EX3D Command Code | Command Name | Function Description |
|---|---|---|
| 0x184 | CMD_SOUND_FIELD | Get sound field mode |
| 0x187 | CMD_LMT_THRESHOLD | Get gunshot threshold |
| 0x18D | CMD_LEVEL | Get audio level |
| 0x193 | CMD_EXPAND_GAIN | Get footstep gain |
Response Format (64 bytes):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB1 (echo) |
| 3-6 | 4 | ex3d_cmd | EX3D command code (echo) |
| 7-10 | 4 | retval1 | uint32 Return value 1 |
| 11-14 | 4 | retval2 | uint32 Return value 2 |
| 15-18 | 4 | retval3 | uint32 Return value 3 |
| 19-63 | 45 | reserved | Reserved fields (fill with 0) |
EX3D Sub-Command Detailed Descriptions¶
EX3D Protocol Note
The following commands are sent via 0xB0/0xB1 encapsulation and are only applicable to V7.1 spatial audio devices with VID 0x20B1, PID 0x80D3.
2.3.1 EX3D Command Code Format Description¶
- SET Command Format:
base_command_code & ~0x0100(clear bit 9) - Example: Set gunshot threshold = 0x87 & ~0x0100 = 0x87
-
Example: Set footstep gain = 0x93 & ~0x0100 = 0x93
-
GET Command Format:
base_command_code | 0x0100(set bit 9) - Example: Get gunshot threshold = 0x87 | 0x0100 = 0x187
- Example: Get footstep gain = 0x93 | 0x0100 = 0x193
2.3.2 Sound Field Mode Control (CMD_SOUND_FIELD = 0x84)¶
Function: Set or get current sound field mode
Application Scenario: Switch between FPS Game/RPG Game/3A Game sound field effects
SET Command Request Packet Format (0xB0 encapsulated):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB0 |
| 3-6 | 4 | ex3d_cmd | EX3D command code (0x84 = CMD_SET(CMD_SOUND_FIELD)) |
| 7-10 | 4 | mode | uint32 User mode value: 1=FPS Game, 2=RPG Game, 3=3A Game |
| 11-63 | 53 | reserved | Reserved fields (fill with 0) |
User Mode → Internal IR Algorithm Mapping:
| User Value | Meaning | STEREO_EN=1 (IR) | V71_AUDIO_MODE=1 (IR) |
|---|---|---|---|
| 1 | FPS Game | IR_GAME (1) | IR_7_1_GAME (4) |
| 2 | RPG Game | IR_MUSIC (2) | IR_7_1_MUSIC (5) |
| 3 | 3A Game | IR_MOVIE (3) | IR_7_1_MOVIE (6) |
SET Command Response Packet Format:
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB0 (echo) |
| 3 | 1 | status | Status code (0x00=success, 0x01=failure) |
| 4-7 | 4 | ex3d_cmd | EX3D command code (0x84, echo) |
| 8-11 | 4 | retval | Return value (0xFFFFFFFF=invalid index, others=success) |
| 12-63 | 52 | reserved | Reserved fields (fill with 0) |
GET Command Request Packet Format (0xB1 encapsulated):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB1 |
| 3-6 | 4 | ex3d_cmd | EX3D command code (0x184 = CMD_GET(CMD_SOUND_FIELD)) |
| 7-63 | 57 | reserved | Reserved fields (fill with 0) |
GET Command Response Packet Format:
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB1 (echo) |
| 3-6 | 4 | ex3d_cmd | EX3D command code (0x184, echo) |
| 7-10 | 4 | mode | uint32 Current user mode value (1=FPS Game, 2=RPG Game, 3=3A Game) |
| 11-63 | 53 | reserved | Reserved fields (fill with 0) |
2.3.3 Gunshot Threshold Control (CMD_LMT_THRESHOLD = 0x87)¶
Function: Set/get gunshot sound effect trigger threshold
Application Scenario: Detect gunshots and trigger corresponding audio processing in FPS Game/3A Game modes
SET Command Request Packet Format (0xB0 encapsulated):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB0 |
| 3-6 | 4 | ex3d_cmd | EX3D command code (0x87 = CMD_SET(CMD_LMT_THRESHOLD)) |
| 7-10 | 4 | threshold | int32 Threshold value (range: -96 ~ 0 dB) |
| 11-63 | 53 | reserved | Reserved fields (fill with 0) |
SET Command Response Packet Format:
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB0 (echo) |
| 3 | 1 | status | Status code (0x00=success, 0x01=failure) |
| 4-7 | 4 | ex3d_cmd | EX3D command code (0x87, echo) |
| 8-11 | 4 | retval | Return value (0xFFFFFFFF=invalid index, others=success) |
| 12-63 | 52 | reserved | Reserved fields (fill with 0) |
GET Command Request Packet Format (0xB1 encapsulated):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB1 |
| 3-6 | 4 | ex3d_cmd | EX3D command code (0x187 = CMD_GET(CMD_LMT_THRESHOLD)) |
| 7-63 | 57 | reserved | Reserved fields (fill with 0) |
GET Command Response Packet Format:
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB1 (echo) |
| 3-6 | 4 | ex3d_cmd | EX3D command code (0x187, echo) |
| 7-10 | 4 | threshold | int32 Current threshold value (range: -96 ~ 0 dB) |
| 11-63 | 53 | reserved | Reserved fields (fill with 0) |
2.3.4 Footstep Gain Control (CMD_EXPAND_GAIN = 0x93)¶
Function: Set/get footstep sound effect gain
Application Scenario: Enhance footstep effects in FPS Game/3A Game modes
SET Command Request Packet Format (0xB0 encapsulated):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB0 |
| 3-6 | 4 | ex3d_cmd | EX3D command code (0x93 = CMD_SET(CMD_EXPAND_GAIN)) |
| 7-10 | 4 | gain | int32 Gain value (range: 0 ~ 24 dB) |
| 11-63 | 53 | reserved | Reserved fields (fill with 0) |
SET Command Response Packet Format:
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB0 (echo) |
| 3 | 1 | status | Status code (0x00=success, 0x01=failure) |
| 4-7 | 4 | ex3d_cmd | EX3D command code (0x93, echo) |
| 8-11 | 4 | retval | Return value (0xFFFFFFFF=invalid index, others=success) |
| 12-63 | 52 | reserved | Reserved fields (fill with 0) |
GET Command Request Packet Format (0xB1 encapsulated):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB1 |
| 3-6 | 4 | ex3d_cmd | EX3D command code (0x193 = CMD_GET(CMD_EXPAND_GAIN)) |
| 7-63 | 57 | reserved | Reserved fields (fill with 0) |
GET Command Response Packet Format:
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB1 (echo) |
| 3-6 | 4 | ex3d_cmd | EX3D command code (0x193, echo) |
| 7-10 | 4 | gain | int32 Current gain value (range: 0 ~ 24 dB) |
| 11-63 | 53 | reserved | Reserved fields (fill with 0) |
2.3.5 Level Retrieval (CMD_LEVEL = 0x8D)¶
Function: Get channel level data
Application Scenario: Real-time audio level meter display
GET Command Request Packet Format (0xB1 encapsulated):
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB1 |
| 3-6 | 4 | ex3d_cmd | EX3D command code (0x18D = CMD_GET(CMD_LEVEL)) |
| 7-10 | 4 | count | uint32 Channel count (1-16) |
| 11-63 | 53 | reserved | Reserved fields (fill with 0) |
GET Command Response Packet Format:
| Offset | Length | Field Name | Description |
|---|---|---|---|
| 0 | 1 | report_id | Fixed value: 0x01 |
| 1 | 1 | sync_header | Sync header: 0x77 |
| 2 | 1 | cmd_header | Command header: 0xB1 (echo) |
| 3-6 | 4 | ex3d_cmd | EX3D command code (0x18D, echo) |
| 7 onwards | N | levels | float32[] Array of channel level values |
| ... | ... | ... | Reserved fields (fill with 0) |
Firmware Upgrade Flow¶
- Send FIRMWARE_UPGRADE_START (0xA7) with the firmware size
- Device returns the page-aligned size and total block count
- Send FIRMWARE_UPGRADE_DATA (0xA8) in a loop to transfer firmware data blocks
- After the transfer, send FIRMWARE_UPGRADE_END (0xA9) to finish the upgrade
- Device verifies image integrity and returns status
EX3D Sound Field Read Flow¶
Applicable devices: VID 0x20B1, PID 0x80D3 (V7.1 spatial audio dedicated devices)
- Send GET_EX3D_CMD (0xB1) wrapping CMD_SOUND_FIELD (0x184)
- Device returns the current sound field mode (1=FPS Game, 2=RPG Game, 3=3A Game)
- Update the UI state based on the sound field mode
EX3D Sound Field Set Flow¶
Applicable devices: VID 0x20B1, PID 0x80D3 (V7.1 spatial audio dedicated devices)
- Send SET_EX3D_CMD (0xB0) wrapping CMD_SOUND_FIELD (0x84) and the target mode value
- Device updates the internal sound field mode state and returns a response
- When switching from RPG Game to FPS Game/3A Game, re-read the FPS control parameters
EX3D FPS Control Parameter Read Flow¶
Applicable devices: VID 0x20B1, PID 0x80D3 (V7.1 spatial audio dedicated devices)
- Send GET_EX3D_CMD (0xB1) wrapping CMD_LMT_THRESHOLD (0x187) to read the gunshot threshold
- Send GET_EX3D_CMD (0xB1) wrapping CMD_EXPAND_GAIN (0x193) to read the footstep gain
- Device returns the current threshold and gain values respectively
5. Hardware Specifications¶
5.1 Product Dimensions¶
13±0.1mm(L)X13±0.1mm(W)X0.8±0.1mm(H)
5.2 Module Package Diagram¶
6. Minimum System Reference Design¶
7. Product Packaging Information¶
Tray + Outer Box Packaging
8. Revision History¶
| Version | Date | Description | Revised by |
|---|---|---|---|
| V1.0 | 2025-09-19 | Initial Release | |
| V1.1 | 2026-08-26 | Added "Product Control Commands" chapter (same-source maintained with protocol command references) | |

