|
|
《CameraAF分析》
5 y' M) l4 |: b* Q J& K" i一、AFkernel代码分析:6 s: @- I1 ~7 f, V& i7 l9 s
涉及文件主要有:
& Y6 O- I5 L) B9 Dmediatek/config/mt6592/init.rc: C3 J0 ]1 f" w8 y4 I7 M8 `* w
mediatek/config/huaqin92_wet_b2a_tdd/at808p/ProjectConfig.mk
& ^3 L5 ?' l/ ]% y9 c2 Tmediatek/platform/mt6592/kernel/core/mt_devs.c2 g8 k, i% A$ G
mediatek /custom/huaqin_bsp/at808p/base/kernel/lens/ov8865af/OV8865AF.c' m* ?6 a1 N8 V7 v& O
mediatek/custom/common/kernel/lens/inc/OV8865AF.h
; v8 M4 O8 K2 L, f2 i! ] n
9 Z4 A, z5 H) I w5 i& l. Ga) mediatek/config/mt6592/init.rc; E7 X6 i) M/ o, V$ z N/ z
作用是来修改文件的权限和将该文件的拥有者改为system用户,添加如下部分:
2 q0 M! p& G0 M. _6 x: E" `4 \, d2 e1 L1 `1 j
[cpp] view plaincopyprint? 
2 U- f/ K* q5 \ J+ M, j: _0 ?/ W0 T4 e7 ~0 E$ }( Y
! C0 M5 Q9 E" m( W5 d: j, E }
- chmod 0660 /dev/OV8865AF
- chown system camera /dev/OV8865AF
1 i0 Z: m1 Z i' s% H1 m( A
' h1 R1 W+ M! O' @7 ?7 O/ m" {# j 6 v7 p. t( ^( U- ?
1 l$ B/ n' [: x+ ^5 g$ E7 V4 r
( U2 L) E4 I' S) W: ~b) mediatek/config/huaqin92_wet_b2a_tdd/at808p/ProjectConfig.mk
/ Z! K9 E( }! [" H5 t( v d修改部分如下图:
" h% a) M0 X1 M- A9 u$ M6 B1 K& B/ }见附件11图片: A5 R; O: p$ E, n/ ~7 p' m i: A
. Y, l k; n% Q! A6 B$ J; Jc) mediatek/platform/mt6592/kernel/core/mt_devs.c4 j: D R1 R: D6 n' W) }3 s* _
这个文件时用来注册平台设备的。
3 ~; _6 k! [! k; S5 _+ u在mt_board_init函数中添加% d- j. @: H2 d
' O+ x2 P) O k U) s[cpp] view plaincopyprint? % ^& n/ \9 I d# x+ K4 G2 m
, G7 P+ @& D) Y' H6 N
0 z& T5 B$ }; [2 F9 C) g- 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
; J( ?) s/ t2 D5 [0 e' y/ y% J6 u- N; O! x
; }* r$ s9 d- u
! ]+ V! H0 L$ f- r% R. U3 Y- j6 M( I1 q( {* A
3 L$ [/ ]6 ?& P" Q9 S9 f9 y[cpp] view plaincopyprint? 6 H- u/ z* Q6 p5 B
' u* o2 W( l/ g/ k
* _. k9 X2 B) Z- 1533 staticstruct platform_device actuator_dev1 = {
- 1534 .name = "lens_actuator1",
- 1535 .id = -1,
- 1536 };
1 l! Y/ h" l; t0 t1 J+ Y6 ^- k! |, M$ B/ k4 B$ U& @# C
F; i: H x0 s2 t% \) H" D: C5 t# `4 N" S" }) \
/ n" Z' m# N, S; J1 q
' a! C f9 @- M6 x" P- |8 C其中name “lens_actuator1”是用来和我们驱动文件中的name进行匹配的。8 f7 N/ |0 W0 c5 O0 h6 r; r
d) mediatek/custom/huaqin_bsp/at808p/base/kernel/lens/ov8865af/OV8865AF.c
/ ]& C0 i0 N3 O3 D重要说道驱动文件了,这个文件的头文件是:9 p! W( `- H# z" Q/ v. R5 g5 |
mediatek/custom/common/kernel/lens/inc/OV8865AF.h
1 x4 A' x& o+ n主要完成一下任务:+ g; }( ~! E* x$ D4 a
1. module_init(OV8865AF_i2C_init);——启动方式,也就是开机启动kernel后一段加载;
' X( z9 Q/ Q" j0 z7 t# j+ x( \2. i2c_register_board_info(LENS_I2C_BUSNUM,&kd_lens_dev, 1);;——挂载到I2C总线上;- ? P/ A, t7 g% d" ^6 x
3. platform_driver_register(&g_stOV8865AF_Driver);——注册平台驱动;
9 Q- h1 X2 X$ O2 S' ~
. M$ b: ?& C2 Y* ^[cpp] view plaincopyprint? 
$ F ?0 t2 \- K& }' C2 T0 k
; o% y7 {6 V: F! q2 N! q" |( a, v' a7 P7 ]
- 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 };
) I* C6 {, o: H0 r6 F2 o
1 o9 k; R, c4 C+ {
+ |) W. v! S$ D3 x+ l4 E* j/ z; E, L" n
1 I9 Y# V Q' \; |0 z# l& l+ f4. 然后进入OV8865AF_probe,加载i2c驱动:
) X) ]$ I8 f: x8 y7 l4 _, {1 X# n" Z& v& ~) P1 q, r$ V) p3 U5 \
[cpp] view plaincopyprint? M# D) c0 U+ _, K6 t
7 H+ Y, V5 U6 l& H
" o8 Z( j' v4 U$ v! `5 n; l- 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 };
& p% ^* G/ r1 ?. H9 V6 H
" M3 h2 J# M @% d- D
7 y) \3 C9 F! P6 M u" A- S* o' J3 f, R
8 o) j0 }. |1 h4 B
9 d. r, P& Z8 X* m+ m8 }3 i5. 再就是OV8865AF_i2c_probe,就是注册字符驱动,以此就连接到我们的&g_stOV8865AF_fops,给上层提供Ioctl接口;% u! l6 ?" L1 V( \3 f
9 C0 k$ d" Y: p4 s0 F# \! _4 a& n6 P$ P9 G; I' X7 m
二、AFHAL层分析:
+ G* ] c# X4 ^% g) J a* mHAL层涉及的文件:
@6 t# s% Z1 L; { P3 Zmediatek/custom/common/hal/inc/camera_custom_lens.h
' w) `' i4 A5 A1 i, T& Omediatek/custom/huaqin92_wet_b2a_tdd/hal/lens/src/lenslist.cpp
! s, c7 f3 V( s+ Tmediatek/custom/huaqin_bsp/at808p/base/hal/lens/ov8865af/lens_para_OV8865AF.cpp; o5 o/ Q O' y6 p2 g" H
) ?- F! a- {" D/ o J
a) mediatek/custom/huaqin92_wet_b2a_tdd/hal/lens/src/lenslist.cpp' i3 @3 M& m& C
添加LensList:
4 u& h$ @2 e. [( U( J5 j) X. b
8 [$ O9 o0 d1 X1 n( O[cpp] view plaincopyprint? 
1 m6 X3 w+ g/ X2 r8 ^# p3 |1 ?0 c( N9 c5 F! g n
6 L n+ t# T% m- 70 #if defined(OV8865AF)
- 71{OV8865_SENSOR_ID, OV8865AF_LENS_ID,"OV8865AF", pOV8865AF_getDefaultData},
- 72 #endif : V) C, E' z Q1 T, h9 P
: f/ U: L5 o- ]3 s; ~
% w2 q& m; g6 \% |
9 \; H1 m$ |( V0 n+ Q0 e0 AOV8865AF_LENS_ID 在camera_custom_lens.h加以定义,
# X% b% X$ ?$ G& g. q" b% m$ v o7 b% N- Q! A7 Q
[cpp] view plaincopyprint? 1 |9 e: G |$ G. l4 p p
, n( a% m0 o# j
7 V+ L9 w7 z8 n4 W2 Z0 l- 如:#define OV8865AF_LENS_ID 0x0009
" m* Z9 o8 [, T7 h- y7 ]7 S0 z% o; u% L* `/ Q$ D1 z5 Z5 G: ^+ ~
6 i0 R( \- e) ]
2 ?5 j0 {0 Y2 M& U* kOV8865_SENSOR_ID 是kernel层定义的:6 v( P$ X. F2 v. ~' U% z
mediatek/custom/common /kernel/imgsensor/inc/kd_imgsensor.h
8 I9 [+ \: F" M9 Y# a! F是跟我们的camera驱动进行匹配的。
6 D4 c4 _& s& `* o! z& `' rpOV8865AF_getDefaultData是在lens_para_OV8865AF.cpp中完成的。
/ k4 P4 Y0 N& l/ J, j+ b. O
: N7 R( a/ j2 P+ K% M" ?
{2 k* e8 ]1 _4 R* r; d |
|