無線カメラキャプチャ for kernel 2.6.34

今回は、Overo Fire COMを使って無線カメラキャプチャ環境を作る方法を書きます。前回のGumstix開発環境構築は既にできている前提で話を進めます。

ハードウェア準備

今回は、ハードウェアとして

    • Gumstix Overo Fire Storm COM
    • 拡張IFボードTOBI
    • マイクロSDカード(4GB)
    • ボードカメラCaspa FS

を用います。上記3つは、開発環境構築のところと同じなので、説明は割愛します。

今回は、DSPからボードカメラを処理するのでボードカメラとGumstix本体を接続する必要があります。カメラケーブルは、接続をきちんとすることが大切なので、TOBIボードからGumstix本体を外して先にカメラケーブルをつけます。そして、ケーブルのついた本体をTOBIボードにさした後にケーブルの反対側をカメラに挿し込むのが良いです。下記写真のようにケーブルの印字面が上になるようにします。誤って、接続すると、ケーブルが熱を持って、GumstixのOSが起動せず、大変危険であるので変なささり方にならないよう注意して、作業を行います。

gumstix with CASPAFS

様々な所で書かれていますが、ケーブルが物理的に大変弱いものです。特にカメラ側は少し押し込まなければいけないので、力の入れ加減を注意する必要があります。

また、無線を使うので、Gumstix本体に付属するアンテナを利用します。Gumstix本体にアンテナを接続できる箇所はJ2とJ3と2ヶ所あり,各々wifi, Bluetooth用ですが、wifi用にはJ2にアンテナ先を接続します。以下にアンテナを接続している様子を示します。

gumstix with antenna

尚、後述の無線設定を行うためには、これらのGumstix環境に加えてWPA、WPA2に対応した汎用の無線ルータが適切に運用されている必要があります。

OpemEmbedded環境によるカーネルの変更

ボードカメラをDSPで処理するためには、デフォルトのカーネルではドライバ等のサポートがされていないので、カーネルを変更する必要があります。

そこで、まずは、現在のカーネルのパッケージをチェックします。

hostpc$ cd $OVEROTOP
hostpc$ grep linux org.openembedded.dev/conf/machine/overo.conf
PREFERRED_PROVIDER_virtual/kernel = "linux-omap3"

と出てくるはずなので、更に、下記のようにして現在のパッケージで利用可能なバージョンを調べます。

hostpc$ bitbake --show-versions | grep linux-omap3
linux-omap3                                    0:3.2-r103
linux-omap3-caspapx                     0:2.6.34-r103

と出てくるはずで、デフォルトのカーネルは3.2になっていますが,DSPでのカメラ画像処理はkernel2.6.34でサポートされていますので

~/overo-oe/org.openembedded.dev/conf/machine/overo.confの12行目を下記のように変更します。

PREFERRED_PROVIDER_virtual/kernel = "linux-omap3-caspapx"

次に、カーネルのコンフィギュレーションのチェックをします。使用するカメラのドライバがモジュールとして作られるようになっているかを確認します。

http://www.jumpnowtek.com/index.php?option=com_content&view=article&id=46&Itemid=54#_patching_board_file

を参考にして

hostpc$ bitbake -c clean virtual/kernel
hostpc$ bitbake -c menuconfig virtual/kernel

でmenuconfigした後、 DeviceDrivers->Multimedia support->Video capture adapters と見て、mt9v032をモジュールにします。

ここで、*でなくMになっていれば良いです。その後は、configファイルをコピーした後に、前回と同じようにカーネルをコンパイルします。

hostpc$ cp ~/overo-oe/tmp/work/overo-angstrom-linux-gnueabi/linux-omap3-caspapx-2.6.34-r103/git/.config ~/overo-oe/tmp/work/overo-angstrom-linux-gnueabi/linux-omap3-caspapx-2.6.34-r103/defconfig
hostpc$ bitbake virtual/kernel


【トラブルシューティング】

bitbakeが通らないときは以下を試してみて下さい。
◯’linux-omap3-caspapx_2.6.34.bb’ failed と出る場合

レポジトリのURIを変更して下さい。
~/overo-oe/org.openembedded.dev/recipes/linux/linux-omap3-caspapx_2.6.34.bbを開いて、git://www.sakoman.com/git/linux-omap-2.6.gitをgit://www.sakoman.com/git/linux.gitに変更します。

◯’ti-xdctools_3.20.05.76.bb’ failedが出る場合

ホストマシンが64bitの場合に起きることがある障害です。tiは32bitのライブラリをいくつか必要とするので、32bitのライブラリをインストールし、リビルドして下さい。

hostpc$ sudo aptitude install ia32-libs libc6-i386
hostpc$ bitbake -c clean ti-xdctools
hostpc$ bitbake ti-xdctools

