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

3.1 高通平台 Camera 开发板选型与介绍

在高通 Camera HAL 开发中,选择合适的硬件平台是项目启动的第一步。高通为移动设备、IoT 和汽车领域提供了多款集成 ISP(图像信号处理器)的 SoC,不同平台在 Camera 管线、接口带宽和功耗上差异显著。以下表格对比了当前主流的 Camera 开发板平台:

平台型号 ISP 核心 最大 Camera 数 典型应用 HAL 版本
SM8450 (Snapdragon 8 Gen1) Triple ISP 18-bit 3 路并发 + 3 路辅助 旗舰手机、AI 相机 Camera HAL3 + CHI
SM8550 (Snapdragon 8 Gen2) Cognitive ISP 18-bit 4 路并发 + 2 路辅助 计算摄影、8K 视频 Camera HAL3 + CHI v2
SA8295P (Snapdragon Cockpit) Dual ISP 14-bit 8 路摄像头(环视) 智能座舱、DMS/OMS Camera HAL3 + QNX
QCS8250 (IoT 旗舰) Single ISP 14-bit 2 路主摄 + 2 路辅助 工业相机、机器人 Camera HAL3 + CHI
选型建议: 本课程以 SM8450 MTP(移动测试平台) 作为主开发板,兼顾 Android 侧和 QNX 侧 Camera 开发。若你手头只有 QCS 系列板子,HAL 层接口和 CHI 架构基本一致,仅 sensor 配置和 pipeline 数量需要调整。

3.1.1 开发板硬件接口与 Camera 连接

高通 MTP 板通常提供 4 个 CSI(摄像头串行接口)端口,每个端口支持 4-lane MIPI。Camera 模组通过 FPC 排线连接到板载的 CSI 连接器。以下是一个典型的 Camera 硬件连接拓扑:

高通 MTP 开发板 Camera 硬件连接拓扑 SM8450 SoC ISP + CSIPHY CSI0 (4-lane) CSI1 (4-lane) CSI2 (2-lane) 主摄 IMX766 50MP 广角 IMX355 8MP ToF 模组 深度 MIPI CSI 物理层:每 lane 最高 2.5 Gbps,4-lane 可支持 48MP @ 30fps 或 4K @ 60fps

3.2 Android 源码下载与编译

高通 Camera HAL 层开发依赖完整的 Android 源码树(AOSP + 高通芯片组 BSP)。以下步骤基于 Ubuntu 22.04 LTS 环境,目标分支为 android-13.0.0_r41 + Qualcomm SM8450 补丁包。

3.2.1 环境准备与 repo 初始化

  1. 安装依赖包:
sudo apt update
sudo apt install git-core gnupg flex bison build-essential zip curl zlib1g-dev \
  gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev \
  x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils \
  xsltproc unzip fontconfig python3 python3-pip openjdk-11-jdk
  1. 安装 repo 工具并创建工作目录:
mkdir ~/android-13-sm8450
cd ~/android-13-sm8450
repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r41
  1. 同步高通芯片组专用仓库(以 SM8450 LA.VENDOR 分支为例):
# 在 .repo/local_manifests/ 下创建 sm8450.xml
mkdir -p .repo/local_manifests
cat > .repo/local_manifests/sm8450.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote name="qcom" fetch="https://source.codeaurora.org/quic/la/" />
  <project path="vendor/qcom/sm8450" name="vendor/qcom/sm8450" remote="qcom" revision="LA.VENDOR.1.0.r1-12000-sm8450.0" />
  <project path="kernel/msm-5.10" name="kernel/msm" remote="qcom" revision="LA.UM.9.14.r1-18000-sm8450.0" />
</manifest>
EOF
repo sync -j$(nproc)
注意: Code Aurora 仓库(source.codeaurora.org)已于 2024 年迁移至 Qualcomm 官方 GitLab。如果你在同步时遇到 404 错误,请将 remote 地址替换为 https://git.codelinaro.org/clo/la/,并确认分支名称是否仍然有效。

3.2.2 编译 Android 系统与 Camera HAL 模块

编译前需要设置目标设备为 sm8450,并加载高通专有的编译配置:

source build/envsetup.sh
lunch qssi-userdebug
# 或针对特定设备:
lunch sm8450_mtp-userdebug

# 全编译(首次约 2-3 小时)
make -j$(nproc) 2>&1 | tee build.log

# 仅编译 Camera HAL 相关模块(增量开发时使用)
make -j$(nproc) camera.provider 2.4
make -j$(nproc) android.hardware.camera.provider@2.6-service
make -j$(nproc) libcamera_client
make -j$(nproc) libcameraservice

编译产物位于 out/target/product/sm8450/,关键的 Camera HAL 二进制文件如下表:

