Armadilloフォーラム

省電力モードの使用方法

naito

2025年6月9日 10時59分

==========
製品型番:Armadillo-900
Debian/ABOSバージョン:ABOS 3.21.3-at.9
カーネルバージョン:5.10.236-at2
==========
お世話になっております。

Armadillo-900で省電力動作について検討しておりますが、2点質問があります。

まず1点目がSleepモードの使用方法についてです。
製品マニュアル「2.1.2. Armadillo-900 とは」に「Sleep モードの使用方法については現時点で本マニュアルには記載しておりません。使い方の説明が必要な場合には Armadilloフォーラムにてお問い合わせください。」と記載がありましたので使用方法をお聞きしたいです。

次に2点目ですが、Deep Sleepモードへの遷移を実行しようとしたところ下記のように失敗しました。
failed to connect().

Arm Cortex-M33との通信が必須となっているか、また失敗の原因についてもご教授ください。

以上、よろしくお願いいたします。

コメント

at_dominique.m…

2025年6月9日 18時51分

naitoさん、

お世話になっています、
マルティネです。

逆順で回答します。

> 次に2点目ですが、Deep Sleepモードへの遷移を実行しようとしたところ下記のように失敗しました。
> failed to connect().

申し訳ございません、間欠動作を一時的に無効化する機能を追加しましたが Armadillo 900 開発ボードで atmark-power-utils を起動させてないため5月のアップデートにこのエラーになってしまいました。
自分も先週気づいて今月のアップデートで修正が入りますが、それまでに aiot-sleep のスクリプトを直接に編集していただければ幸いです:

armadillo:~# vi /usr/bin/aiot-sleep
## 最後の方のこの部分を削除し…
if power-utils enter_sleep; then
    sleep_func="aiot_sleep_$(get_module_model)"
    "$sleep_func" "$1"
    power-utils leave_sleep
fi
## 以下の内容と入れ替えます (if内の頭部分を残します)
sleep_func="aiot_sleep_$(get_module_model)"
"$sleep_func" "$1"
 
armadillo:~# persist_file -v /usr/bin/aiot-sleep
'/mnt/usr/bin/aiot-sleep' -> '/target/usr/bin/aiot-sleep'

お手数をおかけしますがよろしくお願いします。

> 製品マニュアル「2.1.2. Armadillo-900 とは」に「Sleep モードの使用方法については現時点で本マニュアルには記載しておりません。使い方の説明が必要な場合には Armadilloフォーラムにてお問い合わせください。」と記載がありましたので使用方法をお聞きしたいです。

こちらについてもすみません、deep sleep と違って sleep モードでは watchdog タイマーが停止されてなくて、linux がサスペンドされている間に m33 側で定期的にリセットする必要があります。
また、現状では m33 コアのクロック変更もできますが NXP から頂いた関数で不便な使い方になっていますので、全体的にかなり荒い状態です。

6月末のリリースに正式にリリースしますが、m33_firmware_at ディレクトリを以下のブランチにしていただければもう少しマシな環境になります(watchdog の対応が不要になって、m33 のクロックの変更を自動的にできるおゆになります)
https://github.com/atmark-techno/m33-firmware-at/commits/for_test_light…

1/ まだでしたら、マニュアル通りに m33_firmware_at を置き換えて、テストブランチを利用します

cd imx-boot-2023.04-at4
rm -rf m33_firmware_at
git clone https://github.com/atmark-techno/m33-firmware-at m33_firmware_at
cd m33_firmware_at
git checkout for_test_light_sleep

2/ m33_firmware_at 内で sleepWithLinux のグローバル変数を LPM_PowerModeActiveUD に変更し、linux 側で A35 コアを suspend しても m33 コアがサスペンドされず、クロックを 38.4MHz に変更されます。
APP_SRTM_WakeupCA35() を実行すると linux が復帰します。
m33_firmware_at/cli.cCLI_sleepMode()CLI_wakeup()、と CLI_m33DriveMode() を参考できます。
デバッグ用なので help に表示してませんが、m33 の cli からも利用して動作確認できます:

# usage表示
M33> help sleep_mode
sleep_mode
 
Usage:
sleep_mode [deepsleep|sleep|powerdown|active|active_ud|ignore]
M33> help wakeup
wakeup
M33> help m33_drive_mode
m33_drive_mode
 
Usage:
m33_drive_mode [UD|ND|OD]
 
# テスト用にモードを変更します
M33> sleep_mode active_ud
# ここで linux から A コアをサスペンドします
M33> Wakeup requested on 1/2 (WUU 19), mode 3
Wakeup requested on 1/13 (WUU 25), mode 4
 
