System Monitor サンプル
このセクションでは、T2 トポロジーベースのリポジトリ内で System Monitor アプリケーションをビルドして実行する例を示します。
System Monitor とは
System Monitor の詳細は System Monitor (現時点では日本語のみ) にありますが、主に次の特徴があります。
- FPGA Watchdog
-
SC-OBC Module A1 のシステムは TRCH (Timing, Reset, Config & Health Controller) によって監視されており、FPGA は watchdog 信号を介して内部状態を TRCH に報告します。
| TRCH による監視はデフォルトでは無効なので、FPGA Watchdog 機能の利用は必須ではありません。 |
- SEM Controller
-
SEM (Soft Error Mitigation) Controller は、AMD FPGA のコンフィギュレーションメモリに発生するエラーを検出および訂正するために AMD が提供している機能です。 SC-OBC Module A1 の FPGA はこの機能をシステムに統合しており、System Monitor レジスタを通じて SEM Controller の状態にアクセスできます。
- Board Health Monitor (BHM)
-
Board Health Monitor (BHM) は、SC-OBC Module A1 に搭載されたセンサのデータを容易に取得できる機能です。 OBC モジュールには、2 個の電流 / 電圧モニタと 3 個の温度センサが搭載されています。 BHM を使うと、ソフトウェアで複雑な I2C 操作を行わなくても、これらのセンサのデータを自動取得できます。
System Monitor ドライバ
現在、FPGA の System Monitor を制御するために、以下の Zephyr ドライバ API が提供されています。
| 機能 | API | 概要 | パラメータ | 戻り値 |
|---|---|---|---|---|
FPGA Watchdog |
sc_kick_wdt_timer |
FPGA Watchdog Timer をトグルする |
||
SEM Controller |
sc_sem_get_error_count |
SEM エラーカウントを取得する |
現在の SEM エラーカウント |
|
Board Health Monitor (BHM) |
sc_bhm_enable |
BHM による監視を有効にする |
0: 成功 |
|
sc_bhm_disable |
BHM による監視を無効にする |
0: 成功 |
||
sc_bhm_get_obc_temp |
オンボード温度センサ値を取得する |
pos: センサデバイス位置 |
0: 成功 |
|
sc_bhm_get_xadc_temp |
FPGA ダイ温度センサ値を取得する |
temp: 温度 [degree] |
0: 成功 |
|
sc_bhm_get_obc_cv |
オンボード電流 / 電圧センサ値を取得する |
pos: センサデバイス位置 |
0: 成功 |
|
sc_bhm_get_xadc_cv |
FPGA 電圧値を取得する |
pos: センサデバイス位置 |
0: 成功 |
これらの API は out-of-tree ドライバとして提供されており、https://github.com/spacecubics/scobc-a1-sample/tree/main/drivers/misc/sc_fpga[System Monitor Driver] で利用できます。
System Monitor サンプル
サンプルアプリケーションは System Monitor sample にあります。
サンプルコードの説明
CMakeLists.txt
CMakeLists.txt ファイルは、アプリケーションディレクトリの直下に配置する必要があります。
# Copyright (c) 2025 Space Cubics Inc.
# SPDX-License-Identifier: Apache-2.0
cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(system-monitor)
target_sources(app PRIVATE src/main.c)
ここでは、各アプリケーションごとに変更が必要となる箇所を説明します。
-
project: 任意のプロジェクト名を指定します
-
target_sources: ソースコードファイルを指定します
prj.conf
アプリケーションの実行に必要な追加の Kconfig パラメータを指定できます。
このサンプルでは、printf で float 型の温度データを表示するために CONFIG_PICOLIBC_IO_FLOAT を有効にする必要があります。
CONFIG_PICOLIBC_IO_FLOAT の詳細は CONFIG_PICOLIBC_IO_FLOAT を参照してください。
CONFIG_PICOLIBC_IO_FLOAT=y
ソースコード
ソースコードを以下に示します。詳細は後で個別に説明します。
/*
* Copyright (c) 2025 Space Cubics Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include "sc_sysmon.h"
int main(void)
{
int ret;
float temp;
int32_t bus;
ret = sc_bhm_enable();
if (ret < 0) {
printf("Failed to enable the Board Health Monitor: %d\n", ret);
goto end;
}
/* Wait for the first monitoring to finish */
k_sleep(K_SECONDS(1));
while (true) {
ret = sc_bhm_get_obc_temp(SCOBC_A1_TEMP_1, &temp);
if (ret < 0) {
printf("Failed to get the on Board Temperature 1: %d\n", ret);
goto end;
}
printf("On Board Temperature 1 : %.4f [deg]\n", (double)temp);
ret = sc_bhm_get_obc_cv(SCOBC_A1_3V3_BUS, &bus);
if (ret < 0) {
printf("Failed to get the 3V3SYS Bus voltage: %d\n", ret);
goto end;
}
printf("3V3SYS Bus voltage : %d [mV]\n", bus);
k_sleep(K_SECONDS(1));
}
end:
sc_bhm_disable();
return ret;
}
BHM を有効にする
FPGA の BHM による System Monitor を有効にします。負の値が返った場合、センサ初期化に失敗しています。
ret = sc_bhm_enable();
if (ret < 0) {
printf("Failed to enable the Board Health Monitor: %d\n", ret);
goto end;
}
1 秒待つ
現在の System Monitor ドライバ API では、BHM による監視間隔を変更できず、1 秒固定です。 そのため、最初のデータ取得が完了するまで 1 秒待ちます。
k_sleep(K_SECONDS(1));
オンボード温度センサ値を取得する
オンボード温度センサ 1 から温度データを取得し、コンソールに表示します。 負の値が返った場合、FPGA 内で温度センサデータがまだ更新されていない可能性があります。 他の値を取得したい場合は、Table 1. System Monitor Driver API List を参照し、SCOBC_A1_TEMP_1 を別のパラメータに変更してください。
ret = sc_bhm_get_obc_temp(SCOBC_A1_TEMP_1, &temp);
if (ret < 0) {
printf("Failed to get the on Board temperature 1: %d\n", ret);
goto end;
}
printf("On Board Temperature 1 : %.4f [deg]\n", (double)temp);
オンボード電圧センサ値を取得する
オンボード電圧センサから 3V3SYS BUS 電圧値を取得し、コンソールに表示します。 負の値が返った場合、FPGA 内で電圧センサデータがまだ更新されていない可能性があります。 他の値を取得したい場合は、Table 1. System Monitor Driver API List を参照し、SCOBC_A1_3V3_BUS を別のパラメータに変更してください。
ret = sc_bhm_get_obc_cv(SCOBC_A1_3V3_BUS, &bus);
if (ret < 0) {
printf("Failed to get the 3V3SYS Bus voltage: %d\n", ret);
goto end;
}
printf("3V3SYS Bus voltage : %d [mV]\n", bus);
コンソールを開く
SC-OBC Module A1 と PC の間をケーブルで接続し、端末でコンソールを開いてください。
tio /dev/ttyUSB2
| Zephyr コンソールを使用するには、DIP スイッチ (SW1) の bit3 (RX) と bit4 (TX) を ON にする必要があります。現在 OFF の場合は、ON に切り替えてください。 |
ビルド
CMakeLists.txt と prj.conf が配置されているサンプルアプリケーションのディレクトリを指定して、以下のようにビルドします。
cd ~/myproject
source .venv/bin/activate
west build -p always -b scobc_a1 --shield scobc_a1_dev scobc-a1-sample/samples/sysmon
確認
オンボード温度センサの温度と 3V3SYS バス電圧が、1 秒ごとにコンソールへ表示されることを確認してください。
*** Booting Zephyr OS build 60e8eb54f7ae ***
On Board Temperature 1 : 28.5000 [deg]
3V3SYS Bus voltage : 3256 [mV]
On Board Temperature 1 : 28.5000 [deg]
3V3SYS Bus voltage : 3256 [mV]
On Board Temperature 1 : 28.5000 [deg]
3V3SYS Bus voltage : 3256 [mV]
tio コンソールを終了したい場合は、まず Ctrl + t を押し、その後 q を押してください。