77范文网 - 专业文章范例文档资料分享平台

Android 5.0 Camera系统源码分析(5):Camera预览3A流程(4)

来源:网络收集 时间:2020-04-17 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

回到lensSearch函数,现在lens列表已经保存在LensInitFunc数组中了,接下来调用LensCustomGetInitFunc函数把它拷贝到m_LensInitFunc_main数组中

MUINT32 LensCustomGetInitFunc(MSDK_LENS_INIT_FUNCTION_STRUCT *a_pLensInitFunc) {

if (a_pLensInitFunc != NULL) { memcpy(a_pLensInitFunc, &LensInitFunc[0], sizeof(MSDK_LENS_INIT_FUNCTION_STRUCT) * MAX_NUM_OF_SUPPORT_LENS); return 0; } return -1; }

lensSearch函数再接下来就是两个for循环,从m_LensInitFunc_main数组中搜索符合要求的lens驱动

第一个for循环:m_u4CurrLensIdx_main指向m_LensInitFunc_main数组里lensId配置为DUMMY_LENS_ID或SENSOR_DRIVE_LENS_ID的最后一个元素

第二个for循环:查找m_LensInitFunc_main数组中是否有SensorId和当前使用的sensor的ID相匹配的lens driver。如果有则为符合条件的第一个元素,没有的话则为第一个for循环搜索到的结果

最后调用LensCustomSetIndex把匹配到的lens driver的index保存下来

3.4 初始化镜头驱动

找到镜头驱动之后还需要对镜头进行初始化,也就是将镜头移动到起始位置,所以回到AfMgr::init函数

主要是下面这3行代码

m_pMcuDrv = MCUDrv::createInstance(m_i4CurrLensId); m_pMcuDrv->init(m_i4CurrSensorDev);

m_pMcuDrv->moveMCU( 0, m_i4CurrSensorDev);

MCUDrv::createInstance创建的是LensDrv对象,它继承了MCUDrv类

接下来调用m_pMcuDrv->init函数来打开设备驱动节点,然后调用m_pMcuDrv->moveMCU函数来控制焦马达将镜头移动到起始位置 int

LensDrv::init(unsigned int a_u4CurrSensorDev ) {

char cBuf[64];

unsigned int a_u4CurrLensIdx;

if(a_u4CurrSensorDev==MCU_DEV_MAIN) {

a_u4CurrLensIdx=MCUDrv::m_u4CurrLensIdx_main;

sprintf(cBuf, \MCUDrv::m_LensInitFunc_main[a_u4CurrLensIdx].LensDrvName);

DRV_DBG(\ +\\n\ DRV_DBG(\

Mutex::Autolock lock(mLock);

if (m_userCnt_main == 0) {

if (m_fdMCU_main == -1) {

m_fdMCU_main = open(cBuf, O_RDWR); if (m_fdMCU_main < 0) { ...... } } }

m_userCnt_main++;

DRV_DBG(\lens init() [m_userCnt]%d [fdMCU_main]%d - \\n\m_userCnt_main,m_fdMCU_main); }

else if(a_u4CurrSensorDev==MCU_DEV_SUB) {

...... } else

return MCUDrv::MCU_INVALID_DRIVER;

return MCUDrv::MCU_NO_ERROR;

}

第20行,根据之前匹配到的lens信息打开设备驱动节点,例如/dev/fm20af int

LensDrv::moveMCU(int a_i4FocusPos,unsigned int a_u4CurrSensorDev ) {

//DRV_DBG(\ int err, a_fdMCU,a_u4CurrLensIdx;

if(a_u4CurrSensorDev==MCU_DEV_MAIN) {

a_fdMCU=m_fdMCU_main;

a_u4CurrLensIdx=MCUDrv::m_u4CurrLensIdx_main; }

else if(a_u4CurrSensorDev==MCU_DEV_SUB) {

...... }

......

err = ioctl(a_fdMCU,mcuIOC_T_MOVETO,(unsigned long)a_i4FocusPos); if (err < 0) {

DRV_ERR(\ strerror(errno)); return err; }

return MCUDrv::MCU_NO_ERROR; }

第19行,通过ioctl函数来移动对焦马达,kernel层对应的lens驱动会通过i2c设置lens的寄存器。ioctl的最后一个参数a_i4FocusPos代表将镜头移动到什么位置

3.5 设置AF参数

接下来还需要把之前获取到的lens tuning参数表设置到ISP里面,在AfMgr::init函数的第60-73行代码。

首先通过NvBufUtil的getBufAndRead函数读取lens tuning参数表,这个函数最终将调用到GetLensDefaultPara函数

void GetLensDefaultPara(PNVRAM_LENS_PARA_STRUCT pLensParaDefault) {

MUINT32 i;

MUINT32 LensId = LensInitFunc[gMainLensIdx].LensId;

if (LensInitFunc[0].getLensDefault == NULL) {

CAM_MSDK_LOG(\ return; }

for (i=0; i

if (LensId == LensInitFunc[i].LensId) {

break; } }

if (pLensParaDefault != NULL) {

LensInitFunc[i].getLensDefault((VOID*)pLensParaDefault, sizeof(NVRAM_LENS_PARA_STRUCT)); } }

第23行,LensInitFunc[i].getLensDefault之前已经提到过,getLensDefault指向对应镜头的getDefaultData函数指针,例如fm50af的pFM50AF_getDefaultData,而这个函数指针则指向FM50AF_getDefaultData函数,调用这个函数会将lens tuning参数表拷贝到buff里

获取到lens tuning参数表之后调用m_pIAfAlgo->setAFParam函数将参数表设置到ISP里面,

很遗憾IAfAlgo相关函数的实现我们是看不到的

AfMgr::init函数执行完之后,AF相关的准备工作就已经完成,接下来就是根据不同的场景实时更新3A参数了

4. 实时更新AF

之前提到过有3个需要重点关注的线程,onThreadLoop、AFThreadFunc和AESensorThreadLoop。

其中AFThreadFunc负责实时更新AF参数

MVOID * Hal3A::AFThreadFunc(void *arg) {

......

while (_this->mbAFThreadLoop) {

if ( _this->mpIspDrv_forAF->waitIrq(&waitIrq) > 0) // success {

MY_LOG_IF(fgLogEn, \ _this->mpScheduler->jobAssignAndTimerStart(E_Job_Af); _this->mpStateMgr->sendCmd(ECmd_AFUpdate); _this->mpScheduler->jobTimerEnd(E_Job_Af); MY_LOG_IF(fgLogEn, \StateMgr::sendCmd(ECmd_AFUpdate) done\\n\ } ...... }

return NULL; }

AFThreadFunc函数还挺长的,但除了上面贴出来的这些代码,其它的我都不知道它在做什么。当需要更新AF的参数时ISP会产生一个中断,而这里则通过一个死循环不断去捕获中断。捕获到中断之后通过mpStateMgr->sendCmd函数将命令交给当前状态的sendIntent函数进行处理。当前状态已经在处理PASS1_START_ISP事件时切换到CameraPreview状态了,所以AFUpdate命令将在StateCameraPreview的sendIntent函数中处理

MRESULT

StateCameraPreview::

sendIntent(intent2type) {

......

// (0) Dequeue AFO DMA buffer

IAFOBufMgr::getInstance().dequeueHwBuf(m_SensorDevId, rBufInfo);

// (1) get AF window from AF, and set to AE meter, then get Y value.

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库Android 5.0 Camera系统源码分析(5):Camera预览3A流程(4)在线全文阅读。

Android 5.0 Camera系统源码分析(5):Camera预览3A流程(4).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/984277.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: