Armadilloフォーラム

ユーザースイッチ状態のシェルでの取得

tmygt

2023年5月8日 13時30分

起動時にユーザスイッチの状態を読み取って処理を切り替えたいと考えています。
/etc/local.d に起動時処理のスクリプトを置き、ユーザスイッチの状態に応じて処理を切り替えたいです。
スクリプト内でスイッチの状態を取得する簡単な方法はありますでしょうか?

gpiogetでの取得を試しましたが、エラーで取得できませんでした。

armadillo:~# gpioget gpiochip0 13
gpioget: error reading GPIO values: Resource busy

下記の例では、コンテナ内でスイッチの状態を検知するためのCでアプリケーションを作成していますが、可能であればarmadillo base osにデフォルトで含まれるコマンドの組み合わせでスイッチの状態を取得したいです。
https://armadillo.atmark-techno.com/forum/armadillo/11069

よろしくお願いいたします。

コメント

at_dominique.m…

2023年5月8日 14時08分

tmygtさん

お世話になっています、
アットマークテクノのマルティネです。

> gpiogetでの取得を試しましたが、エラーで取得できませんでした。

そうですね、gpio-key のドライバで取得しているため gpio を直接に読めません。

> 下記の例では、コンテナ内でスイッチの状態を検知するためのCでアプリケーションを作成していますが、可能であればarmadillo base osにデフォルトで含まれるコマンドの組み合わせ>でスイッチの状態を取得したいです。
> https://armadillo.atmark-techno.com/forum/armadillo/11069

Armadillo Base OS でボタンの状態を扱うためのプログラムは buttond ですので、少し強引ですが起動時にも使えます。

この方法の問題は、ボタンが予め押されている場合には input のイベントがありません(普通のキーボードの様なリピートは設定されてません)ので、タイミングによってスイッチの状態を確認できない場合があります。
これが問題でしたら、sw1 を gpio-keys から外した方がいいかもしれません。

選択肢をまとめると:
* ボタンプレスを起動後に察知するだけでいいなら、/etc/conf.d/buttond だけで対応できます。
* 起動中に数秒の間に察知したい場合は少し汚いですが、 /etc/local.d/xyz.start で LED の合図でもして、timeout 10s buttond -i /dev/input/by-path/platform-gpio-keys-event -l PROG1 -t 200 -a 'action' で対応できます。
(-l の long press を使うとボタンをリリースしなくても反応できますが、タイミングが短くすぎると debounce の処理で不具合があるため 200ms 以上にする必要があります。timeout も
少しきたないので、以降の改善で内部に対応しようと思います。)
* device tree overlay で sw1 の gpio-key を無効にして gpio を直接に確認できます。
具体的には https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro… を参考にして、arch/arm64/boot/dts/freescale/armadillo_iotg_g4-customize.dts&gpio_keys_sw1 { status = "broken"; } の様な内容で無効化できると思います。(「簡単」から少し離れますが…)

いかがでしょうか。

よろしくお願いします。

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

> この方法の問題は、ボタンが予め押されている場合には input のイベントがありません(普通のキーボードの様なリピートは設定されてません)ので、タイミングによってスイッチの状態を確認できない場合があります。
> これが問題でしたら、sw1 を gpio-keys から外した方がいいかもしれません。

https://armadillo.atmark-techno.com/blog/615/15336 に従ってbuttondを使う方法を試していて、デバイスの電源をオンにする以前からPushSWを押していた場合に検知できなかったため、この質問にあるようなGPIOの読み取りを試していました。

> * 起動中に数秒の間に察知したい場合は少し汚いですが、 /etc/local.d/xyz.start で LED の合図でもして、timeout 10s buttond -i /dev/input/by-path/platform-gpio-keys-event -l PROG1 -t 200 -a 'action' で対応できます。
> (-l の long press を使うとボタンをリリースしなくても反応できますが、タイミングが短くすぎると debounce の処理で不具合があるため 200ms 以上にする必要があります。timeout も
> 少しきたないので、以降の改善で内部に対応しようと思います。)

上記の方法でも、電源オン以前からボタンが押されている場合は検出できないということでしょうか?

もし検出できないのであれば、gpio-keysの無効化を試すつもりです。
よろしくお願いいたします。

at_dominique.m…

2023年5月9日 9時52分

> https://armadillo.atmark-techno.com/blog/615/15336 に従ってbuttondを使う方法を試していて、デバイスの電源をオンにする以前からPushSWを押していた場合に検知できなかったため、この質問にあるようなGPIOの読み取りを試していました。

そうでしたね。
一応、gpio-keys 全体に「autorepeat」を追加したら起動後でも検知可能になりますが、他のプログラムが input ファイルを読み込んでいる場合に不具合につながるかもしれませんので、buttond ですでに押してある状態を確認するようにしてみました。

今月末にリリースすることになると思いますが、それまでに以下のブランチを使って確認できます:
https://github.com/atmark-techno/buttond/tree/test

(G4 本体でビルドできます。「apk add meson gcc musl-dev linux-headers」 でメモリ上に依存をインストールしてから、「meson build -Dprefix=/usr && ninja -C build && ninja -C build install」でインストールして、「persist_file /usr/bin/buttond」でバイナリだけを永続化できます)

> 上記の方法でも、電源オン以前からボタンが押されている場合は検出できないということでしょうか?

コンテナからのアクセスとまったく同じ問題ですね。
上記のバージョンでしたらどちらの方法で検知されます。

> もし検出できないのであれば、gpio-keysの無効化を試すつもりです。

gpio-keys の無効化か buttond の更新のどちらでもいいと思います。

よろしくお願いします。

> 一応、gpio-keys 全体に「autorepeat」を追加したら起動後でも検知可能になりますが、他のプログラムが input ファイルを読み込んでいる場合に不具合につながるかもしれませんので、buttond ですでに押してある状態を確認するようにしてみました。
>
> 今月末にリリースすることになると思いますが、それまでに以下のブランチを使って確認できます:
> https://github.com/atmark-techno/buttond/tree/test

ありがとうございます。G4でビルドし適用したところ、電源をオンにする前からスイッチを押していた場合でも検知できることを確認できました。
これで想定している機能を実現できそうです。

今後ともよろしくお願いいたします。