微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > MT6797平台ap端手动调焦实现

MT6797平台ap端手动调焦实现

时间:10-02 整理:3721RD 点击:

MT6797平台ap端手动调焦实现
6797平台ap端手动调焦实现ap端可以直接控制lens position ,一般用于manual mode feature.
ap端首先需求将focus-mode置为"manual",然后因为hal层3a部分切换到"manual mode"需要100-200ms,所以生效后会有一个回调onMFDone送给ap,之后ap可以通过setFocusEngStep接口来控制lens position.

1. FeatureFlowControl.cpp
(\vendor\mediatek\proprietary\hardware\mtkcam\middleware\v1.4\v1\adapter\scenario\flowcontrol\feature)
1.1 在
using namespace NSCam;
前面添加
#define SUPPORT_3A (1)
//
#if SUPPORT_3A
#include <Hal3/IHal3A.h>
using namespace NS3Av3;
#endif
1.2 setParameters函数开始处添加
IHal3A* pHal3a = IHal3A::createInstance(IHal3A::E_CAMERA_3,getOpenId(),LOG_TAG);
if(!pHal3a) {
MY_LOGE("pHal3a == NULL");
return INVALID_OPERATION;
}
//
if (::strcmp(mpParamsManagerV3->getParamsMgr()->getStr(CameraParameters::KEY_FOCUS_MODE),"manual")==0) {
pHal3a->send3ACtrl(NS3Av3::E3ACtrl_SetAFMode,NSIspTuning::EOperMode_EM,0);
// AF Manual Focus Position
//pHal3a->send3ACtrl(NS3Av3::E3ACtrl_SetAFMode,MTK_CONTROL_AF_MODE_OFF,NULL);
MINT32 i4MFPos = mpParamsManagerV3->getParamsMgr()->getInt(MtkCameraParameters::KEY_FOCUS_ENG_STEP);
pHal3a->send3ACtrl(NS3Av3::E3ACtrl_SetAFMFPos,i4MFPos,NULL);
MY_LOGD("i4MFPos(%d)",i4MFPos);
}
pHal3a->destroyInstance(LOG_TAG);
2. StreamingProcessor.cpp
(\vendor\mediatek\proprietary\hardware\mtkcam\middleware\v1.4\legacypipeline\processor)

2.1 在
bool isAfCallback(
MUINT8 afState,
MINT& msg,
MINT& msgExt);
后面添加
bool isAfModeCallback(
MUINT8 afState,
MINT& msg);
2.2 isAfModeCallback的实现
bool
StreamingProcessorImp::
isAfModeCallback(
MUINT8 afmode,
MINT& msg)
{
bool bAfModeCallback = false;
if (::strcmp(mpParamsManagerV3->getParamsMgr()->getStr(CameraParameters::KEY_FOCUS_MODE), "manual") !=
0) {
return bAfModeCallback;
}
if (afmode == MTK_CONTROL_AF_MODE_OFF) {
bAfModeCallback = true;
msg = MTK_CAMERA_MSG_EXT_NOTIFY_MF;
MY_LOGD1("do afmode callback.");
}
return bAfModeCallback;
}
2.3 在onResultReceived函数中的
if(isAfCallback(mAfstate, msg, msgExt))
{
// do multi af window callback
if(isSupportMultiZonAfWindow)
{
checkMultiZoneAfWindow(result);
}
//
doNotifyCb(
requestNo,
msg,
msgExt,
0,
0);
lastAFCBMsg = msg;
lastAFCBExt = msgExt;
}
后面添加
{
Mutex::Autolock _ml(m3ALock);
msg = 0;
MUINT8 curAfmode = 0;
tryGetMetadata< MUINT8 >(result, MTK_CONTROL_AF_MODE, curAfmode);
if (isAfModeCallback(curAfmode,msg)) {
doNotifyCb(requestNo,msg,0,0,0);
} }
2.4 在needFocusCallback函数中将
if( ::strcmp(mpParamsManagerV3->getParamsMgr()->getStr(CameraParameters::KEY_FOCUS_MODE),
CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) == 0 ||
::strcmp(mpParamsManagerV3->getParamsMgr()->getStr(CameraParameters::KEY_FOCUS_MODE),
CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) == 0 }
改为
if( ::strcmp(mpParamsManagerV3->getParamsMgr()->getStr(CameraParameters::KEY_FOCUS_MODE),
CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) == 0 ||
::strcmp(mpParamsManagerV3->getParamsMgr()->getStr(CameraParameters::KEY_FOCUS_MODE),
CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) == 0 ||
::strcmp(mpParamsManagerV3->getParamsMgr()->getStr(CameraParameters::KEY_FOCUS_MODE), "manual") == 0)
3. MtkCamera.h (\vendor\mediatek\proprietary\hardware\mtkcam\ext\include\camera)
3.1 在
MTK_CAMERA_MSG_EXT_NOTIFY_P2DONE = 0x00000017,
后面添加
MTK_CAMERA_MSG_EXT_NOTIFY_MF = 0x00000019
4. Camera.Java (\php?mod=tag&id=6090" target="_blank" class="relatedlink">Frameworks\base\core\java\android\hardware)
4.1 添加一个msg定义
private static final int MTK_CAMERA_MSG_EXT_NOTIFY_MF = 0x00000019;
4.2 添加interface定义
public interface ManualFocusCallback
{
void onMFDone();
}
public final void setMFCallback(ManualFocusCallback cb)
{
mMFCallback = cb;
}
4.3 添加message处理
private ManualFocusCallback mMFCallback;
4.4 在handleMessage函数的
case MTK_CAMERA_MSG_EXT_NOTIFY_SMILE_DETECT:
if (mSmileCallback != null) {
mSmileCallback.onSmile();
}
break;
后面添加
case MTK_CAMERA_MSG_EXT_NOTIFY_MF:
if (mMFCallback != null) {
mMFCallback.onMFDone();
}
break;

感谢分享

学习了

感谢分享啊

不错呀,正想了解6797

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top