转载自:http://blog.sina.com.cn/s/blog_5fe2e9b10100cz9v.html

相关文献:http://www.linuxsir.org/main/?q=node/221

            http://hi.baidu.com/zhxust/blog/item/059bfa876955dc23c65cc31c.html

 

要用到的软件包

  摄像头驱动: http://mxhaard.free.fr/spca50x/embedded/KernelPatch/usb-2.4.31LE06.patch.tar.gz
  服务器视频采集: http://mxhaard.free.fr/spca50x/embedded/Servfox/servfox-R1_0_0.tar.gz
  客户端播放视频: ftp://ftp5.linuxeden.com/hardware/spcaview-20061208.tar.gz
  浏览器java plugs: http://software.lupaworld.com/data/upload/jre-1_5_0_06-linux-i586-rpm.bin
(1)安装摄像头驱动

将usb-2.4.31LE06.patch.tar.gz 复制到/armlinux/kernel/driver/usb下,解压,打补丁

#tar -xvzf usb-2.4.31.patch.gz

#patch -p1 < usb-2.4.31.patch
  此时就会在此目录下看到spca5xx文件夹了.不知是何原因,估计是KERNEL版本的原因,在/armlinux/kernel/driver/usb 的目录中的Makefile 和config.in中找不到对应的关键字,此时会有一些错误,并将错误放在Makefile.rej 和config.in.rej 两文件中,打开两个文件,分别将其中前面有+的文字加到 Makefile和config.in中
对应的分类中即可. 我做的时候,没有生成config.in.rej ,只需处理一下Makefile.rej 。

(2)编译内核

进入armlinux

#make menuconfig.

在arm linux的kernel目录下make menuconfig,
  首先<*>选择Multimedia device->下的Video for linux,
  然后 USB support ---> USB Multimedia devices 选项下应该有
  <M> USB SPCA5XX Sunplus Vimicro Sonix Cameras,要把它配置成module。
(3)#make clean //删除以前的编译结果

#make dep //依赖编译

#make

#make Image //形成vmlinux

#/usr/local/arm/2.95.3/bin/arm-linux-objcopy -O binary -S vmlinux linux.bin //形成linux.bin

// /usr/local/arm/2.95.3/bin/arm-linux-objcopy 在交叉编译工具的安装目录中的一个工具

#gzip -v9 linux.bin //形成linux.bin.gz

#./mkp_w_picpath -A arm -O linux -C gzip -a 0x20008000 -e 0x20008000 -d linux.bin.gz uImage //把linux.bin.gz文件变为最终的影像文件uImage

//G:\FFT-9200\标准配置光盘\fft-U-boot\编译\fft-uboot-1.0.0\tools\mkp_w_picpath

在linux-2.4.19-rmk7/driver/usb/spca5xx目录下生成spca5xx.o,spcadecoder.o,spca_core.o。这就是我们要的驱动. 实际使用时,只需spca5xx.o就可以了。

(4)烧写新的内核到开发板

挂载相关文件到开发板

需要挂载spca5xx.o,servfox,boa,boa的lib,etc,var三个文件目录

#insmod spca5xx.o

会打印出找到摄像头的提示信息

(5)移植视频采集程序servfox

解压servfox-R1_1_3.tar.gz,将目录中的Makefile.arm文件,修改为名为Makefile即可。再make。

将生成的servfox挂载到开发板。

#mknod /dev/video0 c 81 0 //不写这一步,会出现 ERROR opening V4L interface错误。这一步的意思是:创建一个USB摄像头设备文件/dev/video0

#./servfox -g -d /dev/video0 -s 320x240 -w 7070

// -g :直接从内存读取数据

// -s :servfox上显示的视频窗口的大小

// -w : 服务器端口

(6)客户端spcaview

make生成目标文件

在PC上,spcaview –w 192.168.0.11:7070就可以看到摄像头采集来的图片了

解压后,还会产生<http-java-applet>,此是WEB客户端。将java目录拷到boa服务器的/var/www目录下。目标板启动boa服务器,在windows浏览器下访问:http://192.168.0.11/java/index-sample.html。就可以在线视频监控。

(7)window浏览器安装jre-1_5_0_06-windows-i586-p.exe

下载,安装即可。

安装好后,启动开发板,将摄像头驱动spca5xx.o,服务器视频采集程序servfox,boa服务器程序,以及boa服务器的三个文件夹:lib,etc,var。

开发板的启动步骤:

(1)设置IP

#ifconfig eth0 192.168.0.11

注意:若使用不同的开发板,要对板子进行操作的命令是大致一样的,关键是找到如何以根用户登录的方式。我的板子是启动后输入:root即可。有的板子是启动后输入:login,然后输入:root即可。

(2)加载摄像头驱动

进入摄像头驱动的安放目录

#insmod spca5xx.o

(3)#mknod /dev/video0 c 81 0

(4)启动boa服务器

进入boa服务器安放目录

#./boa

(5)启动视频采集程序

