linux arm下硬件驱动程序放哪里,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

下直接看的,很方便。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux一级常用目录,小蚂蚁学习Linux(3)——Linux一级目录说明和常用命令解释...

根目录下的一级目录解释说明:/etc 配置文件目录 /home 普通用户家目录/bin 命令保存目录 /lib 系统库保存目录/boot 启动目录,启动相关文件 /mnt 系统挂载目录/dev 设备文件保存目录 /media…

linux一键打包工具,常见压缩与打包工具

第二周作业1、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。2、bash的工作特性之命令执行状态返回值和命令行展开所涉及的内容及其示例演示。3、请使用命令行展开功能来完成以下练习:(1)、创建/tmp目录下的:a_c, a_d,…

Linux+c+线程的属性,C ++中的多线程

多线程是多任务的一种特殊形式,多任务是一种功能,它使您的计算机可以同时运行两个或多个程序。通常,多任务有两种类型:基于进程和基于线程。基于进程的多任务处理程序的并发执行。基于线程的多任务处理并发执行同一程序的各个部分…

linux shell 除法运算符,Linux shell 基本运算符详解

shell 支持多种运算符1.算数运算符2.关系运算符3.布尔运算符4.字符串运算符5.文件测试运算符原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。expr 是一款表达式计算工具,使用它能完成表…

linux下如何为redis配置path,linux环境下如何启动redis

启动redisredis可执行文件说明:redis-server:redis服务器redis-cli:redis命令行客户端redis-benchmark:redis性能测试工具redis-check-aof:aof文件修复工具redis-check-dump:rdb文件检查工具1、直接启动直接…

linux从别的主机下载,从局域网内的其他Linux主机下载文件

Step 0本机与目标机都需要安装有openssh-server在本机与目标机上以root用户身份执行service ssh status # Debian上是ssh,openSUSE上是sshd,可以在键入ssh后紧接着按一下Tab键以自动补全该服务名# 或service --status-all | grep ssh # 通用可查看ssh服务…

linux runqueue定义,linux – 了解rt_rq(实时runqueue)内核中数据成员的使用

以下是v3.5.4中的实时运行队列结构struct rt_rq {struct rt_prio_array active;unsigned int rt_nr_running;#if defined CONFIG_SMP || defined CONFIG_RT_GROUP_SCHEDstruct {int curr; /* highest queued rt task prio */#ifdef CONFIG_SMPint next; /* next highest */#end…

Linux7安装gi报错,Redhat 7.6安装11G RAC GI时遇到此类报错

环境:Redhat Linux 7.6 Oracle 11.2.0.4 RAC现象:图像化安装过程中,按照提示执行root.sh脚本,报错中断。1. 具体现象[rootmm1903 ~]# /u01/app/11.2.0/grid/root.shPerforming rootuser operation forOracle 11gThe following en…

c语言修改字符串c2133,通过create_string_buffer、create_unicode_buffer让C语言具备修改字符串的能力...

字符串的修改我们知道C中不存在字符串这个概念,python中的字符串在C中也是通过字符数组来实现的。我们说在C中创建一个字符数组有两种方式:char *s1 "hello world";char s2[] "hello world";这两种方式虽然打印的结果是一样的&…

c语言中O空字符,OC语言中字符串的使用

可变字符串//插入字符串NSMutableString*string1 [NSMutableStringstringWithString:"字符串"];[string1insertString:"可变"atIndex:0];//在string的第0个位置插入NSLog("string %",string1);//可变字符串//删除字符串NSMutableString*string2…

大二c语言期末考试题库及详解答案,大学C语言期末考试练习题(带详解答案)...

《大学C语言期末考试练习题(带详解答案)》由会员分享,可在线阅读,更多相关《大学C语言期末考试练习题(带详解答案)(55页珍藏版)》请在金锄头文库上搜索。1、一、 单项选择题1( A )是构成C语言程序的基本单位。A、函数 B、过程 C、子程序 D、子例程2C语言…

C语言指针怎么存二维数组,C语言怎么用指针代替二维数组

1.设p是指向二维数组a[m][n]的指针变量,则有:int*pa[0];//此时P是指向一维数组的指针。P后,p指向a[0][1]。2.如果定义int(*p1)[n];p1a;p1后,p1指向a[1][0];则pj将指向a[0]数组中的元素a[0][j]。由于a[0]、a[1]┅a[M-1]等各个行数组…

c语言结构引用6,C语言6结构体练习题6

第六章 结构体1.下面对结构变量的叙述中错误的是A.相同类型的结构变量间可以相互赋值 B.通过结构变量,可以任意引用它的成员 C.结构变量中某个成员与这个成员类型相同的简单变量间可相互赋值D.结构变量与简…

设 l í {a,b,c}* 是满足下述条件的符号串构成的语言,编译原理模拟试题1和2的答案...

一、是非题1、算符优先关系表不一定存在对应的优先函数。( 错)2、数组元素的地址计算与数组的存储方式有关。( 错)3、仅考虑一个基本块,不能确定一个赋值是否真是无用的。( 正确)4、每个文法都能改写为LL(1)文法。( 正确)。5、对于数据空间的存贮分配,FO…

新手学习c语言的方法,学习C语言方法“新手必看”

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼1、多看代码在有一定基础以后一定要多看别人的代码。 注意代码中的算法和数据结构。 毕竟学C之后的关口就是算法和数据结构。提到数据结构,指针是其中重要的一环,绝大多数的数据结构是建立在指针…

android自定义进度条百分比跟着走,Android自定义View实现水平带数字百分比进度条...

这个进度条可以反映真实进度,并且完成百分比的文字时随着进度增加而移动的,所在位置也恰好是真实完成的百分比位置,效果如下:思路如下:第一部分是左侧的蓝色直线,代表已经完成的进度;第二部分是…

android动画view上移,在Android开发中使用View制作一个引导动画

在Android开发中使用View制作一个引导动画发布时间:2020-11-20 16:46:16来源:亿速云阅读:98作者:Leah这篇文章将为大家详细讲解有关在Android开发中使用View制作一个引导动画,文章内容质量较高,因此小编分享…

linux 启动 x,(1)linux启动过程

head.S是linux启动后的第一个文件,主要完成以下功能:1、检查处理器信息,并保存;2、检查平台号,并保存;3、创建页表,并开启MMU功能;4、对内核data section、bbs section作调整和初始化…

android 刷新view位置,Android View刷新机制实例分析

本文实例讲述了Android View刷新机制。分享给大家供大家参考,具体如下:一、总体说明在Android的布局体系中,父View负责刷新、布局显示子View;而当子View需要刷新时,则是通知父View来完成。二、代码分析1).ViewGroup的a…

android 滚动到底部,Android 控制ScrollView滚动到底部(示例代码)

在开发中,我们经常需要更新列表,并将列表拉倒最底部,比如发表微博,聊天界面等等,这里有两种办法,第一种,使用scrollTo():public static void scrollToBottom(final View scroll, final View inner) {Handler mHandler …