RaspberryPiでLIRCする(2016/04仕様変更?)

 2016-04-24
apt-get upgrade とか apt-get dist-upgrade とか rpi-update とかやってたら、急にLIRCが動かなくなりました。
なにもしてないのにこわれた!!

どうやら? 仕様変更が? あったらしい??

またかよ!!!!

 

rpi-update : kernel 4.4.x

どうやらRaspberryPiの最新kernelがkernel4.4.x系に更新されたらしく、2016/04/13以降(?)にrpi-updateをすると、とくに指定してない限りkernel4.4x系になるようです。(その旨のメッセージが実行時に出ます)

すると、、、、 今までの設定方法ではlircが動かなくなります。 やったぜ!!



これまでの経緯とか


最初の頃のRaspberryPi

 /etc/modules に下記の様な設定分を書いていました。
lirc-rpi gpio_in_pin=23 gpio_out_pin=24
当時はコレで動いていました。 古き良き時代。(かどうかは分からないが)



2015/02(?)以降~2016/04以前のRaspberryPi

上記のように /etc/modules に記述する方法のままでは、そもそも lirc-pi のKernelモジュールが読み込まれない様になり、 /dev/lirc0 などのデバイスファイルが作成されず、下記の様なエラーメッセージが出るようになり、明らかにエラーであることが分かり、皆が混乱しました。
raspi# irsend TV on
irsend: could not connect to socket
irsend: No such file or directory
raspi# dmesg
...snip...
lirc_rpi: gpio chip not found!
...snip...
この時の原因は、ずばり、設定を記述するファイルが変更になった、でした。 2015/02以前は /etc/modules に lirc-rpi gpio_in_pin=23 gpio_out_pin=24 を書いていましたが、2015/02以降は /boot/config.txt に下記の様に記述します。
dtoverlay=lirc-rpi, gpio_in_pin=23, gpio_out_pin=24
デバイスツリーという概念が導入され、SDカードをWindows等で読み込んだ際に編集が可能な /boot/config.txt に設定類を纏めて記述する方針ということでしょうか。
ただし、これも今回(2016/04)の変更を見るに、単に過渡期だったんですね・・・ (迷惑な話である)



2016/04以降、kernel4.4時代のRaspberryPi

デバイスツリーに関する設定の記述方法が変わりましたよ! /boot/config.txt に記載するのは変わりませんが、記載内容を変える必要があります。

2016/04以前の古い書き方(ダメな書き方) /boot/config.txt
dtoverlay=lirc-rpi, gpio_in_pin=23, gpio_out_pin=24

2016/04以降の新しい時代の正しい書き方(動くよ!) /boot/config.txt
dtoverlay=lirc-rpi
dtparam=gpio_in_pin=23
dtparam=gpio_out_pin=24
dtoverlayにはモジュール名のみを記載し、そのモジュールへのオプション・パラメータ類はdtparamという行に書く様になったようです。

やっかいなのは、dtoverlayにモジュール名を記載するのは変わらないため、kernel4.4になって旧来の書き方をしていても、無事にKernelモジュールは読み込まれるし、/dev/lirc0も作成されますし、irsend SEND_ONCE TV onなどのlircのコマンド自体にエラーは発生しません。しかし、実際には赤外線信号は発信されませんし、mode2コマンドで受信をしようとしても何も受信されません
これはlirc-piモジュールは読み込まれているためlircとしては順調に動いているつもりになっているのですが、実際には入力や出力の端子の情報が正常に受け渡されていないため、ハードウェアとしては受信も送信も出来ない状態になっちゃうのです!ひどい!

RaspberryPiも、AやBだけじゃなく、2Bや3B、zeroなども出てきてkernelも日々新しくなっていくので、さらに適切な管理構造があるならばそれを取り込んでいくということでしょうね。まぁそこに文句は無いのですが、、、 たとえば昔の記述が残っていた場合は自動でヨロシク解釈して動作を続けるとか、分かりやすくユーザーにアドバイスのメッセージを出すとか、後方互換性について、もうちょっと考えて欲しい物ですねぇ・・・。 いや、難しいのは理解していますが。。。 でも、もうちょっと頑張って欲しいなぁ、と。

参考資料

Device Trees, overlays and parameters - Raspberry Pi Documentation
https://www.raspberrypi.org/documentation/configuration/device-tree.md





Kernel4.4時代の /boot/config.txt の別の書き方について

参考資料のページには何種類かの記述法が例示されています。
たとえばこんなのです↓
dtoverlay=lirc-rpi:gpio_in_pin=23,gpio_out_pin=24
これは、dtoverlayのモジュール名の後ろに : を書いておいて、それ以降はdtparamとして扱うというものらしいです。変化が少ないのはいいかもしれませんが、パッと見て違いが分かりにくかったりしてあまり良い方法な気はしませんね。おまけに、さらにこうも書かれています。

Overlay parameters are only in scope until the next overlay is loaded. In the event of a parameter with the same name being exported by both the overlay and the base, the parameter in the overlay takes precedence

つまり、dtoverlayに : を書いた場合は、次のdtoverlayが登場するまでの記述はdtparmとして扱うぜ!でも無条件(?)にdtparamとして扱うので、dtoverlayの行の後になんか似た様な記述をしている場合は動作がおかしくなるかもしれないから注意しろよな!ということです。そしてこう続きます。

for clarity, it's recommended that you avoid doing this. To expose the parameter exported by the base DTB instead, end the current overlay scope using:
dtoverlay=

動作が変になるのを回避するために、dtparamとして扱うのはここで終わりだぜ!という意味のdtoverlayを書いとけよな!ということです。 頭の良い方法とは思えません。

一応、私はこれらも試してみました。たしかに、下記↓の様に記述すると意図した通りにlircが動いてくれました。
dtoverlay=lirc-rpi:gpio_in_pin=23,gpio_out_pin=24
dtoverlay=
しかし、 最初に下記↓を書いたときは意図通りの動きをしてくれませんでした。
dtoverlay=lirc-rpi:gpio_in_pin=23, gpio_out_pin=24
dtoverlay=
違いが分かりますでしょうか。gpio_in_pin=23,gpio_out_pin=24と、gpio_in_pin=23, gpio_out_pin=24の違いです。カンマの後ろに半角スペースが一つはいってると、意図通り動いてくれません。 パーサがあまり賢くないようです。

というわけで、dtoverlay: を組み合わせて書く方法はあまり賢い解釈をしてくれないので、使わない方が良いでしょう。 素直にdtoverlaydtparamのセットで記述した方が分かりやすくてミスの作り込みも減ると思います。

こういう歪な仕様は後になってオミットされたりしますし。。。




lirc関連:

●RaspberryPiでLIRCする(2016/04仕様変更?) ←いまここ
●RaspberryPiでLIRCする(2015/02仕様変更?)
●RaspberryPiで、webからLIRCしたり、twitterからLIRCしたりする
●RaspberryPiでLIRCする
●FT232RLでLIRCするブツ
●FT232RLでLIRCの送受信モジュールを味見



 
コメント
ほんと助かりましたありがとう!
【2016/08/09 15:03】 | 通りすがり #- | [edit]












管理者にだけ表示を許可する
トラックバック
トラックバックURL:
http://wbbwbb.blog83.fc2.com/tb.php/225-36ed7911
≪ トップページへこのページの先頭へ  ≫