|
《CameraAF分析》4 Z, g% {1 G6 B
一、AFkernel代码分析:
! c/ ?# H, D" ~. D; u涉及文件主要有:: P' l% d, C/ H Q; q, p
mediatek/config/mt6592/init.rc
' H/ f/ }8 ^( y9 q* amediatek/config/huaqin92_wet_b2a_tdd/at808p/ProjectConfig.mk
0 Q1 s' D* h9 m) Cmediatek/platform/mt6592/kernel/core/mt_devs.c$ W2 d/ A- P! s8 I) n
mediatek /custom/huaqin_bsp/at808p/base/kernel/lens/ov8865af/OV8865AF.c
$ w. g( S) O; kmediatek/custom/common/kernel/lens/inc/OV8865AF.h
! i. Y+ j& P0 y" s4 J3 d3 ^* @. V, [6 ~# W% \2 ^- {
a) mediatek/config/mt6592/init.rc
* z1 t) ]: l7 s作用是来修改文件的权限和将该文件的拥有者改为system用户,添加如下部分:
. K- t, k" P! L; q c* T9 }/ x' J6 |, N" H
[cpp] view plaincopyprint? `' f9 E3 I" v, J3 P9 y& u
2 Z$ W" q: w; R' o1 e# g
5 x/ o! B$ z- [& b j- chmod 0660 /dev/OV8865AF
- chown system camera /dev/OV8865AF ) R5 e% B4 Q( U. T5 s0 T- }5 G
8 w6 {% n) j) i7 Z; {
3 k8 Y# F% V( C/ k r p l( R
0 v6 H, `/ [3 E8 ]1 {0 Z
1 _; P2 B, ~/ m+ y% Yb) mediatek/config/huaqin92_wet_b2a_tdd/at808p/ProjectConfig.mk
3 k) v) W! O/ S( w修改部分如下图:
2 v9 V; u, c5 @* P见附件11图片
" s! s' ?1 T6 l# r: _9 e* \2 k! D
2 ]5 J+ v: A R0 N8 sc) mediatek/platform/mt6592/kernel/core/mt_devs.c
9 p* o7 ~" x% b7 g. n7 r这个文件时用来注册平台设备的。
4 o) f% G$ t" @% h) t) y在mt_board_init函数中添加( H# n2 I0 q# ~5 k
8 P4 O4 W% }* j( X0 u) F$ Q[cpp] view plaincopyprint?8 O1 Y* Y* f2 b
; K, }# k9 [3 T
1 t8 m6 F$ R- X& Q5 B- 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
! {8 R$ ^- L4 q, b; ]7 b: Q J, z4 }+ L
8 W" f! a0 C- e. w" g2 a
) h6 p6 S3 b6 L0 D. S: v
# K- U4 L. G" v' S8 ]; m
8 A8 r5 d( _9 f" h O P[cpp] view plaincopyprint?% X) f, l" a& r$ x: v
& T2 V) g7 G* ~5 r+ i3 J3 [
6 r2 {. u0 p2 E
- 1533 staticstruct platform_device actuator_dev1 = {
- 1534 .name = "lens_actuator1",
- 1535 .id = -1,
- 1536 }; 1 [* k! x+ O( q6 \+ |* z
8 R. f. w- q$ _7 f
+ B$ ^, O" U) i$ [- X
% q8 B: t: g. X! q K) `+ m
) A p0 {& V R! H; T% d4 @0 I* Z8 o; I( |. H; z5 E
其中name “lens_actuator1”是用来和我们驱动文件中的name进行匹配的。% M( g' k7 b6 [6 n* k
d) mediatek/custom/huaqin_bsp/at808p/base/kernel/lens/ov8865af/OV8865AF.c: R& ]2 O( @& ]% T {! c
重要说道驱动文件了,这个文件的头文件是:1 a V! ? C. S) n9 b5 p
mediatek/custom/common/kernel/lens/inc/OV8865AF.h/ |: }' K5 N" c3 [4 |/ T
主要完成一下任务:
3 ]& t5 B0 m ]& T- ~& L1. module_init(OV8865AF_i2C_init);——启动方式,也就是开机启动kernel后一段加载;" I" i) k/ c: D
2. i2c_register_board_info(LENS_I2C_BUSNUM,&kd_lens_dev, 1);;——挂载到I2C总线上;
$ @. m, r* r ~7 B9 R3. platform_driver_register(&g_stOV8865AF_Driver);——注册平台驱动;
, p4 @. J9 F) F4 Y& v: q* O9 H G9 i& z$ r, a# l8 i1 O" @
[cpp] view plaincopyprint?
( ` p+ a' T6 h, Q, Z4 I2 Q5 t& f; M6 X/ s
]6 b4 D0 e0 q9 @4 L1 C# {4 m6 L- 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 }; 3 H/ _4 |6 l$ `' g. k2 T
( w. O# X) t4 m0 d, N
$ J8 y ?9 Z; J; B* q1 H
# o( W$ @( E7 u9 k' L, C+ F! _5 k/ u1 ^: P$ A' _' L; s: ?
4. 然后进入OV8865AF_probe,加载i2c驱动:
% B& Y) F" O) x5 z
, R8 ]& H$ U2 G( N, R5 F[cpp] view plaincopyprint?
1 t4 v* {$ j+ j* K7 a1 `: p( w. K5 [/ w% s7 X' \$ g# R; ^, U
, K1 R) N3 b& O5 u8 Q
- 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 };
' N- |2 E4 N2 X8 d- F
7 i# k; J5 P8 z! N 4 P* J2 u! C% ]" J1 `2 `* N; I
C; f: c: i3 h% z
; m, J: a- T8 Y, d& N! |
8 ~7 M, n4 x+ X* d# b ^8 W$ h. D$ r9 d5. 再就是OV8865AF_i2c_probe,就是注册字符驱动,以此就连接到我们的&g_stOV8865AF_fops,给上层提供Ioctl接口;
; W0 u" u' ?% N5 m6 w$ C
5 ~- J. w8 u: u; ?, ]: `! T. I9 N8 g" U1 O# y- G9 G. c; Q% B
二、AFHAL层分析:6 [+ D7 z9 @. _, a
HAL层涉及的文件:1 x* |% l% ?7 A/ m) Y) v/ `
mediatek/custom/common/hal/inc/camera_custom_lens.h" W% w# z* J, p/ U& m% K
mediatek/custom/huaqin92_wet_b2a_tdd/hal/lens/src/lenslist.cpp3 `6 m# N4 O$ L J0 i4 r
mediatek/custom/huaqin_bsp/at808p/base/hal/lens/ov8865af/lens_para_OV8865AF.cpp. w) o2 O/ z* C8 k
1 X% Z/ w, ?) e
a) mediatek/custom/huaqin92_wet_b2a_tdd/hal/lens/src/lenslist.cpp
: [& W5 ? P' f2 y# n' J; v7 \' m) M添加LensList:: W, n! q- K* Q7 O+ ?
" r7 S5 E7 \# p8 i; |[cpp] view plaincopyprint?
6 Y4 u4 A1 p. v7 j, W- f
0 J# r' P/ x$ X# k k- W. Z5 V P: M! K1 o" ]# N% [
- 70 #if defined(OV8865AF)
- 71{OV8865_SENSOR_ID, OV8865AF_LENS_ID,"OV8865AF", pOV8865AF_getDefaultData},
- 72 #endif + C3 M W# S& A1 _0 O! v. @" A
5 Q4 ~2 ?5 o" i3 E& o
7 R$ d8 f/ e! X! h: u
( a# [5 Y9 \8 y$ v- _4 ~OV8865AF_LENS_ID 在camera_custom_lens.h加以定义,3 C+ L3 U! l/ n% I3 K
m' {; f7 h5 _5 a0 M! Q" _[cpp] view plaincopyprint?3 m8 `8 g# X* {# i/ e7 ^, ` O
+ n# A1 l( F8 s. y7 a5 Y9 B/ a- o8 N: }3 c; Z
- 如:#define OV8865AF_LENS_ID 0x0009
% o8 e/ k, @- P2 b4 d; n" [7 m& b# U7 ^9 p3 e/ \; M% ]2 O
% ~. Z, b. T. ?) ^: Y% o. S+ _5 [6 ^
6 J' p y: P/ q6 b$ V) I) ] ^: mOV8865_SENSOR_ID 是kernel层定义的:
% P* g, m! r2 L! B6 lmediatek/custom/common /kernel/imgsensor/inc/kd_imgsensor.h/ _* p/ x: e: H% [
是跟我们的camera驱动进行匹配的。8 l; l: L/ S. g8 D
pOV8865AF_getDefaultData是在lens_para_OV8865AF.cpp中完成的。
, w+ |8 d1 f" c, q& I" X( y) l+ Y: b) h9 i6 C' K0 d! x4 d
' ^9 ]4 t. v5 A& P
|
|