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

下直接看的,很方便。

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

linux arm下硬件驱动程序放哪里,Arm-Linux摄像头驱动程序的移植相关推荐

  1. 61-20210407华为海思Hi3516DV300的linux系统下控制GPIO口(标准linux模式点亮LED灯)

    61-20210407华为海思Hi3516DV300的linux系统下控制GPIO口(标准linux模式点亮LED灯) 2021/4/7 15:13 https://xueqiu.com/797071 ...

  2. linux系统下的编程软件,四款​linux​操作系统总有一款适合你

    转为使用Linux可谓是开启了一扇新工具和新技术的大门,它使你对计算环境的体验更为轻松.但是根据你所选择的Linux操作系统的不同,有时你甚至是浏览桌面环境也可能会充满了挑战,因此在客观上还是多少存在 ...

  3. linux系统下安装教程_手机安装linux系统安装教程

    vm虚拟机的安装教程: . 这个是不行的,winxp只可安装在系统盘上的,win8可以安装在非系统盘上的 . Linux系统跟windows系统的安装不大一样,有不少需要注意的地方,以RedhatLi ...

  4. linux系统下Qt应用程序重启,嵌入式Linux重启QT应用程序的简单办法(基于QT4.8 qws)...

    嵌入式Linux重启QT应用程序的简单办法(基于QT4.8 qws) 应用软件一般都有这样的业务需求: 当有新版本的APP,则程序就需要执行更新,更新完毕后(所谓的更新大多就是以覆盖的方式),不需要关 ...

  5. linux sql server硬件要求,SQL Server On Linux(20)—— SQL Server On Linux性能(6)——针对性能的配置(Linux层面)...

    前面两篇大部分属于Windows和 Linux 平台公用,但是这一篇主要集中在Linux内核层面.因为本系列是Linux上的SQL Server(以2017.2019为主体)的介绍. 完整的列表可以查 ...

  6. 在linux系统下忘记了root密码,在linux系统下,忘记了root密码,可以到()模式下修改找回root密码()...

    在linux系统下,忘记了root密码,可以到()模式下修改找回root密码() 更多相关问题 某分部工程双代号网络图如下图所示,其作图错误表现为().A.有多个起点节点B.有多个终点节 鉴于资源有限 ...

  7. linux下的iic驱动程序,实战经验吐血推荐:怎样在Linux环境下轻松实现基于I2C总线的EEPROM驱动程序...

    4开发实例本文引用地址:http://www.eepw.com.cn/article/279351.htm Linux内核已经提供了I2C驱动中所需要的基本模块.i2c-core.i2c-dev和i2 ...

  8. LINUX应用修改硬件寄存器l,郝健: Linux内存管理学习笔记-第2节课【转】

    摘要 slab./proc/slabinfo和slabtop 用户空间malloc/free.内核空间kmalloc/kfee与Buddy的关系 mallopt vmalloc Linux为应用程序分 ...

  9. linux系统下的程序开发报告册,linux系统及应用应用开发实验报告册

    (5)利用man显示date,echo等命令的手册页: (6)显示系统中的进程信息. 三 .实验软件 VMWare Workstation 5.0: Red hat linux 9.0: 四.实验主要 ...

最新文章

  1. Zeppelin:用于区块链应用的开源安全智能合约架构
  2. 让你的spring-boot应用日志随心所欲--spring boot日志深入分析
  3. 用SHA1或MD5 算法加密数据(示例:对用户身份验证的简单实现)
  4. IdentityServer4直播
  5. encodingaeskey java,消息体签名与加解密-开发者QA
  6. mfc从文件中读取数据_Python 中的 bytes、str 以及 unicode 区别
  7. 老华为可以升级鸿蒙,真良心!五年前老机型都能升级华为鸿蒙
  8. 何使用BERT模型实现中文的文本分类
  9. 服务化改造实践(三) | Dubbo + Zipkin
  10. 360浏览器怎么关闭页面声音
  11. 线性代数 —— 线性递推关系
  12. linux CentOS 系统下如何将php和mysql命令加入到环境变量中
  13. 小白怎么入门自由职业?
  14. matlab遗传算法工具箱介绍和详细使用方法【matlab优化算法工具箱】
  15. 苹果输入法怎么换行_朋友圈长文字不折叠输入法,复制粘贴避免只显示一行
  16. 项目沟通管理和项目干系人管理
  17. 如何去痘痘最快方法简单
  18. uni-app 框架超详细新手入门
  19. 用一台电脑连接另一台电脑的虚拟机
  20. 未认证公众号如何跳转其他链接

热门文章

  1. Ext.grid.CheckboxSelectionModel状态设置
  2. HTML,,,音乐,html embed用法
  3. 关于shared_from_this的转换
  4. iphone6s发布会_iPhone 6S/SE升级iOS 13性能测试:App启动速度比iOS 12.4.1慢
  5. android自动生成cardview,学习使用Material Design控件(三)使用CardView实现卡片效果...
  6. oracle删除唯一索引sql语句_高级SQL之在选择语句中使用更新和删除
  7. db2 控制台执行创建函数语句_DB2数据库中创建定义函数
  8. 罗斯蒙特电磁流量计8723说明书_罗斯蒙特8732E电磁流量计对环境和温度的限制
  9. 谷歌浏览器78如何安装拓展程序
  10. centos6.5配置Hadoop环境,运行wordcount例子