Arm-Linux摄像头驱动程序的移植

发布者:SparklingSun最新更新时间:2016-08-13 来源: eefocus关键字:Arm-Linux  摄像头驱动 手机看文章 扫描二维码
随时随地手机看文章
        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\
      drivers/usb/cx11646.h\
      drivers/usb/pac207.h\
      drivers/usb/spca5xx.c \
             drivers/usb/spca5xx.h

OBJS       = drivers/usb/spcadecoder.o \
             drivers/usb/spca5xx.o

BINARY     = spca5xx.o

###
# Targets follow here

binary: $(OBJS)
 @echo Linking $(BINARY)
 @$(LD) $(LDFLAGS) -o $(BINARY) $(OBJS)

install: binary
 @echo Installing.. Your root password may be required.
 su -c "make install-root"

install-root:
 @echo Installing..
 @mkdir -p /lib/modules/`uname -r`/kernel/drivers/usb
 @rm -f /lib/modules/`uname -r`/kernel/drivers/usb/spca50x.o
 @rm -f /lib/modules/`uname -r`/kernel/drivers/usb/et61x.o
 @cp spca5xx.o /lib/modules/`uname -r`/kernel/drivers/usb/spca5xx.o
 @/sbin/depmod

dist: clean binary
 @echo Making distributable archives
 @rm -f spca5xx-src-$(VERSION).tar.gz
 @tar zcf spca5xx-src-$(VERSION).tar.gz $(DIST_FILES)
 @rm -f spca5xx-module-$(VERSION).tar.gz
 @cp $(BINARY) spca5xx-$(VERSION).o
 @tar zcf spca5xx-module-$(VERSION).tar.gz spca5xx-$(VERSION).o README
 @rm spca5xx-$(VERSION).o

.c.o: Makefile $*.c
 @echo Compiling $*.c
 @$(CC) $(CFLAGS) $(WARNINGS) $(DEFINES) -c $*.c -o $*.o

###
# Dependencies follow here

drivers/usb/spca5xx.o: drivers/usb/spca5xx.h \
         drivers/usb/spcaCompat.h \
         drivers/usb/spcausb.h \
         drivers/usb/sonix.h \
                       drivers/usb/spca500_init.h \
                       drivers/usb/spca501_init.h \
         drivers/usb/sp5xxfw2.h \
                       drivers/usb/spca505_init.h \
         drivers/usb/spca506.h \
                       drivers/usb/spca508_init.h \
         drivers/usb/spca561.h \
         drivers/usb/zc3xx.h\
         drivers/usb/tv8532.h\
         drivers/usb/cx11646.h\
         drivers/usb/mr97311.h\
         drivers/usb/sn9cxxx.h\
         drivers/usb/pac207.h\
                      

drivers/usb/spcadecoder.o: drivers/usb/spcadecoder.h \
      drivers/usb/spcagamma.h \
                         

endif  # End kernel version test


