|
|
MTK6577+Android之Camera驱动
. t6 z" f1 }5 K8 Z4 S5 `, L) }$ K
) U; J3 w+ g7 ]# y- u/ Z$ k" x5 m
MTK6577+Android之Camera驱动 $ W/ b4 u; F" i3 j4 I4 {
8 j9 x, d5 _+ n; h
4 H) @4 ^- k/ g图1
/ K, k! E1 K9 l v9 L1. Camera拍照相关概念
6 V2 X! u# |: j 8 f, O4 ^- q3 |' C$ M' _
1.1 ISP+ `$ Y3 W- ]+ |+ _
+ y/ n3 T4 L, Z- u; A4 J$ ?$ risp——(Image Signal Processor)——影视处理7 J& _( S2 f2 i: m
$ i8 ]3 a( y* `无论数码相机、摄像机或者摄像手机,其影像数据从前端感应后,皆须经过ASP(Analog Signal Processing)、ADC(Analog-Digital Converter)、前期影像处理(Pre-ISP)与后端影像处理(Post-ISP)四个阶段后,影像数据才能最终呈现于终端设备上9 H/ m# [ H8 ?3 E$ I* E4 y! x, Y1 w
0 Q) ^5 R2 v9 w# E4 `3 r1.2 720p$ ]; [; B" R z" {* ]
720P是美国电影电视工程师协会(SMPTE)制定的高等级高清数字电视的格式标准,有效显示格式为:1280×720.SMPTE(美国电影电视工程协会)将数字高清信号数字电视扫描线的不同分为1080P、1080I、720P(i是interlace,隔行的意思,p是Progressive,逐行的意思)。720P是一种在逐行扫描下达到1280×720的分辨率的显示格式。是数字电影成像技术和计算机技术的融合。4 b+ l h! ~4 l& D# X% D2 i# S6 `
, O7 J8 F% a& h$ t* c分辨率为1280×720p/60Hz,行频为45kHz
9 n) l% u/ p5 e9 E# s- `& \
% W O' e1 U# D : x$ j1 ]( ], j, W
2. MTK6577Camera控制器部分2 j- j+ b; { P# G
) g: P w( j! H; h% a2.1 camera控制器概述+ s8 `$ b/ @7 G4 h( q
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)这些特征,用于图像处理。
0 k9 |1 u; @4 w1 m' [; B
8 i% v& I O; `. V* I1 u! V! s2.2 camera特征; S# ~, Y% h. @3 }) g0 a4 f! q
3 g* O, _9 K' `7 ^4 }MT6577内部集成的ISP,包含了一个功能强大的图像信号处理器,用于连接各种各样的图像传感器模组,这个处理器由时序产生单元(timing generated unit: TG)、镜头/传感器补偿(lens/sensor compensation)单元和图像处理单元。5 S5 k- p& k! ]1 R5 `, p$ I. _
0 h- h& ^( r- w2 b/ {6 }" a& B# V( v
支持的特征如下:
8 b! d2 L* v I. T(1) 抓图分辨率达8M像素(image capture resolution)。( u k- l7 s, N7 d
(2) 录像分辨率达720p(video recording resolution)。4 ~5 c5 K7 I, l( p, k; [
(3) 原始图像数据转储帧率8M@15(raw dump frame rate)。
$ c! g4 [6 g. h3 `2 E+ T9 e(4) 曝光抓图率8M@7(burst capture rate)。3 _" M- n( J& J' m. \. \
(5) 图像处理0 E! g. q$ y) m- l
低像素补偿(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)。
( t# ^- ~3 G6 J. k2 K# z7 \ : W! k" y9 S0 d2 L) V S
(6) 3A统计和校正(statistics and correction)
! k; D- {" ^3 e1 s(7) 闪烁检测(flicker detection)。. {) F U' y" h9 U
0 n( f7 Q8 S$ S2.3 camera框图
2 k/ m& k6 C5 {
, H+ }* D$ w+ p 5 C" i! W$ d- h
图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)单元。
# ~, k9 Z1 N' s% p % O1 v) q7 h0 S9 b
在Bayer原始数据输入模式,镜头/传感器补偿(lens/sensor compensation)单元产生补偿的原始数据给色彩处理单元(color process unit);在YUV422/RGB565 输入模式,这步被忽略。( n- R4 w- n5 ]
& p9 s' p z1 J! S' A8 W1 ?9 t3 J9 ?$ u色彩处理单元接受来之镜头/传感器补偿(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读取出来。7 E5 h: i( l5 G' C
" T- z) _) T; o) d
下面给出一些性能参数:
1 n0 x$ ~5 J- Z# A7 I ?) w5 a" h+ V
" W1 s! e: f( N' W* u1 o9 B 8 H/ b' j! s2 g$ N, e
图3
& a' x: P& G# G5 f, A: }3 w3. 原理图设计
$ G, O9 P3 G3 ^ E0 l - H+ Z, Z w8 s& s b
MT6577支持两路camera接口,一路是MIPI接口,一路是并行接口,这里我们采用的是并行接口,下面给出MT6577 CAM并行接口定义:
m% o( v2 N7 p0 ^- r0 V# }
/ U8 \/ C& G+ Z' v 9 k7 p. R2 m L5 [1 ?
图4 Camera sensor连接座如下:
( ^* b+ j1 h( ^; m% e0 |" O2 Y- s% n 6 V1 D% ^$ D5 L
/ m. T; Z; [- o( V7 |/ g
图5 8 K3 {) c. u; f1 i; B: C
(1) OV5640输出的数据格式( I' i. H, P- s5 w
《Y1MT6577 design notice V0.1.pdf》文档给出这样的说明:5 @" E6 k+ T$ l9 v- T0 S) E
Sensor outputformat is RAM8/YUV/JPEG,connect sensor output to CMDAT[0:7] or CMDAT[2:9]5 p6 C7 b- g0 {- a
Sensor outputformat is RAM10,connect sensor output to CMDAT[0:9]
& j. @4 Y" \) ~- s而我们采用摄像头模组的驱动IC为OV5640(500万像素: active array size: 2592 x 1944) Sensor :outputformats: 8-/10-bit RGB RAW output,这是由OV5640寄存器0x4745决定的。原则就是:首先看硬件上采用的是8根数据线还是10根数据线,然后初始化参数-也就是寄存器设定也可以设定是8位或10位。如下图:3 F" y! Y+ w0 g& V% m1 i8 H c
7 q$ U! k2 l# n3 i: t! M( t. C" Q
* o. S9 A' @" Z
图6
" Y" t" y; _# F9 c8 E0 o * }+ ?, [" j: ^" V
(2) OV5640IIC地址
% N' G# V& D# ^! P7 m7 i8 C; K 2 E0 w3 ~/ P$ n- L+ g1 E( A7 ~
IIC 8bit写地址为0x78,读地址为0x79,查询Sensor规格书可以看到:1 f7 V" M7 e1 {4 G/ @
% M1 D' l, T) p: v" t% v% e
c$ | d/ X! G! w) F [5 U: M; U, `; }
图7 IIC 8bit地址最后一位为0时是写地址,为1时是读地址。这属于IIC通讯规则
; f' f3 I; X" x: {* W4 b
' r& O5 ]1 O9 A + O5 R2 j @; T8 r6 L
4. 驱动实现& ]) T2 Y* H; e2 \
$ V4 B9 W; Z+ g& k p7 ?9 @* ?5 g) f4 x
* K+ N' F9 L/ q, Z4.1 相关代码: D6 B9 i. M0 |4 p* B. R
(1) CameraSensor驱动相关文件
0 C; m- k) `8 k5 W\mediatek\custom\common\kernel\imgsensor\ov5642_yuv6 R1 _! J! V# ^' v$ Y
+ ]7 G- x! e6 R+ y8 g# t
(2) SensorID和一些枚举类型的定义! e+ |: a/ U* D: Q
\mediatek\custom\common\kernel\imgsensor\inc
$ R' e; x3 _9 K- Q7 z1 kkd_imgsensor.h---------SensorID
" Z, A" | N: E1 i% bkd_imgsensor_define.h--------------一些枚举类型的定义; ?) k! c/ n$ d0 ?9 y) ?4 w+ @# j
# s" y' t1 m. u% Q5 F* x' w
(3) Sensor供电
" `" |# }* z2 D0 N5 Z9 j\mediatek\custom\common\kernel\camera\camera
( g- L/ o @* I$ Lkd_camera_hw.c和kd_camera_hw.h' q$ G* J. ]) V( E& K; {
4 [7 V' c) f) V- j. J/ V( i! t) `
(4) KernelSpace的SensorList,imgsensor模块注册 W- ~* k$ j, W) q
\mediatek\custom\common\kernel\imgsensor\src+ y/ O7 t j' w7 K1 c7 d& \
kd_sensorlist.c和kd_sensorlist.h-----------camera模块加载
5 T- [- g% y/ ~! A 6 c" q6 \ d" B7 l3 i. V/ v
(5) UserSpace的SensorList,向用户空间提供支持的SensorList1 ^& n2 D5 o6 [" y6 u7 ~
\mediatek\custom\common\hal\imgsensor\src\sensorlist.cpp! @5 q; K7 [3 v2 g1 x
提供给用户空间的SensorList3 l, l+ J. d6 i1 w: N+ A
/ M- w) z- V. t0 p( O; A4 K
" p. }# l# P( u2 @+ |
(6) Sensor效果调整的接口& ]) O7 E9 ~4 v9 x
\mediatek\custom\common\hal\imgsensor\ov5642_yuv
/ p# W! d) Y, P0 I5 P * w. q- R0 z; F, {, O6 R
/ d1 u: [* z9 ~0 W1 ]7 r. a4.2 针对OV5640的修改7 s, t7 P, W! w
" \8 ^5 ^$ a/ v# k3 U) A. B4.2.1 mediatek\config\hsimobile77_ics2\ProjectConfig.mk
3 K6 q% R& L! A
& k6 D. Q$ l6 {; V fCUSTOM_KERNEL_IMGSENSOR=mt9p017_rawgc0329_yuv- q- B+ H0 r- K V! d' P
mt9p017_raw表示后置摄像头(也就是主摄像头),mt9p017是摄像头sensor驱动IC,raw是sensor一种输出的数据格式,是CCD或CMOS在将光信号转换为电信号时的电平高低的原始记录,单纯地没有将没有进行任何处理的图像数据,即摄像元件直接得到的电信号进行数字化处理而得到的。; U5 ]6 ~6 n: q" C
+ ~* V9 N" n/ l S0 g% l8 _
gc0329_yuv是前置摄像头,yuvsensor一种输出的数据格式,支持YUV/RGB格式的模组,一般会带有ISP(image single processor),经过A/D转换过的原始数据经过ISP处理生成YUV标准格式传到BB。6 x* h6 m: E5 G3 v' @9 q/ k
4 y2 ` \# q: D' S% y
我们采用的OV5640就带有ISP,输出YUV格式
% X. z( Z9 ^& n5 a' \ P8 i: [+ W 9 I8 Y @) P* V8 m$ X
(1) 把mt9p017_raw 改为ov5640_yuv,去掉gc0329_yuv因为我们的产品没有后置摄像头
; v' y. Q* E, A0 L# W(2) 去掉类似CUSTOM_KERNEL_LENS后面的dummy_lens因为没有后置摄像头
! Y" P# v) }$ P+ k3 C+ [ , k, o) A2 f; ^5 Y
修改之后的HAL层的配置:) ~. ]4 M9 ]7 c" p9 v2 r( w; a& }
8 s6 r: f p1 Q' U( ~1 S( \6 d4 a
[html] view plaincopy 
+ ~. a7 {8 S2 y9 S& H* _: O3 N+ N5 p6 C" Y# R6 f4 N
$ f0 ^9 {. C4 [1 \% e+ F3 a
- 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
; r( j& a$ n" e; K, i+ X5 K6 l : X8 b& T. J' D' p8 T" X c( n4 A$ _
U( r4 J `" e
0 V) I4 w4 p1 w; {修改之后的kernel层的配置:
9 [( w& @% K$ U) ^+ m2 R
! a$ \3 q& ~: @& U: ]9 E; X[html] view plaincopy : ^% J' \& X3 h& n- v- L
/ P0 U0 T R% C. e. H8 D1 k- x" a( z& R
- 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 - z0 L9 E: u! S% R. Q& ~: @
9 E0 Z$ ]2 A" G5 \; |& z8 M1 F* ~& j# N) n2 l. V
, H& w: B, Z) g( @4 E. x3 E. P5 v2 ?& w( z: J
虽然我们没有后置摄像头,但不能去掉dummy_lens,我尝试过去掉之后用./mk r dr编译会提示下面的错误:
2 e3 M( h8 |6 `) `
) q- t7 R6 G* A5 r+ w[plain] view plaincopy * B& h# x3 s: }* ?2 Z
* L, Y+ W# } @" E
4 Z- [# _8 G3 q: r% k1 N% j9 b1 m* p- 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 D5 _1 Z8 ~: u( Z3 S+ i3 u8 o! A' S
! L! D3 G. |. p/ M. M
+ q V6 v) n6 c7 @, r
& F8 o) ~. g: |0 g
7 L2 _5 O# F6 A/ T0 X( n4 I4.2.2 mediatek\custom\common\kernel\imgsensor----------kernel层
# R G& \" S! Y/ k
$ G" b. F" ?4 p- t0 q* J- g( Q(1) 创建ov5640_yuv并建立需要的文件* I g. r, `; h3 K, x
Q4 [' c8 w* G9 b4 y/ e: |
创建文件夹ov5640_yuv,把sensor IC厂家提供的ov5640yuv_Sensor.c放到此目录下。另外拷贝ov5642yuv_Sensor.h、ov5642yuv_Camera_Sensor_para.h、ov5642yuv_CameraCustomized.h拷贝过来改为ov5640yuv_Sensor.h等。( G# I: e! N3 p/ o3 A: V& j
. ]4 }8 l" Y! e
编译发现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是没有这几个宏定义,我暂时定义如下:
3 R4 x% D- a i @! h4 Y
- ^1 ~" @; l, b2 E[cpp] view plaincopy 
9 L# @/ K" d3 {' `4 E8 \2 g& J; K, d4 o
/ ?: k; h; R( l$ S! @. w" F- //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 - B& M8 Q0 Q* p5 Z7 l- g9 h5 O+ K: B
& m" s x- B( ]1 B; g# N; Z- B% a: U% c2 y/ [8 R2 @+ D* R E4 a5 Q' e9 p
+ J! q4 U4 I8 x. s6 l
这是参考ov5642的相关定义来定义的。7 o9 @' L S4 [ F) A
& ]& N" v, Y9 n- K' j- t
(2) 在支持的sensor列表中增加目标sensor* e4 c @0 b5 a% D U' H
6 a+ z1 o3 |! l) y/ qmediatek\custom\common\kernel\imgsensor\src\kd_sensorlist.h. q+ h8 o, ~& O4 Q
在数组增加OV5640的内容,如下:
$ t% d( L3 T/ p7 P! _0 Y* R$ K s2 z" \
[cpp] view plaincopy 9 i w* Y8 { p# @& x
* \" B2 J( ?" v }; @5 Y4 c
' i3 z1 V1 o5 }3 Q/ o- 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
- …………….
- }
: n' F- t; {2 G* ]* `% l. y
1 t* e9 L$ y& W3 m
8 g d/ N. q+ v% |" A/ Z( J) F% ]& |7 R! d4 m0 A3 r2 I
也增加UINT32 OV5640_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT*pfFunc);* j8 p1 L, t' V
mediatek\custom\common\kernel\imgsensor\inc\kd_imgsensor.h
- l5 C/ D( P C" D. M% A/ q( `
& z( R9 ~* Y: h( t H& F" Q c a(3) 增加sensor ID和字符串的定义
: y# _: T( {' l) y( Z, l2 Z; C- E' f. Z( L
[cpp] view plaincopy % }0 Q8 X% E# L8 L0 W4 G
$ q8 b& c( w0 j, T6 l
0 ?+ V5 a3 C6 k9 f- #defineOV5640_SENSOR_ID 0x5640
- #defineSENSOR_DRVNAME_OV5640_YUV "ov5640yuv"
: O4 P' h- f3 e6 e9 f) l% t" r
\' G! D' T6 q5 ?3 k: V h0 P, h* R+ p
: E2 r: _" m2 A0 P1 b
4.2.3 mediatek\custom\common\hal\imgsensor---------------HAL层
1 H' |7 C% K) u. i, s$ z0 A/ V % P% _# T+ b$ W5 y3 ~
(1) 创建ov5640_yuv文件夹
! P0 C* [/ l0 F" }' L! E9 @但这些文件夹下该有哪些文件,有需要哪些内容了,首先我对比了7 H( ~/ q. {6 @. p0 N
ov3640_yuv和ov5642_yuv文件夹,只有cfg_ftbl_ov5642_yuv.h有差别:
( ]& N4 f. }4 O& A* I图8
$ A# T7 J1 y5 B: F* U0 n这里主要是不同驱动IC支持的分辨率不同,以及设置默认的分辨率。0 W9 x% a0 ~5 }
! W( G" T. N P+ E7 ~# y; ~9 o图9 : ]9 u, g: j1 U4 v( U( U' S y! o
此文件下有两个这样的地方不同,这里是指自动对焦模式。
- X9 \9 Q; H, v4 i9 Q" Z9 `4 _
9 J% ?8 n* h2 \5 U* E1 h因为我们的OV5640和OV5642非常接近,所以就直接把OV5642的目录复制过来修改为OV5640即可。
6 S0 n9 ?. o0 `! S 4 o# S" Q4 Q# ` k/ c3 f
所以把mediatek\custom\common\kernel\imgsensor\ov5642_yuv拷贝到imgsensor目录下,改为ov5640_yuv
2 i& ^7 e. f& V2 j( s, e4 c
e& B8 e$ ~3 Z/ |5 D1 p(2) 在支持的sensor列表中增加目标sensor m/ [: ]/ a7 t
+ r: x+ _+ l0 f# i* C: ]\src\ sensorlist.cpp0 x } P4 f @ ?3 r
/ x1 Y* j, `0 S
[cpp] view plaincopy ) M% f: G' x7 k- c
* h+ e: M* U" ?% c) ?
+ i: h0 T5 W/ `5 U' b- MSDK_SENSOR_INIT_FUNCTION_STRUCTSensorList[] =
- {
- ………..
- #ifdefined(OV5640_YUV)
- YUV_INFO(OV5640_SENSOR_ID,SENSOR_DRVNAME_OV5640_YUV, NULL),
- #endif
- …………
- } 3 [+ ^+ t! R8 a- H$ v) F/ j" C
$ A e8 V" W6 f
- i5 x/ F0 B# @/ @8 p F3 q
8 Z0 J9 Q! {: O) j7 T& E注意:在 kd_SensorList.h 和 SensorList.cpp 里面添加驱动的时候要注意,Sensor 添加的位置要一样。否则驱动会跑乱,轻则 ISP 参数不对,重则 Sensor 无法启动。7 h' q& W, ~8 Q/ _+ f
) c, d! G# z! F4 a5 O; v( J
/ i- B$ s+ b; S$ }8 d: @4.3 拍照图片尺寸设置5 h3 u2 d5 j/ i0 m, b- h
0 F& Q" H/ S% y% F! o
mediatek\custom\common\hal\imgsensor\ov5640_yuv\cfg_ftbl_ov5640_yuv.h6 v E* x3 l% I- M& s
6 s, q: m% M& @( L' ]$ V[cpp] view plaincopy 
; J& F! P6 p! S+ N, g) o- |
) w; P& Z4 |- w2 a! J/ o d! @0 ?( ]$ k$ 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
- )
4 J) H [0 }% l G/ g1 k
/ w" p" P& U+ q/ M- O
" j) d. ?9 o% L+ T) G4.4 Camera物理角度旋转
% A" [: a+ ?# I, h+ P0 X( Z( J: tCfg_setting_imgsensor.h
# I8 Q d/ \, W$ e; Q
, c0 X8 v, k: Z# x( {[cpp] view plaincopy & m$ a+ p; n& \/ U; R
" ^, `% @6 m+ A! g2 H& d5 I) Z& j+ P
, B5 q, F0 \9 e; \- /*******************************************************************************
- * 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;
- } : [5 ~2 I. {$ o. t9 }
& {# N- g" T- k, S( w& \# q: N
6 ~3 [: Y) \$ e# v# E( e9 |. L4 y& Q( q, J3 ]2 z
这几种都试过了,但都不行,预览和实际的都是成某种镜像关系。这是平台是提供旋转的功能。这个配置好了之后,如果方向不正确,可以通过驱动中的方向调整函数进行调整,如下: static void XXXXXSetMirror(kal_uint16ImageMirror)
( N% T5 m8 f5 u9 @6 n) }参考:http://blog.csdn.net/loongembedded/article/details/41679977
" M3 b2 k+ C, t$ }; e ( g6 C3 s4 z1 w' G& _0 H: t, B
) m: G. _1 e5 c! I% E4 U' o
看了OV5640的数据手册,寄存器0x3820和0x3821是用于控制图像发射(mirror)和翻转(flip)的,在u4Degree_0=270情况下,OV5640YUVPreview()调用OV5640YUV_Set_Mirror_Flip (IMAGE_V_MIRROR),预览和拍照后的预览都是OK,但拍好的照片在电脑上打开的时候发现是顺时针翻转了90度。
5 B, {% R5 \' i- J; ?, \http://bbs.csdn.net/topics/390837150
; t# ]7 S8 p' ]; [7 M ( i4 Z3 I0 s, v5 u7 r% d: R& E
可是我在OV5640YUV_Sensor_Init()调用OV5640YUV_Set_Mirror_Flip(IMAGE_V_MIRROR)却问题依旧,很奇怪。) D$ }! }; X! p% i" p1 {
$ ?+ ]/ h$ V' L5 \3 t$ k+ {
mediatek\custom\common\hal\imgsensor\ov5640_yuv\cfg_ftbl_ov5640_yuv.h: I& m$ @: m- `6 q( e6 m
, f, ^' z9 x H7 ~7 J* m[cpp] view plaincopy ! ^$ V3 V% y' X5 x5 u3 p2 [7 [
# a0 T( Z/ j- n8 s- M+ \# k, W) i" e, }
- /*
- // 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
- )
8 [$ H6 Z- U1 `: |& J- e3 a ; B4 i% e0 h' A% j+ s' y6 h
) f+ h8 h$ S* }& T; G5 g2 K" N/ [- A& |6 N
( f; V, \4 D/ g$ `0 n
$ r) x; N8 ?/ q' r* Y4 _我试过做上面的修改,但打开摄像头的时候,提示”Unfortunately, Camera has stopped”
' J5 u& J3 Z& o# I. y 9 X9 b( N) a6 Q$ j( w. t& Y8 f
- l i7 m1 d& W! h5 A
9 |$ v! _$ ~) V5 U# D参考链接:$ f0 p l$ g8 N+ ~
MTKAndroid Driver:camera
, c2 j+ U; H2 m- U/ I0 h" `http://blog.csdn.net/cbk861110/article/details/174372837 Q0 O: e/ s# c4 z
' L- Q# w, \7 i1 s
6 t! U' ~, g) {. M* fMTK cameraimage sensor driver
4 F, X: y- i5 A5 lhttp://blog.csdn.net/sunweizhong1024/article/details/8497790
- \ M" J$ P4 x3 {( m% j7 I , N0 V/ }* |0 y; P C: }
MTK平台的ISP架构问题
1 s: h+ e5 Y6 H. d& Ghttp://bbs.52rd.com/forum.php?mod=viewthread&tid=272727& u/ x" ]7 k( E( m+ n% h
* b, U, N: o" A. M3 d* }OV5640 YUV的自动对焦功能为何没有开启$ e6 L( ]- y3 X! ^
http://www.16rd.com/thread-10480-1-1.html
% U1 l# N5 w) N6 a
7 l; Y9 Q- ?; L3 UMTK Android Driver知识大全: `0 f) Q. T, o0 Y
http://blog.csdn.net/cbk861110/article/details/409318353 `' ^- U9 \4 G& h' j3 N* i
7 \ h+ V' n* H
mtk camera移植步骤
/ ?* h0 K2 e8 ]( Q7 q2 N$ B9 rhttp://blog.csdn.net/vasvas/article/details/39250473
) B5 V7 ?+ D% ^% a6 }8 M# Q% v ( f. y% }, K. s3 O p
关于 前置摄像头安装0度或者180度
@6 c2 E% t {. M- i& Yhttp://blog.csdn.net/kkkvvv123/article/details/8809823
! d# c6 f" z3 e8 k& {
6 s0 l; F" {# m4 Z1 _# x! dCamera 涉及的文件70" C+ H' s9 f. z( [* G5 V- F* j9 D
http://3y.uu456.com/bp-6dq1aascss2707221q2ef7es-1.html
' {; x o( k6 Z5 i1 |" k 3 V7 _0 x' v) h' b
OV5640全景模式预览倒180度,拍照正常的问题2 f l+ Y5 j" l' _
http://blog.csdn.net/guoguo295/article/details/21245815
2 l( I- Q2 t. j$ E
4 w$ }" S; n; c- y% e9 W3 @" T* L9 v% x3 S5 D% K
0 Y3 X1 D& _3 p5 A7 }/ ?6 A. `/ ~# m% m) e
6 G0 P+ k: P& R1 x
6 m C" e: m4 K5 W7 J$ l |
|