第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阶段,我习惯把它拆成:

  1. 前端ISP (IFE) — 处理RAW域:黑电平校正、去马赛克、白平衡
  2. 中端ISP (IPE) — 处理YUV域:降噪、边缘增强、色彩校正
  3. 后端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软件栈。你看一眼,就能明白各层怎么协作。

高通Camera软件栈架构图 应用层 (Camera App / Framework) HAL层 (mm-camera / CHI) camera_module_t | camera_device_t | CHI UMD Pipeline层 (Camera Pipeline) Sensor阶段 → ISP阶段 → Post-Processing阶段 IFE | IPE | BPS | 3A | HDR合成 | 编码 ISP子系统 (硬件层) Bayer处理 | 3A统计 | 降噪 | HDR合成 | 色彩校正 数据流从上到下:App → HAL → Pipeline → ISP → Sensor

你看这个结构,数据流是单向的,但控制流是双向的。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的寄存器配置顺序决定成败