2015年10月2日金曜日

/dev/video の固定化 と USB機器の再起動

ブログの切り分けが微妙なところはあるのですが、ユーザーエンド系はやはりこっちかな(笑)
今まで同じ種類のUSBデバイスを同一のコンピュータに接続する機会がほとんどなかったのであまり気にならなかったのですが、どうもRaspberry Pi 2のUSBの認識方法がかなり不安定なもののようで、/dev/video0と/dev/video1に接続されているカメラが再起動などのタイミングで入れ替わることが多々ありました。



最初は勘違いかと思いましたが、気づくとどんどん気持ちが悪くなり、なんとか固定化できないか調べ始めました。一番期待していたのはUSBポートの順番でvideo0 video1と認識してくれればよかったのかもしれませんが、なかなかスマートな方法がなかなか見つかりません。

使っているうちにどうもカメラデバイスが応答不能状態に陥ってrebootを行うとかなり高確率で入れ替わってしまうことも実感しました。が、だからこれどうすればいいんだろう。という状態でした。

いろいろなところを見ているうちにようやくそれらしい回答がありました。
/dev/video0に登録されると同時に/dev/v4l/by-idや/dev/v4l/by-pathにUSB機器のIDやUSB機器が接続されているポート番号がシンボリックリンクとして存在し、そのリンク先が/dev/video0や/dev/video1になっていました。

結論から言えばmotion内の設定で /dev/video0 や /dev/video1 と指定している部分に /dev/v4l/by-id/usb-016d_089d-video-index0 とすることで機器へ固定させることができます。
同一機種の場合はおそらく"-index0"の部分が連番になるのでしょうね。

この指定を /etc/motion/thread1.conf や /etc/motion/thread2.conf で videodeviceに指定することで特定の機器に対して解像度や細かい設定値が行えるようになりました。

ついでにものすごく悩まされてるハードウェア寄りの障害でカメラが気が付くと死んでいることが多く、原因もはっきりしていません。古いカメラなのでハード的に壊れている可能性もありますが、記憶をたどると、使い始めた時も原因不明の動作停止が繰り返し発生していた気がします。WindowsでもOpenWRTでもどちらでも発生していたと思うので、ハードウェア的にバグがあるような気がします。

別のものを購入するにしても、とりあえずは使い続ける必要があるので気づくたびにrebootでもいいのですが、もっと手軽に外部からUSB機器だけ再起動させる方法ないのかと調べたところありました。

単純に/sys/bus/usb/drivers/usb/unbindと/sys/bus/usb/drivers/usb/bindにUSBのポート番号を渡すことによってそれぞれ処理が実行されました。便利ですね。
echo -n "1-1.2" > /sys/bus/usb/drivers/usb/unbind
echo -n "1-1.2" > /sys/bus/usb/drivers/usb/bind

USB機器の識別方法で参考になった記事
https://www.raspberrypi.org/forums/viewtopic.php?t=70274&p=511024


USBデバイス再起動で参考になった記事
http://www.linuxquestions.org/questions/linux-general-1/manual-usb-driver-binding-why-do-i-suck-at-it-618330/
USB抜き差しせずコマンドで再認識 http://qiita.com/tukiyo3/items/e0f6ebe6b9713a7da537
コマンドで USB をリセットしてみる http://server-setting.info/blog/usb-reset-for-command.html
Linuxでの再起動をかけないUSBデバイスの再活性化方法 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13139452838

0 件のコメント:

コメントを投稿