1. 程式人生 > 實用技巧 >camera開啟流程(Camera JNI--->HAL)

camera開啟流程(Camera JNI--->HAL)

參考:

http://blog.csdn.net/eternity9255/article/details/52126392

一.Clinet端

.client到service的連線

看看客戶端的connect函式有什麼? connenct()函式的實現在libcamera_client.so中實現。它的原始碼在以下路徑中:frameworks/av/camera/Camera.cpp

sp<Camera> Camera::connect(int cameraId)
{

LOGV("connect");

sp<Camera> c = new Camera();

const sp<ICameraService>& cs = getCameraService();//獲取CameraService例項

if (cs != 0) {

c->mCamera = cs->connect(c, cameraId);

}

if (c->mCamera != 0) {

c->mCamera->asBinder()->linkToDeath(c);

c->mStatus = NO_ERROR;

} else {

c.clear();

}

return c;

}


其中通過const sp<ICameraService>& cs =getCameraService(); 獲取CameraService例項,進入getCameraService( )中。


getCameraService( )原始碼檔案如下:frameworks/av/camera/Camera.cpp
// establish binder interface to camera service

const sp<ICameraService>& Camera::getCameraService()
{
    Mutex::Autolock _l(mLock);
    if (mCameraService.get() == 0) {
        sp<IServiceManager> sm = defaultServiceManager();
        sp<IBinder> binder;
        ....................
       binder->linkToDeath(mDeathNotifier);
       mCameraService = interface_cast<ICameraService>(binder);
}
LOGE_IF(mCameraService==0, "no CameraService!?");
return mCameraService;
}
CameraService例項通過binder獲取的,mCameraService即為CameraService的例項。

自己的分析

frameworks/av/camera/Camera.cpp

status_t Camera::connectLegacy

sp<Camera> c = new Camera(cameraId);

sp<Camera> c = new Camera(cameraId);

const sp<ICameraService>& cs = CameraBaseT::getCameraService();

sp<IServiceManager> sm = defaultServiceManager(); //獲得服務

binder = sm->getService(String16(kCameraServiceName));

binder->linkToDeath(gDeathNotifier);

gCameraService = interface_cast<ICameraService>(binder);

gCameraService例項通過binder獲取的,gCameraService即為CameraService的例項。

status = cs.get()->connectLegacy(cl, cameraId, halVersion, clientPackageName, clientUid, /*out*/c->mCamera);

IInterface::asBinder(c->mCamera)->linkToDeath(c);//獲取CameraService例項

二.service端

service端的實現在庫libcameraservice.so中。

回到sp<Camera> Camera::connect(int cameraId)中

c->mCamera = cs->connect(c, cameraId);
即:執行service的connect()函式,並且返回ICamera物件,賦值給Camera的mCamera,服務端connect()返回的是他內部類的一個例項。
service的connect()函式定義庫檔案libcameraservice.so中實現。

connect( )原始碼路徑:frameworks/av/services/camera/libcameraservice/CameraService.cpp

sp<ICamera> CameraService::connect(
  const sp<ICameraClient>& cameraClient, int cameraId) {
  int callingPid = getCallingPid();
  sp<CameraHardwareInterface> hardware = NULL;
  ....................
  hardware = new CameraHardwareInterface(camera_device_name);
  if (hardware->initialize(&mModule->common) != OK) {
  hardware.clear();
  return NULL;
}


   client = new Client(this, cameraClient, hardware, cameraId, info.facing, callingPid);
   mClient[cameraId] = client;
   LOG1("CameraService::connect X");
   return client;
}
首先例項化Camera Hal介面 hardware,然後hardware呼叫initialize()進入HAL層開啟Camear驅動。最後new Client()返回給Client端。 自己分析 CameraService.cpp (frameworks\av\services\camera\libcameraservice\mediatek) status_t Camera::connectLegacy() int apiVersion = mModule->getModuleApiVersion();
connectHelper<ICameraClient,Client>(cameraClient, id, halVersion, clientPackageName, clientUid, API_1, true, false, /*out*/client);
// give flashlight a chance to close devices if necessary.
mFlashlight->prepareDeviceOpen(cameraId); int deviceVersion = getDeviceVersion(id, /*out*/&facing);
ret = makeClient(this, cameraCb, clientPackageName, cameraId, facing, clientPid,
clientUid, getpid(), legacyMode, halVersion, deviceVersion, effectiveApiLevel, /*out*/&tmp)) != NO_ERROR) *client = new Camera2Client(cameraService, tmp, packageName, id, facing, clientPid, clientUid, servicePid, legacyMode); client = static_cast<CLIENT*>(tmp.get());
if ((ret = client->initialize(mModule)) != OK) // Otherwise, add client to active clients list finishConnectLocked(client, partial); 三.HAL層 在Service端通過呼叫initialize()進入HAL層開啟Camear驅動。initialize()的實現在CameraHardwareInterface中,其原始碼如下:

