高通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 层的耦合,降低系统启动延迟和内存占用。
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 配置加载流程
- HAL 初始化:
CHIHAL::Initialize()调用 XML 解析引擎。 - 解析全局配置: 读取
camxsettings.xml,设置调试级别和内存策略。 - 加载节点库: 解析
camxnode.xml,注册所有可用 Node 类型。 - 构建拓扑: 根据
camxtopology.xml创建 Node 实例并建立连接。 - 绑定 Sensor: 加载
camxsensor.xml,初始化物理摄像头设备。 - 用例映射: 根据
camxusecase.xml将应用层请求映射到具体 pipeline。
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 拓扑如下:
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 配置文件的编写与调试,才能高效地完成摄像头功能的定制与性能优化。