基于qualcomm平台的camera 驱动详解

本文详细介绍了Android系统的Camera架构,包括framework层面的库协同工作原理及Camera驱动的关键组件。探讨了libandroid_runtime.so、libui.so、libcameraservice.so的作用,并分析了Imgsensor、Flashlight、Actuator等驱动组成部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

一、Android camera架构


在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

### 关于 Camera 驱动的下载、安装与配置 #### 1. **Camera 驱动的获取** 通常情况下,Camera 驱动由硬件厂商提供,或者可以从开源项目中找到对应的实现。对于 Android 平台上的相机驱动开发,主要依赖 Linux 内核中的 V4L2(Video4Linux2)框架来完成设备注册和控制逻辑[^1]。 - 如果目标平台是高通芯片组,则可以在 Qualcomm 提供的 BSP(Board Support Package)中找到相关驱动源码。例如,在 `vendor/qcom/proprietary/mm-camera` 路径下可能包含了针对特定 SoC 的 Camera 配置文件,如 `msm8953_camera.xml` 中定义了传感器的具体参数设置[^2]。 - 对于其他类型的 SOC 或者自研硬件方案,开发者可以根据需求选择合适的 sensor 模型作为参考对象进行移植工作。比如 OV5648 和 GC2145 就是非常常见的两种 CMOS 图像传感器型号[^4]。 #### 2. **Camera 驱动的编译与部署** 在获得完整的 kernel source tree 后,按照标准流程构建整个 system image 即可自动包含所选 sensors 的支持功能: ```bash # 假设已经设置了正确的环境变量 ANDROID_BUILD_TOP cd $ANDROID_BUILD_TOP source build/envsetup.sh lunch <target_product>-<build_variant> make -j$(nproc) ``` 完成后生成的目标镜像会携带预编译好的 module 文件位于 out/target/product/<device_name>/root/lib/modules/ 下面等待后续加载操作执行。 #### 3. **Camera 驱动的初始化与测试** 当新版本固件刷入到终端之后,可以通过以下方式验证其正常运作状态: - 使用 adb shell 登录至远程主机内部后尝试运行 v4l-utils 工具包里的命令行程序查询当前连接的所有 video capture devices 列表以及它们各自的能力描述信息; ```bash adb shell ls /dev/video* v4l2-ctl --list-devices ``` - 结合 ROS framework 实现更高级别的应用层交互演示效果展示实时画面流传输过程[^5]: ```python roslaunch usb_cam usb_cam-test.launch rosrun image_view image_view image:=/usb_cam/image_raw ``` 以上就是关于如何从零开始搭建一套基于 android 系统之上能够成功启动并正常使用外部接入 type cameras 整体思路概述。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值