第2章 高通Camera整体架构:硬件抽象层(HAL)、相机管道(Pipeline)、ISP子系统概览
做高通Camera开发,第一件事是什么?不是调参数,不是写代码。而是先把整个架构图刻在脑子里。
我见过太多工程师,一上来就扎进某个ISP模块调效果,结果发现上层HAL的配置链路根本没打通,折腾两周全白干。说白了,Camera系统是个三层结构:应用层、HAL层、内核驱动层。今天我们就拆开中间那层——高通Camera HAL、Pipeline和ISP子系统。
2.1 硬件抽象层(HAL) — 承上启下的枢纽
HAL是什么?它是Android系统和硬件之间的契约。高通把Camera HAL实现为一个独立的进程——mm-camera,运行在用户空间。
我个人习惯把HAL比作“翻译官”。上层Framework说A语言(比如“打开摄像头”),底层硬件说B语言(比如“初始化MIPI CSI接口”)。HAL负责把A翻译成B,再把结果翻译回去。
核心要点:高通HAL实现了Android定义的 camera_module_t 和 camera_device_t 接口。每个物理摄像头对应一个 camera_device_t 实例。
HAL内部又分两层:
- 上层HAL适配器 — 对接Android Framework,处理metadata、session、stream配置
- 下层CHI (Camera Hardware Interface) — 高通自研的硬件抽象框架,直接调度ISP硬件
嗯,这里要注意。从骁龙845开始,高通主推的就是CHI架构。如果你还在用旧版mm-camera的直调方式,建议尽快迁移。我在一个项目中就吃过这个亏——客户要求支持HDR10+录制,旧架构根本跑不通,最后花了两周重构到CHI才解决问题。
2.2 相机管道(Pipeline) — 数据流的高速公路
Pipeline这个词,你想想看,它就是个流水线。从sensor曝光开始,到最终输出YUV或JPEG,中间经过几十个处理节点。
高通把Pipeline抽象成三个主要阶段:
| 阶段 | 输入 | 输出 | 关键模块 |
|---|---|---|---|
| Sensor阶段 | 光信号 | RAW10/RAW12 | MIPI CSI、PDAF、HDR组合 |
| ISP阶段 | RAW | YUV420 | Bayer处理、AWB/AE/AF、降噪、锐化 |
| Post-Processing阶段 | YUV | JPEG/H.265/显示帧 | 编码、缩放、旋转、水印 |
每个阶段内部还有更细的子节点。比如ISP阶段,我习惯把它拆成:
- 前端ISP (IFE) — 处理RAW域:黑电平校正、去马赛克、白平衡
- 中端ISP (IPE) — 处理YUV域:降噪、边缘增强、色彩校正
- 后端ISP (BPS) — 处理统计数据和3A控制
为什么这么分?因为每个子模块的时钟域、带宽需求、延迟要求都不一样。IFE必须跑在sensor帧率上,而BPS可以慢一些。我在调试8K 30fps HDR时,IFE带宽一度成为瓶颈,最后靠调整Bayer压缩率才解决。
实战技巧:查看当前Pipeline拓扑,可以用高通提供的 camx 调试工具,执行 adb shell dumpsys media.camera 能看到每个stream的pipeline ID和节点延迟。
2.3 ISP子系统 — 图像质量的灵魂
ISP (Image Signal Processor) 是高通Camera系统的核心。骁龙8 Gen2集成了三个ISP:两个14-bit ISP和一个18-bit ISP。为什么需要三个?因为8K HDR需要同时处理长曝光和短曝光两路RAW数据。
ISP子系统的关键模块:
- Bayer处理单元 — 黑电平校正、镜头阴影校正、坏点修复
- 3A统计引擎 — AE/AWB/AF的硬件加速统计
- 降噪模块 — 空域降噪+时域降噪,支持多帧融合
- HDR合成引擎 — 长短帧对齐、运动补偿、色调映射
- 色彩处理管线 — 色彩校正矩阵、Gamma、色调映射
我曾经踩过一个坑:在调试夜景HDR时,发现合成后的图像边缘有鬼影。查了两天,最后定位到是时域降噪模块的motion detection阈值设得太低,把HDR合成后的微运动误判为噪声,导致边缘模糊。把阈值从0.5调到0.8,问题解决。
避坑指南:ISP的寄存器配置顺序非常敏感。我曾经在初始化时先配了AWB再配AE,结果AWB的统计窗口被AE的裁剪区域覆盖,导致白平衡完全偏色。正确的顺序是:先配sensor输出尺寸 → 再配ISP输入裁剪 → 最后配3A统计窗口。
2.4 整体架构关系图
下面这张图是我自己总结的高通Camera软件栈。你看一眼,就能明白各层怎么协作。
你看这个结构,数据流是单向的,但控制流是双向的。HAL层既要向下发配置命令,又要向上报metadata。Pipeline层负责把ISP处理完的buffer送给编码器或显示。
2.5 关键数据结构
在实际开发中,你打交道最多的就是这几个结构体:
// CHI pipeline 配置
typedef struct {
uint32_t num_nodes;
chi_node_t *nodes; // 节点数组
chi_link_t *links; // 节点间连接关系
uint32_t num_input_ports;
uint32_t num_output_ports;
} chi_pipeline_descriptor_t;
// ISP 流配置
typedef struct {
uint32_t stream_id;
uint32_t width;
uint32_t height;
uint32_t format; // RAW10 / YUV420 / NV12
uint32_t fps;
uint32_t hdr_mode; // 0=关闭, 1=单帧HDR, 2=多帧HDR
} isp_stream_config_t;
// 3A 参数集
typedef struct {
float exposure_time; // 曝光时间(ms)
float analog_gain; // 模拟增益(dB)
float digital_gain; // 数字增益(dB)
float awb_r_gain;
float awb_g_gain;
float awb_b_gain;
float focus_distance; // 对焦距离(cm)
} sensor_3a_params_t;
我个人习惯在调试时,先把 isp_stream_config_t 的每个字段打印出来,确认sensor输出和ISP输入完全匹配。很多花屏问题,根源就是format或fps对不上。
2.6 本章小结
高通Camera架构说白了就三层:HAL做接口翻译,Pipeline做数据流水,ISP做图像处理。三者缺一不可。
记住几个关键点:
- HAL层必须走CHI架构,别再用旧版直调
- Pipeline的三个阶段要分开调试,别混在一起
- ISP的寄存器配置顺序决定成败