|
|
MTK6577+Android之Camera驱动- f$ |& V$ L; f
/ h+ u3 u+ z" ~
+ {/ X$ u) R1 Z7 x$ I7 S$ ?MTK6577+Android之Camera驱动
, B% c$ D$ o4 ^+ k: z
1 }0 A( k& |' m9 g8 W6 ] T! o; d
9 t( U' p9 V* @: J; K, ]" j图1 % `" E3 m( {9 l. k& {" d: A9 i
1. Camera拍照相关概念
( g' A7 m- k# ]8 n" U; o% N1 P . f' Y( o3 [ D4 W4 l
1.1 ISP
/ K8 V: K) g/ F% D# ^' i- N T
/ Z* g0 Q) g o! D, n' Z' u" N0 |isp——(Image Signal Processor)——影视处理
9 u7 v: H4 Q' Y* B8 \ 7 Y3 o4 t6 ]1 ? Z$ X
无论数码相机、摄像机或者摄像手机,其影像数据从前端感应后,皆须经过ASP(Analog Signal Processing)、ADC(Analog-Digital Converter)、前期影像处理(Pre-ISP)与后端影像处理(Post-ISP)四个阶段后,影像数据才能最终呈现于终端设备上
: b# Q+ e) x, i# J0 m! B9 w * r& b$ b1 b3 _5 n/ S" ^: P
1.2 720p! @0 I& W& e6 J/ I. U0 X
720P是美国电影电视工程师协会(SMPTE)制定的高等级高清数字电视的格式标准,有效显示格式为:1280×720.SMPTE(美国电影电视工程协会)将数字高清信号数字电视扫描线的不同分为1080P、1080I、720P(i是interlace,隔行的意思,p是Progressive,逐行的意思)。720P是一种在逐行扫描下达到1280×720的分辨率的显示格式。是数字电影成像技术和计算机技术的融合。' H9 {- b) X1 I* M* x$ s
8 e- H; Z- w0 U
分辨率为1280×720p/60Hz,行频为45kHz% J7 `% o( `( Z# Q
4 b- r5 b9 T' q' }, A
" g' T& [) s$ r
2. MTK6577Camera控制器部分2 F; [5 }/ ]5 m* @
! R8 z; H% H" S" E2.1 camera控制器概述
' C2 a# F* M$ Z0 e4 ]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)这些特征,用于图像处理。
! y/ k: E5 O8 ^' k- F $ a- ^- y6 @7 f# x
2.2 camera特征
- m+ Y0 u1 m! b2 k
|3 i, e* i/ q# kMT6577内部集成的ISP,包含了一个功能强大的图像信号处理器,用于连接各种各样的图像传感器模组,这个处理器由时序产生单元(timing generated unit: TG)、镜头/传感器补偿(lens/sensor compensation)单元和图像处理单元。
- B1 X# Y9 k! B Y& L0 q 2 e9 E7 N5 z3 o
支持的特征如下:3 y7 j2 t7 ~% _8 ]' }$ `
(1) 抓图分辨率达8M像素(image capture resolution)。
. H1 v1 F$ M! x9 V+ m- Z$ ?, X- o5 ~(2) 录像分辨率达720p(video recording resolution)。
1 M, |! I- f, S, u" {' n0 K4 V(3) 原始图像数据转储帧率8M@15(raw dump frame rate)。4 |8 D+ ?3 [% [* P% F( v
(4) 曝光抓图率8M@7(burst capture rate)。: g! F2 L& z" R8 { l! G
(5) 图像处理 _+ n ]7 K$ b8 C9 }4 i
低像素补偿(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)。9 d8 j# z' i% n, x7 w/ y* ?) q
! F( X# Q N0 m7 W( {: H. n(6) 3A统计和校正(statistics and correction)2 f8 f+ Z. b/ r; v# [
(7) 闪烁检测(flicker detection)。
7 r. |$ P. }, \ - X, @. u% P6 v( v2 ^% {- X
2.3 camera框图! d6 \* J5 |' P# [! ?
. [! r: Z/ D8 R: i0 B
$ K2 E& p, Q3 v2 B
图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)单元。4 r! Z }' c1 P4 r7 ?) Z
% O- q! [5 z5 s4 ^" o
在Bayer原始数据输入模式,镜头/传感器补偿(lens/sensor compensation)单元产生补偿的原始数据给色彩处理单元(color process unit);在YUV422/RGB565 输入模式,这步被忽略。
+ M. v9 r$ w8 a' K1 e: t . x$ Y- a* ~; X" x/ o& _
色彩处理单元接受来之镜头/传感器补偿(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读取出来。2 }9 t0 M9 ?/ o* p: C7 Z6 f0 Z- L
5 J7 w4 R: Y: T9 i+ ]
下面给出一些性能参数:1 ]' R3 `- }; M5 ], j/ \" @6 f
& w% U2 _# ]6 h8 X
( B0 t; M2 q; @' {图3 p) y2 D% S: x
3. 原理图设计
/ s; ^8 ]5 F( e% i$ k4 a
! W' ~# O3 h6 E* a7 [MT6577支持两路camera接口,一路是MIPI接口,一路是并行接口,这里我们采用的是并行接口,下面给出MT6577 CAM并行接口定义:, _ M9 [3 r$ z! e' }4 P
8 M. s V4 ~) G5 Q% J; h
* H- U. s* S& Z. k5 V' g" h
图4 Camera sensor连接座如下:" c9 ], ]* b" \) \' j- Z
O3 N2 N' ?6 _) P$ ^% G k* E$ O- l' T% Y+ k2 ]
图5
' [! p$ y3 A6 B(1) OV5640输出的数据格式5 s: E2 M3 q, @* s, W; w# U$ v2 b
《Y1MT6577 design notice V0.1.pdf》文档给出这样的说明:
' I! p8 ~1 h3 `* k" k1 R2 A/ s! K0 ?& YSensor outputformat is RAM8/YUV/JPEG,connect sensor output to CMDAT[0:7] or CMDAT[2:9]
) S* ]# ? t# D2 j6 ]Sensor outputformat is RAM10,connect sensor output to CMDAT[0:9]( U0 X2 ?% Y- o' n4 ~- Y" Z7 f
而我们采用摄像头模组的驱动IC为OV5640(500万像素: active array size: 2592 x 1944) Sensor :outputformats: 8-/10-bit RGB RAW output,这是由OV5640寄存器0x4745决定的。原则就是:首先看硬件上采用的是8根数据线还是10根数据线,然后初始化参数-也就是寄存器设定也可以设定是8位或10位。如下图:
! d7 U7 s) X5 |+ _
0 z% [/ ~' B% a5 `
! \) \( _5 i2 A+ X图6
4 K# u2 h. Q( D' _! m . W7 L* O: D+ B) Y4 x2 h
(2) OV5640IIC地址
' _; l: ^4 q4 S# o$ U1 y" @0 w
$ q$ `0 n* v; M; ]# V* FIIC 8bit写地址为0x78,读地址为0x79,查询Sensor规格书可以看到:, x5 s& |, a( y" O
! i3 ~7 _! z' D 5 |7 p: A5 t/ o
图7 IIC 8bit地址最后一位为0时是写地址,为1时是读地址。这属于IIC通讯规则
?9 |; Q. v8 V5 ?+ g# P. w
p7 c8 K2 Q/ J T
% U2 i: b/ O4 w1 N3 A2 a4. 驱动实现
- h$ O# } s" H7 f + f3 m- }5 Y9 p3 |+ R1 z0 `3 Y* G) U
( u, E% G! _4 ?( Z
4.1 相关代码7 C9 e5 G& J# Y/ `! A. x# e
(1) CameraSensor驱动相关文件+ O9 c# p& o7 K* i) @
\mediatek\custom\common\kernel\imgsensor\ov5642_yuv
4 E/ y: g z8 S % p% l" \/ ?1 ^3 D2 o2 @( h: F Z1 \
(2) SensorID和一些枚举类型的定义9 U9 q' C' X2 ~& I) r/ \; z
\mediatek\custom\common\kernel\imgsensor\inc
" r. R) G8 \+ J I% C' ~2 T. gkd_imgsensor.h---------SensorID, d+ P( o* ]) K& R" o
kd_imgsensor_define.h--------------一些枚举类型的定义
$ R) e- I7 x9 _
9 n$ V4 ]$ C$ P(3) Sensor供电
7 h" U: o! F- e4 }: Y\mediatek\custom\common\kernel\camera\camera6 A7 q, @- [% F. X0 B
kd_camera_hw.c和kd_camera_hw.h a( ?& j' H7 o- y- y7 ]
. r+ M6 _! d: I l, v/ ?
(4) KernelSpace的SensorList,imgsensor模块注册
& T! y- h' C7 W\mediatek\custom\common\kernel\imgsensor\src* m' ?$ c: `2 k. h
kd_sensorlist.c和kd_sensorlist.h-----------camera模块加载) z2 k: R4 |0 o! U4 D
9 v( K3 }" \. o" h5 D6 S6 ]' ?
(5) UserSpace的SensorList,向用户空间提供支持的SensorList
& V# C3 l1 h8 }) E% v; h\mediatek\custom\common\hal\imgsensor\src\sensorlist.cpp5 d7 s3 s1 \1 Y/ e+ a) `4 f
提供给用户空间的SensorList7 l% C0 k3 T: v4 g/ R& [# g
2 h3 i( _! E6 w9 c; F* b : X- K5 E9 U' [6 \4 l) u( n5 C
(6) Sensor效果调整的接口 a- l" l& m4 A2 M
\mediatek\custom\common\hal\imgsensor\ov5642_yuv& t0 }0 b3 L* R) P" T
0 x6 D, s! f/ V) I8 p. m
, Z! f/ e) V% d9 _4.2 针对OV5640的修改
* Q! m7 q! u; q& K5 f- z: o# G7 g
0 n5 t8 L1 x4 w! ^' m4.2.1 mediatek\config\hsimobile77_ics2\ProjectConfig.mk
9 B% Z4 ^) a3 X5 F, k4 O) l & M: ?+ a& a) I5 H
CUSTOM_KERNEL_IMGSENSOR=mt9p017_rawgc0329_yuv
0 P: c" g+ J3 T. Nmt9p017_raw表示后置摄像头(也就是主摄像头),mt9p017是摄像头sensor驱动IC,raw是sensor一种输出的数据格式,是CCD或CMOS在将光信号转换为电信号时的电平高低的原始记录,单纯地没有将没有进行任何处理的图像数据,即摄像元件直接得到的电信号进行数字化处理而得到的。
. t5 ] z6 | C 3 t. E0 r& |3 o5 ~$ y+ q. O
gc0329_yuv是前置摄像头,yuvsensor一种输出的数据格式,支持YUV/RGB格式的模组,一般会带有ISP(image single processor),经过A/D转换过的原始数据经过ISP处理生成YUV标准格式传到BB。+ r$ Q1 j' `) W' G1 x) `
, B- A' R* s1 |2 Z! S我们采用的OV5640就带有ISP,输出YUV格式
' f- M4 s: l, _) O& ~) v
$ R- ]2 {, [6 d) V- x(1) 把mt9p017_raw 改为ov5640_yuv,去掉gc0329_yuv因为我们的产品没有后置摄像头
! x; r! Y% L6 |* ~2 K+ S(2) 去掉类似CUSTOM_KERNEL_LENS后面的dummy_lens因为没有后置摄像头
( n2 R/ H' }% ?6 q3 D4 Q3 N 0 I* A& U* k1 k! }1 j
修改之后的HAL层的配置:
8 i) A7 W9 M+ E: [1 S5 J) y9 L& C' \7 E+ ^! u# }# C+ b' G$ V) o
[html] view plaincopy + i! E9 J, V+ f; G6 U
+ Y) _# I) [" C% w. U- e# e+ h3 N! @: {2 I$ F
- 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
$ }0 n( U- D7 a
9 K3 m/ _6 q1 h2 X0 }1 x* \9 j. I5 G8 P* t. \7 m
: v7 n5 J3 A, o- [7 l修改之后的kernel层的配置:! j p& e& [/ }( x0 y5 `: P2 `
& I! x" K8 a& k( o( C5 \) f! p3 H, ]- l[html] view plaincopy 
9 ^6 N+ N8 U. S3 W6 `( a5 h3 M' i; ]5 z
( M7 H) T- S0 j ^. G! {- 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
: \2 }. p6 A( q4 x+ `
1 G% o/ m8 _9 @6 C6 f; E
: C u/ t: a5 h' p- B- O! g
5 w4 A1 w; W# l- `3 t
3 J( W+ \+ a' b- Q) k虽然我们没有后置摄像头,但不能去掉dummy_lens,我尝试过去掉之后用./mk r dr编译会提示下面的错误:
" W) e8 M9 L H f- u8 X* w
( w% Z3 {0 m S2 D[plain] view plaincopy + B* h* f- k$ d3 x
" q2 S9 u$ Y7 I
5 D, K9 B( E; Q- 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 & J# H+ h* i; c& [$ n/ {: q% t+ W2 ^
* t) y+ f1 [6 `$ ^7 b0 m
% }8 h2 f( z0 d# a+ M0 ]/ h2 ~ }- D N% ?% h
- R- @& i. F. j0 ?3 ~6 j: N- z. M
4.2.2 mediatek\custom\common\kernel\imgsensor----------kernel层
, n1 ~' j. G" ?. j6 W 4 ]. I( {( p' ~- p
(1) 创建ov5640_yuv并建立需要的文件. t6 ? s& E* ^: l0 u
+ F0 Q" @) P# e( b+ [9 D
创建文件夹ov5640_yuv,把sensor IC厂家提供的ov5640yuv_Sensor.c放到此目录下。另外拷贝ov5642yuv_Sensor.h、ov5642yuv_Camera_Sensor_para.h、ov5642yuv_CameraCustomized.h拷贝过来改为ov5640yuv_Sensor.h等。+ O8 S+ D' H7 r4 e
' @: n$ b% E; I, v6 b
编译发现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是没有这几个宏定义,我暂时定义如下:
d" A) j$ z$ l2 u- s: `7 O2 b" R# V" C
[cpp] view plaincopy 2 ]% R) V7 @( J3 E3 ?' l6 I3 U
3 O2 v6 ]4 Q o+ c4 g
" U% ?9 X/ w! U! ^6 t7 Y h- //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 8 v2 p& A2 Z/ V
( ~% D. J: o6 \) T/ s1 t9 }
1 ` j7 T. W! e) I+ }; m' G# B: x# F
这是参考ov5642的相关定义来定义的。
! p- G' |, B' ^ 9 L' h X' N/ S7 ]' |
(2) 在支持的sensor列表中增加目标sensor
. ?' n0 m0 f9 P0 ` 8 o4 e" R" ^1 h2 B. N, @4 G! r! Z- A
mediatek\custom\common\kernel\imgsensor\src\kd_sensorlist.h
" t) s) a3 s" Z& \& e在数组增加OV5640的内容,如下:
) K3 U; ?3 P6 A6 U0 l' g( E, w& G3 f0 g5 M4 H: \- }
[cpp] view plaincopy 6 Y1 x; b" {0 ~; B. j
2 \* T5 M; u( M, r' s" U9 I3 H7 Q k3 ?! h6 ~5 R
- 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
- …………….
- }
3 D( k& [ t0 [0 N6 C/ c4 {2 O( U/ t
. X6 R8 U0 c: t- s- }+ Y. O! k# b. v6 a* q3 W1 ~
: ]' V& b1 G9 \& v @+ _+ K也增加UINT32 OV5640_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT*pfFunc);( f( d8 }. S* V1 y& t; c0 v$ v" Z* R
mediatek\custom\common\kernel\imgsensor\inc\kd_imgsensor.h* @) O3 u- ]" p; U* K* y' t7 L
$ T. x7 s8 M0 ~0 A% T(3) 增加sensor ID和字符串的定义
; E ~' H/ n' c T6 _7 U
, ]5 y; U4 `3 R( x0 [6 Y2 K) z[cpp] view plaincopy 
% ]' E1 C( T( s
1 A, o1 D. n; o* B! r: A+ E$ A- |
0 O. Z% P5 Y0 E: x, a- #defineOV5640_SENSOR_ID 0x5640
- #defineSENSOR_DRVNAME_OV5640_YUV "ov5640yuv" : V- Z y/ [' o8 H; x4 \! K
& f/ ^4 Y9 E% P* ]% c
: ?& r9 X- H# w5 Q0 p( H8 F) t- ~) N% Z% C: ?' o
4.2.3 mediatek\custom\common\hal\imgsensor---------------HAL层- r* }! A% O4 k d
$ `' k3 k a, X' O7 q, M(1) 创建ov5640_yuv文件夹3 A" l4 h* R# e; B# z
但这些文件夹下该有哪些文件,有需要哪些内容了,首先我对比了
: b$ a& o) }8 Q6 S. Yov3640_yuv和ov5642_yuv文件夹,只有cfg_ftbl_ov5642_yuv.h有差别:
# _0 A: F c; w图8
7 L4 V; d) p. V8 t% @. ]4 D这里主要是不同驱动IC支持的分辨率不同,以及设置默认的分辨率。- [4 V. b4 C7 E) Q" q9 P
7 i$ [7 m! f4 w" D# h; e图9 " w Y8 X$ ?, E: O8 q4 ~+ D
此文件下有两个这样的地方不同,这里是指自动对焦模式。" ]1 q2 O# x0 e+ j) E
) l: e9 d1 M( U6 C
因为我们的OV5640和OV5642非常接近,所以就直接把OV5642的目录复制过来修改为OV5640即可。# S. }0 T8 G' w2 K8 O; m
* Y% \9 ~; E% u3 R$ l) @: t
所以把mediatek\custom\common\kernel\imgsensor\ov5642_yuv拷贝到imgsensor目录下,改为ov5640_yuv
, @* m/ E' n2 \# H3 G
9 R+ I% x: `- n# ?6 \* d/ N(2) 在支持的sensor列表中增加目标sensor
% ~8 i6 I$ H. {. G& X+ [, Q1 V& Z - a) Y) i$ ]) |2 b' Z
\src\ sensorlist.cpp1 h8 x- {, k) m/ t$ y! H% a
/ C$ Y. Q: x9 k" R! _- q0 X1 l[cpp] view plaincopy 6 n8 A9 ~/ A ^7 ]; H( v
9 j9 Q; Y3 T" ]1 ~, N
0 C! @ h! v, b! L2 }( r2 d
- MSDK_SENSOR_INIT_FUNCTION_STRUCTSensorList[] =
- {
- ………..
- #ifdefined(OV5640_YUV)
- YUV_INFO(OV5640_SENSOR_ID,SENSOR_DRVNAME_OV5640_YUV, NULL),
- #endif
- …………
- }
# f0 s! T b" }8 C7 G& u3 X $ Z& X1 `) W7 _6 D1 Z
- `+ f0 D A; z; ~1 F" `
# C0 W. z+ {" E( K) n! p$ h1 u, m注意:在 kd_SensorList.h 和 SensorList.cpp 里面添加驱动的时候要注意,Sensor 添加的位置要一样。否则驱动会跑乱,轻则 ISP 参数不对,重则 Sensor 无法启动。
! d# [. z& ?# S4 J, ?* e( a $ W. g5 L6 Z! e3 N0 R2 D7 r
$ B, |# H2 i% Q. r
4.3 拍照图片尺寸设置
7 J! w5 [, @% x3 K+ b3 g
$ M" X0 G) i1 B; d% E2 bmediatek\custom\common\hal\imgsensor\ov5640_yuv\cfg_ftbl_ov5640_yuv.h
% K/ V" v- n: \( L9 x" ], F5 m
; ^9 f$ E \- F) ?3 e[cpp] view plaincopy 
5 p; H4 b z( Z3 f* `) o, o8 x/ _
- m4 s8 \" K5 Y7 ^
# K4 F* ?5 q7 h# k& ^" J! q# A8 q' h. i- Z- // 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
- )
, a: Z S# ` Q4 S8 [
( |! ~- D' W7 r6 G: r* q
( P9 \3 Y! G; C/ n0 w1 j; W4.4 Camera物理角度旋转3 C: |; S$ ?2 }. o2 {& D( y
Cfg_setting_imgsensor.h
& D6 C8 c/ _6 `! x
! {; j1 ?/ Y e0 e* d. _. d F[cpp] view plaincopy 
5 b! t8 A. Q7 ]3 ^0 ?: t# |
- r8 R& W) u# S) M* }. I) L# Y
+ L: C+ P+ u* k; ?6 N1 `# `- /*******************************************************************************
- * 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;
- } 6 Q" r0 d, k- P/ L$ t0 H
e% }! J( Y/ f5 W. \
# ?3 |! J1 \ ]% F* {7 b
|6 W9 `6 X/ o" b# p这几种都试过了,但都不行,预览和实际的都是成某种镜像关系。这是平台是提供旋转的功能。这个配置好了之后,如果方向不正确,可以通过驱动中的方向调整函数进行调整,如下: static void XXXXXSetMirror(kal_uint16ImageMirror)3 N# Y& M. t! H% b
参考:http://blog.csdn.net/loongembedded/article/details/41679977
% Y" H: o$ N/ s$ ~* K, i* O
# X) g- q+ u/ Z% Q7 }8 c. ?0 J. H. `0 K
; p1 l! ]$ }2 c/ h3 s看了OV5640的数据手册,寄存器0x3820和0x3821是用于控制图像发射(mirror)和翻转(flip)的,在u4Degree_0=270情况下,OV5640YUVPreview()调用OV5640YUV_Set_Mirror_Flip (IMAGE_V_MIRROR),预览和拍照后的预览都是OK,但拍好的照片在电脑上打开的时候发现是顺时针翻转了90度。
0 c8 T& S$ N0 ]. X7 Y& W+ zhttp://bbs.csdn.net/topics/390837150
6 w7 ^; w4 g* i! M9 D. k% M
3 ?; |; W6 P2 t# E7 s可是我在OV5640YUV_Sensor_Init()调用OV5640YUV_Set_Mirror_Flip(IMAGE_V_MIRROR)却问题依旧,很奇怪。5 q- ~1 |- V2 Q' i/ }; S
6 }& E: R, d1 _mediatek\custom\common\hal\imgsensor\ov5640_yuv\cfg_ftbl_ov5640_yuv.h( i( ~4 l; S/ h4 \6 f5 Z: q. B
( I; d/ C0 Z$ h: P3 o" g: I( b) w
[cpp] view plaincopy 
. N3 V& ]/ k4 V# E$ I) \, u# F3 R
) h2 a9 ~- }# e% t0 |$ p
8 C* x# B! P2 I, S8 k, o6 x7 r- /*
- // 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
- )
1 |$ }( U) r$ w0 @, i9 X% { $ e- r- F$ k) Q
u6 X. l. r. T7 b# \+ X8 N
2 H& _$ A2 d* s% ]+ k/ A9 N. x J( I0 h: L& P7 K! n9 Z
$ [) ^3 ?/ X+ Z4 ~! ~0 W我试过做上面的修改,但打开摄像头的时候,提示”Unfortunately, Camera has stopped”' Z, ^2 M0 i1 ^6 y; z
[7 X5 m& K/ H/ v& f- \5 N$ `
# y: P# ?7 F( ^0 [
% s" Q0 u0 L# r& d参考链接:3 I% v& `# F- C9 i
MTKAndroid Driver:camera/ x p, b: T. ^7 N( d
http://blog.csdn.net/cbk861110/article/details/17437283# R# A, M I" `& M7 ?
# e3 z4 v8 Y0 D _ G" O 7 L0 Q1 {' c: F% g; k5 E+ c# _
MTK cameraimage sensor driver( D u6 j) x" H: `
http://blog.csdn.net/sunweizhong1024/article/details/8497790
) a. a. q* Y; ?, t+ X . n+ I# ~* J3 q' ^
MTK平台的ISP架构问题
' V( K/ N2 F( Z+ Nhttp://bbs.52rd.com/forum.php?mod=viewthread&tid=272727$ N8 }2 p1 T: }9 Q8 Q
( @" z3 l3 a2 H7 R5 M8 sOV5640 YUV的自动对焦功能为何没有开启
0 T) _2 a( W4 p! J! Xhttp://www.16rd.com/thread-10480-1-1.html( V9 {% R- E5 R# q: X
4 R! m& v4 b. E" H
MTK Android Driver知识大全
- `* W! p: }" @% dhttp://blog.csdn.net/cbk861110/article/details/40931835$ l& ]3 z: o7 J
1 T% \: k V& K& }* a6 smtk camera移植步骤. O% g/ t' E- ?+ P7 f
http://blog.csdn.net/vasvas/article/details/39250473
! _3 T! H: e! t2 d
9 Y, d% \" h. M4 X) y) F ?关于 前置摄像头安装0度或者180度
2 n8 B& o1 C; e7 ohttp://blog.csdn.net/kkkvvv123/article/details/8809823+ f/ ^5 }& f: X# l
1 C) T. k( s1 U. OCamera 涉及的文件70, ^: |0 K- `( y4 Z5 ^' i: A
http://3y.uu456.com/bp-6dq1aascss2707221q2ef7es-1.html& f$ o, s g" K- M
, t$ Z1 r6 I2 G2 t; Y, }# L, o! @- V
OV5640全景模式预览倒180度,拍照正常的问题+ x0 O1 a- t9 u6 Z+ h' V
http://blog.csdn.net/guoguo295/article/details/21245815. F4 z0 o6 z1 `6 A# ~9 h1 s
/ O' ~/ Y& e4 i1 @. d! j2 U8 S1 n$ z: Y7 d
- + a3 v" v- p4 {' I
! c* E1 T6 c; g . r% R1 [% o: i. {; |( w+ V
& B7 E/ R8 h9 A% h3 V |
|