尚、32bitライブラリ導入前にti関連でエラーが起きた場合は、エラーが起きたパッケージを一度すべて個別でcleanする必要あります。
そうしないとその部分で毎回エラーが続きます。


DSP対応ルートファイルシステムイメージの構築

ここから先の作業は

http://www.jumpnowtek.com/index.php?option=com_content&view=article&id=81:gumstix-dsp-gstreamer&catid=35:gumstix&Itemid=67

を参考に進めます。まずは、リンク先に書いてあるようにti_cgt_c6000_6.1.17_setup_linux_x86.binをTexusInstrumentsのページからダウンロードして、~/overo-oe/sources/ 以下に置きます。

次に、以下のようにして、md5sum、sha256sumでチェックサムを求めます。

hostpc$ cd ~/overo-oe/sources
hostpc$ md5sum ti_cgt_c6000_6.1.17_setup_linux_x86.bin > ti_cgt_c6000_6.1.17_setup_linux_x86.bin.md5
hostpc$ sha256sum ti_cgt_c6000_6.1.17_setup_linux_x86.bin > ti_cgt_c6000_6.1.17_setup_linux_x86.bin.sha256sum

ここで作成した.md5、.sha256sumの中身を確認し、下記の.bbファイルの該当箇所を書き換えます。

hostpc$ cd ~/overo-oe/org.openembedded.dev/recipes/ti
hostpc$ emacs -nw ti-cgt6x_6.1.17.bb

そして、下記2行を書き換えます。

SRC_URI[cgt6xbin.md5sum] = "5ee5c8e573ab0a1ba1249511d4a06c27"
SRC_URI[cgt6xbin.sha256sum] = "0cb99e755f5d06a74db22d7c814e4dfd36aa5fcb35eeab01ddb000aef99c08c1"

次に下記コマンドを行い、対応するバイナリを作ります。bitbakeは基本的に~/overo-oeの下で行います。

hostpc$ cd ~/overo-oe
hostpc$ bitbake task-gstreamer-ti

環境によっては、このbitbakeをする過程でdsplinkがうまくコンパイルできずに止まってしまうことがあります。これは、dsplinkのバージョンを変更することで対応可能です。その場合、~/overo-oe/org.openembedded.dev/conf/distro/include/angstrom-codec-engine-latestproduction-preferred-versions.inc にて、ti-dsplinkのバージョンが1.63になっている場合には,それを1.64に変更すると、

hostpc$ bitbake -c clean ti-dsplink
hostpc$ bitbake ti-dsplink

が通るようになります。-c cleanで変な中間生成物が残らないようにきれいにしてから、bitbakeをやり直すよう気を付けます。これで、再度bitbake task-gstreamer-tiを行えば、最後まで通るようになるはずです。

次に、GStreamer と DSP のバイナリをルートファイルシステムのイメージに追加します。一番簡単なのは、上記リンク先に含まれるdsp-console-image.bbを保存して、 ~/overo-oe/org.openembedded.dev/recipes/images/ にコピーし、

hostpc$ bitbake dsp-console-image

を行う方法です。上記リンク先ドキュメントではdsp-desktop-imageをコンパイルするよう書いてありますがが、X環境はなくてもいいので、ここでは、dsp-console-imageを元にルートファイルシステムを作ります。ビルドされたルートファイルシステムのイメージは、~/overo-oe/tmp/deploy/glibc/images/overo/以下に全て置かれます。

【その他のトラブルシューティング】

dsp-console-imageをbitbakeする際に、環境により、そのままでは通らないことがあります。それには、都度対処する必要あり、その対処法を以下に書きます。

◯python-numpy

http://patches.openembedded.org/patch/15039/

にパッチが公開されているので、ここから必要なpatchを作ります。

まずは、00-numpy-1.4.1-no-atlas.patchを作り、~/overo-oe/org.openembedded.dev/recipes/python/python-numpy/ 以下に置きます。

一方、 ~/overo-oe/org.openembedded.dev/recipes/python/python-numpy_1.4.1.bb を編集し、00-numpy-1.4.1-no-atlas.patchを使うための変更を行います。どう編集するかは上記の元のパッチを見れば、書いてあるので、その通り変更します。

その後、

hostpc$ bitbake -c clean python-numpy
hostpc$ bitbake -c compile python-numpy

で通ることを確認して、再び、bitbake dsp-console-imageします。

◯obexd-0.34

obexd-0.34のchecksumが合わないと怒られる場合、以下のようにします。

hostpc$ cd ~/overo-oe/sources
hostpc$ md5sum obexd-0.34.tar.gz > obexd-0.34.tar.gz.md5
hostpc$ sha256sum obexd-0.34.tar.gz > obexd-0.34.tar.gz.sha256sum

