问题:xx项目中二供后摄tuning调试中发现AF_mgr获取不到烧录的AF数据,但是在开机第一次打开后摄的log中又发现AF数据正常读取出来了
AF数据读取成功的log:
11-09 11:16:38.198179 2957 3370 I CamCalCamCal: ver1210~ CalLayoutTbl sensorID = 0x30c6
11-09 11:16:38.198202 2957 3370 I CamCalCamCal: ver1210~ WingtechDoCamCal2AGain : enter..BlockSize=34 SensorID=30c6
11-09 11:16:38.198278 2957 3370 E CamCalCamCal: ver1210~Err: 524: read otp AF data no err
11-09 11:16:38.198295 2957 3370 I CamCalCamCal: ver1210~ WingtechDoCamCal2AGain : ======================AF CAM_CAL==================
11-09 11:16:38.198310 2957 3370 I CamCalCamCal: ver1210~ WingtechDoCamCal2AGain : [AFInf] = 240
11-09 11:16:38.198327 2957 3370 I CamCalCamCal: ver1210~ WingtechDoCamCal2AGain : [AFMacro] = 502
11-09 11:16:38.198343 2957 3370 I CamCalCamCal: ver1210~ WingtechDoCamCal2AGain : ======================AF CAM_CAL==================
报错log:
11-09 11:16:38.255755 2957 3374 D CamCalDrv: CamCalDrv i4CurrSensorId 0x30c6...
11-09 11:16:38.256018 2957 3374 D CamCalDrv: CamCalDrv Start to get CamCal data!! CamCalDrv::GetCamCalCalDataBase().....
11-09 11:16:38.256144 2957 3374 I CamCalCamCal: ver1210~ dumpEnable=1, sensorID=30c6 deviceID=1 Command=0x3
11-09 11:16:38.256161 2957 3374 I CamCalCamCal: ver1210~ pCamCalData->Command = 0x3
11-09 11:16:38.256175 2957 3374 I CamCalCamCal: ver1210~ lsCommand = 0x3
11-09 11:16:38.256190 2957 3374 I CamCalCamCal: ver1210~ g_lastSensorID=30c6 pCamCalData->sensorID=30c6
11-09 11:16:38.256204 2957 3374 I CamCalCamCal: ver1210~ DoCamCalLayoutCheck result= 0
11-09 11:16:38.258758 2957 3374 E CamCalCamCal: ver1210~Err: 400: Return ERROR ERR_NO_3A_GAIN
11-09 11:16:38.258792 2957 3374 I CamCalCamCal: ver1210~ result = 0x1000
11-09 11:16:38.258829 2957 3374 D CamCalDrv: CamCalDrv Return ERROR ERR_NO_3A_GAIN
11-09 11:16:38.258880 2957 3374 I af_mgr_v3: err (ERR_NO_3A_GAIN)
11-09 11:16:38.258895 2957 3374 I af_mgr_v3: OTP data [S2aBitEn]0 [S2aAfBitflagEn]0 [S2aAf0]0 [S2aAf1]0
11-09 11:16:38.258911 2957 3374 I af_mgr_v3: readOTP : cam_cal is abnormal, read calibration data from AF driver [Inf]0 [Macro]0
分析过程:
1.追踪camera_calibration_cam_cal.cpp中的CAM_CAL_GetCalData函数,再结合log发现在读取AF和AWB数据这一项过程中,执行DoCamCalLayoutCheck没有出错,接下来打开底层eeprom驱动节点也没出错,接下来在调用CalLayoutTbl里的读取函数时出错了,第一步定位问题出在读取函数中.
2.根据此时调用的if语句可以看出有两个判断条件:
if ((CalLayoutTbl[LayoutType].CalItemTbl[lsCommand].Include != 0) &&(CalLayoutTbl[LayoutType].CalItemTbl[lsCommand].GetCalDataProcess != NULL))
先判断include是否为0,再判断调用的读取函数接口是否为空,查看前面CalLayoutTbl数组中的WingtechDoCamCal2AGain这一数组:
{0x00000001, 0x0000000A, 0x00000022, WingtechDoCamCal2AGain},这个数组中include为1,函数接口也有,那为什么还是出错了呢?
3.先看第一个判断条件,仔细看这个判断语句,include前面有两个变量来决定是判断哪个数组的include,
if ((CalLayoutTbl[LayoutType].CalItemTbl[lsCommand].Include != 0) &&(CalLayoutTbl[LayoutType].CalItemTbl
1).检查第一个变量LayoutType是否出错
查看前面第一次调用DoCamCalLayoutCheck函数打印出来的log:
11-09 11:16:37.889953 2957 3261 I CamCalCamCal: ver1210~ LayoutType= 0x6
LayoutType=6,跟CalLayoutTbl数组中二供后摄S5K3L6读取函数数组的位置是一致的,位置正确
2).检查第二个变量lsCommand是否出错
11-09 11:16:38.256175 2957 3374 I CamCalCamCal: ver1210~ lsCommand = 0x3
根据这个log可以看到lsCommand值为3,查看S5K3L6读取函数数组中位置为3的元素竟然为空,
到此就真相大白了,上层下来的lscommond值应该是按照MTK原始的数组顺序来定义的,那MTK原始读取函数数组是有6个元素,那在bringup二供后摄OTP时我认为WingtechDoCamCalModuleVersion、WingtechDoCamCalPartNumber、WingtechDoCamCalStereoData这3个函数没有用到就把它去掉了。
如果将这几个去掉的函数加上,lscommond为3就是调用的WingtechDoCamCal2AGain函数了。
4.那为什么前面又读取AF数据成功了呢,仔细查看log:
11-09 11:16:38.195956 2957 3370 I CamCalCamCal: ver1210~ dumpEnable=1, sensorID=30c6 deviceID=1 Command=0x1
11-09 11:16:38.195971 2957 3370 I CamCalCamCal: ver1210~ pCamCalData->Command = 0x1
11-09 11:16:38.195984 2957 3370 I CamCalCamCal: ver1210~ lsCommand = 0x1
11-09 11:16:38.196000 2957 3370 I CamCalCamCal: ver1210~ g_lastSensorID=30c6 pCamCalData->sensorID=30c6
11-09 11:16:38.196014 2957 3370 I CamCalCamCal: ver1210~ DoCamCalLayoutCheck result= 0
可以看到读取AF和AWB数据时的lscommond是1,那位置1刚好对应的是数组中的WingtechDoCamCal2AGain函数这一组,所以前面能读出来纯属于巧合。
问题产生原因:
调试时是按照MTK原始顺序来添加读取函数数组的,没有去掉那三个函数,所以所有数据读取正常并且log和变态模组验证也正常,在提交代码之前我认为去掉那几个函数没有影响就去掉了.
结论:
提交之前的代码必须编译刷机最后确认没有问题了再提交。
修改方法:按MTK原始顺序加上这3个函数:WingtechDoCamCalModuleVersion、WingtechDoCamCalPartNumber、WingtechDoCamCalStereoData
#if defined(FH10_S5K3L6_REAR_DC_SENSOR_ID)
{//CALIBRATION_LAYOUT_SENSOR_OTP
0x00000001, 0x13000000/*Module ID | Pos ID | Len ID | VcmID*/, CAM_CAL_SINGLE_OTP_DATA,
{
{0x00000000, 0x00000001, 0x0000000E, WingtechDoCamCalModuleVersion}, //CAMERA_CAM_CAL_DATA_MODULE_VERSION
{0x00000000, 0x00000010, 0x00000020, WingtechDoCamCalPartNumber}, //CAMERA_CAM_CAL_DATA_PART_NUMBER
{0x00000001, 0x00000035, 0x0000074C, WingtechDoCamCalSingleLsc}, //CAMERA_CAM_CAL_DATA_SHADING_TABLE
{0x00000001, 0x0000000A, 0x00000022, WingtechDoCamCal2AGain}, //CAMERA_CAM_CAL_DATA_3A_GAIN
{0x00000001, 0x00000ED1, 0x00000586, WingtechDoCamCalPDAF},
{0x00000000, 0x00000FAE, 0x00000550, WingtechDoCamCalStereoData} //CAMERA_CAM_CAL_DATA_STEREO_DATA
}
},
#endif
部分原始代码如下:
const CALIBRATION_LAYOUT_STRUCT CalLayoutTbl[MAX_CALIBRATION_LAYOUT_NUM]=
{
.
.
.
#if defined(FH10_S5K3L6_REAR_DC_SENSOR_ID)
{//CALIBRATION_LAYOUT_SENSOR_OTP
0x00000001, 0x13000000/*Module ID | Pos ID | Len ID | VcmID*/, CAM_CAL_SINGLE_OTP_DATA,
{
//{0x00000000, 0x00000001, 0x0000000E, WingtechDoCamCalModuleVersion}, //CAMERA_CAM_CAL_DATA_MODULE_VERSION
//{0x00000000, 0x00000010, 0x00000020, WingtechDoCamCalPartNumber}, //CAMERA_CAM_CAL_DATA_PART_NUMBER
{0x00000001, 0x00000035, 0x0000074C, WingtechDoCamCalSingleLsc}, //CAMERA_CAM_CAL_DATA_SHADING_TABLE
{0x00000001, 0x0000000A, 0x00000022, WingtechDoCamCal2AGain}, //CAMERA_CAM_CAL_DATA_3A_GAIN
{0x00000001, 0x00000ED1, 0x00000586, WingtechDoCamCalPDAF},
//{0x00000000, 0x00000FAE, 0x00000550, WingtechDoCamCalStereoData} //CAMERA_CAM_CAL_DATA_STEREO_DATA
}
},
#endif
.
.
.
};
UINT32 CAM_CALGetCalData(UINT32* pGetSensorCalData)
{
UCHAR cBuf[128] = "/dev/CAM_CAL_DRV";
UINT32 result = CAM_CAL_ERR_NO_DEVICE;
//cam_cal
INT32 CamcamFID = 0;
CAMERA_CAM_CAL_TYPE_ENUM lsCommand;
PCAM_CAL_DATA_STRUCT pCamCalData = (PCAM_CAL_DATA_STRUCT)pGetSensorCalData;
//+bug577281 chenbocheng.wt, add, 2020/9/9, camera otp porting
dumpEnable = property_get_int32("vendor.dump.eeprom.enable", 0);
CAM_CAL_LOG("dumpEnable=%d, sensorID=%x deviceID=%x Command=0x%x\n", dumpEnable, pCamCalData->sensorID, pCamCalData->deviceID, pCamCalData->Command);
//-bug577281 chenbocheng.wt, add, 2020/9/9, camera otp porting
lsCommand = pCamCalData->Command;
if(lsCommand < 0 || lsCommand >= CAMERA_CAM_CAL_DATA_LIST)
{
CAM_CAL_LOG("Invalid Command = 0x%x \n",lsCommand);
return CAM_CAL_ERR_NO_CMD;
}
CAM_CAL_LOG_IF(dumpEnable,"pCamCalData->Command = 0x%x \n",pCamCalData->Command);
CAM_CAL_LOG_IF(dumpEnable,"lsCommand = 0x%x \n",lsCommand);
//Make sure Layout is confirmed, first
if(DoCamCalLayoutCheck(pGetSensorCalData)==CAM_CAL_ERR_NO_ERR)
{
pCamCalData->DataVer = (CAM_CAL_DATA_VER_ENUM)CalLayoutTbl[LayoutType].DataVer;
CamcamFID = open(cBuf, O_RDWR);
if(CamcamFID == -1)
{
CAM_CAL_LOG_IF(dumpEnable,"--CAM_CALGetCalData--error: can't open CAM_CAL %s----\n",cBuf);
result = CamCalReturnErr[lsCommand];
ShowCmdErrorLog(lsCommand);
return result;
}
/*********************************************/
if ((CalLayoutTbl[LayoutType].CalItemTbl[lsCommand].Include != 0) &&(CalLayoutTbl[LayoutType].CalItemTbl[lsCommand].GetCalDataProcess != NULL))
{
CAM_CAL_LOG_IF(dumpEnable,"CalLayoutTbl sensorID = 0x%x\n", pCamCalData->sensorID);
result = CalLayoutTbl[LayoutType].CalItemTbl[lsCommand].GetCalDataProcess(
CamcamFID, CalLayoutTbl[LayoutType].CalItemTbl[lsCommand].StartAddr,
CalLayoutTbl[LayoutType].CalItemTbl[lsCommand].BlockSize,
pGetSensorCalData);
}
else
{
result = CamCalReturnErr[lsCommand];
ShowCmdErrorLog(lsCommand);
}
/*********************************************/
close(CamcamFID);
}
else
{
result = CamCalReturnErr[lsCommand];
ShowCmdErrorLog(lsCommand);
return result;
}
CAM_CAL_LOG_IF(dumpEnable,"result = 0x%x\n",result);
return result;
}