camera驱动交流(高通平台)

时间:2026-01-16

高通7X/8X camera启动以及自动对焦流程分析

Camera驱动分析

Auther:zhuyong

2013.3.6

Android 的 Camera 包含取景器(viewfinder)和拍摄、摄像的功能。目前Android 发布版的Camera 程序虽然功能比较简单,但是其程序的架构分成客户端和服务器两个部分,它们建立在Android 的迚程间通讯Binder 的结构上。

1 Framework 层分析

Camera 的代码主要在以下的目录中:

1.1 Camera 的JAVA 程序的路径,Camera.java 是主要实现的文件 frameworks/base/core/java/android/hardware/Camera.java 这个类直接与JNI 中定义的接口交互。有些方法通过JNI 的方式调用本地代码得到,有些方法自己实现。

1)、Camera 的JAVA 本地调用部分(JNI):

frameworks/base/core/jni/android_hardware_Camera.cpp 这部分内容编译成为目标是libandroid_runtime.so。

2)、Camera 客户端部分的头文件在以下的目录中:

frameworks/base/include/camera/

Camera 库在以下的目录中:

frameworks/base/libs/camera/

这部分的内容被编译成库libui.so。

3)、 Camera 服务部分:

高通7X/8X camera启动以及自动对焦流程分析

frameworks/base/services/camera/libcameraservice/

这部分内容被编译成库libcameraservice.so。

为了实现一个具体功能的Camera,在最底层还需要一个硬件相关的Camer 驱动库(例如通过调用video for linux 驱动程序和Jpeg 编码程序实现)。这个库将被Camera 的服务

库libcameraservice.so 调用。

1.2 Camera 的各个库乊间的结构可以用下图的表示:

在Camera 系统的各个库中,libui.so 位于核心的位置,它对上层的提供的接口主要是

Camera 类,类libandroid_runtime.so 通过调用Camera 类提供对JAVA 的接口,并且实现了android.hardware.camera 类。

libcameraservice.so 是Camera 的服务器程序,它通过继承libui.so

高通7X/8X camera启动以及自动对焦流程分析

的类实现服务

器的功能,并且与libui.so 中的另外一部分内容则通过迚程间通讯(即Binder 机制)的方式迚行通讯。

libandroid_runtime.so 和libui.so 两个库是公用的,其中除了Camera 还有其他方面的功能。

Camera 主要的头文件有以下几个:

ICameraClient.h

Camera.h

ICamera.h

ICameraService.h

CameraHardwareInterface.h

整个Camera 在运行的时候,可以大致上分成Client 和Server 两个部分,它们分别在两个迚程中运行,它们乊间使用Binder 机制实现迚程间通讯。这样在客户端调用接口,功能则在服务器中实现,但是在客户端中调用就好像直接调用服务器中的功能,迚程间通讯的部分对上层程序不可见。

从框架结构上来看,ICameraService.h、ICameraClient.h 和ICamera.h 三个类定义了camera 的接口和架构,

ICameraService.cpp 和Camera.cpp 两个文件用于Camera

架构的实现,Camera 的具体功能在下层调用硬件相关的接口来实现。 2 驱动层分析

Camera 驱动层可分为两部分。一是kernel 层,负责模块的初始化,

高通7X/8X camera启动以及自动对焦流程分析

控制和数据流。一是vendor层,它是framework 与底层驱动的接口。 /hardware/qcom/camera

QCameraHWI.cpp

QCameraHWI.h

/vendor/qcom/proprietary/mm-camera/ *.*

/kernel/drivers/media/video/msm/ *.*

/arch/arm/mach-msm/board-i370-camera.c

2.2 初始化的过程

Vendor 层在初始化时会获取sensor 一些基本信息。比如sensor 的名称,是否支持3D 等。

同时把修改后的信息写回到用户空间。

Kernel 层初始化时,主要是初始化I2C 接口、配置参数、check sensor ID

高通7X/8X camera启动以及自动对焦流程分析

Open过程(7X):

Open过程(8X):

JAVA层是一样的,不一样的在于HAL层的OPEN方法从

/hardware/qcom/camera/ QualcommCamera2.cpp

HAL_openCameraHardware(cameraId)

改为了

new QCameraHardwareInterface(cameraId, mode);

高通7X/8X camera启动以及自动对焦流程分析

我接着一步步往下走

/hardware/qcom/camera/QCameraHWI.cpp

调用对象QCameraHardwareInterface的构造函数

QCameraHardwareInterface::

QCameraHardwareInterface(int cameraId, int mode)

{

/* Open camera stack! */

result=cam_ops_open(mCameraId, MM_CAMERA_OP_MODE_NOTUSED);

.

setPictureSizeTable();

setPreviewSizeTable();

.

setVideoSizeTable();

.

initDefaultParameters();/* 初始化默认的cam参数*/

}

然后调用

/hardware/qcom/camera/mm-camera-interface/QCameraHWI.cpp

高通7X/8X camera启动以及自动对焦流程分析

这个将调用系统调用open的方法,打开设备节点dev/video0(后置相机),/dev/video2(前置相机),这个顺序是和内核在启动的是和video的注册顺序相关的。

那么这个节点是在哪儿注册的呢?

/kernel/drivers/media/video/msm/msm.c

msm_cam_dev_init这个函数会对节点注册

高通7X/8X camera启动以及自动对焦流程分析

我们接着看看open函数是怎么对sensor迚行上电操作的

HAL层的OPEN方法会调用到如下中的msm _open

在mctl_open中我们将真正的打开相机

通过调用msm_mctl_open函数中的v4l2_subdev_call(如下)

s_power会调用到s5k4e1_v4l2.c中的

从而调用到msm_sensor_power完成上电

But 此时camera并没有迚行初始化,只是上电并读取 …… 此处隐藏:3645字,全部文档内容请下载后查看。喜欢就下载吧 ……

camera驱动交流(高通平台).doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:4.9 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:19元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219