如何通过Linux终端读取PMBus/SMBus提供的台式机供电电压
如何通过Linux终端读取PMBus/SMBus提供的台式机供电电压
兄弟,我懂你这种明明能控制供电电压却读不回准确数值的憋屈——之前帮朋友排查过类似的问题,给你几个实际可行的方向试试:
重新梳理hwmon的正确使用姿势
很多人用hwmon踩的坑是找错了对应的传感器设备。先跑ls /sys/class/hwmon/,每个hwmonX目录里都有个name文件,先挨个看哪个是你的电源管理芯片(常见的比如pmbus、isl68137这类)。找到对应目录后,里面的in*_input文件就是电压读数,注意数值是以毫伏为单位的,比如读出来12000就代表12V。
举个实际操作例子:- 先确认芯片名称:
cat /sys/class/hwmon/hwmon2/name(把hwmon2换成你找到的目录) - 查看对应电压的标签:
cat /sys/class/hwmon/hwmon2/in1_label(会告诉你这个是“VCC_12V”还是CPU核心电压之类的) - 读取电压值:
cat /sys/class/hwmon/hwmon2/in1_input
- 先确认芯片名称:
用i2c-tools直接读取PMBus寄存器
既然你能控制电压,说明设备肯定在I2C总线上。先装i2c-tools工具包:sudo apt install i2c-tools(Debian/Ubuntu系)或者sudo yum install i2c-tools(RHEL/CentOS系)。
步骤如下:- 查看系统上的I2C总线:
i2cdetect -l - 扫描目标总线的设备地址:
i2cdetect -y 0(把0换成你找到的总线号,比如i2c-1),找到电源管理IC的地址(一般是0x40到0x70之间的十六进制数) - 用PMBus标准寄存器读取电压:输入电压对应寄存器0x08,输出电压对应0x0B,用
i2cget命令读取16位数据:sudo i2cget -y 0 0x40 0x08 w(这里0是总线号,0x40是设备地址) - 换算数值:PMBus的电压用线性11格式编码,读出来的十六进制数需要转成实际电压。比如读出来0x199A,换算公式是
(数值 >> 3) * (2^(数值 & 0x7)) / 1000,或者你可以搜个在线的线性11转换器快速计算。如果厂商有自定义寄存器,得查对应芯片的 datasheet找准确的寄存器地址。
- 查看系统上的I2C总线:
排查容易忽略的权限和BIOS问题
- 要是跑命令时提示权限不足,记得加
sudo - 检查I2C相关模块是否加载:
lsmod | grep i2c,如果没看到i2c_dev和pmbus,手动加载:sudo modprobe i2c_dev、sudo modprobe pmbus - 进BIOS看看有没有禁用SMBus/PMBus的选项,比如“I2C/SMBus Controller”要设为Enabled,有些台式机默认是关闭的
- 要是跑命令时提示权限不足,记得加
备注:内容来源于stack exchange,提问作者ajax spencer
相关产品推荐
相关产品推荐