frameworks/av/services/camera/libcameraservice/CameraHardwareInterface.h
status_t initialize(hw_module_t *module)
{
LOGI("Opening camera %s", mName.string());
int rc = module->methods->open(module, mName.string(), (hw_device_t **)&mDevice);
if (rc != OK) {
LOGE("Could not open camera %s: %d", mName.string(), rc);
return rc;
}
initHalPreviewWindow();
return rc;
}
此處通過module->method->open()方法真正開啟Camera裝置,其中module是由它的呼叫者(serivce端:hardware->initialize(&mModule->common) )傳過來的引數。該module的定義在以下路徑:frameworks/av/services/camera/libcameraservice/CameraHardwareInterface.h
class CameraService :
public BinderService<CameraService>,
public BnCameraService
{
class Client : public BnCamera
{
public:
......
private:
.....
};
camera_module_t *mModule;
};
此處還必須找到camera_module_t 的定義,以更好的理解整個執行流程,通過追根溯源找到了camera_module_t 定義,
camera_module_t的定義在以下路徑:hardware/av/include/hardware/camera_common.h中,定義如下
typedef struct camera_module {
hw_module_t common;
int (*get_number_of_cameras)(void);
int (*get_camera_info)(int camera_id, struct camera_info *info);
} camera_module_t;
其中包含get_number_of_cameras方法和get_camera_info方法用於獲取camera info
另外hw_module_t common;這個選項十分重要,此處應重點關注,因為是使用hw_module_t結構體中的open()方法開啟裝置檔案的
繼續找到hw_module_t 結構體的定義。在以下路徑:hardware/libhardware/include/hardware/hardware.h,程式碼如下:
struct hw_module_t;
struct hw_module_methods_t;
struct hw_device_t;

/**
* Every hardware module must have a data structure named HAL_MODULE_INFO_SYM
* and the fields of this data structure must begin with hw_module_t
* followed by module specific information.
*/
typedef struct hw_module_t {
......................
/** Modules methods */
struct hw_module_methods_t* methods;
......................

} hw_module_t;

同樣,找到hw_module_methods_t這個結構體的定義,程式碼如下:
typedef struct hw_module_methods_t {
/** Open a specific device */
int (*open)(const struct hw_module_t* module, const char* id, struct hw_device_t** device);
} hw_module_methods_t;
hw_module_methods_t 結構體中只有open()一個方法,用於開啟camera driver,實現與硬體層的互動。
open()是一個函式指標,對open()賦值的程式碼如下:/hardware/qcom/camera/QualcommCamera.cpp
static hw_module_methods_t camera_module_methods = {
open:camera_device_open,
};

其中camera_device_open()函式呼叫流程如下:


上圖可知,在HAL層的module->methods->open(module, mName.string(), (hw_device_t **)&mDevice)回撥,最終會呼叫到函式mm_camera__epen()。
int32_t mm_camera_open(mm_camera_obj_t *my_obj, mm_camera_op_mode_type_t op_mode)
{
.......................................
snprintf(dev_name, sizeof(dev_name), "/dev/%s", m_camera_util_get_dev_name(my_obj));
do{
n_try--;
my_obj->ctrl_fd = open(dev_name,O_RDWR | O_NONBLOCK);
...................
}while(n_try>0);
....................
return rc;
}

自己分析:主要是這三個資料夾ext feature legacy

CameraHardwareInterface.h (frameworks\av\services\camera\libcameraservice\device1)

res = module->getCameraInfo(atoi(mName.string()), &info);

rc = module->openLegacy(mName.string(),CAMERA_DEVICE_API_VERSION_1_0, (hw_device_t **)&mDevice);

CameraModule.cpp (frameworks\av\services\camera\libcameraservice\common)

mModule->open_legacy(&mModule->common, id, halVersion, device);

Module.h (vendor\mediatek\proprietary\hardware\mtkcam\legacy\module_hal\module)

//getCamDeviceManager在CamDeviceManagerImp.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\devicemgr)

//ICamDeviceManager*getCamDeviceManager() //返回一個ICamDeviceManager結構體 // return &gCamDeviceManager; CamDeviceManagerBase.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\module_hal\devicemgr)的open

NSCam::getCamDeviceManager()->open(device, module, id, halVersion);

CamDeviceManagerBase.openDevice.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\module_hal\devicemgr)

openDeviceLocked(device, module, i4OpenId, device_version);

