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]
動作していたlircが動かなくなったために原因調査しており、たどり着きました。
コマンドエラーも出ないので困っていたのですが、
まさにapt upgrade後にlircが使えなくなったこともあり、
これだ!と思い、同様の対応をしたのですが、結果は変わりませんでした。
赤色LEDで確認しても発光しない状態で、困っています。
/boot/config.txtのdtoverlay/dtparamの記載方法以外変わった所はないでしょうか。
【2017/09/26 06:59】 | 名無しさん #- | [edit]
ちなみに2017年7月版のjessieです

Linux raspberrypi 4.9.35-v7+ #1014 SMP Fri Jun 30 14:47:43 BST 2017 armv7l GNU/Linux

No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 8.0 (jessie)
Release: 8.0
Codename: jessie
【2017/09/26 07:03】 | 名無しさん #- | [edit]
「使えなくなった」ということなので、ハードウェアは正常だとして考えます。
Raspbianの公式マニュアルは下記ですが、pulldownに関する記載が増えているようですので一度これを試してみてください。
https://www.raspberrypi.org/documentation/configuration/device-tree.md

If you have an overlay that defines some parameters, they can be specified either on subsequent lines like this:

dtoverlay=lirc-rpi
dtparam=gpio_out_pin=16
dtparam=gpio_in_pin=17
dtparam=gpio_in_pull=down


あと/var/log/messages等になにか残っていないか確認してみてください。起動時にlirc-rpiをロードしているはずですので、その時になにか言っているかもしれません。

それから一応、lsmodでrc_core,lirc_rpiやlirc_devがロード済みかどうかも確認してみてください。
【2017/09/26 08:01】 | umbrella #mvcB0rpk | [edit]
ご返信ありがとうございます。
もう一台のラズパイ3にも同バージョンのraspbianインストールして試したのですが、
そちらは正常にirsendでLEDが点灯しました。
dtparamはgpio_in_pull=downありなしで変化ありませんでした。
/var/log/messagesを調べてみたところ、
点灯しない方では以下のログが出ていました。
lirc_rpi: probe of lirc_rpi failed with error -22

原因をググっていますが、今のところまだ原因つかめていません。
【2017/09/26 10:56】 | 名無しさん #- | [edit]
動作するボード・SDカードの組合せと、動作しないボード・SDカードの組合せを入れ替えてみるとどうでしょうか?
(モジュールがロードできていないらしいのでソフトウェア的な問題だとは思いますが、まずは定石通りに物理層から確認しておきたいです)

モジュールがロードできないのはカーネルとモジュールのバージョンが一致していないか、そのモジュールに対する設定の誤りなどが考えられます。
それぞれの環境で config.txt や uname -a や vcgencmd version や 下記のコマンドの実行結果を比較してみてください。

find /lib/modules/`uname -r` -iname "*lirc*" -type f -exec ls -l {} \; -exec md5sum {} \;

(↑一行のコマンドです。 \; や {} もそのまま維持したままコピペで実行してみてください)
【2017/09/26 12:48】 | umbrella #mvcB0rpk | [edit]
アドバイスありがとうございます。
いただいたコマンドの結果をdiffしてみました。
よく見ると出力順序の違いだけで、同じ結果のようです。
また、config.txt や uname -a や vcgencmd versionの内容も一致しました。

SDカード入れ替えはちょっと準備がいるので、
(lircがダメな方は、運用中なので)
出来次第やってみます。

アドバイス本当にありがとうございます。

1が正常、2が失敗する方です。

