たまたま調べていて12-CURRENTの頃にgoogle summer of codeでユーザランドのgpioイベントが実装されている事に気がつきました。
このコードはFreeBSDのいくつかのシステムコールに対応していてINTRNGを使った仕組みのようです。開発時にはarmのSOCで確認していたようですが、mipsでもmediatekはINTRNGに対応しているので使えるのではないかと思いました。
従来はポーリングで状態変化を確認していましたが、あまり起きないイベントの場合、資源の少ないモジュールではコストがばかになりません。またポーリングの間隔によってはイベントを見逃す可能性もあります。
テストコードがtools/test/gpioeventsにあります。
いとしのRT3050(FON2305)用にZRouerでmipselをビルドしてみます。
WORLD_SUBDIRS+=tools/test/gpioevents
実行してみます。
# /usr/bin/gpioevents -f /dev/gpioc0 -s 12 er
time 1140.154975861 pin 12 state 1
ボタンを押して離すとプログラムが終了します。このボタンはプルアップされているので、離したときに、0->1の変化になり、それを拾います。
ちゃんと見てないですがmips/mediatekのgpioは私がgpioppsのためにちょっといじっていて、それが効いているのかもしれません。
gpioeventsはshare/examplesに置いても良いように思います。
mrubyのmrbgemsでバインディングしたいな。