|
MTK6577+Android之Camera驱动( f+ V1 }$ D+ x- }6 H7 k# w
& P G; y% M4 W- U" n : `+ t' @) r, |6 v2 F+ Y
MTK6577+Android之Camera驱动
/ j( C0 J3 I/ I2 K* N
9 G5 T$ K! z6 m7 w) b7 Z" x0 C 2 u6 F. x" P% _! {* `1 r' l
图1 ) L3 I1 F1 b( k. _4 o, P/ u' ~' o$ I
1. Camera拍照相关概念' c! R1 B1 `3 \5 p
# Z/ A; Y/ ?1 R# W1.1 ISP) _+ w( R5 b3 X5 |, s
$ w1 G+ P" M$ s8 {, u: K, a$ d
isp——(Image Signal Processor)——影视处理; p9 E( o9 A$ s9 V
( _; T1 p- x/ U/ R! U5 {! z
无论数码相机、摄像机或者摄像手机,其影像数据从前端感应后,皆须经过ASP(Analog Signal Processing)、ADC(Analog-Digital Converter)、前期影像处理(Pre-ISP)与后端影像处理(Post-ISP)四个阶段后,影像数据才能最终呈现于终端设备上4 T6 I6 H0 [9 O& o. w. k
! O4 W! l( d/ C9 g& W1.2 720p8 Y5 @' L( V4 K% U& v
720P是美国电影电视工程师协会(SMPTE)制定的高等级高清数字电视的格式标准,有效显示格式为:1280×720.SMPTE(美国电影电视工程协会)将数字高清信号数字电视扫描线的不同分为1080P、1080I、720P(i是interlace,隔行的意思,p是Progressive,逐行的意思)。720P是一种在逐行扫描下达到1280×720的分辨率的显示格式。是数字电影成像技术和计算机技术的融合。8 F3 c8 m" E% B; l/ p
0 B- z. o% q0 q: t% p分辨率为1280×720p/60Hz,行频为45kHz
0 u4 k4 ~- c, l) t" b) v0 y# ~" O' P 3 t; L1 W/ A7 W4 W+ q5 q4 x5 ?5 X
8 x _- W& G9 v# L9 j# \4 d0 e2. MTK6577Camera控制器部分* v$ `' }) }' x+ `; B
. h( m% U8 c# ]2 K8 H/ q. l* W2.1 camera控制器概述8 J3 h% d7 F) W% @% [. e& \
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+ ?1 N6 p0 g) R+ q
* v4 } K* D3 `2.2 camera特征' E9 }4 X p" s
" M# }3 W8 v+ \( H& k P9 i( N; ]/ x
MT6577内部集成的ISP,包含了一个功能强大的图像信号处理器,用于连接各种各样的图像传感器模组,这个处理器由时序产生单元(timing generated unit: TG)、镜头/传感器补偿(lens/sensor compensation)单元和图像处理单元。
5 \/ a- m" H/ T, Z0 e
( y7 S) M3 w6 ?支持的特征如下:/ i" o, c+ w& ^& y0 x& R4 X
(1) 抓图分辨率达8M像素(image capture resolution)。7 A0 \, {. b( h0 u s/ B
(2) 录像分辨率达720p(video recording resolution)。! h$ I# S3 }- y0 ?9 `! w
(3) 原始图像数据转储帧率8M@15(raw dump frame rate)。
$ _$ [# V, T1 S3 `7 A4 w9 j(4) 曝光抓图率8M@7(burst capture rate)。
9 C! o- R, t- U(5) 图像处理) p8 C" i, q7 E0 Q# \% S
低像素补偿(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)。8 _. O! \1 S1 h4 J$ g- ?1 i* F$ a
: @* H7 i6 \7 a: y8 ~/ D8 ~
(6) 3A统计和校正(statistics and correction)
4 |% V( ^$ Z+ i: K% A(7) 闪烁检测(flicker detection)。3 ?: u0 m$ d% a) o& ^" \
( [7 |- t1 e+ f1 p' p
2.3 camera框图
4 C6 I8 r$ x) e( h
: n+ ]+ Y* d: Z- M, E0 ~. S5 G
+ E& I9 D$ ~2 }2 v图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)单元。
: n1 l1 D0 }+ z1 l
; ?; ^4 s6 g, H" ?" C) Q1 @" u在Bayer原始数据输入模式,镜头/传感器补偿(lens/sensor compensation)单元产生补偿的原始数据给色彩处理单元(color process unit);在YUV422/RGB565 输入模式,这步被忽略。1 Q$ M4 b) E+ x- k' D, @
" b3 x$ N: F0 G+ l+ S: d8 |
色彩处理单元接受来之镜头/传感器补偿(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读取出来。" b5 F' u) U9 W7 L$ _
9 `. B; r$ K5 D8 R: L
下面给出一些性能参数:
- K, e3 g" F9 q8 {$ G* i6 M, q$ ~
Z+ K5 W. z c
图3 3 X+ C" ~# u5 n% L! F( l2 o/ r
3. 原理图设计6 `" t, ?; G/ L( z$ j
+ p# k$ s: i3 L) V
MT6577支持两路camera接口,一路是MIPI接口,一路是并行接口,这里我们采用的是并行接口,下面给出MT6577 CAM并行接口定义:
4 S. t1 ~. w8 C7 E, o' A; t# z! ?- w7 ]" l1 ^
% c' B0 l3 O' r: b2 u
图4 Camera sensor连接座如下: J+ O( e: R* n9 x1 Y
: k1 m) y0 k s4 A9 ?6 a
. Y1 [2 J3 i9 l) w6 C7 k0 Y) A
图5
p7 O, _3 H0 {8 [5 c, J: l(1) OV5640输出的数据格式
& ]& l9 ]. _/ C6 v4 {/ p《Y1MT6577 design notice V0.1.pdf》文档给出这样的说明:
) a( Q c7 j7 k5 lSensor outputformat is RAM8/YUV/JPEG,connect sensor output to CMDAT[0:7] or CMDAT[2:9]( Y' k" i7 Q* i. p/ x
Sensor outputformat is RAM10,connect sensor output to CMDAT[0:9]' E% x: ]& E4 s, I1 D0 R
而我们采用摄像头模组的驱动IC为OV5640(500万像素: active array size: 2592 x 1944) Sensor :outputformats: 8-/10-bit RGB RAW output,这是由OV5640寄存器0x4745决定的。原则就是:首先看硬件上采用的是8根数据线还是10根数据线,然后初始化参数-也就是寄存器设定也可以设定是8位或10位。如下图:
% p8 l9 ^8 R4 y h9 y& p F
& x9 o3 n/ s: W# H3 Y) d0 U
) z8 K6 o9 ]' M U! w/ E图6
* s* V" G+ {8 J/ u
. a. G9 m. _# S0 W) o8 h1 q(2) OV5640IIC地址, j( Z, b V) X3 p4 ?( ]' S
3 H) F: _' b; F5 @
IIC 8bit写地址为0x78,读地址为0x79,查询Sensor规格书可以看到:
7 y& D4 `$ X" X. l+ q; I) r
# Y7 a! Q4 L6 r1 X9 d1 R0 B
. u% [8 D. P3 \+ M7 \3 F" h图7 IIC 8bit地址最后一位为0时是写地址,为1时是读地址。这属于IIC通讯规则0 v. h+ x0 m# ]& J: n, I- o
+ O' M: l7 L+ H( v- q/ d) o
( M; z5 O6 |! f# X
4. 驱动实现+ F6 f- p W, I& a4 ~' I
4 U. y* \) ]2 I+ G/ d* F
( K$ L: k3 E0 O+ m4.1 相关代码
6 a% n R9 E3 D& E% f8 l. l+ G7 t- C. ^(1) CameraSensor驱动相关文件
+ V+ ?1 y2 g& d# d4 |) h0 Z\mediatek\custom\common\kernel\imgsensor\ov5642_yuv+ J4 e% t4 `9 g! {9 T
6 w5 j2 i, Q- A(2) SensorID和一些枚举类型的定义
% z( W8 u# x4 a9 M7 X" x( S\mediatek\custom\common\kernel\imgsensor\inc
; `6 S* f8 [, y) okd_imgsensor.h---------SensorID
) }) C& v j! e/ C+ r8 q; x. [kd_imgsensor_define.h--------------一些枚举类型的定义
* ]* \9 S6 V/ n* }$ {' ?/ f# P . K8 Y6 ~1 @/ ~; {& T* @
(3) Sensor供电& [! n% {' r) h- X
\mediatek\custom\common\kernel\camera\camera: u8 w/ z% A$ q
kd_camera_hw.c和kd_camera_hw.h
9 R- a9 K# ]" E4 M% C% D0 G% n - u% j/ T7 O# v
(4) KernelSpace的SensorList,imgsensor模块注册0 q% h0 q, t4 y/ M
\mediatek\custom\common\kernel\imgsensor\src
- O; P0 X! n7 `- [ z5 lkd_sensorlist.c和kd_sensorlist.h-----------camera模块加载0 {5 N, g9 G6 g4 i0 n: R& b2 \
9 W: R2 Y% j& f3 \8 g
(5) UserSpace的SensorList,向用户空间提供支持的SensorList3 h6 X7 Q; E, y& M& Q
\mediatek\custom\common\hal\imgsensor\src\sensorlist.cpp
! I8 W3 |" h! y! @- Q& b4 k提供给用户空间的SensorList# U4 x0 V+ m, L
% d3 e4 N' z6 Q' X3 s) z& ^
3 _! v7 V! t; Z9 e8 n3 {/ U9 u
(6) Sensor效果调整的接口# f0 X2 J, U2 k B
\mediatek\custom\common\hal\imgsensor\ov5642_yuv& w+ K2 L: Y i% C$ d2 w
" i+ S# m' u8 l9 O6 K" { # B2 ]/ e) `( z) _+ g
4.2 针对OV5640的修改
$ r" `( [1 W: ^
a: s ~. e3 c* M4.2.1 mediatek\config\hsimobile77_ics2\ProjectConfig.mk
. N) @) h# I+ U+ {3 d; B 9 M/ d* C5 k1 t6 ?
CUSTOM_KERNEL_IMGSENSOR=mt9p017_rawgc0329_yuv
( C2 ~4 ]6 G4 G7 F; V. nmt9p017_raw表示后置摄像头(也就是主摄像头),mt9p017是摄像头sensor驱动IC,raw是sensor一种输出的数据格式,是CCD或CMOS在将光信号转换为电信号时的电平高低的原始记录,单纯地没有将没有进行任何处理的图像数据,即摄像元件直接得到的电信号进行数字化处理而得到的。
/ \: t; q+ S* b6 f3 l1 j 6 ~# ?+ m L3 H( r( A7 Z0 R2 F" L
gc0329_yuv是前置摄像头,yuvsensor一种输出的数据格式,支持YUV/RGB格式的模组,一般会带有ISP(image single processor),经过A/D转换过的原始数据经过ISP处理生成YUV标准格式传到BB。
2 C* g S6 ]- j p( X. Z. a
1 t3 l! `! p; Y$ A% u我们采用的OV5640就带有ISP,输出YUV格式2 {/ w) [/ E' i& z
+ Z. H( x7 e+ n
(1) 把mt9p017_raw 改为ov5640_yuv,去掉gc0329_yuv因为我们的产品没有后置摄像头
! [1 e0 ~" d$ \9 W(2) 去掉类似CUSTOM_KERNEL_LENS后面的dummy_lens因为没有后置摄像头$ y1 ^% s7 s, T5 H9 ]' m1 t
2 I$ T3 I6 a% v( y. g C3 j修改之后的HAL层的配置:
" ?6 D, g5 o6 d. E9 y# A8 T! v- E' B
[html] view plaincopy
, a( o8 J/ f8 C7 K; |9 D% d% ^
( n8 n) B( i6 ?6 S* a l
8 U& u2 C$ J! _8 {- z- 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
! e) M% v( l' A$ K% |! K, s" s6 C/ { $ r2 I5 @* P3 T) N1 I
& `6 `, v5 R9 |
+ \( D P: ?! S* y- \* P" [' `修改之后的kernel层的配置:
- ~- k' p/ s' C9 g
/ \0 w3 I0 h. I7 J[html] view plaincopy$ R' W# O& k O- K6 e3 y, `6 z
. D- J) J$ l8 Z( K( j5 M7 O1 w1 C3 ^
3 u- Q5 x' @- s! p' i$ W- 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
( J7 N$ u3 ^. P$ ~1 I% `8 _ 0 f( g" Y8 m& G8 a! r
) P u, N2 f. {, j
" |* F% s1 x5 O8 g' e& L$ @9 z$ ~8 p0 k
虽然我们没有后置摄像头,但不能去掉dummy_lens,我尝试过去掉之后用./mk r dr编译会提示下面的错误:
9 w$ D& n4 A x( i K( {
# w/ f7 O3 d8 ]3 q& _9 j[plain] view plaincopy; k6 O' }6 I J: ]3 ~- R6 \+ c. s
: p Y- m2 p; ~1 E6 k4 H3 O, `' T
! n1 \0 ~% T' o, ~
- 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( W( G9 A& z" I. \- ^
: d3 ~9 x' A, @% D0 \
6 C2 s- b! o% e& Q# f3 J
/ [& S$ ], U j8 E3 q: I
$ e9 i) f! C1 R! G* H: L9 Z4.2.2 mediatek\custom\common\kernel\imgsensor----------kernel层
* `+ Q; ]$ M4 {
0 Y$ a0 N# v- F5 T(1) 创建ov5640_yuv并建立需要的文件, v+ x# P3 O! }7 V9 o5 p6 W; s
0 ~( p# I; l1 A: u9 G8 E创建文件夹ov5640_yuv,把sensor IC厂家提供的ov5640yuv_Sensor.c放到此目录下。另外拷贝ov5642yuv_Sensor.h、ov5642yuv_Camera_Sensor_para.h、ov5642yuv_CameraCustomized.h拷贝过来改为ov5640yuv_Sensor.h等。# A3 a6 J9 I1 K4 S$ {. q9 _
& V" b8 c+ _( f# v: l编译发现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是没有这几个宏定义,我暂时定义如下:
/ q* u$ g* t9 o) s, a/ u7 r
! L- I4 e7 [: ]3 A0 | L1 A[cpp] view plaincopy
% P8 ^3 s3 p# T$ Z' [2 r
5 j: x/ Q7 [/ ]
3 [8 T& i; U! `, x, x- //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 * z* @, }/ g& l; C: l
8 z9 s- r3 u$ q. X6 d+ D
0 v5 N3 Y9 c* i# Y8 A, G
& f& }4 Q) v8 `3 \4 }# a9 N这是参考ov5642的相关定义来定义的。9 m; p2 N+ F8 B7 |4 m
3 a" m+ _5 m1 p(2) 在支持的sensor列表中增加目标sensor
: Q/ k4 e9 } i7 f- E7 t. p; S ) C) l1 J3 b8 Y2 @; R7 A9 c
mediatek\custom\common\kernel\imgsensor\src\kd_sensorlist.h
3 G- Q2 y( \1 b- _在数组增加OV5640的内容,如下:
7 A0 Y# l1 l$ r; W/ w& U6 a
# u1 m. q& c. ~+ k[cpp] view plaincopy" q, g: y0 p% {% k1 p0 `
7 r' p7 m; h+ r9 q
6 [( A, ?. X% x+ M2 U- 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
- …………….
- }
/ \' v! _2 | T: O5 `
e& K. I0 O+ p( o, }
8 @7 l/ Z7 O0 M4 R9 F! j
! G1 W/ ^' c0 t0 O" h/ u也增加UINT32 OV5640_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT*pfFunc);
& A/ ?" a5 p9 _. G* xmediatek\custom\common\kernel\imgsensor\inc\kd_imgsensor.h, e( Z! O Z" p; B3 c
8 d6 W. n5 H7 V6 A7 r8 y4 N(3) 增加sensor ID和字符串的定义$ h1 y% T, ] M' T7 W
2 g8 h# @, u0 ?) F4 E- f; E[cpp] view plaincopy* i# R" k8 S: D& J
7 h( h1 q. z3 H% Y8 }. w1 P
+ v y* T- ]2 G( N* I" X' n
- #defineOV5640_SENSOR_ID 0x5640
- #defineSENSOR_DRVNAME_OV5640_YUV "ov5640yuv"
5 o8 D0 k+ b* u0 r' h
" d h7 J7 M `* O4 v$ P; K: Z1 |% O/ e; ]" n# L/ O- |
' j) O* D" S6 K$ d2 n& ]4.2.3 mediatek\custom\common\hal\imgsensor---------------HAL层9 e& \. y0 L! Y! Y: K& |; P
+ @1 ?4 i' H9 N; P' f(1) 创建ov5640_yuv文件夹' e. g, O3 \# g ^
但这些文件夹下该有哪些文件,有需要哪些内容了,首先我对比了0 q0 X& ]$ m: a4 K' z, x* ]
ov3640_yuv和ov5642_yuv文件夹,只有cfg_ftbl_ov5642_yuv.h有差别:0 L$ m! s/ w% M8 N. H% P* C, D
图8
7 m" b& L/ G; Z4 E! o这里主要是不同驱动IC支持的分辨率不同,以及设置默认的分辨率。) U h6 d* K' j0 a. t/ s
1 m, o% D O S+ j 图9 ( m, R+ e# O- c
此文件下有两个这样的地方不同,这里是指自动对焦模式。9 R2 [" w% D" b( B: b$ t/ D
9 ^$ R3 N" c6 D' W& ?% z3 ?% K
因为我们的OV5640和OV5642非常接近,所以就直接把OV5642的目录复制过来修改为OV5640即可。% P1 Q6 Z; ~& [4 G$ u/ g
4 ^6 Z) W2 L, c/ o" M所以把mediatek\custom\common\kernel\imgsensor\ov5642_yuv拷贝到imgsensor目录下,改为ov5640_yuv8 G5 }3 b( N+ v, ~
' g& f/ V9 F e6 x( i, L! A. r(2) 在支持的sensor列表中增加目标sensor
i, W2 [3 P# x1 c4 I $ U2 @+ X# O* ~# K( H. |) I5 H8 v
\src\ sensorlist.cpp
) x6 C f6 @ h% ^/ Q" n$ N
1 d7 h8 t4 v) g, e, E[cpp] view plaincopy: O B) P/ D2 ~" c4 X/ l: O0 L
# Y: q# b: t3 E/ c: b4 u4 J4 N
: ~ W5 e0 a6 E- MSDK_SENSOR_INIT_FUNCTION_STRUCTSensorList[] =
- {
- ………..
- #ifdefined(OV5640_YUV)
- YUV_INFO(OV5640_SENSOR_ID,SENSOR_DRVNAME_OV5640_YUV, NULL),
- #endif
- …………
- }
1 X) ~' i- F- C5 f; Z5 w
& f7 I# |) @3 ^/ S
+ f ^" g' A5 u; M
$ u$ X! U7 F) b+ M3 B2 Q1 ~7 Q注意:在 kd_SensorList.h 和 SensorList.cpp 里面添加驱动的时候要注意,Sensor 添加的位置要一样。否则驱动会跑乱,轻则 ISP 参数不对,重则 Sensor 无法启动。9 y! r$ i8 Z5 f! V- c- R! z6 @" d
% h9 B; |, T8 c/ |( C
0 Y" N$ ], Y, } ~$ U2 m( H: q4.3 拍照图片尺寸设置4 h; d1 Q7 X7 f$ U
! s/ @- |( X+ D" B
mediatek\custom\common\hal\imgsensor\ov5640_yuv\cfg_ftbl_ov5640_yuv.h) n& A/ V: C4 @7 Z
9 f, n5 d8 a" @. _: e' ?
[cpp] view plaincopy
6 S+ m D: N6 v
! [' B; Y1 Y7 J! S" N+ _* D# W0 w' p
7 E- h( X6 g$ m! s- // 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
- )
# t [$ j" q8 [4 W 5 S# A% q, P, Q% L7 S( T4 m
( P; U& z- [% d& P/ C
4.4 Camera物理角度旋转5 }1 g$ ]" j, U* T B
Cfg_setting_imgsensor.h8 r- }+ E/ \" A8 ]$ |
; ?3 y! F1 J# z
[cpp] view plaincopy& ]( r9 ^) n4 u8 W5 n) P" u
v" @3 Y9 O( H5 P$ n
6 D8 u% q/ B4 t8 e" T5 M
- /*******************************************************************************
- * 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;
- }
2 r0 e; m- n$ L- h & q: s1 e" V2 k
& W* c# Z: z$ M, A: V5 S8 K) Q1 M/ C/ K/ G2 Q( d( ?& _
这几种都试过了,但都不行,预览和实际的都是成某种镜像关系。这是平台是提供旋转的功能。这个配置好了之后,如果方向不正确,可以通过驱动中的方向调整函数进行调整,如下: static void XXXXXSetMirror(kal_uint16ImageMirror)8 T' ]8 @; N! A0 X6 M3 W
参考:http://blog.csdn.net/loongembedded/article/details/41679977
) B+ c6 D2 j1 l6 P1 A5 A
6 f: w1 p, f# E* y- V% n
3 ~4 }% j; k ?6 [6 c! M; p0 |看了OV5640的数据手册,寄存器0x3820和0x3821是用于控制图像发射(mirror)和翻转(flip)的,在u4Degree_0=270情况下,OV5640YUVPreview()调用OV5640YUV_Set_Mirror_Flip (IMAGE_V_MIRROR),预览和拍照后的预览都是OK,但拍好的照片在电脑上打开的时候发现是顺时针翻转了90度。3 [6 c8 }4 H! d/ z& l
http://bbs.csdn.net/topics/390837150% R! r; n* q1 P) c
7 }% ?# H9 E) Q+ ]2 r+ |
可是我在OV5640YUV_Sensor_Init()调用OV5640YUV_Set_Mirror_Flip(IMAGE_V_MIRROR)却问题依旧,很奇怪。- j u' D9 s4 L. d( g( l
" q) o$ I! T+ J+ h b
mediatek\custom\common\hal\imgsensor\ov5640_yuv\cfg_ftbl_ov5640_yuv.h
" j' ?3 B% D- c% t; O; M
% z- }5 y0 ]& g[cpp] view plaincopy
5 @" X G3 Z3 L1 q ?
2 _7 [5 f0 M/ O2 K @& m
* z# e% f4 _& v- /*
- // 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
- )
$ I6 X, N* e E9 d$ b
7 O0 m- c& g1 J/ K8 g0 t
5 j. l4 j6 h$ A4 H+ m5 n* E# y; R/ D5 U: t" q/ K9 J! P T
, I$ `: o0 e! q
8 b7 `$ L1 `* y% Q q9 E' m) L8 k
我试过做上面的修改,但打开摄像头的时候,提示”Unfortunately, Camera has stopped”
, d3 ` X6 e ?- U- p% N) {0 v
% ~. h5 m$ ]& o0 K$ B/ s" n ' w2 R5 r* o+ H# Y/ D% J
" c# {5 R6 ^' _1 B
参考链接:6 `/ x" `# b& i) ]! x% T% Z
MTKAndroid Driver:camera. n( ]: M* T3 k) \' P
http://blog.csdn.net/cbk861110/article/details/17437283
0 k% H* L0 h; _* l5 U# Q7 l
7 |! M8 u9 B$ C
# ^ E6 _4 N% e% ?1 [8 rMTK cameraimage sensor driver
0 o$ H' }" U( j: Z9 ohttp://blog.csdn.net/sunweizhong1024/article/details/8497790
" h5 }2 x, K- f & T' b6 X, l7 a0 p( T4 k, f
MTK平台的ISP架构问题
: e0 ]- E0 c2 Hhttp://bbs.52rd.com/forum.php?mod=viewthread&tid=272727
' g, D: I1 ~: u, B, K" ?7 a
2 @0 A0 l1 b1 z& S5 {+ _OV5640 YUV的自动对焦功能为何没有开启+ F- b# |1 @5 s
http://www.16rd.com/thread-10480-1-1.html; B& L# w3 \: H
, \3 e- v" _# w/ b! EMTK Android Driver知识大全
, U1 t' W% i3 j/ J0 E- _" phttp://blog.csdn.net/cbk861110/article/details/40931835
$ N, e- L) P. y9 x0 \ $ L' o Q% V( `6 i! B2 n
mtk camera移植步骤
3 v' ^$ V5 \7 o; f6 U7 f8 C, Zhttp://blog.csdn.net/vasvas/article/details/39250473
4 [+ ^- N1 \. V* G6 ] & f2 w( _" O- g* P8 M8 E- }
关于 前置摄像头安装0度或者180度 x( \/ o9 O* P/ ^2 ]+ s8 o4 q
http://blog.csdn.net/kkkvvv123/article/details/88098230 Y9 f6 ]5 {& m1 \: x4 U5 a
e4 e8 O% I6 H+ S5 m) |Camera 涉及的文件70$ ^$ [- |" w5 b# Y6 g4 q0 r/ W
http://3y.uu456.com/bp-6dq1aascss2707221q2ef7es-1.html% w: c' f3 n$ i& c
4 ]& H) H4 t& Z3 P9 e
OV5640全景模式预览倒180度,拍照正常的问题 m$ b! J$ \! i7 a- t2 C0 [
http://blog.csdn.net/guoguo295/article/details/212458155 P' Q O; l: I+ ]* O
2 W! A: K4 r" K7 X V; z$ d* r8 L1 Z- z
3 P* W- c# B) `% t- _
( x1 M; L) B7 I / D/ Z. n. ]; y2 b8 |0 B
" i6 v, I0 g) _% f: j+ X8 m r
|
|