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-tsuchida
お世話になております。
ご回答頂きありがとうございます。
>起床時のスクリプトで /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
アットマークテクノ高橋です。
現状では、以下の手順で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/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…
at_shinya.koga
2021年6月21日 6時55分
アットマークテクノの古賀です。
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 を見ても、どちらが起床要因になったか判別することは、困難でしょう。
お力になれる回答ではなく、恐縮ですが、もし参考になりましたら幸いです。