をして、 ~/overo-oe/org.openembedded.dev/recipes/ の下にあるobexd_0.34.bbを直接編集して、md5とsha256が一致するようにします。この辺は、ti_cgt_c6000_6.1.17_setup_linux_x86.binの所でやったのと同じ要領です。bitbake obexdをして、通ることを確認した後、再び、bitbake dsp-console-imageを続行すします。

◯gcc

PATHに「.」が含まれるといけないみたいなので,

hostpc$ export PATH=/bin/:/usr/bin:/usr/local/bin:/sbin/
hostpc$ source ~/.bashrc
hostpc$ bitbake gcc

とすることで通るようになります。再度、bitbake dsp-console-imageを続行します。

SDカードへの書き出しとカーネルパラメータの設定

DSPでのカメラ処理のためのカーネルイメージに対応するMLOとu-boot.binとして、

http://cumulus.gumstix.org/images/angstrom/misc/caspapx/

にあるAngstrom用のprebuiltバージョンのものを利用することにします。

それ以外は、

~/overo-oe/tmp/deploy/glibc/images/overo/ にある

Angstrom-dsp-console-image-glibc-ipk-2011.03-overo.rootfs.tar.bz2

uImage-2.6.34-r103-overo.bin

modules-2.6.34-r103-overo.tgz

を用います。

続いて、カーネルイメージとモジュールをそれぞれ、SDカードにコピーします。

hostpc$ sudo cp tmp/deploy/glibc/images/overo/uImage-2.6.34-r103-overo.bin  /media/boot/uImage
hostpc$ sudo cp tmp/deploy/glibc/images/overo/uImage-2.6.34-r103-overo.bin  /media/rootfs/boot/uImage
hostpc$ sudo tar xvaf tmp/deploy/glibc/images/overo/Angstrom-dsp-console-image-glibc-ipk-2011.03-overo.rootfs.tar.bz2 -C /media/rootfs/
hostpc$ cd /media/rootfs/
hostpc$ sudo tar xvzf /home/username/overo-oe/tmp/deploy/glibc/images/overo/modules-2.6.34-r103-overo.tgz

このまま,GumstixにSDカードをさして起動すると、

INIT: Id “S” respawning too fast: disabled for 5 minutes

といわれてコンソールが開けないので、SDカードにルートファイルシステムを展開した後、rootfsのetc/inittabの

S:2345:respawn:/sbin/getty 115200 ttyO2

S:2345:respawn:/sbin/getty 115200 ttyS2

に変更する必要があります。

これで,全てSDカードの準備は完了したので、/media/boot, /media/rootfsをumountして、マイクロSDをGumstixにさして、電源投入し、起動確認を行います。

Gumstix起動後の作業

Gumstixを起動して,Login と出てきたらAngstromはroot, パスワードなしで入ります。その後、

GX$ lsmod

をして、dsplink(画面にはdisplinkkと表示されるが問題ないです)があれば、DSPを利用できる状態になっていると判断して良いです。

次に、このままだとメモリの問題で、DSPを利用したエンコードができないので、

http://www.jumpnowtek.com/index.php?option=com_content&view=article&id=81:gumstix-dsp-gstreamer&catid=35:gumstix&Itemid=67

のU-Boot Kernel Parametersの設定を行います。

今回用いるOvero fireはメモリが512MBあるので,手順は以下のようになります。

A.再起動中して、5, 4, … とカウントされている間にエンターを押します。

Overo # というプロンプトが出れば成功です。

B.over fire は512MBメモリがあるので、

Overo # setenv mem mem=96M@0x80000000 mem=384@0x88000000

とする。

C.下記のようにします。

Overo # setenv mmcargs setenv bootargs console=${console} mpurate=${mpurate} vram=${vram} ${mem} omapfb.mode=dvi:${dvimode} omapfb.debug=y omapdss.def_disp=${defaultdisplay} root=${mmcroot} rootfstype=${mmcrootfstype}

D.print mmcargs等して大丈夫そうなら下記のようにします。

Overo # saveenv

一旦電源を切り、SDカードを取り出してEの作業をします。

E. ホストPC側で下記の内容のboot.cmdというファイルを作ります。

setenv loadaddr 0x82000000
setenv bootargs "console=ttyS2,115200n8 mpurate=720 vram=12M i2c_bus=3,100 mem=96M@0x80000000 mem=384M@0x88000000 omapfb.mode=dvi:1024x768MR-16@60 omapdss.def_disp=dvi root=/dev/mmcblk0p2 rw rootfstype=ext3 rootwait"
fatload mmc 0 ${loadaddr} uImage
bootm ${loadaddr}

このファイルを下記コマンドに通して、boot.scrを作り、SDカードのbootパーティションにおいて、再起動します。

