Armadilloフォーラム

起床原因の確認方法

y-tsuchida

2021年6月10日 20時27分

お世話になっております

root@armadillo:~# aiot-sleep

から起床したときに、何をトリガーに起床したのかを確認する手段はございますでしょうか

#!/bin/sh
case $1/$2 in
    pre/*)
        echo `date` " goodnight" $1 $2 >> /home/atmark/boot.log
    ;;
    post/*)
        echo `date` " wakeUP" $1 $2 >> /home/atmark/boot.log
    ;;
esac

のように、起床時のスクリプトを確認してみましたが、いずれの起動でも[$2 = suspend]でございます。

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

コメント

アットマークテクノの古賀です。

y-tsuchihdaさん(2021年6月10日 20時27分):
>root@armadillo:~# aiot-sleep
>から起床したときに、何をトリガーに起床したのかを確認する手段はございますでしょうか

ありません。

>#!/bin/sh
>case $1/$2 in
> pre/*)
> echo `date` " goodnight" $1 $2 >>/home/atmark/boot.log
> ;;
> post/*)
> echo `date` " wakeUP" $1 $2 >>/home/atmark/boot.log
> ;;
>esac
>
>のように、起床時のスクリプトを確認してみましたが、いずれの起動でも[$2 = suspend]でございます。

/lib/systemd/system-sleep/ に配置するスリープ時・起床時のスクリプトは、systemd-suspend.service によって実行されますが、systemd-suspend.serive が、このスクリプへ起床時に渡す第二引数は、"suspend", "hibernate", "hybrid-sleep", "suspend-then-hibernate" のいずれかであり、Armadillo の場合、"suspend" しか起こり得ないのです:
https://www.freedesktop.org/software/systemd/man/systemd-suspend.servic…

Armadillo-IoT A6 で使用可能な起床要因のうち、どれで起床したのかを知るためには、CPU が起床した直後に、割り込みコントローラを見て、どの割り込みがアクティブになっているかを調べ、それを記憶する必要がありますが、Linux カーネルには、そのような仕組みがありません:
https://www.kernel.org/doc/html/latest/power/suspend-and-interrupts.html
OS としては、スリープモードから起床した際、アクティブな割り込みを通常通り応答動作するだけです。起床要因となった割り込みが何かを判別して特別処理する必要性は、特にありませんので、起床要因割り込みを記憶する仕組みが無いのだと思います。

もし、どうしても起床要因が何かを知る必要があり、Linux カーネルを改造せずに対応したい、という場合には、/lib/systemd/system-sleep/ に配置するスリープ時・起床時のスクリプトで /proc/interrupts の内容を見て、起床要因割り込みのうち、スリープ前と起床後とで割り込み発生回数が違うものを調べる、という方策で対処できるケースがあるかも知れません。
https://linuc.org/study/knowledge/462/
しかし、USB インタフェースに USB デバイスが装着されている場合、起床時に割り込みが発生するでしょうから、二つの USB インタフェース(CON5 の上段か下段)のどちらか一方を挿抜して起床した際、もう一方にも USB デバイスが装着されていると、/proc/interrupts を見ても、どちらが起床要因になったか判別することは、困難でしょう。

お力になれる回答ではなく、恐縮ですが、もし参考になりましたら幸いです。

お世話になております。

ご回答頂きありがとうございます。

>起床時のスクリプトで /proc/interrupts の内容を見て、起床要因割り込みのうち、スリープ前と起床後とで割り込み発生回数が違うものを調べる、という方策で対処できるケースがあるかも知れません。
> https://linuc.org/study/knowledge/462/

上記内容確認いたしました。今回のソリューションにおいては、
 ・RTCタイマからの自動起動
 ・スイッチ押下による手動起動
が区別できれば良いのでSW1の値の変化を確認することで、対応できそうです。

cat /proc/interupts
...(中略)
 64:         0  gpio-mxc  10 Edge      SW1

↓スイッチ押下後

cat /proc/interupts
...(中略)
 64:         2  gpio-mxc  10 Edge      SW1

となることが確認できました。

関連して質問させていただきます。
SMS起床可能モードでスリープし、SMSによった起床した場合、
起床原因となったSMSメッセージは取得することは可能でしょうか
また、可能な場合その方法をご教授いただけないでしょうか

at_keitaro.takahashi

2021年6月28日 11時11分

アットマークテクノ高橋です。
現状では、以下の手順でSMSを取得することができます。(電話番号は伏せています)

root@armadillo:~# aiot-modem-control hangup
root@armadillo:~# aiot-modem-control send-at-echo AT+CMGF=1 #各電源投入後に1回のみ
AT+CMGF=1
OK
 
root@armadillo:~# aiot-modem-control send-at-echo AT+CMGL="ALL"
AT+CMGL=ALL
+CMGL: 1,"REC READ","080********",,"21/06/04,15:40:58+36"
Hello
 
OK

今後のアップデートで、aiot-modem-controlにSMSの送信/受信等が直接行えるコマンドを追加する予定です。

at_keitaro.takahashi

2021年12月1日 16時53分

アットマークテクノ高橋です。

2021/11/30実施の製品アップデートにて、aiot-modem-controlでSMSの送信/受信等を行えるようアップデートいたしました。
以下のコマンドでアップデートが可能です。

sudo apt update
sudo apt install ems31-utils

詳細・使用方法は製品マニュアルをご確認ください。

「Armadillo-IoT ゲートウェイ A6 製品マニュアル 6.2.5. SMSを利用する」
https://manual.atmark-techno.com/armadillo-iot-a6/armadillo-iota6_produ…