问题描述
ITS test_3a_consistency 测项目的:会让AE,AWB,AF auto收敛3次,然后分别查看AE,AWB,AF三次收敛结果最大差异值是否小于最大值的10%,如果小于最大值的10%认为pass,否则fail。
如果是AF 不满足要求,会报assert np.isclose(np.amax(fds), np.amin(fds), FD_TOL)
原因可能有以下几个:
1、af mgr 中,getFocusDistance 和setFocusDistance 误差很大,导致根据dac值换算出来的distance不准
2、此测项设TG 的full size下来,框很大,AF algo这边做damping补偿对时序的要求很高,受系统loading或者driver IC 稳定性的影响较大,容易出现三次对焦不稳定,dac差异大
3、模组发热,导致lens 焦点有温漂效应,三次对焦位置不一致
4、dac range过小,导致很小的dac值差异,引起大的distance差异。对对焦准确性要求更高
解决方案
对于以上四个原因solution分别如下:
1、打更正getFocusDistance 和setFocusdistnce的patch,让dac和distance的换算更准确(但准确性还是依赖于OTP的准确性)
P0.MP1 ALPS04296129 mt6771,mt6765,mt6763,mt6739,mt6762,mt6761,mt6757p,mt6758
P0.MP3 ALPS04290129 mt6771,mt6765
2、打algo的优化patch及af mgr对应的大框2帧一次的patch
P0.MP1 ALPS04382007 ALPS04354501 mt6761,mt6765,mt6739
P0.MP3 持续完善中,有更新再update
3、对于因为模组发热导致fail问题,建议测试前先进camera 预热10分钟再测试
4、对于dac range小的模组,由于在macro端distance 算出来会更大,允许的误差也更大,建议尽量靠近图纸做测试。但是不能超出google的要求。
5、如果确认以上patch或者都确认有打上或者确认没有问题,就要查看af的参数是否合理,是否能调得更准一点
[额外的知识]
1、如何确认是模组发热导致有问题
1)开以下adb 命令,抓取log
adb shell setprop vendor.debug.af_mgr.enable 1
adb shell setprop vendor.debug.af.enable 1
adb shell setprop vendor.debug.af.log.enable 1
adb shell setprop vendor.debug.af.enable 1
adb shell setprop vendor.debug.af.log.enable 1
2)修改test_3a_consistency.py脚本,把NUM_TEST_ITERATIONS = 3改成NUM_TEST_ITERATIONS = 10或者更大测试。
3)然后在main log中搜关键字:
AfAlgoC : [Speed] AFing0 move to
movelensto
Start processing commanddo3A
Finish processing commanddo3A
夹在Start processing commanddo3A和Finish processing commanddo3A之间的 [Speed] AFing0 move to里的数字就是最终的对焦位置
如果没有AfAlgoC : [Speed] AFing0 move to log,可能是有掉log,可以看Finish processing commanddo3A 之前的movelensto的值
如下log。
4)看其几次对焦结果跟后面几次的趋势,如果前面变化大,且朝着一个方向变化,到后面趋于稳定,表示有受温漂影响
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
44055 04-17 04:03:45.913307 4468 4914 I ItsService: [589050] Start processing commanddo3A 48177 04-17 04:03:46.355876 555 9082 I af_mgr_v3: #( 2, 1) MoveLensTo Dev(1) DAC(371) 49093 04-17 04:03:46.659933 555 9082 I af_mgr_v3: #( 10, 8) MoveLensTo Dev(1) DAC(367) 49182 04-17 04:03:46.680888 555 9082 I af_mgr_v3: #( 11, 9) MoveLensTo Dev(1) DAC(344) 49230 04-17 04:03:46.714386 555 9082 I af_mgr_v3: #( 12, 10) MoveLensTo Dev(1) DAC(326) 49278 04-17 04:03:46.748210 555 9082 I af_mgr_v3: #( 13, 11) MoveLensTo Dev(1) DAC(317) 49471 04-17 04:03:46.816024 555 9082 I af_mgr_v3: #( 15, 13) MoveLensTo Dev(1) DAC(326) 49617 04-17 04:03:46.849730 555 9082 I af_mgr_v3: #( 16, 14) MoveLensTo Dev(1) DAC(344) 49786 04-17 04:03:46.883841 555 9082 I af_mgr_v3: #( 17, 15) MoveLensTo Dev(1) DAC(367) 49926 04-17 04:03:46.917706 555 9082 I af_mgr_v3: #( 18, 16) MoveLensTo Dev(1) DAC(390) 50086 04-17 04:03:46.951070 555 9082 I af_mgr_v3: #( 19, 17) MoveLensTo Dev(1) DAC(416) 50242 04-17 04:03:46.985188 555 9082 D AfAlgoC : [Speed] AFing0 move to 356 (0) 50246 04-17 04:03:46.985252 555 9082 I af_mgr_v3: #( 20, 18) MoveLensTo Dev(1) DAC(356) 50942 04-17 04:03:47.167665 4468 4914 I ItsService: [590304] Finish processing commanddo3A |
2、如何知道当前模组的OTP是多少
搜log关键字readotp,如下log,inf表示远焦的dac,macro 表示近焦的OTP。一般AF 的dac range在400个dac左右,越大,精度越高。
如果dac range 只有100多,算是比较少的
1 |
48130 04-17 04:03:46.347904 555 9082 I af_mgr_v3: readOTP : [Inf]261 [Macro]471 [50cm]0 [InitPos]261 |
3、对于solution 1中的patch打上以后,在af_mgr.cpp文件中有以下code,如果模组没有烧录infinity 和macro的focus distance,要把fDistance_Inf 和fDistance_Macro 改成当时烧录dac值对应的位置
1 2 3 4 5 |
if (fDistance_Inf <= fDistance_Macro) { fDistance_Inf = 5000; fDistance_Macro = 100; } |