// [1] check to see whether it's ready to open.

if ( OK != (status = validateOpenLocked(i4OpenId, device_version)) )

// [2] get platform

IPlatform*const pPlatform = getPlatform(); //得到平臺操作函式指標

[3] create device based on device version.

pDevice = pPlatform->createCam1Device(s8ClientAppMode.string(), i4DebugOpenID);

//Cam1DeviceFactory.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\v1\device)

String8 const s8LibPath = String8::format("libcam.device1.so"); //這個是一個動態庫

void *handle = ::dlopen(s8LibPath.string(), RTLD_GLOBAL); //用dlopen開啟庫

s8CamDeviceInstFactory = String8::format("createCam1Device_Default");

void* pCreateInstance = ::dlsym(handle, s8CamDeviceInstFactory.string()); //找到庫裡面的createCam1Device_Default函式指標

//用createCam1Device_Default這個函式指標呼叫函式,單獨分析1

reinterpret_cast<NSCam::Cam1Device* (*)(String8 const&, int32_t const)>(pCreateInstance)(s8ClientAppMode, i4OpenId)

//這個裡會呼叫DefaultCam1Device.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\v1\device)的onInit,具體在哪裡呼叫不知道,看log是有

bool DefaultCam1Device::onInit() //單獨分析8

if ( OK != pdev->initialize() //前面初始化了createCam1Device_Default,這裡呼叫他的initialize函式,單獨分析2

sp<IMMSdkService> cs = getMMSdkService();

sp<IServiceManager> sm = defaultServiceManager(); //獲取服務

// use checkService to avoid blocking if mmsdk service is not up yet

sp<IBinder> binder = sm->checkService(String16("media.mmsdk")); //檢查是是否有media.mmsdk這個服務,編賦值並得到binder

sp<IMMSdkService> service = interface_cast<IMMSdkService>(binder); //轉換

cs->registerCamera1Device(pDevice.get());

mpGestureClient = android::NSSdkClient::IGestureClient::createInstance(); //建立

mpCam1Device->addCamClient(mpGestureClient, "GestureClient"); //加入

mpHRuser->RegisterCamDev(mpCam1Device); //註冊

initHalPreviewWindow(); //初始化預覽的方法,單獨分析3


單獨分析1://用createCam1Device_Default這個函式指標呼叫函式,

DefaultCam1Device::DefaultCam1Device(String8 const& rDevName,int32_t const i4OpenId) //建構函式

: Cam1DeviceBase(rDevName, i4OpenId), mpHalSensor(NULL)

#if '1'==MTKCAM_HAVE_3A_HAL

, mpHal3a(NULL)

#endif

, mbThreadRunning(MFALSE)

//

{

}

//這裡繼承了Cam1DeviceBasempHalSensor,mpHal3a,mbThreadRunning這些類

Cam1DeviceBase::Cam1DeviceBase(String8 const& rDevName,int32_t const i4OpenId)

: Cam1Device(), mpDeviceManager(NULL), mDevName(rDevName), mi4OpenId(i4OpenId)

, mpCamMsgCbInfo(new CamMsgCbInfo), mpParamsMgr(IParamsManager::createInstance(rDevName, i4OpenId))

, mpCamAdapter(NULL), mpCamClient(), mpDisplayClient(), vmpCamClient()

, mIsPreviewEnabled(false), mIsRaw16CBEnabled(false), mTodoCmdMap()

, mTodoCmdMapLock(), mOrientation(0), mLastEnableMsg(0), mStartPreviewTThreadHandle(0)

, mbWindowReady(false)

}

Cam1Device::Cam1Device(): ICamDevice(), mpModuleCallbacks(NULL), mDevice(), mDeviceOps()

{

MY_LOGD("ctor");

::memset(&mDevice, 0, sizeof(mDevice));

mDevice.priv = this;

mDevice.common = gHwDevice;

mDevice.ops = (camera_device_ops*)&mDeviceOps;

mDeviceOps = gCameraDevOps;

//

}

static mtk_camera_device_ops constgCameraDevOps =

{

#define OPS(name) name: camera_##nam

{

OPS(set_preview_window),

OPS(set_callbacks),

OPS(enable_msg_type),

OPS(disable_msg_type),

OPS(msg_type_enabled),

OPS(start_preview),

OPS(stop_preview),

OPS(preview_enabled),

OPS(store_meta_data_in_buffers),

OPS(start_recording),

OPS(stop_recording),

OPS(recording_enabled),

OPS(release_recording_frame),

OPS(auto_focus),

OPS(cancel_auto_focus),

OPS(take_picture),

OPS(cancel_picture),

OPS(set_parameters),

OPS(get_parameters),

OPS(put_parameters),

OPS(send_command),

OPS(release),

OPS(dump)

},

OPS(mtk_set_callbacks),

#undef OPS

};

