在Ubuntu 14.04中写入嵌入式控制器寄存器

时间:2015-04-03 22:56:25

标签: linux

我一直在尝试调整笔记本电脑的风扇速度,我可以通过将EC的地址20 (0x14)设置为28 (0x1C)41 (0x29)之间的值来在Windows中实现这一点。 / p>

(我从这个文件中导出这些数字:https://github.com/hirschmann/nbfc/blob/master/Configs/HP%20ENVY%20m6%20Sleekbook.xml

当我在Windows中执行它时,它可以正常工作。所以我试图在Ubuntu 14.04中复制它。以下是我的尝试:

  1. 首先,我通过编写使ec_sys可用的sudo modprobe ec_sys write_support=1来探测/sys/kernel/debug/ec/ec0/io模块。事实证明,如果我省略write_support=1,我会在下一步中收到“权限被拒绝”错误。
  2. 我尝试运行printf '\x1C' | sudo dd of="/sys/kernel/debug/ec/ec0/io" bs=1 seek=20 count=1 conv=notrunc,以便我可以将0x1c (28)写入EC的地址20 (0x14)并调整风扇速度。
  3. 我通过输入sudo od -t x1 /sys/kernel/debug/ec/ec0/io检查上述寄存器是否已更新,然后输出:

    0000000 00 00 00 00 00 01 50 04 00 00 ff 10 00 33 13 05 0000020 00 19 24 19 1c 00 ff ff ff ff ff ff 00 00 00 00 ...

  4. 现在,似乎我能够更新寄存器,但它不会影响风扇速度。此外,当我稍后尝试将41 (0x29)写入同一地址时,它并未更改该值。

    配置文件(我在上面提供了一个链接)说风扇速度的读取寄存器在地址17 (0x11)上,所以我希望这两个地址的内容是相同的(哪个)就是在Windows中的情况)。但是,我发现地址17与地址19具有相同的值。当我尝试写这个地址时,我无法做出任何改变。我非常困惑。

2 个答案:

答案 0 :(得分:6)

事实证明,第15个寄存器负责启用写入,因此我首先将0D写入该位置,如笔记本电脑FanControl那样,然后开始如上所述控制风扇速度。如果有人有兴趣,下面是完整的代码(适用于HP Envy m6系列笔记本电脑。还应首先安装lm-sensors)

sudo modprobe -r ec_sys
sudo modprobe ec_sys write_support=1
echo -n -e "\015" | sudo dd of="/sys/kernel/debug/ec/ec0/io" bs=1 seek=15 count=1 conv=notrunc 2> /dev/null
echo "Fan control enabled"
while [ 1 ]; do $(if [ "0$(bc -q <<< $(echo "`sensors -A -u | grep "temp1_input" --max-count=2 | tail -n1 | cut -d 'n' -f 2 | tr -cd '0123456789\.'`-0 > 54");)" -eq 1 ]; then echo -n -e "\051"; else echo -n -e "\031"; fi | sudo dd of="/sys/kernel/debug/ec/ec0/io" bs=1 seek=20 count=1 conv=notrunc 2> /dev/null); sleep 1; done

答案 1 :(得分:0)

我编辑了上面的代码以使其更具可读性。我还删除了lm-sensors位,使其手动分配了风扇速度。本质上,这就是上面代码的作用。

请注意,我没有测试以下版本。我的Envy m6笔记本电脑几年前就死了(很好的摆脱)。

# Run as root

modprobe -r ec_sys
modprobe ec_sys write_support=1

# Path
ECIO_PATH=/sys/kernel/debug/ec/ec0/io

# Register offsets
ENABLE_WR=15
FAN_SPEED=20

# Values
WRITE_ENABLED="\015"
LOWEST_SPEED="\031"
HIGHEST_SPEED="\051"

# Define a function to write to EC
write_to_ec () {
    echo -n -e $2 | dd of=$ECIO_PATH bs=1 seek=$1 count=1 conv=notrunc
}

# Enable fan control
write_to_ec $ENABLE_WR $WRITE_ENABLED

# Adjust fan speed
write_to_ec $FAN_SPEED $HIGHEST_SPEED