|
|
MTK6577+Android之Camera驱动+ ]* d W8 {0 f& ^7 }
+ x4 ?. e) n/ P% ?
0 \2 e9 K3 ?9 B5 f) b
MTK6577+Android之Camera驱动
! |. A8 D# M6 n8 W% Q* }, `5 p p. { B& |) D$ S
# A' N2 X t2 Y$ D; g* \3 W图1 9 s( ^, `! C/ {; h1 x
1. Camera拍照相关概念' ~- p6 Q8 s- F2 N8 `/ a; P
, T3 K; o `; y0 R( H( Y2 y) H1.1 ISP
/ Q4 O \) F6 @# c
9 @7 C* _0 d* C* K, oisp——(Image Signal Processor)——影视处理
% e' E( W4 ~* |# ^0 Q7 w
4 d, N+ V$ L" `' M* Z0 {( j+ L无论数码相机、摄像机或者摄像手机,其影像数据从前端感应后,皆须经过ASP(Analog Signal Processing)、ADC(Analog-Digital Converter)、前期影像处理(Pre-ISP)与后端影像处理(Post-ISP)四个阶段后,影像数据才能最终呈现于终端设备上7 e: d3 G2 ?. \. {% \6 g
% ^: c# t3 R# m, u1.2 720p
( q3 q4 e& S8 K) Y9 _+ m* [720P是美国电影电视工程师协会(SMPTE)制定的高等级高清数字电视的格式标准,有效显示格式为:1280×720.SMPTE(美国电影电视工程协会)将数字高清信号数字电视扫描线的不同分为1080P、1080I、720P(i是interlace,隔行的意思,p是Progressive,逐行的意思)。720P是一种在逐行扫描下达到1280×720的分辨率的显示格式。是数字电影成像技术和计算机技术的融合。
% E5 v, P3 i/ o- v, H
; D5 l8 g7 i1 Z0 O. X9 E+ [分辨率为1280×720p/60Hz,行频为45kHz
# f% d0 |, I' I* c9 _ 1 W3 ?+ D) G' H2 n- x
( C& `4 Y1 [. u' D' k5 `) g5 v2. MTK6577Camera控制器部分" W6 b5 Z' M8 P P0 t, E
# D) ?( K2 M, N2 K9 U2.1 camera控制器概述! P" }, p7 q3 [
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)这些特征,用于图像处理。
3 L( g! A! q$ r8 h 7 p0 c$ o( G* o6 V; ~) ]& h
2.2 camera特征, f# m0 v+ ?5 C8 Q \# K
+ g6 k) f, X% j4 [3 gMT6577内部集成的ISP,包含了一个功能强大的图像信号处理器,用于连接各种各样的图像传感器模组,这个处理器由时序产生单元(timing generated unit: TG)、镜头/传感器补偿(lens/sensor compensation)单元和图像处理单元。& P& ~1 j! B0 \. G# ^* C
: e# i* }$ X6 ?2 Z4 w9 [% G- l
支持的特征如下:
, I$ m, j- }' P4 h) d3 t(1) 抓图分辨率达8M像素(image capture resolution)。( o; g' `( V. P# u& j& x
(2) 录像分辨率达720p(video recording resolution)。: m6 ?( u! H k4 }; Y! R
(3) 原始图像数据转储帧率8M@15(raw dump frame rate)。
& G8 x) {- E" X. J(4) 曝光抓图率8M@7(burst capture rate)。. W; Z: [# e# @ P8 C, g
(5) 图像处理/ v( z& T) u V
低像素补偿(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)。# G! }+ F! E$ S; j
+ N! u7 q U ^7 l# n
(6) 3A统计和校正(statistics and correction), i5 j, L8 P Y
(7) 闪烁检测(flicker detection)。
/ T# C/ f, E7 Z) H) g) Y6 _8 ?, A# E1 Y 8 D, h1 D0 R5 J, C# ?
2.3 camera框图0 J1 J7 l3 U v0 [8 y
- U. U. w7 G7 C
! y( L$ d: v% |- X4 H$ S9 B; a图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)单元。
$ V1 y9 ]$ Z1 R- b# S1 T# J6 _4 i( m : E1 v+ u, w( Q3 \$ y
在Bayer原始数据输入模式,镜头/传感器补偿(lens/sensor compensation)单元产生补偿的原始数据给色彩处理单元(color process unit);在YUV422/RGB565 输入模式,这步被忽略。6 g8 o. _7 Y c1 F: G2 t
! g9 w& ?) i: ]/ `色彩处理单元接受来之镜头/传感器补偿(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读取出来。
% |6 T8 Q3 q2 F% o! ~
) U1 B2 o7 l: A8 ]- w N9 ^4 N下面给出一些性能参数:
$ C% ~6 `; Q; a
7 k8 s( I7 x$ ]# {- d- L$ l
/ a1 H- M' R7 [+ X' l7 I图3
8 y$ o6 E- u( @# c' U3. 原理图设计! K U6 l: m: D3 F# W8 R* a' B
7 |, f% X0 J5 j% t* p+ {1 rMT6577支持两路camera接口,一路是MIPI接口,一路是并行接口,这里我们采用的是并行接口,下面给出MT6577 CAM并行接口定义:
4 }7 T( q3 s, x& O; E5 H9 B
# x- M+ z( ?9 i0 j8 r
, s' H4 h2 B4 h$ W( `9 s9 P2 @% ~图4 Camera sensor连接座如下:3 e5 _; u7 s4 |8 J! c
# ~. U, a$ m$ G
! |% i& |+ L( Y图5 & [/ r4 G! f3 | g% W
(1) OV5640输出的数据格式
6 S& P1 o' }. d& e1 \; p9 e《Y1MT6577 design notice V0.1.pdf》文档给出这样的说明:
" `* ]$ c% O7 H1 x6 Y7 cSensor outputformat is RAM8/YUV/JPEG,connect sensor output to CMDAT[0:7] or CMDAT[2:9], K% i9 E2 s1 f. E) x4 C
Sensor outputformat is RAM10,connect sensor output to CMDAT[0:9]
) S! q4 h- s5 Z% n5 J而我们采用摄像头模组的驱动IC为OV5640(500万像素: active array size: 2592 x 1944) Sensor :outputformats: 8-/10-bit RGB RAW output,这是由OV5640寄存器0x4745决定的。原则就是:首先看硬件上采用的是8根数据线还是10根数据线,然后初始化参数-也就是寄存器设定也可以设定是8位或10位。如下图:
. p3 a% I+ Y9 N3 c
; C( v* N. [0 ~: I! Q6 A $ }; N4 {7 W- G7 N4 C
图6 + Q+ [6 N _1 F P6 H; i* T8 u4 M
6 M! S+ V. g2 S- f7 z(2) OV5640IIC地址
+ |: L& q) l. {( m" w 6 g- L* E9 E* C- b1 Q
IIC 8bit写地址为0x78,读地址为0x79,查询Sensor规格书可以看到: S9 Z( e& \) a1 Z# K
, q4 d/ G+ R( H , E* g+ O3 ^9 p4 o5 d$ }6 u
图7 IIC 8bit地址最后一位为0时是写地址,为1时是读地址。这属于IIC通讯规则
$ |: ]! k, K, X1 l
4 B- F; u: a! o$ }( j) [
& y1 d3 d# a0 {) N/ A) G4. 驱动实现5 @0 i0 p' R# R( `# ?; n0 S- a
0 `( j* v- F0 d, R" o
# `5 z7 c4 D, I2 s6 i+ |5 G* S7 B
4.1 相关代码
3 l' M& k# S0 ` L(1) CameraSensor驱动相关文件
6 @% Q0 Q3 G% c n. H% v. L\mediatek\custom\common\kernel\imgsensor\ov5642_yuv( L: d t9 j: f! r8 ~/ O% P
. B9 Z- @" X# N( p
(2) SensorID和一些枚举类型的定义8 b& A6 i9 u0 n% e" m4 i+ g, q$ [
\mediatek\custom\common\kernel\imgsensor\inc9 Z7 ]4 p6 @; U1 P9 g0 ]( z7 p
kd_imgsensor.h---------SensorID
d# R N, }8 wkd_imgsensor_define.h--------------一些枚举类型的定义
6 l# K& i" i' y5 t( ?( B) l, W S3 A $ z; V* V8 Q; r# l$ q
(3) Sensor供电
% g4 ]8 U1 c. L* C' o3 y. B1 E\mediatek\custom\common\kernel\camera\camera
. f, F( n4 e7 {% xkd_camera_hw.c和kd_camera_hw.h
7 \$ m/ Y5 m% H' R% O3 @+ h
/ ?( t! E( `6 D' i( h/ N/ _) O(4) KernelSpace的SensorList,imgsensor模块注册) |$ @" e/ F; |# [& ^7 Y+ W# {' r
\mediatek\custom\common\kernel\imgsensor\src5 H! }- u$ | s3 m; F' d" M; I1 j. G
kd_sensorlist.c和kd_sensorlist.h-----------camera模块加载3 D( P$ ?' a" a
# f8 `4 j0 `, P. I(5) UserSpace的SensorList,向用户空间提供支持的SensorList
+ ~/ K0 E, c% K; P\mediatek\custom\common\hal\imgsensor\src\sensorlist.cpp
. x' W$ `' ]. s( j0 P0 x1 r; r提供给用户空间的SensorList
) c# c: I" e5 O; g4 f ; E9 |, \' ^# s2 D$ N; z7 r
v: } g$ {9 ^) |(6) Sensor效果调整的接口
: z. L1 ^. ^0 n" D7 i6 w. w\mediatek\custom\common\hal\imgsensor\ov5642_yuv
) V2 T0 B) A; P1 ~, G 1 j* [* n9 C! Q% E
0 {4 O/ @6 B+ b4 F/ \) a
4.2 针对OV5640的修改8 d- E# v: [# ^# W* y
* R s) N# Y% i4.2.1 mediatek\config\hsimobile77_ics2\ProjectConfig.mk
) i6 _. f W6 [! B1 M* u6 P , u$ t6 X& {/ i; c
CUSTOM_KERNEL_IMGSENSOR=mt9p017_rawgc0329_yuv7 S o. _+ G: B. R: {
mt9p017_raw表示后置摄像头(也就是主摄像头),mt9p017是摄像头sensor驱动IC,raw是sensor一种输出的数据格式,是CCD或CMOS在将光信号转换为电信号时的电平高低的原始记录,单纯地没有将没有进行任何处理的图像数据,即摄像元件直接得到的电信号进行数字化处理而得到的。3 ~& \# v6 b! y
9 {, X/ g+ X& _, N5 |gc0329_yuv是前置摄像头,yuvsensor一种输出的数据格式,支持YUV/RGB格式的模组,一般会带有ISP(image single processor),经过A/D转换过的原始数据经过ISP处理生成YUV标准格式传到BB。
+ e8 q2 {& V/ j2 t9 W' a' d
8 i. S- z; ?3 I& N$ {我们采用的OV5640就带有ISP,输出YUV格式
Z8 ?% @+ H s f' y
2 E) U4 c* B( Z, E3 {" x(1) 把mt9p017_raw 改为ov5640_yuv,去掉gc0329_yuv因为我们的产品没有后置摄像头
! Y ~* r$ L( Z: }(2) 去掉类似CUSTOM_KERNEL_LENS后面的dummy_lens因为没有后置摄像头
& A# i: {5 v. Q0 g+ ^ + Q/ S6 s% u9 u6 o) e& C, g/ {3 l
修改之后的HAL层的配置:
. I# {- d2 |; K( W' B/ [" n, m# @ ~: l
[html] view plaincopy 
5 s0 v. C" a+ t) r4 v7 ?. n' }* X$ M; \
6 u) N$ r" q( ^- V, ]2 E
- 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
5 o6 {2 i7 y" m% i: k% Q
3 V4 x2 c3 w! q# B% D5 v5 Z! e
7 `! Q! `3 K( B1 D2 X" ]' a9 }0 m: M. D
修改之后的kernel层的配置:
' F! T8 d/ e+ E4 B1 T& x8 B
1 ]- u6 r% V. b4 ]; v. ]! K/ {; u[html] view plaincopy , ^$ ~0 `8 O: q( j( T( [
5 q. z+ P$ B! ?# b$ s# z) H" X
& [, f: F. z% @0 O0 i- 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
' G4 ~. ]: m* ^ / i H) Z2 T! O6 R0 x; J" V; A
( e$ ~0 @' n( @+ Z3 y) e! y- u
; X- m$ I/ L1 p# t4 [+ x
' e3 C6 Y+ ]* W) h0 J虽然我们没有后置摄像头,但不能去掉dummy_lens,我尝试过去掉之后用./mk r dr编译会提示下面的错误:; a7 U5 R, {- ^. E
% F0 ~$ e* u$ [0 F[plain] view plaincopy ~9 v$ |) u: K1 X" d: ?! t- T
1 r9 i4 _0 B0 i! g5 ?% B: S, E6 o9 M) l
- 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
, ~& z3 L+ X5 `& w) t1 H 1 I4 F! I2 d' H7 B
! V5 s4 S. }! W, _- @7 l9 L7 m
- r0 z% _, n$ D3 Z& k. `
% V t/ k9 J) e- H- P8 S& {4.2.2 mediatek\custom\common\kernel\imgsensor----------kernel层
4 Z9 X8 o* B8 S- V- t9 _ v5 y$ o+ |+ H8 w
(1) 创建ov5640_yuv并建立需要的文件" N( ^% E& @$ A: T% h8 ]3 y
4 q1 T# }$ L% g5 {; T
创建文件夹ov5640_yuv,把sensor IC厂家提供的ov5640yuv_Sensor.c放到此目录下。另外拷贝ov5642yuv_Sensor.h、ov5642yuv_Camera_Sensor_para.h、ov5642yuv_CameraCustomized.h拷贝过来改为ov5640yuv_Sensor.h等。! i; n7 ^! C7 ~+ L
6 V2 m, D( S6 d- i! W1 k2 Z
编译发现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是没有这几个宏定义,我暂时定义如下:- E9 m2 t9 B7 L0 ^
: r# }0 U5 k8 S8 n# D+ {: K X
[cpp] view plaincopy 4 |8 C* z+ i8 k. u- c
0 f0 R( j, N& q1 V8 x( K/ n0 J$ n" I s
- U2 k+ O- n) |3 x2 t- //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
( x, Y/ E8 a0 s Q* P
* }- m1 h" ]! k2 E" e5 E9 L& J7 `
% v7 u, r0 g7 m- ? E7 ~9 j$ ?6 S$ _* @8 [" T" n
这是参考ov5642的相关定义来定义的。
4 D% J/ c% P! y5 @7 C( E e
c+ t2 W6 K; v! v3 y, x$ B2 _3 u(2) 在支持的sensor列表中增加目标sensor3 L s# e. u' R v3 }! ]3 T# @
2 o' Y2 p& q8 d% C; f2 |8 U6 k/ amediatek\custom\common\kernel\imgsensor\src\kd_sensorlist.h0 E6 s3 G1 z) {- ~0 Y1 h
在数组增加OV5640的内容,如下:# e3 ~1 i( f! i& w& \. u* [. ~
% r X+ A9 q G; w5 y[cpp] view plaincopy ! P. v6 o6 z9 J+ G! K# J
+ h' j% u8 L/ _$ c6 x/ c" B
+ L) k, g! V7 D. V1 W8 \3 b0 }- 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
- …………….
- }
7 W5 c* b; A* S " W n+ m' C$ {2 G" G4 {4 R, ~
* d, S( R" s) [) ]+ `
( c0 s$ A+ O0 y2 e% B2 x
也增加UINT32 OV5640_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT*pfFunc);
" S/ y( t3 j3 ymediatek\custom\common\kernel\imgsensor\inc\kd_imgsensor.h
- F$ d0 Q7 Y2 X7 q% I 1 v4 P% b Q/ c/ d3 j: F
(3) 增加sensor ID和字符串的定义7 U" @) t8 u+ t+ ?( Y
) a# A, Q( u8 A[cpp] view plaincopy 4 s. S' J/ B% M4 c
# o% Q9 }$ [; e3 q3 S% W$ l0 r+ G5 X8 k; ~1 R; ]1 e
- #defineOV5640_SENSOR_ID 0x5640
- #defineSENSOR_DRVNAME_OV5640_YUV "ov5640yuv" ! `) m1 k2 @. e/ ^2 G
% S' q9 o& X8 F
# C# j' A5 A+ O" E7 I N
; g+ f; p' i, D+ p4 G4.2.3 mediatek\custom\common\hal\imgsensor---------------HAL层2 K$ M* Z* M/ w+ _) Y# Q) f
1 h) |" p# M9 K* z/ O, D6 x4 n: R. Z(1) 创建ov5640_yuv文件夹
4 t9 Y1 R- Y8 ^1 b但这些文件夹下该有哪些文件,有需要哪些内容了,首先我对比了
' f, y) `6 S8 A) ?ov3640_yuv和ov5642_yuv文件夹,只有cfg_ftbl_ov5642_yuv.h有差别:
7 v3 L( f$ c" C! Y" J' b图8 7 [, ]5 g1 [" X" X5 T: r# K j
这里主要是不同驱动IC支持的分辨率不同,以及设置默认的分辨率。3 k+ B. C7 {% E, f
$ W; W' t8 ]! X3 e* Y& |) H
图9
+ \) H& ] i/ h5 c此文件下有两个这样的地方不同,这里是指自动对焦模式。
' h2 B& ^; S& Y6 | A7 B
4 |; Z8 e6 d$ J9 \/ S- ^因为我们的OV5640和OV5642非常接近,所以就直接把OV5642的目录复制过来修改为OV5640即可。/ W( y/ k( L. h- k7 T
1 K9 Q& F% B! W所以把mediatek\custom\common\kernel\imgsensor\ov5642_yuv拷贝到imgsensor目录下,改为ov5640_yuv' T3 |; u" _9 v% G2 G
# D4 d) O3 s& v$ V+ M7 C7 t(2) 在支持的sensor列表中增加目标sensor
6 m- B2 M7 q2 n; @* M
& R3 {/ \8 n( }8 t! W9 f\src\ sensorlist.cpp& t, k4 q2 N, H7 _5 p6 S) d
1 ~' @2 D- T; w* M* N2 Y2 ?- L4 m3 L
[cpp] view plaincopy 4 S' h4 M# J( Z! Z) [
# \8 i0 d0 ?* l7 a" q9 a" {- I
' T7 _# M8 j1 a. ~( h5 G
- MSDK_SENSOR_INIT_FUNCTION_STRUCTSensorList[] =
- {
- ………..
- #ifdefined(OV5640_YUV)
- YUV_INFO(OV5640_SENSOR_ID,SENSOR_DRVNAME_OV5640_YUV, NULL),
- #endif
- …………
- }
3 r2 g1 G: F! C9 w4 F ( n$ I3 v; i7 V) G
/ D& H6 K6 a- Q
& t' @; b Z0 T9 E2 j
注意:在 kd_SensorList.h 和 SensorList.cpp 里面添加驱动的时候要注意,Sensor 添加的位置要一样。否则驱动会跑乱,轻则 ISP 参数不对,重则 Sensor 无法启动。% O8 I4 R5 U) i! i
( w6 X4 t8 ]3 _+ y1 e7 O : ~/ J4 Q4 a9 I/ }6 T
4.3 拍照图片尺寸设置* H ^/ Y+ ?1 n% m; V
3 A2 k2 G: n! o* C! z+ Dmediatek\custom\common\hal\imgsensor\ov5640_yuv\cfg_ftbl_ov5640_yuv.h3 {! P g# {0 J: m0 [4 G
" N. |3 M, E$ F( E( l
[cpp] view plaincopy 7 F$ e& n! C; t" O* n- Y
: h& C( H3 r: l) @2 t8 \, b0 ~. w4 H% O% J1 b
- // 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
- )
! C4 \) @% |! r# q " K0 i ?6 d- W
- T! O" O4 o: M2 u6 t
4.4 Camera物理角度旋转
. N) y3 j3 a, B3 `) I* GCfg_setting_imgsensor.h! N- P9 D x3 B% z6 [/ v
; m% [2 g$ w. y7 [
[cpp] view plaincopy 
+ W' K: e. y; j; ?# v- W4 T8 `( b& p6 }, Z3 M
9 ]$ O0 Q) h/ U( G0 Z0 a- m" q
- /*******************************************************************************
- * 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;
- }
# b0 R, i5 c# s; Z& k% I # R- v6 L& F* [" h& q8 n5 t" _
' N; U2 g' U3 H( W7 Z
2 p, v4 j' |$ Y1 W/ R v这几种都试过了,但都不行,预览和实际的都是成某种镜像关系。这是平台是提供旋转的功能。这个配置好了之后,如果方向不正确,可以通过驱动中的方向调整函数进行调整,如下: static void XXXXXSetMirror(kal_uint16ImageMirror)9 B2 b d( [; k- X2 h- l( q3 r
参考:http://blog.csdn.net/loongembedded/article/details/41679977
1 {( j/ ]9 Z9 f7 j+ g- \! P8 a
y& t0 Z: G; a( i& Z/ h# S) m7 ^1 S + S$ u3 \. ~) w# {# G
看了OV5640的数据手册,寄存器0x3820和0x3821是用于控制图像发射(mirror)和翻转(flip)的,在u4Degree_0=270情况下,OV5640YUVPreview()调用OV5640YUV_Set_Mirror_Flip (IMAGE_V_MIRROR),预览和拍照后的预览都是OK,但拍好的照片在电脑上打开的时候发现是顺时针翻转了90度。
( k* \( `# G i2 |" o; Lhttp://bbs.csdn.net/topics/390837150$ a0 T% ~( t! v, o6 d
. K# f& D, F+ q/ g
可是我在OV5640YUV_Sensor_Init()调用OV5640YUV_Set_Mirror_Flip(IMAGE_V_MIRROR)却问题依旧,很奇怪。- E$ { _9 u5 {* C. g. o
* i( [- `8 }/ T# U- ~! w) V
mediatek\custom\common\hal\imgsensor\ov5640_yuv\cfg_ftbl_ov5640_yuv.h
6 z/ u9 i1 @# Y
- q2 b- `& R" _0 T0 `$ C* p' r) @[cpp] view plaincopy B# p. S6 u' r r/ \$ _
; K( {4 ~( Q" a/ T' @
) g# c3 \; B( b8 x' T3 {
- /*
- // 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
- ) 3 v5 R0 U- I/ c' G3 [ _" ~9 s6 q
* E# V# `1 u2 k( r7 V9 ^/ D, Y
: r9 P) c( j* N% ^4 _* H! I1 }; e& J
' \: ~8 h' |; L; ~& [3 L/ O1 o" _' A% g( ~
! Y. x. |. t/ a, f
我试过做上面的修改,但打开摄像头的时候,提示”Unfortunately, Camera has stopped”# O. U- j0 M, z- h: @ M' T4 h
8 q+ q1 S6 m6 \6 z$ P# I a
0 u+ P1 ?, U2 L( J, X& z
& c/ o5 m/ |% K% {' e& P参考链接:, q$ f9 U+ V2 N! D5 m% u
MTKAndroid Driver:camera
5 K5 A# u+ d% G8 i! d5 Fhttp://blog.csdn.net/cbk861110/article/details/17437283, _1 K( y7 @& F4 a; U
9 `6 |3 J0 f* }( c1 L9 ^4 d1 r
5 B0 i) H$ E3 Q% e+ PMTK cameraimage sensor driver# @, ?# S0 Y C
http://blog.csdn.net/sunweizhong1024/article/details/8497790
7 ?/ K4 l* |7 _& b; |: t
# R6 a- d5 l& ~4 |8 P0 s1 @MTK平台的ISP架构问题: Y' \, w4 x/ I
http://bbs.52rd.com/forum.php?mod=viewthread&tid=272727
. Z: ^9 m% |; G' \7 u. F1 k2 C1 w # @& w6 e4 ~& H, L
OV5640 YUV的自动对焦功能为何没有开启
9 v* a6 ^5 J z" ^- C, L* vhttp://www.16rd.com/thread-10480-1-1.html, c' E+ q# r! g7 @ @
8 t' b) B# H* w1 U8 m6 k# J+ _
MTK Android Driver知识大全
+ s1 i: r- X7 O; x8 U, ^http://blog.csdn.net/cbk861110/article/details/40931835, k, e( [1 c# J
2 B& T- W. W2 ], Z! V7 T5 {" `
mtk camera移植步骤
0 C5 `3 u/ m* f. f, h9 `http://blog.csdn.net/vasvas/article/details/39250473 ~( I7 U' z4 y- [6 l
! d S, I) t8 t' ~0 U, \4 n; G
关于 前置摄像头安装0度或者180度: v5 x( C/ X- ~- ?1 p2 {, g, @. U' g
http://blog.csdn.net/kkkvvv123/article/details/8809823
5 ]# \6 C* V1 P/ k5 ?
# e# o8 _8 ` [Camera 涉及的文件70
2 [ Q* v, ?* ^1 Ehttp://3y.uu456.com/bp-6dq1aascss2707221q2ef7es-1.html- N- ]; G$ v) c# ^
* K7 \7 G" f4 Z+ u: Z+ rOV5640全景模式预览倒180度,拍照正常的问题: L! @4 y1 z+ k; a' E- |% x# T
http://blog.csdn.net/guoguo295/article/details/212458152 j+ N! W5 w) i" ?
+ ~8 m B, }3 j% T2 \% w9 i8 [
7 H( A3 x5 E+ i- u' o) F
+ p1 a- ^( w }7 Q
4 Z# U& @3 n5 c; g* I t
' x w) ^( b: E1 ~) ~, W1 k/ x a) P# i9 P0 a5 m
|
|