Raspberry Pi 2B(v1.1)でカメラを試す

NetBSDRaspberry Piのカメラ使えるのかなーと手元に余ってたRaspberry Pi 2B(v1.1)でちょっと試してみた。

カメラの撮影で使われる raspistill などはpkgsrcの misc/raspberrypi-userland で用意されているようなので、まずはこれをインストールする。microSDのスペックにも依存しそうだが、手持ちの環境でMAKE_JOBS=3でビルドさせると大体10時間くらいかかる模様。なおswapなしでMAKE_JOBS=5で走らせるとcmakeのところでメモリ不足になって死ぬので注意。

で、インストールまで行ってもそのままでは raspistill の実行に失敗する。色々調べたところ vcgencmd (これも misc/raspberrypi-userland に含まれている)でカメラの状態を確認できるらしいが、実行してみるとどうもカメラサポートが無効になっているとのこと。

armv7# vcgencmd get_camera
supported=0 detected=0

じゃあどうやってカメラサポート有効にするのかとまた色々探し回ったところ、 /boot/config.txt に以下の2行を追加すれば良いらしい。

gpu_mem=128
start_x=1

前者は名前からなんとなくわかるとして、後者のstart_x=1って何? と調べたら、通常の起動時では start.elf と fixup.dat を参照するところで start_x.elf と fixup_x.dat を参照させるようにするコマンドとのこと。なるほど、ところで/bootにそんなファイルないぞ?

ということで今度はファームのバイナリを探し回って、おそらくコイツのbootの下にあるやつだろうと見当をつける。念のため start.elf などと同じリビジョン(今回は0c01dbefba4)をチェックアウトして start_x.elf と fixup_x.dat を/boot配下へコピー。リビジョンは src/external/broadcom/rpi-firmware/dist/start.elf のログを参照。

github.com

こんな作業が必要なあたり「……もしかして誰もカメラ動かした人いないんじゃね?」みたいな予感がしてくる。とりあえず見なかったことにしてファイルを/bootにコピーし、/boot/config.txt を書き換えたら再起動して再びvcgencmdでカメラ状態をチェック。

armv7# vcgencmd get_camera
supported=1 detected=1

無事にサポートOKになったし検出もできてる。では準備も整ったのでいよいよ raspistill を実行。

armv7# raspistill -o hoge.jpg

[ 122.1222268] uvm_fault(0x80b30a08, 6c533000, 2) -> e
[ 122.1222268] Fatal kernel mode data abort: 'Translation Fault (S)'
[ 122.1329515] trapframe: 0xb8e15de0
[ 122.1329515] FSR=00002805, FAR=6c533c80, spsr=00030013
[ 122.1426852] r0 =6c533c80, r1 =00000380, r2 =00000040, r3 =00000010
[ 122.1426852] r4 =80abb480, r5 =6c533c90, r6 =00000370, r7 =3395fc90
[ 122.1571841] r8 =913df940, r9 =00000370, r10=00000002, r11=b8e15e64
[ 122.1633485] r12=0000003f, ssp=b8e15e30, slr=8009a92c, pc =80097290

Stopped in pid 0.206 (system) at        netbsd:armv7_dcache_inv_range+0x28:
mcr     p15, 0, r0, c7, c6, 1
db{0}>

カーネル落ちた…… (´・ω・`)