高通Camera HAL层开发项目实战 - 第4节

4.1 CHI 核心概念与设计哲学

CHI(Camera Hardware Interface)是高通平台从 Snapdragon 845(SDM845)开始引入的新一代 Camera HAL 架构,旨在替代传统的 mm-camera 架构。CHI 的核心设计理念是 “可配置化” 与 “平台解耦”,通过 XML 驱动的方式将硬件控制逻辑从代码中剥离,使得 OEM 厂商无需修改 HAL 层源码即可完成摄像头功能的定制与调优。

核心设计目标:
  • 配置驱动: 使用 XML 文件描述 pipeline、sensor、node 等硬件拓扑,运行时解析加载。
  • 模块化: 将 ISP 处理单元抽象为独立 Node,支持动态组合与复用。
  • 跨平台兼容: 同一套 HAL 框架可适配不同高通 SoC(如 SM8250、SM8450、SM8550)。
  • 性能优化: 减少 BSP 层与 HAL 层的耦合,降低系统启动延迟和内存占用。
架构演进提示: CHI 架构的引入使得高通 Camera HAL 从“代码级定制”转向“配置级定制”,OEM 工程师的核心工作从修改 C/C++ 代码转变为编写和维护 XML 配置文件。

4.2 CHI XML 配置文件体系

CHI 架构的核心是 XML 配置文件,它们定义了摄像头硬件管线的完整拓扑。这些文件通常存放在 /vendor/etc/camera/ 或 /odm/etc/camera/ 目录下,由 CHI HAL 在初始化时加载解析。

4.2.1 主要 XML 文件类型

文件名 作用 关键内容
camxsettings.xml 全局配置 HAL 版本、调试级别、内存池大小、日志开关
camxnode.xml 节点定义 所有可用 Node 的类型、端口、属性、依赖库
camxtopology.xml 拓扑连接 Node 之间的连接关系、数据流方向、buffer 传递规则
camxsensor.xml 传感器配置 Sensor 型号、分辨率、帧率、曝光参数、OTP 校准
camxisp.xml ISP 管线配置 IFE/IPE/BPS 等 ISP 模块的寄存器配置与 tuning 参数
camxusecase.xml 用例定义 不同场景(预览、拍照、录像)对应的 pipeline 组合

4.2.2 XML 配置加载流程

  1. HAL 初始化: CHIHAL::Initialize() 调用 XML 解析引擎。
  2. 解析全局配置: 读取 camxsettings.xml,设置调试级别和内存策略。
  3. 加载节点库: 解析 camxnode.xml,注册所有可用 Node 类型。
  4. 构建拓扑: 根据 camxtopology.xml 创建 Node 实例并建立连接。
  5. 绑定 Sensor: 加载 camxsensor.xml,初始化物理摄像头设备。
  6. 用例映射: 根据 camxusecase.xml 将应用层请求映射到具体 pipeline。
常见配置错误: XML 文件中 Node 端口号不匹配、buffer 大小设置过小、Sensor 时钟频率超出硬件限制,都会导致 HAL 初始化失败或预览黑屏。建议使用高通提供的 chi_validate_config 工具进行预校验。

4.3 CHI 节点(Node)体系

Node 是 CHI 架构中的基本处理单元,每个 Node 封装了一个独立的硬件或软件处理模块。Node 之间通过端口(Port)连接,形成有向无环图(DAG)拓扑。

4.3.1 Node 类型分类

Node 类型 功能 典型实例
Sensor Node 控制物理摄像头传感器,输出 RAW 数据 SensorNode
IFE Node 图像前端处理:Bayer 去噪、黑电平校正、LSC IFENode
IPE Node 图像后处理:色彩校正、Gamma、缩放、锐化 IPENode
BPS Node 统计数据处理:AE/AWB/AF 统计信息计算 BPSNode
JPEG Node JPEG 编码与 EXIF 写入 JPEGNode
Custom Node OEM 自定义算法,如美颜、HDR 融合 OEMCustomNode

4.3.2 Node 端口与连接

