【免费下载链接】ugreen_leds_controller
An LED Controller for UGREEN's DX/DXP NAS Series
ugreen_leds_controller 是一款针对绿联(UGREEN)DX/DXP 系列 NAS 的开源LED 控制器,通过 I2C 总线直接操控前面板的电源、网络与硬盘指示灯(颜色、亮度、闪烁、呼吸),让 DSM、TrueNAS、Debian 等第三方系统也能拥有 UGOS 般的灯光效果。如果你的机型不在官方支持列表里,本文教你30 秒自测兼容性,并拆解其 I2C 协议,带你完成从"能不能用"到"怎么扩展"的完整流程。
📌 支持的设备清单:先对号入座
项目目前确认工作的设备如下(来源:README.md):
| 设备 | 状态 |
|---|---|
| DX4600 Pro | ✅ 已验证 |
| DX4700+ | ✅ 已验证 |
| DXP2800 / DXP4800 / DXP4800 Plus / DXP6800 Pro | ✅ 社区确认 |
| DXP8800 Plus | ✅ 社区确认 |
| DXP4800 GT | ⏳ 适配中 |
| DXP480T Plus | ⚠️ 协议已分析,驱动未就绪 |
| iDX6011 Pro | ⏳ 适配中 |
💡关键点:列表外 ≠ 不能用。只要你的机器通过下文的协议自测,绝大多数 DX/DXP 机型都可以直接驱动。
🔍 30秒快速检测:你的 NAS 是否兼容协议
LED 控制芯片挂在SMBus I801 adapter的 I2C 地址0x3a上。按下面三步即可判断:
# 1. 安装工具并加载 I2C 模块 apt install -y i2c-tools modprobe -v i2c-dev # 2. 找到 SMBus I801 适配器编号(示例中为 i2c-1) i2cdetect -l # i2c-1 smbus SMBus I801 adapter at efa0 SMBus adapter # 3. 扫描该总线的设备地址 i2cdetect -y 1如果输出矩阵的30:行中出现3a(或3a UU),说明控制芯片已被识别,你的设备协议兼容概率极高:
30: 30 -- -- -- -- 35 UU UU -- -- 3a -- -- -- -- --拿到命令行工具后(cd cli && make),再运行一条命令即可看到本机实际可用的全部 LED:
ugreen_leds_cli all能输出各灯的status / brightness / color,就代表协议完全跑通 🎉。
⚙️ I2C 协议详解:读懂 LED 芯片的"语言"
前面板每颗灯都有一个固定 ID,这是所有通信的基础:
| LED ID | 含义 |
|---|---|
0 | 电源指示灯 power |
1 | 网卡指示灯 netdev |
2~9 | 硬盘灯 disk1 ~ disk8 |
查询状态:从0x81 + LED_ID读 11 字节
以电源灯为例,i2cget -y 0x01 0x3a 0x81 i 0x0b会返回 11 字节,含义如下(完整定义见 README.md 的 Communication Protocols 章节):
| 偏移 | 数据含义 |
|---|---|
0x00 | 状态:0 熄灭 / 1 常亮 / 2 闪烁 / 3 呼吸 |
0x01 | 亮度(0~255) |
0x02~0x04 | RGB 颜色分量 |
0x05~0x08 | 闪烁周期与点亮时长(大端 16 位,毫秒) |
0x09~0x0a | 0x00~0x08全部字节的 16 位加和校验 |
修改状态:向0x00 + LED_ID写 12 字节帧
帧结构是"固定头 + 指令 + 参数 + 校验",理解它就理解了整个扩展点:
[LED_ID] [0xa0] [0x01] [0x00] [0x00] [CMD] [P1] [P2] [P3] [P4] [CK_H] [CK_L]指令字节CMD决定操作类型(源码中对应ugreen_leds_t::_change_status,见 cli/ugreen_leds.cpp):
| CMD | 操作 | 参数用法 |
|---|---|---|
0x01 | 设置亮度 | P1 = 亮度值 |
0x02 | 设置颜色 | P1~P3 = R/G/B |
0x03 | 开/关 | P1 = 0 关 / 1 开 |
0x04 | 闪烁 | P1P2 = 周期(ms),P3P4 = 点亮时长(ms),均大端 |
0x05 | 呼吸 | 同上 |
写完还需读寄存器0x80确认芯片是否执行成功(返回1表示成功),这是 cli/ugreen_leds_cli.cpp 中重试机制的依据。
校验和机制:扩展时最容易踩的坑
校验算法极简——把参与校验的字节按无符号整数直接累加,取 16 位结果,高字节在前。命令行工具与内核模块实现完全一致:
- CLI 端:
compute_checksum()/append_checksum(),见 cli/ugreen_leds.cpp - 内核端:
cksum = 0xa1 + command + param1..param4,见 kmod/led-ugreen.c
⚠️ 如果你要扩展新指令或修改帧结构,务必同步两处校验范围(CLI 对
0x00~0x08求和;内核帧从固定头0xa0之后开始),否则芯片会静默拒收命令。
🛠️ 协议扩展实操:从源码到自定义驱动
仓库采用"双轨"架构,扩展时可按需选择:
| 组件 | 路径 | 特点 |
|---|---|---|
| 命令行工具 | cli/ | 用户态 C++,依赖i2c-dev,改完make即用,适合调试与新协议验证 |
| 内核模块 | kmod/ | 注册标准 LED Class 设备到/sys/class/leds,支持ledtrig-netdev、ledtrig-oneshot触发器,适合常驻 |
[!IMPORTANT] 两者不能同时使用:启用命令行工具前必须
rmmod led_ugreen,反之亦然。
扩展一个新机型的典型思路:
- 先跑通 CLI:用
i2cget/i2cset手工验证 ID、地址与帧结构是否与上文一致; - 差异定位:若个别灯无响应,多半是 LED ID 排布不同,只需调整 cli/ugreen_leds.h 中
led_type_t枚举的 ID 映射; - 新指令类型:若芯片支持未知 CMD,按
_change_status()的参数打包方式新增一条命令即可,重试与校验逻辑可直接复用; - 固化为内核驱动:验证稳定后,在 kmod/led-ugreen.c 中实现对应的
i2c_smbus_write_i2c_block_data调用,并通过 DKMS 随内核自动重编译,配置见 kmod/dkms.conf 与 kmod/debian/。
加载内核模块后的注册流程可参考 scripts/ugreen-probe-leds(含 DKMS 回退构建逻辑)。
🎨 让 LED 真正有用:磁盘映射与颜色配置
灯能亮还不够,灯和盘位的对应关系才是灵魂。scripts/ugreen-diskiomon 提供三种映射方式,全部在 /etc/ugreen-leds.conf 中配置:
| 方式 | 原理 | 适用性 |
|---|---|---|
ata(默认) | ataX→diskX,与 UGOS 一致 | 大多数机型重启后稳定 |
hctl | 按 SATA 控制器拓扑映射 | 顺序因机型而异,需人工核对 |
serial(推荐) | 手工登记磁盘序列号 | 最稳,但需提前记录 |
可用 scripts/ugreen-detect-disks 一键打印当前映射与序列号。
颜色语义也全部可配,例如硬盘健康/休眠/故障三色、网卡按协商速率变色(100M 绿 / 1G 蓝 / 10G 白):
# /etc/ugreen-leds.conf 中的关键项 MAPPING_METHOD=ata COLOR_DISK_HEALTH="255 255 255" COLOR_DISK_STANDBY="0 0 255" COLOR_ZPOOL_FAIL="255 0 0" CHECK_LINK_SPEED_DYNAMIC=true # 按速率自动变色的开关服务由 scripts/systemd/ 下的单元拉起:ugreen-netdevmon@<网卡>负责网络灯、ugreen-diskiomon负责硬盘灯、ugreen-power-led负责电源灯呼吸/常亮(配置项BLINK_TYPE_POWER)。
✅ 实测验证清单:确认适配成功的 3 步
- 状态自检:
ugreen_leds_cli all -status,所有灯均能读回状态而非unavailable; - 点亮测试:
ugreen_leds_cli disk1 -on -color 255 0 0 -blink 400 600,观察对应盘位是否红光闪烁; - 负载联动:
dd if=/dev/sdX of=/dev/null bs=1M count=100制造 I/O,确认该盘位 LED 随读写闪动(即ugreen-detect-disks脚本末尾的验证方法)。
💡 如果你的机型测试通过,欢迎把结果反馈给项目维护者更新支持列表——这正是 DX4800、DXP4800 等机型进入 ✅ 状态的方式,也是社区推动 iDX6011 Pro 等新机型适配的主要途径。
总结:ugreen_leds_controller 的核心壁垒不在驱动本身,而在对0x3a芯片12 字节帧 + 16 位加和校验协议的逆向分析。只要你的 NAS 能通过i2cdetect看到0x3a,大概率只需微调 LED ID 映射,就能把第三方系统的"死灯"变成与 UGOS 一样会"呼吸"的指示灯。
【免费下载链接】ugreen_leds_controller
An LED Controller for UGREEN's DX/DXP NAS Series
相关推荐
BFE AI 网关 Gemini 协议支持:协议适配器扩展、流式 usage 计费判定下沉与跨协议兼容设计
BFE AI 网关 Gemini 协议支持:协议适配器扩展、流式 usage 计费判定下沉与跨协议兼容设计 导读 本文基于 BFE 数据面的设计变更文档,完整讲
后端网络/通信云原生告别设备不兼容!Zigbee2MQTT新增TZE284设备支持全攻略
告别设备不兼容!Zigbee2MQTT新增TZE284设备支持全攻略 你是否曾遇到智能家居设备无法接入现有系统的烦恼?当新购买的传感器或开关显示"不支持"时,不
后端物联网智能家居消息路由RabbitMQ扩展协议:自定义协议支持
RabbitMQ扩展协议:自定义协议支持 在分布式系统中,消息队列(Message Queue)扮演着至关重要的角色,它能够解耦系统组件、提高系统的可扩展性和可
消息队列后端消息路由流处理
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考