############################################################################## 
# OTHER TARGETS 
##############################################################################
clean:
 rm -r -f drivers/usb/*.o drivers/usb/.spcadecoder.o.cmd \
 drivers/usb/.spca5xx.o.cmd  *.o *.ko *.mod.* .[a-z]* core *.i
 
##############################################################################

关于修改Makefile文件做几点说明:1Makefile文件针对不同内核回编译成不同的目标文件,该Makefile前部分是针对2.6的内核,后部分针对2.4的内核,用户根据自己的内核进行修改,我修改的是2.6.9的内核,关于2.4.x是表示2.4的某个版本,只是一个代号,用户自己根据实际修改。2修改的东西,主要有两个,一是gcc变成arm-linux-gcc;二是内核路径,注意这是交叉编译环境的内核路径,即arm-linux的内核路径,非pc上linux系统的内核。3 在Makefile文件修改之后,如果你的arm-linux从未编译,需要先编译内核,然后在make。MODULE_INSTALLDIR 这个是你编译生成的模块放在哪个路径,可以不用改,当然为了方便,最好改成你想要的文件夹下,文件夹权限要改成可读写的。

第三步: make

              编译成功后,会在模块MODULE_INSTALLDIR 路径生成spca5xx.ko,spca5xx.o等目标文件。

第四步:将你的目标文件spca5xx.ko(2.6内核)或者spca5xx.o(2.4内核)挂载到arm开发板上

第五步:在开发板上进入挂载的文件夹下 insmod spca5xx.ko

第六步: 插上摄像头,测试摄像头

                不出意外情况下,在/dev/下会有video0设备符,或者是/dev/v4l/video0

第七步: cat /dev/video0 > a.jpg 看看是否有文件a.jpg

按 ctrl+C 退出,将a.jpg拷贝到pc linux下通过gqview软件进行查看,也可以编一个图像采集小程序,抓取一帧保存成文件,然后到pclinux下进行查看。gqview软件下得麻烦,我是写了个小程序,将jpg文件保存下来,到pc linux

下直接看的,很方便。

当然,也有意外,摄像头驱动加载之后,不能使用摄像头,下一篇文章将会介绍一个特殊情况。我也是被这个问题卡了一两天,问了一个技术达人才解决的。前面过程网上很多,我是将过程再细化一些,供初学者参考,共同进步。     

关键字:Arm-Linux  摄像头驱动 引用地址:Arm-Linux摄像头驱动程序的移植

上一篇:LPC1752 掉电模式的理解
下一篇:ARM如何读写Flash

推荐阅读最新更新时间:2024-03-16 15:04

基于ARM-LINUX平台的物联网服务器设计
  基于XSCALE PXA270处理器平台和开源Linux系统搭建ARM-Linux物联网服务器。使用51单片机连接温湿度传感模块、LED灯等外围设备,使用基于XSCALE PXA270处理器的Up-Tech嵌入式实验箱为核心服务器运行平台。首先介绍了嵌入式设备的ARM-Linux系统搭建、守护程序和CGI程序之间的通信设计,然后详细介绍了Web服务器的搭建和网络程序设计所使用的iQuery类库和AJAX技术的设计实现。   物联网是互联网应用的扩展,是一种新兴的联网技术,其核心是物与物之间的信息通信交流,也是物与人之间的交互控制。物联网技术,主要是利用各种传感器设备,例如:无线技术、射频识别(RFID)技术,各类传感器等技术设备
[单片机]
基于<font color='red'>ARM-LINUX</font>平台的物联网服务器设计
arm-linux之为开发板写上电自启动程序之方法
开发环境 开发板:AM335 虚拟机:ubuntu 14.04 编译器:gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf 开发板内核:linux 4.4.12 首先开发板的文件使用的是systemd 并没有/etc/rc.local文件 所以要想修改rc.local这一简单的操作已经不存在 但是也是可以用systemd和initd两种方式解决这个问题 1.systemd 我这里是修改自带的service root@am335x-evm:/etc/rc5.d# ls /lib/systemd/system/rc-local.service /lib/systemd/sy
[单片机]
嵌入式浏览器Konqueror/E的实现
1 Konqueror/E概述     随着网络科技的进步,因特网与无线网络的融合将成为必然趋势。要在嵌入式设备上访问因特网,浏览器是必不可少的。目前,嵌入式浏览器已经逐渐成为高端手机和PDA的标准配置。嵌入式浏览器的另一大作用就是在网页中利用CGI(CommonGateway Interface:公用网关接口)来调用其他可执行程序。这样控制页面可以做的很美观,而且可扩展性好。     现在已经面市的嵌入式浏览器大多市商业版本的,如Opera、MS Explorer等。而Konqueror/embedded是符合GNU条款的自由软件。Konqueror/embedded是针对嵌入式Linux,由著名的桌面操作环境KDE下的浏览器
[嵌入式]
ARM-Linux s3c2440 之UART分析(三)
回顾一下上文,s3c2440串口底层驱动围绕三个数据结构展开: UART特定的驱动程序结构定义:struct uart_driver s3c24xx_uart_drv; UART端口结构定义: struct uart_port s3c24xx_serial_ops; UART相关操作函数结构定义: struct uart_ops s3c24xx_serial_ops; 实现了这三个数据结构体,基本完成了驱动操作函数的实现,紧接着需要对串口设备及设备驱动进行初始化,首先是模块初始化module_init(s3c24xx_serial_modinit): static int __inits3c24xx_serial
[单片机]
在ubuntu8.10 下建立 ARM-Linux 交叉编译环境
很久都没有写文章了 ,经过了将近半年的奔波,终于可以写点东西了!在广州工作时 ,同事极力推荐我用ubuntu,使用之后的确很爽,并决定以后在ubuntu下工作,完全可以抛弃windows(晕到死)。决定开始 移植Linux到mini2440。首先就是在ubuntu下建立交叉编译工具链。借着在Fedora 下建立ARM-Linux的交叉编译工具的经验,按理说应该是不会有问题的,但是结果是比在Fedora下碰到的问题多得多了。以下先介绍成功编译的过 程,碰到的问题和解决办法后面说。 这次编译过程中对我有重大帮助的资料有: 《 编译Mysql时configure: error: No curses/termcap library fou
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved