高通Camera HAL层HAL3适配工程案例 - 第1节
1.1 Android Camera HAL 架构演进
Android Camera HAL(硬件抽象层)是连接 Android 框架与底层 Camera 硬件的关键桥梁。从 Android 4.0 到 Android 14,HAL 架构经历了从 HAL1 到 HAL3 的重大演进,每一次迭代都旨在解决性能瓶颈、扩展功能边界并提升图像质量。
核心演进驱动力: 移动摄影从“拍照”转向“计算摄影”,需要更精细的硬件控制、更低的延迟以及更灵活的 ISP 管线调度能力。
1.1.1 架构演进时间线
| Android 版本 | HAL 版本 | 关键特性 | 局限性 |
|---|---|---|---|
| 4.0 (ICS) | HAL1 | 简单预览/拍照,单路流 | 无法多路流,延迟高,无逐帧控制 |
| 4.4 (KitKat) | HAL1.2 | 增加 HDR、连拍支持 | 仍基于 HAL1 架构,扩展性差 |
| 5.0 (Lollipop) | HAL3 | 引入 Camera3 接口,逐帧控制,多路流 | 驱动适配复杂,需重写 ISP 管线 |
| 8.0 (Oreo) | HAL3 + Treble | HIDL 化,vendor 与 framework 解耦 | 接口标准化,但性能开销增加 |
| 12+ | HAL3 + HIDL/AIDL | 可选的 AIDL 接口,更低的 binder 延迟 | 需同时维护两套接口 |
1.1.2 架构演进 SVG 时间线
1.2 HAL3 与 HAL1 核心区别
HAL3 并非 HAL1 的简单升级,而是对 Camera 控制模型的彻底重构。HAL1 采用“黑盒”模式,Framework 只能发起预览/拍照/录像等粗粒度操作;HAL3 则暴露了 ISP 管线的逐帧控制能力,使 Framework 和 App 能够精确控制每一帧的曝光、增益、白平衡、AE/AF/AWB 策略等参数。
1.2.1 核心差异对比表
| 对比维度 | HAL1 | HAL3 |
|---|---|---|
| 控制粒度 | 粗粒度(打开/关闭 Camera) | 逐帧细粒度控制(per-frame controls) |
| 数据流模型 | 单路流(预览/拍照/录像互斥) | 多路流(同时输出预览、拍照、分析帧) |
| Buffer 管理 | Framework 分配,HAL 填充 | HAL 管理 Buffer 池,Framework 注册 |
| 3A 控制 | HAL 内部自动完成 | Framework 可下发 3A 策略,HAL 执行 |
| 元数据 | 无标准元数据通道 | CaptureResult 携带完整元数据 |
| 多 Camera 协同 | 不支持 | 支持逻辑 Camera 和多物理 Camera 协同 |
| 延迟 | 预览启动延迟高(~500ms) | 预览启动延迟低(~200ms) |
1.2.2 控制模型对比 SVG
1.3 高通平台 HAL3 整体框架
高通平台的 Camera HAL3 实现基于 mm-camera 架构,经过多年演进已形成一套成熟的模块化软件栈。整体框架从上到下分为:Camera Service → Camera HAL3 → Chi (Camera Hardware Interface) → 底层驱动。
1.3.1 高通 HAL3 分层架构
| 层级 | 模块 | 职责 | 关键文件/接口 |
|---|---|---|---|
| Framework | CameraService | 管理 Camera 生命周期,分发请求 | ICameraService.hal |
| HAL 层 | camera3_device | 实现 HAL3 接口,管理 Stream/Request | camera3.h, qcamera3HWI.cpp |
| Chi 层 | chi_ops | 高通自定义扩展,Usecase 管理 | chi_api.h, chi_metadata.h |
| ISP 层 | mm-camera-isp | ISP 管线调度,3A 算法执行 | isp_ops.h, aec/aec.c |
| 驱动层 | Kernel Sensor/CSIDriver | 硬件寄存器配置,MIPI CSI 接收 | msm_sensor.c, msm_isp.c |
1.3.2 高通 HAL3 整体框架 SVG
1.3.3 高通 HAL3 关键模块说明
- camera3_device_t:HAL3 标准接口,包含
initialize()、configure_streams()、process_capture_request()等核心函数。 - Chi (Camera Hardware Interface):高通自定义扩展层,负责将标准 HAL3 请求映射到高通 ISP 管线。Chi 引入了 Usecase 概念,一个 Usecase 对应一组固定的 Stream 配置和 3A 策略。
- mm-camera-isp:ISP 硬件抽象层,管理 Bayer 处理、Demosaic、降噪、色调映射等模块。3A 算法(AEC/AWB/AF)运行在此层。
- Kernel Driver:基于 V4L2 框架的 MSM_CAM 驱动,负责 MIPI CSI 接收、时钟控制、GPIO 配置等底层操作。
工程提示: 在高通平台进行 HAL3 适配时,80% 的工作量集中在 Chi 层的 Usecase 配置和 ISP 调优上。理解 Chi 的 metadata 流转机制是掌握高通 HAL3 的关键。
1.3.4 高通 HAL3 数据流时序
- CameraService 调用
open()打开 Camera 设备,返回camera3_device_t实例。 - configure_streams() 配置输出流(预览/拍照/录像)和输入流(YUV/RAW)。
- process_capture_request() 下发 CaptureRequest,包含 metadata 和 output buffers。
- Chi 解析 Request,选择对应的 Usecase,将请求拆分为 ISP 可执行的子任务。
- mm-camera-isp 执行 ISP 管线处理,3A 算法更新 metadata。
- process_capture_result() 回调返回 CaptureResult(含 metadata)和填充好的 buffers。
常见适配陷阱: HAL3 要求所有 Stream 必须在
configure_streams() 阶段一次性配置完成,后续不能动态增减。如果 App 在运行中需要切换分辨率或格式,必须重新调用 configure_streams(),这会导致预览中断约 200-500ms。