hostpc$ mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "myscript" -d boot.cmd boot.scr

SDカードを取り出し、Gumstixにさして再度再起動します。そこで、lsmodして,mt9v032がなければ、

GX$ insmod /lib/modules/2.6.34/kernel/drivers/media/video/mt9v032.ko
GX$ depmod -a

をしてGumstixを再起動します。再起動後、mt9v032というモジュールがあることを確認し、更に念のため、デバイスファイルも確認します。

GX$ ls -l /dev/video0

として、デバイスファイルが存在すれば大丈夫です。

DSP動作確認

DSPを利用したカメラキャプチャができているかどうかに関して、まずは、有線接続の状態で検証を行います。具体的には、

http://www.jumpnowtek.com/index.php?option=com_content&view=article&id=81:gumstix-dsp-gstreamer&catid=35:gumstix&Itemid=67

のネットワークストリーミングを試します。

まずは,Gumstixを起動し、

GX$ ifconfig

でループバックしかつながっていない事を確認して、

GX$ vi /etc/network/interfaces

を編集し、iface eth0 inet dhcp がコメントアウトされていない事を確認します。コメントアウトされているようであれば、コメントインします。その後、

GX$ ifup eth0

でネットワークにDHCPクライアントとして接続を行います。DHCPサーバがいない場合には、固定IPを割り振る設定を/etc/network/interfaceに記述します。

この状態で,ホスト側にて

hostpc$ gst-launch-0.10 -v udpsrc port=4000 caps='application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264' ! rtph264depay ! ffdec_h264 ! xvimagesink sync=false

として、H264で圧縮してビデオをストリーミングするサーバを立ち上げます。次にGumstix側で(ただし,ホスト側のIPを192.168.10.4とする)

GX$ gst-launch -v v4l2src ! video/x-raw-yuv,width=640,height=480 ! TIVidenc1 codecName=h264enc engineName=codecServer ! rtph264pay pt=96 ! udpsink host=192.168.10.4 port=4000

とすると,ネットワークストリーミングでカメラ映像が再生されるのが確認できるはずです。

もし、cmemkのセットアップがうまく行っておらず,cmemk.koのカーネルをインストールしろというエラーが出る場合は、下記の対応を行います。

GX$ ls /lib/modules/2.6.34/kernel/drivers/dsp/cmemk.ko

で既にインストールされている事が確認できたら、

GX$ depmod -a
GX$ modprobe cmemk
GX$ lsmod

こうすると、cmemkが増えていることがわかります。確認した後にはGumstixの再起動をします。

また、デフォルトだとカメラの自動露光の設定のために動作が15fpsに制限されてしまうので、/usr/share/ti/gst/omap3530/loadmodules.shの中にドライバの読み込み時のオプション指定を行います。具体的には,下記の三行をシェルスクリプトの最後に追加します。

# mt9v032 camera tuning
rmmod -f mt9v032
insmod /lib/modules/2.6.34/kernel/drivers/media/video/mt9v032.ko auto_exp=0

続いて、無線の設定を行います。今回は、WPA、WPA2により汎用の無線ルータに対してクライアントとして接続を行う設定を記します。まず、Gumstixを起動し、/etc/network/interfacesを編集します。既に/usr/sbin/wpa_supplicant及び/etc/wpa_supplicant.confがあることを確認した上で、下記のように追記します。

iface wlan0 inet dhcp
pre-up /usr/sbin/wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf
post-up iw dev wlan0 set txpower limit 15000
post-down killall -q wpa_supplicant

iwコマンドで、txpowerを設定しているところは、電波出力の強度の設定になります。電波法の制限により、無線の使用時には15dbm以下に設定して頂く必要があるため、必ずこの設定を忘れずに入れて下さい。

次に、Gumstix上にて、

GX$ wpa_passphrase "SSID" "pass"

で、/etc/wpa_supplicant.confに記入する内容を作成します。SSID及びpassは実際に接続する無線ルータのものを入れます。wpa_passphraseの結果を利用して、/etc/wpa_supplicant.confに下記の内容を追記します。

network={
proto=WPA WPA2
key_mgmt=WPA-PSK
pairwise=CCMP TKIP
ssid="SSID"
#psk="pass"
psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}

ssid及び、pskはwpa_passphraseの結果をそのまま転記すれば大丈夫です。この状態で、

GX$ ifup wlan0

し、IPが割り振られれば、成功です。ここで、うまく、ネットワークが接続されたことを確認して、/etc/network/interafacesの先のwlan0の設定の項目のところに

auto wlan0

を追記しておけば、次回以降は自動で接続されます。この状態で、再度、gst-launchを利用したネットワークストリーミングを実行すれば、無線カメラキャプチャ環境の完成です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>