原文地址:http://wenku.baidu.com/view/7105e6c15fbfc77da269b1f4
http://bbs.csdn.net/topics/350052487十三楼尝试一下
摄像头移植
一、环境
主机环境 :ubuntu 10.10 目标板 :FS-S5PC100
主机工具链 :gcc-4.4.5 交叉工具链 :arm-unknown-linux-gnueabi-gcc
摄像头 :ZC301
注意事项:
自己制作文件系时,需要将交叉编译工具链中的库文件拷贝到文件系统中。
2 调试时使用nfs挂载,调试完成后,将zImage和yaffs文件系统(yaffs可读写)烧入开发板。
二、移植过程
1、配置内核使内核支持芯片为ZC301的摄像头
Make menuconfig
DeviceDrivers --->
<*>Multimedia support --->
<*>Video For Linux
[*]Enable Video For Linux API 1 (DEPRECATED) (NEW)
[*]Video capture adapters (NEW) --->
[*]V4L USB devices (NEW) --->
<*>USB Video Class (UVC)
[*]UVC input events device support (NEW)
<*>USB ZC0301[P] webcam support (DEPRECATED)
2、重新编译内核 makezImage
3、mjpg-streamer的移植
关于mjpg-streamer的资料可以在下面这个网址查看:http://sourceforge.net/apps/mediawiki/mjpg-streamer/index.php?title=Main_Page
mjpg-streamer的移植需要jpeg的库,所以我们先移植jpeg的库
(1)jpeg库的移植
1)jpeg源码包通过下面这个网址下载 http://www.ijg.org/files/jpegsrc.v8b.tar.gz
2)解压源码包在/home/linux/ 目录下解压: tarxvf jpegsrc.v8b.tar.gz
3)配置源码,在/home/linux/目录下创建jpeg目录mkdirjpeg
cd jpeg-8b
执行 ./configure --prefix=/home/linux/jpeg --host=arm-unknwn-linux-gnueabi
4)编译 make
5)安装 makeinstall
6)拷贝库到文件系统中 cp /home/linux/jpeg/lib/libjpeg.so.8 /source/rootfs/lib
(2)mjpg-streamer的移植
1)mjpg-stream源码包通过下面这个网址下载 http://sourceforge.net/projects/mjpg-streamer/
2)解压源码 tarxvf mjpg-streamer-r63.tar.gz
3)修改源码 cdmjpg-streamer-r63
修改顶层makefile及plugins目录中的各级makefile,将所有
CC=gcc
修改为 CC=arm-unknown-linux-gnueabi-gcc
修改plugins/input_uvc/Makfile
修改 CFLAGS+= -O2 -DLINUX -D_GNU_SOURCE -Wall -shared –fPIC
为 CFLAGS+= -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC -I/home/linux//jpeg/include
修改
$(CC)$(CFLAGS) -ljpeg -o $@ input_uvc.c v4l2uvc.lojpeg_utils.lo dynctrl.lo
为
$(CC)$(CFLAGS) -ljpeg -L/home/linux/jpeg/lib -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo
4)编译 make
5)将mjpeg可执行文件拷贝到文件系统的/bin目录下 cpmjpg-streamer /source/rootfs/bin
在文件系统中创建mjpg目录,将所有的动态库拷贝到该目录下
mkdir/source/rootfs/mjpg
cp*.so /source/rootfs/mjpg {6个so文件}
将mjpeg_streamer-r63目录下的/www目录拷贝到文件系统中
cp /www/ -a /source/rootfs/ -rf -rf
4 运行
在WINDOWS下 运行viewer.exe或运行解压文件中的www目录下的所有文件复制到你当前的BOA服务器指定的目录下。
同时要将www目录下的cambozla.jarbodybg.gif ,favicon.ico, favicon.png, sidebarbg.gif拷贝到你的BOA服务器下。
打开开开发板将boa服务器运行起来
./etc/boa/boa&
输入下面一行命令:
./bin/mjpg_streamer -i "/mjpg/input_uvc.so-d /dev/video0" -o "/mjpg/output_http.so -w /www/ "
在linux系统的浏览器中,输入如下地址:
显示界面如下图所示:
5 拍照功能的实现
由于mjpg_stream中output-file.so能实现连续拍照的功能,不能实现单拍或连拍几张的功能所以需要对output_file原码进行修改。
# cd mjpg-streamer-rc63/plugins/output_file
# vim output_file.c
在96行 函数 void*worker_thread(void *arg) 体中加入以下代码:
charbuf[10]; //
intflags = 0; //拍照标志,1:表示11张照片,2:表示1张照片
intfd_com = 0; //打开管道的文件描述符
stop_num = 0; //拍照计数
if ( access(“/tmp/webcom”,F_OK) < 0 ) //创建有名管道用于接收拍照命令
{
if ( mkfifo(“/tmp/webcom”,0666 ) < 0)
{
Printf(“ photo fifo create failed\n”);
}
}
fd_com = open (“/tmp/webcom”,O_RDONLY,0666);
if (fd < 0)
{
perror (“open the file webcom error”);
}
在while( ok >= 0 && !pglobal->stop){ 后加入
if (flags == 0)
{
while(1)
{
reade(fd_com,buf,sizeof(buf));
if(strncmp(buf,”danger”,6) == 0) //拍11张照片
{
flags = 1;
bzero(buf,sizeof(buf));
break;
}
if(strncmp(buf,”one”,3) == 0) //拍1张照片
{
flags = 2;
bzero(buf,sizeof(buf));
break;
}
}
}
在if (delay > 0){
usleep(1000*delay);
}后加入
stop_num++
if(flags == 1) //判断拍照的数量
{
if ( stop_num > 9)
{
stop_num= 0;
flsgs= 0;
}
}
elseif (flags == 2)
{
stop_num= 0;
flags= 0;
}
所以只要向有名管道/tmp/webcom写入danger就能连拍11张照片,写入one就拍一张照片。
注:拍照功能实现:
./bin/mjpg_streamer –i “/mjpeg/input_uvc.so –d /dev/video0” -o “/mjpeg/output_file.so –f /pice -d 15000 ” & echo danger > /dev/video0