0x8310 · equalizer
HID++ 0x8310 协议封装中的逐频段耳机均衡器和麦克风降噪控制。
0x8310 控制音频设备的逐频段均衡器和麦克风降噪。OpenLogi 提供版本 2 的类型化封装。OpenLogi 没有将该功能接入设备、agent、CLI 或桌面控制路径。
**规格:**Logitech HID++ 2.0 —— x8310 equalizer。**交叉核对:**G HUB 2026.6(静态分析)。用于:
openlogi-hidpp中的类型化封装;没有设备层路径。
函数参考
EqualizerFeature 从版本 2 起实现 HID++ 0x8310。每个方法都是异步方法,并返回 Result<…, Hidpp20Error>。
方法
| 函数 | HID++ fn | 签名 | 返回值 |
|---|---|---|---|
get_eq_info | 0 | (&self) | EqInfo |
get_frequencies | 1 | (&self, band_count: u8) | Vec<u16> |
get_frequency_gains | 2 | (&self, location: GainLocation, band_count: u8) | Vec<i8> |
set_frequency_gains | 3 | (&self, persistence: GainPersistence, gains: &[i8]) | Vec<i8> |
get_mic_noise_reduction | 4 | (&self) | bool |
set_mic_noise_reduction | 5 | (&self, enabled: bool) | () |
类型
EqInfo
| 字段 | 类型 | 说明 |
|---|---|---|
band_count | u8 | 频段数量。 |
db_range | u8 | 两个显式边界均为零时的对称增益范围,单位为 dB。 |
capabilities | EqCapabilities | 设备如何存储均衡器值。 |
db_min | i8 | 最小增益,单位为 dB;0 表示对称范围简写。 |
db_max | i8 | 最大增益,单位为 dB;0 表示对称范围简写。 |
EqInfo 带有 #[non_exhaustive]。当两个显式边界均为 0 时,effective_range(&self) -> (i8, i8) 返回 (-db_range, db_range)。
EqCapabilities
| 标志 | 位 | 说明 |
|---|---|---|
STORED_AS_GAINS | 0 | 设备将均衡器值存为增益。 |
STORED_AS_COEFFICIENTS | 1 | 设备将均衡器值存为系数。 |
封装读取这个 u8 位字段时会保留未知能力位。
GainLocation
| 变体 | 值 | 说明 |
|---|---|---|
Eeprom | 0 | 读取 EEPROM 中存储的自定义均衡器。 |
Ram | 1 | 读取 RAM 中生效的均衡器。 |
GainLocation 带有 #[non_exhaustive]。
GainPersistence
| 变体 | 值 | 说明 |
|---|---|---|
Volatile | 0 | 只将增益应用到 RAM。 |
VolatileAndNonVolatile | 1 | 将增益应用到 RAM 和 EEPROM。 |
NonVolatileOnly | 2 | 只将增益存入 EEPROM。 |
GainPersistence 带有 #[non_exhaustive]。
事件
OpenLogi v0.8.15 没有定义均衡器事件类型。EqualizerFeature 没有实现 EmittingFeature。
线格式
函数 0、1、2、4 和 5 发送 3 字节短请求。函数 3 发送 16 字节长请求。封装将每个响应转换为 16 字节缓冲区,并以零扩展短回复。
频率是 BE u16 值。增益是有符号 i8 值。封装会检查函数 1 回显的页索引。它不会验证函数 3 回显的持久化选择器。
get_eq_info(fn 0)
请求:[0x00, 0x00, 0x00]。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | band_count | 频段数量。 |
| 1 | db_range | 字节 3~4 为零时的对称范围,单位为 dB。 |
| 2 | capabilities | EqCapabilities 标志。 |
| 3 | db_min | 有符号 i8 最小增益,单位为 dB。 |
| 4 | db_max | 有符号 i8 最大增益,单位为 dB。 |
get_frequencies(fn 1)
封装对每页发送一个请求。每页最多包含 7 个频率。
请求:[start_index, 0x00, 0x00]。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | start_index | 请求的第一个频段索引。 |
| 响应字节 | 字段 | 备注 |
|---|---|---|
| 0 | 回显的 start_index | 如果不匹配,OpenLogi 返回 UnsupportedResponse。 |
| 1~2 | 频率 0 | BE u16,单位为 Hz。 |
| 3~4 | 频率 1 | BE u16,单位为 Hz。 |
| 5~14 | 频率 2~6 | 该页需要时,包含另外 5 个 BE u16 值。 |
| 15 | 未使用 | OpenLogi 忽略此字节。 |
get_frequency_gains(fn 2)
请求:[location, 0x00, 0x00]。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | location | GainLocation:0 为 Eeprom,1 为 Ram。 |
| 响应字节 | 字段 | 备注 |
|---|---|---|
| 从 0 开始 | 增益 | 每个请求的频段使用一个有符号 i8。 |
set_frequency_gains(fn 3)
请求是 16 字节长负载。OpenLogi 拒绝超过 15 个增益值。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | persistence | GainPersistence:0、1 或 2。 |
| 1~15 | 增益 | 有符号 i8 值编码为原始字节。 |
封装跳过响应字节 0,并返回与请求数量相同的有符号增益字节。它不比较跳过的字节和 persistence。
get_mic_noise_reduction(fn 4)
请求:[0x00, 0x00, 0x00]。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | 启用状态 | 零为 false;任意非零值为 true。 |
set_mic_noise_reduction(fn 5)
请求:[enabled, 0x00, 0x00]。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | enabled | OpenLogi 为 false 写入 0,为 true 写入 1。 |
| 1~2 | 填充 | OpenLogi 写入零。 |
OpenLogi 等待响应,但忽略响应负载。
OpenLogi 的用法
功能注册表为版本 2 及更高版本的 0x8310 创建 EqualizerFeature。v0.8.15 的设备层、agent、CLI 和桌面路径都不会打开该封装。因此,OpenLogi 没有均衡器状态模型、能力门控、读-改-写操作、读回检查或退出时恢复行为。
未确认的细节
G HUB 2026.6 的静态分析发现了相同的六个 getter 和 setter 名称,以及一个事件处理器。现有证据没有给出函数编号、事件子 ID、回复宽度或完整协议布局。需要硬件抓包或 Logitech 的功能专用规格才能验证这些细节。
OpenLogi 对每个均衡器 getter 的短回复都作零扩展。这是实现事实,不证明短回复可以用于多字节响应。现有证据没有确认所需的回复长度。
Rust 用法
use hidpp::{
feature::equalizer::{EqualizerFeature, GainLocation},
protocol::v20::Hidpp20Error,
};
async fn active_gains(feature: &EqualizerFeature) -> Result<Vec<i8>, Hidpp20Error> {
let info = feature.get_eq_info().await?;
feature
.get_frequency_gains(GainLocation::Ram, info.band_count)
.await
}