MTK(Android)Flash calibration issue分析

准备工作:

S1:检查校准环境是否符合标准

全黑的场景,对准灰卡或者白墙20cm~25cm,保证灰卡和白墙能填满整个FOV;
或者黑盒子底部是灰卡,周围是不反光黑布,且顶部距离底部20cm~25cm,灰卡需要填满FOV;盒子顶部开洞,且calibration时用黑布盖住,以免漏光进去。

S2:请先确认使用的calibration 命令及data 路径是否正确

请参考FAQ21526[Flash Calibration]Android P Flash calibration command & calibration data path

Full calibration流程:

先不打灯的情况下获取Y值,要非常小,暗环境,否则不会继续做calibration;
calibration之前,直接打最大duty,看Y是否在180~220,如果不在,则不会继续做calibration;
当在180~220之间,拿出这组exp作为fast calibration的资料[防过曝];
然后fix住AE,从duty 0开始打闪到dutymax,生成eng tab和fwb tab;

注意:此处有两个条件是可能不会继续做calibration的,第一个是对全黑环境的要求;第二个是对最大duty打闪时亮度的要求。

问题一: 校准时不能正常打闪

首先 check driver porting 是否异常

Step1: 请在贵司$KERNEL/arch/arm64/boot/dts/mediatek/[PLATFORM].dts文件中搜索flashlight,若查到如下配置:

请先确认参数参数是否符合预期?若未查到,请直接查看Step2 配置。

decouple 设置:1: Single LED; 0: Dual LED; 如果只有一个LED,请同时删掉channel 2 的配置;
channel中type设置: 0: rear LED set; 1: front LED set
channel中ct设置: 0: high color temp; 1: low color temp

Step2: 请在贵司$KERNEL/drivers/misc/mediatek/flashlight/flashlight-device.c中查看对应平台配置的是否正确:
如下所示:
在这里插入图片描述

type, ct, decouple 含义参考Step1。

其次,检查Flash 配置是否正确

Step1: Set Single Flash or Dual Flash

请在\vendor\mediatek\proprietary\custom$platform\hal\flashlight\flash_custom.cpp 该文件中搜索cust_isDualFlashSupport() 函数,确认配置是否正确?

注意: return值设定: 0 single flash, 1 dual flash.

Step2: Check Current Configuration of Kernel Driver

请检查$kernel\drivers\misc\mediatek\flashlight\flashlights-$Driver_IC_name.c文件配置
以flashlights-mt6370.c为例

#define MT6370_LEVEL_NUM 32
#define MT6370_LEVEL_TORCH 16

static const int mt6370_current[MT6370_LEVEL_NUM] = {
25, 50, 75, 100, 125, 150, 175, 200, 225, 250,
275, 300, 325, 350, 375, 400, 450, 500, 550, 600,
650, 700, 750, 800, 850, 900, 950, 1000, 1050, 1100,
1150, 1200
};
MT6370_LEVEL_NUM设置: MAX duty num;
MT6370_LEVEL_TORCH设置: MAX torch num;
mt6370_current设置: currenttable
注意table 的个数必须和MAX duty num 相同;

Step3: Set Strobe/Pre-flash/Main-flash Duty

不同平台设置参数位置有所不同:

1)Flash 配置

ISP5.0以前 \vendor\mediatek\proprietary\custom$platform\hal\flashlight\flash_tuning_custom.cpp

