mmshirose
2019年3月19日 10時06分
「ELS31-Jがハングアップした時、Linuxからリセットしたい」と考えております。
解決法や回避法などがあればご教授お願いいたします。
■経緯
電波が少し弱い環境(シグナルで60程度)に設置していると、
LTE再接続が発生した時、ELS31-Jがハングアップする事があります。
connection-recoverのwwan-force-restartにより、
何度か助けられるのですが、
どうしても復活できないことが何度か発生します。
■現象(復活できないとき)
lsusbしても1e2d:00a0(ELS31-J)が見えません。
/dev/ttyACM0ファイルが存在しません。
Linuxをshutdown -r nowしても復活しません。
poweroffと/sys/class/rtc/rtc1/wakealarmによる電源OFF/ONしても復活しません。(i.MX 7DualだけOFF/ONした?)
ACアダプタの抜き差しで復活できます。
■希望
最終的に「リセット出来れば良い」と考えています。
例えば・・・
・ELS31-JのGPIOを制御して、チップのリセット指示
・ELS31-JのEMERG_RST端子を叩く。GPIO?
・BMICを制御して、本体のOFF/ONする。GPIO?I2C4?
■製品情報
型番:Armadillo-IoT G3L
Linuxバージョン:kernel 3.9
イメージ:install_disk_sd_jessie_20180801_iotg3l.img
キャリア:IIJ モバイルタイプ/I
ELS31-Jファーム:els31-j_firmware-arev30063.zip
■補足
https://armadillo.atmark-techno.com/forum/armadillo/3471
上記のトピックでファームウエア改善を望んでおりましたが、
時間が掛かりそうなので並行して「リセットで回避」を立てさせて頂いた次第です。
mmshirose
2019年3月21日 15時48分
続報です。
■GPIO509
GPIO509を叩くことで、
OFF/ONリブード?が実行され、
「ELS31-Jが認識されること」が判りました。
---------------
echo 509 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio509/direction
echo 1 > /sys/class/gpio/gpio509/value
---------------
【注意】
上記コマンドは、シャットダウンシーケンスが走りません。電源OFF/ONと同じような動きをします。
ファイルシステムが破損する可能性があります。
十分にご注意下さい。
現時点で4回中4回成功しました。
引き続き確認中です。
/sys/を見た感じでは「i2c-3/3-0014」となっていたので、
i2c経由でBMIC(0x14)を制御している様な気がしますが・・・
https://manual.atmark-techno.com/armadillo-iot-g3l/armadillo-iotg-g3l_p…
BMICで本体電源をOFF/ONしているのであれば、
私としては当初の要望通りの動作になります。
■GPIO509を叩いて大丈夫?
もしご存じの方がいればご教授頂ければ嬉しいのですが、
そもそも「GPIO509を叩くこと」は、問題ございますか?
ファイルシステムを停電対応のオーバーレイにしていれば、
大きい問題はなさそうと感じております。
ハード的に問題があれば、控えた方が良いかと思った次第です。
■nmcliコマンド
今回の調査で判ったのですが、
nmcliコマンドがハングアップして、
connection-recoverd処理が停止してしまう事があるようです。
nmcliコマンドに、
「timeout -k 60 600」を追記して、
タイムアウト処理を入れて対応しております。
秒数指定は特に意味なく感覚です。
■テストコード
systemdのリブード処理の最終段を、
純正の「systemctl --force reboot」から、
「GPIO509リブード」に入れ替えてみました。
ご参考までに。
通常ファイルシステム用
---------------
echo '#!/bin/sh' > /bin/gpio509reboot.sh
echo 'echo 509 > /sys/class/gpio/export' >> /bin/gpio509reboot.sh
echo 'echo out > /sys/class/gpio/gpio509/direction' >> /bin/gpio509reboot.sh
echo 'echo 1 > /sys/class/gpio/gpio509/value' >> /bin/gpio509reboot.sh
chmod 755 /bin/gpio509reboot.sh
sed -i -e "s/systemctl --force reboot/gpio509reboot.sh/g" /lib/systemd/system/systemd-reboot.service
sed -i -e "s/^FORCE_REBOOT=FALSE/FORCE_REBOOT=TRUE/g" /etc/connection-recover/gsm-ttyACM0_connection-recover.conf
sed -i -e "s/nmcli connection down/timeout -k 60 600 nmcli connection down/g" /usr/bin/connection-recoverd
sed -i -e "s/nmcli connection up/timeout -k 60 600 nmcli connection up/g" /usr/bin/connection-recoverd
---------------
オーバーレイファイルシステム用
---------------
echo '#!/bin/sh' > /overlay/system/bin/gpio509reboot.sh
echo 'echo 509 > /sys/class/gpio/export' >> /overlay/system/bin/gpio509reboot.sh
echo 'echo out > /sys/class/gpio/gpio509/direction' >> /overlay/system/bin/gpio509reboot.sh
echo 'echo 1 > /sys/class/gpio/gpio509/value' >> /overlay/system/bin/gpio509reboot.sh
chmod 755 /overlay/system/bin/gpio509reboot.sh
sed -i -e "s/systemctl --force reboot/gpio509reboot.sh/g" /overlay/system/lib/systemd/system/systemd-reboot.service
sed -i -e "s/^FORCE_REBOOT=FALSE/FORCE_REBOOT=TRUE/g" /overlay/system/etc/connection-recover/gsm-ttyACM0_connection-recover.conf
sed -i -e "s/nmcli connection down/timeout -k 60 600 nmcli connection down/g" /overlay/system/usr/bin/connection-recoverd
sed -i -e "s/nmcli connection up/timeout -k 60 600 nmcli connection up/g" /overlay/system/usr/bin/connection-recoverd
---------------