return S_3A_OK; }
包含了AWB、AE、AF在内的ISP相关的初始化,相关的初始化完成之后会调用m_pStateMgr->transitState函数将当前状态切换到CameraPreview状态。
代码太多,这里只关注AF的初始化
MRESULT AfMgr::init(MINT32 i4SensorIdx, MINT32 isInitMCU) {
......
// --- init MCU ---
SensorStaticInfo rSensorStaticInfo; if (m_i4EnableAF == -1) {
IHalSensorList* const pIHalSensorList = IHalSensorList::get();
IHalSensor* pIHalSensor = pIHalSensorList->createSensor(\ SensorDynamicInfo rSensorDynamicInfo;
switch(m_i4CurrSensorDev) {
case ESensorDev_Main:
pIHalSensorList->querySensorStaticInfo(NSCam::SENSOR_DEV_MAIN, &rSensorStaticInfo);
pIHalSensor->querySensorDynamicInfo(NSCam::SENSOR_DEV_MAIN, &rSensorDynamicInfo); break;
case ESensorDev_Sub: ...... default:
MY_ERR(\ }
if(pIHalSensor) pIHalSensor->destroyInstance(\
......
m_i4CurrSensorId=rSensorStaticInfo.sensorDevID;
MCUDrv::lensSearch(m_i4CurrSensorDev, m_i4CurrSensorId); m_i4CurrLensId = MCUDrv::getCurrLensID(m_i4CurrSensorDev); ...... }
if(isInitMCU) {
m_pMcuDrv = MCUDrv::createInstance(m_i4CurrLensId);
if (m_pMcuDrv->init(m_i4CurrSensorDev) < 0) {
MY_ERR(\ m_i4EnableAF = 0; } else {
m_pMcuDrv->moveMCU( 0, m_i4CurrSensorDev); m_MoveLensTimeStamp = getTimeStamp(); } }
// --- init ISP Drv/Reg --- ......
// --- checking PDAF is supported or not --- ......
// --- init af algo --- ......
// --- NVRAM --- int err; err = NvBufUtil::getInstance().getBufAndRead(CAMERA_NVRAM_DATA_LENS, m_i4CurrSensorDev, (void*&)g_pNVRAM_LENS); if(err!=0)
MY_ERR(\
m_NVRAM_LENS.rFocusRange = g_pNVRAM_LENS->rFocusRange; m_NVRAM_LENS.rAFNVRAM= g_pNVRAM_LENS->rAFNVRAM; m_NVRAM_LENS.rPDNVRAM = g_pNVRAM_LENS->rPDNVRAM;
// --- Param ---
m_sAFParam = getAFParam(); m_sAFConfig = getAFConfig();
m_pIAfAlgo->setAFParam(m_sAFParam, m_sAFConfig, m_NVRAM_LENS.rAFNVRAM);
m_pIAfAlgo->initAF(m_sAFInput, m_sAFOutput); ......
m_pIAfAlgo->setAFMode(m_eLIB3A_AFMode);
//init pd mgr ......
return S_AF_OK; }
第30行,调用lensSearch函数匹配镜头驱动 第35-49行,将镜头移动到起始位置 第60-67行,获取af tuning参数 第69-73行,设置af tuning参数
3.3 匹配镜头驱动
MTK为多个镜头做了兼容,所以AF初始化的第一步就是找到当前对应镜头的型号。lensSearch函数实现了lens的匹配过程 int
MCUDrv::lensSearch( unsigned int a_u4CurrSensorDev, unsigned int a_u4CurrSensorId) {
INT32 i;
LensCustomInit(a_u4CurrSensorDev);
if (a_u4CurrSensorDev == MCU_DEV_MAIN ) {
LensCustomGetInitFunc(&MCUDrv::m_LensInitFunc_main[0]); MCUDrv::m_u4CurrLensIdx_main = 0;
for (i=0; i if ((MCUDrv::m_LensInitFunc_main[i].LensId == DUMMY_LENS_ID) || (MCUDrv::m_LensInitFunc_main[i].LensId == SENSOR_DRIVE_LENS_ID) /*|| (MCUDrv::m_LensInitFunc_main[i].LensId == FM50AF_LENS_ID)*/ ) { MCUDrv::m_u4CurrLensIdx_main = i; } } // force assign LensIdx if SensorId != DUMMY_SENSOR_ID (to support backup lens/new lens driver) for (i=0; i if ((MCUDrv::m_LensInitFunc_main[i].SensorId == a_u4CurrSensorId) && (a_u4CurrSensorId!=0xFFFF) && (a_u4CurrSensorId!=0x0)) { MCUDrv::m_u4CurrLensIdx_main = i; MCU_DRV_DBG(\[CurrSensorId]0xx,[CurrLensIdx]0xx\\n\i, a_u4CurrSensorId, MCUDrv::m_u4CurrLensIdx_main); break; } } LensCustomSetIndex(MCUDrv::m_u4CurrLensIdx_main); MCU_DRV_DBG(\ } else if( a_u4CurrSensorDev == MCU_DEV_SUB) { ...... } else return MCU_INVALID_DRIVER; return MCU_NO_ERROR; } 先看LensCustomInit函数,由它来获取拷贝整个lens列表 MUINT32 LensCustomInit(unsigned int a_u4CurrSensorDev) { GetLensInitFuncList(&LensInitFunc[0], a_u4CurrSensorDev); return 0; } UINT32 GetLensInitFuncList(PMSDK_LENS_INIT_FUNCTION_STRUCT pLensList, unsigned int a_u4CurrSensorDev) { if(a_u4CurrSensorDev==2) //sub memcpy(pLensList, &LensList_sub[0], sizeof(MSDK_LENS_INIT_FUNCTION_STRUCT)* MAX_NUM_OF_SUPPORT_LENS); else if(a_u4CurrSensorDev==4) //main 2 memcpy(pLensList, &LensList_main2[0], sizeof(MSDK_LENS_INIT_FUNCTION_STRUCT)* MAX_NUM_OF_SUPPORT_LENS); else // main or others memcpy(pLensList, &LensList_main[0], sizeof(MSDK_LENS_INIT_FUNCTION_STRUCT)* MAX_NUM_OF_SUPPORT_LENS); return MHAL_NO_ERROR; } 根据前后摄像头拷贝不同的LensList,这里只看其中的LensList_main MSDK_LENS_INIT_FUNCTION_STRUCT LensList_main[MAX_NUM_OF_SUPPORT_LENS] = { {DUMMY_SENSOR_ID, DUMMY_LENS_ID, \ #if defined(SENSORDRIVE) {OV3640_SENSOR_ID, SENSOR_DRIVE_LENS_ID, \pSensorDrive_getDefaultData}, #endif #if defined(FM50AF) {DUMMY_SENSOR_ID, FM50AF_LENS_ID, \pFM50AF_getDefaultData}, #endif #if defined(DW9714AF) {IMX135_SENSOR_ID, DW9714AF_LENS_ID, \pDW9714AF_getDefaultData}, #endif ...... }; LensList_main包含了后摄所有可用的lens,如果要新增一个lens驱动,就需要往这个数组添加相关的信息,看下MSDK_LENS_INIT_FUNCTION_STRUCT结构体的定义 typedef struct { UINT32 SensorId; UINT32 LensId; UINT8 LensDrvName[32]; UINT32 (*getLensDefault)(VOID *pDataBuf, UINT32 size); } MSDK_LENS_INIT_FUNCTION_STRUCT, *PMSDK_LENS_INIT_FUNCTION_STRUCT; SensorId:表示这个lens driver配置给对应的sensor使用,如果配置成DUMMY_SENSOR_ID则表示这个lens driver适合所有sensor使用 LensId:Lens driver的唯一标识 LensDrvName:是实现AF功能的驱动对应的设备驱动节点名。例如FM20AF,实现AF功能的是内核驱动里面的fm20af.c,这个驱动会生成一个驱动节点”/dev/fm20af” getLensDefault:这个函数指针指向了获取AF tuning参数表的一个函数