每个 Node 包含输入端口(Input Port)和输出端口(Output Port),端口通过 portId 唯一标识。数据以 buffer 形式在端口间传递,支持以下连接模式:

  • 一对一: 一个输出端口连接一个输入端口,标准流水线模式。
  • 一对多: 一个输出端口分发数据到多个输入端口,用于多路复用场景。
  • 多对一: 多个输出端口合并到一个输入端口,用于数据融合场景。

4.4 CHI 拓扑结构

CHI 拓扑定义了 Node 之间的连接关系和数据流路径。一个典型的拍照 pipeline 拓扑如下:

CHI 典型拍照 Pipeline 拓扑 CHI 典型拍照 Pipeline 拓扑 Sensor Node RAW 数据输出 IFE Node 前端处理 IPE Node 后处理 JPEG Node 编码输出 BPS Node 统计信息 3A 算法 AE/AWB/AF 反馈控制 拓扑说明: 1. Sensor 输出 RAW 数据到 IFE 进行前端处理。 2. IFE 同时将统计信息发送给 BPS,BPS 计算后驱动 3A 算法。 3. 3A 算法通过反馈线调整 Sensor 曝光/增益/白平衡参数。

4.4.1 拓扑配置示例

以下是一个简化的 camxtopology.xml 片段,展示了如何定义 Node 连接:

<?xml version="1.0" encoding="utf-8"?>
<TopologyConfig>
    <!-- 定义 Sensor 节点 -->
    <Node name="SensorNode" type="Sensor">
        <OutputPort id="0" format="RAW10" width="1920" height="1080"/>
    </Node>
    
    <!-- 定义 IFE 节点 -->
    <Node name="IFENode" type="IFE">
        <InputPort id="0" format="RAW10"/>
        <OutputPort id="0" format="YUV420" />
        <OutputPort id="1" format="Stats" />
    </Node>
    
    <!-- 定义连接关系 -->
    <Link fromNode="SensorNode" fromPort="0" toNode="IFENode" toPort="0"/>
    <Link fromNode="IFENode" fromPort="1" toNode="BPSNode" toPort="0"/>
</TopologyConfig>

4.5 CHI 数据流与 Buffer 管理

CHI 使用 Buffer 池 机制管理图像数据在 Node 之间的传递。每个 Node 从上游获取 buffer,处理后释放到下游。Buffer 管理遵循以下原则:

  • 预分配: 在 pipeline 创建时根据最大分辨率预分配 buffer 池,避免运行时动态分配。
  • 零拷贝: 通过 Ion/DMABUF 机制实现跨 Node 的 buffer 共享,减少内存拷贝。
  • 引用计数: 每个 buffer 维护引用计数,当所有消费者处理完毕后自动回收到池中。
性能调优建议: 在 camxsettings.xml 中调整 BufferPoolSize 参数可以优化内存占用。对于 4K 分辨率 pipeline,建议将 pool size 设置为 6~8,避免 buffer 饥饿导致帧率下降。

4.6 CHI 与 mm-camera 架构对比

对比维度 mm-camera(旧架构) CHI(新架构)
配置方式 代码硬编码,修改需重新编译 XML 驱动,运行时加载
Node 管理 固定 pipeline,难以扩展 动态拓扑,支持自定义 Node
跨平台兼容 每款 SoC 需独立适配 统一框架,SoC 差异由 XML 隔离
调试手段 依赖 logcat 和 gdb 支持 XML 级别的 trace 和 dump
OEM 定制成本 高,需深入 HAL 源码 低,主要修改 XML 配置

4.7 本章小结

CHI 架构通过 XML 配置驱动的方式,将 Camera HAL 的硬件控制逻辑从代码中解耦,实现了高度的可配置性和跨平台兼容性。理解 CHI 的核心概念——Node、拓扑、Buffer 管理——是进行高通平台 Camera HAL 开发的基础。在实际项目中,OEM 工程师需要熟练掌握 XML 配置文件的编写与调试,才能高效地完成摄像头功能的定制与性能优化。