嵌入式Linux下CMOS摄像头驱动的设计与实现
无锡市一中-福利院工作总结
・68・
工业仪表与自动化装置2010年第3期
嵌入式Linux下CMOS
摄像头
驱动的设计与实现
樊围栋1,石红瑞1,张健2
(1.东华大学信息科学与技术
学院,上海201620;
2.泰安市华能城市燃气工程设计有限公司,山东泰安271000)
摘要:为增强系统稳定性,基于“nux操作系统的摄像头驱动,需综合考虑内核模块的调用和
任务的
优先级。该文介绍了基于ARM9架构,采用CMOS图像传感器OV9650,在Linux操作系统
下摄像头驱动的设计与实现。使用12C总线配置摄像头控制寄存器,引入信号量机制,优化临界资
源调
度,编写及完善应用程序接口(API),实现了多任务多线程处理。测试结果表明:多个进程同
时运行
时,驱动程序具有良好的稳定性,能够自动根据优先级,有序地完成图像采集工作。
关键词:嵌入式Li
nu)【;驱动;CMOS摄像头;信号量;12C
中图分类号:TP368.1文献标志码:A文章编
号:1000一0682(2010)03—0068—03
Desi2n
and
im
plementation
of
CT讧oS
camera
driver
FAN
b嬲ed
on
embedded
Linux
(1.coZ妇
兽o,,咖丌M渤n
S出碱口,ld‰^,咖,D0,动∞踟娩巧妇,踟咖i
201620,m
打m;
Guodon91,SHI
Hon昏1lil,ZHANG
Ji锄2
2
.死缸n胁岫憎,lg
Abstract:Aiminga£obtainjng
C妙伽s蛳町
脱,S^锄dD昭%i帆271000,醌f№)
on
high
scability,
camem
d打Ver
based
on“nux
operatjngsyst
em
should
ARM9
stlllcture,the
cameradr
iverforCMOSim・consider
kemel
modulecallandta
sk
priorit)r.Based
age
sensor
0V9650w蹈desigIled
and
implemented
in“nu)【enVi
mnment.Meanwhile,by
employing
12C
bus
coIlfigures
camera
registe璐and
introducin
g
the
semaphore
method,the
critical
resource
alloc砒ion
wouldcouldbe
optimize
d.Thmugh
tlle
design
and
impmVement
of叩plication
program
interf如e(API),it
re
aJize
multi—taskandmulti—threaded.Test
indic
ates
that,when
several
processes
mn
thecameradriver
could
keep
in
high
stability
by
complishimage
collectionin<
br>a
simultaneously,
ac-
judging
thepriority
automatically.Further,it
could
cenainorder.
Key
words:embedded
Linux;dr
iver;CMOS
c锄eIa;semaphore;Iz
C
O
引言
嵌入式图像处理的应用范围日益广泛,作为图
承上启下的作用。
嵌入式Linux操作系统下
的摄像头驱动需要考
虑并发控制、任务的优先级以及中断处理等问
题旧J,还应该为上层的应用
程序开发完善、友好的
API(应用程序接口)。
该文采用OmniVision公司的OV9
650图像传感
器,编写了基于嵌入式“nux的摄像头驱动程序,所
用“nux内核版本为2
.6.25。首先描述系统硬件结
像采集的基础,摄像头驱动的性能显得尤为重要。
设备驱动程
序是处理和操作硬件控制器的软件,是
内核中具有最高优先级且能驻留内存的底层硬件处
理程序
¨J。操作系统通过驱动程序完成对摄像头
的控制,建立应用程序和摄像头之间的抽象接口,屏
蔽底层细节,简化图像处理程序的编写过程,起到了
收稿日期:2009一10一10
作者简介
:樊国栋(1984),男,硕士研究生,从事嵌入式图像处
理研究。
构,接着概述驱动程序处
理流程,详细说明每一模块
的实现方法,最后调用应用程序验证驱动的整体性
能,并对结果进行
分析。
万方数据
2010年第3期
工业仪表与自动化装置
・6
9・
1系统硬件构成
以ARM9处理器为核心,构成图像采集系统。
图像采集系统的硬
件结构如图l所示。
雨丌网
ARM920T
摄像头
FLASH
处理器
串口
寨磊磊薷
OV9650
图l系统硬件结构图
1)处理器:三星公
司S3C2440,基于ARM920T
内核,主频400
MHz;
2)摄像头:Om
niVision公司OV9650,属于
CMOS图像传感器,130万像素,20引脚封装口’;<
br>3)其他:内存使用64
MB的sDRAM,外部存储
使用64MB的FLAsH,显示
屏采用3.5寸LCD,分
辨率320×240。
2软件设计
2.1驱动程序工作流程
摄像头属于字符类设备,它能够像字节流一样
被访问,且只能够顺序读写。CMOS摄像头驱动
程
序的处理流程如图2所示。
图2摄像头驱动程序的处理流程
在“nux2.6.25
/drivers/media/video目录下建
万方数据
立OV9650.c、CAME
RAIF.c和SCCB.c三个源文
件。Ov9650是主程序,负责设备初始化、与内核的
通信;cAMERAIF.c管理摄像头寄存器的配置;sc—
CB.c用于12C数据传送。
2.2分配设备位号
Linux内核通过设备位号来寻找摄像头【4J。在
分配位号之前,首先
发送测试信号到地址0x9650,
检测摄像头是否存在。验证通过后,调用alloc—
ch
rdev—region()函数完成对位号的动态分配。动态
分配方式的扩展性较好,出错的可能性低
。
所分配的设备位号存放在变量dev中,这是一
个32位数,低12位表示主设备号,用MA
JOR(dev)
表示;其余20位表示次设备号,用MINoR(dev)表
示。
2
.3并发控制
如果有多个进程同时访问处理器、内存等硬件
资源,就会出现竞争资源状态,驱动
程序必须考虑对
共享资源的并发控制。
针对oV9650的驱动程序采用信号量机制来实
现并发控制。信号量(Sem印hores)是整形数值,和
一对称为P操作和V操作的函数联合使用
∞J。信
号量大于0时表示资源可用,反之代表资源正在被
其他进程使用。
在“nu】
【2.6内核中,包含有信号量操作的相关
函数,在驱动代码中添加头文件<asn∥sem印hore
.h
>。同时。定义互斥体:
DECLARE—MUTEX(o、9650一sem);
DECLARE—MUTEX—LOCKED(ov9650—sem)
其中o、,9650一sem
是摄像头驱动所使用信号量。
当摄像头驱动调用硬件资源时,首先查询信号量状
态,若o、,9
650—sem≤0,表明资源被占用,进入等待状
态,并反复查询信号量值;当ov9650-sem
>0时,驱动
进程成功捕获硬件资源,同时调用P操作把ov9650一
sem数值减l,摄像
头开始工作,此时其他进程处于等
待状态;图像采集完毕后,驱动调用V操作把ov9650.
sem数值加1,激活其他等待中的进程。
OV9650有多组寄存器,这些寄存器决定了图
像
输出的编码方式、分辨率等参数。12c(Inter
Inte.
grated
Cir
cuit)是指内部整合电路,是常用的串行接
口标准。通过12C总线对寄存器整体配置,不占用系统数据总线,ARM与摄像头之间的DATA[0]~
DATA[7]通道仅用来传输图像数据,
提高了效率
(见图1)。
2.4配置摄像头寄存器
・70・
工
业仪表与自动化装置
2010年第3期
在完成摄像头初始化后,每一次12c总线传输
都由ARM处理器产生一个起始信号,同步串行传
输数据,摄像头每接收成功一个字节都回应一个确认信号,反复调用12c读函数和写函数,直到配置完
毕。12c传送程序位于文件sccB.c中
。
ARM与摄像头寄存器的12c通信如图3所示
(Rp为上拉电阻)。
Vdd
Rp
RD
SDA
l
I
I
SCL
图3ARM与摄像
头寄存器的12c通信
寄存器配置程序位于文件CAMERAIF.c中。
为适应开发板分辨率
,采用QVGA显示模式(320×
240),刷新速率是30fps,图像文件格式为YUV。
为保存为位图文件格式(BMP),需要把YUV
转化为RGB格式Mj,对矩阵中像素点逐个转换。
转
换公式是:
G=Y一0.19U一0.53V:
R=Y+V:
B=Y+U<
br>2.5应用程序接口API
“nu)(2.6内核提供了用于编写API的文件操作
结构
:file-operations,用来存储内核模块提供的对设
备进行各种操作的函数指针,添加头
文件<linux/
fs.h>即可调用。定义ov9650一叩s为6le一叩erations结构,编写用于上层程序调用的操作函数:
stmct
file_operationso
、,9650_ops=
{
open:ov9650-open,
release:<
br>ov9650一release。
read:
o、,9650—陀ad,
wri
te:
o、,9650_’耐te,
ioctl:
o、,9650-ioctl.};
驱动程序提供5个操作,open用来打开设备文
件,release用来释放文件结
构,read负责读取内存
区,埘te负责写内存区,iocd提供摄像头操作命令。
ov96
50一叩s实现了驱动程序与应用函数的无缝
连接,完成了应用程序接口API的基本职能。
定
义驱动程序的人口函数和出口函数:
module—init(ov9650_init);
m
odule-exit(o、r9650-exit);
在启动驱动程序时,系统首先调用module
_init
万方数据
()函数,对摄像头进行初始化等工作,然后等待进
一步命令。应
用程序使用结束后,系统调用module
—exit()函数退出。
2.6
内核编译
为使得内核能够识别新增摄像头驱动,修改
“nu)【2.6.25/幽vers/media
/video目录下的Kco曲g、
Mak曲le文件,添加新增驱动信息,同时把驱动设置
为
<M>类型,表示属于可加载型驱动。
摄像头驱动采用模块加载方式,调试时可避免
重新编译内
核。编译源文件,生成3个加载模块:
V9650.ko、CAMERAIF.ko和SCCB.ko,
通过串口复
制到开发板。系统采用NandFl船h方式启动。
3性能测试
打开超级终
端,调用insmod命令加载3个ko
模块,必须按照CAMERAIF.ko、SCCB.ko、V
9650.ko
的顺序,否则系统会报错。
运行测试程序camem_test,可以看到摄像
头首
先检测摄像头ID,配置寄存器,然后开始采集数据。
在超级终端可以观察到驱动程序的工
作过程,如图
4所示。
【广oot@E_bedded,bin】特./ca_era—te吝
t
devicena—e一一>s3c2‘‘0一ca_if
devicetaDe一一>1<
br>chdnnels一一>9
■a×width一一>0
■axheith一一>0
■inwidth一一>毒8
一inhei
th一一>32
get
thev
ideo
o”erlay_indo-success!
setthe■indowsucce
ss!
get
picture
properties
success!
set
the
pictureproperties
success!
oD
en
video
success!
open
BMPlsuccess!
getb—pfo广一 ̄,ideo
10K】
IrooteE-bedded/binl嚣s
zi-agel.b.Ip
图4超级终端下的图像采集过程
采集结束后,在驱动程序所在目录下
生成名为
“imagel.bmp”的图像文件,分辨率为320×240,同
时LCD显示实
时图像。
运行结束后调用mmod命令卸载驱动模块。
为检验并发运行的效果,在系统同时运行
多个
进程时,调用图像采集的测试程序。发现测试程序
运行缓慢,但依然有进度,在其他进程逐
步释放资源
后,采集程序正常运行,直到采集顺利结束,说明了
驱动程序的稳定性。
4
结束语
该文的驱动程序以ARM9作为内核,设计了在
(下转第94页)
・94・
工业仪表与自动化装置
000
2010年第3期
观测噪声方差取为
O.0l,仿真时间为2
000~1400
s,在l
置方法,可以有效地检测并隔离出
一个惯性测量单
元出现故障的情况。该方法理论清晰、实现简单,较
大地提高了无人机导航系统
中惯性测量单元工作的
可靠性。具备一定的参考价值。
参考文献:
[1]袁信,郑鄂.
捷联惯导系统[M].
s,陀螺z:,发生故障,观测噪声方差变为
O。l,仿真结果如图2所
示。
北京:航空工业出版社,枷B.
[2]
周自耘.陀螺仪漂移测试基础[M].北京:国防工业出版社。1988.
[3]
奇偶方程一计算结果
0.6
●
●
于波,陈云香,郭秀中.惯性技术
[M].北京:北京航空航天大学出
版社。199
4.
O.4
。
O.2
I
●●
_
O
l
1
O
200400600800
峨
椰
120
址
1
40160
。
[4]卢迪,姚郁,贺风华.一种抗野
值的Kalm锄滤波器[J].系
统仿真
学报,2004,16(5):1027—1029.
.
[5]熊凯,张洪钺.
基于局部方法的
余度惯性组件故障诊断[J】.北京
n2
100180
200
奇偶方程二计算结果
航空航天大学学报,2006,32(7):
783—787.<
br>0.1
O
-0.1
.o.2
[6]郭秀中.惯导系统陀螺仪理论[M]
.
北京:国防工业出版社,1996.
.+-..一-—+—-—●——●一-—}—+——卜
—+—+-—卜・+-+-+—+・
_013
.0.4
-0.5
(上接第70
页)
Knux2.6版本下CMOS摄像头驱
O
200
400
600
800
loo
120
140
160
l∞200
动。
经测试表明驱动具有良好的稳
定性,能够完成图像的采集工作,为
应用程序提供了便捷、高效的
图像
编程接口。
参考文献:
[1]JonatIl粕cod)et.uNux设备驱动
程序[M].北京:中国电力出版社,
2006.
奇偶方程三计算结果
[2]
0.4
李亚峰,欧文盛.ARM嵌人式kn呱
系统开发从入门到精通[M].北
京:清华大学出版社,2007:llO.
O.2
0
[3]
C锄国chip
ImpIemen谢∞
Guide[EB].http://ww.ovt.c嘲/
OV965
0
suppo—/datasheet.php,6..o.2
.0.4
[4]K柚m
YagIl瑚哪.构建嵌入式uNux
O
200400600800100
1
20
140
160
180200
奇偶方程五计算结果
系统[M].北
京:中国电力出版社,
姗4:1鼹一l∞.
[5]汤子瀛,哲凤屏,汤小丹.计算机操
作系统[M].西安:西安电子科技
大学出版社,200l:4l一42.
[6]潘永之,李玉
和,刘东岳.跨平台BMP图像处理程序的
实现[J].计算机工程与应用,2007(14):85.
000~
图2奇偶方程计算结果
奇偶方程计算结果如图2所示:在l
1400
s中,K。、岛、畅不为零,墨、恐近似为零。可
知陀螺z:,发生故障。应对其采取隔离措施
并以其
他陀螺输出的解析来替代其输出。
仿真结果表明:利用这种惯性测量单元余度配
万方数据
嵌入式Linux下CMOS摄像头驱动的设计与实现
作者:
作者单位:
刊名:
英文刊名:
年,卷(期):
被引用次数:
樊国栋,
石红瑞, 张健, FAN Guodong, SHI Hongrui, ZHANG
Jian
樊国栋,石红瑞,FAN Guodong,SHI
Hongrui(东华大学,信息科学与技术学院,上海,201620)
, 张健,ZHANG Ji
an(泰安市华能城市燃气工程设计有限公司,山东,泰安,271000)
工业仪表与自动化装置INDUSTRIAL INSTRUMENTATION &
AUTOMATION
2010(3)
2次
参考文献(6条)
1.潘永之;李玉和;刘东岳
跨平台BMP图像处理程序的实现[期刊论文]
-
计算机工程与应用
2007(14)
2.汤子瀛;哲凤屏;汤小丹
计算机操作系统 2001
Yaghmour
构建嵌入式LINUX系统 2004
9650
CameraChip Implementation Guide
5.李亚峰;欧文盛
ARM嵌入式Linux系统开发从入门到精通 2007
an Corbet
LINUX设备驱动程序 2006
本文读者也读过(3条)
1.
宋丽华.高珂.SONG Ke
嵌入式Linux下USB摄像头驱动实现[期刊
论文]-计算机工程2010,36(9)
2.
王新敬.向训清.龙亚春.周正.WANG Zheng
OMAP平台下嵌入
式
Linux系统摄像头驱动设计与实现[期刊论文]-北京电子科技学院学报2006,14(2)<
br>3.
何亚军.邓飞其.HE Fei-qi
嵌入式Linux中
I2C总线驱动程序设计[期刊论文]-计算机工程与设计
2008,29(10)
引证文献(2条)
1.吴晓东.何广进.王晓燕
道路交通安全执法现场取证系统设计研究[期刊论文]
-
中国公共安全(学术版)
2011(2)
2.苏缨墩.钟汉如
嵌入式Linux中的Nand
Flash驱动详解[期刊论文]
-
工业仪表与自动化装置 2011(4)
本文链接:http:odical_