项目中二供后摄OTP读取成功但AF_mgr却读不到烧录的AF数据

在xx项目二供后摄的tuning调试过程中,遇到AF_mgr无法获取烧录AF数据的问题。虽然开机第一次打开后摄时AF数据能正常读取,但在后续操作中出现错误。经过分析,发现错误源于删除了MTK原始顺序中的3个读取函数,导致上层lsCommand值与函数数组顺序不匹配。修复方法是按原始顺序恢复这3个函数:WingtechDoCamCalModuleVersion、WingtechDoCamCalPartNumber、WingtechDoCamCalStereoData。结论是提交代码前必须进行完整测试以确保无误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题: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发现在读取AFAWB数据这一项过程中,执行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},这个数组中include1,函数接口也有,那为什么还是出错了呢?

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时我认为WingtechDoCamCalModuleVersionWingtechDoCamCalPartNumberWingtechDoCamCalStereoData3个函数没有用到就把它去掉了。

如果将这几个去掉的函数加上,lscommond3就是调用的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

可以看到读取AFAWB数据时的lscommond1,那位置1刚好对应的是数组中的WingtechDoCamCal2AGain函数这一组,所以前面能读出来纯属于巧合。

问题产生原因:
调试时是按照MTK原始顺序来添加读取函数数组的,没有去掉那三个函数,所以所有数据读取正常并且log和变态模组验证也正常,在提交代码之前我认为去掉那几个函数没有影响就去掉了.

结论:
提交之前的代码必须编译刷机最后确认没有问题了再提交。

修改方法:按MTK原始顺序加上这3个函数:WingtechDoCamCalModuleVersionWingtechDoCamCalPartNumberWingtechDoCamCalStereoData

#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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值