Armadillo-500上のAndroidでカメラプレビューする方法

Armadillo-500上のAndroidでUSBカメラの画像をアプリで表示させる方法をまとめましたので公開します。

Androidソースコード公開前に作成したものの為、Androidから直接デバイスを使用しない方法を使っています。
今後、Androidから直接USBカメラを使用させる方法も探っていきます。

では、早速。


環境依存部分は便宜読み替えて下さい。

開発環境を整える

以前、このブログで紹介した方法でいけると思います。
※不明点があれば質問ください。

カーネルビルド

今回使用するカメラはUVCカメラなのでV4Lを有効化してビルドします。

atmark@atde:~/atmark-dist-20080617$ make menuconfig

  ~中略~

Device Drivers--->
    Multimedia devices--->
        <*> Video For Linux
        < > Enable Video For Linux API 1 (DEPRECATED)
        < > Enable Video For Linux API 1 compatible Layer
        < > Video capture adapters  --->

  ~中略~

atmark@atde:~/atmark-dist-20080617$ make

Video For Linuxだけにチェックをつけて他のチェックは外さないとコンパイルエラーが出ることがあるので注意してください。

UVCドライバビルド

Linux UVC driver and tools(http://linux-uvc.berlios.de/)にUVCドライバコードがあります。
コードはSubversionリポジトリにあるのでSubversionをインストールしてからダウンロードします。

atmark@atde:~$ sudo apt-get install subversion
Password:

  ~中略~

atmark@atde:~$ svn checkout svn://svn.berlios.de/linux-uvc/linux-uvc/trunk

  ~中略~

atmark@atde:~$ mv trunk uvcvideo
atmark@atde:~$ cd uvcvideo
atmark@atde:~/uvcvideo$ mv Makefile Makefile.org

  ~中略~

すんなりビルドできないかもしれないので以下のMakefileに入れ替えてビルドしてみて下さい。

/home/atmark/uvcvideo/Makefile

PWD := $(shell pwd)

ROOTDIR ?= ../atmark-dist-20080617

ROMFSDIR = $(ROOTDIR)/romfs

include $(ROOTDIR)/.config
include $(ROOTDIR)/config.arch

MAKEARCH = $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE)

LINUXDIR = $(CONFIG_LINUXDIR)
KERNELRELEASE = ${shell make -sC $(ROOTDIR)/$(LINUXDIR) kernelrelease}

obj-m           := uvcvideo.o
uvcvideo-objs   := uvc_driver.o uvc_queue.o uvc_v4l2.o uvc_video.o uvc_ctrl.o uvc_status.o uvc_isight.o

all: uvcvideo

uvcvideo:
        @echo "Building USB Video Class driver..."
        @sh svn-version.sh > version.h 2>/dev/null
        @$(MAKEARCH) -C $(ROOTDIR)/$(LINUXDIR) M=$(PWD) modules

clean:
        -rm -f *.o *.ko .*.cmd .*.flags *.mod.c Module.symvers version.h
modules.order
        -rm -rf .tmp_versions

カーネルモジュールを作成します。

atmark@atde:~/uvcvideo$ make

  ~中略~

atmark@atde:~/uvcvideo$ ls -l

  ~中略~

-rw-r--r-- 1 atmark atmark 68024 XXXX-XX-XX XX:XX uvcvideo.ko

Sourcery G++ Lite 2007q3-51 for ARM GNU/Linuxをインストール(ARMクロスコンパイラ)

CodeSourceryからARMクロスコンパイラを取得します。
http://www.codesourcery.com/gnu_toolchains/arm/portal/release313
から IA32 GNU/Linux Tar を選択し、ダウンロード後に展開します。

atmark@atde:~$ tar xvfj arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

uvccaptureの展開

