Armadillo-500上のAndroidでカメラプレビューする方法
Armadillo-500上のAndroidでUSBカメラの画像をアプリで表示させる方法をまとめましたので公開します。
Androidのソースコード公開前に作成したものの為、Androidから直接デバイスを使用しない方法を使っています。
今後、Androidから直接USBカメラを使用させる方法も探っていきます。
では、早速。
- 用意する物
- Armadillo-500
- Armadillo-500のリリースカーネルソース+Androidを動かす為のパッチ
- Armadillo-500で動かすことが出来るAndroidのユーザーランド
- アットマークテクノで入手できるATDE
- アットマークテクノで入手できるAtmark Dist
- Sourcery G++ Lite 2007q3-51 for ARM GNU/Linux
- Tom Gibara氏のLive Camera Previews in Android
- uvcvideoドライバコード
- uClibc-0.9.29コード
- uvccaptureコード
- gcc 4.2.1
- UVC対応カメラ
環境依存部分は便宜読み替えて下さい。
開発環境を整える
以前、このブログで紹介した方法でいけると思います。
※不明点があれば質問ください。
カーネルビルド
今回使用するカメラは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ビルド
この時はまだAndroidのC言語ライブラリ(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
- Android cameraアプリ
ファイル: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&