|
|
《CameraAF分析》
. O" m7 B# H) }9 K; }9 ]# ]一、AFkernel代码分析:; w& n4 `& b+ j8 w. D
涉及文件主要有:$ v! N9 X; F; Z) A- T5 [
mediatek/config/mt6592/init.rc3 }7 z' |, w$ g w, R
mediatek/config/huaqin92_wet_b2a_tdd/at808p/ProjectConfig.mk# h1 E% w* r4 M9 a4 ~
mediatek/platform/mt6592/kernel/core/mt_devs.c/ X2 V3 j5 a$ y% U3 s; R
mediatek /custom/huaqin_bsp/at808p/base/kernel/lens/ov8865af/OV8865AF.c
7 ? G4 k& G( \" Z" k5 v3 Dmediatek/custom/common/kernel/lens/inc/OV8865AF.h4 ], t2 V- M' i5 Y4 Z& ^, Z
) f ]; s6 q$ W; W
a) mediatek/config/mt6592/init.rc
- }9 s6 Z3 i0 `, M+ U4 c1 z$ g* a% N作用是来修改文件的权限和将该文件的拥有者改为system用户,添加如下部分:& N; T) P" a! }+ x
9 R- u3 ^; l7 J% o1 C( A5 q[cpp] view plaincopyprint? $ Q5 r" ], D Q6 G0 P
6 C) l l+ Q: _) u _
* S% @1 \( H t- chmod 0660 /dev/OV8865AF
- chown system camera /dev/OV8865AF 7 g I+ R, l& d9 ]" z' q
& R* |; }' R+ v3 q" D7 ]& @$ n5 d
# N+ u! u- V. _' l" H! \
1 d! C9 h, f1 R5 }
3 h) a( A) t4 ~# vb) mediatek/config/huaqin92_wet_b2a_tdd/at808p/ProjectConfig.mk
! Y" l; n; h) {2 o修改部分如下图:
. V; B4 H- U3 p4 q/ [/ Y$ W. F见附件11图片
$ P5 v- F, U$ ~8 k+ Q" B4 t. p2 M) y& F2 X) c$ V- K
c) mediatek/platform/mt6592/kernel/core/mt_devs.c6 C3 b |3 ], S; M& F+ q
这个文件时用来注册平台设备的。
0 ]' H- r+ A- y3 o+ v9 n在mt_board_init函数中添加$ V1 g& J( ?3 o7 Q- F; ~
6 x, K# ?: B! p9 T9 O$ a& a9 d
[cpp] view plaincopyprint? 
$ T4 G- K5 G; ?! `8 z& A/ P# s7 ] A5 U
- v1 m, o4 o5 N- L% W, d9 c- p6 x
- 2197 #if 1 //defined(CONFIG_ACTUATOR)
- 2198 retval = platform_device_register(&actuator_dev);
- 2199 if (retval != 0){
- 2200 return retval;
- 2201 }
- 2202 retval = platform_device_register(&actuator_dev1);
- 2203 if (retval != 0){
- 2204 return retval;
- 2205 }
- 2206 #endif 3 {2 k2 [$ I2 g! q
2 X, g& }& X. i# S8 k
: J; a0 f8 }' v
3 n" ~' W d3 Y8 [$ b
8 P B# ?. M# k4 ?" M8 l. W
5 [! F' b' U' i5 y5 a
[cpp] view plaincopyprint? / {# t; m2 f4 ~: N5 Q
5 `6 \; l0 L; h8 w: f4 _
: x, `5 c: c3 @0 y/ v9 x0 a- 1533 staticstruct platform_device actuator_dev1 = {
- 1534 .name = "lens_actuator1",
- 1535 .id = -1,
- 1536 }; 3 Z' N% \$ t# Q# o5 ^$ p# k
8 h' ]. C/ U. s/ p, @
9 M( o) ]% q# e# e4 y5 a; Q# Y' k2 A- P. y: n3 m8 m+ R2 I
) o/ i" g2 {5 S
+ k2 B3 k; O Y
其中name “lens_actuator1”是用来和我们驱动文件中的name进行匹配的。6 I1 Y0 c- F9 O) @& ?
d) mediatek/custom/huaqin_bsp/at808p/base/kernel/lens/ov8865af/OV8865AF.c6 t# Q; e% n, d' w3 n
重要说道驱动文件了,这个文件的头文件是:
, \. W8 a8 M, u# q) a! t( }mediatek/custom/common/kernel/lens/inc/OV8865AF.h
/ Z; ^3 [( s W2 G主要完成一下任务:
5 H, z6 t9 o1 U1. module_init(OV8865AF_i2C_init);——启动方式,也就是开机启动kernel后一段加载;
9 p$ W+ Y+ W# Y/ d3 r7 ]3 f/ R8 q) w4 n2. i2c_register_board_info(LENS_I2C_BUSNUM,&kd_lens_dev, 1);;——挂载到I2C总线上; B0 T& S* v+ x
3. platform_driver_register(&g_stOV8865AF_Driver);——注册平台驱动;- s B$ \; x) c. n3 u" I
- G E: d4 w/ `) r6 |! r[cpp] view plaincopyprint? 
) ]) ?; ]9 ?, A/ N8 p, v# n: Y, j; {: p3 C. M! ~7 g) R
! ~ o+ l7 } _
- 491 static structplatform_driver g_stOV8865AF_Driver = {
- 492 .probe = OV8865AF_probe,
- 493 .remove = OV8865AF_remove,
- 494 .suspend = OV8865AF_suspend,
- 495 .resume = OV8865AF_resume,
- 496 .driver = {
- 497 .name = "lens_actuator1",
- 498 .owner = THIS_MODULE,
- 499 }
- 500 }; : P; f8 R5 P' J7 L5 [8 s5 k
% P4 g! C) D% i8 X4 }6 \
+ R: f1 t" W9 z. s" r0 G+ g) [
$ g) k4 W% _$ n; m: Q) p
# |2 m: X, i* d
4. 然后进入OV8865AF_probe,加载i2c驱动:
H$ m4 U2 G8 V) f3 b+ b) I5 m
/ V, `" G! h! R' K" d+ K+ v- x[cpp] view plaincopyprint? 1 V9 j. p" q1 x& h- {
8 {! i+ ]+ V$ @8 C
9 @0 o0 y3 B) G1 N- 469 static intOV8865AF_probe(struct platform_device *pdev)
- 470 {
- 471 returni2c_add_driver(&OV8865AF_i2c_driver);
- 472 }
- 423 struct i2c_driver OV8865AF_i2c_driver= {
- 424 .probe = OV8865AF_i2c_probe,
- 425 .remove = OV8865AF_i2c_remove,
- 426 .driver.name = OV8865AF_DRVNAME,
- 427 .id_table = OV8865AF_i2c_id,
- 428 };
7 P# I* e4 m5 U3 W3 W9 I5 [* r+ E& t0 l# b5 L3 X
$ ]' A$ X1 ~3 n$ j. Q9 E- V
+ J' O: ~+ w5 X
5 i2 _- w- q3 w: D N6 y# T1 ]! |
( I# _0 H1 c, [; d9 f5. 再就是OV8865AF_i2c_probe,就是注册字符驱动,以此就连接到我们的&g_stOV8865AF_fops,给上层提供Ioctl接口;" x$ `7 n# `# x7 Y
" W' Y# n: F+ o; k5 F- o
3 L7 q8 ], ]" @- D/ w& V, O# o二、AFHAL层分析:: a0 m" m1 C6 Y. [9 a
HAL层涉及的文件:" h J5 A! K, |1 c* q0 \
mediatek/custom/common/hal/inc/camera_custom_lens.h
) o. R( b! L5 b: Omediatek/custom/huaqin92_wet_b2a_tdd/hal/lens/src/lenslist.cpp" ~) e e, r: w$ s' J
mediatek/custom/huaqin_bsp/at808p/base/hal/lens/ov8865af/lens_para_OV8865AF.cpp
' d4 G f& w$ K! D: R! k; q- @, e* S8 v
a) mediatek/custom/huaqin92_wet_b2a_tdd/hal/lens/src/lenslist.cpp
6 D3 ^ F d# B& z添加LensList:
' m! V: q$ }- p9 t2 T8 q2 V# p' C: Q( C3 A9 k% c
[cpp] view plaincopyprint? 0 X, g5 S1 {- W& B' O. s
2 Y/ m# R* `0 u
" U! H) y: Y5 z% ^0 D$ V( E* f% y
- 70 #if defined(OV8865AF)
- 71{OV8865_SENSOR_ID, OV8865AF_LENS_ID,"OV8865AF", pOV8865AF_getDefaultData},
- 72 #endif : [( L3 b9 ^: V5 c4 ?! V
6 q+ R9 A/ j8 ^
: r: H! o2 X2 V1 _, T: P0 O1 u
8 l% Z* O$ u: V. l7 B4 [. V
OV8865AF_LENS_ID 在camera_custom_lens.h加以定义,' b5 T0 }, ?' S2 K: k* T6 x& o" X" Y
0 V0 T: h( s/ F$ L5 I& B5 |[cpp] view plaincopyprint? 0 Z1 ~$ n! U% R/ K8 v( W
0 G" {' D# V- M
2 M0 e1 R+ L2 U2 ?# ~- 如:#define OV8865AF_LENS_ID 0x0009 ! B$ y! b+ \+ E# h7 ]" e; j
0 A. K/ I% H3 d
! x" k& s9 s' ^5 E% X* D2 K1 t$ B, N
OV8865_SENSOR_ID 是kernel层定义的:4 ^$ p6 u2 g$ t$ ~; K
mediatek/custom/common /kernel/imgsensor/inc/kd_imgsensor.h/ y) X" f) ]2 y. w
是跟我们的camera驱动进行匹配的。5 s- e6 v. O O* K1 ^
pOV8865AF_getDefaultData是在lens_para_OV8865AF.cpp中完成的。7 G# c p) T* L! o
; E3 l7 X# x' l( O
, A2 w X; r8 T8 J D |
|