1,2c1,2
< -rw-r--r-- 1 root root 22620 7月 3 19:07 /lib/modules/4.9.35-v7+/kernel/drivers/staging/media/lirc/lirc_rpi.ko
< 52e825985ec52da20236415b5dace404 /lib/modules/4.9.35-v7+/kernel/drivers/staging/media/lirc/lirc_rpi.ko
---
> -rw-r--r-- 1 root root 23540 7月 3 19:07 /lib/modules/4.9.35-v7+/kernel/drivers/staging/media/lirc/lirc_serial.ko
> 63390ed23075decfe77a48cd8b020678 /lib/modules/4.9.35-v7+/kernel/drivers/staging/media/lirc/lirc_serial.ko
4a5,6
> -rw-r--r-- 1 root root 22620 7月 3 19:07 /lib/modules/4.9.35-v7+/kernel/drivers/staging/media/lirc/lirc_rpi.ko
> 52e825985ec52da20236415b5dace404 /lib/modules/4.9.35-v7+/kernel/drivers/staging/media/lirc/lirc_rpi.ko
7,8d8
< -rw-r--r-- 1 root root 23540 7月 3 19:07 /lib/modules/4.9.35-v7+/kernel/drivers/staging/media/lirc/lirc_serial.ko
< 63390ed23075decfe77a48cd8b020678 /lib/modules/4.9.35-v7+/kernel/drivers/staging/media/lirc/lirc_serial.ko
11,12d10
< -rw-r--r-- 1 root root 4024 7月 3 19:07 /lib/modules/4.9.35-v7+/kernel/drivers/media/rc/keymaps/rc-lirc.ko
< 14ec6d1f8adb2ea35db80d69ff08b756 /lib/modules/4.9.35-v7+/kernel/drivers/media/rc/keymaps/rc-lirc.ko
14a13,14
> -rw-r--r-- 1 root root 4024 7月 3 19:07 /lib/modules/4.9.35-v7+/kernel/drivers/media/rc/keymaps/rc-lirc.ko
> 14ec6d1f8adb2ea35db80d69ff08b756 /lib/modules/4.9.35-v7+/kernel/drivers/media/rc/keymaps/rc-lirc.ko
【2017/09/26 14:32】 | 名無しさん #- | [edit]
SDカードの入れ替えも行ってみました。
結果としては、HWの問題ではなく、SDカード(ソフトウェア)の問題のようです。

なのでOSのインストールから
再セットアップすれば解消できそうですが、
かなりの手間がかかるので、なんとか解決したいです。

他に考えられること、確認すべきことがありますでしょうか。
【2017/09/26 15:13】 | 名無しさん #- | [edit]
カーネルとモジュールのアンマッチという線はハズレましたね・・。

「lirc_rpiをアンロードし、再度ロードする」という手順を動作するボードと動作しないボードで行ってみて、エラーメッセージ等があればそこからなにか手掛かりが得られないでしょうか。

# stop lircd (if running)
/etc/init.d/lirc stop

# unload lirc_rpi (if loaded)
modprobe -vr lirc_rpi

# load lirc_rpi
modprobe -v lirc_rpi

# start lircd (if you need)
/etc/init.d/lirc start



当記事の最後の方でも触れましたが、config.txtのDTオーバーレイのパーサーはあまり賢くないようですので、通常(?)は気にしないような空白や空行が入っていたりしないでしょうか?
diffにBやwオプションを付けていたりするとスルーするような違いもエラーの原因になるかも知れません。
可能であればconfig.txtを動作するボードから無編集でコピーして試してみるのも一つかと・・(可能性は薄そうですが。)
 
【2017/09/26 21:12】 | umbrella #mvcB0rpk | [edit]
返事いただいてから遅くなってすみません。
いろいろ試したところ、動作する方のボード&SDでも
再起動するとlircが動作したり、しないことがあるのが分かりました。
OS起動時にlircの読み込みをする際にエラーが起きているようで、動作時と非動作時で/var/log/messagesに差異がありました。
OS起動時のエラーで、OS起動後にlircをrestartしても結果は変わらないようです。

動作するとき:
Oct 3 10:54:43 raspberrypi kernel: [ 2.752646] lirc_dev: IR Remote Control driver registered, major 243
Oct 3 10:54:43 raspberrypi kernel: [ 2.762775] lirc_rpi: module is from the staging directory, the quality is unknown, you have been warned.
Oct 3 10:54:43 raspberrypi kernel: [ 3.815657] lirc_rpi: auto-detected active high receiver on GPIO pin 5
Oct 3 10:54:43 raspberrypi kernel: [ 3.815863] lirc_rpi lirc_rpi: lirc_dev: driver lirc_rpi registered at minor = 0
Oct 3 10:54:43 raspberrypi kernel: [ 3.815866] lirc_rpi: driver registered!
Oct 3 10:54:45 raspberrypi kernel: [ 6.409124] input: lircd as /devices/virtual/input/input0