产物路径 说明
vendor/lib64/hw/camera.sm8450.so 高通 Camera HAL 主库(CHI 架构)
vendor/lib64/libchiutils.so CHI 工具库,包含 pipeline 管理
vendor/etc/camera/camxoverridesettings.txt Camera 运行时 override 配置
vendor/etc/camera/camxsettings.xml Camera 传感器配置和 tuning 参数

3.3 QNX 侧 Camera 环境配置

在智能座舱或 ADAS 场景中,Camera HAL 需要运行在 QNX 实时操作系统上。高通为 QNX 提供了独立的 Camera 驱动栈,与 Android 侧共享相同的 CHI 架构,但底层 IPC 和内存管理不同。

3.3.1 QNX 开发环境搭建

QNX 侧开发需要安装 QNX Software Development Platform (SDP) 7.1 或更高版本,并获取高通为 SA8295P 提供的 BSP 包。

  1. 安装 QNX SDP 7.1:
# 将 QNX SDP 安装包解压到 /opt/qnx710
sudo tar -xzf qnx-sdp-7.1.0-host-linux-x86_64.tar.gz -C /opt/
# 设置环境变量
export QNX_HOST=/opt/qnx710/host/linux/x86_64
export QNX_TARGET=/opt/qnx710/target/qnx7
export PATH=$QNX_HOST/usr/bin:$PATH
  1. 获取高通 QNX Camera BSP:
# 从 Qualcomm 开发者门户下载 SA8295P QNX BSP 包
# 解压后目录结构如下:
sa8295p-qnx-bsp/
├── src/
│   ├── camera/          # Camera HAL 源码
│   ├── isp/             # ISP 驱动
│   └── sensor_drivers/  # 传感器驱动
├── target/
│   └── qnx7/
│       └── aarch64le/   # 预编译库
└── build/
    └── Makefile

3.3.2 QNX Camera 服务启动与验证

QNX 侧 Camera 服务通过 io-camera 进程管理,使用 camxhal 库与底层 ISP 交互。以下是一个典型的启动序列:

# 在 QNX 目标机上执行
# 1. 加载 ISP 固件
io-pkt -d sm8450_isp
waitfor /dev/isp 10

# 2. 启动 Camera HAL 服务
camxhal -c /etc/camera/camxsettings_qnx.xml -v &

# 3. 验证 Camera 设备节点
ls -l /dev/camera/
# 预期输出:
# crw-rw-rw- 1 root root 238, 0 /dev/camera/0  (主摄)
# crw-rw-rw- 1 root root 238, 1 /dev/camera/1  (广角)

# 4. 使用 qcam 测试工具抓取一帧
qcam -d /dev/camera/0 -o frame.raw -f 1920x1080 -n 1
关键差异: QNX 侧 Camera HAL 与 Android 侧的主要区别在于内存分配器(ION vs QNX shm)和 buffer 传递方式(HIDL vs 原生 QNX IPC)。在移植 sensor 驱动时,需要将 Android 的 ION buffer 申请替换为 shm_open() + mmap()。

3.3.3 QNX 与 Android 双系统 Camera 共享架构

在 SA8295P 等智能座舱平台上,QNX 运行仪表和环视 Camera,Android 运行娱乐和中控 Camera。两者通过 Hypervisor 隔离,但共享同一套 ISP 硬件。以下架构图展示了这种双系统 Camera 管线:

QNX + Android 双系统 Camera 共享架构 硬件层:ISP + MIPI CSI + Sensor 模组 SM8450 Triple ISP / 4-lane MIPI / 物理 Camera 设备 Hypervisor 隔离 QNX 虚拟机 (Safety) camxhal (QNX) sensor 驱动 环视拼接 DMS 算法 Android 虚拟机 (IVI) Camera HAL3 CHI override CameraService App 框架 共享资源:ISP 硬件分时复用 / 同一套 sensor 驱动 / 共用 camxsettings.xml 通过 vISP(虚拟 ISP)实现硬件隔离,每个 VM 看到独立的 CSI 虚拟端口

3.4 开发环境验证清单

完成上述配置后,建议执行以下验证步骤,确保环境可用:

验证项 命令/方法 预期结果
Android 编译环境 lunch sm8450_mtp-userdebug 输出设备配置信息,无报错
Camera HAL 编译 make camera.provider 2.4 -j4 编译成功,生成 camera.sm8450.so
QNX 工具链 qcc --version 显示 QNX C 编译器版本 7.1.x
QNX Camera 服务 camxhal -v 打印 CHI 版本号和已加载 sensor 列表
双系统通信 QNX 侧 echo "test" > /dev/camera/ipc Android 侧通过 vdev 收到消息
效率提示: 在开发过程中,建议将 Android 编译服务器和 QNX 编译服务器分开,或使用 Docker 容器隔离不同工具链。Camera HAL 的增量编译通常只需 30-60 秒,利用 ccache 可以进一步加速。