Linux 4 Tegraにv4l2loopbackモジュールを入れる時の注意点
2016年09月07日
概要
- 仮想ビデオデバイスを作るためのカーネルモジュールv4l2loopbackを入れる
はじめに
前回の記事で2万円のNVIDIA SHIELD Android TVを10万円のJetson TX1の代わりに使ってTegra X1開発環境を整えました。
今回はUSBカメラモジュールをSHIELDで使う場合に必要になることもあるv4l2loopbackを入れる際に陥るエラーと対処法を紹介します。
ビルド
sudo apt-get install v4l2loopback-dkms
で一発インストールできるらしいのですが、L4T(Linux 4 Tegra)ではうまくいきませんでした。
さらにソースからビルドすると、
export ARCH=arm64
export CROSS_COMPILE=/usr/bin/aarch64-linux-gnu-
git clone https://github.com/umlaeute/v4l2loopback
cd v4l2loopback
make
以下のエラーが出ます
scripts/basic/fixdep: 1: scripts/basic/fixdep: Syntax error: "(" unexpected
解消するためには以下を実行します。
cd /usr/src/linux-headers-3.10.96-tegra/
sudo make modules_prepare
3.10.96-tegra
の部分は環境によります。
これでmake
とsudo make install
が通るので一見ビルドに成功したかに見えますが、
sudo modprobe v4l2loopback
すると
modprobe: ERROR: could not insert 'v4l2loopback': Exec format error
と怒られます。
この原因はv4l2loopback.koのversion magicが(私の環境では)3.10.96になっていなければならないのに3.10.96-tegraになっているため不一致と判断されるからです。
(insmod v4l2loopback
しても同様のエラーが出るのでdmesg
すると原因がわかります)
強制無視するオプションがあるのですがなぜかそれをしても全くエラーが消えませんでした。
そこで/usr/src/linux-headers-3.10.96-tegra/include/generated/utsrelease.h
を開き、
#define UTS_RELEASE "3.10.96-tegra"
を
#define UTS_RELEASE "3.10.96"
に変え、もう一度make
からやり直したところうまくいきました。
以下はFLIR ONEというスマホ用の熱画像センサモジュールをSHIELDで使ってみた例です。