arm-linux-gcc版本:4.3.3编译通过
一、视频服务器
0、所需文件
gspcav1-20071224.tar.gz
spcaview-20071224.tar.gz
servfox-R1_1_3.tar.gz
linux内核:2.6.10 摄像头:中星zc0301b 硬件平台:华恒270开发板
gspcav1-20071224.tar.gz
spcaview-20071224.tar.gz
servfox-R1_1_3.tar.gz
linux内核:2.6.10 摄像头:中星zc0301b 硬件平台:华恒270开发板
操作基础:知道linux内核编译过程;会linux命令基本操作;有合适的摄像头;会linux-arm程序下载到开发板的流程
1、建立可编译驱动
1.0、将gspcav1-20071224.tar.gz解压到linux-2.6.10/drivers/usb/media下,修改linux-2.6.10/drivers/usb/Makefile文件,
在其后添加:
obj-$(CONFIG_USB_SPCA5XX) += media/
1.2、添加 gspcav1-20071224 编译选项:修改linux-2.6.10/drivers/usb/media/Kconfig
添加:
config USB_SPCA5XX
tristate "USB SPCA5XX Sunplus/Vimicro/Sonix jpeg Cameras"
depends on USB && VIDEO_DEV
---help---
Say Y or M here if you want to use one of these webcams:
1、建立可编译驱动
1.0、将gspcav1-20071224.tar.gz解压到linux-2.6.10/drivers/usb/media下,修改linux-2.6.10/drivers/usb/Makefile文件,
在其后添加:
obj-$(CONFIG_USB_SPCA5XX) += media/
1.2、添加 gspcav1-20071224 编译选项:修改linux-2.6.10/drivers/usb/media/Kconfig
添加:
config USB_SPCA5XX
tristate "USB SPCA5XX Sunplus/Vimicro/Sonix jpeg Cameras"
depends on USB && VIDEO_DEV
---help---
Say Y or M here if you want to use one of these webcams:
The built-in microphone is enabled by selecting USB Audio support.
This driver uses the Video For Linux API. You must say Y or M to
"Video For Linux" (under Character Devices) to use this driver.
Information on this API and pointers to "v4l" programs may be found
at.
"Video For Linux" (under Character Devices) to use this driver.
Information on this API and pointers to "v4l" programs may be found
at
To compile this driver as a module, choose M here: the
module will be called spca5xx.
1.3、修改linux-2.6.10/drivers/usb/media/Makefile
添加:
obj-$(CONFIG_USB_SPCA5XX) += gspcav1-20071224/ #注意“/”不要漏掉
1.4、把gspcav1-20071224/Makefile修改成: 注意Makfile文件的格式
gspca-objs := gspca_core.o decoder/gspcadecoder.o
obj-$(CONFIG_USB_SPCA5XX) += gspca.o
module will be called spca5xx.
1.3、修改linux-2.6.10/drivers/usb/media/Makefile
添加:
obj-$(CONFIG_USB_SPCA5XX) += gspcav1-20071224/ #注意“/”不要漏掉
1.4、把gspcav1-20071224/Makefile修改成: 注意Makfile文件的格式
gspca-objs := gspca_core.o decoder/gspcadecoder.o
obj-$(CONFIG_USB_SPCA5XX) += gspca.o
clean:
rm -f *.[oas] .*.flags *.ko .*.cmd .*.d .*.tmp *.mod.c
rm -rf .tmp_versions
2、编译内核
内核配置为
(1)Multimedia devices --->
*Video For Linux
(2) USB support --->
*Support for Host-side USB
--- USB Host Controller Drivers
*OHCI HCD support
(3)--- USB Multimedia devices
USB SPCA5XX Sunplus/Vimicro/Sonix jpeg Cameras
修改gspcav1-20071224/gspca_core.c文件
//static const char gspca_version[] = GSPCA_VERSION;改为
static const char gspca_version[] = "00.60.00";
添加一个宏定义
#define VID_HARDWARE_GSPCA 0ff
rm -f *.[oas] .*.flags *.ko .*.cmd .*.d .*.tmp *.mod.c
rm -rf .tmp_versions
2、编译内核
内核配置为
(1)Multimedia devices --->
*Video For Linux
(2) USB support --->
*Support for Host-side USB
--- USB Host Controller Drivers
*OHCI HCD support
(3)--- USB Multimedia devices
USB SPCA5XX Sunplus/Vimicro/Sonix jpeg Cameras
修改gspcav1-20071224/gspca_core.c文件
//static const char gspca_version[] = GSPCA_VERSION;改为
static const char gspca_version[] = "00.60.00";
添加一个宏定义
#define VID_HARDWARE_GSPCA 0ff
make clean;make zImage ;make modules
几分钟过后,带有摄像头驱动的内核就编译好了,下载到开发板,成功识别摄像头后会显示
drivers/usb/media/gspcav1-20071224/gspca_core.c: USB GSPCA camera found.(ZC3XX)
usbcore: registered new driver gspca
drivers/usb/media/gspcav1-20071224/gspca_core.c: gspca driver 01.00.20 registerd
几分钟过后,带有摄像头驱动的内核就编译好了,下载到开发板,成功识别摄像头后会显示
drivers/usb/media/gspcav1-20071224/gspca_core.c: USB GSPCA camera found.(ZC3XX)
usbcore: registered new driver gspca
drivers/usb/media/gspcav1-20071224/gspca_core.c: gspca driver 01.00.20 registerd
3、移植servfox
解压servfox-R1_1_3.tar.gz,将Makfile.arm 改为Makefile make,即可生成arm下可执行的servfox,传到板子上并执行./servfox -d /dev/video0 -g -s 640x480 -w 7070,视频服务器就跑起来了;
/tmp # servfox version: 1.1.3 date: 11:12:2005 (C)
wrong spca5xx device
VIDIOCSWIN failed
: Invalid argument
Waiting .... for connection. CTrl_c to stop !!!!
Got connection from 192.168.2.7
解压servfox-R1_1_3.tar.gz,将Makfile.arm 改为Makefile make,即可生成arm下可执行的servfox,传到板子上并执行./servfox -d /dev/video0 -g -s 640x480 -w 7070,视频服务器就跑起来了;
/tmp # servfox version: 1.1.3 date: 11:12:2005 (C)
wrong spca5xx device
VIDIOCSWIN failed
: Invalid argument
Waiting .... for connection. CTrl_c to stop !!!!
Got connection from 192.168.2.7
4、在pc机上安装spcaview
解压spcaview-20071224.tar.gz 直接make;make install即可
在pc上运行./spcaview -g -w 192.168.1.17即可在电脑上看到视频了
解压spcaview-20071224.tar.gz 直接make;make install即可
在pc上运行./spcaview -g -w 192.168.1.17即可在电脑上看到视频了
5、移植boa服务器
解压boa-0.94.13.tar.gz,进入boa-0.94.13/src执行./configure生成Makefile,修改Makefile,
将 CC = gcc 和 CPP = gcc - E 改为你自己的交叉编译工具
# make
解压boa-0.94.13.tar.gz,进入boa-0.94.13/src执行./configure生成Makefile,修改Makefile,
将 CC = gcc 和 CPP = gcc - E 改为你自己的交叉编译工具
# make
util.c:100:1: error: pasting "t" and "->" does not give a valid preprocessing token
make: *** [util.o] Error 1
make: *** [util.o] Error 1
解决方法:
修改 src/compat.h
找到
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
修改成
#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff
然后
debian:/home/a/sss/boa-0.94.13/src# make clean
debian:/home/a/sss/boa-0.94.13/src# make
修改 src/compat.h
找到
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
修改成
#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff
然后
debian:/home/a/sss/boa-0.94.13/src# make clean
debian:/home/a/sss/boa-0.94.13/src# make
然后除去调试信息,以减小体积
# arm-linux-strip boa
修改boa.conf,改为
# Boa v0.94 configuration file
# File format has not changed from 0.93
# File format has changed little from 0.92
# version changes are noted in the comments
#
# The Boa configuration file is parsed with a lex/yacc or flex/bison
# generated parser. If it reports an error, the line number will be
# provided; it should be easy to spot. The syntax of each of these
# rules is very simple, and they can occur in any order. Where possible
# these directives mimic those of NCSA httpd 1.3; I saw no reason to
# introduce gratuitous differences.
# arm-linux-strip boa
修改boa.conf,改为
# Boa v0.94 configuration file
# File format has not changed from 0.93
# File format has changed little from 0.92
# version changes are noted in the comments
#
# The Boa configuration file is parsed with a lex/yacc or flex/bison
# generated parser. If it reports an error, the line number will be
# provided; it should be easy to spot. The syntax of each of these
# rules is very simple, and they can occur in any order. Where possible
# these directives mimic those of NCSA httpd 1.3; I saw no reason to
# introduce gratuitous differences.
# $Id: boa.conf,v 1.25 2002/03/22 04:33:09 jnelson Exp $
# The "ServerRoot" is not in this configuration file. It can be compiled
# into the server (see defines.h) or specified on the command line with
# the -c option, for example:
#
# boa -c /usr/local/boa
# into the server (see defines.h) or specified on the command line with
# the -c option, for example:
#
# boa -c /usr/local/boa
# Port: The port Boa runs on. The default port for http servers is 80.
# If it is less than 1024, the server must be started as root.
Port 80
# Listen: the Internet address to bind(2) to. If you leave it out,
# it takes the behavior before 0.93.17.2, which is to bind to all
# addresses (INADDR_ANY). You only get one "Listen" directive,
# if you want service on multiple IP addresses, you have three choices:
# 1. Run boa without a "Listen" directive
# a. All addresses are treated the same; makes sense if the addresses
# are localhost, ppp, and eth0.
# b. Use the VirtualHost directive below to point requests to different
# files. Should be good for a very large number of addresses (web
# hosting clients).
# 2. Run one copy of boa per IP address, each has its own configuration
# with a "Listen" directive. No big deal up to a few tens of addresses.
# Nice separation between clients.
# The name you provide gets run through inet_aton(3), so you have to use dotted
# quad notation. This configuration is too important to trust some DNS.
# it takes the behavior before 0.93.17.2, which is to bind to all
# addresses (INADDR_ANY). You only get one "Listen" directive,
# if you want service on multiple IP addresses, you have three choices:
# 1. Run boa without a "Listen" directive
# a. All addresses are treated the same; makes sense if the addresses
# are localhost, ppp, and eth0.
# b. Use the VirtualHost directive below to point requests to different
# files. Should be good for a very large number of addresses (web
# hosting clients).
# 2. Run one copy of boa per IP address, each has its own configuration
# with a "Listen" directive. No big deal up to a few tens of addresses.
# Nice separation between clients.
# The name you provide gets run through inet_aton(3), so you have to use dotted
# quad notation. This configuration is too important to trust some DNS.
#Listen 192.68.0.5
# User: The name or UID the server should run as.
# Group: The group name or GID the server should run as.
# Group: The group name or GID the server should run as.
User nobody
Group 0
Group 0
# ServerAdmin: The email address where server problems should be sent.
# Note: this is not currently used, except as an environment variable
# for CGIs.
# Note: this is not currently used, except as an environment variable
# for CGIs.
#ServerAdmin
# ErrorLog: The location of the error log file. If this does not start
# with /, it is considered relative to the server root.
# Set to /dev/null if you don't want errors logged.
# If unset, defaults to /dev/stderr
# with /, it is considered relative to the server root.
# Set to /dev/null if you don't want errors logged.
# If unset, defaults to /dev/stderr
#ErrorLog /var/log/boa/error_log
# Please NOTE: Sending the logs to a pipe ('|'), as shown below,
# is somewhat experimental and might fail under heavy load.
# "Usual libc implementations of printf will stall the whole
# process if the receiving end of a pipe stops reading."
#ErrorLog "|/usr/sbin/cronolog --symlink=/var/log/boa/error_log /var/log/boa/error-%Y%m%d.log"
# Please NOTE: Sending the logs to a pipe ('|'), as shown below,
# is somewhat experimental and might fail under heavy load.
# "Usual libc implementations of printf will stall the whole
# process if the receiving end of a pipe stops reading."
#ErrorLog "|/usr/sbin/cronolog --symlink=/var/log/boa/error_log /var/log/boa/error-%Y%m%d.log"
# AccessLog: The location of the access log file. If this does not
# start with /, it is considered relative to the server root.
# Comment out or set to /dev/null (less effective) to disable
# Access logging.
# start with /, it is considered relative to the server root.
# Comment out or set to /dev/null (less effective) to disable
# Access logging.
#AccessLog /var/log/boa/access_log
# Please NOTE: Sending the logs to a pipe ('|'), as shown below,
# is somewhat experimental and might fail under heavy load.
# "Usual libc implementations of printf will stall the whole
# process if the receiving end of a pipe stops reading."
#AccessLog "|/usr/sbin/cronolog --symlink=/var/log/boa/access_log /var/log/boa/access-%Y%m%d.log"
# Please NOTE: Sending the logs to a pipe ('|'), as shown below,
# is somewhat experimental and might fail under heavy load.
# "Usual libc implementations of printf will stall the whole
# process if the receiving end of a pipe stops reading."
#AccessLog "|/usr/sbin/cronolog --symlink=/var/log/boa/access_log /var/log/boa/access-%Y%m%d.log"
# UseLocaltime: Logical switch. Uncomment to use localtime
# instead of UTC time
#UseLocaltime
# instead of UTC time
#UseLocaltime
# VerboseCGILogs: this is just a logical switch.
# It simply notes the start and stop times of cgis in the error log
# Comment out to disable.
# It simply notes the start and stop times of cgis in the error log
# Comment out to disable.
#VerboseCGILogs
# ServerName: the name of this server that should be sent back to
# clients if different than that returned by gethostname + gethostbyname
# clients if different than that returned by gethostname + gethostbyname
ServerName
# VirtualHost: a logical switch.
# Comment out to disable.
# Given DocumentRoot /var/www, requests on interface 'A' or IP 'IP-A'
# become /var/www/IP-A.
# Example: becomes /var/www/127.0.0.1
#
# Not used until version 0.93.17.2. This "feature" also breaks commonlog
# output rules, it prepends the interface number to each access_log line.
# You are expected to fix that problem with a postprocessing script.
# Comment out to disable.
# Given DocumentRoot /var/www, requests on interface 'A' or IP 'IP-A'
# become /var/www/IP-A.
# Example: becomes /var/www/127.0.0.1
#
# Not used until version 0.93.17.2. This "feature" also breaks commonlog
# output rules, it prepends the interface number to each access_log line.
# You are expected to fix that problem with a postprocessing script.
#VirtualHost
# DocumentRoot: The root directory of the HTML documents.
# Comment out to disable server non user files.
# Comment out to disable server non user files.
DocumentRoot /var/www
# UserDir: The name of the directory which is appended onto a user's home
# directory if a ~user request is recieved.
# directory if a ~user request is recieved.
UserDir public_html
# DirectoryIndex: Name of the file to use as a pre-written HTML
# directory index. Please MAKE AND USE THESE FILES. On the
# fly creation of directory indexes can be _slow_.
# Comment out to always use DirectoryMaker
# directory index. Please MAKE AND USE THESE FILES. On the
# fly creation of directory indexes can be _slow_.
# Comment out to always use DirectoryMaker
DirectoryIndex index.html
# DirectoryMaker: Name of program used to create a directory listing.
# Comment out to disable directory listings. If both this and
# DirectoryIndex are commented out, accessing a directory will give
# an error (though accessing files in the directory are still ok).
# Comment out to disable directory listings. If both this and
# DirectoryIndex are commented out, accessing a directory will give
# an error (though accessing files in the directory are still ok).
#DirectoryMaker /usr/lib/boa/boa_indexer
# DirectoryCache: If DirectoryIndex doesn't exist, and DirectoryMaker
# has been commented out, the the on-the-fly indexing of Boa can be used
# to generate indexes of directories. Be warned that the output is
# extremely minimal and can cause delays when slow disks are used.
# Note: The DirectoryCache must be writable by the same user/group that
# Boa runs as.
# has been commented out, the the on-the-fly indexing of Boa can be used
# to generate indexes of directories. Be warned that the output is
# extremely minimal and can cause delays when slow disks are used.
# Note: The DirectoryCache must be writable by the same user/group that
# Boa runs as.
# DirectoryCache /var/spool/boa/dircache
# KeepAliveMax: Number of KeepAlive requests to allow per connection
# Comment out, or set to 0 to disable keepalive processing
# Comment out, or set to 0 to disable keepalive processing
KeepAliveMax 1000
# KeepAliveTimeout: seconds to wait before keepalive connection times out
KeepAliveTimeout 10
# MimeTypes: This is the file that is used to generate mime type pairs
# and Content-Type fields for boa.
# Set to /dev/null if you do not want to load a mime types file.
# Do *not* comment out (better use AddType!)
# and Content-Type fields for boa.
# Set to /dev/null if you do not want to load a mime types file.
# Do *not* comment out (better use AddType!)
MimeTypes /var/www/mime.types
# DefaultType: MIME type used if the file extension is unknown, or there
# is no file extension.
# is no file extension.
DefaultType text/html
# CGIPath: The value of the $PATH environment variable given to CGI progs.
CGIPath /bin:/usr/bin:/usr/local/bin
# SinglePostLimit: The maximum allowable number of bytes in
# a single POST. Default is normally 1MB.
# a single POST. Default is normally 1MB.
# AddType: adds types without editing mime.types
# Example: AddType type extension [extension ...]
# Example: AddType type extension [extension ...]
# Uncomment the next line if you want .cgi files to execute from anywhere
#AddType application/x-httpd-cgi cgi
#AddType application/x-httpd-cgi cgi
# Redirect, Alias, and ScriptAlias all have the same semantics -- they
# match the beginning of a request and take appropriate action. Use
# Redirect for other servers, Alias for the same server, and ScriptAlias
# to enable directories for script execution.
# match the beginning of a request and take appropriate action. Use
# Redirect for other servers, Alias for the same server, and ScriptAlias
# to enable directories for script execution.
# Redirect allows you to tell clients about documents which used to exist in
# your server's namespace, but do not anymore. This allows you to tell the
# clients where to look for the relocated document.
# Example: Redirect /bar
# your server's namespace, but do not anymore. This allows you to tell the
# clients where to look for the relocated document.
# Example: Redirect /bar
# Aliases: Aliases one path to another.
# Example: Alias /path1/bar /path2/foo
# Example: Alias /path1/bar /path2/foo
#Alias /doc /usr/doc
# ScriptAlias: Maps a virtual path to a directory for serving scripts
# Example: ScriptAlias /htbin/ /www/htbin/
# Example: ScriptAlias /htbin/ /www/htbin/
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
ScriptAlias /index.html /var/www/index.html
ScriptAlias /index.html /var/www/index.html
复制/etc/mime.types 和boa-0.94.13/src/boa到 /nfs/www 说明:/nfs/www为我自己服务器的挂载目录,看自己情况而定
建立/nfs/www/cgi-bin/目录
建立/nfs/www/cgi-bin/目录
在开发板上建立/var/www目录,然后把pc的/nfs/www挂载到开发板的/var/www目录,执行./boa,服务器就跑起来了。具体情况看个人的配置文件
将spcaview-20071224/http-java-applet里的内容拷贝到/nfs/www/view文件夹下,并解压JWebcamPlayer.jar到view文件夹
在pc浏览器上输入192.168.2.222/view/index-sample.html按照需要安装自己的java-plug,好了刷新就可以在网页上看到视频了;
Goodluck!
在pc浏览器上输入192.168.2.222/view/index-sample.html按照需要安装自己的java-plug,好了刷新就可以在网页上看到视频了;
Goodluck!
----------------------------
错误的地方:
错误No such user: nobody
User 0
Group 0
User 0
Group 0
错误boa.c:211 - getpwuid: No such file or directory
(3)修改src/boa.c
(3)修改src/boa.c
注释掉下面两句话:
if (passwdbuf == NULL) {
DIE(”getpwuid”);
}
if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
DIE(”initgroups”);
}
DIE(”getpwuid”);
}
if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
DIE(”initgroups”);
}
为
#if 0
if (passwdbuf == NULL) {
DIE(”getpwuid”);
}
if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
DIE(”initgroups”);
}
#endif
if (passwdbuf == NULL) {
DIE(”getpwuid”);
}
if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
DIE(”initgroups”);
}
#endif
二、移植spcaview-20061208到arm上
在编译spcaview之前需要移植SDL库文件,下载SDL-1.2.14.tar.gz解压进入执行
./configure --prefix=/root/sdl --disable-video-qtopia --disable-video-dummy --disable-video-fbcon --disable-video-dga --disable-arts --disable-esd --disable-alsa --disable-cdrom --disable-video-x11 --disable-nasm --target=arm-linux --host=arm-linux --enable-video-fbcon
指定安装目录在/root/sdl
然后修改/root/SDL-1.2.14/include/SDL_config.h第207行,注释掉
//#define SDL_INPUT_LINUXEV 1
//#define SDL_INPUT_TSLIB 1
因为我暂时没有输入设备,否则在编译spcaview时会出现找不到/dev/mouse的错误
//#define SDL_INPUT_TSLIB 1
因为我暂时没有输入设备,否则在编译spcaview时会出现找不到/dev/mouse的错误
make
make install
编译spcaview,修改Makefile
CC=arm-linux-gcc -staticCPP=arm-linux-g++
SDLLIBS = -L/root/sdl/lib -lSDL -lpthread
SDLFLAGS = -I/root/sdl/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT
spcaserv: $(OBJSERVER)
arm-linux-gcc -static $(SERVFLAGS) -o spcaserv $(OBJSERVER) $(SERVLIBS)
spcacat: $(OBJCAT)
arm-linux-gcc -static $(SERVFLAGS) -o spcacat $(OBJCAT) $(SERVLIBS)
然后make就可以了
SDLFLAGS = -I/root/sdl/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT
spcaserv: $(OBJSERVER)
arm-linux-gcc -static $(SERVFLAGS) -o spcaserv $(OBJSERVER) $(SERVLIBS)
spcacat: $(OBJCAT)
arm-linux-gcc -static $(SERVFLAGS) -o spcacat $(OBJCAT) $(SERVLIBS)
然后make就可以了