createCam1Device_Default

new DefaultCam1Device(rDevName, i4OpenId); //這個類就是上面那個,new一個


單獨分析2:initialize

CamClient::CamClient(sp<IParamsManager> pParamsMgr): ICamClient(), mModuleMtx(), mpCamMsgCbInfo(new CamMsgCbInfo) , mpParamsMgr(pParamsMgr)

, mpImgBufPvdrClient(NULL), mpPreviewClient(NULL) , mpRecordClient(NULL), mpFDClient(NULL), mpPreviewFeatureClient(NULL), mbPreviewEnabled(false)

前面初始化了create Cam1Device_Default,這裡呼叫他的initialize函式,

initialize呼叫的是createCam1Device_Default的父類Cam1DeviceBase的initialize

Cam1DeviceBase.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\v1\device)

status_tCam1DeviceBase::initialize() onInit() // (0) Initialize Device Callback.
mpCamMsgCbInfo->mCam1DeviceCb = static_cast<ICam1DeviceCallback*>(this); //設定
Cam1Device回撥函式 Cam1DeviceBase ::onCam1Device_NotifyCb //實際呼叫的這個,因為Cam1DeviceBase 繼承ICam1DeviceCallback switch(msgType) case MTK_CAMERA_MSG_EXT_NOTIFY_CAPTURE_DONE: mpCamClient->startPreview() //開始使能Preview,下章分析 enableMsgType(CAMERA_MSG_PREVIEW_METADATA); //設定資訊型別
// (1) Initialize Parameters.
if ( ! mpParamsMgr->init() ) ParamsManager.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\v1\common\paramsmgr\params) init()
//ParamsManager.update.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\v1\common\paramsmgr\params) updateDefaultParams() //更新攝像頭相關的引數,單獨分析4 updateDefaultEngParams() //沒有做什麼 updateHalAppMode() //設定現在是什麼模式,是defaut,還是pthoto等等
// (2) Create & Initialize ICamClient.
mpCamClient = ICamClient::createInstance(mpParamsMgr); //初始化客戶端 //CamClient.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\v1\client\camclient) CamClient::CamClient //開始有定義,初始化mpPreviewClient,,,,等等 if ( mpCamClient == 0 || ! mpCamClient->init() ) //單獨分析8

單獨分析3:初始化預覽的方法,

initHalPreviewWindow();

mHalPreviewWindow.nw.cancel_buffer = __cancel_buffer;

mHalPreviewWindow.nw.lock_buffer = __lock_buffer;

mHalPreviewWindow.nw.dequeue_buffer = __dequeue_buffer;

mHalPreviewWindow.nw.enqueue_buffer = __enqueue_buffer;

mHalPreviewWindow.nw.set_buffer_count = __set_buffer_count;

mHalPreviewWindow.nw.set_buffers_geometry = __set_buffers_geometry;

mHalPreviewWindow.nw.set_crop = __set_crop;

mHalPreviewWindow.nw.set_timestamp = __set_timestamp;

mHalPreviewWindow.nw.set_usage = __set_usage;

mHalPreviewWindow.nw.set_swap_interval = __set_swap_interval;

mHalPreviewWindow.nw.get_min_undequeued_buffer_count = __get_min_undequeued_buffer_count;

單獨分析4:更新攝像頭相關的引數

updateDefaultParams

// (1) cleanup mParameters.

mParameters = MtkCameraParameters();

updateDefaultParams0() //更新3A,sensor,美顏相關的引數 // Previwe Format updateDefaultPreviewFormat(); // 3A related
// Sensor related
// face beauty updateDefaultParams1() //ParamsManagerImp.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\v1\common\paramsmgr\params) updateDefaultParams1_ByQuery() //ParamsManager.update.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\v1\common\paramsmgr\params) IFeature*const pFeature = IFeature::createInstance(getOpenId()); //建立Feature的結構體,單獨分析5 mpFeatureKeyedMap = pFeature->getFeatureKeyedMap(); //Feature.h (vendor\mediatek\proprietary\hardware\mtkcam\legacy\v1\common\paramsmgr\feature\inc) return &mFeatureMap; //得到這個指標 // reset Scene mode to default. const_cast<FeatureKeyedMap*>(mpFeatureKeyedMap)->setCurrentSceneMode(String8(CameraParameters::SCENE_MODE_AUTO)); //模式 for (size_t fkey = 0; fkey < mpupdateParams->size(); fkey++) updateParams(fkey); //把 所有的updateParams都更新下 mParameters.set(s8KeyName.string(), s8ItemDefault.string()); mParameters.set(s8ItemListKeyName.string(), s8ItemList.string()); updateDefaultParams1_ByDefault() // Fail to query => update by default ,如果前面的updateDefaultParams1_ByQuery失敗就用這個更新 // Prefferd Preview Size for Video updatePreferredPreviewSize() //主要是設定預覽和錄影的size updateDefaultFaceCapacity //更新人臉的預設值
mParameters.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, 15); mParameters.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, 0); mParameters.set(MtkCameraParameters::KEY_MAX_NUM_DETECTED_OBJECT, 0); //1: support; 0: non-support updateDefaultVideoFormat //更新錄影的格式
mParameters.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, CameraParameters::PIXEL_FORMAT_YUV420P); // Panel Size getDisplayRotationSupported() updateDefaultParams2() //單獨分析6 // show for debug. IParamsManager::showParameters(mParameters.flatten());

