Debian/Ubuntu でKV260 で冷却ファンを制御する (その３)







# はじめに


KV260 には ZynqMP チップを冷却するためのファンがついています。この冷却ファンを Debian/Ubuntu から制御するための方法を３回に分けて説明します。今回はその最終回です。




# fancontrol service



## 概要


この章では fancontrol service の説明をします。fancontrol service はソフトウェア/ハードウェアスタックのうちシェードのかかった部分です。


![Fig.1 KV260 Fan Control Stack (fancontrol service)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24981/b4d7f55b-be3f-6ccc-6a71-4930dcc67a38.jpeg "Fig.1 KV260 Fan Control Stack (fancontrol service)")

Fig.1 KV260 Fan Control Stack (fancontrol service)

<br />



fancontrol service  は Debian/Ubuntu が提供しているファン制御用ユーザーアプリケーションです。


## インストール


apt で fancontrol パッケージをインストールします。


```console
root@ubuntu-fpga:~# apt install fancontrol
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
  libboost-iostreams1.74.0 schroot-common
Use 'apt autoremove' to remove them.
The following NEW packages will be installed:
  fancontrol
0 upgraded, 1 newly installed, 0 to remove and 27 not upgraded.
Need to get 22.0 kB of archives.
After this operation, 98.3 kB of additional disk space will be used.
Get:1 http://ports.ubuntu.com/ubuntu-ports jammy/universe arm64 fancontrol all 1:3.6.0-7ubuntu1 [22.0 kB]
Fetched 22.0 kB in 1s (19.8 kB/s)
Selecting previously unselected package fancontrol.
(Reading database ... 118162 files and directories currently installed.)
Preparing to unpack .../fancontrol_1%3a3.6.0-7ubuntu1_all.deb ...
Unpacking fancontrol (1:3.6.0-7ubuntu1) ...
Setting up fancontrol (1:3.6.0-7ubuntu1) ...
Created symlink /etc/systemd/system/multi-user.target.wants/fancontrol.service  → /lib/systemd/system/fancontrol.service.
Processing triggers for man-db (2.10.2-1) ...
```



## pwmconfig による設定はうまくいかない


いろんな資料をみると、fancontrol をインストールしたあとは、pwmconfig を使って /etc/fancontrol を作るとあります。

しかし KV260 では残念ながら次のようなメッセージが出て失敗します。




```console
root@ubuntu-fpga:~# pwmconfig
# pwmconfig version 3.6.0
This program will search your sensors for pulse width modulation (pwm)
controls, and test each one to see if it controls a fan on
your motherboard. Note that many motherboards do not have pwm
circuitry installed, even if your sensor chip supports pwm.
We will attempt to briefly stop each fan using the pwm controls.
The program will attempt to restore each fan to full speed
after testing. However, it is ** very important ** that you
physically verify that the fans have been to full speed
after the program has completed.
/usr/sbin/pwmconfig: There are no fan-capable sensor modules installed
```


pwmconfig を設定ファイルを作るためには、はファンの回転数を得るためのセンサーが必要なようです。しかしKV260 は、冷却ファンの回転数を指定することは出来ても、その冷却ファンが何回転しているかを測定するセンサーがついていないので、pwmconfig はうまく動かないようです。




## /etc/fancontrol を手書きする


pwmconfig は動きませんが、/etc/fancontrol を手で書くことによってファンの制御を行うことができます。

まず sensors を起動して hwmon にどんなセンサーがあるか調べてみます。


```console
root@ubuntu-fpga:~# sensors
ina260_u14-isa-0000
Adapter: ISA adapter
in1:           5.04 V
power1:        3.14 W
curr1:       623.00 mA
ams-isa-0000
Adapter: ISA adapter
in1:           1.20 V
in2:           0.00 V
in3:         719.00 mV
in4:         848.00 mV
in5:           1.79 V
in6:           1.80 V
in7:         842.00 mV
in8:         841.00 mV
in9:         843.00 mV
in10:          1.80 V
in11:          1.19 V
in12:          1.79 V
in13:          1.79 V
in14:          1.79 V
in15:          1.79 V
in16:        856.00 mV
in17:          1.80 V
in18:        597.00 mV
in19:        721.00 mV
in20:          1.79 V
in21:          1.25 V
in22:          0.00 V
in23:        848.00 mV
in24:        842.00 mV
in25:        841.00 mV
in26:          1.80 V
in27:        598.00 mV
temp1:        +31.1°C
temp2:        +30.8°C
temp3:        +30.3°C

```


このうち、ams-isa-0000 の temp1 とかが ZynqMP の温度センサーの測定値のようです。ams-isa-0000 の hwmon のディレクトリは /sys/class/hwmon/hwmon1 です。