AD will enter Power Down Mode
AD entered PD(linux suspend to ram)/DPD(linux shutdown) mode
PMIC_LDO3 is 3300000 [uV]
PMIC_LSW2 is 0 [uV]
PMIC_LSW4 is 0 [uV]
HandleSuspendTask: target 0
Starting m33 wdt timer
Suspended tasks...
m33 clock underclocked
 
# wakeup コマンドで linux を起床させます
M33> wakeup
M33> 
AD resume from Power Down Mode
 
AD entered active mode
first watchdog ping

)

…さらにすみません、上記を書いた後に不具合も発見しました。
上記の流れで linux を起床する際に m33 側の「Resume」フローを通ってないので、いくつかのドライバは動作しなくなる・m33 のクロックは遅いままになります。(active/active_ud モードの場合の問題です)
明日修正しますが、使い方としては変更ありませんので説明を残して先に返事させていただきます。

ブランチ名の通り「テスト用」ですので、マニュアルを書きながら微調整もする可能性は高いです。
使ってみて何か感想があれば遠慮なくいってください。

よろしくお願いします

at_dominique.m…

2025年6月10日 16時12分

マルティネです。

> …さらにすみません、上記を書いた後に不具合も発見しました。
> 上記の流れで linux を起床する際に m33 側の「Resume」フローを通ってないので、いくつかのドライバは動作しなくなる・m33 のクロックは遅いままになります。(active/active_ud モードの場合の問題です)
> 明日修正しますが、使い方としては変更ありませんので説明を残して先に返事させていただきます。

こちらの問題をテストブランチで修正しました:
* wakeup 関数ですが、 APP_SRTM_WakeupCA35() ではなく APP_Wakeup(from_ISR); を使ってください(irq内かどうかを渡してください)
* gpio が起床要因として設定される場合は sleep_mode active/active_ud でも iomux を WUU に変更して、ただし起床処理で起床させます。

まだ未完成な状態で使わせってしまって申し訳ないですが、できるだけのフォローをしますので違和感や質問があれば何でも聞いてください。

よろしくお願いします

お世話になっております。
内藤です。

いろいろとご対応いただきありがとうございます。

> 申し訳ございません、間欠動作を一時的に無効化する機能を追加しましたが Armadillo 900 開発ボードで atmark-power-utils を起動させてないため5月のアップデートにこのエラーになってしまいました。
> 自分も先週気づいて今月のアップデートで修正が入りますが、それまでに aiot-sleep のスクリプトを直接に編集していただければ幸いです:
Deep Sleepモードに遷移するようになりました。
ありがとうございます。

> > 製品マニュアル「2.1.2. Armadillo-900 とは」に「Sleep モードの使用方法については現時点で本マニュアルには記載しておりません。使い方の説明が必要な場合には Armadilloフォーラムにてお問い合わせください。」と記載がありましたので使用方法をお聞きしたいです。
>
~ 中略 ~

> # usage表示
> M33> help sleep_mode
> sleep_mode
> 
> Usage:
> sleep_mode [deepsleep|sleep|powerdown|active|active_ud|ignore]
> M33> help wakeup
> wakeup
> M33> help m33_drive_mode
> m33_drive_mode
> 
> Usage:
> m33_drive_mode [UD|ND|OD]
> 
> # テスト用にモードを変更します
> M33> sleep_mode active_ud
> # ここで linux から A コアをサスペンドします
> M33> Wakeup requested on 1/2 (WUU 19), mode 3
> Wakeup requested on 1/13 (WUU 25), mode 4
> 
> AD will enter Power Down Mode
> AD entered PD(linux suspend to ram)/DPD(linux shutdown) mode
> PMIC_LDO3 is 3300000 [uV]
> PMIC_LSW2 is 0 [uV]
> PMIC_LSW4 is 0 [uV]
> HandleSuspendTask: target 0
> Starting m33 wdt timer
> Suspended tasks...
> m33 clock underclocked
> 
> # wakeup コマンドで linux を起床させます
> M33> wakeup
> M33> 
> AD resume from Power Down Mode
> 
> AD entered active mode
> first watchdog ping

m33_firmware_at ディレクトリのブランチ変更したイメージをArmadillo-900に書き込むところまではできました。

初歩的な質問で申し訳ないのですが、m33 の CLI から動作を確認したく、
マニュアル「5.5.14. RTD 用コンソール を使用する」の通りにセッティングしたのですがコンソール入出力ができません。
何か他に必要な設定があるのか、そもそもm33 側の CLI の使用方法が違うのかご教授ください。

以上、よろしくお願いいたします。

