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, 无后门, 硬件交互, 系统工具, 逆向工具