#./servfox -g -d /dev/video0 -s 320x240 -w 7070

windows下启动IE,输入地址:http://192.168.0.11/java/index-sample/html

就可在线看到采集的视频。注意windows主机的IP必须和开发板在同一个网段。

 

在windows在线观看采集的视频的同时,通过网页上的10个按钮给安放摄像头的小车发送命令,以控制摄像头的动作。动作:开始,停止,向上,向下,向左,向右,向前,向后,左转,右转。发送命令的方式:通过开发板的串口向单片机发送命令数据。

开发方法如下:

用javascript Editor对boa服务器/var/www/java下的index-sample.html网页进行添加按钮和按钮的相应动作。

代码如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>spcaserv</title>
</head>

<body>
<center><h1>Spcaserv (c) Servfox (c) Michel Xhaard && JWebcamPlayer(c) Alvaro Salmador Andrea Partinico </h1></center>

<center>
<table border=2 cellspacing=10 cellpadding=10 align="center">
<tr>
<td width="62%">
<applet codebase="." archive="JWebcamPlayer.jar" code="JWebcamPlayer.class" name="JWebcamPlayer" ID="JWebcamPlayer" align="center" width="400" height="400" MAYSCRIPT>
<param name="Color" value="#ffffff">
<param name="Server" value="192.168.0.11">
<param name="Port" value="7070">
<PARAM NAME="scriptable" value="true">
<PARAM NAME="mayscript" value="true">
<strong>You need to download Java.<br>
Click <a href="http://www.java.com/en/download/manual.jsp">here:
http://www.java.com/en/download/manual.jsp</a></strong><br>
</applet>
<br>
click on the window surface to set brightness and contrast <br>
when done, click again to remove the control box.
</td>
<td width="38%">
<table width="100%" align="center">
<center><tr>
<td width="33%" align="right">
<form action="http://192.168.0.11/cgi-bin/serialSendData.cgi?Start" method=POST><input type="submit" name="Start" value= "Start"></input></form>
</td>
<td width="34%"></td>
<td width="33%" align="left">
<form action="http://192.168.0.11/cgi-bin/serialSendData.cgi?Stop" method="post"><input type="submit" name="Stop" value= "Stop "></input></form>
</td>
</tr></center>
<br>
<tr><center>
<td></td>
<td align="center">
<form action="http://192.168.0.11/cgi-bin/serialSendData.cgi?Forward" method="post"><input type="submit" name="Forward" value= "Forward"></input></form>
</td>
<td></td>
</center></tr>
<tr><center>
<td align="center">
<form action="http://192.168.0.11/cgi-bin/serialSendData.cgi?Left" method="post"><input type="submit" name="Left" value= "Left "></input></form>
</td>
<td align="center">
<form action="http://192.168.0.11/cgi-bin/serialSendData.cgi?Backward" method="post"><input type="submit" name="Backward" value= "Backward"></input></form>
</td>
<td align="center">
<form action="http://192.168.0.11/cgi-bin/serialSendData.cgi?Right" method="post"><input type="submit" name="Right" value= "Right"></input></form>
</td>
</center></tr>
<br>
<tr><td><br></td></tr>
<tr><td><br></td></tr>
<tr><center>
<td></td>
<td align="center">
<form action="http://192.168.0.11/cgi-bin/serialSendData.cgi?CameraUp" method="post"><input type="submit" name="CameraUp" value= "CameraUp"></input></form>
</td>
<td></td>
</center></tr>
<tr><center>
<td align="center">
<form action="http://192.168.0.11/cgi-bin/serialSendData.cgi?CameraLeft" method="post"><input type="submit" name="CLeft" value= "Left "></input></form>
</td>
<td align="center">
<form action="http://192.168.0.11/cgi-bin/serialSendData.cgi?CameraDown" method="post"><input type="submit" name="CameraDown" value= "Down"></input></form>
</td>
<td align="center">
<form action="http://192.168.0.11/cgi-bin/serialSendData.cgi?CameraRight" method="post"><input type="submit" name="CRight" value= "Right"></input></form>
</center></tr>
<br>
</table>
</td>
</tr>
</table>
</center>
</body>
</html>
//action="http://192.168.0.11/cgi-bin/serialSendData.cgi?Start"表示:后面的按钮的发送命令发生后,服务器自动调用服务器下的/var/www/cgi-bin/serialSendData.cgi可执行的c程序。?Start:向c程序传递参数,即argv[1]的值。

服务器下的串口程序开发:

和一般的串口程序开发是一样的。

主要是在main()函数的开始加上一句:printf("Status 204 No Response");

加这个的目的是为了,在点击服务器网页按钮给服务器发送命令,服务器调用cgi程序(放在boa服务器的/var/www/cgi-bin目录下)时,网页的页面不发生转,即不变化。

c的串口程序交叉编译好后,放在boa服务器的/var/www/cgi-bin目录下,名字可以是serialSendData。不一定需要.cgi后缀的,这个不相干的。