高通Camx 架构学习笔记

本文详细介绍了Camx的代码结构,包括核心目录和静态库的编译过程。接着,深入分析了Camx代码流程,从camera.provider到camerahal层的调用路径,以及在camxhaldevice.cpp中如何通过函数指针映射实现调用。此外,还探讨了Camx的调试日志开关设置。内容适合Android和硬件驱动开发者阅读,有助于理解Camx架构的工作原理。

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

418a7ac46685a6e694849c4eed6d99f0.gif

和你一起终身学习,这里是程序员Android

经典好文推荐,通过阅读本文,您将收获以下知识点:

一、Camx 代码结构
二、Camx 编译
三、Camx 代码流程分析
四、Camx 调试

一、Camx 代码结构

目前主流的机型都使用camx架构,这个架构和之前架构的主要区别就是 芯片接口层的代码从hardware/qcom 迁移到 vendor/qcom/proprietary/下面,我们主要关注的camera hal层的源码也是放在vendor/qcom/proprietary/camx/下面。

1.1 camera 相关代码目录

e8471d4332d63d74d889909440a6c4fc.jpeg

二、camx 编译

camx的核心目录是 vendor/qcom/proprietary/camx/src/目录下面:

total 40
drwxrwxr-x 10 lxl lxl 4096  4月  4 10:52 ./
drwxrwxr-x  4 lxl lxl 4096  4月  4 10:52 ../
drwxrwxr-x  3 lxl lxl 4096  4月  4 10:52 chiiqutils/
drwxrwxr-x  7 lxl lxl 4096  4月  4 10:56 core/
drwxrwxr-x  7 lxl lxl 4096  4月  4 10:52 csl/
drwxrwxr-x 14 lxl lxl 4096  4月  4 10:52 hwl/
drwxrwxr-x  3 lxl lx 4096  4月  4 10:52 lib/
drwxrwxr-x  3 lxl lxl 4096  4月  4 10:52 osutils/
drwxrwxr-x 11 lxl lxl 4096  4月  4 10:52 swl/
drwxrwxr-x  3 lxl lxl 4096  4月  4 10:52 utils/

核心的Android.mk在 ./lib/build/android/Android.mk 中。
其中包括的静态库如下:

# Libraries to link
LOCAL_STATIC_LIBRARIES :=   \
    libcamxcore             \
    libcamxchi              \
    libcamxcsl              \
    libcamxofflinestats     \
    libnc                   \
    libcamxncs              \
    libifestriping          \
    libstriping

LOCAL_WHOLE_STATIC_LIBRARIES := \
    libcamxdspstreamer          \
    libcamxhwlbps               \
    libcamxgenerated            \
    libcamxhal                  \
    libcamxhalutils             \
    libcamxhwlfd                \
    libcamxhwlife               \
    libcamxhwlipe               \
    libcamxhwliqmodule          \
    libcamxswlfdmanager         \
    libcamxswljpeg              \
    libcamxhwljpeg              \
    libcamxhwllrme              \
    libcamxswlransac            \
    libcamxhwltitan17x          \
    libcamxiqsetting            \
    libcamxosutils              \
    libcamxstats                \
    libcamxsensor               \
    libcamxutils

这些静态库都是camx或者其他的目录下编译的,编译工程的时候,我们要先编译这些静态库,然后编译camx的动态库(/vendor/lib/hw/camera.qcom.so)。

三、camx 代码流程分析

camera.provider中如何实现到camera hal层的跳跃,camera service调用到camera provider中的接口方法,现在调用到 camera provider中的 hardware/interfaces/camera/device/3.2/default/CameraDeviceSession.cpp中的processCaptureRequest(...)方法,最终会调用到:

status_t ret = mDevice->ops->process_capture_request(mDevice, &halRequest);