HP(http://www.quickcamteam.net/software/linux/v4l2-software/uvccapture)から
uvccaptureを取得してホームで展開して下さい。
展開したフォルダ名を webcamd にして下さい。
添付のwebcamd化ファイルを webcamd にコピーして下さい。
v4l2uvc.hで定義している構造体vdInに下記定義を追加して下さい。

 int init;

uClibc-0.9.29ビルド

この時はまだAndroidC言語ライブラリ(bionic)が公開されてなかったので、uClibcで代用しました。
コンフィギュレーションは以下の通りです。
Linux kernel headerの場所ですが一度ビルドしたカーネルでないとヘッダが足りません。

atmark@atde:~$ wget http://www.uclibc.org/downloads/uClibc-0.9.29.tar.bz2

  ~中略~

atmark@atde:~$ tar xvfj uClibc-0.9.29.tar.bz2

  ~中略~

atmark@atde:~$ cd uClibc-0.9.29
atmark@atde:~/uClibc-0.9.29$ make menuconfig

  ~中略~

 Target Architecture
   => arm
  Target Architecture Features and Options
   => Target ABI
    => EABI
   
   => Target Processor Endianness
    => Little Endian
    
   => Linux kernel header Location
    => /home/atmark/linux-2.6.18-at8/include

  ~中略~

atmark@atde:~/uClibc-0.9.29$ export PATH=$PATH:/home/atmark/arm-2007q3/bin

コンパイルエラーが出る場合は Rules.mak を以下のように修正してみて下さい。

Rules.mak

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
366:#CFLAGS := -include $(top_builddir)include/libc-symbols.h \
367:#        $(XWARNINGS) $(CPU_CFLAGS) $(SSP_CFLAGS) \
368:#        -fno-builtin -nostdinc -I$(top_builddir)include -I.
369:CFLAGS := -include $(top_builddir)include/libc-symbols.h \
370:        $(XWARNINGS) $(CPU_CFLAGS) $(SSP_CFLAGS) \
371:        -fno-builtin -I$(top_builddir)include -I.
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

コンパイルします。

atmark@atde:~/uClibc-0.9.29$ make CROSS=arm-none-linux-gnueabi-

  ~中略~

atmark@atde:~/uClibc-0.9.29$ cp ./lib/crt1.o ../webcamd/crt1.o
atmark@atde:~/uClibc-0.9.29$ cp ./lib/crti.o ../webcamd/crti.o
atmark@atde:~/uClibc-0.9.29$ cp ./lib/crtn.o ../webcamd/crtn.o
atmark@atde:~/uClibc-0.9.29$ tar cfz uclibc.tar.gz lib
atmark@atde:~/uClibc-0.9.29$ su
Password:
root@atde:/home/atmark/uClibc-0.9.29# mkdir /usr/arm-linux-uclibc
root@atde:/home/atmark/uClibc-0.9.29# cp uclibc.tar.gz /usr/arm-linux-uclibc/uclibc.tar.gz
root@atde:/home/atmark/uClibc-0.9.29# cd /usr/arm-linux-uclibc
root@atde:/usr/arm-linux-uclibc# tar xvfz uclibc.tar.gz
root@atde:/usr/arm-linux-uclibc# exit

gcc 4.2.1のソースからソフトウェア浮動小数点コードの取得

gnuから gcc 4.2.1のソースコードを取得し展開して下さい。
下記フォルダにあるコードを webcamd フォルダへコピーして下さい。

 gcc-4.2.1/gcc/config/asm/lib1funcs.asm
 gcc-4.2.1/gcc/config/asm/ieee754-df.S
 gcc-4.2.1/gcc/config/asm/ieee754-sf.S

uvccaptureをwebcamdとしてビルド

atmark@atde:/usr$ cd ~/webcamd
atmark@atde:~/webcamd$ ./buildwebcamd

cameraアプリの展開

Tom Gibara氏のLive Camera Previews in AndroidのSocketCameraを使用したアプリ"camera.apk"をAndroid側で使用します。

SocketCameraに与えるパラメータは以下の通り。

  • アドレス:127.0.0.1
  • ポート:8080
  • 画像の横幅:320
  • 画像の縦幅:240

ビルドしたアプリを実機に展開

ビルドした物をSDカード、httpサーバーからDLする等で下記の様に実機上で展開して下さい。

  • uClibcライブラリ

ファイル:uclibc.tar.gz

root@android:/# mkdir /usr/arm-linux-uclibc
root@android:/# /bin/cp /sdcard/uclibc.tar.gz /usr/arm-linux-uclibc/uclibc.tar.gz
root@android:/# tar xvfz uclibc.tar.gz
  • uvcvideo.koモジュール

ファイル:uvcvideo.ko

root@android:/# mkdir /lib/modules
root@android:/# /bin/cp /sdcard/uvcvideo.ko /lib/modules/uvcvideo.ko
  • webcamdデーモン

ファイル:webcamd

root@android:/# mkdir /usr/webcamd
root@android:/# cp /sdcard/webcamd /usr/webcamd/webcamd

ファイル:camera.apk

root@android:/# /bin/cp /sdcard/camera.apk /data/app/camera.apk

セットアップ

uvcvideo.koをロードしてwebcamdを起動すれば準備完了です。

root@android:/# cd /lib/modules
root@android:/# insmod uvcvideo.ko
root@android:/# cd /usr/webcamd
root@android:/# ./webcamd&

cameraアプリ起動

Androidのランチャにcameraアプリがあるので起動させます。