aseriosouza/risemode-temp6pro-linux

GitHub: aseriosouza/risemode-temp6pro-linux

通过逆向工程 USB HID 协议,在 Linux 上驱动 Rise Mode Temp 6 Pro 散热器显示屏实时展示 CPU 温度与使用率。

Stars: 0 | Forks: 0

# Rise Mode Temp 6 Pro — Linux 显示驱动 让 **Rise Mode Temp 6 Pro 散热器的显示屏**在 Linux 下工作的驱动程序,可实时显示 **CPU 温度和使用率** —— 与官方 Windows 软件功能相同。 该通信协议是通过对官方 `DeviceDriver.exe` 进行逆向工程获得的,并与设备自身的 report descriptor 进行了比对验证。本仓库仅包含自主编写的代码和协议文档;不重新分发任何 Rise Mode 的原始文件。 - **设备:** USB `1a2c:4984`(识别为“SEMICO USB Gaming Keyboard”) - **测试环境:** Ubuntu,kernel 7.0 - **运行不需要 root 权限**(仅在安装 udev 规则时需要) ## 安装 ``` git clone https://github.com/aseriosouza/risemode-temp6pro-linux.git cd risemode-temp6pro-linux ./install.sh ``` `install.sh` 会完成所有操作:如果缺少 `python3-psutil` 会自动安装,创建 udev 规则(需要 sudo 权限)并注册一个在登录时启动的用户服务。 完成 —— 此时显示屏应该已经在显示温度了。 ### 卸载 ``` ./install.sh --uninstall ``` ## 用法 该服务会自动运行。要控制它: ``` systemctl --user status risemode-display # ver estado systemctl --user restart risemode-display # reiniciar systemctl --user stop risemode-display # parar journalctl --user -u risemode-display -f # acompanhar o log ``` 手动运行: ``` ./rise_temp6pro.py # loop com valores reais ./rise_temp6pro.py --demo # alterna 11 e 99, para conferir a olho ./rise_temp6pro.py --test # 88 °C / 88% fixo ./rise_temp6pro.py --fahrenheit # temperatura em Fahrenheit ./rise_temp6pro.py --interval 2 # atualiza a cada 2 segundos ``` ## 常见问题 ### 显示屏不亮 几乎总是因为 `usbhid` 驱动被解绑 —— 如果之前有使用 pyusb/libusb 的脚本占用过该设备就会发生这种情况。修复方法: ``` sudo ./reanexar.sh ``` 然后: ``` ./rise_temp6pro.py --demo ``` ### "找不到散热器的 /dev/hidraw 设备" 原因同上。如果 `reanexar.sh` 没有解决问题,请拔下并重新插拔散热器的 USB 线。 ### 检查系统是否识别到设备 ``` ./detectar.sh ``` 列表中应该会出现 `1a2c:4984`。如果没有出现,说明问题出在 USB 线上 —— 这些散热器连接在主板的内部 USB 接口上,接头松动或针脚偏移是很常见的问题。 ## 通信协议 Feature report **ID 为 `0x07`**,**64 字节**的缓冲区,通过在 `/dev/hidrawN` 上调用 `HIDIOCSFEATURE` ioctl 发送 —— 这与 Windows 软件使用的 `HidD_SetFeature` 调用完全等价。 ``` buf[0] = 0x07 report ID buf[1] = temperatura / 100 % 10 buf[2] = temperatura / 10 % 10 buf[3] = temperatura % 10 buf[4] = flags: bit0 (0x01) = Fahrenheit (0 = Celsius) bit4 (0x10) = o segundo valor é uso de CPU em % buf[5] = uso / 100 % 10 buf[6] = uso / 10 % 10 buf[7] = uso % 10 buf[8..63] = 0 ``` 温度限制为 999,使用率限制为 100。**没有校验和(checksum)。** 官方软件每 1000 ms 发送一次。 设备自身在其 report descriptor 中的一个 vendor-defined `0xFF01` collection 中声明了这一点: ``` 06 01 ff Usage Page (Vendor-defined 0xFF01) 09 01 Usage 1 a1 01 Collection (Application) 85 07 Report ID 0x07 09 03 Usage 3 15 00 Logical Minimum 0 26 ff 00 Logical Maximum 255 75 08 Report Size 8 bits 95 3f Report Count 63 b1 02 FEATURE (Data,Var,Abs) ``` 此外还存在一个 `[0x07, 0xFD, 0, ...]` 的握手信号,由官方软件在连接时发送,其响应会包含固件版本,但这对于显示屏工作**并不是必需的**。 ## 来之不易的经验细节 记录这些是因为它们并不直观,可以为那些尝试调试类似显示屏的人节省数小时的时间: **1. 使用 hidraw,而不是 pyusb/libusb。** 这是主要的经验教训。通过 pyusb 的 `ctrl_transfer` 发送相同的 report *看起来*可行 —— 设备全盘接受并返回成功 —— 但屏幕上什么也不会显示。 **2. 设备必须绑定到 `usbhid`。** 如果使用 pyusb 的脚本解绑了内核驱动,接口就会进入 `usbfs` 状态,`/dev/hidraw` 会消失,控制器会进入一种容易误导诊断的状态:静默接受任何内容。这种状态的迹象: - 尝试读取 report descriptor 时出现 `STALL` - 对于*任何* report ID,`GET_REPORT` 总是返回 `07 00 02 00...`,这看起来像是一个有效响应,但其实是硬编码的虚假响应 **3. 如果数据流中断,显示屏会熄灭。** 必须持续不断地重新发送。只发送一两个数据包只会让屏幕闪烁一下。 **4. 正确的 hidraw 节点是第二个接口。** 该设备会创建两个节点;属于显示屏的那个节点在其 `report_descriptor` 中包含 `85 07` 和 `b1 02`。驱动程序会自动选择。 **5. `buf[4]` 中的 `0x10` 标志是必需的**,这样第二个数字才会被解析为 CPU 使用率。如果没有它,显示屏会忽略该值。 ## 文件 | 文件 | 作用 | | --- | --- | | `rise_temp6pro.py` | 驱动程序 | | `install.sh` | 安装 udev 规则 + 用户服务 | | `reanexar.sh` | 将设备重新绑定到 `usbhid`(需要 sudo) | | `detectar.sh` | 诊断:列出 USB 设备 | ## 致谢 出发点:[evozniak/risemode-driver](https://github.com/evozniak/risemode-driver), 该项目为 Rise Mode Aura Ice Black 水冷散热器(USB `aa88:8666`,协议与本设备不同)实现了同样的功能。 ## 许可证 MIT — 详见 [LICENSE](LICENSE)。
标签:HID设备, Linux驱动, Python, 无后门, 硬件交互, 系统工具, 逆向工具