動作しないとき:
Oct 3 10:56:59 raspberrypi kernel: [ 2.666915] lirc_dev: IR Remote Control driver registered, major 243
Oct 3 10:56:59 raspberrypi kernel: [ 2.675103] lirc_rpi: module is from the staging directory, the quality is unknown, you have been warned.
Oct 3 10:56:59 raspberrypi kernel: [ 2.679358] lirc_rpi: probe of lirc_rpi failed with error -22
Oct 3 10:56:59 raspberrypi kernel: [ 3.735374] lirc_rpi: auto-detected active low receiver on GPIO pin 5
Oct 3 10:56:59 raspberrypi kernel: [ 3.735696] platform lirc_rpi: lirc_dev: driver lirc_rpi registered at minor = 0
Oct 3 10:56:59 raspberrypi kernel: [ 3.735701] lirc_rpi: driver registered!
Oct 3 10:57:01 raspberrypi kernel: [ 7.187721] input: lircd as /devices/virtual/input/input0

以下のメッセージが原因と思われますが、ググってもその原因が分かりません。
lirc_rpi: probe of lirc_rpi failed with error -22

何か糸口があればご教示いただけないでしょうか。
【2017/10/03 11:13】 | 名無しさん #- | [edit]
同じ構成で挙動が異なる場合があるとなると、モジュールのロード順番が関与している可能性がありますね。
上手くいくときはlirc_devが2.7秒台で読まれていますが、上手くいかないときは2.6秒ですよね。。なにかのモジュールと依存関係の解決が上手くいってなくて、(≒平行で読まれる設定になっていて)たまたまイイカンジの順番で読むときだけ動作する、のかも知れません。

> OS起動時のエラーで、OS起動後にlircをrestartしても結果は変わらないようです。
とのことですが、lircはlirc_rpiモジュールを利用するフロントエンド的なソフトウェアなので、lircをrestartはあまり意味が無く、lirc_rpiモジュールのアンロードをしないといけません。(modprobe -rv lirc_rpi)


現在、/boot/config.txtに dtoverlay=lirc-rpi と書いて起動時にロードさせている状態だと思いますが、
これをコメントアウトして「起動時にロードしない」状態で起動させ、手動でロードすると上手くいくでしょうか?

起動後に
sudo modprobe -v lirc_rpi gpio_in_pin=23 gpio_out_pin=24
(↑in,outのpinは一例)

もしこれが上手くいくようであれば、/boot/config.txtにはかかず、/etc/rc.localやcronの@rebootにコマンドを角などして、システムが立ち上がった後に(なんならsleepコマンドでちょっと待ってから)lirc-rpiモジュールをロードする、という回避策がとれるかもしれません。


jessieをお使いとのことですが、現在最新はstretchです。kernelも最新だと4.9.52が入手可能のようです。
最新版に更新することで改善する可能性も残っています。
【2017/10/03 23:49】 | umbrella #mvcB0rpk | [edit]
毎度お返事が遅くなり申し訳ありません。
/boot/config.txtをコメントアウトし、コマンド直で実行しましたが、これもダメでした・・!
$ sudo modprobe -v lirc_rpi gpio_in_pin=5 gpio_out_pin=25
insmod /lib/modules/4.9.35-v7+/kernel/drivers/staging/media/lirc/lirc_rpi.ko gpio_in_pin=5 gpio_out_pin=25
modprobe: ERROR: could not insert 'lirc_rpi': No such device

これまたググっても解決できない状態です・・・。
【2017/10/13 21:42】 | 名無しさん #- | [edit]
jessieを使っていますが、stretchではlircが使えないというのをどこかで見ましたので・・・。
【2017/10/13 21:44】 | 名無しさん #- | [edit]
modprobeはlirc_rpiの依存関係を自動的に考慮して必要なモジュール(rc-coreやlirc_dev等)を読み込むと思いますが、それらは読まれなかったでしょうか?(単にコマンド実行のログを抜粋しているだけ??)
たとえばmodprobeではなくinsmodで手動で順番良く読ませると改善しますか?