單獨分析5://建立Feature的結構體

//ParamsManagerImp.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\v1\common\paramsmgr\params) IFeature::createInstance(getOpenId()) INSTANTIATE_CAMERA(0) typedef Feature type; \ static type singleton(_OpenId_); \//這裡是建立一個Feature結構體 fgInitialized = singleton.init() //這裡是呼叫Featureinit函式
// [1] sensor info.
setupSensorInfo_FromExModule
//Feature.extern.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\v1\common\paramsmgr\feature)
querySensorInfo(mi4OpenId, ms8SensorName, mu4SensorType, mi4SensorFacing); //獲取sensor的資訊
Feature.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\v1\common\paramsmgr\feature)
querySensorInfo
NSCam::IHalSensorList *pSensorHalList = NSCam::IHalSensorList::get(); //獲取sensrlist
ri4SensorFacing = pSensorHalList->queryFacingDirection(i4OpenId); //得到sensor的方向
pSensorHalList->queryType(i4OpenId) //獲取sensor的型別和名字
// [2] Custom-specific features
initFeatures_Custom
//Table.custom.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\v1\common\paramsmgr\feature) initFeatures_Custom_dlsym() // (1) dlsym custom features
queryCustomFeature(mFeatureMap, ms8SensorName);
Table.custom.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\v1\common\paramsmgr\feature)
s8Symbol = String8::format("queryCustCamfeature_%s", rs8ModuleName.string()); //含有這個字串的陣列
s8LibPath = String8::format("libcam.paramsmgr.so"); //開啟這個庫,就是我們custom目錄生成的
void *handle = ::dlopen(s8LibPath.string(), RTLD_GLOBAL); //open
pfnCustSensorFeature = (PFN_CUSTOM_SENSOR_FEATURE_T)::dlsym(handle, s8Symbol.string()); //開啟的就是config.ftbl.common_raw.h具體sensor的檔案
pfnCustSensorFeature(rFMap, u4SensorType, mi4SensorFacing) //執行這個queryCustCamfeature_XXX函式
|| initFeatures_Custom_v1() // (2) old (yuv) custom features || initFeatures_Custom_v2() // (3) new common custom features queryCustomFeature(mFeatureMap, String8(DLSYM_MODULE_NAME_COMMON_SENSOR_RAW) //獲取這個config.ftbl.common_raw.h
// [3] Run-time features
initFeatures_RunTime() //Table.runtime.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\v1\common\paramsmgr\feature) initFeatures_Flashlight(); // #define DLSYM_MODULE_NAME_FLASHLIGHT "CUSTOM_FLASHLIGHT"
queryCustomFeature(mFeatureMap, String8(DLSYM_MODULE_NAME_FLASHLIGHT)); //獲取的是custom目錄下的config.ftbl.flashlight.h中的flashlight initFeatures_AFLamp();
#define CUSTOM_AFLAMP "aflamp"
queryCustomFeature(mFeatureMap, String8(DLSYM_MODULE_NAME_AFLAMP)); ////獲取的是custom目錄下的config.ftbl.flashlight.h中的aflamp
initFeatures_CameraShot();
#define DLSYM_MODULE_NAME_CAMERASHOT "CUSTOM_CAMERASHOT"
queryCustomFeature(mFeatureMap, String8(DLSYM_MODULE_NAME_CAMERASHOT)); //獲取的是custom目錄下的config.ftbl.camerashot.h
initFeatures_SenIndepFeature();
queryCustomFeature(mFeatureMap, String8(DLSYM_MODULE_NAME_SENINDEPFEATURE)); //獲取的是custom目錄下的config.ftbl.senindepfeature.h,主要是美顏
// [4] Correct without warning
initFeatures_NoWarningCorrection() //一些相關於低記憶體和HDR的禁止

