研究导向:
open
camera过程中有些初始化设置参数需要从vendor层获取,而vendor与hal隶属于不同进程,通过ION机制设置共享内存来实现不同进程间数据共享,下面简要介绍流程:
在初始化过程中hal层会通过socket将消息发送至vendor层-通知vendor
map共享内存。
ION初始化过程:
vim
hardware/qcom/camera/QCamera2/HAL/QCamera2HWI.cpp
int QCamera2HardwareInterface::openCamera()
{
……
if (NULL ==
gCamCapability[mCameraId]) {
if(NO_ERROR !=
initCapabilities(mCameraId,mCameraHandle)) {
//会初始化ION
......
}
}
mCameraHandle->ops->register_event_notify(mCameraHandle->camera_handle,
camEvtHandle,
(void *) this);
……
pthread_mutex_lock(&m_parm_lock);
//初始化m_pCapability-从vendor层拿到的camera相关初始化数据
mParameters.init(gCamCapability[mCameraId],
mCameraHandle, this, this);
pthread_mutex_unlock(&m_parm_lock);
mParameters.m_parm_lock_ptr =
&m_parm_lock;
ALOGI("openCamera:
m_parm_lock_ptr = 0x%x", mParameters.m_parm_lock_ptr);
mCameraOpened = true;
gCameraOpened = true;
#ifdef USE_ARCSOFT_FEATURE
if ((NULL !=
mArcSoft_Feature)&&(mCameraId == 0))
mArcSoft_Feature->imx214_module_source =
gCamCapability[0]->fih_imx214_module_source;//MM-YW-Get module
source for HAL-00
#endif
return NO_ERROR;
}
int
QCamera2HardwareInterface::initCapabilities(uint32_t
cameraId,
mm_camera_vtbl_t *cameraHandle)
{
ATRACE_CALL();
int rc = NO_ERROR;
QCameraHeapMemory
*capabilityHeap = NULL;
capabilityHeap = new
QCameraHeapMemory(QCAMERA_ION_USE_CACHE);
rc =
capabilityHeap->allocate(1,
sizeof(cam_capability_t)); //1、设置ION共享内存
......
memset(DATA_PTR(capabilityHeap,0), 0,
sizeof(cam_capability_t));
//2、通过socket通知vendor映射共享内存用于进程间通信
rc =
cameraHandle->ops->map_buf(cameraHandle->camera_handle,
CAM_MAPPING_BUF_TYPE_CAPABILITY,
capabilityHeap->getFd(0),
sizeof(cam_capability_t));
if(rc < 0) {
ALOGE("%s: failed to map capability buffer",
__func__);
goto map_failed;
}
rc =
cameraHandle->ops->query_capability(cameraHandle->camera_handle);
if(rc < 0) {
ALOGE("%s: failed to query
capability",__func__);
goto query_failed;
}
gCamCapability[cameraId] =
(cam_capability_t *)malloc(sizeof(cam_capability_t));
if
(!gCamCapability[cameraId]) {
ALOGE("%s: out of memory", __func__);
goto query_failed;
}
memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0),
sizeof(cam_capability_t));
//copy the preview sizes and
video sizes lists because they
//might be changed
later
copyList(gCamCapability[cameraId]->preview_sizes_tbl,
savedSizes[cameraId].all_preview_sizes,