相关文章
- [Android O] Camera 服务启动流程简析
- [Android O] HAL3 之 Open Camera2 流程(零)—— 概览
- [Android O] HAL3 之 Open Camera2 流程(一)—— 从 App 到 CameraService
- [Android O] HAL3 之 Open Camera2 流程(二)—— 从 CameraService 到 HAL Service
- [Android O] HAL3 之 Open Camera2 流程(三,完结)—— 从 HAL Service 到 Camera HAL
打开相机流程中,从 APP 到 CameraService 再到 HAL Service 的连路创建流程都已经简略分析了一遍。现在需要分析最后的阶段,即从 HAL Service 连接到 Camera HAL 的部分。
其实 HAL 层真正的运作流程我也还没真正弄清楚,好在现在只需要分析它的构造与初始化部分,这相对来说还是比较简单的。
在 HAL3 中,Camera HAL 的接口转化层(以及流解析层)由 QCamera3HardwareInterface 担当,而接口层与实现层与 HAL1 中基本没什么差别,都是在 mm_camera_interface.c 与 mm_camera.c 中。
那么接口转化层的实例是何时创建的,又是怎么初始化的,创建它的时候,与接口层、实现层又有什么交互?通过下图展示的主要调用流程可以简单了解了解。
接下来可以看看代码流程。
HAL Service
CameraModule
文件路径:hardware\interfaces\camera\common\1.0\default\CameraModule.cpp
上回说到,CameraDevice::open
的实现中,调用了 mModule->open
,即 CameraModule::open
。来看看它的具体实现。
通过代码来看,它做的事并不多,主要是调用 mModule->common.methods->open
,来进入下一层级的流程。
而这里则需要注意了,open
是一个函数指针,它指向的是 QCamera2Factory 的 camera_device_open
方法,至于为什么和 QCamera2Factory 有关,这就要回头看 HAL Service 的启动初始化流程了。对我来说这不重要,就不赘述了。
int CameraModule::open(const char* id, struct hw_device_t** device) {
int res;
ATRACE_BEGIN("camera_module->open");
res = filterOpenErrorCode(mModule->common.methods->open(&mModule->common, id, device));
ATRACE_END();
return res;
}
Camera HAL
QCamera2Factory
文件路径:hardware\qcom\camera\qcamera2\QCamera2Factory.cpp
省略一些不关心的内容,这里实际上做的事也不多。
- 首先注意第 31~33 行,这里就将前面所说的 open
函数指针指定为了 camera_device_open
这个方法。
- 第 22~27 行,注意到这里通过宏定义添加了对 HAL1 的兼容操作。实际上是要调用 cameraDeviceOpen
来进行下一步操作。
/*===========================================================================
* FUNCTION : camera_device_open
*
* DESCRIPTION: static function to open a camera device by its ID
*
* PARAMETERS :
* @camera_id : camera ID
* @hw_device : ptr to struct storing camera hardware device info
*
* RETURN : int32_t type of status
* NO_ERROR -- success
* none-zero failure code
*==========================================================================*/
int QCamera2Factory::camera_device_open(
const struct hw_module_t *module, const char *id,
struct hw_device_t **hw_device)
{
/* Do something in */
......
/* Do something out */
#ifdef QCAMERA_HAL1_SUPPORT
if