INSTANTIATE_CAMERA(1) INSTANTIATE_CAMERA(2) INSTANTIATE_CAMERA(0xFF)

單獨分析6:updateDefaultParams2

updateDefaultParams2

//ParamsManager.update.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\v1\common\paramsmgr\params)

updateDefaultParams2_ByQuery()

//ParamsManagerImp.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\v1\common\paramsmgr\params)

sensorDev = (MUINT32)NSCam::IHalSensorList::get()->querySensorDevIdx(getOpenId()); //得到sensor

pSensorHalList = NSCam::IHalSensorList::get(); //得到sensor list

pSensorHalList->querySensorStaticInfo(sensorDev,&sensorStaticInfo); //獲取sensor相關的一下引數

//HalSensorList.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\hal\sensor)

::memcpy(pSensorStaticInfo, gQuerySensorStaticInfo(sensorDevIdx), sizeof(SensorStaticInfo));

gQuerySensorStaticInfo(sensorDev);

sensorStaticInfo[0]; //如果是主攝像頭,這裡實際是在Imgsensor_drv.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\hal\sensor)中通過

pSensorDrv->sendCommand(SENSOR_MAIN, CMD_SENSOR_GET_FAKE_ORIENTATION, (MUINTPTR)&data1); //這個應該是在開機的時候已經運行了

//Imgsensor_drv.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\hal\sensor)

orientation = NSCamCustomSensor::getSensorOrientation(); //獲取的是Cfg_setting_imgsensor.cpp (vendor\mediatek\proprietary\custom\mt6735\hal\d1\imgsensor_src)的方向值

sensorStaticInfo[idx].fakeOrientation = data1;

IHal3A* p3AHal = IHal3A::createInstance(IHal3A::E_Camera_1,getOpenId(),PARAM_NAME); //3A相關的初始化,單獨分析7

p3AHal->getSupportedParams(r3ASupportedParam)

ParamsManagerImp.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\v1\common\paramsmgr\params)

mpHal3aObj->getSupportedParams(rFeatureParam); //得到AE,AF,AWB的一些值

//Aaa_hal.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\core\featureio\pipe\aaa)

rFeatureParam.bAutoWhiteBalanceLockSupported = IAwbMgr::getInstance().isAWBLockSupported();

rFeatureParam.u4MaxFocusAreaNum = IAfMgr::getInstance().getAFMaxAreaNum(m_i4SensorDev);
rFeatureParam.i4MaxLensPos = IAfMgr::getInstance().getMaxLensPos(m_i4SensorDev); rFeatureParam.bExposureLockSupported = IAeMgr::getInstance().isAELockSupported();
.......很多3A的設定。。。。。。。。

updateDefaultParams2_ByDefault() // Fail to query => update by default

單獨分析7:3A相關的初始化

Hal3AAdapter1::Hal3AAdapter1(MINT32 const i4SensorIdx): mpHal3aObj(NULL), mi4FrmId(-1), mi4SensorIdx(i4SensorIdx), mi4User(0), mLock() //初始化

{

}

IHal3A::createInstance(IHal3A::E_Camera_1,getOpenId(),PARAM_NAME);

//Hal3AAdapter1.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\core\featureio\pipe\aaa)//

static Hal3AAdapter1 _singleton(0);

_singleton.init(strUser);

mpHal3aObj = Hal3AIf::createInstance(mi4SensorIdx);

//Aaa_hal_if.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\hal\aaa)

return Hal3AFlowCtrl::createInstance(i4SensorOpenIndex);

Hal3AFlowCtrl.cpp (vendor\mediatek\proprietary\hardware\mtkcam\aaa\source\ipv1.1)

i4SensorDev = pHalSensorList->querySensorDevIdx(i4SensorOpenIndex);

Hal3AFlowCtrlDev<SENSOR_DEV_MAIN>::getInstance()->init(i4SensorDev, i4SensorOpenIndex);

// create 3A wrapper

I3AWrapper.cpp (vendor\mediatek\proprietary\hardware\mtkcam\aaa\source\ipv1.1\wrapper)

return Hal3ARaw::createInstance(i4SensorOpenIndex);

//Hal3ARawImp.cpp (vendor\mediatek\proprietary\hardware\mtkcam\aaa\source\ipv1.1\wrapper)

Hal3ARawImpDev<SENSOR_DEV_MAIN>::getInstance(i4SensorDevId, i4SensorOpenIndex)->init();

// init Thread and state mgr

m_pThreadRaw = IThreadRaw::createInstance(this, m_i4SensorDev, m_i4SensorIdx);

