OpenLogi

0x8080 · perKeyLighting

旧版逐键 RGB 灯光控制,通过超长报告流式写入 HID 用法和颜色条目,再提交暂存的帧。

0x8080 是面向带可寻址 LED 键盘的早期逐键 RGB feature。 当较新的灯光路径不可用时,OpenLogi 会将它用作原始 HID++ 回退路径。

**规格:**没有公开的 Logitech 规格。布局由 Logi Options+ 2.8 静态分析逆向得出。用于:键盘灯光。

函数参考

OpenLogi 没有 0x8080 的类型化 PerKeyLightingFeature 封装。 设备写入器会解析运行时 feature index,再发送下列两个原始命令。

方法

函数HID++ fn签名返回值
setKeyColors3一个 64 字节的 0x12 报告,最多包含 14 个 (key_id, red, green, blue) 条目原始写入长度;提交前会收集 feature 错误。
flushLeds5一个普通长请求,带 16 字节全零载荷收到 HID++ 回复后的 Result<(), WriteError>。

类型

原始写入器没有公开的 0x8080 类型、枚举或逐键状态模型。 它为每个 RGB 通道接收一个 u8 值。

事件

OpenLogi 没有 0x8080 专属的 feature 事件类型。 原始写入器只监听与流式帧匹配的 HID++ feature 错误。

线格式

setKeyColors 使用 64 字节的 HID++ 超长报告(0x12)。 flushLeds 使用普通 HID++ 长请求,并等待其回复。

setKeyColors(fn 3)

OpenLogi 为 0x00..=0xe8 HID 用法范围发送 17 个帧。 前 16 个帧各有 14 个条目,最后一个帧有 9 个条目。

字节字段值或编码备注
0报告 ID0x12HID++ 超长报告。
1设备 index运行时值设备路由提供此值。
2feature index运行时值OpenLogi 解析 0x8080 的 index。
3函数和软件 ID高半字节为 3;低半字节为 0xa函数 3,使用 OpenLogi 软件 ID 0xa。
4–5key_typeBE 0x0001OpenLogi 固定写入此值。Options+ 2.8
6–7entry_countBE u16,范围为 1..=14计数等于此帧的条目数。Options+ 2.8
8–63条目最多 14 × (key_id, red, green, blue)key_id 占一个字节,之后是 3 个 8-bit RGB 通道。Options+ 2.8

未使用的条目字节保持为零。 这些字节位于 entry_count 之外,不能作为条目处理。 自 v0.8.14 起,OpenLogi 将尾帧计数写为 BE 0x0009,而非 0x000e。

flushLeds(fn 5)

此命令会提交此前由函数 3 暂存的颜色。 只有流式报告通过错误检查后,OpenLogi 才会发送此命令。

字节字段值备注
0–15载荷全部为 0x00OpenLogi 发送函数 5 的普通长请求,软件 ID 为 0xa。

OpenLogi 会等待此普通 HID++ 请求的回复。 它不为回复载荷赋予语义。

OpenLogi 的用法

LightingMethod::Auto 依次尝试 0x8070、0x8071、0x8081,最后尝试 0x8080。 LightingMethod::PerKey 会为诊断选择此原始路径。

写入器会在运行时通过 Root feature 解析 0x8080。 它没有类型化 feature 封装,也没有 feature 版本门控。

写入器会为每个 0x00 至 0xe8 的 HID 用法流式写入一种请求的 RGB 颜色。 它会检查每个原始报告都完整写入 64 字节。

超长函数 3 请求的协议回复报告 ID 尚未确认。 因此,OpenLogi 会在流式发送每个帧时记录匹配的 feature 错误。

最后一个帧之后会发送 Root ping,用作有序回复屏障。 如果设备拒绝任一帧,OpenLogi 会返回该错误,不会发送 flushLeds。

最终的函数 5 请求使用普通 HID++ 请求路径,并等待回复。 此检查在 v0.8.14 通过 PR #1764 发布。

OpenLogi 只应用纯色。 键盘灯光产品界面不会保存或公开独立键颜色映射。

未确认的细节

Options+ 2.8 会同步调用函数 3,但静态分析未能确认其回复报告 ID。 在硬件捕获确认该回复前,OpenLogi 无法等待每个帧的成功回复。

当前错误监听器和 Root-ping 屏障可阻止已知被拒绝的帧被提交。 硬件捕获必须在 0x8080 键盘上验证此行为。

Rust 用法

use openlogi_hid::{
    set_keyboard_color_with, DeviceRoute, LightingMethod, WriteError,
};

async fn paint_with_legacy_per_key(
    route: &DeviceRoute,
) -> Result<(), WriteError> {
    set_keyboard_color_with(
        route,
        LightingMethod::PerKey,
        0x20,
        0x80,
        0xff,
    )
    .await
}

本页目录