这个mDevice->ops 就是 hardware/libhardware/include/hardware/camera3.h中的 camera3_device_ops 结构体: (参考:https://www.jianshu.com/p/099cc3b0ab25)

typedef struct camera3_device_ops {
    int (*initialize)(const struct camera3_device *,
            const camera3_callback_ops_t *callback_ops);
    int (*configure_streams)(const struct camera3_device *,
            camera3_stream_configuration_t *stream_list);
    int (*register_stream_buffers)(const struct camera3_device *,
            const camera3_stream_buffer_set_t *buffer_set);
    const camera_metadata_t* (*construct_default_request_settings)(
            const struct camera3_device *,
            int type);
    int (*process_capture_request)(const struct camera3_device *,
            camera3_capture_request_t *request);
    void (*get_metadata_vendor_tag_ops)(const struct camera3_device*,
            vendor_tag_query_ops_t* ops);
    void (*dump)(const struct camera3_device *, int fd);
    int (*flush)(const struct camera3_device *);
 
    /* reserved for future use */
    void *reserved[8];
} camera3_device_ops_t;

camera3_device_ops_t 映射函数指针操作: hardware/libhardware/modules/camera/3_0/Camera.cpp

const camera3_device_ops_t Camera::sOps = {
    .initialize = default_camera_hal::initialize,
    .configure_streams = default_camera_hal::configure_streams,
    .register_stream_buffers = default_camera_hal::register_stream_buffers,
    .construct_default_request_settings
        = default_camera_hal::construct_default_request_settings,
    .process_capture_request = default_camera_hal::process_capture_request,
    .get_metadata_vendor_tag_ops = NULL,
    .dump = default_camera_hal::dump,
    .flush = default_camera_hal::flush,
    .reserved = {0},
};

这样找到在camera hal层的函数指针的映射关系。
  映射到:vendor/qcom/proprietary/camx/src/core/hal/camxhal3entry.cpp中的static Dispatch g_dispatchHAL3(&g_jumpTableHAL3);

/// Array containing camera3_device_ops_t methods
static camera3_device_ops_t g_camera3DeviceOps =
{
    CamX::initialize,
    CamX::configure_streams,
    NULL,
    CamX::construct_default_request_settings,
    CamX::process_capture_request,
    NULL,
    CamX::dump,
    CamX::flush,
    {0},
};

定义了g_camera3DeviceOps变量:

/// Array containing camera3_device_ops_t methods
static camera3_device_ops_t g_camera3DeviceOps =
{
    CamX::initialize,
    CamX::configure_streams,
    NULL,
    CamX::construct_default_request_settings,
    CamX::process_capture_request,
    NULL,
    CamX::dump,
    CamX::flush,
    {0},
};

并在\vendor\qcom\proprietary\camx\src\core\hal\camxhaldevice.cpp的Initialize方法中通过GetCamera3DeviceOps获取,建立联系:

CamxResult HALDevice::Initialize(
    const HwModule* pHwModule,
    UINT32          cameraId)
{
### CAMX架构概述 CAMX架构是一种专为计算机视觉处理设计的硬件加速平台,旨在支持复杂的图像信号处理(ISP)管道以及高效的机器学习推理操作。此架构特别适用于移动设备和其他资源受限环境中的实时视觉应用开发[^1]。 #### 架构原理 CAMX的核心设计理念在于提供一个高度集成化的解决方案,集成了ISP(Image Signal Processor)、GPU、DSP等多种计算单元于一体。这些组件协同工作以优化性能并降低功耗: - **ISP模块**:负责执行原始传感器数据预处理任务,如去噪、白平衡校准等; - **GPU/DSP协处理器**:用于运行更高级别的特征提取算法或神经网络模型推断过程; 整个系统通过专用总线连接各个部分,并利用DMA控制器实现高效的数据传输机制,在保证低延迟的同时提高了整体吞吐率。 #### 主要特点 1. **高性能与低能耗兼顾** - 通过对不同类型的运算任务分配给最适合其特性的硬件单元,实现了卓越的能量效率。 2. **灵活性强** - 支持多种输入源格式转换及输出接口配置选项,便于适配各类应用场景需求。 3. **易于编程** - 提供丰富的API库和工具链,简化开发者对底层细节的操作难度,加快产品上市时间。 4. **强大的可扩展性** - 设计之初就考虑到了未来技术发展趋势,预留了足够的升级空间以便引入新的功能特性。 ```python # 示例代码展示如何初始化CAMX ISP pipeline def initialize_camx_isp_pipeline(): camx = CamxFramework() isp_config = { 'input_format': 'RAW', 'output_resolution': (1920, 1080), 'processing_steps': ['denoise', 'demosaic'] } camx.configure(isp_config) return camx.start_processing() initialize_camx_isp_pipeline() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Android

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值