2. HAL层移植环境搭建:配置高通Camera开发环境

HAL层移植的第一步是构建一个完整、可复现的开发环境。高通Camera子系统的开发环境涉及交叉编译工具链、内核头文件、平台SDK以及调试通道四个核心维度。本章将逐一拆解每个组件的配置要点,并提供环境验证方法。

环境概览: 高通Camera HAL层开发环境通常部署在Ubuntu 20.04/22.04 x86_64主机上,目标平台为高通骁龙6/7/8系列SoC。以下配置均以QCM6490(高通QCS6490 / QCM6490 IoT套件)为参考平台。

2.1 交叉编译工具链配置

高通Camera HAL模块必须使用与目标内核匹配的交叉编译器进行编译。推荐使用高通官方提供的GCC ARM64工具链(aarch64-linux-android- 或 aarch64-linux-gnu-)。

工具链类型 适用场景 下载来源 安装路径示例
aarch64-linux-android- Android HAL模块(libcamera_xxx.so) 高通BOOT.BF.3.3或LE.1.0发布包 /opt/qcom/toolchain/android-ndk-r23c
aarch64-linux-gnu- Linux Yocto / QNX HAL模块 Linaro GCC 12.2 / ARM官网 /opt/gcc-arm-12.2-aarch64
clang + llvm 高通最新CHI架构(Camera HAL v3) 高通SDK内置或AOSP prebuilts ${QCM_SDK}/prebuilts/clang
# 以aarch64-linux-gnu-工具链为例,解压并设置环境变量
wget https://developer.arm.com/-/media/Files/downloads/gnu/12.2.rel1/binrel/arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz
sudo tar -xf arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz -C /opt/
export PATH=/opt/arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu/bin:$PATH

# 验证工具链
aarch64-none-linux-gnu-gcc --version
# 输出应包含 "aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture) 12.2.rel1"
避坑提示: 不要混用不同版本的GCC编译内核模块和HAL用户态库。内核模块必须使用与目标内核完全一致的GCC版本(通常由高通BSP指定),否则会导致内核模块加载失败(Unknown symbol 或 version magic mismatch)。

2.2 内核头文件与Kernel API对齐

Camera HAL层通过V4L2、ION/DMA-BUF、Media Controller等内核接口与驱动交互。编译HAL时必须包含目标平台的内核头文件,确保结构体定义、ioctl号、枚举值一致。

# 从高通BSP包中提取内核头文件
# 假设BSP解压路径为 ~/qcom_la.um.8.6_r1
KERNEL_SRC=~/qcom_la.um.8.6_r1/kernel_platform
HEADER_DEST=/opt/qcom/kernel-headers/qcm6490

mkdir -p $HEADER_DEST
# 复制用户态可见的头文件
cp -r $KERNEL_SRC/msm-kernel/include/uapi $HEADER_DEST/
cp -r $KERNEL_SRC/msm-kernel/include/linux $HEADER_DEST/
# 高通Camera专用头文件(如cam_sensor.h, cam_req_mgr.h)
cp -r $KERNEL_SRC/msm-kernel/drivers/cam_req_mgr $HEADER_DEST/
cp -r $KERNEL_SRC/msm-kernel/drivers/cam_sensor_module $HEADER_DEST/

# 设置CFLAGS
export CFLAGS="-I/opt/qcom/kernel-headers/qcm6490/uapi -I/opt/qcom/kernel-headers/qcm6490/linux"
关键检查点: 编译HAL时,务必确认 linux/media.h 中的 MEDIA_ENT_F_* 宏定义与目标内核一致。高通Camera使用自定义的 MEDIA_ENT_F_PIXEL_QUALITY 等扩展实体,若头文件版本不匹配,HAL将无法正确枚举Camera设备节点。
内核头文件与HAL编译依赖关系 高通BSP内核源码 kernel_platform/msm-kernel 提取uapi头文件 include/uapi, include/linux 内核头文件安装目录 /opt/qcom/kernel-headers/ Camera HAL库 libcamera_xxx.so HAL测试可执行文件 mm-camera-test ⚠ 对齐要求: HAL编译时 -I 路径必须指向与目标板卡运行内核完全一致的头文件版本,否则ioctl结构体偏移错误将导致Camera无法打开。

2.3 QCM SDK安装与配置

高通QCM(Qualcomm Commercial Module)SDK是Camera HAL移植的核心依赖,包含CHI API头文件、libcamx、libchi HAL实现、以及编译脚本模板。SDK通常以压缩包形式随BSP发布。

# 解压QCM SDK
unzip QCM6490_SDK_LA.UM.10.3.1.zip -d /opt/qcom/qcm_sdk_v2.0

