SSブログ

kernel4.19でのsysfs [Raspberry Pi]

先日、rpi-updateでRaspbianのkernelが4.14から4.19にアップデートされた。rpi-updateを起動するとこんな警告が出る。
#############################################################
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を見てもそれらしい情報がない。ググってもこれだという情報に行きあたらない。

僕はこれが動かないと非常に困る、というようなものではないけど、少し不便なのと、せっかく書いたのが動かなくなるのはやっぱり面白くない。

誰かご存知ありませんか?
nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

また1日無駄にした納得いかねーな ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。