中星微zc3xx(305b)摄像头s3c2440移植
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
由于需求要做基于摄像头的视屏采集程序,视屏采集程序写了一些,在pc机上效果不错
放假回家后,板子也到了,试着将摄像头移植到板子上,花了两天时间,下面是移植过程,写下来大家讨论一下。
首先在网上找了一些移植方面的文档,大多讲的gspcav1-20071224的移植,我在pc机上安装的也是这个版本的驱动,于是按照这些文档开始了。这样的文档我就不贴出地址了,网上可以找到很多。
把驱动拷贝到内核源码下,修改相应的Kconfig,Makefile这些文件
make menuconfig 做相应的选择
make zImage
烧写
插入usb摄像头,只有
drivers/usb/media/gspcav1-20071224/gspca_core.c: USB GSPCA camera found.(ZC3XX)
configuration #1 chosen from 1 choice
就是没有像他们说的类似
drivers/usb/media/gspcav1-20071224/gspca_core.c: USB GSPCA camera found.(ZC3XX)
这样的信息
失败
这个过程试了很多遍,就不详细写过程了,反正都是失败……
后来就想直接修改gspcav1-20071224下Makefile文件,改为交叉编译,我的Makefile如下:
VERSION = 01.00.20
DEFINES =
###
# The following flags enable experimental features.
# By default, these are enabled for development versions of the driver, and
# disabled for release versions.
# Optional: Enable driver debugging
DEFINES += -DGSPCA_ENABLE_DEBUG
# Optional: Enable direct register read/write for PAC207 development
#DEFINES += -DGSPCA_ENABLE_REGISTERPLAY
###
# The following flags enable features that aren’t yet implemented, and
# therefore are disabled by default.
# Optional: Enable compression
DEFINES += -DGSPCA_ENABLE_COMPRESSION
###
# Rest of Makefile follows here. You probably won’t need to touch this.
# Setup defines
DEFINES += -DCONFIG_USB_GSPCA_MODULE=1 -DMODULE -D__KERNEL__
DEFINES += -DVID_HARDWARE_GSPCA=0xFF -DGSPCA_VERSION=\”$(VERSION)\”
ifneq ($(KERNELRELEASE),) # We were called by kbuild
EXTRA_CFLAGS += $(DEFINES)
obj-m += gspca.o
gspca-objs := gspca_core.o decoder/gspcadecoder.o
else # We were called from command line
KERNEL_VERSION = `uname -r`
KERNELDIR := /opt/linux-2.6.15
PWD := $(shell pwd)
MODULE_INSTALLDIR = /lib/modules/$(KERNEL_VERSION)/kernel/drivers/usb/media/
MODULE_INSTALLDIR2 = /lib/modules/$(KERNEL_VERSION)/kernel/drivers/media/video/
CROSS_COMPILE = /eldk/usr/bin/arm-linux-
CC=/eldk/usr/bin/arm-linux-gcc
ARCH=arm
default:
$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) CC=$(CC) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules
#$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) CC=$(CC) modules
install:
mkdir -p $(MODULE_INSTALLDIR)
rm -f $(MODULE_INSTALLDIR)spca5xx.ko
rm -f $(MODULE_INSTALLDIR2)gspca.ko
install -c -m 0644 gspca.ko $(MODULE_INSTALLDIR)
/sbin/depmod -ae
uninstall:
rm
-f $(MODULE_INSTALLDIR)gspca.ko
/sbin/depmod -aq
endif
########################################
# OTHER TARGETS
##########################################
clean:
rm -r -f *.o decoder/.gspcadecoder.o.cmd decoder/*.o \
.gspca.o.cmd *.o *.ko *.mod.* .[a-z]* core *.i \
*.symvers *.err
##########################################
保存,编译,结果报错
首先看见第一个错gspca_core.c:54:27: error: asm/semaphore.h: No such file or directory
我就试着找semaphore.h这个文件在哪,在内核include/linux下发现,在交叉编译工具目录下居然也发现了,由于实在太菜,不知道应该怎么改,不过我觉得还是应该在内核的那个是对的,于是修改gspca_core.c。后来查资料证明这么修改是对的,我查的资料是从这里来的:
/video/get-your-webcam-working-gspca
一个外国网站,之前我看过好几次这个网页,但是就是没有发现需要的内容,最后耐着性子仔细看了一下英文,发现新大陆。
有一个哥们跟我的错一样,他把错误贴了上来,后面有人回帖,最振奋人心的是这个内容:
Submitted by Baires Norte Lug (not verified) on Wed, 08/12/2009 - 11:39.
Kernel >= 2.6.27
wget http://mxhaard.free.fr/spca50x/Download/gspcav1-20071224.tar.gz
wget .ar/diff/gspca.diff
tar -zxvf gspcav1-20071224.tar.gz
cd gspcav1-20071224
cat ../gspca.diff | patch -p1
./gspca_build
Happy !!!!
Thz .ar
Slackware Rulez :P
于是按照下载补丁,安装补丁
两次重新编译,有一些错误是消失了,但是还是有很多错误,都是关于linux内核内videodev.h的错误,比如VID_TYPE_CAPTURE,VID_TYPE_CAMERA,VIDEO_PALETTE_GREY,VIDEO_PALETTE_RGB565之类关于宏的错误,主要提示是未定义,于是我想是否是驱动程序有问题,没有包含头文件,于是我进去做了一下修改,比如添加该头文件,把一些宏定义复制进去,但是最后还是失败了。
我停下来,想了一下,我之前在pc机上编译安装一切正常,但是小改了一下makefile文件就不对了,应该不会,应该跟驱动原文件没有关系,还有这样改下去不知道要改到什么时候(错误实在太多了,都是引用的宏错误)。于是停下来,再仔细想了一下,应该是跟内核有关系。
这时候我想起来应该看下readme这样的文件,在驱动目录下有一个read_and_install的文件,我在里面发现这句话
Before trying to compile the driver,ensure that you've configured yourkernel,and updated the dependencies:
'make [config|menuconfig|xconfig];make dep'
这个文件还指明该驱动支持的设备,我在里面找到我的设备
{USB_DEVICE(0X0AC8,0X305B)},/*Z-star Vimicro zc0305b*/
还有支持的内核版本,就不详细写了
不过主要
有个问题,这里写的是支持2.6.11以上的版本,网上有人说是支持2.6.17以上的版本,我用2.6.12版本试过,没有成功,没有深究,无解。
看完这个文档后,我去内核源码下make menuconfig,make dep
在make dep时提示make dep is unnecessary now
google后,有人说2.6以后的版本不需要这一步,不知道是不是,希望知道的哥们提出来。
在make menuconfig时发现新大陆,发现我用的2.6.28的内核源码中drivers/media/video下有gspca目录,在menuconfig时也发现了相应的选项,(但是在我之前使用的一些版本的内核源码内没有发现该gspca目录,应该是人为加入的)于是我就使用了内核内的驱动,后面再详细说过程,我也会把我用的这个内核源码包传上来。首先说完对gspcav1-20071224的编译。
使用2.6.28内核源码编译出zImage文件,测试成功之后,我返回试着编译gspcav1-20071224,重新make之后果然成功,产生了gspca.ko文件,可以使用insmod命令将该文件加载入内核,从而可以使用摄像头。看来编译驱动这类东西之前,需要将相应的内核做一次编译,产生相应的lib,头文件之类,还要设置好环境变量。
下面说一下使用的2.6.28内核里的驱动文件编译的过程
首先make menuconfig,主要需要选的配置项如下:
Device Drivers ->
Multimedia devices->
<*>video for linux
[*]video capture adapters->
[*]V4l USB devices ->
<*>USB video class (UVC)
[*] UVC input events device support
<*>GSPCA based webcams ->
<*>ZC3XX USB Camera Driver
做好如上配置后就make,产生zImage,烧入板子,启动
插入usb摄像头,产生提示信息:
drivers/usb/media/gspcav1-20071224/gspca_core.c: USB GSPCA camera found.(ZC3XX)
configuration #1 chosen from 1 choice
gspca:probing 0ac8:304b
zc3xx:probe 2wr ov vga 0x7648
zc3xx:probe 3wr vga 1 0x4001
zc3xx:probe sensor ->7648
zc3xx:Find Sensor OV7648
gspca:probe ok
至此说明系统发现usb设备,并且自动将驱动文件加入内核,设备可以使用了
输入命令mdev -s 更新设备节点,ls /dev 查看设备节点,应该看见设备节点video0 ,输入命令 cat video0 > 2.img,将摄像头数据输出到2.img文件中,将该数据使用ftp或者u盘移到pc上,查看,可以看见摄像头工作了,振奋人心的时刻……
昨天两次编译都成功,但是使用自动加载驱动的内核后,使用servfox 程序的时候被告知不是jpeg webcam。之前大致看过servfox的源码,因为它主要使用jpeg格式数据作为操作对象,所以如果设备输出不是jpeg格式的话,它不能正常工作。google之后看了一篇文章(该文章地址/u/16942/showart_96045.htm
l),虽然不是很懂,但是受到启发,感觉这个问题应该是跟驱动有关系,因为文中说中星微芯片支持压缩jpeg格式,而且还说道控制中星微芯片的jpeg压缩比是在zc3xx.h中的函数,所以我认为应该跟驱动有关系。抱着试一试的想法,将之前由gspcav1-20071224单独编译出来的驱动加载到板子上,调用servfox命令,正常运行,证明之前的假设。下面是加载gspcav1-20071224过程。
首先我将gspcav1-20071224中编译好的gspcav.ko移到nfs目录下
开发板挂载
insmod gspcav.ko失败,提示信息如下
usb 3-1: new full speed USB device using ohci_hcd and address 2
usb 3-1: configuration #1 chosen from 1 choice
gspca: Unknown symbol video_devdata
gspca: Unknown symbol video_unregister_device
gspca: Unknown symbol video_device_alloc
gspca: Unknown symbol video_register_device
gspca: Unknown symbol video_usercopy
gspca: Unknown symbol video_device_release
google一下,有很多,应该是在配置内核的时候没有选v4l的缘故,重新配置内核,选好v4l,将驱动项选为模块加载
重新make,烧写内核
重新insmod gspca.ko,加载成功
使用servfox,成功……