kernel4.19でのsysfs [Raspberry Pi]
先日、rpi-updateでRaspbianのkernelが4.14から4.19にアップデートされた。rpi-updateを起動するとこんな警告が出る。
ところがこれで動かなくなるのが出た。sysfs経由でgpioのBCM3を監視して変化があったら(具体的にはプッシュボタン長押し)シャットダウンするようにsystemdのサービスとして書いたのが
このコードはGPIOのBCM3ピンに変化があったら知らせてもらう、というもの。edgeファイルにraising、falling、bothを書き込むと、その変化があるとファイルシステム経由で検出できる。
ところが、edgeが書き換わらずに「none」のまま
その前のkernelだと同じコードが動いて
僕はこれが動かないと非常に困る、というようなものではないけど、少し不便なのと、せっかく書いたのが動かなくなるのはやっぱり面白くない。
誰かご存知ありませんか?
############################################################# WARNING: This update bumps to rpi-4.19.y linux tree Be aware there could be compatibility issues with some drivers Discussion here: https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=224931 ############################################################## Would you like to proceed? (y/N)いいかと聞かれてもこの時点で判断のしようがないので「y」を入力することになる。このままいくと「4.19.30-v7+」とかになる。
ところがこれで動かなくなるのが出た。sysfs経由でgpioのBCM3を監視して変化があったら(具体的にはプッシュボタン長押し)シャットダウンするようにsystemdのサービスとして書いたのが
sh: echo: I/O errorで動かない。どこが問題かというと
system("echo both > /sys/class/gpio/gpio3/edge");が失敗している。system()はCユーティリティ関数で、processをforkしてshを起動して引数文字列をshのコマンドとして実行するというもの。stdlib.hにプロトタイプがあって、ランタイムの一部になっている。シンプルなんだけどシグナルや入出力の処理をちゃんとしてくれるので、僕はしょっちゅう使っている。
このコードはGPIOのBCM3ピンに変化があったら知らせてもらう、というもの。edgeファイルにraising、falling、bothを書き込むと、その変化があるとファイルシステム経由で検出できる。
ところが、edgeが書き換わらずに「none」のまま
$ uname -a Linux vega 4.19.23+ #1203 Tue Feb 19 23:10:40 GMT 2019 armv6l GNU/Linux $ cat /sys/class/gpio/gpio3/edge none $になってしまう。他の単純なGPIOの読み書きは問題なさそうで、このedgeだけがうまくいかない。またsystem()ではなく、普通にedgeファイルをopen()してwrite()しても書き変わらない。
その前のkernelだと同じコードが動いて
$ uname -a Linux sirius 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l GNU/Linux $ cat /sys/class/gpio/gpio3/edge bothとちゃんと書き換わってる。rpi-updateの警告にあるurlを見てもそれらしい情報がない。ググってもこれだという情報に行きあたらない。
僕はこれが動かないと非常に困る、というようなものではないけど、少し不便なのと、せっかく書いたのが動かなくなるのはやっぱり面白くない。
誰かご存知ありませんか?