在android的hal层获取属性节点信息值: //====== Get Property ======
af_mgr.cpp init() --> readOTP() : //lens_para_FM50AF.cpp里面有关于这个功能的开关:0,disable,1,enable CamCalDrvBase *pCamCalDrvObj = CamCalDrvBase::createInstance(); result= pCamCalDrvObj->GetCamCalCalData(i4SensorDevID, enCamCalEnum, (void *)&GetCamCalData); MINT32 i4InfPos, i4MacroPos; MY_LOG("OTP [Inf]%d [Macro]%d", i4InfPos, i4MacroPos); mtk备注: Af otp 烧录的是inf和macro两个位置,在af_mgr.cpp文件的init()函数调用readOtp(),将两个位置读取出来,传给算法那边会针对每颗模组产生新的table。 m_pIAfAlgo->updataAFTableBoundary(i4InfPos,i4MacroPos);
上述代码中 result= pCamCalDrvObj->GetCamCalCalData(i4SensorDevID, enCamCalEnum, (void *)&GetCamCalData); ---> cam_cal_drv.cpp ---> class CamCalDrvBase ---> GetCamCalCalData(unsigned long i4SensorDevId,CAMERA_CAM_CAL_TYPE_ENUM a_eCamCalDataType,void *a_pCamCalData) : PCAM_CAL_DATA_STRUCT la_pCamCalData = (PCAM_CAL_DATA_STRUCT)a_pCamCalData; m32CamCalDataValidation= GetCameraCalData(i4CurrSensorId, (MUINT32*)pCamcalData); memcpy((UINT8*)la_pCamCalData, (UINT8*)pCamcalData, sizeof(CAM_CAL_DATA_STRUCT));//最终获取到OTP数据 其中GetCameraCalData() : if (pstSensorInitFunc[i].getCameraCalData != NULL)//针对当前camera id ,如果sensorlist.cpp的SensorList[]某一项camera配置了GetSensorCalData()就会获取OTP数据. 比如: #if defined(IMX135_MIPI_RAW) camera_calibration_cam_cal.cpp ---> UINT32 IMX135_CAM_CALGetCalData(UINT32* pGetSensorCalData) PCAM_CAL_DATA_STRUCT pCamCalData = (PCAM_CAL_DATA_STRUCT)pGetSensorCalData; 然后会OPEN如下图片中的设备来I2C通信,读取模组的OTP数据. 需要读取的块及实现函数: const CALIBRATION_LAYOUT_STRUCT CalLayoutTbl[MAX_CALIBRATION_LAYOUT_NUM]=...
MTK 的 OTP格式:
其中,重点是如下两项,第一项是模组的lsc,第二项是模组的AWB,AF等校准信息: {0x00000001, 0x00000017, 0x00000001, DoCamCalSingleLsc}, //CAMERA_CAM_CAL_DATA_SHADING_TABLE eg: if(0x2&AWBAFConfig){ mediatek/custom/common/kernel/cam_cal/dummy_eeprom/dummy_cam_cal.c 在cam_cal里面的设备名字要和上面打开的设备名字相一致:CAM_CAL_DRV 再就是,在i2c设备cam_cal里,要注意读写地址是一个字节还是两个字节,如果不符会导致I2C不通: #ifdef _SUNNY_AF_OTP_MODIFY_//for otp 注意: 摄像头模组水平,向上,向下拍摄时code值范围是不同的,相差100code左右:
由于P13N07F的马达是开环马达,手机驱动端在调用舜宇的OTP数据时,需要考虑向上,水平,向下三个方向的兼容。 制程工艺上,P13N07F采用水平远近焦烧录,故手机端在调用Infinity的Code值时,需要减去向下方向的位置差Code(Max),故手机端在调用Macro的Code值,需要加上向上方向的位置差Code(Max)。
从我手边的模组来看,向下方向的位置差Code(Max)=100,向上方向的位置差Code(Max)=100,应该可以用.例如你手头的模组读取的OTP_Infinity=220, OTP_Macro=334,那么你可以设置Mobile_Infinity=120, Mobile_Macro=434. 特别注意需要保证驱动,Mobile_Infinity>=0, Mobile_Macro<=1023,不能越界。 以后,力求把思路,代码以准确兼形象的方式来进行总结. |
|
来自: linux_android > 《待分类》