sudo insmod /lib/modules/4.9.40+/kernel/drivers/media/rc/rc-core.ko
sudo insmod /lib/modules/4.9.40+/kernel/drivers/media/rc/lirc_dev.ko
sudo insmod /lib/modules/4.9.40+/kernel/drivers/staging/media/lirc/lirc_rpi.ko gpio_in_pin=23 gpio_out_pin=24


kernelは4.9.35をお使いとのことですが、なにか理由がありますか? rpi-update で更新は可能でしょうか?(無闇に最新の方が良いというわけでもないのですがね・・)
私の環境では、下記のように4.9.40を使っています。(RaspberryPi B+のjessieです)

[rpi1bp]% sudo modprobe -v lirc_rpi gpio_in_pin=23 gpio_out_pin=24
insmod /lib/modules/4.9.40+/kernel/drivers/media/rc/rc-core.ko
insmod /lib/modules/4.9.40+/kernel/drivers/media/rc/lirc_dev.ko
insmod /lib/modules/4.9.40+/kernel/drivers/staging/media/lirc/lirc_rpi.ko gpio_in_pin=23 gpio_out_pin=24



stretch以降のlircでは(?)設定ファイルが変更になっていたり書き方が変っているようですが、使えないというわけではないようですよ。(私は試していませんが… ^^;)

https://www.raspberrypi.org/forums/viewtopic.php?t=192891
There is script to "convert" the configuration:
sudo /usr/share/lirc/lirc-old2new.sh
after that you can reboot your pi order simply restart LIRC:
sudo killall lirc
systemctl start lidcd.socket lircd.service

After that LIRC is running fine for me.

http://raspibb2.blogspot.jp/2017/

http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_stretch_lirc_ir_remote_control_2017/
【2017/10/14 18:37】 | umbrella #mvcB0rpk | [edit]
やはりlirc_rpi.koが見つからないと言われているようです。
rc-core.koとlirc_dev.koはFile existsなので、
すでにinsertされているようです。

$ sudo insmod /lib/modules/4.9.35-v7+/kernel/drivers/media/rc/rc-core.ko
insmod: ERROR: could not insert module /lib/modules/4.9.35-v7+/kernel/drivers/media/rc/rc-core.ko: File exists
$ sudo insmod /lib/modules/4.9.35-v7+/kernel/drivers/media/rc/lirc_dev.ko
insmod: ERROR: could not insert module /lib/modules/4.9.35-v7+/kernel/drivers/media/rc/lirc_dev.ko: File exists
$ sudo insmod /lib/modules/4.9.35-v7+/kernel/drivers/staging/media/lirc/lirc_rpi.ko
insmod: ERROR: could not insert module /lib/modules/4.9.35-v7+/kernel/drivers/staging/media/lirc/lirc_rpi.ko: No such device

すでに運用しているサーバなので
rpi-updateはちょっと怖くてできていないです。
【2017/10/19 11:49】 | 名無しさん #- | [edit]
まだ見ていらっしゃれば…。

lirc_rpi.koをinsmodした際の No such device というメッセージが不可解なのですが、in/outの端子を指定する引数を与えても同様のエラーメッセージになりますか?

lirc_rpiのソースを見てみましたが、とりあえず linux/errno.h をインクルードしており、(ちゃんとソース読まないと確定的なことは言えませんが)linuxの標準的なエラーコードを返している可能性が高いです。
そのうえで、起動時の lirc_rpi: probe of lirc_rpi failed with error -22 を見てみると、EINVAL(Invalid argument)の可能性があります。設定している引数を変更しつつ、挙動が変わるか試してみてください。

引数を指定する際に何もないように見えて、スペースが入っていたり、tabが入っていたりしないでしょうか?
別のGPIO端子を指定するとどうでしょうか?
【2017/10/27 11:17】 | umbrella #mvcB0rpk | [edit]












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