```console
root@ubuntu-fpga:~# i ls -la /sys/class/hwmon/hwmon1/
total 0
drwxr-xr-x 3 root root    0 Mar 20 23:32 .
drwxr-xr-x 3 root root    0 Mar 20 23:32 ..
lrwxrwxrwx 1 root root    0 Mar 20 23:32 device -> ../../../ams
-r--r--r-- 1 root root 4096 Mar 20 23:32 in10_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in11_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in12_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in13_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in14_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in15_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in16_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in17_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in18_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in19_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in1_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in20_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in21_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in22_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in23_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in24_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in25_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in26_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in27_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in2_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in3_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in4_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in5_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in6_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in7_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in8_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 in9_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 name
lrwxrwxrwx 1 root root    0 May 23 13:24 of_node -> ../../../../../firmware/devicetree/base/ams
drwxr-xr-x 2 root root    0 May 23 13:24 power
lrwxrwxrwx 1 root root    0 Mar 20 23:32 subsystem -> ../../../../../class/hwmon
-r--r--r-- 1 root root 4096 Mar 20 23:32 temp1_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 temp2_input
-r--r--r-- 1 root root 4096 Mar 20 23:32 temp3_input
-rw-r--r-- 1 root root 4096 Mar 20 23:32 uevent
```




そこで次のような /etc/fancontrol を作ってみます。




```Shell:/etc/fancontrol
INTERVAL=10
DEVPATH=hwmon2=devices/platform/pwm-fan
DEVNAME=hwmon2=pwmfan
FCTEMPS=hwmon2/pwm1=hwmon1/temp1_input
MINTEMP=hwmon2/pwm1=35
MAXTEMP=hwmon2/pwm1=55
MINSTART=hwmon2/pwm1=110
MINSTOP=hwmon2/pwm1=10
MINPWM=hwmon2/pwm1=10
MAXPWM=hwmon2/pwm1=110
```




INTERVAL 変数にはファン制御のメインループが実行される間隔を秒単位で定義します。

FCTEMPS 変数には PWM 出力の新しい値の計算にどの温度センサーを使用するかを指定しています。/sys/class/hwmon 下にあるデバイスの場合は、/sys/classs/hwmon を省略することが出来ます。

MINTEMP 変数には、この温度を下回るとファンが最低速度に切り替わる温度を指定します。

MAXTEMP 変数は、この温度を超えるとファンが最大速度に切り替わる温度を指定します。

MINPWN 変数には、温度がMINTEMP 変数で指定された温度を下回っている場合に使用する PWM の値を指定します。

MAXPWM 変数には、温度が MAXTEMP 変数で指定された温度を超えた場合に使用する PWM の値を指定します。

MINSTART 変数には、ファンが停止中に回転を開始するために必要な PWM 値を指定します。

MINSTOP 変数には、ファンが回転する最小 PWM 値を指定します。 

これらを図に示すと次のようになります。


![Fig.2 /etc/fancontrol setting](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24981/10c72c32-091f-0db1-7c9d-ed426edaed01.jpeg "Fig.2 /etc/fancontrol setting")

Fig.2 /etc/fancontrol setting

<br />



試しに次のような /etc/fancontrol を作って fancontrol service を起動してみます。


```Shell:/etc/fancontrol
INTERVAL=10
DEVPATH=hwmon2=devices/platform/pwm-fan
DEVNAME=hwmon2=pwmfan
FCTEMPS=hwmon2/pwm1=hwmon1/temp1_input
MINTEMP=hwmon2/pwm1=35
MAXTEMP=hwmon2/pwm1=55
MINSTART=hwmon2/pwm1=110
MINSTOP=hwmon2/pwm1=10
MINPWM=hwmon2/pwm1=10
MAXPWM=hwmon2/pwm1=110
```




この /etc/fanctrol では MINTEMP を 35℃に設定しています。この温度は KV260 が何も動いていない時の hwmon1/temp1_input の値です。この温度に設定した理由はあくまでも fancontrol がちゃんと動くかどうか確認するためのものです。ためしに fancontrol.service を起動してみると、最初はファンが停止します。


```console
root@ubuntu-fpga:~# systemctl start fancontrol.service
```


この状態でglmark2 などの重たいアプリケーションを走らせるとファンが回転しだします。


```console
root@ubuntu-fpga:~# glmark2
```





# 参考



## 今回の関連記事


* [『Debian/Ubuntu でKV260 で冷却ファンを制御する (その１)』 @Qiita]
* [『Debian/Ubuntu でKV260 で冷却ファンを制御する (その２)』 @Qiita]


## GitHub リポジトリ


* https://github.com/ikwzm/K26-Fan-Enable.git


[『Debian/Ubuntu でKV260 で冷却ファンを制御する (その１)』 @Qiita]: https://qiita.com/ikwzm/items/345184df3a7abd6b4a26 "『Debian/Ubuntu でKV260 で冷却ファンを制御する (その１)』 @Qiita"
[『Debian/Ubuntu でKV260 で冷却ファンを制御する (その２)』 @Qiita]: https://qiita.com/ikwzm/items/f94748f5353271aab5ee "『Debian/Ubuntu でKV260 で冷却ファンを制御する (その２)』 @Qiita"
[『Debian/Ubuntu でKV260 で冷却ファンを制御する (その３)』 @Qiita]: https://qiita.com/ikwzm/items/23149d29339e8442eed2 "『Debian/Ubuntu でKV260 で冷却ファンを制御する (その３)』 @Qiita"