Armadilloフォーラム

ELS31-JをLinuxからリセットしたい

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
---------------