reComputer J4012セットアップ（ファンコントロール編）

## はじめに

Jetson Orin NXではデフォルトだとnvfancontrolデーモンがCPU温度に応じて冷却ファンの回転数を自動制御しています。ユーザーの用途によってはこれらをカスタマイズしたいことがあるため設定方法を紹介します。

## 動作確認環境

- reComputer J4012(Jetson Orin NX 16GB)
- JetPack 5.1.1

## 1. nvfancontrolデーモン

nvfancontrolデーモンはCPU温度に応じて冷却ファンの回転数を自動制御するデーモンです。Jetson Linuxインストール時点ではOS起動時にnvfancontrolデーモンが起動するようになっています。

### 1.1 現在の設定確認

以下のコマンドを実行してnvfancontrolデーモンの現在の設定を確認します。

```bash
sudo nvfancontrol -q
```

このコマンドの実行結果例を以下に示します。この結果から`quiet`プロファイルが選択されていることがわかります。

```bash
FAN1:FAN_PROFILE:quiet
FAN1:FAN_GOVERNOR:cont
FAN1:FAN_CONTROL:close_loop
```

### 1.2 設定ファイル

nvfancontrolデーモンの設定ファイルは`/etc/nvfancontrol.conf`にあります。デフォルトだと以下の設定になっています。

```conf
POLLING_INTERVAL 2

<FAN 1>
	TMARGIN ENABLED
	FAN_GOVERNOR cont {
		STEP_SIZE 10
	}
	FAN_CONTROL close_loop {
		RPM_TOLERANCE 100
	}
	FAN_PROFILE quiet {
		#TEMP 	HYST	PWM	RPM
		0	0	255	6000
		10	0	255	6000
		11	0	187	4000
		31	0	187	4000
		70	0 	0	0
		105	0 	0 	0
	}
	FAN_PROFILE cool {
		#TEMP 	HYST	PWM	RPM
		0	0	255	6000
		35	0	255	6000
		70	0 	0	0
		105	0 	0 	0
	}
	THERMAL_GROUP 0 {
		GROUP_MAX_TEMP 105
		#Thermal-Zone Coeffs Max-Temp
		CPU-therm 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0
		GPU-therm 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0
		SOC0-therm 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0
		SOC1-therm 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0
		SOC2-therm 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0
	}
	FAN_DEFAULT_CONTROL close_loop
	FAN_DEFAULT_PROFILE quiet
	FAN_DEFAULT_GOVERNOR cont
	KICKSTART_PWM 64
```

以下の記載からデフォルトのプロファイルは`quiet`となっていることがわかります。

```conf
FAN_DEFAULT_PROFILE quiet
```

また、`quiet`プロファイルの設定は以下のようになっています。ここにはTEMP（温度）とPWM、RPMの対応が記述されています。

```conf
FAN_PROFILE cool {
	#TEMP 	HYST	PWM	RPM
	0	0	255	6000
	35	0	255	6000
	70	0 	0	0
	105	0 	0 	0
}
```

そのため、`/etc/nvfancontrol.conf`を編集することで設定をカスタムすることができます。デフォルトに戻すことを考えてバックアップを取っておくとよいでしょう。

## 2. マニュアルファンコントロール

冷却ファンの回転数をマニュアルでコントロールする方法を紹介します。

- jetson_clocks
- 自作スクリプト

ただし、OSを再起動すると前述のnvfancontrolデーモンによる自動制御に戻る点に注意が必要です。

### 2.1 jetson_clocks

`--fan`オプションを付与してjetson_clocksコマンド実行することで冷却ファンをフル回転状態にすることができます。

```bash
sudo jetson_clocks --fan
```

ただし、冷却ファンをフル回転させた状態だとそれなりに音がするので注意が必要です。

### 2.2 自作スクリプト

前述の`--fan`オプションを付与したjetson_clocksコマンド実行ではフル回転以外の回転数を指定することができません。そこで任意のPWM値を指定できるスクリプトを自作します。以降の説明は`jetson_fan_controll.sh`というファイル名で作成したものとします。

```bash
#!/bin/bash

CMDNAME=`basename $0`
if [ $# -ne 1 ]; then
    echo "Usage: sudo $CMDNAME fan_pwm"
    exit 1
fi


[ "$(whoami)" != "root" ] && \
    echo Error: Run this script\($0\) as a root user && exit 1

FAN_PWM=$1
FAN_NODES=(
    /sys/devices/platform/pwm-fan*/hwmon/hwmon*/pwm*
    /sys/bus/i2c/drivers/f75308/*/hwmon/hwmon*/pwm*
)

# stop nvfancontrol service
systemctl stop nvfancontrol

# set pwm to files
for file in "${FAN_NODES[@]}"; do
    if [ -e "${file}" ]; then
        echo "${FAN_PWM}" > "${file}";
    fi
done
```

スクリプト実行例は以下の通りです。下記例における100はPWM値です。ここには0〜255の値を指定することができます。

```bash
sudo ./jetson_fan_controll.sh 100
```

マニュアル設定後、nvfancontrolデーモンによる自動制御に戻したいときは以下のコマンドを実行します。

```bash
sudo systemctl start nvfancontrol
```

## 3. 参考URL

- <https://docs.nvidia.com/jetson/archives/r35.3.1/DeveloperGuide/text/SD/PlatformPowerAndPerformance/JetsonOrinNanoSeriesJetsonOrinNxSeriesAndJetsonAgxOrinSeries.html#fan-profile-control>
- <https://docs.nvidia.com/jetson/archives/r35.3.1/DeveloperGuide/text/SD/PlatformPowerAndPerformance/JetsonOrinNanoSeriesJetsonOrinNxSeriesAndJetsonAgxOrinSeries.html#maximizing-jetson-orin-series-performance>