# SDK目录结构
tree -L 2 /opt/qcom/qcm_sdk_v2.0/
/opt/qcom/qcm_sdk_v2.0/
├── CHIApi/                  # CHI API头文件(核心)
│   ├── inc/
│   │   ├── chi_common.h
│   │   ├── chi_metadata.h
│   │   ├── chi_ois.h
│   │   └── chi_isp.h
│   └── lib/
│       ├── libchi_common.so
│       └── libchi_isp.so
├── camx/                    # Camera HAL核心库源码
│   ├── src/
│   ├── include/
│   └── build/
├── oem/                     # OEM定制层(Sensor/Flash/AF适配)
│   ├── sensor/
│   ├── actuator/
│   └── eeprom/
├── tools/                   # 调试与性能工具
│   ├── cam_trace/
│   └── cam_perf/
└── build_scripts/           # CMake / Makefile模板
    ├── android.bp
    └── qcm_hal.mk
SDK版本匹配: 务必使用与目标Android/Linux版本匹配的SDK。例如,Android 13对应QCM SDK v2.0+,Android 12对应v1.9。版本不匹配会导致CHI API接口函数签名不一致,编译时报错 implicit function declaration。

2.4 ADB调试环境搭建

ADB(Android Debug Bridge)是HAL层开发中最常用的调试通道,用于推送HAL库、抓取logcat、执行测试用例以及捕获Camera dump数据。

组件 版本要求 配置要点
adb (host) ≥ 1.0.41 (Android SDK Platform-Tools) 添加到 $PATH;执行 adb devices 验证
fastboot ≥ 1.0.41 用于刷写boot image或recovery
USB驱动 (Linux) udev规则 创建 /etc/udev/rules.d/51-android.rules
目标板USB模式 USB Gadget配置 确保目标板开启ADB over USB或ADB over TCP/IP
# 安装ADB
sudo apt install adb fastboot

# 配置udev规则(高通QCM6490 VID:PID通常为 18d1:4ee7)
echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee7", MODE="0666", GROUP="plugdev"' | sudo tee /etc/udev/rules.d/51-android.rules
sudo udevadm control --reload-rules
sudo udevadm trigger

# 验证连接
adb devices
# 输出示例:
# List of devices attached
# 1234567890abcdef	device

# 如果目标板没有USB ADB,使用TCP/IP方式
adb connect 192.168.1.100:5555
调试效率技巧: 在HAL开发中,建议同时开启两个终端:一个运行 adb logcat -s CAM_HAL:V CAM_DRV:V 实时过滤Camera日志;另一个用于推送HAL库并重启Camera服务:adb push libcamera_xxx.so /vendor/lib64/ && adb shell pkill -f cameraserver。

2.5 环境验证清单

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

  1. 工具链验证: 编译一个空的HAL桩文件,确认链接无报错。
  2. 内核头文件验证: 检查 linux/cam_sensor.h 中 CAM_SENSOR_PROBE_CMD 宏定义是否存在。
  3. SDK完整性验证: 确认 CHIApi/inc/chi_common.h 包含 ChiCreate、ChiDestroy 等核心API声明。
  4. ADB连通性验证: 执行 adb shell cat /proc/version 确认内核版本与头文件匹配。
  5. Camera设备节点验证: adb shell ls -l /dev/video* 应列出至少3个video节点(ISP、JPEG、Sensor)。
HAL层移植环境验证流程 工具链编译 头文件检查 SDK API验证 ADB连通性 ✅ 环境就绪 所有验证步骤通过后,即可进入下一阶段:Camera Sensor驱动移植与HAL层接口适配。

2.6 常见环境问题排查

现象 可能原因 解决方案
adb devices 显示 unauthorized 目标板未授权当前主机RSA密钥 检查目标板屏幕授权弹窗;或执行 adb kill-server && adb start-server
编译报错 fatal error: linux/cam_sensor.h: No such file or directory 内核头文件路径未正确添加到CFLAGS 确认 -I 指向包含 linux 子目录的父目录
链接报错 undefined reference to ChiCreate 未链接 libchi_common.so 在Makefile中添加 -lchi_common -L$(QCM_SDK)/CHIApi/lib
HAL加载后 dmesg 显示 version magic mismatch 内核模块与当前运行内核版本不一致 使用目标板运行内核的 Module.symvers 重新编译内核模块
重要提醒: 不要在生产开发机上直接使用 sudo make install 安装高通SDK到系统目录。始终使用独立的 /opt/qcom/ 或用户目录,避免污染系统GCC和头文件,导致其他项目编译失败。