ZynqのボードでUSBカメラを使いたい。Zynqの動くLinuxでUVCとV4L2を使いたい。たとえばV4L2でOpenCVのVideoCaptureを使いたい。そこで、ひとまずUVCが必要なのである。

UVC
http://www.ideasonboard.org/uvc/

しかし、Xilinxから提供されているpetalinux-SDKのv2013.04ではUVCが動かない様子。このpetalinuxはカーネルバージョンが3.6.0であるから、UVCはデフォルトで組み込まれているはずである。USBにWebcamを挿すと

usb 1-1: New USB device found, idVendor=046d, idProduct=0825
usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=2
usb 1-1: SerialNumber: 33067350 

見たいな表示がでて、USBデバイスとしては見えているがUVCの気配なし。

というわけで、無理やりUVCをカーネルに組み込んでみた。

まずは正攻法ということで、petalinux-config-kernelのメニューのDevice DriversからMultimedia Supportをenableした。しかし、これでビルドしてもUVCはビルドされない。

探すと、petalinuxのカーネルファイルツリーにはUVCが含まれていて、$PETALINUX/software/petalinux-dist/linux-2.6.x/drivers/media/video/uvcにある。この2つ上のmediaのMakefileにMultimedia Supportの項目がある。

これらのモジュールのビルドするしないの設定は、$PETALINUX/software/petalinux-dist/linux-2.6.x/.configに書かれていて、petalinux-config-kernelはこのファイルを編集する。先のMultimedia Supportに対応してはCONFIG_MEDIA_SUPPORT=yが追加される。

uvcのMakefileを覗くとこのモジュールのビルドを決めるフラグはCONFIG_USB_VIDEO_CLASSである。そういう具合に、ここに依存関係があるフラグを探して、最終的に.configに以下の行を追加した。

CONFIG_MEDIA_CONTROLLER=y
CONFIG_USB_VIDEO_CLASS=y
CONFIG_VIDEO_DEV=y
CONFIG_V4L2_COMMON=y

それで、petalinux-config-kernelを再実行すると、Device Drivers->Multimedia supportにメニューが増えている。フラグが網羅できてるか不安なので、一応Cameras/video grabbers support、Media controller support Media Controller API、V4L2 sub-device userspace API、Video capture adapters、Memory-to-memory multimedia devicesにチェックを入れる。それで、再び.configを見ると、いくつかフラグが増えているから、たぶんこのプロセスが必要である。

これで、makeしてイメージを作って、試したのが次の画像である。

petalinux000
カメラを挿すと、UVCドライバがヒットして、ちゃんと/dev/video0ができている。これでV4L2経由でビデオキャプチャができるはず?
 
スマートではないが、とりあえず、ここまではきた、ということで。