static int FlashIMapFunc_main(int duty, int dutyLt)
{
// TODO: setup duty current
int dutyI[] = {
22, 46, 70, 92, 116, 139, 163, 200, 250, 300, 350, 400, 450, 500, 550, 600, 650, 700, 750, 800, 850, 900, 950, 1000, 1050, 1100
};
// TODO: setup duty current
int dutyLtI[] = {
22, 46, 70, 92, 116, 139, 163, 200, 250, 300, 350, 400, 450, 500, 550, 600, 650, 700, 750, 800, 850, 900, 950, 1000, 1050, 1100
};

FLASH_PROJECT_PARA& cust_getFlashProjectPara (int aeScene, int isForceFlash, NVRAM_CAMERA_STROBE_STRUCT* nvrame)
{
static FLASH_PROJECT_PARA para;
para.dutyNum = 26;
para.dutyNumLT = 26;
ISP5.0 及以后 \vendor\mediatek\proprietary\custom$platform\hal\flashlight\flash_tuning_custom_main.cpp

static int FlashIMapFunc(int duty, int dutyLt)
{
int dutyI[] = {22,46,70,92,116,139,163,200,250,300,350,400,450,500,550,600,650,700,750,800,850,900,950,1000,1050,1100};
int dutyLtI[] = {22,46,70,92,116,139,163,200,250,300,350,400,450,500,550,600,650,700,750,800,850,900,950,1000,1050,1100};

FLASH_PROJECT_PARA& cust_getFlashProjectPara_main(int aeScene, int isForceFlash, NVRAM_CAMERA_STROBE_STRUCT* nvrame)
{
……
para.dutyNum = 26;
para.dutyNumLT = 26;
注:
如果是单色温灯,请将所有*LT的配置(dutyLtI[]、dutyNumLT等),设置为0;
如果是双色温灯,dutyNum 及dutyNumLT 要保持相同,且等于driver 配置的xxx_LEVEL_NUM。

2)parameter配置

ISP5.0以前 \vendor\mediatek\proprietary\custom$platform\hal\flashlight\flash_tuning_custom_cct(_sub).cpp

int cust_fillDefaultStrobeNVRam_main (void* data)
{
……
//--------------------
//eng level
//index mode
//torch
p->engLevel.torchDuty = 6;
//af
p->engLevel.afDuty = 6;
//pf, mf, normal
p->engLevel.pfDuty = 6;
p->engLevel.mfDutyMax = 25;
p->engLevel.mfDutyMin = 0;
//low bat
p->engLevel.IChangeByVBatEn=0;
p->engLevel.vBatL = 3600;//mv
p->engLevel.pfDutyL = 6;
p->engLevel.mfDutyMaxL = 6;
p->engLevel.mfDutyMinL = 0;
//burst setting
p->engLevel.IChangeByBurstEn=1;
p->engLevel.pfDutyB = 6;
p->engLevel.mfDutyMaxB = 6;
p->engLevel.mfDutyMinB = 0;
//high current setting
p->engLevel.decSysIAtHighEn = 1;
p->engLevel.dutyH = 20;

//LT
p->engLevelLT.torchDuty = 0;
//af
p->engLevelLT.afDuty = 0;
//pf, mf, normal
p->engLevelLT.pfDuty = 0;
p->engLevelLT.mfDutyMax = 25;
p->engLevelLT.mfDutyMin = -1;
//low bat
p->engLevelLT.pfDutyL = 0;
p->engLevelLT.mfDutyMaxL = 6;
p->engLevelLT.mfDutyMinL = -1;
//burst setting
p->engLevelLT.pfDutyB = 0;
p->engLevelLT.mfDutyMaxB = 6;
p->engLevelLT.mfDutyMinB = -1;
ISP5.0及以后 \vendor\mediatek\proprietary\custom$platform\hal\imgsensor\ver1$SensorID\Scene_Capture$SensorID_$Scenario_Flash_AE.cpp

.engLevel = {
6, // torchDuty
{}, // torchDutyEx[20]
6, // afDuty
6, // pfDuty
25, // mfDutyMax
-1, // mfDutyMin
0, // IChangeByVBatEn
3600, // vBatL
6, // pfDutyL
6, // mfDutyMaxL
-1, // mfDutyMinL
1, // IChangeByBurstEn
6, // pfDutyB
6, // mfDutyMaxB
-1, // mfDutyMinB
1, // decSysIAtHighEn
20, // dutyH
},
.engLevelLT = {
0, // torchDuty
{}, // torchDutyEx[20]
0, // afDuty
0, // pfDuty
25, // mfDutyMax
-1, // mfDutyMin
0, // pfDutyL
6, // mfDutyMaxL
-1, // mfDutyMinL
0, // pfDutyB
6, // mfDutyMaxB
-1, // mfDutyMinB
},
注意:
如果是单色温灯,则低色温的配置所有的DutyMax都是-1;
如果是双色温灯,则两颗灯的 mfDutyMax 都需要配置成之前的dutyNum - 1;
高色温的torchDuty和afDuty按照实际需求配置,低色温的torchDuty和afDuty设置为0;

问题二: 如果以上配置正确之后,仍然calibration未出结果

请抓取校准过程的log,录屏,同时dump 校准时的data

adb root
adb shell setenforce 0
adb shell setprop vendor.flash_calibration_aao_en 1
adb shell setprop persist.vendor.mtk.camera.log_level 3
adb shell setprop persist.mtk.camera.log_level 3
adb shell setprop debug.cam.drawid 1
adb shell setprop vendor.debug.ae.enable 9
adb shell setprop vendor.debug.aaa.pvlog.enable 1
adb shell setprop vendor.debug.hal3av3.log 263
adb shell setprop vendor.debug.camera.log.hal3a 1
adb shell setprop vendor.debug.camera.log 1
adb shell setprop vendor.debug.3a.log 1
adb shell setprop vendor.flash_verbose_en 1
adb shell setprop vendor.flash_is_debug 1
adb shell pkill cameraserver
adb shell pkill camerahalserver

请提供校准时完整的mtklog、录屏视频 及/vendor/data/flash 目录下的所有data

Step1: 校准dump 出来的data 位于\flash\flashdata\aao 目录下

若发现dump 出来的data(bmp文件)是完全没有亮度的,则需要检查driver:是否有异常操作导致提前关闭闪光灯的行为。
同时可以通过log 可以印证,log中会有calibration failed 的关键字,且cctCalibration(): yrgb的值都为0,参考log如下(ISP5.0)

02-25 10:54:29.616298 6554 6858 I FlashCct: cctCalibration(): state(AE).
02-25 10:54:29.616368 6554 6858 I FlashCct: cctCalibration(): set max duty(31/32,-1/32)
02-25 10:54:29.632281 6554 6858 I FlashHal: setFlashOn(): duty(31), timeout(300), lt duty(-1), lt timeout(300).
02-25 10:54:29.632428 6554 6858 I StrobeDrvFlashlight: setOnOff(): enable(1).
02-25 10:54:29.717364 6554 6858 I FlashCct: cctCalibration(): state(AE).
02-25 10:54:29.718307 6554 6858 I FlashCct: cctCalibration(): yrgb(0.000,0.000,0.000,0.000).

02-25 10:54:30.396660 6554 6858 I FlashCct: cctCalibration(): calibration failed(-98).

Step2: 若与上述状况不符,还请提交完整资料给MTK 分析

除了log、视频、flashdata 之外,还包括上面提到的driver 及flash配置文件一并提供。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值