Arm开发板上摄像头的移植有两种方法:第一,将驱动程序添加到内核,通过编译内核,烧写到板子上;第二种,通过动态加载摄像头驱动模块的方法进行硬件的驱动。作者首先在PC的linux系统进行摄像驱动程序的移植,保证驱动程序版本正确,然后将驱动程序编译成模块,通过文件系统挂载到板子,然后进行加载,进而创建摄像头设备节点。下面将具体介绍摄像头动态加载的过程。
移植过程所使用的摄像头型号ZC301P,arm板上的内核版本为2.6.9,开发板为pxa270,所采用的驱动程序包为spca5xx-20060501.tar.gz。
第一步,使用命令解压文件: tar zxvf spca5xx-20060501.tar.gz
进入spca5xx-20060501
: cd spca5xx-20060501
第二步,修改Makefile文件:VERSION = 00.60.00
Makefile的内容如下,注释掉的为蓝色,红色表示修改过的内容:
CC =arm-linux-gcc
LD =arm-linux-ld CVSVERSION = "$Experimental work Michel Xhaard
&& Reza Jelveh 03/02/2004"
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 +=
-DSPCA50X_ENABLE_DEBUG
# Optional: Enable direct register read/write for PAC207
development
#DEFINES +=
-DSPCA5XX_ENABLE_REGISTERPLAY
###
# The following flags enable features that aren't yet implemented,
and
# therefore are disabled by default.
# Optional: Enable compression
DEFINES +=
-DSPCA50X_ENABLE_COMPRESSION
###
# Rest of Makefile follows here. You probably won't need to touch
this.
# Setup defines
DEFINES +=
-DCONFIG_USB_SPCA5XX_MODULE=1 -DMODULE -D__KERNEL__
DEFINES +=
-DVID_HARDWARE_SPCA5XX=0xFF -DSPCA5XX_VERSION=\"$(VERSION)\"
ifneq ($(shell uname -r | cut -d. -f1,2), 2.4)
ifneq ($(KERNELRELEASE),) #
We were called by kbuild
CFLAGS += $(DEFINES)
obj-m += spca5xx.o
spca5xx-objs := drivers/usb/spca5xx.o drivers/usb/spcadecoder.o
else # We were called from
command line
#KERNEL_VERSION = `uname -r`
KERNEL_VERSION = 2.6.9
#KERNELDIR := /lib/modules/$(KERNEL_VERSION)/build
KERNELDIR := /up-techpxa270/kernel/linux-2.6.9
PWD := $(shell pwd)
#MODULE_INSTALLDIR =
/lib/modules/$(KERNEL_VERSION)/kernel/drivers/usb/media/
MODULE_INSTALLDIR =/root/modules/
# Targets, don't change!
default:
@echo ' Building SPCA5XX driver for 2.5/2.6 kernel.'
@echo ' Remember: you must have read/write access to your kernel source
tree.'
$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) CC=$(CC)
modules
install:
mkdir -p $(MODULE_INSTALLDIR)
rm -f $(MODULE_INSTALLDIR)spca50x.ko
rm -f $(MODULE_INSTALLDIR)et61x.ko
install -c -m 0644 spca5xx.ko
$(MODULE_INSTALLDIR)
/sbin/depmod -ae
uninstall:
rm -f $(MODULE_INSTALLDIR)/spca5xx.ko
/sbin/depmod -aq
endif
else # kernel version
test
#############################################################################
# For Linux 2.4 users.
# Change the following lines according to your system
configuration.
# It is important to configure your particular source tree ("make
dep") before
# compiling this module!
#############################################################################
###
# This makefile will build the spca50x driver module external to
the kernel
# source tree. It makes it easier to swap kernels.
#KERNEL_VERSION = `uname -r`
KERNEL_VERSION = 2.4.x
###
# Location of the header files (most importantly the config
files)
# for the kernel you want to build the module against.
# This should be correct for the currently installed kernel on your
machine.
#KINCLUDE =
/lib/modules/$(KERNEL_VERSION)/build/include
KINCLUDE =/up-techpxa270/kernel/linux2.4.x
KERNEL_ACFILE = $(KINCLUDE)/linux/autoconf.h
KERNEL_MODVERSIONSFILE = $(KINCLUDE)/linux/modversions.h
#MODULE_INSTALLDIR =
/lib/modules/$(KERNEL_VERSION)/kernel/drivers/usb/
MODULE_INSTALLDIR =/root/modules/
# Detect module versioning support
ifneq ($(strip $(shell grep 'define CONFIG_MODVERSIONS 1'
$(KERNEL_ACFILE))),)
DEFINES += -DMODVERSIONS -include
$(KERNEL_MODVERSIONSFILE)
endif
# Detect SMP support
ifneq ($(strip $(shell grep 'define CONFIG_SMP 1'
$(KERNEL_ACFILE))),)
DEFINES += -D__SMP__ -DSMP
endif
# Setup the tools
#CC = gcc
#LD = ld
CC =arm-linux-gcc
LD =arm-linux-gcc
# Setup compiler warnings
WARNINGS = -Wall
-Wpointer-arith
WARNINGS += -Wcast-align -Wwrite-strings
-Wstrict-prototypes
WARNINGS += -Wuninitialized -Wreturn-type
-Wunused -Wparentheses
# Setup compiler flags
CFLAGS = -O2 -fomit-frame-pointer -fno-strict-aliasing -pipe
CFLAGS +=
-mpreferred-stack-boundary=2
CFLAGS +=
-I$(KINCLUDE) -Idrivers/usb
# Setup link flags
LDFLAGS =
--strip-debug -r
# Setup the list of files to be included in a distribution
DIST_FILES = CHANGELOG \
README \
Makefile \
drivers/usb/Config.in \
drivers/usb/spcadecoder.c \
drivers/usb/spcadecoder.h \
drivers/usb/spcagamma.h \
drivers/usb/spcaCompat.h \
drivers/usb/spcausb.h \
drivers/usb/spca500_init.h \
drivers/usb/spca501_init.h \
drivers/usb/sp5xxfw2.dat \
drivers/usb/sp5xxfw2.h \
drivers/usb/spca505_init.h \
drivers/usb/spca506.h \
drivers/usb/spca508_init.h \
drivers/usb/spca561.h \
drivers/usb/sonix.h \
drivers/usb/cs2102.h \
drivers/usb/hv7131b.h \
drivers/usb/icm105a.h \
drivers/usb/hv7131c.h \
drivers/usb/hdcs2020.h \
drivers/usb/pb0330.h \
drivers/usb/tas5130c.h \
drivers/usb/zc3xx.h\
drivers/usb/tv8532.h\
drivers/usb/cxlib.h\
drivers/usb/sn9cxxx.h\