|
|
《CameraAF分析》5 v2 u2 U9 H/ I+ b+ }5 j
一、AFkernel代码分析:
2 g: Z0 ~2 n4 Z: X; d涉及文件主要有:- H& c1 D8 _( [; u) j7 x/ z
mediatek/config/mt6592/init.rc
# S4 d9 |! l1 e" I, O, ^mediatek/config/huaqin92_wet_b2a_tdd/at808p/ProjectConfig.mk# a S( ^( u. f! n8 W; f; p7 }
mediatek/platform/mt6592/kernel/core/mt_devs.c
) a! E- g1 y0 k. o# X- X9 hmediatek /custom/huaqin_bsp/at808p/base/kernel/lens/ov8865af/OV8865AF.c. X7 n" |! q `% o4 F( a, s
mediatek/custom/common/kernel/lens/inc/OV8865AF.h" B5 T [! c" m) I7 }2 D' Q
2 k+ J3 R- _/ @
a) mediatek/config/mt6592/init.rc
' t& y; w/ c8 B2 h作用是来修改文件的权限和将该文件的拥有者改为system用户,添加如下部分:8 Q% e$ Q2 F1 ^/ z3 H; B( T; x
3 B: Y% v3 w$ A" K8 e* K7 s[cpp] view plaincopyprint? 
/ _6 p) r) S \
8 c3 b" l2 |6 P& O& Q: w- W4 g9 n7 g: J1 e. @0 x5 Z
- chmod 0660 /dev/OV8865AF
- chown system camera /dev/OV8865AF
! V9 Z, S, v6 B" l4 f: m& f9 l% p: O4 w& P0 Y7 @; }
) U8 n4 n0 K7 U4 ~7 Q
( _7 }% M) ^1 ]! y2 h% T" X9 y6 w8 N7 L' E
b) mediatek/config/huaqin92_wet_b2a_tdd/at808p/ProjectConfig.mk8 T7 p' G2 p g5 Y
修改部分如下图:
; A! }' m" I9 [8 w! R- i见附件11图片& S$ a$ p8 D; x9 c
5 @, b ~; `7 o, C
c) mediatek/platform/mt6592/kernel/core/mt_devs.c
! r, f- ~- T d/ Y4 e& P" i1 A- d这个文件时用来注册平台设备的。1 y+ n3 L& `3 @. p* P4 E" N
在mt_board_init函数中添加) U- o% \* k' A Y1 Q
/ ~/ H4 c) N" X* N[cpp] view plaincopyprint? 0 ?7 a& r) t. u5 Q; C$ ^, B
: ^; W. L0 x+ B* n% `1 V" a& M( J6 y+ t C# Z5 S
- 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
+ i5 ~& h& t6 D
9 A' S, S, _! `9 {' G / X+ |2 m$ c& O9 K0 T) h
7 m4 E# \0 {* a5 H0 v$ S/ a5 Y# K. ~) K; T
& |1 M! k/ L; ]8 n9 Q9 @! u
[cpp] view plaincopyprint? 3 ^$ S3 @; g4 I1 i n2 R, y o
0 n4 n) q+ l) u" p( t j
# h4 u$ t8 J2 Q' R+ s3 e# V6 E7 {- 1533 staticstruct platform_device actuator_dev1 = {
- 1534 .name = "lens_actuator1",
- 1535 .id = -1,
- 1536 };
5 Q) O7 x" \+ g% L% m5 b
A, X( c$ k+ x7 o- r 5 i0 D4 x) k9 _/ Z5 h' h
9 ~3 Y+ Z* P" ]
6 i8 ]6 E) k' g& V( }2 m
8 u$ ?! ^+ Y) Q! \, v! _) T' p其中name “lens_actuator1”是用来和我们驱动文件中的name进行匹配的。- `1 s" N5 s$ w/ X
d) mediatek/custom/huaqin_bsp/at808p/base/kernel/lens/ov8865af/OV8865AF.c. s- H, Y6 P# N6 P5 Y
重要说道驱动文件了,这个文件的头文件是:* P5 j Y6 w$ t, u, s0 o; p; Q, p( N7 E
mediatek/custom/common/kernel/lens/inc/OV8865AF.h
$ `. w) \6 j+ F4 X# \# ~主要完成一下任务:
$ r) y( {2 @* K9 j2 I1. module_init(OV8865AF_i2C_init);——启动方式,也就是开机启动kernel后一段加载;
- G5 f/ y6 y, n2 g8 b2 |+ n9 b2. i2c_register_board_info(LENS_I2C_BUSNUM,&kd_lens_dev, 1);;——挂载到I2C总线上;
1 M0 o. _ K3 }( H% x# e/ J. k; z3. platform_driver_register(&g_stOV8865AF_Driver);——注册平台驱动;
4 |& f7 e/ I2 E( R/ v8 \9 z# T8 r5 g
[cpp] view plaincopyprint? 
( P4 D3 G3 u5 k( K9 i' a3 F+ s
* h& T0 F9 G. [2 V3 v
6 [: k: }$ \" A- 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 }; # ?9 e0 F; v* [1 ]2 C/ N) P8 o
Q* G; w! M( S/ F$ O; g" M2 \ 2 A8 _) b' o9 F2 A+ H
6 v% U& Z! E# M# W: I* w
3 d2 h7 W& j% x4. 然后进入OV8865AF_probe,加载i2c驱动:/ c: N: D9 s" [+ Z: _# u- q
% H x, C! d* y7 m+ Q) A[cpp] view plaincopyprint? 
: e( J; S3 B; @. R
5 k& ?+ }: Z' c! K4 H
: v6 h& p/ h/ w: w# b+ x- 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 }; ) f% A; u( H" L! D
4 R6 u! \* W- n' u1 T
% F; }1 }- R, @& ~) G# F6 J
2 N q0 Z1 Q' ^4 c
& ?& N- t1 d6 T& O1 Z# i% W3 Q$ t8 _% q$ d2 P, _
5. 再就是OV8865AF_i2c_probe,就是注册字符驱动,以此就连接到我们的&g_stOV8865AF_fops,给上层提供Ioctl接口;
$ K6 Z, ~0 X. E# b9 e
7 i6 p7 L, ^7 W- f: R
5 _$ ^; U- Q- t' i二、AFHAL层分析:7 z) N) _4 P& x$ ?$ H
HAL层涉及的文件:
% G% ?; N" p: D- X& [- [mediatek/custom/common/hal/inc/camera_custom_lens.h: W9 c1 Q% n( F. b( E
mediatek/custom/huaqin92_wet_b2a_tdd/hal/lens/src/lenslist.cpp; b1 Z% A3 c6 u y, N
mediatek/custom/huaqin_bsp/at808p/base/hal/lens/ov8865af/lens_para_OV8865AF.cpp" A0 w# \0 \* u0 h: b4 P
( K/ m# x. @ F _1 j0 e4 J) `: ua) mediatek/custom/huaqin92_wet_b2a_tdd/hal/lens/src/lenslist.cpp
7 v/ T& i; i" ?; N添加LensList:
! v/ b! u% ~4 X) I, f
8 {# S( q5 |. c" D3 j( y[cpp] view plaincopyprint? 
# J9 A8 O+ ` f5 W# q. u, A& C) J3 y- U9 B6 X; ]
/ W) l! k4 @0 \
- 70 #if defined(OV8865AF)
- 71{OV8865_SENSOR_ID, OV8865AF_LENS_ID,"OV8865AF", pOV8865AF_getDefaultData},
- 72 #endif
4 N" X q4 p) \+ x n. ^3 q4 \6 G; C2 _8 \) \9 d9 n1 V+ G+ g
# I! Y' e/ O# Q! g0 T
: w) i% I$ X$ M1 J) E/ OOV8865AF_LENS_ID 在camera_custom_lens.h加以定义,
& U7 d) t& W ^# l; T8 f+ w) m5 \' |
/ s6 A% e9 }# I- F! c0 Q! D+ |[cpp] view plaincopyprint? 
( U* ]3 E8 f, a1 U% Q- W; s( T7 c" k' f. h
) s: |; i9 W2 a9 y1 [; W6 q" r
- 如:#define OV8865AF_LENS_ID 0x0009
3 w6 f2 J! u& w% Z* U4 l! d: X1 z7 I6 g4 b: z. H
( F" e% I5 ~6 |5 C
6 P( ]' \7 w" V( ?
OV8865_SENSOR_ID 是kernel层定义的:: H' j3 i2 x& |" p0 Z3 S
mediatek/custom/common /kernel/imgsensor/inc/kd_imgsensor.h
1 c3 E* y) O* Y. M( Z8 k5 ^是跟我们的camera驱动进行匹配的。' C' v* T* X8 v: Q V0 o
pOV8865AF_getDefaultData是在lens_para_OV8865AF.cpp中完成的。
4 {, [4 u# i6 N5 d5 d
8 V, ]0 t! m6 Q6 m) ?
1 o+ Z L$ y+ r |
|