at_dominique.m…

2025年6月11日 14時31分

マルティネです。

> 初歩的な質問で申し訳ないのですが、m33 の CLI から動作を確認したく、
> マニュアル「5.5.14. RTD 用コンソール を使用する」の通りにセッティングしたのですがコンソール入出力ができません。
> 何か他に必要な設定があるのか、そもそもm33 側の CLI の使用方法が違うのかご教授ください。

コンソールの出力を設定すればそのまま利用できるはずです。
Enter 入力で「M33>」と prompt が表示されて、簡易インタフェースですがコマンドを入力できます。

必要な設定は
* RTDコンソールポートの近くの SW3 を "RTD CNSL" に設定する
* ソフトウェア仕様にリストされる方法の 2 (u-boot 環境変数)か 3 (m33-firmware-at のソース変更)で出力を有効化する

お手数ですが、設定を確認させていただけますか?
* u-boot の環境変数の場合は linux 起動後に「fw_printenv m33_console」で表示
* ソース変更の場合は git diff 等でのコード確認。

また、製品マニュアルを予め確認してビルドまでは説明していますが、インストール方法まで紹介してないですね…すみません…
u-boot の環境変数ですが、 /boot/uboot_env.d で記載する内容は SWU によるインストールの場合に自動的に書き込まれますが、dd 等で直接に /dev/mmcblk0boot* に書き込む場合は詳細によっては保存されなかった可能性がありますので、ご利用の更新方法も教えていただければ幸いです。
(CLI を利用できたら、「version」コマンドで書き込んだイメージのバージョンを確認できます。デフォルトでは git describe の情報が入って、tag かコミット id が入ります)

よろしくお願いします

内藤です。
返答が遅くなり申し訳ございません。

> 必要な設定は
> * RTDコンソールポートの近くの SW3 を "RTD CNSL" に設定する
> * ソフトウェア仕様にリストされる方法の 2 (u-boot 環境変数)か 3 (m33-firmware-at のソース変更)で出力を有効化する
>
> お手数ですが、設定を確認させていただけますか?
> * u-boot の環境変数の場合は linux 起動後に「fw_printenv m33_console」で表示
> * ソース変更の場合は git diff 等でのコード確認。

SW3の設定は行いましたが、出力を有効化していませんでした。
下記で m33 側のCLIが使用できました。ありがとうございます。

fw_setenv m33_console 22/23

> また、製品マニュアルを予め確認してビルドまでは説明していますが、インストール方法まで紹介してないですね…すみません…
> u-boot の環境変数ですが、 /boot/uboot_env.d で記載する内容は SWU によるインストールの場合に自動的に書き込まれますが、dd 等で直接に /dev/mmcblk0boot* に書き込む場合は詳細によっては保存されなかった可能性がありますので、ご利用の更新方法も教えていただければ幸いです。
> (CLI を利用できたら、「version」コマンドで書き込んだイメージのバージョンを確認できます。デフォルトでは git describe の情報が入って、tag かコミット id が入ります)

アップデートはSWUで行っています。
SWUでの m33 側イメージのインストール方法を教えてください。
(ブートローダーのビルドで m33 のイメージも組み込まれていると思い込んでいました)

以上、よろしくお願いいたします。

マルティネです。

> アップデートはSWUで行っています。
> SWUでの m33 側イメージのインストール方法を教えてください。
> (ブートローダーのビルドで m33 のイメージも組み込まれていると思い込んでいました)

その認識であっています。

https://manual.atmark-techno.com/armadillo-900-development-kit/armadill…
の通りにビルドして(ビルド出力に m33-firmware-at.bin が生成されてるを確認して)、「swdesc_boot imx-boot_armadillo-900」でインストールすれば再起動の際に m33ファームウェアも新しいバージョンで起動します。

そこはマニュアル通りで問題ないですが、普段(u-boot/m33-firmware-at以外)の開発ではブートローダーが起動する前提とちがって、m33 ファームウェアの開発で起動できなくなることは十分考えれます。
u-boot が起動できなくなった場合はロールバック機能も動かなくなって、基本的にインストールディスクで復帰するながれになりますので、何回か繰り返すとかなりの手間ですね。
そう考えると SD ブートを活用して、(SWU でインストールできない)SD から eMMC の imx-boot 更新か eMMC から SD の imx-boot 更新のどちらかの手順も説明した方がいいと考えていました。
6月のアップデートに書き足したい内容はかなりありますのでもしかしたら間に合わないかもしれませんが順番に更新させていただきます。それまでに必要になりそうでしたら聞いてください。

お手数ですがよろしくお願いします