" L$ S, u5 d
1. Camera拍照相关概念 # r& y. L5 L6 p0 z7 o
1.1 ISP + y! d/ P8 t2 K- d3 l
* @5 ^- d' \, G4 D' n! h) T
isp——(Image Signal Processor)——影视处理 & J' D9 G" I$ X, c
& P7 A0 u; [ S; U4 z8 N8 K4 d6 C5 L
无论数码相机、摄像机或者摄像手机,其影像数据从前端感应后,皆须经过ASP(Analog Signal Processing)、ADC(Analog-Digital Converter)、前期影像处理(Pre-ISP)与后端影像处理(Post-ISP)四个阶段后,影像数据才能最终呈现于终端设备上
$ Z4 B& c! I, t5 s' v5 } l4 X( W' l* n
1.2 720p $ g9 v( U+ L8 R" U( X! L' b3 K
720P是美国电影电视工程师协会(SMPTE)制定的高等级高清数字电视的格式标准,有效显示格式为:1280×720.SMPTE(美国电影电视工程协会)将数字高清信号数字电视扫描线的不同分为1080P、1080I、720P(i是interlace,隔行的意思,p是Progressive,逐行的意思)。720P是一种在逐行扫描下达到1280×720的分辨率的显示格式。是数字电影成像技术和计算机技术的融合。
分辨率为1280×720p/60Hz,行频为45kHz
?% O: e. l6 v
2. MTK6577Camera控制器部分 / ~$ I# Y: w" ?7 i
2.1 camera控制器概述
MT6577 camera可接受RAM和SOC传感器处理之后的图像数据(sensor image data),并输出YUV数据给MDP(什么的简称)。Camera控制器可同时连接2个并行SOC传感器,它提供像素缺陷补偿(bad pixel compensation)、去马赛克(demosaic)、边缘曾强(edge enhancement)、标准色自适应(preference color adaptation)、空间和暂时噪声消除(spatial and temporal noise reduction)这些特征,用于图像处理。
6 i' y9 |& j( j% a
2.2 camera特征
/ j/ P$ \3 L" p
MT6577内部集成的ISP,包含了一个功能强大的图像信号处理器,用于连接各种各样的图像传感器模组,这个处理器由时序产生单元(timing generated unit: TG)、镜头/传感器补偿(lens/sensor compensation)单元和图像处理单元。 * m+ b' j# w- S% T5 E3 w7 o/ f
7 b/ n. C1 S9 [9 K
支持的特征如下: 9 N7 z$ E# o8 i; c
(1) 抓图分辨率达8M像素(image capture resolution)。
(2) 录像分辨率达720p(video recording resolution)。 9 H4 ]# u1 ]1 {5 H& k
(3) 原始图像数据转储帧率8M@15(raw dump frame rate)。 % ?. k6 a2 g8 N' d% [+ c7 L
(4) 曝光抓图率8M@7(burst capture rate)。
(5) 图像处理 1 f1 D. v; e+ ^, K
低像素补偿(poor pix compensation)、镜头阴影补偿(lens shading compensation)、去马赛克(demosaic)、色彩削波(color clipping)、局部对比度增强(local contrast enhancement)、伽玛校正(gamma correction)、边缘曾强(edge enhancement)、噪声消除(noise reduction)、标准色自适应(preference color adaptation)、空间和暂时噪声消除(spatial and temporal noise reduction)。
3 |, l' d+ `* ^' R
(6) 3A统计和校正(statistics and correction)
(7) 闪烁检测(flicker detection)。
2.3 camera框图 - N3 F- s7 j6 N' D( _' @( s
+ }5 v* I X9 j! |. Y1 H* K( ]
1 i0 J/ s' f6 Q7 \4 t+ U0 B
在Bayer原始数据输入模式,镜头/传感器补偿(lens/sensor compensation)单元产生补偿的原始数据给色彩处理单元(color process unit);在YUV422/RGB565 输入模式,这步被忽略。 $ s9 ^2 C% m1 ^: p, o
% ]' C7 E( V7 Y# T
色彩处理单元接受来之镜头/传感器补偿(lens/sensor compensation)单元产生补偿的原始数据或是YUV422/RGB565数据。ISP的输出的是很容易被压缩引擎(compress engine,JPEG编码器和MPEG4编码器)编码的YCbCr888数据格式,它是其他数据格式转化的基本数据域(比如R/G/B domain)(it can be the basic data domain of otherdata format translation such as the R/G/B domain)。ISP是流水线式(pipelined),在处理阶段ISP硬件能够为后面的AE/AF/AWB计算提取有意义的信息,这些信息被临时保存在ISP寄存器或是内存中,并且能够被MCU读取出来。
下面给出一些性能参数:
' x8 `6 _/ s/ j5 V v- G
3. 原理图设计 ; d7 x: j6 F! D, n" `0 I
( Y- G8 [: a- u0 W5 L0 V/ B2 [
MT6577支持两路camera接口,一路是MIPI接口,一路是并行接口,这里我们采用的是并行接口,下面给出MT6577 CAM并行接口定义: [3 w# m3 k; ]3 V; H- \
8 d2 S# b% {7 i2 D" z
5 U- }! R# `/ t. V
6 W$ ~ w8 u+ F8 t8 b1 J
(1) OV5640输出的数据格式 4 z( `: Q# l2 V) ^! N" y9 U
《Y1MT6577 design notice V0.1.pdf》文档给出这样的说明: 4 ^. u7 R' | Z7 B* R! f+ d
Sensor outputformat is RAM8/YUV/JPEG,connect sensor output to CMDAT[0:7] or CMDAT[2:9] ' n- l2 J/ p1 d% y! h; M/ v O5 ^! X3 B
Sensor outputformat is RAM10,connect sensor output to CMDAT[0:9]
而我们采用摄像头模组的驱动IC为OV5640(500万像素: active array size: 2592 x 1944) Sensor :outputformats: 8-/10-bit RGB RAW output,这是由OV5640寄存器0x4745决定的。原则就是:首先看硬件上采用的是8根数据线还是10根数据线,然后初始化参数-也就是寄存器设定也可以设定是8位或10位。如下图:
' s) s' H- Q* I5 {6 T" B4 F
+ p8 x+ I& Y4 ^; H1 K) ?0 b5 G
(2) OV5640IIC地址
) ?! [& a2 G6 w! K
IIC 8bit写地址为0x78,读地址为0x79,查询Sensor规格书可以看到:
$ K" X' m) V6 G; g
4. 驱动实现 9 c- A2 _- e( v- Z
4.1 相关代码
(1) CameraSensor驱动相关文件 9 _6 M, V0 K3 `% F! G) n* {$ W V
\mediatek\custom\common\kernel\imgsensor\ov5642_yuv
(2) SensorID和一些枚举类型的定义
\mediatek\custom\common\kernel\imgsensor\inc
kd_imgsensor.h---------SensorID
kd_imgsensor_define.h--------------一些枚举类型的定义 3 e# y5 @2 `0 i' E+ z& ]( Y5 X/ ]1 i
(3) Sensor供电
\mediatek\custom\common\kernel\camera\camera 4 F$ k: E. a+ j; i1 @9 Y: J
kd_camera_hw.c和kd_camera_hw.h
(4) KernelSpace的SensorList,imgsensor模块注册 2 M3 f, h2 I" r4 q4 I
\mediatek\custom\common\kernel\imgsensor\src
kd_sensorlist.c和kd_sensorlist.h-----------camera模块加载 4 ?7 Q3 k9 {7 e! k' e/ ^
8 V8 N* j5 j1 b1 }, I Q" R9 {+ ]
(5) UserSpace的SensorList,向用户空间提供支持的SensorList , g$ ~: y' T4 h6 {$ S
\mediatek\custom\common\hal\imgsensor\src\sensorlist.cpp
提供给用户空间的SensorList
(6) Sensor效果调整的接口 ; c) m- i: I% ]2 b) o2 f8 n1 L
\mediatek\custom\common\hal\imgsensor\ov5642_yuv 2 J4 ^# ^/ T. ~, b2 o: H
- M& ?" [8 R% [; }4 m" t9 c( w6 i
: X6 }$ a: G2 p; L# o
4.2 针对OV5640的修改 * ^" |8 K5 q" E9 n2 ?6 X @1 v8 P3 c
4.2.1 mediatek\config\hsimobile77_ics2\ProjectConfig.mk ! g' d) C7 i3 I5 Q' p. r9 y- O
) u ]' o- y e3 q/ @7 g5 _, Y
CUSTOM_KERNEL_IMGSENSOR=mt9p017_rawgc0329_yuv & X, W7 J! C q7 `8 {3 M$ @# ], a
mt9p017_raw表示后置摄像头(也就是主摄像头),mt9p017是摄像头sensor驱动IC,raw是sensor一种输出的数据格式,是CCD或CMOS在将光信号转换为电信号时的电平高低的原始记录,单纯地没有将没有进行任何处理的图像数据,即摄像元件直接得到的电信号进行数字化处理而得到的。 6 K [ G" L [8 O
gc0329_yuv是前置摄像头,yuvsensor一种输出的数据格式,支持YUV/RGB格式的模组,一般会带有ISP(image single processor),经过A/D转换过的原始数据经过ISP处理生成YUV标准格式传到BB。
我们采用的OV5640就带有ISP,输出YUV格式
(1) 把mt9p017_raw 改为ov5640_yuv,去掉gc0329_yuv因为我们的产品没有后置摄像头 3 s# p% \/ `3 w
(2) 去掉类似CUSTOM_KERNEL_LENS后面的dummy_lens因为没有后置摄像头
修改之后的HAL层的配置: & s j l; B7 {; D# {( W
5 `$ V* p& a. p5 q* M0 S: A
[html] view plaincopy

* K$ \ H9 A% l5 U
4 `% ]- ^+ _& `" o9 G9 V1 V
修改之后的kernel层的配置:
[html] view plaincopy

* W2 `3 [0 ^% r/ g+ G
4 t& ~0 {7 f* h' S
/ p! I" j9 `& O& f* l% F3 G
虽然我们没有后置摄像头,但不能去掉dummy_lens,我尝试过去掉之后用./mk r dr编译会提示下面的错误: % A* _4 y- J7 n6 q
* S$ ^& g. l1 F" ?
[plain] view plaincopy
3 b: s, q( s! y0 E, \
% D6 N1 t0 S6 [7 u0 }
" H& B" Z% K4 M2 i' P& R
4.2.2 mediatek\custom\common\kernel\imgsensor----------kernel层
(1) 创建ov5640_yuv并建立需要的文件
创建文件夹ov5640_yuv,把sensor IC厂家提供的ov5640yuv_Sensor.c放到此目录下。另外拷贝ov5642yuv_Sensor.h、ov5642yuv_Camera_Sensor_para.h、ov5642yuv_CameraCustomized.h拷贝过来改为ov5640yuv_Sensor.h等。
编译发现mediatek\custom\common\kernel\imgsensor\ov5640_yuv\ov5640yuv_Sensor.c文件用到的OV5640_FULL_PERIOD_PIXEL_NUMS_HTS、OV5640_FULL_PERIOD_LINE_NUMS_VTS、OV5640_PV_PERIOD_PIXEL_NUMS_HTS和OV5640_PV_PERIOD_LINE_NUMS_VTS没有定义,但ov5642yuv_Sensor.c是没有这几个宏定义,我暂时定义如下: : I/ w/ ^: y1 ?
[cpp] view plaincopy

( d/ V, p# T3 b c' f7 S2 b+ Z
^; e" Q/ l' Y c/ x
这是参考ov5642的相关定义来定义的。 8 D0 L" b7 d( f8 M6 F
( P+ W8 Y. z- [, a% `
(2) 在支持的sensor列表中增加目标sensor 5 E& G% u+ w! U) i
* |5 ]* e# V+ {; k1 Y: a7 K& |. D
mediatek\custom\common\kernel\imgsensor\src\kd_sensorlist.h
在数组增加OV5640的内容,如下:
[cpp] view plaincopy
: ?9 [' ^5 ?4 d& u0 S/ C3 T
" s" t1 O/ k# k. R7 U9 X
也增加UINT32 OV5640_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT*pfFunc); ( K8 H9 {/ N8 c5 \! D& r
mediatek\custom\common\kernel\imgsensor\inc\kd_imgsensor.h 5 Y% k# S+ w Q) K. z7 J$ Z
$ L, C- @. h/ E" F G- V
(3) 增加sensor ID和字符串的定义 # s+ o7 _8 M& \& q9 f
[cpp] view plaincopy

! r, {4 d3 H. D B
4.2.3 mediatek\custom\common\hal\imgsensor---------------HAL层 8 N# g! N2 a1 R& I! w6 `# l
(1) 创建ov5640_yuv文件夹
但这些文件夹下该有哪些文件,有需要哪些内容了,首先我对比了 2 p2 X8 Z8 q8 j- @
ov3640_yuv和ov5642_yuv文件夹,只有cfg_ftbl_ov5642_yuv.h有差别:
这里主要是不同驱动IC支持的分辨率不同,以及设置默认的分辨率。
此文件下有两个这样的地方不同,这里是指自动对焦模式。 8 A) C7 r! J* d7 G, F9 G0 S
% S' y# A( T; V6 h: Y, J
因为我们的OV5640和OV5642非常接近,所以就直接把OV5642的目录复制过来修改为OV5640即可。 9 I- s, _, `: b0 ^/ _/ J
/ i; m" a3 A3 Y$ b4 O' [' b
所以把mediatek\custom\common\kernel\imgsensor\ov5642_yuv拷贝到imgsensor目录下,改为ov5640_yuv * v7 h ?$ n2 F' f" I% l9 [5 p, A
(2) 在支持的sensor列表中增加目标sensor
\src\ sensorlist.cpp
[cpp] view plaincopy

A# _ g2 B& S- y: x. c* M% Z/ s
) v/ i* N* @# i8 p* T; a; d5 _! a
; B: j0 ?5 d3 G; `+ [) H
注意:在 kd_SensorList.h 和 SensorList.cpp 里面添加驱动的时候要注意,Sensor 添加的位置要一样。否则驱动会跑乱,轻则 ISP 参数不对,重则 Sensor 无法启动。 1 i% v% I' H1 X; d
2 o3 F! j! [) V5 F) q
" o X' b) n) E d6 f5 r. r
4.3 拍照图片尺寸设置 % F1 W# }$ p) B. K5 [6 H
( q5 E: m3 | `5 V" j% s
mediatek\custom\common\hal\imgsensor\ov5640_yuv\cfg_ftbl_ov5640_yuv.h
0 m& ^# h, Q# |1 M, ~ M0 e
[cpp] view plaincopy

- g. `4 W- l {9 G. T
4.4 Camera物理角度旋转 " T! I$ N$ W* H
Cfg_setting_imgsensor.h 0 N% f! I% O6 b F7 _
[cpp] view plaincopy

6 F7 J* H8 U7 m& y" E
这几种都试过了,但都不行,预览和实际的都是成某种镜像关系。这是平台是提供旋转的功能。这个配置好了之后,如果方向不正确,可以通过驱动中的方向调整函数进行调整,如下: static void XXXXXSetMirror(kal_uint16ImageMirror)
参考:http://blog.csdn.net/loongembedded/article/details/41679977 1 U1 t& m3 @4 B' N% Y
9 V3 T% n1 B: k3 M5 H. N2 H( \
看了OV5640的数据手册,寄存器0x3820和0x3821是用于控制图像发射(mirror)和翻转(flip)的,在u4Degree_0=270情况下,OV5640YUVPreview()调用OV5640YUV_Set_Mirror_Flip (IMAGE_V_MIRROR),预览和拍照后的预览都是OK,但拍好的照片在电脑上打开的时候发现是顺时针翻转了90度。
http://bbs.csdn.net/topics/390837150 ( y$ y6 C3 \7 L- s" r
U0 L5 ^6 S, Q
可是我在OV5640YUV_Sensor_Init()调用OV5640YUV_Set_Mirror_Flip(IMAGE_V_MIRROR)却问题依旧,很奇怪。 ) m/ `& S6 t- e2 R$ m
# ~& U3 z% o( m9 S7 S
mediatek\custom\common\hal\imgsensor\ov5640_yuv\cfg_ftbl_ov5640_yuv.h
% f- O4 a, p& A# Q( I
[cpp] view plaincopy

* n J2 _9 q8 R5 R8 f
) N) N! o2 S$ G8 m2 Y% ?1 Z
7 j$ O" m$ B% {/ _/ m* z& a1 h
2 D8 Q8 C: l& F8 b" ` U# H
我试过做上面的修改,但打开摄像头的时候,提示”Unfortunately, Camera has stopped” 3 m- \) W( b8 `+ s1 L7 C) B
9 X" C, W x% d" @7 j. z! j1 j
% i/ y1 K/ e3 i9 e7 u! J
参考链接: ! p! g, h+ o+ Q8 }2 }% z; ~
MTKAndroid Driver:camera
http://blog.csdn.net/cbk861110/article/details/17437283
) C/ g, h2 k9 f3 @$ ~
MTK cameraimage sensor driver
http://blog.csdn.net/sunweizhong1024/article/details/8497790
8 D2 U: Q1 x h* o+ R% @
MTK平台的ISP架构问题
http://bbs.52rd.com/forum.php?mod=viewthread&tid=272727 2 M/ ^7 `2 @% Y/ G8 l+ z
- Q8 z+ l9 u2 U2 h! o; e
OV5640 YUV的自动对焦功能为何没有开启 ; s* Z6 K# y. W' x6 }( n
http://www.16rd.com/thread-10480-1-1.html " J7 h5 R" x# Z& \: P7 f
7 J! `$ ]/ d) N3 ~% q6 A
MTK Android Driver知识大全 # B! _. n# x4 }8 ^7 B; I
http://blog.csdn.net/cbk861110/article/details/40931835
mtk camera移植步骤
http://blog.csdn.net/vasvas/article/details/39250473 ! L1 ~) R/ c' O N7 N0 v
6 l8 m8 J' U7 Z+ p9 u% B9 l' h4 y
关于 前置摄像头安装0度或者180度
http://blog.csdn.net/kkkvvv123/article/details/8809823
Camera 涉及的文件70 8 Y# o: F% L; y0 y7 ^- K
http://3y.uu456.com/bp-6dq1aascss2707221q2ef7es-1.html
OV5640全景模式预览倒180度,拍照正常的问题
http://blog.csdn.net/guoguo295/article/details/21245815
7 O/ ` z x, N6 i
& V* |2 h3 h* j3 W1 s
MTK6577+Android之Camera驱动
! I& i w$ \ G; F5 V- H N& n
图1
1. Camera拍照相关概念 # r& y. L5 L6 p0 z7 o
1.1 ISP + y! d/ P8 t2 K- d3 l
* @5 ^- d' \, G4 D' n! h) T
isp——(Image Signal Processor)——影视处理 & J' D9 G" I$ X, c
& P7 A0 u; [ S; U4 z8 N8 K4 d6 C5 L
无论数码相机、摄像机或者摄像手机,其影像数据从前端感应后,皆须经过ASP(Analog Signal Processing)、ADC(Analog-Digital Converter)、前期影像处理(Pre-ISP)与后端影像处理(Post-ISP)四个阶段后,影像数据才能最终呈现于终端设备上
$ Z4 B& c! I, t5 s' v5 } l4 X( W' l* n
1.2 720p $ g9 v( U+ L8 R" U( X! L' b3 K
720P是美国电影电视工程师协会(SMPTE)制定的高等级高清数字电视的格式标准,有效显示格式为:1280×720.SMPTE(美国电影电视工程协会)将数字高清信号数字电视扫描线的不同分为1080P、1080I、720P(i是interlace,隔行的意思,p是Progressive,逐行的意思)。720P是一种在逐行扫描下达到1280×720的分辨率的显示格式。是数字电影成像技术和计算机技术的融合。
分辨率为1280×720p/60Hz,行频为45kHz
?% O: e. l6 v
2. MTK6577Camera控制器部分 / ~$ I# Y: w" ?7 i
2.1 camera控制器概述
MT6577 camera可接受RAM和SOC传感器处理之后的图像数据(sensor image data),并输出YUV数据给MDP(什么的简称)。Camera控制器可同时连接2个并行SOC传感器,它提供像素缺陷补偿(bad pixel compensation)、去马赛克(demosaic)、边缘曾强(edge enhancement)、标准色自适应(preference color adaptation)、空间和暂时噪声消除(spatial and temporal noise reduction)这些特征,用于图像处理。
6 i' y9 |& j( j% a
2.2 camera特征
/ j/ P$ \3 L" p
MT6577内部集成的ISP,包含了一个功能强大的图像信号处理器,用于连接各种各样的图像传感器模组,这个处理器由时序产生单元(timing generated unit: TG)、镜头/传感器补偿(lens/sensor compensation)单元和图像处理单元。 * m+ b' j# w- S% T5 E3 w7 o/ f
7 b/ n. C1 S9 [9 K
支持的特征如下: 9 N7 z$ E# o8 i; c
(1) 抓图分辨率达8M像素(image capture resolution)。
(2) 录像分辨率达720p(video recording resolution)。 9 H4 ]# u1 ]1 {5 H& k
(3) 原始图像数据转储帧率8M@15(raw dump frame rate)。 % ?. k6 a2 g8 N' d% [+ c7 L
(4) 曝光抓图率8M@7(burst capture rate)。
(5) 图像处理 1 f1 D. v; e+ ^, K
低像素补偿(poor pix compensation)、镜头阴影补偿(lens shading compensation)、去马赛克(demosaic)、色彩削波(color clipping)、局部对比度增强(local contrast enhancement)、伽玛校正(gamma correction)、边缘曾强(edge enhancement)、噪声消除(noise reduction)、标准色自适应(preference color adaptation)、空间和暂时噪声消除(spatial and temporal noise reduction)。
3 |, l' d+ `* ^' R
(6) 3A统计和校正(statistics and correction)
(7) 闪烁检测(flicker detection)。
2.3 camera框图 - N3 F- s7 j6 N' D( _' @( s
图2
TG只配合主图像传感器(master type image sensor),也就是说主图像传感器应发送垂直和水平信号给TG。TG通过内部自动同步 (internal auto synchronization)或外部像素时钟同步来提供传感器所需要的数据时钟和接收传感器Bayer模式原始数据(Bayer pattern raw data)。TG的主要目的是为主图像传感器创建数据时钟和接收垂直/水平同步信号与sensor数据,然后产生Bayer数据的捕获区域(grabbed area of Bayer data)或是YUV422/RGB565数据给镜头/传感器补偿(lens/sensor compensation)单元。
在Bayer原始数据输入模式,镜头/传感器补偿(lens/sensor compensation)单元产生补偿的原始数据给色彩处理单元(color process unit);在YUV422/RGB565 输入模式,这步被忽略。 $ s9 ^2 C% m1 ^: p, o
% ]' C7 E( V7 Y# T
色彩处理单元接受来之镜头/传感器补偿(lens/sensor compensation)单元产生补偿的原始数据或是YUV422/RGB565数据。ISP的输出的是很容易被压缩引擎(compress engine,JPEG编码器和MPEG4编码器)编码的YCbCr888数据格式,它是其他数据格式转化的基本数据域(比如R/G/B domain)(it can be the basic data domain of otherdata format translation such as the R/G/B domain)。ISP是流水线式(pipelined),在处理阶段ISP硬件能够为后面的AE/AF/AWB计算提取有意义的信息,这些信息被临时保存在ISP寄存器或是内存中,并且能够被MCU读取出来。
下面给出一些性能参数:
图3
: i5 L4 M7 \' ]2 [9 W6 m" J4 }
3. 原理图设计 ; d7 x: j6 F! D, n" `0 I
( Y- G8 [: a- u0 W5 L0 V/ B2 [
MT6577支持两路camera接口,一路是MIPI接口,一路是并行接口,这里我们采用的是并行接口,下面给出MT6577 CAM并行接口定义: [3 w# m3 k; ]3 V; H- \
图4
Camera sensor连接座如下:
图5
(1) OV5640输出的数据格式 4 z( `: Q# l2 V) ^! N" y9 U
《Y1MT6577 design notice V0.1.pdf》文档给出这样的说明: 4 ^. u7 R' | Z7 B* R! f+ d
Sensor outputformat is RAM8/YUV/JPEG,connect sensor output to CMDAT[0:7] or CMDAT[2:9] ' n- l2 J/ p1 d% y! h; M/ v O5 ^! X3 B
Sensor outputformat is RAM10,connect sensor output to CMDAT[0:9]
而我们采用摄像头模组的驱动IC为OV5640(500万像素: active array size: 2592 x 1944) Sensor :outputformats: 8-/10-bit RGB RAW output,这是由OV5640寄存器0x4745决定的。原则就是:首先看硬件上采用的是8根数据线还是10根数据线,然后初始化参数-也就是寄存器设定也可以设定是8位或10位。如下图:
图6
+ p8 x+ I& Y4 ^; H1 K) ?0 b5 G
(2) OV5640IIC地址
) ?! [& a2 G6 w! K
IIC 8bit写地址为0x78,读地址为0x79,查询Sensor规格书可以看到:
图7
IIC 8bit地址最后一位为0时是写地址,为1时是读地址。这属于IIC通讯规则
$ K" X' m) V6 G; g
4. 驱动实现 9 c- A2 _- e( v- Z
4.1 相关代码
(1) CameraSensor驱动相关文件 9 _6 M, V0 K3 `% F! G) n* {$ W V
\mediatek\custom\common\kernel\imgsensor\ov5642_yuv
(2) SensorID和一些枚举类型的定义
\mediatek\custom\common\kernel\imgsensor\inc
kd_imgsensor.h---------SensorID
kd_imgsensor_define.h--------------一些枚举类型的定义 3 e# y5 @2 `0 i' E+ z& ]( Y5 X/ ]1 i
(3) Sensor供电
\mediatek\custom\common\kernel\camera\camera 4 F$ k: E. a+ j; i1 @9 Y: J
kd_camera_hw.c和kd_camera_hw.h
(4) KernelSpace的SensorList,imgsensor模块注册 2 M3 f, h2 I" r4 q4 I
\mediatek\custom\common\kernel\imgsensor\src
kd_sensorlist.c和kd_sensorlist.h-----------camera模块加载 4 ?7 Q3 k9 {7 e! k' e/ ^
8 V8 N* j5 j1 b1 }, I Q" R9 {+ ]
(5) UserSpace的SensorList,向用户空间提供支持的SensorList , g$ ~: y' T4 h6 {$ S
\mediatek\custom\common\hal\imgsensor\src\sensorlist.cpp
提供给用户空间的SensorList
(6) Sensor效果调整的接口 ; c) m- i: I% ]2 b) o2 f8 n1 L
\mediatek\custom\common\hal\imgsensor\ov5642_yuv 2 J4 ^# ^/ T. ~, b2 o: H
- M& ?" [8 R% [; }4 m" t9 c( w6 i
: X6 }$ a: G2 p; L# o
4.2 针对OV5640的修改 * ^" |8 K5 q" E9 n2 ?6 X @1 v8 P3 c
4.2.1 mediatek\config\hsimobile77_ics2\ProjectConfig.mk ! g' d) C7 i3 I5 Q' p. r9 y- O
) u ]' o- y e3 q/ @7 g5 _, Y
CUSTOM_KERNEL_IMGSENSOR=mt9p017_rawgc0329_yuv & X, W7 J! C q7 `8 {3 M$ @# ], a
mt9p017_raw表示后置摄像头(也就是主摄像头),mt9p017是摄像头sensor驱动IC,raw是sensor一种输出的数据格式,是CCD或CMOS在将光信号转换为电信号时的电平高低的原始记录,单纯地没有将没有进行任何处理的图像数据,即摄像元件直接得到的电信号进行数字化处理而得到的。 6 K [ G" L [8 O
gc0329_yuv是前置摄像头,yuvsensor一种输出的数据格式,支持YUV/RGB格式的模组,一般会带有ISP(image single processor),经过A/D转换过的原始数据经过ISP处理生成YUV标准格式传到BB。
我们采用的OV5640就带有ISP,输出YUV格式
(1) 把mt9p017_raw 改为ov5640_yuv,去掉gc0329_yuv因为我们的产品没有后置摄像头 3 s# p% \/ `3 w
(2) 去掉类似CUSTOM_KERNEL_LENS后面的dummy_lens因为没有后置摄像头
修改之后的HAL层的配置: & s j l; B7 {; D# {( W
5 `$ V* p& a. p5 q* M0 S: A
[html] view plaincopy

* K$ \ H9 A% l5 U
- CUSTOM_HAL_IMGSENSOR=ov5640_yuv
- CUSTOM_HAL_LENS=fm50afdummy_lens
- CUSTOM_HAL_MAIN_BACKUP_IMGSENSOR=
- CUSTOM_HAL_MAIN_BACKUP_LENS=
- CUSTOM_HAL_MAIN_IMGSENSOR=ov5640_yuv
- CUSTOM_HAL_MAIN_LENS=fm50af
- CUSTOM_HAL_MATV=
- CUSTOM_HAL_MSENSORLIB=mmc328xakm8975 ami304 yamaha530 mag3110 akmd8963
- CUSTOM_HAL_SENSORS=sensor
- CUSTOM_HAL_SUB_BACKUP_IMGSENSOR=
- CUSTOM_HAL_SUB_BACKUP_LENS=
- CUSTOM_HAL_SUB_IMGSENSOR=
- CUSTOM_HAL_SUB_LENS=dummy_lens ; M/ M* R/ A# j- ? F
4 `% ]- ^+ _& `" o9 G9 V1 V
修改之后的kernel层的配置:
[html] view plaincopy

* W2 `3 [0 ^% r/ g+ G
4 t& ~0 {7 f* h' S
- CUSTOM_KERNEL_IMGSENSOR=ov5640_yuv
- CUSTOM_KERNEL_JOGBALL=
- CUSTOM_KERNEL_KPD=kpd
- CUSTOM_KERNEL_LCM=ili9806e
- CUSTOM_KERNEL_LEDS=mt65xx
- CUSTOM_KERNEL_LENS=fm50afdummy_lens
- CUSTOM_KERNEL_MAGNETOMETER=akm8975
- CUSTOM_KERNEL_MAIN_BACKUP_IMGSENSOR=
- CUSTOM_KERNEL_MAIN_BACKUP_LENS=
- CUSTOM_KERNEL_MAIN_IMGSENSOR=ov5640_yuv
- CUSTOM_KERNEL_MAIN_LENS=fm50af
- CUSTOM_KERNEL_MATV=
- CUSTOM_KERNEL_OFN=
- CUSTOM_KERNEL_RTC=rtc
- CUSTOM_KERNEL_SOUND=amp_6329pmic_2in1_spk
- CUSTOM_KERNEL_SUB_BACKUP_IMGSENSOR=
- CUSTOM_KERNEL_SUB_BACKUP_LENS=
- CUSTOM_KERNEL_SUB_IMGSENSOR=
- CUSTOM_KERNEL_SUB_LENS=dummy_lens 4 Y6 f& _. _$ A! V" Q m/ J2 [
/ p! I" j9 `& O& f* l% F3 G
虽然我们没有后置摄像头,但不能去掉dummy_lens,我尝试过去掉之后用./mk r dr编译会提示下面的错误: % A* _4 y- J7 n6 q
* S$ ^& g. l1 F" ?
[plain] view plaincopy

% D6 N1 t0 S6 [7 u0 }
- prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld:out/target/product/hsimobile77_ics2/obj/SHARED_LIBRARIES/libcameracustom_intermediates/common/hal/lens/lenslist.o:in function global constructors keyed tolenslist.cpp:mediatek/source/external/mhal/src/custom/common/hal/lens/lenslist.cpp:82:error: undefined reference to 'pDummy_getDefaultData'
- make[3]: ***[out/target/product/hsimobile77_ics2/obj/SHARED_LIBRARIES/libcameracustom_intermediates/LINKED/libcameracustom.so]Error 1 ' |! s( |2 f0 v- J
" H& B" Z% K4 M2 i' P& R
4.2.2 mediatek\custom\common\kernel\imgsensor----------kernel层
(1) 创建ov5640_yuv并建立需要的文件
创建文件夹ov5640_yuv,把sensor IC厂家提供的ov5640yuv_Sensor.c放到此目录下。另外拷贝ov5642yuv_Sensor.h、ov5642yuv_Camera_Sensor_para.h、ov5642yuv_CameraCustomized.h拷贝过来改为ov5640yuv_Sensor.h等。
编译发现mediatek\custom\common\kernel\imgsensor\ov5640_yuv\ov5640yuv_Sensor.c文件用到的OV5640_FULL_PERIOD_PIXEL_NUMS_HTS、OV5640_FULL_PERIOD_LINE_NUMS_VTS、OV5640_PV_PERIOD_PIXEL_NUMS_HTS和OV5640_PV_PERIOD_LINE_NUMS_VTS没有定义,但ov5642yuv_Sensor.c是没有这几个宏定义,我暂时定义如下: : I/ w/ ^: y1 ?
[cpp] view plaincopy

( d/ V, p# T3 b c' f7 S2 b+ Z
- //kandi add startat 2014.11.29
- #defineOV5640_FULL_PERIOD_PIXEL_NUMS_HTS OV5640_FULL_PERIOD_PIXEL_NUMS
- #define OV5640_FULL_PERIOD_LINE_NUMS_VTS OV5640_FULL_PERIOD_LINE_NUMS
- #defineOV5640_PV_PERIOD_PIXEL_NUMS_HTS OV5640_PV_PERIOD_PIXEL_NUMS
- #define OV5640_PV_PERIOD_LINE_NUMS_VTS OV5640_PV_PERIOD_LINE_NUMS
^; e" Q/ l' Y c/ x
这是参考ov5642的相关定义来定义的。 8 D0 L" b7 d( f8 M6 F
( P+ W8 Y. z- [, a% `
(2) 在支持的sensor列表中增加目标sensor 5 E& G% u+ w! U) i
* |5 ]* e# V+ {; k1 Y: a7 K& |. D
mediatek\custom\common\kernel\imgsensor\src\kd_sensorlist.h
在数组增加OV5640的内容,如下:
[cpp] view plaincopy

" s" t1 O/ k# k. R7 U9 X
- ACDK_KD_SENSOR_INIT_FUNCTION_STRUCTkdSensorList[MAX_NUM_OF_SUPPORT_SENSOR+1] =
- {
- ………….
- #if defined(OV5640_YUV)
- {OV5640_SENSOR_ID,SENSOR_DRVNAME_OV5640_YUV, OV5640_YUV_SensorInit},
- #endif
- …………….
- } : o7 E( F$ n$ [! N3 Q
也增加UINT32 OV5640_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT*pfFunc); ( K8 H9 {/ N8 c5 \! D& r
mediatek\custom\common\kernel\imgsensor\inc\kd_imgsensor.h 5 Y% k# S+ w Q) K. z7 J$ Z
$ L, C- @. h/ E" F G- V
(3) 增加sensor ID和字符串的定义 # s+ o7 _8 M& \& q9 f
[cpp] view plaincopy

- #defineOV5640_SENSOR_ID 0x5640
- #defineSENSOR_DRVNAME_OV5640_YUV "ov5640yuv" & N- M6 n h" M% \) K/ e
! r, {4 d3 H. D B
4.2.3 mediatek\custom\common\hal\imgsensor---------------HAL层 8 N# g! N2 a1 R& I! w6 `# l
(1) 创建ov5640_yuv文件夹
但这些文件夹下该有哪些文件,有需要哪些内容了,首先我对比了 2 p2 X8 Z8 q8 j- @
ov3640_yuv和ov5642_yuv文件夹,只有cfg_ftbl_ov5642_yuv.h有差别:
图8
" a$ h0 N& p& r9 r
这里主要是不同驱动IC支持的分辨率不同,以及设置默认的分辨率。
图9
此文件下有两个这样的地方不同,这里是指自动对焦模式。 8 A) C7 r! J* d7 G, F9 G0 S
% S' y# A( T; V6 h: Y, J
因为我们的OV5640和OV5642非常接近,所以就直接把OV5642的目录复制过来修改为OV5640即可。 9 I- s, _, `: b0 ^/ _/ J
/ i; m" a3 A3 Y$ b4 O' [' b
所以把mediatek\custom\common\kernel\imgsensor\ov5642_yuv拷贝到imgsensor目录下,改为ov5640_yuv * v7 h ?$ n2 F' f" I% l9 [5 p, A
(2) 在支持的sensor列表中增加目标sensor
\src\ sensorlist.cpp
[cpp] view plaincopy

A# _ g2 B& S- y: x. c* M% Z/ s
) v/ i* N* @# i8 p* T; a; d5 _! a
- MSDK_SENSOR_INIT_FUNCTION_STRUCTSensorList[] =
- {
- ………..
- #ifdefined(OV5640_YUV)
- YUV_INFO(OV5640_SENSOR_ID,SENSOR_DRVNAME_OV5640_YUV, NULL),
- #endif
- …………
- } / j* |9 _5 M5 D
; B: j0 ?5 d3 G; `+ [) H
注意:在 kd_SensorList.h 和 SensorList.cpp 里面添加驱动的时候要注意,Sensor 添加的位置要一样。否则驱动会跑乱,轻则 ISP 参数不对,重则 Sensor 无法启动。 1 i% v% I' H1 X; d
2 o3 F! j! [) V5 F) q
" o X' b) n) E d6 f5 r. r
4.3 拍照图片尺寸设置 % F1 W# }$ p) B. K5 [6 H
( q5 E: m3 | `5 V" j% s
mediatek\custom\common\hal\imgsensor\ov5640_yuv\cfg_ftbl_ov5640_yuv.h
0 m& ^# h, Q# |1 M, ~ M0 e
[cpp] view plaincopy

- g. `4 W- l {9 G. T
- // Capture Size
- CONFIG_FEATURE_SI(FID_CAP_SIZE,
- BY_DEFAULT(CAPTURE_SIZE_2560_1920),
- CAPTURE_SIZE_1280_960, CAPTURE_SIZE_1600_1200,
- CAPTURE_SIZE_2048_1536,CAPTURE_SIZE_2560_1920
- ) ( X7 ~# c+ U3 }! k5 D4 @) g. c
4.4 Camera物理角度旋转 " T! I$ N$ W* H
Cfg_setting_imgsensor.h 0 N% f! I% O6 b F7 _
[cpp] view plaincopy

- /*******************************************************************************
- * Image SensorOrientation
- *******************************************************************************/
- SensorOrientation_Tconst&
- getSensorOrientation()
- {
- static SensorOrientation_T const inst = {
- u4Degree_0 : 0,//270,//180,//90, // main sensor in degree (0, 90, 180, 270),kandi change from 90 to 180
- u4Degree_1 : 0, // sub sensor in degree (0, 90, 180, 270)
- };
- return inst;
- } / u( v& e1 X( H6 W& y* X
6 F7 J* H8 U7 m& y" E
这几种都试过了,但都不行,预览和实际的都是成某种镜像关系。这是平台是提供旋转的功能。这个配置好了之后,如果方向不正确,可以通过驱动中的方向调整函数进行调整,如下: static void XXXXXSetMirror(kal_uint16ImageMirror)
参考:http://blog.csdn.net/loongembedded/article/details/41679977 1 U1 t& m3 @4 B' N% Y
9 V3 T% n1 B: k3 M5 H. N2 H( \
看了OV5640的数据手册,寄存器0x3820和0x3821是用于控制图像发射(mirror)和翻转(flip)的,在u4Degree_0=270情况下,OV5640YUVPreview()调用OV5640YUV_Set_Mirror_Flip (IMAGE_V_MIRROR),预览和拍照后的预览都是OK,但拍好的照片在电脑上打开的时候发现是顺时针翻转了90度。
http://bbs.csdn.net/topics/390837150 ( y$ y6 C3 \7 L- s" r
U0 L5 ^6 S, Q
可是我在OV5640YUV_Sensor_Init()调用OV5640YUV_Set_Mirror_Flip(IMAGE_V_MIRROR)却问题依旧,很奇怪。 ) m/ `& S6 t- e2 R$ m
# ~& U3 z% o( m9 S7 S
mediatek\custom\common\hal\imgsensor\ov5640_yuv\cfg_ftbl_ov5640_yuv.h
% f- O4 a, p& A# Q( I
[cpp] view plaincopy

* n J2 _9 q8 R5 R8 f
- /*
- // Capture Size
- CONFIG_FEATURE_SI(FID_CAP_SIZE,
- BY_DEFAULT(CAPTURE_SIZE_2560_1920),
- CAPTURE_SIZE_1280_960, CAPTURE_SIZE_1600_1200,
- CAPTURE_SIZE_2048_1536,CAPTURE_SIZE_2560_1920
- )
- */
- // Capture Size
- CONFIG_FEATURE_SI(FID_CAP_SIZE,
- BY_DEFAULT(CAPTURE_SIZE_1920_2560),
- CAPTURE_SIZE_960_1280, CAPTURE_SIZE_1200_1600,
- CAPTURE_SIZE_1536_2048,CAPTURE_SIZE_1920_2560
- )
) N) N! o2 S$ G8 m2 Y% ?1 Z
7 j$ O" m$ B% {/ _/ m* z& a1 h
2 D8 Q8 C: l& F8 b" ` U# H
我试过做上面的修改,但打开摄像头的时候,提示”Unfortunately, Camera has stopped” 3 m- \) W( b8 `+ s1 L7 C) B
9 X" C, W x% d" @7 j. z! j1 j
% i/ y1 K/ e3 i9 e7 u! J
参考链接: ! p! g, h+ o+ Q8 }2 }% z; ~
MTKAndroid Driver:camera
http://blog.csdn.net/cbk861110/article/details/17437283
) C/ g, h2 k9 f3 @$ ~
MTK cameraimage sensor driver
http://blog.csdn.net/sunweizhong1024/article/details/8497790
8 D2 U: Q1 x h* o+ R% @
MTK平台的ISP架构问题
http://bbs.52rd.com/forum.php?mod=viewthread&tid=272727 2 M/ ^7 `2 @% Y/ G8 l+ z
- Q8 z+ l9 u2 U2 h! o; e
OV5640 YUV的自动对焦功能为何没有开启 ; s* Z6 K# y. W' x6 }( n
http://www.16rd.com/thread-10480-1-1.html " J7 h5 R" x# Z& \: P7 f
7 J! `$ ]/ d) N3 ~% q6 A
MTK Android Driver知识大全 # B! _. n# x4 }8 ^7 B; I
http://blog.csdn.net/cbk861110/article/details/40931835
mtk camera移植步骤
http://blog.csdn.net/vasvas/article/details/39250473 ! L1 ~) R/ c' O N7 N0 v
6 l8 m8 J' U7 Z+ p9 u% B9 l' h4 y
关于 前置摄像头安装0度或者180度
http://blog.csdn.net/kkkvvv123/article/details/8809823
Camera 涉及的文件70 8 Y# o: F% L; y0 y7 ^- K
http://3y.uu456.com/bp-6dq1aascss2707221q2ef7es-1.html
OV5640全景模式预览倒180度,拍照正常的问题
http://blog.csdn.net/guoguo295/article/details/21245815