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の部分は環境によります。

これでmakesudo 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で使ってみた例です。

flie one