ThreadRawImp.cpp (vendor\mediatek\proprietary\hardware\mtkcam\aaa\source\ipv1.1)

singleton.createAEThread(); // user count protected

MINT32 result = pthread_create(&mAEThread, NULL, onAEThreadLoop, this); //* AE thread execution function

m_pStateMgr = new StateMgr(m_i4SensorDev); //狀態管理

m_pAfStateMgr = new AfStateMgr(m_i4SensorDev); //AF的狀態管理

// AE init

IAeMgr::getInstance().cameraPreviewInit(m_i4SensorDev, m_i4SensorIdx, m_rParam); //AF管理初始化

//Ae_mgr.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\hal\aaa\ae_mgr)

cameraPreviewInit //裡面
// AWB init IAwbMgr::getInstance().init(m_i4SensorDev, m_i4SensorIdx); // AF init IAfMgr::getInstance().setCallbacks(m_i4SensorDev, mpCbSet); IAfMgr::getInstance().init(m_i4SensorDev, m_i4SensorIdx); //FLASH init FlashMgr::getInstance().init(m_i4SensorDev, m_i4SensorIdx); // TuningMgr init m_pTuning = &IspTuningMgr::getInstance(); m_pTuning->init(m_i4SensorDev, m_i4SensorIdx) // state mgr transit to Init state. bRet = postCommand(ECmd_Init);

return Hal3ARawImpDev<SENSOR_DEV_MAIN>::getInstance(i4SensorDevId, i4SensorOpenIndex);


return Hal3AFlowCtrlDev<SENSOR_DEV_MAIN>::getInstance();

單獨分析8:mpCamClient->init()

mpCamClient->init()

CamClient.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\v1\client\camclient)

mpPreviewClient = IPreviewClient::createInstance(mpParamsMgr); mpPreviewClient->init()
mpImgBufQueue = new ImgBufQueue(IImgBufProvider::eID_PRV_CB, "PrvCB@ImgBufQue"); //建立一個圖片快取BUF佇列
mpRecordClient = IRecordClient::createInstance(mpParamsMgr);
mpRecordClient->init() mpFDClient = IFDClient::createInstance(mpParamsMgr);
mpFDClient->init()
FDClient.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\v1\client\camclient\fd) mpImgBufQueue = new ImgBufQueue(IImgBufProvider::eID_FD, "FDBuf@ImgBufQue");
mpPreviewFeatureClient = IPREFEATUREClient::createInstance(mpParamsMgr);
mpPreviewFeatureClient->init()

FDClient::FDClient(sp<IParamsManager> pParamsMgr): mCmdQue(), mCmdQueMtx() , mCmdQueCond() , mi4ThreadId(0)

, mModuleMtx() , mpCamMsgCbInfo(new CamMsgCbInfo) , mpParamsMgr(pParamsMgr) , mIsFDStarted(0), mi4CallbackRefCount(0)

, mi8CallbackTimeInMs(0) , mpImgBufQueue(NULL) , mpImgBufPvdrClient(NULL) , mpGDHalObj(NULL) , mpDetectedFaces(NULL)

, mpDetectedGestures(NULL), mIsDetected_FD(false), mIsDetected_SD(false), mIsDetected_GD(false) , mIsSDenabled(false)

, mIsGDenabled(false)

{

MY_LOGD("+ this(%p)", this);

}

單獨分析8:DefaultCam1Device::onInit() //

IResManager* pResManager = IResManager::getInstance();

ResManager.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\core\drv\resmanager)

return &gResManager;

pResManager->open(USER_NAME)

android_atomic_inc(&mUser);

// (0) power on sensor

pthread_create(&mThreadHandle, NULL, doThreadInit, this)

doThreadInit

DefaultCam1Device* pSelf = reinterpret_cast<DefaultCam1Device*>(arg);

powerOnSensor()

uint32_t sensorIdx = getOpenId(); //得到open的攝像頭的ID

NSCam::IHalSensorList* pHalSensorList = NSCam::IHalSensorList::get(); //獲取攝像頭列表

mpHalSensor = pHalSensorList->createSensor(USER_NAME,getOpenId());//建立

HalSensorList.openList.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\hal\sensor)

vSensorIndex.add(index);

openSensor(vSensorIndex, szCallerName);

mSensorDevCreated = mEnumSensorList[vSensorIndex[0]].meSensorDev;//JH

pHalSensor = new HalSensor();

// onCreate callback

pHalSensor->onCreate(vSensorIndex)

HalSensor.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\hal\sensor)

mSensorDataMap.setCapacity(vSensorIndex.size());

mpSensorDrv = SensorDrv::get();

