前言:
在framework中,camera主要是通过以下库来协同工作的:
libandroid_runtime.so、libui.so、libcameraservice.so这几个库对应的文件目录主要是:
Libandroid_runtime.so:
frameworks/base/core/jni/android_hardware_Camera.cpp文件,改文件在编译完成之后就是一个libandroid_runtime.so文件
Libui.so:
Frameworks/base/libs/camera/* 目录,这个目录下有好多个相关的文件:Camera.cpp、CameraParameters.cpp、ICamera.cpp、ICameraClient.cpp、ICameraService.cpp、ICameraRecordingProxy.cpp、ICameraRecordingProxyListener.cpp。这里是整个camera的一个非常关键的地方,在编译完成后主要是生成libui.so库
libcameraservice.so:
Frameworks/base/services/camera/libcameraservice/* 目录。由于camera在正常使用的过程中,需要传输的数据量是非常庞大的,所以整个体系都是基于C/S模式开发,而这部分,就是一个Service。而这个service对应的Client,其实就是上面所说的libui.so。
二、Camera驱动架构
Camera驱动的几个重要组成部分
Imgsensor:整个camera驱动的核心,主要是摄像头感光芯片部分,相机像素大小、成像能力等都取决于此
Flashlight:就是一个控制led的外部IC芯片(当然有些平台的PMIC上也会有内置),在相机中主要是主闪和预闪功能。在手机中除了拍照打闪之外,还有手电筒功能也是通过这部分实现
Actuator :即对焦马达,在AF模组中才会有这部分东西,驱动内部的主要实现是控制摄像头镜头的移动
EEPROM:主要是用来存一些校准数据,如摄像头模组的OTP数据、AWB校准数据、Lens Shadding的校准数据等等,这一般在像素较大的模组中使用,一般模组校准数据量比较小或者没有校准数据的模组都不会用到它。
当然,还有其他的“附属产品”,如CSI、CCI等。
三、Camera驱动的工作过程
可以简单概述:kernel起来以后进行msm_sensor_driver的模块儿初始化,对dts配置进行相关的解析,在android起来以后,会启动camera 的守护进程Server,调用一系列的初始化接口,先获取sensor name,根据name去匹配相关的初始化配置,再传到底层写入到模组寄存器
这里先是填充了MCT的几个基本的操作函数:set_mod;query_mod;start_session和stop_session。
这几个基本的操作接口,其中包含了对sensor、actuator、eeprom等的操作接口
其次是对每一个sensor实体进行的一些基本init,包括find object、fill相关的一些操作接口等等
find sensor 的过程
前面提到,在module_sensor_init函数中,对start_session这个接口进行了绑定,sensor的power up和reg init等操作,也就是在start_session这个接口当中完成,通过里面相关的接口,最终会调用到kernel里面的接口,进行上下电,match sensor id,读写寄存器等操作:
四、驱动调试移植过程
可以参考blog:基于qualcomm平台的Camera Bring up