高通camera open代码流程(hal到kernel)

内容:简单介绍Camera open代码调用流程,从HAl到kernel。(api1+hal1)
前言
Android camera api和hal对应关系。安卓在版本更新过程中,camera相关代码也经历了几个版本的更新,表现为camera HAL版本更新(HAL1->HAL2->HAL3),camera API版本更新(camera API1->camera API2),接下来简单看一下camera API1,API2,camera HAL1,HAL3之间的调用关系,由于camera HAL2只是一个过渡版本,并且实际上并没有使用,所以不做讨论。
代码位置和版本转换
\frameworks\av\services\camera\libcameraservice\CameraService.cpp

上述代码的基本判断逻辑是:
打开HAL版本没有特殊指定,或者指定的HAL版本和要打开的Camera默认的HAL版本相同, 则根据要打开的Camera的默认HAL版本创建Client, 此时,如果HAL层默认使用HAL1,则创建 CameraClient, 如果HAL层默认使用HAL3, 根据使用API进行判断, 使用API1则创建 Camera2Client, 使用API2则创建 CameraDeviceClient.
上面几个client的代码位置
Z:\code\i13\HLOS\frameworks\av\services\camera\libcameraservice\api1
Z:\code\i13\HLOS\frameworks\av\services\camera\libcameraservice\api2
我们这里使用的是(api1+hal1)
1.camera open流程
frameworks\av\services\camera\libcameraservice\device1\CameraHardwareInterface.h

可以看到调用的是module的open。
\hardware\qcom\camera\QCamera2\HAL\wrapper\QualcommCamera.cpp

从自己加的log可以看得出来,这个camera_device_open调用的是QCamera2Factory.cpp里面的。
hardware\qcom\camera\QCamera2\HAL\QCamera2Factory.cpp

Camera_open函数调到了mm层,mm_camera_intereface.c是mm层的接口
typedef struct {

} mm_camera_ops_t;
从HAL层调用到mm层,一般都是mCameraHandle->ops->这种方式直接调到mm层。

在mm_camera_open里面实际上是打开camera 设备节点,/dev/video0或者是/dev/video1调用方法open。
\hardware\qcom\camera\QCamera2\stack\mm-camera-interface\src\mm_camera.c

从这里开始调到了kernel,camera在kernel层的主体文件msm.c,负责设备的具体注册和相关方法的填充。

从log中看,接下来是调到了msm_sensor_driver_probe。
\kernel\drivers\media\platform\msm\camera_v2\sensor\msm_sensor_driver.c

在这个函数里面调用sensor_power_up开始上电和匹配sensor id,接下来看sensor_power_up
上面代码可以看到调用的是func_tbl结构体里面的sensor_power_up

实际上是调用了msm_sensor_power_up
kernel\drivers\media\platform\msm\camera_v2\sensor\msm_sensor.c

这里面调用msm_sensor_power_up和msm_sensor_check_id正式给camera上电和匹配sensor id。
kernel\drivers\media\platform\msm\camera_v2\sensor\io\msm_camera_dt_util.c

根据power_setting的seq_type分别进行camera上电。上点结束之后返回,开始调用msm_sensor_check_id,

根据加的log来看,这里调的是func_tbl里面的msm_sensor_match_id
kernel\drivers\media\platform\msm\camera_v2\sensor\msm_sensor.c

通过i2c_read去寄存器读取sensor id,和slave_info里面的sensor id进行匹配比较。

再从log里面看,开始上电,上电结束,匹配sensor id,至此camera open流程结束。

你可能感兴趣的:(高通camera open代码流程(hal到kernel))