//Imgsensor_drv.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\hal\sensor)

return ImgSensorDrv::singleton()

mpSeninfDrv = SeninfDrv::createInstance();

//HalSensorList.openList.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\hal\sensor)

SeninfDrvImp singleton;

mpHalSensor->powerOn(USER_NAME, 1, &sensorIdx) //給sensor上電,單獨分析9

//HalSensor.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\hal\sensor)

int fd = open("/dev/devmap", O_RDONLY);

// workaround: yuv sensor, 3A depends on sensor power-on

NSCam::IHalSensorList::get()->queryType( getOpenId() ) == NSCam::NSSensorType::eYUV //如果是YUV的,waitThreadInitDone()

mpHal3a = NS3A::IHal3A::createInstance(NS3A::IHal3A::E_Camera_1,getOpenId(),LOG_TAG);

IHal3A.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\hal\aaa)

單獨分析9:給sensor上電

mpHalSensor->powerOn(USER_NAME, 1, &sensorIdx)

//HalSensor.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\hal\sensor)

int fd = open("/dev/devmap", O_RDONLY);

ioctl(fd, READ_DEV_DATA, &devinfo_data) //得到一些資訊

mpSeninfDrv->init();

//Seninf_drv.cpp (vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6735\hal\sensor)

// Open isp driver

m_pIspDrv = IspDrv::createInstance();

mfd = m_pIspDrv->isp_fd_open("seninf_drv");

mfd = open(ISP_DEV_NAME, O_RDWR); //開啟/dev/camera-isp

//Open sensor driver

m_fdSensor = open(SENSOR_DEV_NAME, O_RDWR); //開啟/dev/kd_camera_hw

mmap seninf reg

.............分配一下記憶體。。。。。

// Read CIS efuse value

int fd = open("/dev/devmap", O_RDONLY, 0);

ioctl(fd, READ_DEV_DATA, &devinfo_data)

ret = mpSensorDrv->init(sensorDev);

//

sprintf(cBuf,"/dev/%s",CAMERA_HW_DEVNAME); //kd_camera_hw

m_fdSensor = ::open(cBuf, O_RDWR);

//set sensor driver

ret = ioctl(m_fdSensor, KDIMGSENSORIOC_X_SET_DRIVER,sensorDrvInit); //設定驅動

//init. resolution

getResolution

err = ioctl(m_fdSensor, KDIMGSENSORIOC_X_GETRESOLUTION2, &resolution); //獲取解析度

ret = featureControl((CAMERA_DUAL_CAMERA_SENSOR_ENUM)sensorDevId, SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ, (MUINT8*)&FeaturePara32,(MUINT32*)&FeatureParaLen);

featureCtrl.InvokeCamera = InvokeCamera;

featureCtrl.FeatureId = FeatureId;

featureCtrl.pFeaturePara = pFeaturePara;

featureCtrl.pFeatureParaLen = pFeatureParaLen;

err = ioctl(m_fdSensor, KDIMGSENSORIOC_X_FEATURECONCTROL , &featureCtrl);

ret = featureControl((CAMERA_DUAL_CAMERA_SENSOR_ENUM)sensorDevId, SENSOR_FEATURE_GET_PERIOD, (MUINT8*)pFeaturePara16,(MUINT32*)&FeatureParaLen);

setTgPhase() //設定TG的clk等

ret = pSensorDrv->sendCommand(SENSOR_MAIN, CMD_SENSOR_GET_PAD_PCLK_INV, (MUINTPTR)&u4PadPclkInv1);

// Config TG, always use Camera PLL, 1: 48MHz, 2: 104MHz

pSeninfDrv->setMclk1(

pcEn, mclkSel1 /*sensorInfo.SensorMasterClockSwitch ? 0 : 1*/,

clkCnt1, sensorDrvInfo[0].SensorClockPolarity ? 0 : 1,

sensorDrvInfo[0].SensorClockFallingCount, sensorDrvInfo[0].SensorClockRisingCount, u4PadPclkInv1);

setSensorIODrivingCurrent() //設定攝像頭io的驅動電流

switch(sensorDrvInfo[0].SensorDrivingCurrent)

case ISP_DRIVING_2MA://4 //4mA

increaseDivingCurrent1 = 0x0;

pSeninfDrv->setMclk1IODrivingCurrent(increaseDivingCurrent1);

// Open sensor, try to open 3 time

mpSensorDrv->open(sensorDev)

err = ioctl(m_fdSensor, KDIMGSENSORIOC_X_SET_CURRENT_SENSOR, &sensorIdx);

err = ioctl(m_fdSensor, KDIMGSENSORIOC_T_OPEN);